docs: stop listing per-Agent worktrees as a non-goal - #97
Conversation
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
left a comment
There was a problem hiding this comment.
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-182already models the correct phrasing. Without it, §11 reads as the contradiction of §4 (see M2). - "Opt-in".
srs.md:1388says 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 explicitworker_worktrees.enabled: true", otherwise it "shall change no existing behavior" — matchingsrc/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:1388reads "DeferredFR-X01–FR-X08are unchanged, exceptFR-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.mduses nowhere else. Defensible (srs.md:1388uses 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
--clientdoes not weaken it.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). Consistent withproduct-spec.md:69andarchitecture.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 insrc/, no dependency/memory/approval code,assertHomogeneousClientstill enforced, no marker-based removal insrc/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 accurate —tests/unit/docs-facts.test.tsderives fromsrc/platforms/registry.ts,src/store/schema.ts,src/cli.ts, and ADR H1s, never these files; the other references todocs/design/architecture.mduse the path as afocus.docsstring 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 defeatschmodSync(…, 0o000)atdoctor.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
left a comment
There was a problem hiding this comment.
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 |
|---|---|
H1 — decisions.md:77, :148-149 had to land in this change |
Resolved. Both sites rewritten and folded in; this PR now closes #96. |
H2 — architecture.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. |
M2 — architecture.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. |
M3 — docs-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-15makes the feature usable from a manualcrew jointoo — 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 anddecisions.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 aresrs.md:1406(the FR-X07 title itself, correctly annotated as promoted),src/store/schema.ts:765andtests/unit/worktree.test.ts:408(both accurate references to Review Worktrees), anddocs-site/sections/limits.tsx:41/:69(#42). No uncovered stale prose remains indocs/,README.md,EXAMPLES.md,CLAUDE.md, orAGENTS.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: falseis "set" yet disables the feature (FR-W01: "an absent file, an absent key, orenabled: falseshall change no existing behavior";src/config.ts:81isoptBool(…, 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 totrue" would be exact. - L-b —
architecture.md:527-528describes 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-148enumerates 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 againstFR-X*= eight ids), so the substance is unchanged — but the newly bounded pointer makes the gap countable where the unboundedFR-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:149citesADR-0015bare while nearby paragraphs use linked form. Convention is already mixed in that file (:101is bare), andarchitecture.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
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.
Independent re-review — 2 reviewers, roster per
|
| # | 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:docs → dist-docs/main.js 102.1kb · tests/unit/docs-facts.test.ts 2 passed.
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.mdcalled it a Non-goal,docs/design/architecture.md§11 listed it as a deferred seam, anddocs/design/decisions.mdsaid it was deferred in two places. Per the authority order indocs/README.md:5-12, the lower documents are the bug.Verified directly rather than from the issue body:
src/config.ts:17admitsworker_worktreestoCONFIG_KEYSand:77-98parsesenabled/base_ref;src/worktree.tsexists;src/store/schema.ts:43-45carries theworktree_path/worktree_branch/worktree_base_reftriple under its own all-or-none CHECK at:58-59,:117creates the STRICTreview_worktreestable, and:757-845is the v3→v4 migration.docs/design/srs.md:1009—FR-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".--clientdoes 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.displac*match insrc/, no dependency/memory/approval-record code,assertHomogeneousClientstill enforced, no marker-based removal insrc/setup/).Two deltas against the issue body, noted rather than silently absorbed:
product-spec.md:87; the bullet is:88(:87is the Windows tmux bullet).What changed and why
docs/design/product-spec.md:88docs/design/architecture.md:515-516docs/design/architecture.md:526-530docs/design/decisions.md:77docs/design/decisions.md:148-149FR-X*pointer becomes "FR-X01–X08, except FR-X07, which ADR-0015 promoted to the opt-in group W contract."Why
architecture.md:526-530is 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.mdis 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-6requires 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.mdwording. 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, matchingsrc/config.ts:78— and it distinguishes the mechanism from ADR-0011's whole-Crew worktree, borrowingconfiguration.md:176-182's phrasing and the verb ADR-0015:92itself 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–X08range is kept rather than dropped: an intermediate draft replaced it with "the FR-X series", which lost a boundsrs.md:1388itself still keeps ("DeferredFR-X01–FR-X08are unchanged, exceptFR-X07") and made the bullet↔id mapping unfalsifiable. Both documents now mirror the SRS's own form.Wrapping: new
architecture.mdlines are 85/84/86/81 chars (file band ~88); newdecisions.mdlines are 76/91/63 (band ~93);product-spec.md:88is 60. No surrounding line was reflowed. Prettier is configuredproseWrap: "preserve", soformat:checkpasses 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.mdboth grant. Nothing guards any of the edited passages:tests/unit/docs-facts.test.tsderives fromsrc/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 todocs/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 afocus.docsstring; nothing reads it from disk.docs-site/generated/facts.jsonneeded no regeneration.Run on the final pushed tree, post-rebase:
npm run typecheckweb/+docs-site/)npm run lintnpm run format:checknpm run builddist/+dist/ui-assets/main.jsnpm run test:coveragePre-existing-failure proof (performed, not assumed).
git stash push -u→ confirmedgit status --porcelainempty at97d7f88→ 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:319and:373— bothchmod 000a directory and expect the read to fail; the container runs as uid 0, which ignores mode bits, so the expectedINVALID_CONFIGwarnings 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:43and: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:coverageexited non-zero, vitest printed no coverage table at all — the output was grepped for bothAll filesandERROR: Coverageand 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 nosrc/**orbin/**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 —mainhad 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.mdis authority rank 4, the lowest tier;product-spec.mdanddecisions.mdsit 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, noFR-*/NFR-*is added, renumbered, or given new meaning, and no CLI grammar rule, record type, error code, command, or flag moves.CURRENT_SCHEMA_VERSIONstays 7 — there is no schema change.Out of scope
Deliberately untouched:
docs/design/architecture.md:204-207anddocs/design/data-model.md:24-29describe Workspace discovery as a pure upward walk that always opens a worktree-local Store, omitting FR-W04's (srs.md:1023-1028)workspace-pointerredirect thatsrc/workspace.ts:142-155implements. 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. Notedata-model.mdis rank 3, abovearchitecture.md.docs-site/sections/limits.tsx:41,:68,:69repeat 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-18puts the site outside the authority order, so the same-change rule does not reach it — and editing a.tsxwould 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-16states 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:1386classifies 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 builtidiom 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:
docs/release-status-0-1-1) editsdocs/design/product-spec.md:107-110anddocs/design/decisions.md:24-31(DEC-7); this PR editsproduct-spec.md:88anddecisions.md:77/:148-149.docs/cli-contract-json-surface-drift) editsdocs/design/architecture.md:155; this PR edits:515-516and:526-530.docs/adr-cross-reference-drift) editsdocs/design/decisions.md:16and its Console-decisions section (:124-135); this PR edits:77and:148-149. No line overlap.