Context
Two template-anchor CI/validator rejections hit the same agent (@neo-fable) on 2026-07-02 within 30 minutes. The second one is substrate drift, not author error: PR #14465 (docs-only, otherwise green) failed lint-pr-body at 10:32Z because its body omitted a ## Deltas section — omitted because the authoring substrate says it is conditional while the validator requires it unconditionally.
The Problem
.agents/skills/pull-request/references/pull-request-workflow.md §9's minimum-viable PR body structure lists the section as:
<h2 class="neo-h2" data-record-id="4">Deltas from ticket (if any)</h2>
But .github/workflows/agent-pr-body-lint.yml (lines ~61–64) declares INVISIBLE_PR_BODY_ANCHORS = ["Authored by ", "## Deltas"] — a substring-presence check with no conditionality. An agent that reads the workflow literally and has no deltas correctly-per-the-doc omits the section, opens the PR, and fails CI post-open — costing a body-edit round-trip and a red check on an otherwise-green PR. The lint bot's follow-up comment says "the validator checks more structural anchors than this comment names," which is honest, but the fix belongs at the authoring source: the doc should never mark a mandatory anchor as conditional.
Empirical anchor: PR #14465, run 28583491232 (fail) → body edited to add the section → run 28583620814 (pass). Same-day sibling event (for pattern context, NOT in scope): the manage_pr_review validator rejected a follow-up review that collapsed unchanged metric anchors — that one was author error (the template correctly lists all seven bullets); this ticket covers only the genuine doc-drift case.
The Architectural Reality
- Authoring source:
.agents/skills/pull-request/references/pull-request-workflow.md §9 ("Minimum-viable PR body structure" fenced block).
- Enforcement source:
.github/workflows/agent-pr-body-lint.yml — VISIBLE_PR_BODY_ANCHORS (Evidence:, ## Test Evidence, ## Post-Merge Validation) + INVISIBLE_PR_BODY_ANCHORS (Authored by , ## Deltas). The yml's own header comment records that shared-module extraction was reverted in PR #11502 and sync-by-convention with comment-pointers is the accepted cross-surface coordination shape — so the doc side must carry its half of the convention explicitly.
- The workflow file loads only on
pull-request skill invocation (not always-loaded substrate); byte-impact of the fix is ~2 lines.
The Fix
In §9's fenced template block, change:
## Deltas from ticket (if any) → ## Deltas from ticket with the placeholder guidance updated to: <scope additions, better solutions, discovered edge cases — state "None substantive" when empty; this heading is a CI lint anchor and MUST be present>
And add one sentence directly under the block: "The agent-pr-body-lint workflow enforces these headings as unconditional substring anchors — visible: Evidence:, ## Test Evidence, ## Post-Merge Validation; invisible: ## Deltas, Authored by . Prose conditionality never applies to heading presence (sync-by-convention with agent-pr-body-lint.yml)."
Decision Record impact: none (docs prose alignment; no authority change).
Acceptance Criteria
Out of Scope
- Changing
agent-pr-body-lint.yml (the anchor set is correct; the doc drifted).
- The
pr-review template/validator surfaces (the same-day sibling event was author error, not drift).
- Any slot/disposition change to the skill router.
Related
- PR #14465 (the empirical failure + fix), #11501/#11502 (the lint's origin + the sync-by-convention decision), #12367 (Resolves-keyword operator rule enforced by the same workflow).
Live latest-open sweep: checked latest 20 open issues at 2026-07-02T10:38Z + re-checked latest 8 at 10:42Z; no equivalent found. A2A in-flight claim sweep: no overlapping [lane-claim] in the last 60 min (nearest: #14466 lifecycle-state writer — disjoint scope).
Origin Session ID: 1d4262a2-a001-4387-9372-3923f024be8e
Retrieval Hint: "PR body lint Deltas anchor if any prose drift"
Context
Two template-anchor CI/validator rejections hit the same agent (@neo-fable) on 2026-07-02 within 30 minutes. The second one is substrate drift, not author error: PR #14465 (docs-only, otherwise green) failed
lint-pr-bodyat 10:32Z because its body omitted a## Deltassection — omitted because the authoring substrate says it is conditional while the validator requires it unconditionally.The Problem
.agents/skills/pull-request/references/pull-request-workflow.md§9's minimum-viable PR body structure lists the section as:<h2 class="neo-h2" data-record-id="4">Deltas from ticket (if any)</h2>But
.github/workflows/agent-pr-body-lint.yml(lines ~61–64) declaresINVISIBLE_PR_BODY_ANCHORS = ["Authored by ", "## Deltas"]— a substring-presence check with no conditionality. An agent that reads the workflow literally and has no deltas correctly-per-the-doc omits the section, opens the PR, and fails CI post-open — costing a body-edit round-trip and a red check on an otherwise-green PR. The lint bot's follow-up comment says "the validator checks more structural anchors than this comment names," which is honest, but the fix belongs at the authoring source: the doc should never mark a mandatory anchor as conditional.Empirical anchor: PR #14465, run 28583491232 (fail) → body edited to add the section → run 28583620814 (pass). Same-day sibling event (for pattern context, NOT in scope): the
manage_pr_reviewvalidator rejected a follow-up review that collapsed unchanged metric anchors — that one was author error (the template correctly lists all seven bullets); this ticket covers only the genuine doc-drift case.The Architectural Reality
.agents/skills/pull-request/references/pull-request-workflow.md§9 ("Minimum-viable PR body structure" fenced block)..github/workflows/agent-pr-body-lint.yml—VISIBLE_PR_BODY_ANCHORS(Evidence:,## Test Evidence,## Post-Merge Validation) +INVISIBLE_PR_BODY_ANCHORS(Authored by,## Deltas). The yml's own header comment records that shared-module extraction was reverted in PR #11502 and sync-by-convention with comment-pointers is the accepted cross-surface coordination shape — so the doc side must carry its half of the convention explicitly.pull-requestskill invocation (not always-loaded substrate); byte-impact of the fix is ~2 lines.The Fix
In §9's fenced template block, change:
## Deltas from ticket (if any)→## Deltas from ticketwith the placeholder guidance updated to:<scope additions, better solutions, discovered edge cases — state "None substantive" when empty; this heading is a CI lint anchor and MUST be present>And add one sentence directly under the block: "The
agent-pr-body-lintworkflow enforces these headings as unconditional substring anchors — visible:Evidence:,## Test Evidence,## Post-Merge Validation; invisible:## Deltas,Authored by. Prose conditionality never applies to heading presence (sync-by-convention withagent-pr-body-lint.yml)."Decision Record impact: none (docs prose alignment; no authority change).
Acceptance Criteria
## Deltas from ticketwith the state-"None"-when-empty guidance; "(if any)" removed from the heading line.agent-pr-body-lint.yml.Out of Scope
agent-pr-body-lint.yml(the anchor set is correct; the doc drifted).pr-reviewtemplate/validator surfaces (the same-day sibling event was author error, not drift).Related
Live latest-open sweep: checked latest 20 open issues at 2026-07-02T10:38Z + re-checked latest 8 at 10:42Z; no equivalent found. A2A in-flight claim sweep: no overlapping
[lane-claim]in the last 60 min (nearest: #14466 lifecycle-state writer — disjoint scope).Origin Session ID: 1d4262a2-a001-4387-9372-3923f024be8e Retrieval Hint: "PR body lint Deltas anchor if any prose drift"