Skip to content

docs: stop listing per-Agent worktrees as a non-goal - #97

Merged
dichovsky merged 3 commits into
mainfrom
docs/per-agent-worktrees-shipped
Aug 6, 2026
Merged

docs: stop listing per-Agent worktrees as a non-goal#97
dichovsky merged 3 commits into
mainfrom
docs/per-agent-worktrees-shipped

Conversation

@dichovsky

@dichovsky dichovsky commented Aug 6, 2026

Copy link
Copy Markdown
Owner

Closes #40
Closes #96

Accepted ADR-0015 (authority rank 1) shipped per-Worker, per-Task git worktrees, and the SRS (rank 2) already records the promotion. Three lower-authority documents still disclaimed the feature: docs/design/product-spec.md called it a Non-goal, docs/design/architecture.md §11 listed it as a deferred seam, and docs/design/decisions.md said it was deferred in two places. Per the authority order in docs/README.md:5-12, the lower documents are the bug.

Verified directly rather than from the issue body:

  • The feature is shipped. src/config.ts:17 admits worker_worktrees to CONFIG_KEYS and :77-98 parses enabled/base_ref; src/worktree.ts exists; src/store/schema.ts:43-45 carries the worktree_path/worktree_branch/worktree_base_ref triple under its own all-or-none CHECK at :58-59, :117 creates the STRICT review_worktrees table, and :757-845 is the v3→v4 migration.
  • The SRS says so too. docs/design/srs.md:1009FR-W01 — Opt-in gate (ADR-0015, promoting FR-X07); :1388-1389; and Appendix D :1406-1409, where FR-X07 carries "promoted — built as the opt-in group W contract (FR-W01–FR-W15, §3.2) under ADR-0015 … no longer deferred or unscheduled".
  • The mixed-CLI half is still a true non-goal, and --client does not weaken it. assertHomogeneousClient (src/launcher/plan.ts:105-106) — if (clientSource !== 'default') return; — the override only skips the refusal for a Team with mixed platform hints; the plan still resolves exactly one client for every pane (:201, :210). So each sentence splits; none disappears.
  • FR-X07 is the only FR-X whose status changed, so the new "except FR-X07" phrasing introduces no second false claim. X01–X06 and X08 were each re-verified against the code (no claim/ack path, no displac* match in src/, no dependency/memory/approval-record code, assertHomogeneousClient still enforced, no marker-based removal in src/setup/).

Two deltas against the issue body, noted rather than silently absorbed:

  1. Line citation. The body cites product-spec.md:87; the bullet is :88 (:87 is the Windows tmux bullet).
  2. The fix is wider than the Acceptance states, in two steps — see below.

What changed and why

File Change
docs/design/product-spec.md:88 "Per-Agent worktrees, or mixing different Participant CLIs in one automatic launch." → "Mixing different Participant CLIs in one automatic launch."
docs/design/architecture.md:515-516 §11 bullet loses ", and one worktree per Agent" (now one line).
docs/design/architecture.md:526-530 The closing sentence no longer asserts FR-X07 is deferred, and now carries both qualifiers ADR-0015 attaches to the promotion.
docs/design/decisions.md:77 DEC-12: "Launching mixed Participant CLIs and per-Agent worktrees are deferred." → "Launching mixed Participant CLIs is deferred."
docs/design/decisions.md:148-149 Deferred product decisions: the per-Agent-worktrees candidate is dropped, and the FR-X* pointer becomes "FR-X01–X08, except FR-X07, which ADR-0015 promoted to the opt-in group W contract."

Why architecture.md:526-530 is in scope beyond the Acceptance. §11 closed with "The matching deferred requirements are FR-X01–X08". Dropping the worktree clause from the bullet while leaving that sentence would have left §11 still asserting FR-X07 is deferred — the same claim, in the same section, two lines below the fix.

Why decisions.md is in scope. It was initially filed as #96 and deferred; both reviewers independently called that the wrong call, and the authority order decides it. docs/README.md:5-6 requires the lower-authority document to be fixed in the same change, and — the sharper citation — srs.md:1392-1394 (rank 2) states that "promoting one into scope requires a documentation and plan update (see product-spec Non-goals and decisions.md)". The SRS names those two documents as one unit of work. Folded in; this PR closes #96.

On the architecture.md wording. The first draft read "promoted to the shipped group W contract", which dropped both qualifiers ADR-0015 insists on. It now states the opt-in gate concretely (worker_worktrees.enabled) so it cannot be read as live for every Workspace — FR-W01 (srs.md:1009-1014) says the feature "shall change no existing behavior" when unset, matching src/config.ts:78 — and it distinguishes the mechanism from ADR-0011's whole-Crew worktree, borrowing configuration.md:176-182's phrasing and the verb ADR-0015:92 itself uses ("not as its replacement"). The narrowing to "each Worker its own per-Task worktree" also blocks the over-read invited by FR-X07's own title ("Share one State Store while assigning distinct worktrees").

The hardcoded FR-X01–X08 range is kept rather than dropped: an intermediate draft replaced it with "the FR-X series", which lost a bound srs.md:1388 itself still keeps ("Deferred FR-X01FR-X08 are unchanged, except FR-X07") and made the bullet↔id mapping unfalsifiable. Both documents now mirror the SRS's own form.

Wrapping: new architecture.md lines are 85/84/86/81 chars (file band ~88); new decisions.md lines are 76/91/63 (band ~93); product-spec.md:88 is 60. No surrounding line was reflowed. Prettier is configured proseWrap: "preserve", so format:check passes either way.

Verification

Tests: none added — claiming the docs-only exemption. The diff is three Markdown files and zero code, which CONTRIBUTING.md:95 ("tests are not applicable for docs-only changes") and .github/ISSUE_TRIAGE.md both grant. Nothing guards any of the edited passages: tests/unit/docs-facts.test.ts derives from src/platforms/registry.ts, src/store/schema.ts, src/cli.ts, package.json, vitest.config.ts, and ADR H1 headings — never these files. The other test references to docs/design/architecture.md (tests/unit/launcher/config.test.ts:38/:50, prompts.test.ts:33/:43, team-launch.test.ts:45, tests/fixtures/launch-plan.dev.json:47) use the path as a focus.docs string; nothing reads it from disk. docs-site/generated/facts.json needed no regeneration.

Run on the final pushed tree, post-rebase:

Command Exit Result
npm run typecheck 0 clean (root + web/ + docs-site/)
npm run lint 0 clean
npm run format:check 0 "All matched files use Prettier code style!"
npm run build 0 dist/ + dist/ui-assets/main.js
npm run test:coverage 1 1388 passed, 3 skipped, 9 failed — all pre-existing and environmental

Pre-existing-failure proof (performed, not assumed). git stash push -u → confirmed git status --porcelain empty at 97d7f88 → full re-run on the clean tree → git stash pop. Both runs byte-identical: 4 failed / 107 passed / 2 skipped files; 9 failed / 1388 passed / 3 skipped tests; same nine named tests. Re-confirmed unchanged in count and identity after the fix pass, and reproduced independently by a reviewer.

The nine, named in full, with why this sandbox produces them:

  • tests/integration/commands/doctor.test.ts:319 and :373 — both chmod 000 a directory and expect the read to fail; the container runs as uid 0, which ignores mode bits, so the expected INVALID_CONFIG warnings never fire.
  • tests/integration/package/pack-smoke.test.ts:112, :118, :124, :133 — the packed executable exits 1 where 0/2 is expected; the installed-binary smoke does not work in this sandbox.
  • tests/unit/bin-entry-guard.test.ts:43 and :97.
  • tests/spawn/tmux-e2e.test.ts:267 — "lets team stop tear down a launch interrupted by SIGINT during the roster wait".

A Markdown-only edit cannot reach any of them, and CI is neither root nor affected.

Coverage thresholds were NOT evaluated locally. Because test:coverage exited non-zero, vitest printed no coverage table at all — the output was grepped for both All files and ERROR: Coverage and neither appeared — so the 95% statements/branches/functions/lines numbers were never displayed and no claim is made about them. This PR's CI run is authoritative, and it is green. The diff touches no src/** or bin/** file, so coverage cannot have moved.

Branch was cut from and rebased onto origin/main @ 97d7f88; the pre-push rebase was a no-op both times — main had not moved, and neither #94 nor #85 has merged. No force-push; the fix pass is a separate commit, not an amend.

Review

Two reviewers ran per .github/ISSUE_TRIAGE.md: the general code reviewer, and — the diff being docs-only — a documentation-accuracy reviewer verifying the prose against the code it describes and against the authority order, in place of the TypeScript reviewer. Findings are posted in full on this PR: 0 CRITICAL, 2 HIGH, 4 MEDIUM, 5 LOW. Both reviewers independently verified every factual claim in the diff and found them accurate; the HIGHs were about completeness and precision. The one allowed fix pass was taken and covered both HIGHs plus one LOW.

Contract impact

None. architecture.md is authority rank 4, the lowest tier; product-spec.md and decisions.md sit outside the four-tier order entirely, as build-packet and index documents. All three are corrected toward what ADR-0015 (rank 1) and the SRS (rank 2) already say, so no decision is made here. No ADR is amended, no FR-*/NFR-* is added, renumbered, or given new meaning, and no CLI grammar rule, record type, error code, command, or flag moves. CURRENT_SCHEMA_VERSION stays 7 — there is no schema change.

Out of scope

Deliberately untouched:

  • docs/design/architecture.md:204-207 and docs/design/data-model.md:24-29 describe Workspace discovery as a pure upward walk that always opens a worktree-local Store, omitting FR-W04's (srs.md:1023-1028) workspace-pointer redirect that src/workspace.ts:142-155 implements. Real, distinct, pre-existing defect surfaced by review — filed as Docs: architecture.md §4 and data-model.md describe Workspace discovery without FR-W04's pointer redirect #99 rather than folded in. Note data-model.md is rank 3, above architecture.md.
  • docs-site/sections/limits.tsx:41, :68, :69 repeat the stale claim and now also miscount ("Eight deferred seams"). That is docs-site prose drift: lifecycle omits abandoned, deferred-seam roster, glossary count #42's scope, which names the deferred-seam chip explicitly. docs/README.md:16-18 puts the site outside the authority order, so the same-change rule does not reach it — and editing a .tsx would flip this out of docs-only, triggering the TypeScript reviewer and the test-exemption question.
  • docs/design/srs.md:1406-1409 — FR-X07's promotion note is already correct, and the id is retained there deliberately as the historical source citation.
  • architecture.md:370 ("Optionally create or reuse one git worktree shared by the whole Crew") looks like the same drift but is not: ADR-0015 :11-16 states it is "not a replacement for ADR-0011's whole-Crew worktree" and that the two are independent mechanisms. Correct as written. Listed because a reviewer might expect it in the diff.
  • product-spec.md's "v1 capability scope" (:58-75) and "Post-v1 direction" (:135-141) gain no bullet for per-Worker worktrees. srs.md:1386 classifies FR-W01–FR-W15 as "additive post-v1 ids", so the scope list is correctly left alone; adding a Post-v1-direction line is a separate editorial claim product-spec.md still lists per-Agent worktrees as a non-goal despite ADR-0015 #40's Acceptance does not ask for. Raised by both reviewers as a MEDIUM and deliberately declined.
  • architecture.md:515's bullet form. A reviewer suggested the ~~strikethrough~~ — since built idiom used at :517. Judgment call; kept as a plain deletion.
  • architecture.md's other §11 bullets, the strikethrough Console bullet at :517-523, product-spec.md's other Non-goals bullets, its release-gate table, and its readiness prose.

One pre-existing looseness inherited, not worsened: §11's bullet↔id mapping was already approximate in both directions — FR-X08 (cleanup setup artifacts) has never had a bullet, and the struck bullet maps to FR-U32, not any FR-X. Flagged so it is not mistaken for new damage.

Related open PRs

Two open routine PRs touch two of these files, at different lines — no overlap, but neither should be merged alongside this one without a rebase check:

ADR-0015 (accepted) shipped per-Worker, per-Task git worktrees — see
`worker_worktrees.*` in src/config.ts, src/worktree.ts, and the tasks
worktree triple plus the `review_worktrees` table in src/store/schema.ts.
The SRS already records the promotion (FR-W01–FR-W15 under §3.2, with
FR-X07 retained in Appendix D only as a historical citation), but
product-spec.md still disclaimed the feature and architecture.md §11 still
listed it as a deferred seam, so two lower-authority docs contradicted a
higher-authority ADR about a headline shipped capability.

Only the mixed-CLI half of each claim is still true — `assertHomogeneousClient`
in src/launcher/plan.ts rejects mixed platform hints in one automatic launch —
so each sentence is split rather than dropped. §11's closing sentence now names
the FR-X series instead of a hardcoded FR-X01–X08 range, so a future promotion
cannot re-rot it the same way.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GFx7669kPwS66c4bBwTGFd

@dichovsky dichovsky left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Two reviewers ran per .github/ISSUE_TRIAGE.md: the general code reviewer, and — the diff being docs-only — a documentation-accuracy reviewer verifying the new prose against the code it describes and against the authority order, in place of the TypeScript reviewer. Both independently verified the diff's factual claims and both found them accurate; the findings below are about completeness and precision, not correctness.

Tally: 0 CRITICAL, 2 HIGH, 4 MEDIUM, 5 LOW.


CRITICAL

None. Both reviewers confirm the diff contains no false statement of fact.

HIGH

H1 — docs/design/decisions.md:77-78 and :149-150 belong in this change, not a follow-up

Both reviewers landed here independently, and the authority order decides it against the PR as written.

DEC-12 still reads "Launching mixed Participant CLIs and per-Agent worktrees are deferred", and Deferred product decisions still reads "…launching mixed Participant CLIs, and per-Agent worktrees remain candidates. See requirements FR-X*." After this PR, architecture.md:527 says FR-X07 was promoted — so two documents in docs/design/ now disagree about the same requirement id, and decisions.md's own "See requirements FR-X*" pointer sends a reader to srs.md:1406-1409, which says FR-X07 is not deferred.

Two rules pull it in:

  • docs/README.md:5-6 — "When documents disagree, follow the authority order below and fix the lower-authority document in the same change."
  • srs.md:1392-1394 (rank 2, and the sharper citation) — Appendix D's preamble: "promoting one into scope requires a documentation and plan update (see product-spec Non-goals and decisions.md)." The SRS names those two documents as one unit of work. This PR does the first and defers the second.

The PR's own scope argument cuts this way: if architecture.md:526-527 is in scope because it repeats the same stale claim two lines below the fix, decisions.md:77 repeats it verbatim and is pulled in by an explicit same-change rule that :526 is not. Filing it as #96 was the wrong call — fold it in and close #96 from this PR.

H2 — architecture.md:527 drops both qualifiers ADR-0015 attaches to the promotion

The new clause reads "except FR-X07, which ADR-0015 promoted to the shipped group W contract." FR-X07's own text (srs.md:1406) is "Per-Agent worktrees. Share one State Store while assigning distinct worktrees" — so a reader following §11 back to the definition is told the shared-Store-across-worktrees goal shipped. Two qualifiers are missing:

  • The ADR-0011 distinction. ADR-0015 goes out of its way to say (:11-16) "It is not a replacement for ADR-0011's whole-Crew worktree … It is a second, independent mechanism: one worktree per Worker per Task", and :92 "FR-X07 ships as an opt-in addition alongside ADR-0011's whole-Crew worktree, not as its replacement." docs/design/configuration.md:176-182 already models the correct phrasing. Without it, §11 reads as the contradiction of §4 (see M2).
  • "Opt-in". srs.md:1388 says only "promoted to the group W contract" — no "shipped"; the word comes from Appendix D :1407-1409, which qualifies it as the "opt-in group W contract". FR-W01 (srs.md:1009-1014) is emphatic — enabled "only by an explicit worker_worktrees.enabled: true", otherwise it "shall change no existing behavior" — matching src/config.ts:78. In a section headed Deferred seams, an unqualified "shipped" invites the inference that the seam is now live for every Workspace.

MEDIUM

M1 — architecture.md:515 abandons the list's own idiom for a promoted seam

Line 517 already handles exactly this case: "Browser write actions, pane peek, maintenance controls, and deleted-Workspace recovery — since built (recovery is FR-U32)." Using that strikethrough form here would preserve the record for a reader scanning the bullets and make the trailing "except FR-X07" exception unnecessary. Judgment call, not a defect.

M2 — architecture.md:204-207 is now the passage left half-corrected inside the edited file

It states that discovery from inside a git worktree "finds the worktree's own .crew/ by this same upward walk — a fresh, short-lived Store local to that worktree. This is deliberate: it is not an override that points back at the main repository's Store." True of ADR-0011's whole-Crew worktree, but stated as the general rule — and FR-W04 (srs.md:1023-1027) plus src/workspace.ts:137-148 (findWorkspaceRoot calls readPointerTarget(dir) and "follows it to the pointed-to root instead") specify the opposite for Task and review worktrees. Before this PR, §11's "one worktree per Agent — deferred" bullet was the only thing making §4's silence coherent. docs/design/data-model.md:24-29 carries the same omission and is higher authority than architecture.md.

Both reviewers agree this is a distinct pre-existing defect rather than something to fold in — filed as a separate issue.

M3 — docs-site/sections/limits.tsx:41 and :69 still advertise the feature as unbuilt

docs/README.md:16-18 puts the site outside the authority order, so the same-change rule does not reach it, and editing a .tsx would flip this into a non-docs-only diff that triggers the TypeScript reviewer and the test-exemption question. Correctly left to #42, which names the deferred-seam chip explicitly. Extra detail for that issue: limits.tsx:68 labels the entry "Eight deferred seams", which is now numerically wrong too.

M4 — product-spec.md mentions worktrees nowhere at all after the removal

Leaving "v1 capability scope" alone is right — srs.md:1386 classifies FR-W01–FR-W15 as "additive post-v1 ids" — but the file has a section for exactly this class, "Post-v1 direction" (:135-141), which already records the parallel additive slice for the Console. A 15-requirement shipped group now appears in neither list. Outside #40's Acceptance; noted as a follow-up, not a blocker.

LOW

  • L1 — architecture.md:526: "the FR-X series" loses a bound the SRS still keeps. srs.md:1388 reads "Deferred FR-X01FR-X08 are unchanged, except FR-X07". Mirroring that verbatim is both bounded and traceable; the vaguer wording makes the bullet↔id mapping unfalsifiable rather than fixing it. Since H2 reopens this line anyway, worth restoring.
  • L2 — the bullet↔FR-X mapping was already loose in both directions (FR-X08 has never had a bullet; the struck bullet maps to FR-U32, not any FR-X). Pre-existing, not worsened — flagged only so it is not mistaken for new damage.
  • L3 — "group W" is SRS section vocabulary architecture.md uses nowhere else. Defensible (srs.md:1388 uses the identical phrase), but "the FR-W01–FR-W15 contract" would be self-describing.
  • L4 — the PR body should name the four failing test files, not just the two doctor cases, and defer to CI as authoritative per .github/ISSUE_TRIAGE.md:270-271. (It does both — noted as verified.)
  • L5 — architecture.md:370 ("Optionally create or reuse one git worktree shared by the whole Crew") reads like the same drift but is not; correctly left untouched.

Verified clean — no finding

  • The promotion claim is accurate. Confirmed independently against src/config.ts:17/:77-98, src/worktree.ts, src/store/schema.ts:43-45/:58-59/:117/:757-845 (the v3→v4 migration), srs.md:1388/:1406-1409, cli-contract.md:90, and ADR-0015:92.
  • The surviving non-goal is still true, and --client does not weaken it. src/launcher/plan.ts:105-106if (clientSource !== 'default') return; — the override only skips the refusal for a Team with mixed platform hints; the plan still resolves exactly one client for every pane (:201, :210). Consistent with product-spec.md:69 and architecture.md:382-383.
  • FR-X07 is the only FR-X whose status changed, so "except FR-X07" introduces no new false claim. X01–X06 and X08 each re-verified against the code (no claim/ack path, no displac* match in src/, no dependency/memory/approval code, assertHomogeneousClient still enforced, no marker-based removal in src/setup/).
  • No ADR-0011/ADR-0015 conflation in the diff itself; the whole-Crew worktree passages are untouched.
  • Docs-only test exemption is legitimate (CONTRIBUTING.md:95), and "no test guards either passage" is accuratetests/unit/docs-facts.test.ts derives from src/platforms/registry.ts, src/store/schema.ts, src/cli.ts, and ADR H1s, never these files; the other references to docs/design/architecture.md use the path as a focus.docs string that nothing reads from disk.
  • Wrap and register. Both files pass npx prettier --check; new lines sit inside each file's existing hand-wrap band; no CONTEXT.md term is misused.
  • The pre-existing-failure proof holds. Reproduced independently: 9 failures across bin-entry-guard, doctor, pack-smoke, tmux-e2e, all environment-caused (uid 0 defeats chmodSync(…, 0o000) at doctor.test.ts:314; the rest are pack/tmux subprocess cases). A two-file Markdown diff no test reads cannot cause them.

Taking the one allowed fix pass on H1 and H2 (plus L1, same line). M2 is filed separately; M3 stays with #42; M1 and M4 are judgment calls left as-is.


Generated by Claude Code

Review found the first commit left the promotion half-recorded and
under-qualified.

decisions.md belongs in this change, not a follow-up: docs/README.md requires
the lower-authority document to be fixed in the same change, and Appendix D of
the SRS (rank 2) names product-spec Non-goals and decisions.md together as the
one documentation update a promotion requires. DEC-12 and the deferred-product
list still called per-Agent worktrees deferred, so the two sites now keep only
the mixed-Participant-CLI half — still true, since assertHomogeneousClient
refuses mixed platform hints and the plan resolves exactly one client per pane
even when --client overrides the refusal.

The architecture.md clause also read as an unqualified ship of FR-X07's own
text ("share one State Store while assigning distinct worktrees"). ADR-0015 is
explicit that it is an opt-in second mechanism — one worktree per Worker per
Task, gated on worker_worktrees.enabled — alongside, not replacing, ADR-0011's
whole-Crew launch worktree, and in a section headed "Deferred seams" that
distinction is what stops a reader over-reading the promotion. Restoring the
explicit FR-X01–X08 bound keeps the bullet-to-id mapping checkable, matching
how the SRS states the same exception.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GFx7669kPwS66c4bBwTGFd

@dichovsky dichovsky left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-check after the one allowed fix pass (3fd3808), changed areas only per .github/ISSUE_TRIAGE.md. Both reviewers re-ran.

Nothing CRITICAL or HIGH survives.

Prior finding Status
H1decisions.md:77, :148-149 had to land in this change Resolved. Both sites rewritten and folded in; this PR now closes #96.
H2architecture.md:527 dropped the ADR-0011 distinction and "opt-in" Resolved. Both qualifiers added.
L1 — the FR-X01–X08 bound was lost Resolved, and exactly: git show 97d7f88:docs/design/architecture.md ends "requirements are FR-X01–X08 in the …(./srs.md)." The fix restores that byte-for-byte, en dash (U+2013) included.
M2architecture.md:204-207 / data-model.md:24-29 FR-W04 gap Correctly untouched; filed as #99. git diff 866edb6..3fd3808 shows one architecture.md hunk at @@ -523,5 +523,8 — lines 204-207 and all of data-model.md are unmodified.
M3docs-site/sections/limits.tsx Correctly untouched; #42.
M1, M4 — bullet idiom, product-spec silence Declined as judgment calls, as stated.

Every new clause verified against source, independently by both reviewers:

New clause Checked against
"ADR-0015 promoted it to the opt-in group W contract" srs.md:1388, :1407-1409
"gives each Worker its own per-Task worktree" ADR-0015:14 ("one worktree per Worker per Task"), :51; FR-W05 srs.md:1029-1032; src/worktree.ts:168 deriveTaskWorktreePath
"only where worker_worktrees.enabled is set" FR-W01 srs.md:1009-1013; src/config.ts:17, :78, :81 ✓ (see L-a)
"separate from, and does not replace, ADR-0011's single worktree shared by a whole launched Crew" ADR-0015:11-16, :92; phrasing tracks configuration.md:180-182
decisions.md:148-149 "FR-X01–X08, except FR-X07…" mirrors srs.md:1388 in bound, exception, and qualifier

The over-read invited by FR-X07's own title ("Share one State Store while assigning distinct worktrees") is now blocked: the sentence names the shipped shape (per-Worker, per-Task, opt-in) instead of letting a reader infer one worktree per Agent unconditionally. And it defuses the §4 tension raised as M2 — a reader reaching architecture.md:204-207 now has an explicit in-file signal that those sentences describe the other mechanism.

decisions.md checks that were asked for specifically:

  • DEC-12's paragraph still reads correctly after shortening, and its ADR-0011 description is intact (:73-76, "optional isolation of the whole launched Crew in one git worktree"). Subject-verb agreement was correctly repaired ("are" → "is") when the compound subject lost a member.
  • DEC-12 correctly does not gain a per-Worker-worktrees mention: it is scoped Launcher scope, and ADR-0015:14-15 makes the feature usable from a manual crew join too — so it is not a launcher decision.
  • srs.md:1392-1394's same-change rule is fully satisfied. It names exactly two documents — product-spec Non-goals and decisions.md — and both are now in this PR. No third document is left behind.
  • Repo-wide re-grep for per-Agent worktree|worktree per Agent: the only surviving hits are srs.md:1406 (the FR-X07 title itself, correctly annotated as promoted), src/store/schema.ts:765 and tests/unit/worktree.test.ts:408 (both accurate references to Review Worktrees), and docs-site/sections/limits.tsx:41/:69 (#42). No uncovered stale prose remains in docs/, README.md, EXAMPLES.md, CLAUDE.md, or AGENTS.md.

Remaining LOW (non-blocking, not fixed — the fix pass is spent)

  • L-a — architecture.md:528: "is set" is loose for a boolean. enabled: false is "set" yet disables the feature (FR-W01: "an absent file, an absent key, or enabled: false shall change no existing behavior"; src/config.ts:81 is optBool(…, false, …)). Because the clause is a restriction ("only where"), the loose reading is still a true necessary condition, so nothing is falsified — but "is set to true" would be exact.
  • L-b — architecture.md:527-528 describes group W as Worker worktrees only, omitting the Inspector's persistent Review Worktree (FR-W07, srs.md:1036-1041; the SRS section is titled "W. Worker and review worktrees"). Under-claims rather than misleads in a deferred-seams list. Ironically the omitted half is the literally per-Agent one.
  • L-c — decisions.md:147-148 enumerates six candidates against seven remaining ids; FR-X08 (cleanup setup artifacts) still has no entry. The pre-existing text had the identical one-item gap (seven items against FR-X* = eight ids), so the substance is unchanged — but the newly bounded pointer makes the gap countable where the unbounded FR-X* hid it. That is the unavoidable cost of resolving L1 by restoring the bound, and it is the right trade. The same arithmetic now holds in §11 (six bullets, seven ids).
  • L-d — decisions.md:149 cites ADR-0015 bare while nearby paragraphs use linked form. Convention is already mixed in that file (:101 is bare), and architecture.md's bare style matches its own dominant usage (:83, :208, :408, :481).

Gates

npm run format:check passes ("All matched files use Prettier code style!"). New lines are inside each file's hand-wrap band (architecture.md:526-530 at 85/84/86/81/14 against neighbours at 86-88; decisions.md:77/:147-149 at 76/93/93/63 against neighbours at 85-93). Diff remains docs-only — 3 files, +10/−8 — so the CONTRIBUTING.md:95 test exemption stands unchanged. CI was green on 866edb6 (ubuntu / node 24.18.0 and publish dry-run both success), which is the authoritative word on the 95% coverage thresholds the sandbox could not evaluate.

One out-of-scope observation, already tracked and not re-filed: decisions.md:16 says the current ADR set is "ADR-0001…ADR-0015" while 0016 and 0017 exist. That is #36's third item, and open PR #91 already corrects that exact line.

Marking ready for review — nothing CRITICAL or HIGH survives.


Generated by Claude Code

@dichovsky
dichovsky marked this pull request as ready for review August 6, 2026 17:47
Both independent reviewers landed on the same MEDIUM: the new sentence
names "the opt-in group W contract" and then describes only half of it.
The SRS heading is "W. Worker and review worktrees" (srs.md:1007), and
FR-W07 mandates a second, differently-shaped worktree — one persistent,
reusable worktree per reviewing Agent, keyed on agent_id
(src/store/schema.ts:117). That reviewer half is the part that most
directly retires the non-goal this PR deletes, so omitting it weakened
the change's own justification.

Two further gaps the reviewers found, both made newly visible by this diff:

- Replacing the loose FR-X* pointer with an explicit FR-X01–X08 range made
  a pre-existing mismatch falsifiable: the range resolves to seven ids once
  FR-X07 is excluded, but the prose listed six. FR-X08 (remove generated
  Participant CLI artifacts by marker) never had a bullet in either
  document. Added to both.
- docs-site/sections/limits.tsx still called one worktree per Agent
  deferred, and this change makes its "Eight deferred seams" count wrong by
  one. Corrected to seven, with the stale worktree entry replaced by the
  FR-X08 item that was missing there too.

docs-site/sections/limits.tsx is newly added to this PR's file set. The
site sits outside the authority order, so no rule forced this — but the
count is only wrong because of this change.
@dichovsky

Copy link
Copy Markdown
Owner Author

Independent re-review — 2 reviewers, roster per .github/ISSUE_TRIAGE.md

Fresh pass, both blind to the earlier review. 0 CRITICAL, 0 HIGH, 2 MEDIUM, 2 LOW — and both reviewers independently landed on the same MEDIUM.

The premise is verified: worker_worktrees is real code (src/config.ts:17-19, src/worktree.ts, src/store/schema.ts:43-59), opt-in via src/config.ts:78 / src/tasks.ts:236. The Agent-vs-Worker question resolves in the PR's favour — adr/0011:25-27 files FR-X07 as "the deferred per-Agent-worktrees goal", adr/0015:7-16 quotes that filing and says it builds it, and srs.md:1406 titles FR-X07 "Per-Agent worktrees". The title uses the repo's own vocabulary. A literally per-Agent worktree also shipped: review_worktrees keyed on agent_id (schema.ts:117).

# Sev Scope Finding Status
1 MEDIUM ×2 in-scope architecture.md:527-528 names "the opt-in group W contract" then describes only half of it. The SRS heading is "W. Worker and review worktrees" (srs.md:1007); FR-W07 mandates one persistent worktree per reviewing Agent — the very part that retires the non-goal this PR deletes fixed
2 LOW pre-existing Replacing the loose FR-X* pointer with an explicit FR-X01–X08 range made a pre-existing mismatch falsifiable: the range resolves to seven ids, the prose listed six. FR-X08 never had a bullet in either document fixed in both
3 LOW pre-existing adr/0011:26-27 still calls FR-X07 deferred in the present tense fixed in #91, which edits that ADR — signposted with an amendment marker rather than a silent edit
4 LOW pre-existing docs-site/sections/limits.tsx still lists one-worktree-per-Agent as deferred, and this change makes its "Eight deferred seams" count wrong by one fixed

Scope expansion, called out explicitly

docs-site/sections/limits.tsx is newly added to this PR's file set. The site sits outside the authority order (docs/README.md:16-18), so no rule compelled this — but the count is only wrong because of this change. It also lost the FR-X08 item, added here too. Corrected to "Seven deferred seams".

Verification on 5213064

limits.tsx is real source, so the full gate ran: npm run typecheck clean · npm run lint clean · npm run format:check clean · npm run build:docsdist-docs/main.js 102.1kb · tests/unit/docs-facts.test.ts 2 passed.

@dichovsky
dichovsky merged commit 4d8d85e into main Aug 6, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

2 participants