LearnNewsExamplesServices
Frontmatter
id12367
titleCI: require ≥1 `Resolves #N` in agent PR bodies (forbid Closes/Fixes; Refs/Related allowed as extra)
stateClosed
labels
enhancementai
assigneesneo-gpt
createdAtJun 2, 2026, 10:04 AM
updatedAtJun 2, 2026, 6:01 PM
githubUrlhttps://github.com/neomjs/neo/issues/12367
authorneo-opus-ada
commentsCount0
parentIssuenull
subIssues[]
subIssuesCompleted0
subIssuesTotal0
blockedBy[]
blocking[]
closedAtJun 2, 2026, 6:01 PM

CI: require ≥1 Resolves #N in agent PR bodies (forbid Closes/Fixes; Refs/Related allowed as extra)

neo-opus-ada
neo-opus-ada commented on Jun 2, 2026, 10:04 AM

Goal

Enforce the 1-PR-per-ticket model at the CI gate. Operator-directed (2026-06-02): every agent/ai-labeled PR body MUST contain at least one Resolves #N — the only sanctioned closing keyword (= delivered work). This mechanically prevents ticket-fragmentation: a ticket that needs N PRs can't have N valid Resolves (only one PR can resolve it), so it's forced to be an epic + subs or split into multiple tickets. Empirical trigger: ~27 PRs were opened for the single ticket #11925 (all Refs #11925, none resolving it) — the current check accepts Refs/Related, so it didn't catch the fragmentation.

The rule (exact, operator-specified)

  • MUST contain ≥1 Resolves #N — the only accepted closing keyword (delivered work).
  • Closes #N is forbiddenCloses means closed-without-delivery (not-planned / superseded / dropped); that needs no PR, so a PR must never use it.
  • Fixes #N is forbidden — ambiguous; use Resolves.
  • Refs #N / Related: #N are allowed as additional references, and multiple Resolves lines are fine — but they do not satisfy the requirement; ≥1 Resolves is mandatory.

Scope

  • .github/workflows/agent-pr-body-lint.yml — replace the permissive ticket regex (Resolves|Closes|Fixes|Related:|Refs)\s+#\d+ with: require ≥1 Resolves\s+#\d+; fail if Closes/Fixes #N appears; update the violation message.
  • .agents/skills/pull-request/references/pull-request-workflow.md §3.3 — sync the close-keyword policy to "Resolves-only; ≥1 mandatory; Closes/Fixes forbidden; Refs/Related allowed as additional" and reconcile the partial-resolution guidance (a contributing PR Resolves its own sub-ticket and Refs the parent — it never resolves nothing).

Contract Ledger

Surface Input Rule Output
agent-pr-body-lint workflow agent/ai PR body ≥1 Resolves #N; no Closes/Fixes #N; Refs/Related + extra Resolves allowed pass, or fail + guidance comment

Acceptance Criteria

  1. PR body with ≥1 Resolves #N (plus optional extra Refs/Resolves) passes.
  2. PR body with only Refs/Related (no Resolves) fails.
  3. PR body containing Closes #N or Fixes #N fails with the explanation (Closes = no-delivery/no-PR; Fixes = ambiguous → use Resolves).
  4. Non-agent, non-ai PRs remain skipped (unchanged).
  5. pull-request-workflow.md §3.3 wording matches the enforced rule.

Related: #11501 (original agent PR-body lint).

tobiu referenced in commit 9e309e7 - "feat(ci): require a Resolves #N in agent PR bodies; forbid Closes/Fixes (#12367) (#12368) on Jun 2, 2026, 6:01 PM
tobiu closed this issue on Jun 2, 2026, 6:01 PM
tobiu referenced in commit 5e0cea1 - "feat(agentos): add epic-create skill — epic bodies = problem-scope + intended-solution (#12476) on Jun 4, 2026, 10:23 AM