@mmerterden/multi-agent-pipeline 15.16.0 → 16.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.
- package/CHANGELOG.md +124 -0
- package/README.md +2 -2
- package/README.tr.md +1 -2
- package/docs/architecture.md +2 -2
- package/docs/ecosystem.md +9 -6
- package/docs/features.md +2 -3
- package/install/_plugin-skills.mjs +28 -2
- package/install/templates/copilot-instructions.md +8 -7
- package/package.json +1 -1
- package/pipeline/commands/multi-agent/SKILL.md +5 -6
- package/pipeline/commands/multi-agent/analysis/SKILL.md +77 -588
- package/pipeline/commands/multi-agent/analysis-resolve/SKILL.md +5 -69
- package/pipeline/commands/multi-agent/channels/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/complaint-analysis/SKILL.md +5 -4
- package/pipeline/commands/multi-agent/dev/SKILL.md +8 -280
- package/pipeline/commands/multi-agent/dev-autopilot/SKILL.md +12 -124
- package/pipeline/commands/multi-agent/dev-local/SKILL.md +8 -111
- package/pipeline/commands/multi-agent/dev-local-autopilot/SKILL.md +11 -113
- package/pipeline/commands/multi-agent/help/SKILL.md +61 -56
- package/pipeline/commands/multi-agent/ios-coding-standard/SKILL.md +4 -2
- package/pipeline/commands/multi-agent/local-autopilot/SKILL.md +2 -4
- package/pipeline/commands/multi-agent/refactor/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/resume-local/SKILL.md +3 -3
- package/pipeline/commands/multi-agent/setup/SKILL.md +2 -2
- package/pipeline/commands/multi-agent/stack/SKILL.md +10 -9
- package/pipeline/commands/multi-agent/store-ready/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/sync/SKILL.md +2 -2
- package/pipeline/commands/multi-agent/update/SKILL.md +1 -1
- package/pipeline/lib/context-link-extractor.sh +38 -0
- package/pipeline/lib/fetch-document.sh +190 -0
- package/pipeline/multi-agent-refs/_dev-context.md +4 -0
- package/pipeline/multi-agent-refs/analysis/evidence.md +213 -0
- package/pipeline/multi-agent-refs/analysis/intake.md +167 -0
- package/pipeline/multi-agent-refs/analysis/locked.md +53 -0
- package/pipeline/multi-agent-refs/analysis/render.md +133 -0
- package/pipeline/multi-agent-refs/analysis/resolve.md +76 -0
- package/pipeline/multi-agent-refs/analysis/synthesis.md +98 -0
- package/pipeline/multi-agent-refs/analysis-template.md +58 -11
- package/pipeline/multi-agent-refs/complaint-analysis-template.md +1 -1
- package/pipeline/multi-agent-refs/component-dispatch.md +5 -5
- package/pipeline/multi-agent-refs/cross-cli-contract.md +9 -7
- package/pipeline/multi-agent-refs/features/skill-conformance.md +1 -1
- package/pipeline/multi-agent-refs/features/url-enrichment.md +13 -3
- package/pipeline/multi-agent-refs/knowledge.md +2 -2
- package/pipeline/multi-agent-refs/payload-contracts.md +1 -1
- package/pipeline/multi-agent-refs/phases/modes.md +73 -53
- package/pipeline/multi-agent-refs/phases/phase-0-init.md +21 -2
- package/pipeline/multi-agent-refs/phases/phase-1-analysis.md +26 -0
- package/pipeline/multi-agent-refs/phases/phase-2-planning.md +26 -12
- package/pipeline/multi-agent-refs/phases/phase-3-dev.md +17 -18
- package/pipeline/multi-agent-refs/phases/phase-4-review.md +29 -7
- package/pipeline/multi-agent-refs/phases/phase-5-test.md +1 -1
- package/pipeline/multi-agent-refs/phases/phase-6-commit.md +8 -0
- package/pipeline/multi-agent-refs/phases/phase-7-report.md +1 -1
- package/pipeline/multi-agent-refs/phases.md +9 -7
- package/pipeline/multi-agent-refs/progress-contract.md +1 -1
- package/pipeline/multi-agent-refs/readiness-review.md +2 -0
- package/pipeline/multi-agent-refs/rules.md +2 -2
- package/pipeline/multi-agent-refs/tracker-contract.md +32 -13
- package/pipeline/multi-agent-refs/wiki-capture.md +2 -2
- package/pipeline/schemas/agent-state.schema.json +3 -3
- package/pipeline/schemas/analysis-output.schema.json +17 -0
- package/pipeline/schemas/analysis-spec.schema.json +69 -1
- package/pipeline/schemas/complaint-analysis-spec.schema.json +1 -1
- package/pipeline/schemas/prefs.schema.json +47 -0
- package/pipeline/schemas/token-budget.json +2 -2
- package/pipeline/scripts/_stack-routing.mjs +17 -12
- package/pipeline/scripts/build-stack-plugins.mjs +16 -6
- package/pipeline/scripts/cost-table.json +1 -1
- package/pipeline/scripts/gen-mode-dispatch.mjs +20 -30
- package/pipeline/scripts/run-aggregator.mjs +1 -1
- package/pipeline/scripts/validate-analysis-doc.mjs +36 -3
- package/pipeline/skills/.skills-index.json +40 -7
- package/pipeline/skills/shared/README.md +12 -9
- package/pipeline/skills/shared/core/multi-agent/SKILL.md +9 -5
- package/pipeline/skills/shared/core/multi-agent-dev/SKILL.md +7 -61
- package/pipeline/skills/shared/core/multi-agent-dev-autopilot/SKILL.md +11 -51
- package/pipeline/skills/shared/core/multi-agent-dev-local/SKILL.md +7 -33
- package/pipeline/skills/shared/core/multi-agent-dev-local-autopilot/SKILL.md +10 -38
- package/pipeline/skills/shared/core/multi-agent-help/SKILL.md +28 -18
- package/pipeline/skills/shared/core/multi-agent-ios-coding-standard/SKILL.md +4 -2
- package/pipeline/skills/shared/core/multi-agent-local-autopilot/SKILL.md +2 -4
- package/pipeline/skills/shared/core/multi-agent-refactor/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-resume-local/SKILL.md +2 -2
- package/pipeline/skills/shared/core/multi-agent-stack/SKILL.md +10 -9
- package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +2 -2
- package/pipeline/skills/shared/external/evidence-github/SKILL.md +45 -0
- package/pipeline/skills/shared/external/evidence-registry/SKILL.md +33 -0
- package/pipeline/skills/shared/external/signal-community/SKILL.md +44 -0
- package/pipeline/skills/skills-index.md +10 -7
|
@@ -62,7 +62,24 @@ template_version: v3
|
|
|
62
62
|
|
|
63
63
|
`ui_tests` and `a11y_depth` record the Phase 0 Step 5a opt-ins (defaults `false` / `basic`) so the coverage choice is auditable and the pre-dispatch validator can enforce it: `ui_tests: true` requires Section 15.6, `a11y_depth: full` requires the Section 16.2 walkthrough.
|
|
64
64
|
|
|
65
|
-
The dev pipeline (`/multi-agent
|
|
65
|
+
The dev pipeline (`/multi-agent`, either depth) reads `platform` to verify file match, `evidence_digest` to detect stale specs, and `mode` to know which section set to expect.
|
|
66
|
+
|
|
67
|
+
## Layer headings (A / B / C)
|
|
68
|
+
|
|
69
|
+
The 23 sections render under three named layers. This is an **additive heading level**, not a renumbering: section numbers are referenced in 172 places across the repo including two deterministic validators, so they do not move. Layer headings are `#` (h1); sections stay `##`. `validate-analysis-doc.mjs` collects `^#{1,3}` and `md2confluence-v3.py` maps `#{1,6}` to `<h{level}>`, so the extra level is safe in both and gives the Confluence page a two-level table of contents.
|
|
70
|
+
|
|
71
|
+
| Layer | Sections | What is lost if it is missing |
|
|
72
|
+
|---|---|---|
|
|
73
|
+
| `# Bölüm A - Analiz` / `# Part A - Analysis` | 1, 2, 3, 4, 18, 19, 20 | **what** to build: user, rule, flow, error scenario |
|
|
74
|
+
| `# Bölüm B - Teknik Analiz` / `# Part B - Technical Analysis` | 5, 6, 7, 8, 9, 10, 11, 12, 16, 17 | **what is true**: endpoint, status code, token, variant axis, key |
|
|
75
|
+
| `# Bölüm C - Geliştirme Analizi` / `# Part C - Development Analysis` | 13, 14, 15 | **how** to build it: class name, file path, reuse, test row |
|
|
76
|
+
| (footer, no heading) | 21, 22, 23 | |
|
|
77
|
+
|
|
78
|
+
**Boundary rule.** Which layer a row belongs to is settled by one question: remove it, what becomes unclear? A row that is unclear in two layers at once is two rows. `A carries no technology name; C carries no business rationale.`
|
|
79
|
+
|
|
80
|
+
A layer whose sections all drop for lack of evidence drops its heading too (Locked 2). Numbering still flows 1..N over the rendered set.
|
|
81
|
+
|
|
82
|
+
**Error scenarios appear in all three, at different altitudes**: what the user sees (4.2), every status code with its body and UI outcome (9.3, exhaustive per Locked 17), and the error-path tests (15.1 error/empty-nil rows, 15.7 negative scenarios). One `BR-<slug>-NN` id ties the three together, so an error described in A cannot reach C untested.
|
|
66
83
|
|
|
67
84
|
## Omission rules
|
|
68
85
|
|
|
@@ -239,12 +256,24 @@ Then <expected outcome>
|
|
|
239
256
|
|
|
240
257
|
### 4.4 İş Kuralları / Business Rules
|
|
241
258
|
|
|
242
|
-
Locked 31 - the traceability spine. Every business rule is deterministic and testable (same input always yields the same outcome) and carries a stable id `BR-<slug>-NN`.
|
|
259
|
+
Locked 31 - the traceability spine. Every business rule is deterministic and testable (same input always yields the same outcome) and carries a stable id `BR-<slug>-NN`.
|
|
260
|
+
|
|
261
|
+
**The rule statement itself is written in EARS**, not free prose. EARS (Easy Approach to Requirements Syntax, IEEE RE'09) constrains the sentence to a fixed clause order and a small keyword set, which is what removes the ambiguity a prose rule carries. Five patterns, use the one that fits:
|
|
262
|
+
|
|
263
|
+
| Pattern | Shape | Use when |
|
|
264
|
+
|---|---|---|
|
|
265
|
+
| Ubiquitous | `THE SYSTEM SHALL <behaviour>` | always active, no trigger |
|
|
266
|
+
| Event-driven | `WHEN <trigger> THE SYSTEM SHALL <behaviour>` | fires on a discrete event |
|
|
267
|
+
| State-driven | `WHILE <state> THE SYSTEM SHALL <behaviour>` | holds for as long as a state holds |
|
|
268
|
+
| Unwanted | `IF <unwanted condition> THEN THE SYSTEM SHALL <behaviour>` | error and edge handling |
|
|
269
|
+
| Optional | `WHERE <feature is included> THE SYSTEM SHALL <behaviour>` | applies only to some configurations |
|
|
270
|
+
|
|
271
|
+
EARS states the rule; Gherkin states how you check it. Each rule still maps to at least one acceptance criterion written Given / When / Then. In Full mode each acceptance criterion is then realized as unit-test scenarios in Section 15.1; in Lite mode Section 15 is not rendered, so the acceptance criterion stands alone here (it is itself the testable statement) and the 15.1 mapping is deferred to a later Full analysis or to the dev run itself. Rules come from the spec / Confluence / Jira / annotations, never invented; a rule with no source cites `[label TBD - see Open Questions]` and adds a Section 20 row.
|
|
243
272
|
|
|
244
273
|
| BR ID | Kural / Rule (deterministic, testable) | Kaynak / Source | Kabul kriteri / Acceptance criterion (Given/When/Then) |
|
|
245
274
|
|---|---|---|---|
|
|
246
|
-
| BR-<slug>-01 | <
|
|
247
|
-
| BR-<slug>-02 | <
|
|
275
|
+
| BR-<slug>-01 | WHEN <trigger> THE SYSTEM SHALL <behaviour> | [Confluence:<pageId>:<heading>] / [Figma annotation <nodeId>] / file:line | Given <state>, When <action>, Then <binary outcome> |
|
|
276
|
+
| BR-<slug>-02 | IF <unwanted condition> THEN THE SYSTEM SHALL <behaviour> | <source> | Given ..., When ..., Then ... (+ >=1 failure-mode criterion) |
|
|
248
277
|
```
|
|
249
278
|
|
|
250
279
|
Each scenario in 4.1-4.3 cites the matching `BR-<slug>-NN` id (and, when a server code applies, the Section 9.4 code). Plain-prose user stories without Given/When/Then are rejected by the renderer.
|
|
@@ -326,13 +355,17 @@ Locked 11 - existence is resolved against `evidence.codeConnect[]` (the Code Con
|
|
|
326
355
|
|
|
327
356
|
### 6.X Varyant / prop kapsamı - Variant / property coverage
|
|
328
357
|
|
|
329
|
-
Completeness audit
|
|
358
|
+
Completeness audit over the **whole component surface**, not just the part this screen happens to touch. Phase 1b.2 resolves each Code Connect-bound instance to its main component (component set) and reads the full variant axis, so the "all values" column is the component's real axis rather than what the instance revealed. Every value gets exactly one disposition; an unmapped remainder is a Section 20 Risk.
|
|
330
359
|
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
|
334
|
-
|
|
335
|
-
| <Name> | <
|
|
360
|
+
Without the traversal this table could only ever list properties the instance already used, which made "used subset" unverifiable against anything (Locked 29). Phase 2+ cannot re-fetch (Locked 30), so a value missed here is missed for the whole run.
|
|
361
|
+
|
|
362
|
+
| Bileşen / Component | Eksen / Axis | Tüm değerler / All values | Bu ekranda / Used here | Karar / Disposition | Not / Note |
|
|
363
|
+
|---|---|---|---|---|---|
|
|
364
|
+
| <Name> | <variant property> | <v1, v2, v3, v4> | <v1, v3> | implement | <mapped concept / param> |
|
|
365
|
+
| <Name> | <variant property> | <a, b> | <a> | skip | <why b is not used on this screen> |
|
|
366
|
+
| <Name> | <boolean prop> | true, false | true | defer | <open question ref> |
|
|
367
|
+
|
|
368
|
+
Each used value needs a matching row in Section 13.6 (Preview) and Section 15.2 (Snapshot); expanding the used subset later means updating this table first.
|
|
336
369
|
|
|
337
370
|
## 7. Tasarım Token'ları / Design Tokens
|
|
338
371
|
|
|
@@ -745,7 +778,7 @@ Section 4 Gherkin scenarios + their `BR-` ids mapped to test names.
|
|
|
745
778
|
|
|
746
779
|
### 15.6 UI test senaryoları / UI test scenarios (OPTIONAL)
|
|
747
780
|
|
|
748
|
-
Rendered
|
|
781
|
+
Rendered when `state.analysisSpec.options.uiTests == true`. That option now **defaults to true** for `taskType == component` or any task carrying a Figma reference - UI work without UI test scenarios is the gap this section exists to close - and stays opt-in for everything else. UI tests are the most expensive tier - reserve for high-risk / revenue-connected cross-screen flows, not per-element coverage. Selectors are stable ids (iOS `accessibilityIdentifier`, Android `Modifier.testTag` / `contentDescription`), never localized text, so the flow survives copy/locale changes and an agent can generate it mechanically.
|
|
749
782
|
|
|
750
783
|
| Flow ID | Öncelik / Priority (why it earns a UI test) | Adımlar / Steps | Seçiciler / Selectors | Doğrulamalar / Assertions | Ön koşullar / Preconditions | BR ID |
|
|
751
784
|
|---|---|---|---|---|---|---|
|
|
@@ -754,6 +787,20 @@ Rendered ONLY when `state.analysisSpec.options.uiTests == true` (Phase 0 Step 5a
|
|
|
754
787
|
Framework: iOS XCUITest (`waitForExistence`, identifier-driven); Android Compose UI test (`createComposeRule`, `onNodeWithTag`) or Espresso for View-based screens.
|
|
755
788
|
```
|
|
756
789
|
|
|
790
|
+
### 15.7 Manuel test senaryoları / Manual test scenarios
|
|
791
|
+
|
|
792
|
+
The scenarios a person runs by hand. Same format the pipeline already posts as the Jira test-scenario comment (`/multi-agent:resume-local`), defined once and read by both. Omitted entirely when the feature has none (Locked 2); never rendered as an empty table.
|
|
793
|
+
|
|
794
|
+
Each row is executable by someone who did not write the feature: no "verify it works", no implied setup. Cover the happy path, at least one boundary, and every failure mode that reaches the user - the same four-way split Locked 31 requires of unit tests.
|
|
795
|
+
|
|
796
|
+
| Senaryo / Scenario | Ön koşul / Precondition | Adımlar / Steps | Beklenen / Expected | BR ID |
|
|
797
|
+
|---|---|---|---|---|
|
|
798
|
+
| MT-<slug>-01 | <account state, seeded data, network condition> | 1. ... 2. ... 3. ... | <observable outcome, incl. exact copy where it matters> | BR-<slug>-NN |
|
|
799
|
+
| MT-<slug>-02 (hata / error) | <condition that triggers the failure> | 1. ... 2. ... | <error surface, message, recovery path> | BR-<slug>-NN |
|
|
800
|
+
```
|
|
801
|
+
|
|
802
|
+
Full mode: a manual scenario with no `BR-` id, or a business rule whose failure modes reach the user with no matching MT row, fails the dispatch gate.
|
|
803
|
+
|
|
757
804
|
## 16. Erişilebilirlik / Accessibility
|
|
758
805
|
|
|
759
806
|
Per-platform projection. WCAG 2.2 AA + Apple HIG + Material A11y.
|
|
@@ -65,7 +65,7 @@ One `### C-NN` subsection per complaint:
|
|
|
65
65
|
- **Elenen katmanlar / Ruled out**: one line listing the repos/layers that were grepped for this complaint's signals and returned nothing (e.g. `mobile-bff, web-bff: sinyal yok`). This is what justifies a single-layer verdict.
|
|
66
66
|
- **Verdict + gerekçe / rationale**: the verdict token, confidence, and 1-3 sentences citing the evidence above (SKILL Locked 10: client/bff needs 1 Graylog + 1 repo citation; core needs the Graylog line naming the upstream).
|
|
67
67
|
- **Geliştirme planı / Fix plan** (client/bff only, SKILL Locked 13; validator-required for every client/bff verdict): 2-5 numbered steps grounded in the existing architecture - each step references a cited `file:line` or component, reuse-first, tests included. Never rendered for core / insufficient-evidence.
|
|
68
|
-
- **Dev prompt** (client/bff only): one fenced English block ready to paste into `/multi-agent
|
|
68
|
+
- **Dev prompt** (client/bff only): one fenced English block ready to paste into `/multi-agent` or a Jira description - complaint summary, root cause, cited files, fix plan steps, acceptance check, and the `[C-NN]` id.
|
|
69
69
|
|
|
70
70
|
## 4. Core Yönlendirme Önerileri / Core Routing Recommendations
|
|
71
71
|
|
|
@@ -68,7 +68,7 @@ Emit `→ dispatching create-component <componentName>` via the progress contrac
|
|
|
68
68
|
|
|
69
69
|
- `figmaUrl` - primary argument (the plugin skill's `<figma-url>`)
|
|
70
70
|
- the component name + the analysis Section 6 (Bileşen Envanteri) row + Section 13.1 conventions as context (the plugin skill does not re-read the pipeline's analysis doc on its own - pass what it needs)
|
|
71
|
-
- `mode` - `"dev"` vs `"full"`
|
|
71
|
+
- `mode` - `"dev"` vs `"full"`, from `state.onlyDevelop`, so the plugin can elide tests/wiki on a Short run
|
|
72
72
|
|
|
73
73
|
Plugin skills are user-facing lifecycle skills; they do **not** accept an `agentState` path and do **not** write `agent-state.json`. State tracking therefore moves to the dispatch layer (next section).
|
|
74
74
|
|
|
@@ -109,11 +109,11 @@ On failure (the plugin skill returns an unrecoverable build/test error, or the d
|
|
|
109
109
|
3. Retry re-invokes the plugin skill (it is idempotent on an existing component; it reconciles rather than duplicating). There is no bundled `phase-<N>` resume anymore.
|
|
110
110
|
4. Hard kill at `retryCount === 3` → surface the errors to the user, halt Phase 3. Do not loop indefinitely.
|
|
111
111
|
|
|
112
|
-
##
|
|
112
|
+
## Short-run behaviour
|
|
113
113
|
|
|
114
|
-
When
|
|
114
|
+
When the Phase 0 Step 7.5 depth picker answered Short (`state.onlyDevelop === true`), the dispatch layer passes `mode: "dev"` so the plugin skill can elide unit tests and wiki (structural + snapshot still required; wiki deferred to Phase 7). If the plugin does not honor a `mode` hint, dispatch simply skips the post-build wiki step itself.
|
|
115
115
|
|
|
116
|
-
Phase 4 runs in
|
|
116
|
+
Phase 4 runs in a Short run as it does in a Full one, and its reviewer count is **not** Phase 3's concern - the Step 1.77 scope gate decides that from diff risk, independently of `mode`. What the dispatch layer owes Phase 4 is the record of which plugin skill it delegated to, appended to `state.telemetry.skillCalls[]`, so the review can check the delivered component against the criteria that skill imposes.
|
|
117
117
|
|
|
118
118
|
## Cross-CLI behaviour (intentional divergence)
|
|
119
119
|
|
|
@@ -122,4 +122,4 @@ Component dispatch is **no longer byte-identical across CLIs** and that is by de
|
|
|
122
122
|
- **Claude Code**: dispatches to the enabled `ai-<platform>-toolkit` marketplace plugin via the Skill tool (this doc).
|
|
123
123
|
- **Copilot CLI**: has no plugin loader; it continues to use its standalone `~/.copilot/skills/figma-*` skill copies (frozen fallback). Copilot's resolution + progress lines follow those local skills.
|
|
124
124
|
|
|
125
|
-
What still MUST match across CLIs: the `taskType === "component"` classification, the `state.phases["3"].subphases[]` shape the dispatch layer writes, and
|
|
125
|
+
What still MUST match across CLIs: the `taskType === "component"` classification, the `state.phases["3"].subphases[]` shape the dispatch layer writes, and the Short-run elision semantics. Figma-skill *inventory* parity is no longer enforced. `smoke-cross-cli-behavior.sh` asserts only the classification + state-shape axis for components.
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
-
## 1. Command Inventory (51 commands)
|
|
9
|
+
## 1. Command Inventory (51 files, 47 live commands)
|
|
10
10
|
|
|
11
11
|
```
|
|
12
12
|
analysis, analysis-resolve, autopilot, build-optimize, channels, complaint-analysis, create-jira, design-check, dev,
|
|
@@ -21,14 +21,16 @@ Categories:
|
|
|
21
21
|
|
|
22
22
|
- **Interactive pickers** (single-purpose, not modes): `jira`, `issue`
|
|
23
23
|
- **Issue generator** (one-shot, no worktree, asks type Task/Bug/Story, hard approval gate before create): `create-jira`
|
|
24
|
-
- **
|
|
25
|
-
- **
|
|
24
|
+
- **Pipeline entries**: `autopilot`, `local`, `local-autopilot` (plus the bare `/multi-agent` in the dispatcher). Depth is not a command: `/multi-agent` and `local` ask Full or Short at Phase 0 Step 7.5; the two autopilot entries never ask and always run Full.
|
|
25
|
+
- **Retired stubs** (v16.0.0, deleted next minor - they print a redirect and run no phase): `dev`, `dev-local` redirect to the picker entries with Short; `dev-autopilot`, `dev-local-autopilot` have no equivalent, because fast-plus-unattended no longer exists
|
|
26
26
|
- **Tail modes** (run the pipeline tail over already-done local work): `resume-local`
|
|
27
27
|
- **Ops commands** (one-shot, no worktree): `status`, `log`, `kill`, `purge`, `uninstall`, `resume`, `review`, `review-jira`, `review-issue`, `analysis`, `analysis-resolve`, `complaint-analysis`, `build-optimize`, `channels`, `scan`, `search`, `diff-explain`, `garbage-collect`, `prune-logs`, `prune-prompts`
|
|
28
28
|
- **Local audits** (worktree only to build; no commit, push, PR or channels): `design-check`, `testflight-validation`, `ios-coding-standard`. `testflight-validation` additionally never invokes `altool --upload-app` - a validation run must not be able to ship a build by accident.
|
|
29
29
|
- **Meta-ops**: `setup`, `sync`, `update`, `help`, `refactor`, `test`, `stack`, `manual-test`, `language`
|
|
30
30
|
- **Routines** (user-defined routine registry; the routines they create are local-only and never synced): `save`, `routines`, `forget`
|
|
31
31
|
|
|
32
|
+
The count is 51 files and 47 live commands until the four stubs are deleted, at which point both numbers become 47. A stub is still installed and still invocable, so counting it as absent would be wrong; counting it as a command would be worse.
|
|
33
|
+
|
|
32
34
|
> **Inventory drift is a contract violation.** Adding a slash command under `pipeline/commands/multi-agent/` without updating this list + its counterpart Copilot dir (`pipeline/skills/shared/core/multi-agent-<cmd>/`) is a merge blocker. `smoke-commands-skills-parity.sh` enforces command ↔ skill directory parity; `smoke-cross-cli-behavior.sh` enforces behavior parity. This doc is the authoritative command list - bump the count + table together.
|
|
33
35
|
|
|
34
36
|
### 1.1 Figma / component work (plugin-based on Claude Code; NOT parity-enforced)
|
|
@@ -68,7 +70,7 @@ Three rules make that work:
|
|
|
68
70
|
> absent, and a component task on Copilot had nothing to dispatch to. The contract
|
|
69
71
|
> documented a safety net the installer deleted.
|
|
70
72
|
|
|
71
|
-
What still MUST match across CLIs for component tasks: the `taskType === "component"` classification, the `state.phases["3"].subphases[]` shape the dispatch layer writes, and
|
|
73
|
+
What still MUST match across CLIs for component tasks: the `taskType === "component"` classification, the `state.phases["3"].subphases[]` shape the dispatch layer writes, and the Short-run elision semantics. Resolution/routing is Claude-plugin vs Copilot-local-copy by design.
|
|
72
74
|
|
|
73
75
|
### 1.2 Store-compliance skills
|
|
74
76
|
|
|
@@ -273,9 +275,9 @@ Given the same user input, both CLIs must produce identical parsed state:
|
|
|
273
275
|
|
|
274
276
|
Modifier flags are orthogonal and compose:
|
|
275
277
|
- `autopilot` - skip confirmations
|
|
276
|
-
-
|
|
278
|
+
- Short depth - init → dev → review → test → commit → report (Phase 0 Step 7.5 picker, not a flag)
|
|
277
279
|
- `--local` - no worktree
|
|
278
|
-
- Combinations: `--
|
|
280
|
+
- Combinations: `--local autopilot`. Short plus autopilot is NOT a combination: autopilot never asks the depth question and always runs Full.
|
|
279
281
|
|
|
280
282
|
---
|
|
281
283
|
|
|
@@ -293,7 +295,7 @@ Modifier flags are orthogonal and compose:
|
|
|
293
295
|
|
|
294
296
|
## 7. Platform Guards (macOS / Linux / WSL)
|
|
295
297
|
|
|
296
|
-
|
|
298
|
+
All three CLIs run on macOS, Linux and Windows, so any command may execute on any of them. (This line used to say Claude Code was macOS-only; it has not been true for some time, and the assumption it invited - that a Windows user necessarily arrives through Copilot or Codex - produces wrong conclusions about which paths need to be portable.) Shell code in `pipeline/skills/shared/core/` command files and in `pipeline/lib` / `pipeline/scripts` must be portable.
|
|
297
299
|
|
|
298
300
|
For Keychain I/O the canonical path is **`~/.claude/lib/credential-store.sh`** (or `~/.copilot/lib/credential-store.sh` / `~/.codex/lib/credential-store.sh` on those installs). The shell driver detects platform internally and auto-delegates to `keychain.py` (Python helper, macOS / Linux) or PowerShell `CredentialManager` (Windows). Call sites stay platform-agnostic - no per-OS branching needed.
|
|
299
301
|
|
|
@@ -9,7 +9,7 @@ Phase 4 used to select its review criteria from `detectedStack`, a string Phase
|
|
|
9
9
|
- The dev side and the review side could disagree about the standard without either noticing. A component built by a plugin skill was reviewed against `clean-code`.
|
|
10
10
|
- "Did it do this correctly?" had no fixed denominator, so the only available answer was "it looks fine", and a reviewer that opened nothing produced the same output as a reviewer that checked everything.
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
A Short run makes this sharper: it has no Phase 1 at all, so the sole input to the old selection logic was absent.
|
|
13
13
|
|
|
14
14
|
## The four rules that make it work
|
|
15
15
|
|
|
@@ -32,6 +32,7 @@ Output schema (one array entry per URL - full contract in `~/.claude/lib/conte
|
|
|
32
32
|
{ "type": "confluence", "url": "<url>", "metadata": { "host": "<host>", "pageId": "<id|null>", "spaceKey": "<key|null>" } },
|
|
33
33
|
{ "type": "crashlytics", "url": "<url>", "metadata": { "projectId": "...", "platform": "ios|android", "bundle": "...", "issueId": "...", "sessionId": "<id|null>" } },
|
|
34
34
|
{ "type": "fortify", "url": "<url|null>", "metadata": { "host": "<host|null>", "versionId": "<id|null>", "instanceId": "<id|null>", "source": "url|label" } },
|
|
35
|
+
{ "type": "document", "url": "<url|null>", "metadata": { "path": "...", "format": "docx|pdf|md|txt", "source": "path|url" } },
|
|
35
36
|
{ "type": "graylog", "url": null, "metadata": { "idType": "trx|conversation", "id": "...", "label": "..." } },
|
|
36
37
|
{ "type": "figma", "url": "<url>", "metadata": { "kind": "design|make|board|slides", "fileKey": "...", "nodeId": "<id|null>" } },
|
|
37
38
|
{ "type": "generic-doc", "url": "<url>", "metadata": { "host": "<host>", "kind": "notion|google-docs|gist|github-doc" } }
|
|
@@ -82,6 +83,15 @@ The extractor emits `graylog` entries from free-text trx / conversation ids (lab
|
|
|
82
83
|
- Phase 1 Analysis prepends `state.graylogContext` to the agent prompt under the **Referenced External Sources** section as **diagnostic context, advisory only** (never contradicts code; no task is generated from it, no Phase 4 gate).
|
|
83
84
|
- Soft-fail (non-blocking, mirrors Crashlytics): unreachable host / VPN down / network timeout → the fetcher emits a normalized empty object and exits `0`; mark `state.graylogContext = { skipped: "vpn-unreachable" }` and continue. Only a genuine auth rejection (4xx on a reachable host, fetcher exit `3`) is logged as `skipped` with the auth reason. A log fetch never blocks the run.
|
|
84
85
|
|
|
86
|
+
##### Step 1b.3b - Document fetch (runs when `type == "document"` present)
|
|
87
|
+
|
|
88
|
+
A feature spec arrives as a Word file at least as often as a Confluence page, and until v15.20.0 nothing in the pipeline could read one. `~/.claude/lib/fetch-document.sh <path-or-url>` extracts the text and returns the fetcher-standard JSON.
|
|
89
|
+
|
|
90
|
+
- `.docx` needs no external tool: the file is a zip and `word/document.xml` is parsed with the python3 standard library, so the same code path runs on macOS, Linux and Windows.
|
|
91
|
+
- `.md` / `.txt` are read directly. A URL is downloaded first, then treated by extension.
|
|
92
|
+
- `.pdf` has no stdlib path: `pdftotext` is used when present, and its absence is exit `6` with `degraded: true`, `converter-not-available`. That is a soft skip, not an error - on Windows it is the normal case - and the document is cited in Section 21 as "referenced but not fetched".
|
|
93
|
+
- Store as `state.documentContext[]`; Phase 1 injects the text under **Referenced External Sources** and Section 21 cites it as `Doküman:<file>:<title>` (Locked 3).
|
|
94
|
+
|
|
85
95
|
##### Step 1b.4 - Other link types (catalogued only at Phase 0; fetched at Phase 1)
|
|
86
96
|
|
|
87
97
|
For `swagger`, `confluence`, `figma`, `generic-doc` entries in `state.contextLinks[]`, no Phase 0 fetch runs. The entries pass through to Phase 1, which dispatches the matching fetcher (Block B work: `fetch-swagger.sh`, `fetch-confluence.sh`, etc.). Until those fetchers land, the entries are surfaced in Phase 1 context as "referenced but not fetched - agent should treat the URL as an authoritative external source and read it directly when relevant."
|
|
@@ -91,8 +101,8 @@ For `swagger`, `confluence`, `figma`, `generic-doc` entries in `state.contextLin
|
|
|
91
101
|
**Log line shape** (progress contract):
|
|
92
102
|
|
|
93
103
|
```
|
|
94
|
-
→ context links: total=<N>, by-type={swagger:<n>, confluence:<n>, crashlytics:<n>, fortify:<n>, graylog:<n>, figma:<n>, generic-doc:<n>}
|
|
95
|
-
→ URL deep fetch: crashlytics=<hit|miss|skipped>, fortify=<hit|miss|skipped>, graylog=<hit|miss|skipped>
|
|
104
|
+
→ context links: total=<N>, by-type={swagger:<n>, confluence:<n>, crashlytics:<n>, fortify:<n>, graylog:<n>, figma:<n>, document:<n>, generic-doc:<n>}
|
|
105
|
+
→ URL deep fetch: crashlytics=<hit|miss|skipped>, fortify=<hit|miss|skipped>, graylog=<hit|miss|skipped>, document=<hit|miss|skipped|degraded>
|
|
96
106
|
```
|
|
97
107
|
|
|
98
|
-
Two lines emit at the end of Step 1b. The first reports the catalogue from 1b.0 (always runs). The second reports the deep-fetch outcomes from 1b.1 / 1b.2 / 1b.3 - `miss` = type not present in catalogue (normal), `skipped` = present but auth/VPN/mismatch skipped the fetch (for graylog this includes the non-blocking VPN-unreachable degrade), `hit` = context stored in state.
|
|
108
|
+
Two lines emit at the end of Step 1b. The first reports the catalogue from 1b.0 (always runs). The second reports the deep-fetch outcomes from 1b.1 / 1b.2 / 1b.3 / 1b.3b - `miss` = type not present in catalogue (normal), `skipped` = present but auth/VPN/mismatch skipped the fetch (for graylog this includes the non-blocking VPN-unreachable degrade), `hit` = context stored in state. `degraded` belongs to the document fetch alone: the file was found and named but its text could not be extracted (a PDF with no `pdftotext` on the machine), so Section 21 cites it as referenced-but-not-fetched instead of dropping it.
|
|
@@ -41,9 +41,9 @@ Each task teaches the project a bit more. Token cost decreases over time.
|
|
|
41
41
|
|
|
42
42
|
They all complement each other - no conflicts.
|
|
43
43
|
|
|
44
|
-
### Knowledge in
|
|
44
|
+
### Knowledge in a Short run
|
|
45
45
|
|
|
46
|
-
|
|
46
|
+
A Short run skips Phase 1, but knowledge **is still read**:
|
|
47
47
|
|
|
48
48
|
- Knowledge files are added to the prompt before the Opus agent starts in Phase 3
|
|
49
49
|
- Knowledge capture is still performed in Phase 7 (simplified report)
|
|
@@ -64,4 +64,4 @@ Non-empty `UNTRACKED` → both the agent-log report and the closing chat summary
|
|
|
64
64
|
|
|
65
65
|
## Fast modes are not exempt
|
|
66
66
|
|
|
67
|
-
|
|
67
|
+
A Short run skips Analysis and Planning, and the autopilot and local entries skip the interactive test gate. They run Phase 6 and Phase 7 **unchanged**. A short pipeline is not a licence for an improvised payload shape, a missing Test Scenarios section, or a report without numbers.
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
> **TLDR** -
|
|
1
|
+
> **TLDR** - four entry commands, two axes, and depth is no longer one of them:
|
|
2
2
|
>
|
|
3
|
-
> - `
|
|
4
|
-
> -
|
|
5
|
-
> -
|
|
3
|
+
> - **Depth** is a picker, not a flag. Phase 0 Step 7.5 asks Full or Short and sets `state.onlyDevelop`. Short strips to Init → Dev(Opus self-contained) → Review → Test → Commit → Report. Review is never stripped.
|
|
4
|
+
> - **`autopilot`** skips confirmations (Plan, Test, Commit, PR prompts) and therefore skips the depth question too, always running Full. Still fails safe on review blockers and build retries.
|
|
5
|
+
> - **`--local`** means no worktree: work happens in `$PROJECT_ROOT` on a local branch.
|
|
6
6
|
>
|
|
7
|
-
>
|
|
7
|
+
> Fastest path is `/multi-agent:local` then Short. There is no fast-and-unattended combination any more, and that is deliberate - see "Pipeline depth".
|
|
8
8
|
|
|
9
9
|
## Autopilot Mode
|
|
10
10
|
|
|
@@ -25,7 +25,7 @@ Autopilot mode skips interactive confirmations and runs the pipeline end-to-end
|
|
|
25
25
|
| Phase | Normal (full) | autopilot (full) | local (full) | local autopilot (full) |
|
|
26
26
|
| ------------------- | ------------------------------------------------------- | ------------------------------------------- | ------------------------------------------- | ------------------------------------------- |
|
|
27
27
|
| Phase 2 (Plan Approval Gate) | Clarification (max 2 rounds) + approval loop - user: approve/abort/free-text edit | **Gate skip** - log the plan, proceed directly to Phase 3 (autopilot contract: zero interaction) | Same as Normal | Same as autopilot |
|
|
28
|
-
| Phase 5 (User Test) | Interactive prompt ("Want to test?" -> wait) | Skip (autopilot suppresses interactive prompts) -> proceed directly to Phase 6 |
|
|
28
|
+
| Phase 5 (User Test) | Interactive prompt ("Want to test?" -> wait) | Skip (autopilot suppresses interactive prompts) -> proceed directly to Phase 6 | **Not in the phase set** (the gate checks the change out of a worktree; local has none) | Not in the phase set |
|
|
29
29
|
| Phase 6 (Commit) | "Want to commit?" -> wait | Auto commit + push | "Want to commit?" -> wait | Auto commit + push |
|
|
30
30
|
| Phase 6 (PR) | "Want to open a PR?" -> wait | Auto create PR | "Want to open a PR?" -> wait | Auto create PR |
|
|
31
31
|
| **Phase 7 (Channels)** | Multi-select channel + content menu | **STILL PAUSES** - see "Phase 7 autopilot exception" below | Multi-select (same as Normal) | **STILL PAUSES** (same as autopilot) |
|
|
@@ -44,7 +44,7 @@ Autopilot mode skips interactive confirmations and runs the pipeline end-to-end
|
|
|
44
44
|
|
|
45
45
|
The generic "zero-interaction" contract covers Phases 0-6 only. Phase 7 channels dispatch is the **single exception**:
|
|
46
46
|
|
|
47
|
-
- ALL modes (`autopilot`, `--
|
|
47
|
+
- ALL modes (`autopilot`, `--local autopilot`, and a Short run reaching Phase 7) pause at the channels multi-select menu.
|
|
48
48
|
- Menu pre-ticks from `prefs.global.reportChannels` + `prefs.global.reportContent` - user can accept with one keypress if prefs are stable.
|
|
49
49
|
- **30-minute timeout** - if user does not respond, session ends cleanly:
|
|
50
50
|
- External delivery aborted (no silent apply - prevents accidental Jira comments / Confluence pages).
|
|
@@ -57,41 +57,44 @@ Full contract: `$HOME/.claude/multi-agent-refs/phases/phase-7-report.md` (Autopi
|
|
|
57
57
|
|
|
58
58
|
---
|
|
59
59
|
|
|
60
|
-
##
|
|
60
|
+
## Pipeline depth (Full / Short)
|
|
61
61
|
|
|
62
|
-
|
|
62
|
+
Short strips the pipeline to what an already-scoped task needs: no deep analysis, no planning phase. The **Opus** dev agent reads the task scope and implements, and Phase 4 then reviews what it produced. Review is deliberately NOT part of the strip: analysis and planning shape work that has not happened yet, so a task the user has already scoped can skip them, while review judges work that now exists and has no substitute.
|
|
63
63
|
|
|
64
|
-
**
|
|
64
|
+
**How it is chosen.** Phase 0 Step 7.5, after `taskType` is known:
|
|
65
65
|
|
|
66
66
|
```
|
|
67
|
-
/
|
|
68
|
-
|
|
69
|
-
/
|
|
70
|
-
/multi-agent "#316" --dev
|
|
71
|
-
/multi-agent "LoginView dark mode fix" --dev
|
|
72
|
-
/multi-agent "PROJ-12345" --dev autopilot
|
|
67
|
+
Bu is icin hangi pipeline? / Which pipeline for this task?
|
|
68
|
+
1. Tam / Full Analysis -> Plan -> Dev -> Review -> Test -> Commit -> Report
|
|
69
|
+
2. Kisa / Short Dev (self-contained, Opus) -> Review -> Test -> Commit -> Report
|
|
73
70
|
```
|
|
74
71
|
|
|
75
|
-
|
|
72
|
+
`bugfix` and `chore` recommend Short; `feature`, `refactor` and `component` recommend Full. The recommendation is presented first and passed as `ASK_CHOICE_DEFAULT` on hosts without a native picker, because `ask-choice.sh` picks the first option on a non-TTY and option order is not a contract.
|
|
73
|
+
|
|
74
|
+
**Who is asked.** `/multi-agent` and `/multi-agent:local`. Both autopilot entries always run Full without asking.
|
|
75
|
+
|
|
76
|
+
**Why there is no fast-and-unattended combination.** It existed until v16.0.0 as `--dev autopilot`, and removing it is a real behaviour change, not a rename. Autopilot may not ask, so something has to choose, and unattended is the worst place to drop analysis and planning: nobody is watching to notice what the shortcut lost. A cron job or script that called `dev-autopilot` now has to pick - stay unattended and pay for the full pipeline, or stay fast and have a person present.
|
|
77
|
+
|
|
78
|
+
**Pipeline in a Short run:**
|
|
76
79
|
|
|
77
80
|
```
|
|
78
81
|
Phase 0: Init -> Phase 3: Dev (self-contained) -> Phase 4: Review -> Phase 5: Test -> Phase 6: Commit -> Phase 7: Report
|
|
79
82
|
```
|
|
80
83
|
|
|
81
|
-
**What changes
|
|
84
|
+
**What changes (Tablo 2 - Short runs):**
|
|
82
85
|
|
|
83
|
-
| Phase |
|
|
84
|
-
| ------------------- | ----------------------------------------------- | ---------------------------------------------------------------------------------- |
|
|
85
|
-
| Phase 0 (Init) | Full setup | Same - worktree, branch, state
|
|
86
|
-
| Phase 1 (Analysis) | Parallel Explore agents
|
|
87
|
-
| Phase 2 (Planning) | TaskCreate + architecture review + **Plan Approval Gate**
|
|
88
|
-
| Phase 3 (Dev) | Follows Phase 2 plan, TDD cycle (Sonnet)
|
|
89
|
-
| Phase 4 (Review) | Parallel review + Fable triage (Claude: 2-model / Copilot: 3-model) | **Same** - gates, parallel review, triage; blocking findings return to Phase 3 (cap 3) | **Same**,
|
|
90
|
-
| Phase 5 (User Test) | Interactive prompt
|
|
91
|
-
| Phase 6 (Commit) | Commit + PR | Same - still asks
|
|
92
|
-
| Phase 7 (Report) | Full report + channels multi-select | Simplified - no analysis section, review section IS present,
|
|
86
|
+
| Phase | Full | Short | Short + `--local` |
|
|
87
|
+
| ------------------- | ----------------------------------------------- | ---------------------------------------------------------------------------------- | --------------------------------------------- |
|
|
88
|
+
| Phase 0 (Init) | Full setup | Same - worktree, branch, state, and the depth question itself | Same - no worktree, branch on `$PROJECT_ROOT` |
|
|
89
|
+
| Phase 1 (Analysis) | Parallel Explore agents + analysis document | **SKIP** - tile flips to `skipped` at Step 7.5 | **SKIP** |
|
|
90
|
+
| Phase 2 (Planning) | TaskCreate + architecture review + **Plan Approval Gate** | **SKIP** (no plan means no plan gate) | **SKIP** |
|
|
91
|
+
| Phase 3 (Dev) | Follows the Phase 2 plan, TDD cycle (Sonnet) | **Self-contained** (Opus): agent scans relevant files, implements with TDD, builds | Same, on the local branch |
|
|
92
|
+
| Phase 4 (Review) | Parallel review + Fable triage (Claude: 2-model / Copilot: 3-model) | **Same** - gates, parallel review, triage; blocking findings return to Phase 3 (cap 3) | **Same**, on the local branch diff |
|
|
93
|
+
| Phase 5 (User Test) | Interactive prompt | **Interactive prompt** | Not in the set - no worktree to check out |
|
|
94
|
+
| Phase 6 (Commit) | Commit + PR | Same - still asks | Same |
|
|
95
|
+
| Phase 7 (Report) | Full report + channels multi-select | Simplified - no analysis section, review section IS present, channels menu still pauses | Same |
|
|
93
96
|
|
|
94
|
-
**Phase 3 in
|
|
97
|
+
**Phase 3 in a Short run (self-contained):**
|
|
95
98
|
|
|
96
99
|
The **Opus** agent receives the task description (from Jira, GitHub issue, or free-text) and:
|
|
97
100
|
|
|
@@ -101,29 +104,49 @@ The **Opus** agent receives the task description (from Jira, GitHub issue, or fr
|
|
|
101
104
|
|
|
102
105
|
No separate task breakdown - the agent handles scope autonomously.
|
|
103
106
|
|
|
104
|
-
**State tracking**: `agent-state.json` gets `"onlyDevelop": true`.
|
|
107
|
+
**State tracking**: `agent-state.json` gets `"onlyDevelop": true`. Because the tracker boots at Step -1 and the answer arrives at Step 7.5, Phases 1 and 2 are registered `pending` with everything else and flipped to `skipped` when the answer lands; pre-marking is forbidden and would scramble the tile order. Full contract: `$HOME/.claude/multi-agent-refs/tracker-contract.md` section "Late skip".
|
|
105
108
|
|
|
106
|
-
|
|
109
|
+
### Intake warnings for a Short run
|
|
107
110
|
|
|
108
|
-
|
|
111
|
+
**An analysis document was supplied.** Because Phase 1 and Phase 2 are skipped, no phase turns that document into a task breakdown. The doc becomes raw context for one Dev pass, and work comes out ordered by whatever the model read first: the bottom of the dependency chain lands, the screen wiring does not.
|
|
109
112
|
|
|
110
|
-
|
|
113
|
+
The depth picker is where this is caught. When the intake carried an analysis document or a Figma reference, say so in the question itself rather than after the choice:
|
|
111
114
|
|
|
112
|
-
|
|
115
|
+
```
|
|
116
|
+
This task carries an analysis document. Short skips Analysis and Planning, so
|
|
117
|
+
the document will not be turned into a task breakdown.
|
|
118
|
+
1. Tam / Full (recommended here)
|
|
119
|
+
2. Kisa / Short (doc as context only)
|
|
120
|
+
```
|
|
113
121
|
|
|
114
|
-
|
|
122
|
+
Autopilot never sees this: it runs Full.
|
|
123
|
+
|
|
124
|
+
**The branch already carries the work.** When the change was developed outside the pipeline, or by hand, Short is still the wrong entry point: it will try to develop again. `/multi-agent:resume-local` puts the existing diff through the same review, adds a build+test success gate, opens the PR, and posts the Jira technical-analysis + test-scenario comment - without re-developing. Offer it when the working tree or branch is already ahead of the base with the task's changes.
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
128
|
+
## Analysis Mode (`/multi-agent:analysis`)
|
|
129
|
+
|
|
130
|
+
Not a depth permutation - a different **output kind**. It produces the analysis document and stops; no code, no branch, no PR. The 8-phase contract holds, with four phases reinterpreted the same way a Short run reinterprets Phase 3.
|
|
115
131
|
|
|
116
132
|
```
|
|
117
|
-
|
|
118
|
-
into a task breakdown. For analysis-driven screen work, /multi-agent or
|
|
119
|
-
/multi-agent:local run both phases.
|
|
120
|
-
1. Continue with --dev (doc as context only)
|
|
121
|
-
2. Switch to the full pipeline
|
|
133
|
+
Phase 0: Init -> Phase 1: Analysis -> Phase 2: Planning -> Phase 4: Review -> Phase 6: Publish -> Phase 7: Report
|
|
122
134
|
```
|
|
123
135
|
|
|
124
|
-
|
|
136
|
+
| Phase | Analysis mode |
|
|
137
|
+
|---|---|
|
|
138
|
+
| 0 Init | Same intake, but **no worktree**: nothing is isolated because nothing is built, so `state.run.repoPath` is the repo itself |
|
|
139
|
+
| 1 Analysis | The engine (`multi-agent-refs/analysis/*`): evidence, synthesis, render, humanizer, `validate-analysis-doc.mjs` |
|
|
140
|
+
| 2 Planning | Synthesis and render finish here; **no task decomposition** - there is no code to plan |
|
|
141
|
+
| 3 Dev | **SKIP** |
|
|
142
|
+
| 4 Review | Document review plus the open questions still marked `Acik / Open` |
|
|
143
|
+
| 5 Test | **SKIP** |
|
|
144
|
+
| 6 Commit | **Publish** instead: Local file / Confluence / Jira. Locked 6 still forbids `git add` and `git commit` |
|
|
145
|
+
| 7 Report | Channels, same as every mode |
|
|
146
|
+
|
|
147
|
+
**No `local` or `autopilot` variant.** Worktree isolation buys nothing when no code is written, and the intake, the Pass B convention preview and the open-question resolution are interactive by nature; a zero-interaction analysis would be a document nobody agreed to.
|
|
125
148
|
|
|
126
|
-
**
|
|
149
|
+
**Where the document lands.** Drafts go to `/tmp/analysis-<slug>-<ts>/` first, then the Phase 6 picker decides: Local writes `<repo>/analysis/<feature>-<platform>.md` uncommitted, Confluence posts the page, Jira updates the description. In the full pipeline the same engine writes into the worktree instead and `prefs.global.analysisPhase.commitDoc` decides whether it rides along with the commit.
|
|
127
150
|
|
|
128
151
|
---
|
|
129
152
|
|
|
@@ -131,13 +154,14 @@ Autopilot picks 1 and logs the warning rather than asking.
|
|
|
131
154
|
|
|
132
155
|
Local mode skips worktree creation - works directly on a local branch in the project root. Useful for single-task workflows or when worktrees cause issues.
|
|
133
156
|
|
|
134
|
-
**Activation**:
|
|
157
|
+
**Activation**: the `:local` entries, or `--local` on the base command:
|
|
135
158
|
|
|
136
159
|
```
|
|
160
|
+
/multi-agent:local "PROJ-12345"
|
|
161
|
+
/multi-agent:local "#316"
|
|
162
|
+
/multi-agent:local "LoginView dark mode fix"
|
|
163
|
+
/multi-agent:local-autopilot "PROJ-12345"
|
|
137
164
|
/multi-agent "PROJ-12345" --local
|
|
138
|
-
/multi-agent "#316" --local
|
|
139
|
-
/multi-agent "LoginView dark mode fix" --local --dev
|
|
140
|
-
/multi-agent "PROJ-12345" --local autopilot
|
|
141
165
|
```
|
|
142
166
|
|
|
143
167
|
**What changes in local mode:**
|
|
@@ -146,7 +170,7 @@ Local mode skips worktree creation - works directly on a local branch in the p
|
|
|
146
170
|
| -------------- | ------------------------------------------------ | -------------------------------------------------------------- |
|
|
147
171
|
| Phase 0 Step 8 | Creates worktree at `.worktrees/{id}/` | `git checkout -b {branch}` directly in `$PROJECT_ROOT` |
|
|
148
172
|
| Phase 3 | Works in worktree path | Works in `$PROJECT_ROOT` |
|
|
149
|
-
| Phase 5 | WIP commit -> remove worktree -> checkout branch |
|
|
173
|
+
| Phase 5 | WIP commit -> remove worktree -> checkout branch | **Not in the phase set** - nothing to check out, nothing to remove |
|
|
150
174
|
| Phase 6 | Commit in worktree, push | Commit in project root, push |
|
|
151
175
|
| All paths | `{worktreePath}` references | All paths use `$PROJECT_ROOT` directly |
|
|
152
176
|
|
|
@@ -160,11 +184,7 @@ git -C $PROJECT_ROOT config user.name "{identity.name}"
|
|
|
160
184
|
git -C $PROJECT_ROOT config user.email "{identity.email}"
|
|
161
185
|
```
|
|
162
186
|
|
|
163
|
-
**Phase 5 in local mode:**
|
|
164
|
-
|
|
165
|
-
- No worktree to remove - user tests directly in project
|
|
166
|
-
- No WIP commit needed (code is already on the branch in PROJECT_ROOT)
|
|
167
|
-
- "fix" goes back to Phase 3 in same directory
|
|
187
|
+
**Phase 5 in local mode:** it is not in the phase set. The gate exists to hand the user a change checked out of a worktree, and in local mode the code is already on the branch in `$PROJECT_ROOT` with nothing to check out or remove. `gen-mode-dispatch.mjs --mode=local` is the enforced statement of this; the row above mirrors it.
|
|
168
188
|
|
|
169
189
|
**State tracking**: `agent-state.json` gets `"localMode": true`, `"worktreePath": null`. All path references resolve to `$PROJECT_ROOT`.
|
|
170
190
|
|
|
@@ -174,4 +194,4 @@ git -C $PROJECT_ROOT config user.email "{identity.email}"
|
|
|
174
194
|
- Uncommitted changes in PROJECT_ROOT may conflict - pipeline warns if dirty
|
|
175
195
|
- Build queue lock still applies for xcodebuild
|
|
176
196
|
|
|
177
|
-
**Combinable**:
|
|
197
|
+
**Combinable**: `/multi-agent:local-autopilot` is the no-worktree unattended path; `/multi-agent:local` then Short is the no-worktree fast path.
|
|
@@ -290,8 +290,8 @@ nothing surfaced it. `phase0-exit-gate.mjs` now refuses to close Phase 0 unless
|
|
|
290
290
|
`agent-state.json` carries `baseBranch` and `baseFetchStatus`, so a skipped picker is a
|
|
291
291
|
gate failure rather than a silent default.
|
|
292
292
|
|
|
293
|
-
This holds in every mode.
|
|
294
|
-
not skip Phase 0's pickers. Autopilot resolves them to their defaults without prompting,
|
|
293
|
+
This holds in every mode. A Short run skips the *LLM* phases (Analysis, Planning); it
|
|
294
|
+
does not skip Phase 0's pickers. Autopilot resolves them to their defaults without prompting,
|
|
295
295
|
which still writes the fields - it does not leave them unset.
|
|
296
296
|
|
|
297
297
|
**TTL filter for recent branches**:
|
|
@@ -542,6 +542,25 @@ Persist: `"taskType": "component" | "bugfix" | "feature" | "refactor" | "chore"`
|
|
|
542
542
|
|
|
543
543
|
Log: `Phase 0 Step 7: taskType = {component|bugfix|feature|refactor|chore}`
|
|
544
544
|
|
|
545
|
+
#### Step 7.5 - Pipeline depth (Full / Short)
|
|
546
|
+
|
|
547
|
+
Ask the depth question from `$HOME/.claude/multi-agent-refs/phases/modes.md` "Pipeline depth" - it carries the wording, the per-`taskType` recommendation and the mode tables. Here because the recommendation needs `taskType` (Step 7), which needs the fetched issue (Step 1) and the branch (Step 3).
|
|
548
|
+
|
|
549
|
+
**Who is asked.** `/multi-agent` and `/multi-agent:local` only. Both autopilot entries and analysis mode skip it; autopilot always runs Full.
|
|
550
|
+
|
|
551
|
+
When the intake carried an analysis document or a Figma reference, say so **inside** the question: Short skips the only two phases that would turn that document into a task breakdown, and the user should learn that before choosing, not after.
|
|
552
|
+
|
|
553
|
+
**Pass the default explicitly.** `ask-choice.sh` picks the FIRST option on a non-TTY, so relying on option order breaks the first time someone reorders them for readability, on the host where nobody is watching:
|
|
554
|
+
|
|
555
|
+
```bash
|
|
556
|
+
ASK_CHOICE_DEFAULT="$DEPTH_RECOMMENDATION" \
|
|
557
|
+
$HOME/.claude/lib/ask-choice.sh "Which pipeline for this task?" "Full" "Short"
|
|
558
|
+
```
|
|
559
|
+
|
|
560
|
+
**Persist.** Short sets `state.onlyDevelop = true`; Full leaves it `false`. The key is unchanged - only who sets it changed - so every downstream reader keeps working. Short also flips the Phase 1 and Phase 2 tiles to `skipped` (tracker-contract.md, "Late skip"); pre-marking is forbidden.
|
|
561
|
+
|
|
562
|
+
Log: `Phase 0 Step 7.5: depth = {full|short} (recommended {full|short}, source {user|autopilot|default})`
|
|
563
|
+
|
|
545
564
|
#### Step 8 - Clarification (opt-in, runs AFTER maturity, BEFORE Phase 1)
|
|
546
565
|
|
|
547
566
|
**Gated by `prefs.global.clarifyAmbiguous.enabled`** (default: `false`). When enabled and `state.maturity.status != "blocker"`:
|
|
@@ -161,8 +161,34 @@ The light tier keeps a one-line bug fix from triggering a full-repo scan; pairin
|
|
|
161
161
|
|
|
162
162
|
**Dispatch resilience (required).** Explore agents run in parallel and the analyst synthesis waits on them, so a single stalled agent hangs the phase. Bound each Explore dispatch by a wall-clock budget (`EXPLORE_TIMEOUT_SECONDS`, default 180). If an agent has not returned by the budget: log `explore.timeout agent=<id>`, drop that agent's slice, and synthesize from the agents that did return. Proceed as long as at least one Explore agent returned; if zero returned, retry the cheapest single Explore once, then HALT with `ERR: no Explore agent returned within ${EXPLORE_TIMEOUT_SECONDS}s; resume with /multi-agent:resume #N.`. Never block indefinitely on a slow or dead dispatch.
|
|
163
163
|
|
|
164
|
+
#### Step 4 - Analysis document (the design contract Phase 2 and Phase 3 demand)
|
|
165
|
+
|
|
166
|
+
Phase 2 and Phase 3 pre-flights BLOCK on `analysis/<feature-slug>-<platform>.md`. **This step produces it.**
|
|
167
|
+
|
|
168
|
+
**When it runs.** From signals Phase 0 already computed:
|
|
169
|
+
|
|
170
|
+
| `taskType` | Figma reference in `state.contextLinks[]` | Document |
|
|
171
|
+
|---|---|---|
|
|
172
|
+
| `feature` · `refactor` · `component` | any | **produced** |
|
|
173
|
+
| `bugfix` · `chore` | present | **produced** |
|
|
174
|
+
| `bugfix` · `chore` | absent | **skipped** - record `state.analysis.docStatus = "not-applicable"` |
|
|
175
|
+
|
|
176
|
+
`analysisPhase.forceFull` (default `false`) overrides the skip row, for a small change that must still leave a spec behind. `analysisPhase.mode` sets depth: `auto` is Lite on the skip-row shape and Full otherwise; `full` / `lite` pin it.
|
|
177
|
+
|
|
178
|
+
A fresh document is also skipped when one already exists for this feature and platform AND its front-matter `evidence_digest` still matches (Locked 27 cache); record `docStatus = "reused"`.
|
|
179
|
+
|
|
180
|
+
**How it runs.** Load `$HOME/.claude/multi-agent-refs/analysis/` on demand, in order: `locked.md` (the 31 binding decisions) then `evidence.md`, `synthesis.md`, `render.md`. Intake is NOT re-asked; platform, repos and account come from Phase 0 state. Autopilot auto-approves the Phase 2a convention preview and writes the local file, because it may not ask.
|
|
181
|
+
|
|
182
|
+
**Where it lands.** `<worktree>/analysis/<feature-slug>-<platform>.md`, one file per platform in `state.analysisSpec.platforms[]`. Persist the paths to `state.analysis.docPath[]` and set `docStatus` to `produced` | `reused` | `not-applicable`. Whether the file is committed with the work is `prefs.global.analysisPhase.commitDoc` (default `true`), read at Phase 6.
|
|
183
|
+
|
|
184
|
+
**The gate is not optional.** `node $HOME/.claude/scripts/validate-analysis-doc.mjs <file>` must exit 0 for every produced file; non-zero fails CLOSED like the JSON validator below (rework once, then halt).
|
|
185
|
+
|
|
186
|
+
Progress line: `→ analysis doc: <produced|reused|not-applicable> (<N> platform, validator <pass|pass-after-rework>)`
|
|
187
|
+
|
|
164
188
|
#### Output contract
|
|
165
189
|
|
|
190
|
+
Two artefacts, both read downstream: `state.analysis` (the object below, for Phase 2 decomposition) and the Step 4 document (Phase 2 pre-flight + Phase 3's sole design source, Locked 30).
|
|
191
|
+
|
|
166
192
|
Phase 1 produces an object conforming to `$HOME/.claude/schemas/analysis-output.schema.json` and persists it to `state.analysis`. Required fields (exact names per the schema): `stack` (detected stack identifier + primary language), `touchedAreas[]` (path + why), `risks[]` (existing-code hazards/observations the planner must respect - each `{risk, severity, mitigation}`; use an empty array when none), `summary` (one-paragraph human-readable). Phase 2 reads this object as its sole input - see `phase-2-planning.md`'s Input contract.
|
|
167
193
|
|
|
168
194
|
**Required: validator gate (deterministic) - run on the persisted file immediately after the analysis object is produced; the validator's exit code decides, not the LLM turn:**
|