docs(prepare-pr): require an explicit reply to every concern before review-ready - #1530
Conversation
Opus 5 Review — ✅ no blocking findingsReviewed Verdict parsed from the review's SHA-scoped output markers for commit False positive or not applicable? A repository writer can comment: |
Design Review (Fable 5) — ✅ PASSAdvisory design-level review of Design-Verdict: PASS A documented real gap (evidenced on #1432/#1436), fixed at its actual root — the GPT-scoped reply rule and conflated "advisory" — with the mechanical fail-closed check rightly deferred. [DESIGN-REVIEWED] 1e9d96b |
GPT 5.6 Review — ✅ no blocking findingsGPT 5.6 completed its review of This comment is updated in place on each push. Review detailsFINDING -- src/kiro_crew/builtin_skills/kirocrew-dev/prepare-pr/SKILL.md:131 -- False positive or not applicable? A repository writer can comment: |
CI disposition: the two red shards are inherited from
|
1262689 to
1e9d96b
Compare
|
Update on the comment above: resolved, and no longer applicable to this PR's current state. #1543 fixed the ratchet violation on |
What is the problem?
The
prepare-prskill drives a PR toreadiness: passedwithout ever requiring the author to reply to a concern. Its only reply obligation — Phase 3 step 3 — is scoped to GPT findings (<!-- ai-review-disposition target=gpt -->). Everything else was framed as optional: "Advisory threads may remain open" (review-ready definition) and "Medium/Low findings are advisory … do not widen the PR solely to satisfy advisory feedback" (severity gate).The gap has teeth because
Design ReviewandUX Reviewpost🟡 CONCERNSand still report their check as passing. The readiness rollup therefore never surfaces them and no loop step nags about them, so an agent that follows the skill correctly still lands a PR with unanswered concerns on it.Observed on real PRs: #1432 (
Design Review — 🟡 CONCERNS) and #1436 (Design Review — 🟡 CONCERNS+UX Review — 🟡 CONCERNS) both reached review-ready carrying onlyai-review-disposition target=gptcomments from the author, with no reply to either concern.Why this issue matters to the user
A maintainer reading the PR cannot distinguish "the author weighed this and decided it is out of scope" from "the author never looked at it" — silence reads as the second. That costs a review round to recover information the author already had, and it happens on PRs that are otherwise fully green, which is exactly when the author has stopped looking.
How our fix solves it
Symptom: advisory
CONCERNSship unanswered. → Root cause: the skill's only reply rule targets GPT findings, and its severity language conflates "you need not change the code" with "you need not respond" — so nothing in the loop ever asks about a passing-but-concerned verdict. → Change: make answering a concern a readiness condition with its own loop step, and separate the two meanings of "advisory".Docs-only, one file (
src/kiro_crew/builtin_skills/kirocrew-dev/prepare-pr/SKILL.md):Core Conceptsbullet — "Answer every concern — MANDATORY, and a readiness condition." Enumerates what counts (non-PASS advisory bot verdicts, Arbiter-escalated items, human comments and inline threads), states that a green check is not a reply, and fixes the three allowed dispositions: fixed (change + SHA), rebutted (evidence, without contorting correct code), accepted-and-deferred (why out of scope + where it goes next). Explicitly forbids one blanket line for a batch, and notes answering is prose-only so it never widens the diff or forces another push.gh pr view --json comments,reviewscommand) placed before the poll, so it runs on every iteration rather than being remembered at the end. The old step 4 (poll) becomes step 5; the one stale "Phase 3 step 4" cross-reference is updated.CONCERNSis explicitly not converged, and the user-facing report must say how each left-on-purpose item was answered.Common mistakes— leaving aCONCERNSverdict unanswered, and answering a batch with one blanket "addressed the review feedback" line.What tests we did
pytest test/test_skills.py test/test_skill_home_paths.py test/test_agent_template_skills.py test/test_ai_review_workflows.py→ 182 passed. These cover the skill loader's frontmatter/description parsing, the lazy-load context budget (this file grew ~19 lines, well inside the budget), the agent-template skill listing, and the AI-review workflow contract the skill mirrors.Manual verification
Re-read the edited Phase 3 against the two PRs that motivated this and confirmed the new step 4 would have caught both: on #1432 and #1436 the
gh pr view --json comments,reviewsenumeration lists theDesign Review/UX ReviewCONCERNSbodies that the existing GPT-scoped disposition step skips, and Phase 4 would have blocked the "review-ready" report until each had a disposition. No screenshots — no user-visible UI surface changes.Any other suggestions on the work
The convention is currently enforced by prose only. A natural follow-up is a mechanical check — e.g. teach
pr_status.pyto count non-PASS bot verdicts that have no author reply and fold that into its exit code, so the loop fails closed instead of relying on the agent remembering to run step 4. Filing that separately rather than widening this docs change.Fixes #1529