Conversation
…hing dependencies
…plit write a verdict
…carries only the spec
…does not refuse it
…art-cr into shared references
…nto a shared review-setup reference
…so a headless caller can read them
…ls for workflow-driven reviews
…arked branch it starts from
…lenses, then re-review the fixes
…n a branch its repair changes
…d branch stays merged
…hange without asking or editing
… not the caller's turn
There was a problem hiding this comment.
Important
Findings meant for a human can still reach the automatic fixer, or get dropped, in implement-run.js. Two finding classes skip the human gate that the README, CHANGELOG and implement-tasks promise: spec wrong-implementations and boy-scout findings. A third gap lets a branch reach done while a finding the fixer skipped is still open.
Reviewed changes
This is the initial review of the full PR: code-review's headless pipeline, fd3's spec/split fixes, and the review stage wired into both implementation workflows.
- Shared code-review references —
/start-crSteps 2–5 move intoreview-setup.md,scanner-contract.mdandmerge-contract.md. The last adds aFix risksection that maps the apply buckets tosafe | structural | report-only. - Headless skills —
cr-prepare,cr-scanandcr-mergesplit the review into steps a workflow drives through a context directory. None of them asks questions, and an empty change or a missing lens comes back as a status. get_changes.py -C— runs as if started in another checkout, with a test.- fd3 spec stage —
build-specre-enters at validation for a finished spec,validate-specprobes run in a detached scratch worktree, a newnon-blocking —Result form is added, and aChecked at:line goes under the verdict. - fd3 split stage — the split stops when
origin/<default>has changed a cited path, never writes a verdict, and turns a commit sequence the spec binds into edges. - fd3 workflows —
defaultRefsplits intostartRefanddiffBase.reviewSkillsbecomes a booleanreviewthat drives cr-prepare, then one cr-scan per lens, then cr-merge, plus one delta review of the fixes. Repairs are reviewed from their ownfromSha. Every prompt gets a step guard, and CI now reads each command's own exit status. - Evals — code-review eval-20 (headless track on a git sandbox), plus fd3
split-stale-origin(with a newSETUP.shhook) andbuild-spec-reentry.
ℹ️ fd3's review stage depends on a code-review release that ships the cr-* skills
implement-run and repair-run call code-review:cr-prepare, cr-scan and cr-merge by name, and the two plugins release separately. If fd3 is released first, every user whose code-review predates this PR gets no-verdict on every branch with review on, so every branch stays merged. The step-2 wording handles this safely, but it would be a bad first experience.
Technical details
# Release order for the cross-plugin dependency
## Affected sites
- plugins/fd3/skills/implement-tasks/SKILL.md:113-121 — recommends review when `code-review:cr-scan` is listed
- plugins/fd3/README.md:52-56 — says review needs the code-review plugin, but not which version
## Required outcome
- code-review is released (`./scripts/release.sh code-review minor`) before or together with fd3
- fd3's README names the first code-review version that ships the headless skills
## Open questions for the human
- Should fd3's README or CHANGELOG pin a minimum code-review version?ℹ️ Nitpicks
plugins/code-review/references/merge-contract.md:231andplugins/code-review/references/scanner-contract.md:139citereferences/severity.md, but both files open by saying every path in them is relative toreferences/. That makes the pathseverity.md, asmerge-contract.md:70already writes it.
Claude Opus | 𝕏
There was a problem hiding this comment.
ℹ️ No critical issues. All three routing fixes are correct; the prose that lists what reaches the user just needs to catch up.
Reviewed changes
This run covers the four commits since the prior review at 7718000, each answering one prior thread.
- Kept
specfindings out of the fixer.sortFindingsexcludesfamily === 'spec'fromapplied, so a headlessstructuralwrong-implementation now goes toforHuman. - Routed boy-scout findings to the human. Both
CR_MERGE_RESULTschemas gainboyScout, both merge wrappers set it from theboy-scouttoken, andappliedexcludes it. - Held a branch on findings the fixer left unfixed.
FIX_RESULTgainsskipped, which the prompt asks for only on code-review fixes. Exact matches joinforHuman. A line the fixer paraphrased still becomes its ownreviewHIL item and setsreviewHeld, so a bad copy fails safe.reviewHeldnow ORs in, so the earlier hold survives. - Counted check 9's form as the fifth in
validation-report.md:65.
ℹ️ Nitpicks
plugins/fd3/workflows/implement-run.js:1007storessummary.review.applied/forHumanbefored39ba0bmoves the fixer's skipped findings intosorted.forHuman(L1015). So the run summary counts a declined finding as applied. Moving theObject.assignbelow the fix block (or recomputing the two counts there) would keep it accurate.
Claude Opus | 𝕏
| A `review` item is a finding the workflow would not fix unasked — a `spec` finding, a `security` | ||
| fix, a report-only one, or anything the delta review found in the fixes it did apply. Its branch |
There was a problem hiding this comment.
sortFindings now also sends two more kinds of finding to the human: boy-scout findings (98edd97) and findings the fixer left unfixed (d39ba0b). This list still names only the original four. The skill relays this text to the user literally, so it should name every kind of review item it can hand over. The same enumeration appears at README.md:55 and CHANGELOG.md:25-26.
| A `review` item is a finding the workflow would not fix unasked — a `spec` finding, a `security` | |
| fix, a report-only one, or anything the delta review found in the fixes it did apply. Its branch | |
| A `review` item is a finding the workflow would not fix unasked — a `spec` finding, a `security` | |
| fix, a boy-scout finding on code the branch never touched, a report-only one, a finding the fixer | |
| left unfixed, or anything the delta review found in the fixes it did apply. Its branch |
| `safe` and `structural` findings are fixed and the fixes reviewed again, while `spec` findings, | ||
| `security` fixes and report-only findings go to the user as `review` items. `repair-run` |
There was a problem hiding this comment.
Same drift as implement-tasks/SKILL.md:209: boy-scout findings and fixer-skipped findings now reach the user as review items too.
| `safe` and `structural` findings are fixed and the fixes reviewed again, while `spec` findings, | |
| `security` fixes and report-only findings go to the user as `review` items. `repair-run` | |
| `safe` and `structural` findings are fixed and the fixes reviewed again, while `spec` findings, | |
| `security` fixes, boy-scout findings, report-only findings and any finding the fixer left | |
| unfixed go to the user as `review` items. `repair-run` |
| one agent each. Mechanical and structural findings are fixed and the fixes reviewed again; | ||
| `spec` findings, `security` fixes and anything report-only go to the user. A branch whose review |
There was a problem hiding this comment.
Same drift: add the two new human-bound classes here too.
| one agent each. Mechanical and structural findings are fixed and the fixes reviewed again; | |
| `spec` findings, `security` fixes and anything report-only go to the user. A branch whose review | |
| one agent each. Mechanical and structural findings are fixed and the fixes reviewed again; | |
| `spec` findings, `security` fixes, boy-scout findings on untouched code, anything report-only and | |
| anything the fixer left unfixed go to the user. A branch whose review |
There was a problem hiding this comment.
ℹ️ The new commit adds no issues. The review stays non-approving only because the three prose threads from the previous review are still open. The lists of
reviewitems inimplement-tasks/SKILL.md,README.mdandCHANGELOG.mdstill leave out boy-scout findings and findings the fixer left unfixed.
Reviewed changes
This run covers the one commit since the prior review at 787d24b.
- Counted a coded worker heading as closing defect 5. In
validate-defective-spec.mjs, the uncoded "Delivery retry worker" check now passes in either of two cases. The first is a report finding that names retry-worker and element code. The second is a sandbox spec where a### PREFIX-n … workerheading has replaced the bare### Delivery retry worker. This fitsvalidate-spec/SKILL.md:269-270, which says a finding with one obvious correction should be corrected, not just reported. I also ran the predicate offline against the fixture. The unchanged spec evaluates tofalse: its existing coded headings (DB-1,API-1,OBSERVABILITY-1) don't contain "worker" on the heading line, so a run that neither reports nor fixes the defect still fails.
Claude Opus | 𝕏
There was a problem hiding this comment.
ℹ️ The new commit adds no issues. This review is non-approving only because three prose threads from an earlier review are still open. The lists of
reviewitems inimplement-tasks/SKILL.md,README.mdandCHANGELOG.mdstill leave out boy-scout findings and findings the fixer left unfixed.
Reviewed changes
This run covers the one commit since the prior review at a2af1d5.
- Told the five
validate-*evals that no one answers questions. Each prompt now tells the forkedvalidate-specskill not to hand up questions. Every user-held fact and every repair choice goes into the report asblocked, naming the question it would have asked. This matchesvalidate-spec/SKILL.md:297-300, which turns a claim that can't be settled before reporting intoblocked. It also means the final message is the full report, not a step-4 hand-up. The asserts can still fail:validate-ownerless-gap.mjs:19-20still requiresnot readywhen the claim is blocked, and still rejects adeferredclaim whose owner nobody gave.validate-clean-specandvalidate-phased-verdictstill fail if a spurious question becomes ablockedclaim, because that drops the verdict.- One side effect: no validate eval now exercises the step-4 hand-up batch or the route where an answer turns a claim
deferred.
Claude Opus | 𝕏

Summary
Fixes from an audit of the 2026-09-25 fd3 chain (
build-spec→split-to-tasks×2 →implement) and wires the code-review plugin into the implement workflow through new headless skills.fd3 — spec stage
build-specre-enters at validation when handed a finished spec, re-validates every edit made after the final verdict, places the spec in the repository's layout (never the scratchpad), and relays write-spec questions throughAskUserQuestion.validate-specprobes run in a scratch worktree without touching dependencies; non-blocking findings get their own check result form; the verdict line records the commit each repository was validated at.grill-topicre-checks sized recommendations when an answer widens scope.fd3 — split stage
build-spec.originchanged files the spec cites since validation.depends-on.fd3 — implement stage
origin/<default>(diffBase), not the parked branch it starts from (startRef) — the cause of the empty review diff.no-verdict, not clean; a branch with open findings staysmerged.code-review
cr-prepare,cr-scan,cr-mergefor workflow-driven reviews (no questions, no edits).get_changes.pygains-C.Test plan
split-stale-originandbuild-spec-reentryclaude plugin validateon both plugins; workflow scripts parse;get_changes.pytests passagent()(empty diff, delta findings, clean path,review: false)Not covered: a
split-commit-sequenceeval (no fixture has two independent elements on one branch).