You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
docs(agents): require disposition reply before resolving review threads (#3693) (#3740)
* docs(agents): require disposition reply before resolving review threads (#3693)
Teach the disposition-reply convention across every agent/skill surface
that calls or references resolveReviewThread, ahead of #3732's
resolved_without_disposition convergence gate going live. Without this,
the gate would block ~every new PR since no doc currently instructs a
disposition reply before resolving.
Convention: before any resolveReviewThread call, post a reply carrying
Disposition: fixed | refuted | superseded | follow-up
Evidence: <commit sha + test name> / <file:line + why> /
<superseding head sha + seam> / <issue #N + why non-blocking>
A thread must never be resolved with zero reply — the resolved-to-clear
anti-pattern the #3647 incident shipped 6 live P1 defects through.
- .claude/reference/review-convergence.md: new canonical
"Disposition-reply convention" section — single source of truth every
other doc links to, avoiding the five-file drift this doc already
documents as this repo's recurring control-plane failure mode.
- .claude/commands/pr-respond.md: step 4/4.5 require the disposition
reply before the resolveReviewThread mutation call.
- .claude/agents/pr-responder.md: steps 4/5 and the Principles section
require the same before resolving.
- .claude/commands/pr-ready.md, .claude/agents/ops.md, CLAUDE.md:
verification-side references updated to cite the canonical convention.
Does not touch scripts/ci/check-pr-review-convergence or its fixtures/
tests (PR #3732, already reviewed) — docs/skills only.
* fix(docs): describe resolved_without_disposition gate as upcoming, not live
Addresses review feedback on PR #3740 (chatgpt-codex-connector, P2):
scripts/ci/check-pr-review-convergence still only blocks on pending
reviewers, stale human reviews, and unresolved threads — it never reads
comments.totalCount or emits resolved_without_disposition. The previous
wording in all 6 docs implied that gate already mechanically enforces
the disposition-reply convention (and review-convergence.md referenced
a nonexistent "item 4 in The contract"), which would let /pr-ready and
ops get exit 0 on a PR whose threads were resolved with zero reply and
incorrectly believe it's blocked.
Reworded every surface to state plainly: the resolved_without_disposition
detection is proposed in #3732, which is deliberately held back for a
dogfood-advisory-first rollout (this convention lands and is followed
first, so the mechanical gate doesn't retroactively block PRs already
in flight when it goes live). Until #3732 merges, the convention is
process discipline verified by the agent/reviewer doing the work, not
yet proven by the script's exit code.
Disposition: fixed
Evidence: this commit — reworded review-convergence.md, pr-respond.md,
pr-responder.md, pr-ready.md, ops.md, CLAUDE.md to describe the gate as
upcoming (#3732, held back) rather than live; removed the dangling
"item 4 in The contract" cross-reference.
* fix(docs): align disposition-format examples with the canonical spec
Addresses review feedback on PR #3740 (factory-droid, 4x P2):
1. pr-respond.md step 4 examples used ';' as the evidence separator and
inline '/' between Disposition and Evidence, drifting from the
canonical `Evidence: <commit sha + test name>` ('+' joins compound
evidence; '/' only separates the four alternative evidence shapes)
spec in review-convergence.md. An agent copy-pasting the example
would emit non-canonical replies.
2. CLAUDE.md, ops.md, pr-ready.md still said "accepted-with-follow-up"
in the parenthetical disposition list, while the canonical convention
(and every other list in this same PR) uses "follow-up". Two names
for one concept in docs that link to each other.
3. pr-responder.md's Principles section "Reply with evidence" example
was never migrated to the Disposition:/Evidence: format the step
list two sections above now requires — an agent following the
Principles bullet for a CI title fix would emit a free-form reply
that satisfies neither the canonical format nor any future
content-quality check.
Disposition: fixed
Evidence: this commit — pr-respond.md examples now use '+' within
evidence and separate Disposition:/Evidence: lines; CLAUDE.md/ops.md/
pr-ready.md now say "follow-up" consistently; pr-responder.md's
Principles bullet now demonstrates the canonical format for both a
fix and a refute.
Not fixed here (out of scope, flagged for follow-up): the reviewer also
noted scripts/ci/check-pr-review-convergence:32,365 still says
"accepted-with-follow-up" in its own BLOCK-line wording. That script is
PR #3732's territory (already reviewed, deliberately not touched by
this docs-only PR) — the drift there should be fixed when #3732 lands.
Copy file name to clipboardExpand all lines: .claude/agents/ops.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -20,7 +20,7 @@ review code — that's the reviewers' job. You gate trusted change.
20
20
- If CI fails, route to a fixer — don't debug yourself.
21
21
- After parser merges, ratchet the corpus with `just cpan-corpus-ratchet`.
22
22
-**Check both label AND draft state.**`merge-ready` label and `isDraft: false` are independent — a PR needs both. Use `/pr-ready` to exit draft if missed.
23
-
-**Never merge — and never enable/retain auto-merge — while any requested review is still active or any substantive review conversation thread remains unresolved.** Threads must be resolved for a reason (fixed/refuted/superseded/accepted-with-follow-up), not performatively. `reviewDecision` alone doesn't prove either condition (it says nothing about thread resolution, and a review can predate the current push) — run the canonical review-convergence check (`scripts/ci/check-pr-review-convergence <number>`, see [.claude/reference/review-convergence.md](../reference/review-convergence.md)) in `/ops-merge-batch` step 2 before merging. Do not reproduce or modify its query locally.
23
+
- **Never merge — and never enable/retain auto-merge — while any requested review is still active or any substantive review conversation thread remains unresolved.** Threads must be resolved for a reason (fixed/refuted/superseded/follow-up), each backed by a machine-readable `Disposition:`/`Evidence:` reply posted BEFORE resolution — never performatively. See the canonical convention in [.claude/reference/review-convergence.md § Disposition-reply convention](../reference/review-convergence.md#disposition-reply-convention-before-calling-resolvereviewthread) — the resolved-to-clear pattern that shipped 6 live P1 defects through #3647. **Not yet mechanically enforced:** the `resolved_without_disposition` gate proposed in #3732 (which would flag any resolved thread with no reply) is deliberately held back for a dogfood-advisory-first rollout, so `check-pr-review-convergence` does not yet detect this — verify it yourself before merging, don't rely on the script's exit code for it. `reviewDecision` alone doesn't prove either condition (it says nothing about thread resolution, and a review can predate the current push) — run the canonical review-convergence check (`scripts/ci/check-pr-review-convergence <number>`, see [.claude/reference/review-convergence.md](../reference/review-convergence.md)) in `/ops-merge-batch` step 2 before merging. Do not reproduce or modify its query locally.
24
24
-**PR titles must end with `(#NNN)`.** validate-title CI check enforces this. If a PR fails on title, fix the title, don't skip the check.
25
25
-**Don't rebase unless conflicts exist.** Unnecessary rebases trigger CI cascades on parallel PRs.
26
26
- When main gets a CI fix, use `gh pr update-branch` on queued PRs, not `gh run rerun` (stale context).
2.**Fix it on the branch** (or gather the refute/supersede/follow-up evidence) — checkout, edit, commit, push. For **follow-up**, don't just note it — create or identify the tracked issue first; a follow-up with no issue number is deferred work that silently disappears once the thread closes.
43
43
3.**Prove it** — re-run the relevant check/test
44
-
4.**Reply with evidence** — state what you fixed, with commit hash or reasoning; for follow-up, cite the issue number
45
-
5.**Resolve the thread** — for the real reason (fixed/refuted/superseded/accepted-with-follow-up), never performatively
44
+
4.**Reply with a machine-readable disposition** — BEFORE resolving,
45
+
post a reply on the thread carrying the canonical format (see
@@ -53,8 +68,16 @@ For each bot comment / CI failure / review conversation:
53
68
54
69
-**Fix everything, argue nothing you can't back with evidence.** If CI says title is wrong, fix the title. If clippy warns, fix the warning. If a test fails, fix the code. If a comment is wrong, refute it with evidence rather than silently ignoring it.
55
70
-**Verify after fixing** — `cargo test -p <crate>` after each commit.
56
-
-**Reply with evidence** — "Fixed: updated PR title to include (#NNN). CI should re-run."
57
-
-**Resolve conversations for a reason** — fixed/refuted/superseded/accepted-with-follow-up, not performatively. Never resolve a thread just to clear it.
71
+
-**Reply with the canonical disposition** — every thread reply carries `Disposition:` and `Evidence:` per the convention, e.g. `"Disposition: fixed\nEvidence: <commit-sha> + test <name>"` for a title fix (`(#NNN)` added, CI re-run confirms); `"Disposition: refuted\nEvidence: <file:line>: <reasoning>"` for a refute.
72
+
-**Resolve conversations for a reason, never performatively.** Post the
BEFORE calling `resolveReviewThread`. Never resolve a thread just to
76
+
clear it — zero-reply resolution is the resolved-to-clear anti-pattern
77
+
#3647 shipped 6 live P1s through. The `resolved_without_disposition`
78
+
gate that will mechanically block on this (#3732) is deliberately held
79
+
back for a dogfood-advisory-first rollout — follow the convention now
80
+
regardless of whether the script enforces it yet.
58
81
-**Never enable or retain auto-merge while any requested review is still active or any substantive thread is unresolved** — main mechanically requires conversation resolution before merge; verify reviewer completion before signaling readiness.
59
82
-**Don't add improvements.** Fix what's broken, nothing more. Extra changes confuse the deep reviewer.
0 commit comments