@mmerterden/multi-agent-pipeline 19.1.4 → 20.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/CHANGELOG.md +94 -0
  2. package/README.md +19 -36
  3. package/README.tr.md +18 -35
  4. package/docs/adr/0002-instruction-driven-flag.md +6 -5
  5. package/docs/adr/0005-lazy-phase-docs.md +2 -2
  6. package/docs/adr/0008-installer-modularization-and-secret-leak-defense.md +1 -0
  7. package/docs/adr/0009-claude-stack-skills-plugin-only.md +1 -1
  8. package/docs/adr/0010-own-code-graph.md +5 -4
  9. package/docs/adr/0012-macos-only.md +2 -2
  10. package/docs/adr/0013-lsp-code-intelligence.md +2 -2
  11. package/docs/adr/0014-six-phase-consolidation.md +9 -9
  12. package/docs/adr/0015-one-pipeline-no-depth-answer.md +83 -0
  13. package/docs/adr/0016-the-run-shape-is-asked-not-typed.md +69 -0
  14. package/docs/adr/README.md +18 -16
  15. package/docs/architecture.md +2 -2
  16. package/docs/ecosystem.md +5 -5
  17. package/docs/facts.json +3 -6
  18. package/docs/features.md +4 -5
  19. package/docs/token-budget-history.md +1 -1
  20. package/install/_common.mjs +9 -1
  21. package/install/templates/copilot-instructions.md +7 -16
  22. package/manifest.json +111 -114
  23. package/package.json +1 -1
  24. package/pipeline/commands/multi-agent/SKILL.md +6 -8
  25. package/pipeline/commands/multi-agent/analysis/SKILL.md +2 -0
  26. package/pipeline/commands/multi-agent/analysis-jira/SKILL.md +2 -0
  27. package/pipeline/commands/multi-agent/analysis-resolve/SKILL.md +2 -0
  28. package/pipeline/commands/multi-agent/autopilot/SKILL.md +2 -0
  29. package/pipeline/commands/multi-agent/autopilot-on/SKILL.md +2 -0
  30. package/pipeline/commands/multi-agent/autopilot-status/SKILL.md +1 -1
  31. package/pipeline/commands/multi-agent/build-optimize/SKILL.md +2 -0
  32. package/pipeline/commands/multi-agent/channels/SKILL.md +1 -1
  33. package/pipeline/commands/multi-agent/create-jira/SKILL.md +2 -0
  34. package/pipeline/commands/multi-agent/design-check/SKILL.md +1 -1
  35. package/pipeline/commands/multi-agent/forget/SKILL.md +2 -0
  36. package/pipeline/commands/multi-agent/garbage-collect/SKILL.md +4 -2
  37. package/pipeline/commands/multi-agent/help/SKILL.md +21 -27
  38. package/pipeline/commands/multi-agent/ios-coding-standard/SKILL.md +5 -4
  39. package/pipeline/commands/multi-agent/issue/SKILL.md +2 -0
  40. package/pipeline/commands/multi-agent/jira/SKILL.md +2 -0
  41. package/pipeline/commands/multi-agent/language/SKILL.md +2 -0
  42. package/pipeline/commands/multi-agent/prune-logs/SKILL.md +2 -0
  43. package/pipeline/commands/multi-agent/purge/SKILL.md +2 -0
  44. package/pipeline/commands/multi-agent/resume/SKILL.md +177 -48
  45. package/pipeline/commands/multi-agent/save/SKILL.md +2 -0
  46. package/pipeline/commands/multi-agent/stack/SKILL.md +2 -0
  47. package/pipeline/commands/multi-agent/sync/SKILL.md +6 -7
  48. package/pipeline/commands/multi-agent/test-screenshots/SKILL.md +2 -0
  49. package/pipeline/commands/multi-agent/uninstall/SKILL.md +2 -0
  50. package/pipeline/lib/repo-hygiene.sh +1 -1
  51. package/pipeline/multi-agent-refs/analysis/render.md +1 -1
  52. package/pipeline/multi-agent-refs/analysis/resolve.md +1 -1
  53. package/pipeline/multi-agent-refs/analysis/synthesis.md +1 -1
  54. package/pipeline/multi-agent-refs/analysis-template.md +1 -1
  55. package/pipeline/multi-agent-refs/component-dispatch.md +0 -8
  56. package/pipeline/multi-agent-refs/cross-cli-contract.md +10 -11
  57. package/pipeline/multi-agent-refs/features/external-context-injection.md +2 -0
  58. package/pipeline/multi-agent-refs/features/review-delta.md +1 -1
  59. package/pipeline/multi-agent-refs/features/review-multi-repo.md +3 -3
  60. package/pipeline/multi-agent-refs/features/skill-conformance.md +1 -1
  61. package/pipeline/multi-agent-refs/features/visual-evidence.md +2 -1
  62. package/pipeline/multi-agent-refs/features/worktree-finalize.md +1 -1
  63. package/pipeline/multi-agent-refs/generate-issue.md +2 -0
  64. package/pipeline/multi-agent-refs/issue-jira-triad.md +2 -0
  65. package/pipeline/multi-agent-refs/keychain.md +2 -0
  66. package/pipeline/multi-agent-refs/knowledge.md +0 -7
  67. package/pipeline/multi-agent-refs/outside-the-pipeline.md +1 -1
  68. package/pipeline/multi-agent-refs/payload-contracts.md +1 -1
  69. package/pipeline/multi-agent-refs/phases/modes.md +32 -108
  70. package/pipeline/multi-agent-refs/phases/operations.md +2 -0
  71. package/pipeline/multi-agent-refs/phases/phase-0-init.md +23 -42
  72. package/pipeline/multi-agent-refs/phases/phase-1-plan.md +7 -18
  73. package/pipeline/multi-agent-refs/phases/phase-2-dev.md +13 -44
  74. package/pipeline/multi-agent-refs/phases/phase-3-review.md +19 -22
  75. package/pipeline/multi-agent-refs/phases/phase-4-commit.md +6 -6
  76. package/pipeline/multi-agent-refs/phases/phase-5-report.md +2 -2
  77. package/pipeline/multi-agent-refs/phases.md +9 -11
  78. package/pipeline/multi-agent-refs/progress-contract.md +1 -1
  79. package/pipeline/multi-agent-refs/readiness-review.md +2 -0
  80. package/pipeline/multi-agent-refs/rules.md +1 -1
  81. package/pipeline/multi-agent-refs/tracker-contract.md +9 -40
  82. package/pipeline/multi-agent-refs/wiki-capture.md +3 -2
  83. package/pipeline/preferences-template.json +2 -2
  84. package/pipeline/rules/figma-pipeline.md +1 -1
  85. package/pipeline/schemas/agent-state.schema.json +5 -10
  86. package/pipeline/schemas/migrations/prefs-2.7.0-to-2.8.0.mjs +33 -0
  87. package/pipeline/schemas/phases.json +3 -24
  88. package/pipeline/schemas/prefs.schema.json +5 -5
  89. package/pipeline/scripts/cost-table.json +1 -1
  90. package/pipeline/scripts/gc-refs.sh +1 -1
  91. package/pipeline/scripts/gen-mode-dispatch.mjs +11 -41
  92. package/pipeline/scripts/migrate-prefs.mjs +18 -17
  93. package/pipeline/scripts/phase-tracker.sh +2 -2
  94. package/pipeline/scripts/phase0-exit-gate.mjs +1 -1
  95. package/pipeline/scripts/plan-coverage-gate.mjs +3 -3
  96. package/pipeline/scripts/run-aggregator.mjs +1 -1
  97. package/pipeline/scripts/usage-report.mjs +0 -2
  98. package/pipeline/scripts/worktree-finalize.sh +2 -2
  99. package/pipeline/skills/.skill-manifest.json +8 -20
  100. package/pipeline/skills/.skills-index.json +6 -39
  101. package/pipeline/skills/shared/README.md +5 -8
  102. package/pipeline/skills/shared/core/multi-agent/SKILL.md +8 -11
  103. package/pipeline/skills/shared/core/multi-agent-autopilot-status/SKILL.md +1 -1
  104. package/pipeline/skills/shared/core/multi-agent-help/SKILL.md +13 -16
  105. package/pipeline/skills/shared/core/multi-agent-ios-coding-standard/SKILL.md +2 -3
  106. package/pipeline/skills/shared/core/multi-agent-resume/SKILL.md +51 -15
  107. package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +6 -6
  108. package/pipeline/skills/skills-index.md +3 -6
  109. package/pipeline/commands/multi-agent/local/SKILL.md +0 -132
  110. package/pipeline/commands/multi-agent/local-autopilot/SKILL.md +0 -142
  111. package/pipeline/commands/multi-agent/resume-local/SKILL.md +0 -114
  112. package/pipeline/skills/shared/core/multi-agent-local/SKILL.md +0 -41
  113. package/pipeline/skills/shared/core/multi-agent-local-autopilot/SKILL.md +0 -55
  114. package/pipeline/skills/shared/core/multi-agent-resume-local/SKILL.md +0 -51
package/CHANGELOG.md CHANGED
@@ -14,6 +14,100 @@ Internal file-layout changes that don't affect the slash-command surface are sti
14
14
 
15
15
  ---
16
16
 
17
+ ## [20.0.0] - 2026-09-21
18
+
19
+ ### Removed
20
+
21
+ - **The Phase 0 Step 7.5 depth question, and `state.onlyDevelop` with it.** A
22
+ picker asked Full or Short before the run had read anything, and Short skipped
23
+ the plan phase outright - a guess about work not yet examined, recommended
24
+ from `taskType` alone. It was the same defect v19.0.0 removed from the
25
+ analysis phase when Lite went: a fixed selector overriding a rule that reads
26
+ evidence. There is one pipeline; every mode runs its whole phase set.
27
+ - **`/multi-agent:local`, `/multi-agent:local-autopilot` and the `--local`
28
+ flag.** Where the branch lives is the Phase 0 Step 5b question and nothing
29
+ else answers it. `autopilot` resolves it to a worktree without asking,
30
+ because an unattended run commits and pushes from wherever it stands.
31
+ - **`/multi-agent:resume-local`**, folded into `/multi-agent:resume`. One
32
+ command now lists both kinds of unfinished work - runs that stopped
33
+ mid-phase, and the current branch when it carries work no run produced - and
34
+ asks which to pick up. The tail it runs (Review → Commit → Report, no Plan
35
+ and no Dev) is unchanged; only its entry point moved.
36
+
37
+ Command inventory: 60 → 57.
38
+
39
+ ### Fixed
40
+
41
+ - **Every phase reported its telemetry under the number it had before the
42
+ six-phase merge.** 29 `log-metric.sh` and `phase-tracker.sh tokens` calls
43
+ across the phase docs carried literal ids from the eight-phase contract, so
44
+ Dev's spend landed on Review's tile, Review's on Commit's, and Commit's on a
45
+ number no phase has. The accounting gate then refused to close those phases,
46
+ because the phase whose completion it guarded had recorded nothing. Each doc
47
+ now emits under its own id, and `smoke-phase-telemetry-ids.sh` derives that
48
+ id from the file name rather than a list.
49
+ - **The accounting gate covered phases 1-4 by literal**, which under the new
50
+ numbering left Report ungated and, before the renumbering above, gated
51
+ Commit against a doc that recorded nowhere. `TRACKER_LLM_PHASES` now defaults
52
+ to every phase that dispatches a model, and the gate checks each covered
53
+ phase has a recording path.
54
+ - **`/multi-agent:doctor` was missing from the Turkish help catalog and
55
+ `:analysis-jira` from the Turkish one too.** Half the audience could not see
56
+ two commands that ship. `smoke-help-catalog.sh` now compares both language
57
+ blocks against the command tree, and fails a row pointing at a command that
58
+ does not ship.
59
+ - **`smoke-description-tr.sh` sampled a hardcoded command** that no longer
60
+ exists, so its round-trip check passed on a missing file. The sample is
61
+ derived from the tree.
62
+
63
+ ### Added
64
+
65
+ - **`smoke-picker-callers.sh`** - `AskUserQuestion` refuses a call declaring
66
+ fewer than two options and discards every question batched with it, so the
67
+ rules that prevent it have to reach whoever writes a picker. Every spec that
68
+ renders one now cites `picker-contract.md`, the gate holds that at 47
69
+ callers, and a third check fails any spec that narrates the one-candidate
70
+ skip the contract forbids. A fourth holds the Phase 0 chain to its step
71
+ breadcrumb, so a six-question intake keeps saying which step it is on.
72
+ - **`smoke-phase-telemetry-ids.sh`** and **`smoke-help-catalog.sh`**, described
73
+ under Fixed above.
74
+
75
+ ### Changed
76
+
77
+ - **Phase 1 always runs, and what it produces scales with the evidence.** The
78
+ Locked 2 omission rule already drops a section with nothing behind it, so a
79
+ one-line chore yields a short document rather than a skipped phase. Phase 2
80
+ steps 1, 2, 3, 5 and 6 read that document; a step whose section is absent
81
+ records `not-applicable (no <section> in this document)` instead of aborting.
82
+ - **The Plan Approval Gate has one skip left: `autopilot`**, and it is a skip
83
+ because there is nobody to ask, not because the run is a lighter kind of run.
84
+ - **Tracker registration is a single batch at Step -1.** Nothing is deferred:
85
+ no answer later in the run can add or remove a phase, so `gen-mode-dispatch.mjs`
86
+ loses its deferred branch and every generated tracker section shrinks to one
87
+ registration loop.
88
+ - **`global.resumeLocal` → `global.resume`**, preferences schema 2.8.0. The
89
+ `autoFix` value carries across; the key follows the command the tail now
90
+ enters through.
91
+ - **`phases.json` modes drop their `local` flag.** No mode set it once the two
92
+ local commands went, and a generator branch no caller can reach reads as a
93
+ capability. The generated dispatch blocks are byte-identical, so the drift
94
+ gate holds.
95
+ - Two gates now assert the ABSENCE: `smoke-pipeline-surface.sh` fails if Phase 0
96
+ grows a depth step or writes a depth key, or if any of the four downstream
97
+ readers reads one; `smoke-plan-approval-gate.sh` fails if the gate's scope
98
+ clause widens past autopilot.
99
+
100
+ ### Breaking
101
+
102
+ `state.onlyDevelop` is gone from a schema with `additionalProperties: false`, so
103
+ a state file written before v20 does not validate. The floor moves with
104
+ `dist-tags.required` rather than a migration: a run below it halts rather than
105
+ reading a record written under a contract that no longer exists.
106
+
107
+ Decision, alternatives and consequences: [ADR-0015](docs/adr/0015-one-pipeline-no-depth-answer.md) and [ADR-0016](docs/adr/0016-the-run-shape-is-asked-not-typed.md).
108
+
109
+ ---
110
+
17
111
  ## [19.1.4] - 2026-09-21
18
112
 
19
113
  ### Added
package/README.md CHANGED
@@ -83,7 +83,7 @@ Run a task - the input type is auto-detected:
83
83
 
84
84
  Every input runs the same short intake - **account → (repo) → maturity check → dev-context** - then enters Phase 0. A Jira id or GitHub URL is fetched and maturity-checked _before_ any code is written; free-text skips the fetch and goes straight to planning. Multi-repo tasks add extra repos at the dev-context step.
85
85
 
86
- Add `autopilot` to skip confirmations (e.g. `/multi-agent:autopilot "PROJ-1234"`). Neither the workspace nor the depth is a flag any more - they are two questions the run asks at Phase 0: where to run (worktree or your current checkout), then how deep (Full or Short). `--local` and `:local` answer the first up front.
86
+ Add `autopilot` to skip confirmations (e.g. `/multi-agent:autopilot "PROJ-1234"`). The workspace is not a flag either - it is the one question the run asks about its own shape at Phase 0: where to run, a worktree or your current checkout.
87
87
 
88
88
  Update later with `/multi-agent:update`. Uninstall (tokens preserved) with `npx @mmerterden/multi-agent-pipeline uninstall`.
89
89
 
@@ -91,13 +91,12 @@ Update later with `/multi-agent:update`. Uninstall (tokens preserved) with `npx
91
91
 
92
92
  ## How it works
93
93
 
94
- One command runs up to 6 phases, with a gate between the risky ones. Phase 0
95
- asks two questions that decide the shape of the rest - how deep the run goes
96
- (Full or Short) and where the branch lives (a worktree or your current
97
- checkout):
94
+ One command runs 6 phases, with a gate between the risky ones. Every run
95
+ carries the whole set; the one question Phase 0 asks about shape is where the
96
+ branch lives, a worktree or your current checkout:
98
97
 
99
98
  - **0 · Init** - parse the input (Jira id / GitHub URL / free text), pick account + repo(s), fetch the issue, run a maturity check.
100
- - **1 · Plan** - detect the stack, scan the codebase and write the analysis document, then break it into tasks with file-level targets and **stop for your approval** before touching code. Analysis and planning were two phases until 19.0.0; the depth picker always skipped them together, because they are one decision. Codebase scanning runs on the explorer persona (Sonnet).
99
+ - **1 · Plan** - detect the stack, scan the codebase and write the analysis document, then break it into tasks with file-level targets and **stop for your approval** before touching code. Analysis and planning were two phases until 19.0.0; they are one decision, so they are one phase. Codebase scanning runs on the explorer persona (Sonnet).
101
100
  - **2 · Dev** - TDD: failing test → code → green, following the repo's style + the active stack skills. The phase ends at its own gate: build, lint, tests and a secret scan, run **once**. Review used to build again, and nothing consumed the difference.
102
101
  - **3 · Review** - a **CLI-aware parallel review** against the logs Dev produced - Claude Code runs 3 models (Fable + Opus + Sonnet), Copilot CLI runs 3 (GPT-5.4 + Opus + Sonnet) - then a **Fable triage** keeps only actionable findings; blockers loop back to Phase 2. The optional user test lives here, keeping its waiting state.
103
102
  - **4 · Commit/PR** - conventional commit, push (must succeed), open a PR (`Ref: #N`, never auto-close).
@@ -109,8 +108,8 @@ checkout):
109
108
 
110
109
  Two of the six phases were doing the same work twice. Dev built the project
111
110
  and tee'd a log; Review opened by building it again. Analysis and Planning were
112
- already one decision - the depth picker skipped them together and the state
113
- schema described them as one unit. Six phases now, one build per run.
111
+ already one decision, and the state schema described them as one unit. Six
112
+ phases now, one build per run.
114
113
 
115
114
  The other half of the change is that the count is finally guarded.
116
115
  `smoke-phase-contract.sh` derives it from `pipeline/schemas/phases.json` and
@@ -157,7 +156,7 @@ A failed `git fetch` degrades loudly rather than silently: the list falls back t
157
156
 
158
157
  ### Workspace: worktree or local
159
158
 
160
- Phase 0 Step 5b asks where the branch lives. **Worktree** (`.worktrees/{id}/`) leaves your current checkout untouched; **Local** works in the project root on a new branch, which drops Phase 5 - the user-test gate checks the change out of a worktree and there is none - and needs the project root clean. `/multi-agent:local` and `--local` answer it up front. Every autopilot entry resolves it to a worktree without asking: an unattended run commits and pushes from wherever it stands, and doing that in your own checkout is what worktrees exist to prevent. `:local-autopilot` is the explicit opt-out.
159
+ Phase 0 Step 5b asks where the branch lives. **Worktree** (`.worktrees/{id}/`) leaves your current checkout untouched; **Local** works in the project root on a new branch, and needs the project root clean. It is a question, not a flag: there is no `:local` command and no `--local` switch, so the answer is always visible in the run rather than buried in how the run was typed. `autopilot` resolves it to a worktree without asking, because an unattended run commits and pushes from wherever it stands and doing that in your own checkout is what worktrees exist to prevent. The manual-test offer at the end of Review follows the same answer: a worktree run is asked whether to check the branch out and test it, a local run already is that checkout, so there is nothing to offer.
161
160
 
162
161
  Under the hood: each task runs in its own **git worktree** (or the current branch when you choose local), commits use the **git identity routed from the repo's origin URL**, and **multi-repo** tasks get per-repo worktrees plus an integration build. Tokens stay in the OS keychain; nothing is committed or logged. `/multi-agent:review` can also review an existing GitHub/Bitbucket PR - per-finding inline comments anchored to `file:line` + an explicit Approve / Needs-Work state.
163
162
 
@@ -168,39 +167,23 @@ The discipline behind all of this - bounded loops, evidence gates, token-budgete
168
167
  | Mode | Command | Flow |
169
168
  | --------- | ------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |
170
169
  | Full | `/multi-agent "task"` | All 6 phases, interactive |
171
- | Autopilot | `/multi-agent:autopilot "task"` | 6 phases (interactive Test gate dropped), no confirmations |
172
- | Local | `/multi-agent:local "task"` | Full pipeline minus the interactive Test gate, current branch (no worktree) |
173
- | Depth | asked at Phase 0 Step 7.5 | Full (all phases) or Short (Dev → Review → Test → Commit → Report). Not a command name - `/multi-agent` and `:local` ask, both autopilot entries always run Full |
174
- | Ship | `/multi-agent:resume-local` | Run the review→test→commit→report tail over local work |
170
+ | Autopilot | `/multi-agent:autopilot "task"` | The same 6 phases, no confirmations; the workspace resolves to a worktree and the user-test gate inside Review is skipped |
175
171
  | Audit | `/multi-agent:design-check` | Mock-mode vs Figma conformance, local-only |
176
172
  | Audit | `/multi-agent:testflight-validation` | Pre-submission gates for a TestFlight build: static archive audit → Apple's `altool --validate-app` → Review-Guidelines check. Validates only, never uploads |
177
173
 
178
- Depth, autopilot and `--local` are the only knobs on the run itself; everything else is its own command. The full catalog is below.
179
-
180
- ### Pipeline depth: Full or Short
181
-
182
- Depth is the one question the run asks about its own shape. `/multi-agent` and `/multi-agent:local` ask it at Phase 0 Step 7.5 - after the issue is fetched and the task type is known, because that is what the recommendation is drawn from.
183
-
184
- - **Full** runs everything: Analysis reads the codebase and maps impact, Planning writes a task breakdown and stops for your approval, and Dev works from that plan.
185
- - **Short** starts at Dev: Init → Dev → Review → Test → Commit → Report. Analysis and Planning do not run, so there is no plan gate and no analysis document; Dev derives its own task list from the issue, and runs on **Opus** rather than Sonnet because it has no plan to follow. Review, the deterministic gates and the test suite are untouched - Short skips the thinking, never the proof.
186
-
187
- Short is right when you already know the fix and the file: a one-line guard, a copy change, a rename, a revert. It is wrong when the cause is still a hypothesis, when the task carries a Figma reference or an analysis document (Planning is what turns those into a breakdown), or when the change spans repos.
188
-
189
- The widget follows the answer rather than predicting it: Phase 0 is the only tile drawn before you choose, and a Short run never draws an Analysis tile at all. Both autopilot entries skip the question and always run Full. `agent-state.json` records which one ran as `onlyDevelop`.
174
+ `autopilot` is the only knob on the run itself; everything else is its own command. The full catalog is below.
190
175
 
191
176
  ## Commands
192
177
 
193
- `/multi-agent` plus 56 sub-commands. `/multi-agent:help` renders the same catalog in your terminal, in your `outputLanguage`.
178
+ `/multi-agent` plus 57 sub-commands. `/multi-agent:help` renders the same catalog in your terminal, in your `outputLanguage`.
194
179
 
195
180
  ### Pipeline entries
196
181
 
197
182
  | Command | What it does |
198
183
  | ------------------------------------- | ---------------------------------------------------------------------------------------------------- |
199
- | `/multi-agent "task"` | Full pipeline in a worktree. Asks Full or Short depth at Phase 0 |
200
- | `/multi-agent:local "task"` | Same pipeline on the current branch, no worktree |
201
- | `/multi-agent:autopilot "task"` | Worktree, no confirmations, always Full |
202
- | `/multi-agent:local-autopilot "task"` | Current branch, no confirmations, always Full |
203
- | `/multi-agent:resume-local` | Pipeline tail over work already done locally: Review → Build+Test → Commit/PR → Report. No dev phase |
184
+ | `/multi-agent "task"` | The pipeline; Phase 0 asks where the branch lives |
185
+ | `/multi-agent:autopilot "task"` | The same pipeline, unattended: worktree resolved, no confirmations |
186
+ | `/multi-agent:resume` | Unfinished work, either source: a stopped run picks up where it left off, a branch with no run behind it gets the tail (Review → Build+Test → Commit/PR → Report) |
204
187
 
205
188
  ### Task control
206
189
 
@@ -208,7 +191,7 @@ The widget follows the answer rather than predicting it: Phase 0 is the only til
208
191
  | --------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- |
209
192
  | `/multi-agent:status` | Every task's ID, phase, branch and state |
210
193
  | `/multi-agent:log [#N]` | Show a task's `agent-log.md` (most recent by default) |
211
- | `/multi-agent:resume [#N]` | Carry a stopped or failed task on from its last phase |
194
+ | `/multi-agent:resume [#N]` | Carry a stopped or failed task on from its last phase, or run the tail over a branch with no run behind it |
212
195
  | `/multi-agent:kill [#N]` | Stop a task, remove its worktree and branch |
213
196
  | `/multi-agent:steer #N "<instruction>"` | Correct a running task without stopping it; applied at the next phase boundary |
214
197
  | `/multi-agent:search` | Ranked search across every task log; `--semantic` queries the triage corpus |
@@ -386,17 +369,17 @@ This enables the matching plugin (+ the shared `ai-common` plugin) in the repo's
386
369
 
387
370
  ## Tool support
388
371
 
389
- The pipeline runs natively on **Claude Code**, **Copilot CLI** and **Codex CLI** - all three install from the same `pipeline/` source and get the same 60 commands.
372
+ The pipeline runs natively on **Claude Code**, **Copilot CLI** and **Codex CLI** - all three install from the same `pipeline/` source and get the same 57 commands.
390
373
 
391
374
  | Tool | Flag | What it installs |
392
375
  | ----------- | -------------------- | ------------------------------------------------------------------------------------------------------ |
393
376
  | Claude Code | `--claude` (default) | slash commands + skills + agents + three `PreToolUse` hooks (secret scan, agent-guard, read-size gate) |
394
- | Copilot CLI | `--copilot` | instructions + 60 sub-command skills + scripts |
395
- | Codex CLI | `--codex` | one router skill + 60 specs as refs + 9 agent TOML + `AGENTS.md` block + `codex mcp add` |
377
+ | Copilot CLI | `--copilot` | instructions + 57 sub-command skills + scripts |
378
+ | Codex CLI | `--codex` | one router skill + 57 specs as refs + 9 agent TOML + `AGENTS.md` block + `codex mcp add` |
396
379
 
397
380
  Filter skills by stack with `--platform=ios\|android\|all`.
398
381
 
399
- **Why Codex gets one skill and not 60.** Codex assembles every discovered skill's name
382
+ **Why Codex gets one skill and not 57.** Codex assembles every discovered skill's name
400
383
  and description into a single prompt block and drops entries when it overflows, with no
401
384
  error. Measured on 0.145: installing one plugin that declares 142 skills surfaced only
402
385
  75 of them and evicted an unrelated user skill. So on Codex the pipeline ships a single
package/README.tr.md CHANGED
@@ -82,7 +82,7 @@ Bir görev çalıştır - girdi tipi otomatik algılanır:
82
82
 
83
83
  Her girdi aynı kısa intake'ten geçer - **hesap → (repo) → maturity kontrolü → dev-context** - sonra Phase 0'a girer. Bir Jira id'si veya GitHub URL'i hiçbir kod yazılmadan _önce_ çekilir ve maturity-kontrol edilir; serbest-metin bu çekimi atlayıp doğrudan planlamaya geçer. Çoklu-repo görevleri dev-context adımında ekstra repo ekler.
84
84
 
85
- Onayları atlamak için `autopilot` ekle (örn. `/multi-agent:autopilot "PROJ-1234"`). Derinlik de çalışma alanı da artık bayrak değil, koşunun sorduğu iki soru: `/multi-agent` Faz 0'da önce nerede koşacağını (worktree/lokal), sonra ne kadar derin koşacağını (Tam/Kısa) sorar. `--local` ve `:local` ilkini baştan cevaplar.
85
+ Onayları atlamak için `autopilot` ekle (örn. `/multi-agent:autopilot "PROJ-1234"`). Çalışma alanı bayrak değil: koşunun kendi şekli hakkında sorduğu tek soru, Faz 0'da nerede koşacağı - worktree mi, mevcut checkout'un mu. `autopilot` bu soruyu sormadan worktree'ye karar verir.
86
86
 
87
87
  Sonra `/multi-agent:update` ile güncelle. Kaldırmak için (tokenlar korunur) `npx @mmerterden/multi-agent-pipeline uninstall`.
88
88
 
@@ -90,13 +90,12 @@ Sonra `/multi-agent:update` ile güncelle. Kaldırmak için (tokenlar korunur) `
90
90
 
91
91
  ## Nasıl çalışır
92
92
 
93
- Tek komut en fazla 6 fazı çalıştırır, riskli olanlar arasında bir kapı ile. Faz
94
- 0 geri kalanın şeklini belirleyen iki soru sorar: koşu ne kadar derin olacak
95
- (Tam mı Kısa mı) ve branch nerede yaşayacak (worktree mi, mevcut checkout'un
96
- mu):
93
+ Tek komut 6 fazı çalıştırır, riskli olanlar arasında bir kapı ile. Her koşu
94
+ tüm kümeyi taşır; Faz 0'ın şekil hakkında sorduğu tek soru branch'in nerede
95
+ yaşayacağı: worktree mi, mevcut checkout'un mu.
97
96
 
98
97
  - **0 · Init** - girdiyi ayrıştır (Jira id / GitHub URL / serbest metin), hesap + repo(lar) seç, issue'yu çek, maturity kontrolü yap.
99
- - **1 · Plan** - stack'i tespit et, codebase'i tara ve analiz dokümanını yaz; sonra onu dosya seviyesinde hedefleri olan görevlere böl ve koda dokunmadan önce **onayın için dur**. Analiz ve planlama 19.0.0'a kadar iki ayrı fazdı; derinlik seçici ikisini hep birlikte atlıyordu, çünkü tek bir karar. Codebase taraması explorer persona'sı üzerinde koşar (Sonnet).
98
+ - **1 · Plan** - stack'i tespit et, codebase'i tara ve analiz dokümanını yaz; sonra onu dosya seviyesinde hedefleri olan görevlere böl ve koda dokunmadan önce **onayın için dur**. Analiz ve planlama 19.0.0'a kadar iki ayrı fazdı; tek bir karar oldukları için tek faz. Codebase taraması explorer persona'sı üzerinde koşar (Sonnet).
100
99
  - **2 · Dev** - TDD: başarısız test → kod → yeşil, repo'nun stiline + aktif stack skill'lerine uyarak. Faz kendi kapısında biter: build, lint, test ve sır taraması, **bir kez** koşar. Review eskiden ikinci kez build ediyordu ve aradaki farkı kimse okumuyordu.
101
100
  - **3 · Review** - Dev'in ürettiği log'lara karşı **CLI-farkında paralel review** - Claude Code 3 model çalıştırır (Fable + Opus + Sonnet), Copilot CLI 3 (GPT-5.4 + Opus + Sonnet) - ve bir **Fable triage** sadece aksiyon alınabilir bulguları tutar; blocker'lar Phase 2'ye geri döner. Opsiyonel kullanıcı testi burada, bekleme durumunu koruyarak.
102
101
  - **4 · Commit/PR** - conventional commit, push (başarılı olmalı), bir PR aç (`Ref: #N`, asla otomatik kapatma).
@@ -137,7 +136,7 @@ Başarısız bir `git fetch` sessizce değil, yüksek sesle bozuluyor: liste lok
137
136
 
138
137
  ### Çalışma alanı: worktree mi lokal mi
139
138
 
140
- Faz 0 Adım 5b branch'in nerede yaşayacağını sorar. **Worktree** (`.worktrees/{id}/`) mevcut checkout'una dokunmaz; **Lokal** proje kökünde yeni bir branch'te çalışır, bu da Faz 5'i düşürür - kullanıcı-test kapısı değişikliği bir worktree'den checkout eder, ortada worktree yoktur - ve proje kökünün temiz olmasını ister. `/multi-agent:local` ve `--local` bu soruyu baştan cevaplar. Her autopilot girişi sormadan worktree'ye karar verir: gözetimsiz bir koşu nerede duruyorsa oradan commit'leyip push eder, ve bunu senin kendi checkout'unda yapmak tam olarak worktree'nin engellemek için var olduğu şeydir. `:local-autopilot` bunun açık opt-out'u.
139
+ Faz 0 Adım 5b branch'in nerede yaşayacağını sorar. **Worktree** (`.worktrees/{id}/`) mevcut checkout'una dokunmaz; **Lokal** proje kökünde yeni bir branch'te çalışır ve proje kökünün temiz olmasını ister. Bu bir soru, bayrak değil: `:local` komutu da `--local` anahtarı da yok, yani cevap koşunun nasıl yazıldığına gömülmek yerine koşunun içinde görünür. `autopilot` sormadan worktree'ye karar verir: gözetimsiz bir koşu nerede duruyorsa oradan commit'leyip push eder, ve bunu senin kendi checkout'unda yapmak tam olarak worktree'nin engellemek için var olduğu şeydir. Review'ın sonundaki manuel test önerisi de aynı cevabı izler: worktree koşusuna branch'i checkout edip test etmek isteyip istemediği sorulur, lokal koşu zaten o checkout'un içindedir, yani önerilecek bir şey yoktur.
141
140
 
142
141
  Perde arkasında: her görev kendi **git worktree**'sinde çalışır (ya da lokal seçtiğinde mevcut branch'te), commit'ler **repo'nun origin URL'inden yönlendirilen git kimliğini** kullanır, ve **çoklu-repo** görevleri repo başına worktree artı bir integration build alır. Tokenlar OS keychain'de kalır; hiçbir şey commit edilmez ya da loglanmaz. `/multi-agent:review` mevcut bir GitHub/Bitbucket PR'ını da review edebilir - `file:line`'a bağlı bulgu-başına inline yorumlar + açık bir Approve / Needs-Work durumu.
143
142
 
@@ -148,39 +147,23 @@ Bunun arkasındaki disiplin - sınırlı loop'lar, kanıt kapıları, token-büt
148
147
  | Mod | Komut | Akış |
149
148
  | --------- | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
150
149
  | Full | `/multi-agent "task"` | Tüm 6 faz, interaktif |
151
- | Autopilot | `/multi-agent:autopilot "task"` | 6 faz (interaktif Test kapısı atlanır), onaysız |
152
- | Local | `/multi-agent:local "task"` | İnteraktif Test kapısı hariç tam pipeline, mevcut branch (worktree yok) |
153
- | Derinlik | Faz 0 Adım 7.5'te sorulur | Full (tüm fazlar) veya Short (Dev → Review → Test → Commit → Report). Komut adı değil - `/multi-agent` ve `:local` sorar, iki autopilot girişi de her zaman Full koşar |
154
- | Ship | `/multi-agent:resume-local` | Lokal iş üzerinde review→test→commit→report kuyruğunu çalıştır |
150
+ | Autopilot | `/multi-agent:autopilot "task"` | Aynı 6 faz, onaysız; çalışma alanı worktree'ye çözülür ve Review içindeki kullanıcı-test kapısı atlanır |
155
151
  | Audit | `/multi-agent:design-check` | Mock-mode vs Figma uygunluğu, yalnızca lokal |
156
152
  | Audit | `/multi-agent:testflight-validation` | TestFlight build için pre-submission kapıları: statik archive denetimi → Apple'ın `altool --validate-app`'i → Review-Guidelines kontrolü. Yalnızca doğrular, asla yüklemez |
157
153
 
158
- Koşunun kendisinde ayarlanabilen tek şey derinlik, autopilot ve `--local`; geri kalan her şey kendi komutu. Tam katalog aşağıda.
159
-
160
- ### Pipeline derinliği: Tam mı Kısa mı
161
-
162
- Derinlik, koşunun kendi şekli hakkında sorduğu tek soru. `/multi-agent` ve `/multi-agent:local` bunu Faz 0 Adım 7.5'te sorar - issue çekildikten ve görev tipi belirlendikten sonra, çünkü öneri onlardan çıkıyor.
163
-
164
- - **Tam** hepsini koşar: Analiz kod tabanını okuyup etki alanını çıkarır, Planlama görev kırılımını yazıp onayını bekler, Dev de o plandan çalışır.
165
- - **Kısa** doğrudan Dev'den başlar: Init → Dev → Review → Test → Commit → Report. Analiz ve Planlama koşmaz; plan kapısı ve analiz dokümanı yoktur, görev listesini Dev issue'dan kendi çıkarır ve takip edecek bir planı olmadığı için Sonnet yerine **Opus** üzerinde koşar. Review, deterministik kapılar ve test paketi aynen kalır - Kısa düşünmeyi atlar, kanıtı değil.
166
-
167
- Kısa'yı düzeltmeyi ve dosyayı zaten biliyorsan seç: tek satırlık bir guard, bir metin değişikliği, bir yeniden adlandırma, bir geri alma. Neden hâlâ bir hipotezse, görevde Figma referansı ya da analiz dokümanı varsa (bunları kırılıma çeviren şey Planlama'dır) ya da değişiklik birden fazla repoya yayılıyorsa yanlış seçim olur.
168
-
169
- Widget cevabı tahmin etmek yerine takip eder: sen seçmeden önce yalnızca Faz 0 karosu çizilir, Kısa koşu Analiz karosunu hiç çizmez. İki autopilot girişi de bu soruyu sormaz, her zaman Tam koşar. Hangisinin koştuğunu `agent-state.json` `onlyDevelop` alanında tutar.
154
+ Koşunun kendisinde ayarlanabilen tek şey autopilot; geri kalan her şey kendi komutu. Tam katalog aşağıda.
170
155
 
171
156
  ## Komutlar
172
157
 
173
- `/multi-agent` ve 56 alt komut. `/multi-agent:help` aynı katalogu terminalde, `outputLanguage` ayarına göre gösterir.
158
+ `/multi-agent` ve 57 alt komut. `/multi-agent:help` aynı katalogu terminalde, `outputLanguage` ayarına göre gösterir.
174
159
 
175
160
  ### Pipeline girişleri
176
161
 
177
162
  | Komut | Ne yapar |
178
163
  | ------------------------------------- | ----------------------------------------------------------------------------------------------- |
179
- | `/multi-agent "task"` | Worktree'de tam pipeline. Faz 0'da Full mu Short mu diye sorar |
180
- | `/multi-agent:local "task"` | Aynı pipeline, mevcut branch üzerinde, worktree yok |
181
- | `/multi-agent:autopilot "task"` | Worktree, onay yok, her zaman Full |
182
- | `/multi-agent:local-autopilot "task"` | Mevcut branch, onay yok, her zaman Full |
183
- | `/multi-agent:resume-local` | Lokalde bitmiş iş için pipeline kuyruğu: Review → Build+Test → Commit/PR → Report. Dev fazı yok |
164
+ | `/multi-agent "task"` | Pipeline; branch'in nerede yaşayacağını Faz 0 sorar |
165
+ | `/multi-agent:autopilot "task"` | Aynı pipeline, gözetimsiz: worktree'ye çözülür, onay sorulmaz |
166
+ | `/multi-agent:resume` | Yarım kalan iş, iki kaynaktan da: duran koşu kaldığı yerden devam eder, arkasında koşu olmayan branch kuyruğu alır (Review → Build+Test → Commit/PR → Report) |
184
167
 
185
168
  ### Görev kontrolü
186
169
 
@@ -188,7 +171,7 @@ Widget cevabı tahmin etmek yerine takip eder: sen seçmeden önce yalnızca Faz
188
171
  | ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ |
189
172
  | `/multi-agent:status` | Her görevin ID'si, fazı, branch'i ve durumu |
190
173
  | `/multi-agent:log [#N]` | Görevin `agent-log.md` dosyası (varsayılan: en son görev) |
191
- | `/multi-agent:resume [#N]` | Durmuş ya da hata almış görevi kaldığı fazdan sürdürür |
174
+ | `/multi-agent:resume [#N]` | Durmuş ya da hata almış görevi kaldığı fazdan sürdürür; arkasında koşu olmayan branch için kuyruğu çalıştırır |
192
175
  | `/multi-agent:kill [#N]` | Görevi durdurur, worktree'sini ve branch'ini siler |
193
176
  | `/multi-agent:steer #N "<talimat>"` | Koşan bir görevi durdurmadan düzeltir; talimat bir sonraki faz sınırında uygulanır |
194
177
  | `/multi-agent:search` | Tüm görev loglarında sıralamalı arama; `--semantic` triyaj corpus'unu sorgular |
@@ -331,7 +314,7 @@ PR sayısına tavan yok; sınırlar 24 saatlik yuvarlanan `costCeilingUsd` ve
331
314
  makinenin kapasitesi.
332
315
 
333
316
  **`swiftc` varsa menü çubuğu göstergesi** aynı `status.json`'ı sağ üstte çizer ve
334
- kendi kendine tazelenir: madde başına tek satır - id, Full ya da Short, kesir
317
+ kendi kendine tazelenir: madde başına tek satır - id, kesir
335
318
  olarak faz, geçen süre, stack. Madde biter bitmez satır kaybolur ve PR'ıyla
336
319
  Raporlar altında görünür. Yalnızca **çizer**; bir koşuyu başlatamaz, durduramaz,
337
320
  değiştiremez. ActivityKit macOS'ta yok, o yüzden bu bir `NSStatusItem` ve
@@ -367,17 +350,17 @@ Bu, ilgili plugin'i (+ ortak `ai-common` plugin'ini) repo'nun `.claude/settings.
367
350
 
368
351
  ## Araç desteği
369
352
 
370
- Pipeline **Claude Code**, **Copilot CLI** ve **Codex CLI** üzerinde native çalışır - üçü de aynı `pipeline/` kaynağından kurulur ve aynı 60 komutu alır.
353
+ Pipeline **Claude Code**, **Copilot CLI** ve **Codex CLI** üzerinde native çalışır - üçü de aynı `pipeline/` kaynağından kurulur ve aynı 57 komutu alır.
371
354
 
372
355
  | Araç | Bayrak | Ne kurar |
373
356
  | ----------- | ----------------------- | ---------------------------------------------------------------------------------------------------------------- |
374
357
  | Claude Code | `--claude` (varsayılan) | slash komutları + skill'ler + agent'lar + üç `PreToolUse` hook'u (secret scan, agent-guard, okuma-boyutu geçidi) |
375
- | Copilot CLI | `--copilot` | talimatlar + 60 alt-komut skill'i + script'ler |
376
- | Codex CLI | `--codex` | bir router skill + ref olarak 60 spec + 9 agent TOML + `AGENTS.md` bloğu + `codex mcp add` |
358
+ | Copilot CLI | `--copilot` | talimatlar + 57 alt-komut skill'i + script'ler |
359
+ | Codex CLI | `--codex` | bir router skill + ref olarak 57 spec + 9 agent TOML + `AGENTS.md` bloğu + `codex mcp add` |
377
360
 
378
361
  Skill'leri stack'e göre filtrele: `--platform=ios\|android\|all`.
379
362
 
380
- **Codex neden 60 değil de tek bir skill alıyor.** Codex, keşfettiği her skill'in adını
363
+ **Codex neden 57 değil de tek bir skill alıyor.** Codex, keşfettiği her skill'in adını
381
364
  ve açıklamasını tek bir prompt bloğuna toplar ve blok taştığında girdileri hatasızca
382
365
  düşürür. 0.145 üzerinde ölçüldü: 142 skill deklare eden bir plugin kurulduğunda sadece
383
366
  75'i yüzeye çıktı ve alakasız bir kullanıcı skill'i tahliye edildi. Bu yüzden Codex'te
@@ -1,6 +1,7 @@
1
1
  # 2. `instructionDriven` flag as explicit pipeline fork
2
2
 
3
3
  **Status:** Accepted · 2025
4
+
4
5
  > **Phase numbers below are the eight-phase ones.** [ADR-0014](./0014-six-phase-consolidation.md) renumbered the contract in v19.0.0 (Phase 6 Commit is now Phase 4, Phase 7 Report is now Phase 5). The decision this ADR records is unchanged; only the labels moved, and they are left as written because an ADR records what was decided.
5
6
 
6
7
  ## Context
@@ -27,11 +28,11 @@ phases that need to fork read this flag.
27
28
  Phase 6 uses a **deterministic truth table** (documented at
28
29
  `phase-6-commit.md:25`) to dispatch:
29
30
 
30
- | `instructionDriven` | `instructionFiles.commit` exists | Action |
31
- | ------------------- | -------------------------------- | ------ |
32
- | true | yes | Instruction-driven path |
33
- | true | no | Log error, set `instructionDrivenFallback=true`, use standard path |
34
- | false | - | Standard path |
31
+ | `instructionDriven` | `instructionFiles.commit` exists | Action |
32
+ | ------------------- | -------------------------------- | ------------------------------------------------------------------ |
33
+ | true | yes | Instruction-driven path |
34
+ | true | no | Log error, set `instructionDrivenFallback=true`, use standard path |
35
+ | false | - | Standard path |
35
36
 
36
37
  ## Consequences
37
38
 
@@ -27,10 +27,10 @@ Current budgets (v3.5.0):
27
27
 
28
28
  - Phase 0: warn 3500 / max 4000 (INIT is interactive + token-heavy)
29
29
  - Phase 1: warn 1200 / max 1500
30
- - Phase 2: warn 800 / max 1000
30
+ - Phase 2: warn 800 / max 1000
31
31
  - Phase 3: warn 1500 / max 1800
32
32
  - Phase 4: warn 1800 / max 2200 (triage + 3-model review is verbose)
33
- - Phase 5: warn 600 / max 800
33
+ - Phase 5: warn 600 / max 800
34
34
  - Phase 6: warn 2400 / max 2800 (commit + PR + issue body update)
35
35
  - Phase 7: warn 1800 / max 2200
36
36
 
@@ -1,6 +1,7 @@
1
1
  # 8. Installer modularization + secret-leak defense
2
2
 
3
3
  **Status:** Accepted · 2026-04-27 (v8.0.0)
4
+
4
5
  > **Phase numbers below are the eight-phase ones.** [ADR-0014](./0014-six-phase-consolidation.md) renumbered the contract in v19.0.0 (the producer/consumer phase docs it names were renumbered). The decision this ADR records is unchanged; only the labels moved, and they are left as written because an ADR records what was decided.
5
6
 
6
7
  > **Amended v10.7.0:** the `_adapters.mjs` module and its third-party adapter dispatch were removed when the pipeline narrowed to Claude Code + Copilot CLI (see ADR 0007). `install/` now ships **8** modules, not 9; the module list below records the v8.0.0 decision as it shipped at the time.
@@ -9,7 +9,7 @@ ADR-0006 split the source tree into `shared/core/` + `shared/external/` but kept
9
9
  That left Claude Code receiving every stack skill **twice**:
10
10
 
11
11
  - 110 of 157 local skill dirs duplicated the enabled plugins byte-for-byte - ~10k tokens of duplicate descriptions per session, 4.4 MB on disk.
12
- - The local copy shadowed the plugin the moment it went stale, and it *was* stale in practice: the plugin cache and the local copy advanced on different schedules.
12
+ - The local copy shadowed the plugin the moment it went stale, and it _was_ stale in practice: the plugin cache and the local copy advanced on different schedules.
13
13
  - The duplication hid real bugs: `skill-conformance.mjs` and `match-skills.mjs` only knew the local root, so they kept working by accident - against the stale copy.
14
14
 
15
15
  ## Decision
@@ -1,6 +1,7 @@
1
1
  # 10. Our own code graph, not a forked one
2
2
 
3
3
  **Status:** Accepted · 2026-08-28
4
+
4
5
  > **Phase numbers below are the eight-phase ones.** [ADR-0014](./0014-six-phase-consolidation.md) renumbered the contract in v19.0.0 (`phase-1-analysis.md` is now `phase-1-plan.md` and Phase 7 Report is now Phase 5). The decision this ADR records is unchanged; only the labels moved, and they are left as written because an ADR records what was decided.
5
6
 
6
7
  ## Context
@@ -85,10 +86,10 @@ a repo whose files are not in the page cache costs more: the first build of the
85
86
  30,000-token retrieval budget, ground truth derived by grep and path match so
86
87
  that the impact family is stacked against the graph on purpose.
87
88
 
88
- | Arm | Coverage | Tokens/question |
89
- |---|---|---|
90
- | grep + read | 66.0% | 24,555 |
91
- | code graph | 80.4% | 18,465 |
89
+ | Arm | Coverage | Tokens/question |
90
+ | ----------- | -------- | --------------- |
91
+ | grep + read | 66.0% | 24,555 |
92
+ | code graph | 80.4% | 18,465 |
92
93
 
93
94
  The aggregate passes the gate, but the split is the useful part. On questions
94
95
  naming an exact type, `grep -lw` is the oracle: it scored 100% and the graph
@@ -50,7 +50,7 @@ constructs look like cross-platform scaffolding and are load-bearing on macOS:
50
50
 
51
51
  1. `smoke-shell-portability.sh`'s `grep -P` ban. BSD grep has no `-P`, exits 2,
52
52
  and with `2>/dev/null` that reads as "found nothing". Two gates already
53
- shipped green on macOS for exactly this reason. The rule is *more* relevant
53
+ shipped green on macOS for exactly this reason. The rule is _more_ relevant
54
54
  after this ADR, not less; only its header changes, from "supports macOS,
55
55
  Linux and Windows" to "the runtime is BSD userland and bash 3.2".
56
56
  2. The `sha256sum || shasum` ordering in seven scripts. The gate fails a file
@@ -63,7 +63,7 @@ constructs look like cross-platform scaffolding and are load-bearing on macOS:
63
63
  Together they are what keeps macOS writes on `security -i`, with the secret
64
64
  on stdin and never on argv. Simplifying one without the other silently moves
65
65
  the write onto the delegate.
66
- 5. `github-ssh-setup.sh`'s Darwin arm. `UseKeychain yes` *is* the macOS
66
+ 5. `github-ssh-setup.sh`'s Darwin arm. `UseKeychain yes` _is_ the macOS
67
67
  behaviour; the other arm is an empty string.
68
68
  6. The `stat -c ... || stat -f ...` chains. GNU-first ordering is required
69
69
  because `stat -f` is a valid GNU flag (`--file-system`) that succeeds.
@@ -25,8 +25,8 @@ and answers exactly those questions.
25
25
 
26
26
  `swiftlens/swiftlens` demonstrated the idea as an MCP server. It could not be
27
27
  used: its licence is the "SwiftLens Non-Commercial Use License 1.0", which
28
- prohibits *"Use by a company or organization for internal development or
29
- production"*, and the repository has been archived since 2025-07-17. The
28
+ prohibits _"Use by a company or organization for internal development or
29
+ production"_, and the repository has been archived since 2025-07-17. The
30
30
  underlying technology is unencumbered - SourceKit-LSP is Apple's, Apache-2.0.
31
31
 
32
32
  ## Decision
@@ -1,6 +1,6 @@
1
1
  # 14. Six phases, because two of the eight were doing the same work twice
2
2
 
3
- **Status:** Accepted · 2026-09-18 · amends [ADR-0005](./0005-lazy-phase-docs.md)
3
+ **Status:** Accepted · 2026-09-18 · amends [ADR-0005](./0005-lazy-phase-docs.md) · amended by [ADR-0015](./0015-one-pipeline-no-depth-answer.md)
4
4
 
5
5
  Three further ADRs carry the old numbers in their bodies and now carry a pointer
6
6
  back here instead of being rewritten: [ADR-0002](./0002-instruction-driven-flag.md)
@@ -39,14 +39,14 @@ left the whole tree stale and the suite would have stayed green.
39
39
 
40
40
  Six phases. The mapping:
41
41
 
42
- | Was | Is | Name | What changed |
43
- |---|---|---|---|
44
- | 0 Init | **0** | Init | Nothing |
45
- | 1 Analysis + 2 Planning | **1** | Plan | One doc, one exit gate |
46
- | 3 Dev + 4 Review Stage 1 | **2** | Dev | Verify became Dev's exit gate; the build runs once |
47
- | 4 Review (Stage 2-3) + 5 Test | **3** | Review | The user test moved inside Review |
48
- | 6 Commit | **4** | Commit | Nothing |
49
- | 7 Report | **5** | Report | Nothing |
42
+ | Was | Is | Name | What changed |
43
+ | ----------------------------- | ----- | ------ | -------------------------------------------------- |
44
+ | 0 Init | **0** | Init | Nothing |
45
+ | 1 Analysis + 2 Planning | **1** | Plan | One doc, one exit gate |
46
+ | 3 Dev + 4 Review Stage 1 | **2** | Dev | Verify became Dev's exit gate; the build runs once |
47
+ | 4 Review (Stage 2-3) + 5 Test | **3** | Review | The user test moved inside Review |
48
+ | 6 Commit | **4** | Commit | Nothing |
49
+ | 7 Report | **5** | Report | Nothing |
50
50
 
51
51
  Analysis folds into Plan rather than into Init because of the token budget,
52
52
  not preference. Init is 733 lines with a 13,400-token ceiling, already the
@@ -0,0 +1,83 @@
1
+ # 15. One pipeline: the depth question is removed
2
+
3
+ **Status:** Accepted · 2026-09-21 · amends [ADR-0014](./0014-six-phase-consolidation.md) · extended by [ADR-0016](./0016-the-run-shape-is-asked-not-typed.md)
4
+
5
+ ## Context
6
+
7
+ Two selectors decided how much work a run did, and neither read evidence.
8
+
9
+ `analysisPhase.mode` chose between a full analysis document and a Lite one
10
+ whose section list was fixed: seven sections regardless of what the feature
11
+ carried. v19.0.0 removed it, because Locked 2 already decides section presence
12
+ from evidence and a fixed list can only disagree with it - dropping a section a
13
+ feature needed, keeping one it did not.
14
+
15
+ `state.onlyDevelop` did the same thing one level up. A Phase 0 Step 7.5 picker
16
+ asked Full or Short before the run had read anything, and Short skipped the plan
17
+ phase outright. The question arrived after `taskType` and before any analysis,
18
+ so the answer was a guess about work not yet examined, and it recommended itself
19
+ from `taskType` alone: `bugfix` and `chore` were told to answer Short.
20
+
21
+ The cost of keeping it was not only the branch. Phase 2 carried a second
22
+ contract for Short runs - a different model, a different task source, five of
23
+ its nine steps recorded `not-applicable` - and the tracker deferred half its
24
+ tile registration to Step 7.5 because the phase set was unknown until the
25
+ question was answered. One pipeline had two shapes, and only one of them was
26
+ exercised by the documents that describe it.
27
+
28
+ ## Decision
29
+
30
+ There is one pipeline. Every mode runs its whole phase set, and the set is a
31
+ property of the command, known before the tracker boots.
32
+
33
+ - The Step 7.5 depth question is gone, and with it `state.onlyDevelop`.
34
+ - Phase 1 always runs. What it produces scales with the evidence the task
35
+ carries: the Locked 2 omission rule already drops a section with nothing
36
+ behind it, so a one-line chore yields a short document rather than a skipped
37
+ phase.
38
+ - The Plan Approval Gate has exactly one skip left, `autopilot`, and it is a
39
+ skip because there is nobody to ask - not because the run is a lighter kind
40
+ of run.
41
+ - Tracker registration is a single batch at Step -1. Nothing is deferred,
42
+ because no answer later in the run can add or remove a phase.
43
+ - Phase 2 reads the analysis document in steps 1, 2, 3, 5 and 6. A step whose
44
+ section is absent records `not-applicable (no <section> in this document)`
45
+ instead of aborting, which is the same rule the document's own omission rule
46
+ produces.
47
+
48
+ Two gates hold the line, and both assert the ABSENCE: `smoke-pipeline-surface.sh`
49
+ fails if `phase-0-init` grows a depth step or writes a depth key, or if any of
50
+ the four downstream readers reads one; `smoke-plan-approval-gate.sh` fails if
51
+ the gate's scope clause widens past autopilot.
52
+
53
+ ## Consequences
54
+
55
+ - **Breaking.** `state.onlyDevelop` is removed from the state schema, which has
56
+ `additionalProperties: false`, so a state file written before v20 no longer
57
+ validates. The floor is raised with `dist-tags.required` rather than a
58
+ migration: a run below the floor halts instead of reading a record written
59
+ under a contract that no longer exists.
60
+ - Every run now produces an analysis document. For a one-line change that
61
+ document is short, and it is the thing Phase 2 steps 1, 2, 3, 5 and 6 read;
62
+ before, those steps had no input at all on a Short run and recorded
63
+ `not-applicable` for a reason that was a mode rather than a measurement.
64
+ - The fastest path is no longer "answer Short". It is answering the Phase 0
65
+ workspace question with `local`, which changes where the work happens rather
66
+ than how much of the pipeline runs.
67
+ - `gen-mode-dispatch.mjs` loses its deferred-registration branch, and every
68
+ generated tracker section shrinks to one registration loop.
69
+
70
+ ## Alternatives
71
+
72
+ **Keep Short but derive it from evidence.** A run would have to read the
73
+ codebase before deciding whether to read the codebase. The measurement that
74
+ would justify skipping Phase 1 is the one Phase 1 makes.
75
+
76
+ **Keep the question and make Phase 1 cheap on a Short run.** That is Phase 1
77
+ running, with a second name. If the phase is cheap when there is little to say,
78
+ the question buys nothing; if it is not, the question is a way to avoid work the
79
+ review phase then has no record of.
80
+
81
+ **Keep the key, stop writing it.** A reader left behind keeps a dead branch
82
+ alive and invites the question back to feed it. The gates assert the key's
83
+ absence for that reason, not merely the picker's.