@mmerterden/multi-agent-pipeline 18.0.0 → 19.1.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 +287 -0
- package/README.md +36 -20
- package/README.tr.md +14 -16
- package/docs/adr/0002-instruction-driven-flag.md +1 -0
- package/docs/adr/0005-lazy-phase-docs.md +11 -1
- package/docs/adr/0008-installer-modularization-and-secret-leak-defense.md +1 -0
- package/docs/adr/0010-own-code-graph.md +1 -0
- package/docs/adr/0014-six-phase-consolidation.md +134 -0
- package/docs/adr/README.md +2 -1
- package/docs/architecture.md +37 -38
- package/docs/best-practices.md +1 -1
- package/docs/ecosystem.md +46 -27
- package/docs/engineering.md +1 -1
- package/docs/facts.json +61 -0
- package/docs/features.md +55 -54
- package/docs/performance.md +5 -5
- package/docs/recovery-guide.md +17 -17
- package/docs/token-budget-history.md +3 -1
- package/index.js +2 -2
- package/install/_codex-agents.mjs +1 -1
- package/install/templates/claude-hooks.json +1 -1
- package/install/templates/codex-instructions.md +1 -1
- package/install/templates/copilot-instructions.md +28 -28
- package/manifest.json +234 -216
- package/package.json +2 -2
- package/pipeline/agents/dev-critic.md +7 -7
- package/pipeline/commands/figma-to-swiftui.md +1 -1
- package/pipeline/commands/multi-agent/SKILL.md +9 -9
- package/pipeline/commands/multi-agent/analysis/SKILL.md +15 -15
- package/pipeline/commands/multi-agent/analysis-resolve/SKILL.md +2 -2
- package/pipeline/commands/multi-agent/autopilot/SKILL.md +7 -7
- package/pipeline/commands/multi-agent/channels/SKILL.md +15 -15
- package/pipeline/commands/multi-agent/diff-explain/SKILL.md +6 -6
- package/pipeline/commands/multi-agent/garbage-collect/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/graph/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/help/SKILL.md +62 -62
- package/pipeline/commands/multi-agent/language/SKILL.md +2 -2
- package/pipeline/commands/multi-agent/local/SKILL.md +11 -11
- package/pipeline/commands/multi-agent/local-autopilot/SKILL.md +13 -13
- package/pipeline/commands/multi-agent/log/SKILL.md +2 -2
- package/pipeline/commands/multi-agent/manual-test/SKILL.md +9 -9
- package/pipeline/commands/multi-agent/model/SKILL.md +69 -0
- package/pipeline/commands/multi-agent/refactor/SKILL.md +3 -3
- package/pipeline/commands/multi-agent/resume/SKILL.md +4 -4
- package/pipeline/commands/multi-agent/resume-local/SKILL.md +19 -17
- package/pipeline/commands/multi-agent/review/SKILL.md +2 -2
- package/pipeline/commands/multi-agent/review-analysis/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/route-off/SKILL.md +36 -0
- package/pipeline/commands/multi-agent/route-on/SKILL.md +74 -0
- package/pipeline/commands/multi-agent/route-status/SKILL.md +56 -0
- package/pipeline/commands/multi-agent/setup/SKILL.md +2 -2
- package/pipeline/commands/multi-agent/status/SKILL.md +5 -5
- package/pipeline/commands/multi-agent/steer/SKILL.md +2 -2
- package/pipeline/commands/multi-agent/sync/SKILL.md +12 -13
- package/pipeline/commands/multi-agent/test/SKILL.md +1 -1
- package/pipeline/lib/credential-inventory.sh +1 -1
- package/pipeline/lib/fetch-fortify.sh +1 -1
- package/pipeline/lib/model-dispatch.sh +140 -0
- package/pipeline/lib/model-rung.sh +142 -0
- package/pipeline/lib/outbound-gate.mjs +14 -0
- package/pipeline/lib/phase-schema.mjs +88 -0
- package/pipeline/lib/plan-todos.sh +5 -5
- package/pipeline/lib/route-state.sh +161 -0
- package/pipeline/lib/run-paths.sh +2 -2
- package/pipeline/multi-agent-refs/_account-picker.md +1 -1
- package/pipeline/multi-agent-refs/_dev-context.md +6 -6
- package/pipeline/multi-agent-refs/_input-parser.md +1 -1
- package/pipeline/multi-agent-refs/analysis/evidence.md +2 -11
- package/pipeline/multi-agent-refs/analysis/intake.md +7 -7
- package/pipeline/multi-agent-refs/analysis/locked.md +48 -22
- package/pipeline/multi-agent-refs/analysis/redesign.md +1 -1
- package/pipeline/multi-agent-refs/analysis/render.md +10 -10
- package/pipeline/multi-agent-refs/analysis/resolve.md +1 -1
- package/pipeline/multi-agent-refs/analysis/review.md +2 -2
- package/pipeline/multi-agent-refs/analysis/synthesis.md +13 -7
- package/pipeline/multi-agent-refs/analysis-template-corporate.md +9 -9
- package/pipeline/multi-agent-refs/analysis-template.md +19 -19
- package/pipeline/multi-agent-refs/android-guide.md +1 -1
- package/pipeline/multi-agent-refs/audit-guide.md +13 -13
- package/pipeline/multi-agent-refs/channels/issue-comment.md +2 -2
- package/pipeline/multi-agent-refs/channels/jira.md +3 -3
- package/pipeline/multi-agent-refs/channels/pr.md +4 -4
- package/pipeline/multi-agent-refs/channels/wiki.md +1 -1
- package/pipeline/multi-agent-refs/component-dispatch.md +8 -8
- package/pipeline/multi-agent-refs/conventions-defaults.md +2 -2
- package/pipeline/multi-agent-refs/cross-cli-contract.md +31 -6
- package/pipeline/multi-agent-refs/features/analysis-jira.md +1 -1
- package/pipeline/multi-agent-refs/features/autopilot-circuit-breaker.md +4 -4
- package/pipeline/multi-agent-refs/features/code-graph.md +5 -5
- package/pipeline/multi-agent-refs/features/design-conformance.md +1 -1
- package/pipeline/multi-agent-refs/features/dev-critic.md +3 -3
- package/pipeline/multi-agent-refs/features/doctor.md +3 -3
- package/pipeline/multi-agent-refs/features/external-context-injection.md +3 -3
- package/pipeline/multi-agent-refs/features/maturity-followup.md +3 -3
- package/pipeline/multi-agent-refs/features/model-fallback.md +41 -5
- package/pipeline/multi-agent-refs/features/plan-todos.md +1 -1
- package/pipeline/multi-agent-refs/features/repo-map.md +1 -1
- package/pipeline/multi-agent-refs/features/review-delta.md +3 -3
- package/pipeline/multi-agent-refs/features/review-multi-repo.md +2 -2
- package/pipeline/multi-agent-refs/features/scope-check.md +4 -4
- package/pipeline/multi-agent-refs/features/skill-conformance.md +2 -2
- package/pipeline/multi-agent-refs/features/stack-skill-routing.md +1 -1
- package/pipeline/multi-agent-refs/features/url-enrichment.md +1 -1
- package/pipeline/multi-agent-refs/features/verify-by-test.md +4 -4
- package/pipeline/multi-agent-refs/features/visual-evidence.md +19 -19
- package/pipeline/multi-agent-refs/features/worktree-finalize.md +6 -6
- package/pipeline/multi-agent-refs/issue-jira-triad.md +10 -10
- package/pipeline/multi-agent-refs/knowledge.md +11 -11
- package/pipeline/multi-agent-refs/multi-repo-integration-build.md +13 -13
- package/pipeline/multi-agent-refs/payload-contracts.md +8 -8
- package/pipeline/multi-agent-refs/phases/log-format.md +10 -10
- package/pipeline/multi-agent-refs/phases/modes.md +30 -30
- package/pipeline/multi-agent-refs/phases/operations.md +8 -8
- package/pipeline/multi-agent-refs/phases/phase-0-init.md +24 -24
- package/pipeline/multi-agent-refs/phases/phase-1-plan.md +599 -0
- package/pipeline/multi-agent-refs/phases/{phase-3-dev.md → phase-2-dev.md} +129 -49
- package/pipeline/multi-agent-refs/phases/{phase-4-review.md → phase-3-review.md} +225 -107
- package/pipeline/multi-agent-refs/phases/{phase-6-commit.md → phase-4-commit.md} +23 -23
- package/pipeline/multi-agent-refs/phases/{phase-7-report.md → phase-5-report.md} +29 -29
- package/pipeline/multi-agent-refs/phases.md +44 -48
- package/pipeline/multi-agent-refs/picker-contract.md +1 -1
- package/pipeline/multi-agent-refs/progress-contract.md +6 -6
- package/pipeline/multi-agent-refs/readiness-review.md +1 -1
- package/pipeline/multi-agent-refs/rules.md +7 -7
- package/pipeline/multi-agent-refs/swiftui-guide.md +2 -2
- package/pipeline/multi-agent-refs/tracker-contract.md +31 -32
- package/pipeline/multi-agent-refs/wiki-capture.md +14 -14
- package/pipeline/preferences-template.json +9 -1
- package/pipeline/rules/figma-pipeline.md +8 -8
- package/pipeline/rules/outside-the-pipeline.md +1 -1
- package/pipeline/schemas/agent-state.schema.json +50 -50
- package/pipeline/schemas/analysis-output.schema.json +3 -3
- package/pipeline/schemas/analysis-spec.schema.json +2 -2
- package/pipeline/schemas/autopilot-config.schema.json +1 -1
- package/pipeline/schemas/code-graph.schema.json +1 -1
- package/pipeline/schemas/criteria-manifest.schema.json +1 -1
- package/pipeline/schemas/dev-critic-output.schema.json +1 -1
- package/pipeline/schemas/diff-risk.schema.json +1 -1
- package/pipeline/schemas/figma-project-config.schema.json +1 -1
- package/pipeline/schemas/migrations/prefs-2.4.0-to-2.5.0.mjs +2 -2
- package/pipeline/schemas/migrations/prefs-2.6.0-to-2.7.0.mjs +31 -0
- package/pipeline/schemas/migrations/state-2.1.0-to-2.2.0.mjs +129 -0
- package/pipeline/schemas/phases.json +105 -0
- package/pipeline/schemas/plan-todos.schema.json +5 -5
- package/pipeline/schemas/planning-output.schema.json +1 -1
- package/pipeline/schemas/prefs.schema.json +102 -58
- package/pipeline/schemas/reviewer-output.schema.json +3 -3
- package/pipeline/schemas/route-config.schema.json +74 -0
- package/pipeline/schemas/scope-check.schema.json +1 -1
- package/pipeline/schemas/secret-patterns.json +124 -0
- package/pipeline/schemas/test-gap.schema.json +1 -1
- package/pipeline/schemas/token-budget.json +12 -18
- package/pipeline/schemas/triage-output.schema.json +6 -6
- package/pipeline/scripts/README.md +3 -3
- package/pipeline/scripts/_code-graph.mjs +2 -2
- package/pipeline/scripts/_run-paths.mjs +2 -2
- package/pipeline/scripts/_smoke-root.sh +1 -1
- package/pipeline/scripts/aggregate-metrics.mjs +1 -1
- package/pipeline/scripts/build-references.mjs +2 -2
- package/pipeline/scripts/bulk-read.sh +10 -1
- package/pipeline/scripts/capture-flush.sh +8 -8
- package/pipeline/scripts/capture-resume.sh +3 -3
- package/pipeline/scripts/classify-plan-safety.mjs +1 -1
- package/pipeline/scripts/cost-table.json +8 -1
- package/pipeline/scripts/diff-explain.mjs +1 -1
- package/pipeline/scripts/doctor.mjs +3 -3
- package/pipeline/scripts/gc-abandoned.sh +3 -3
- package/pipeline/scripts/gc-tmp.sh +1 -1
- package/pipeline/scripts/gc-worktrees.sh +1 -1
- package/pipeline/scripts/gen-facts.mjs +280 -0
- package/pipeline/scripts/gen-mode-dispatch.mjs +32 -37
- package/pipeline/scripts/gen-ref-toc.mjs +1 -1
- package/pipeline/scripts/graph-report.mjs +1 -1
- package/pipeline/scripts/jira-attach.sh +1 -1
- package/pipeline/scripts/learn-from-transcripts.mjs +1 -1
- package/pipeline/scripts/learning-curve.mjs +2 -2
- package/pipeline/scripts/log-metric.sh +17 -4
- package/pipeline/scripts/memory-save.sh +1 -1
- package/pipeline/scripts/migrate-prefs.mjs +22 -5
- package/pipeline/scripts/phase-banner.sh +20 -20
- package/pipeline/scripts/phase-tracker.sh +12 -12
- package/pipeline/scripts/plan-coverage-gate.mjs +2 -2
- package/pipeline/scripts/pre-commit-check.sh +30 -1
- package/pipeline/scripts/render-agent-log-cost.sh +1 -1
- package/pipeline/scripts/render-work-summary.sh +3 -3
- package/pipeline/scripts/review-file-filter.mjs +1 -1
- package/pipeline/scripts/run-aggregator.mjs +13 -6
- package/pipeline/scripts/run-metrics.mjs +1 -1
- package/pipeline/scripts/runs-index.mjs +11 -1
- package/pipeline/scripts/scan-skills.sh +26 -0
- package/pipeline/scripts/smoke-cross-cli-behavior.sh +6 -6
- package/pipeline/scripts/smoke-schema-validation.sh +26 -7
- package/pipeline/scripts/token-budget-report.mjs +13 -2
- package/pipeline/scripts/triage-memory.mjs +2 -2
- package/pipeline/scripts/validate-analysis-doc.mjs +274 -43
- package/pipeline/scripts/validate-planning.mjs +1 -1
- package/pipeline/scripts/validate-reviewer.mjs +1 -1
- package/pipeline/scripts/validate-state.mjs +45 -5
- package/pipeline/scripts/validate-triage.mjs +3 -3
- package/pipeline/scripts/verify-citations.mjs +1 -1
- package/pipeline/scripts/worktree-finalize.sh +5 -5
- package/pipeline/scripts/write-state.mjs +32 -0
- package/pipeline/skills/.skill-manifest.json +38 -22
- package/pipeline/skills/.skills-index.json +49 -5
- package/pipeline/skills/shared/README.md +10 -6
- package/pipeline/skills/shared/core/apple-archive-compliance/SKILL.md +8 -8
- package/pipeline/skills/shared/core/google-play-compliance/SKILL.md +8 -8
- package/pipeline/skills/shared/core/multi-agent/SKILL.md +81 -82
- package/pipeline/skills/shared/core/multi-agent-autopilot/SKILL.md +3 -3
- package/pipeline/skills/shared/core/multi-agent-channels/SKILL.md +14 -14
- package/pipeline/skills/shared/core/multi-agent-diff-explain/SKILL.md +5 -5
- package/pipeline/skills/shared/core/multi-agent-graph/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-help/SKILL.md +25 -23
- package/pipeline/skills/shared/core/multi-agent-language/SKILL.md +2 -2
- package/pipeline/skills/shared/core/multi-agent-local/SKILL.md +2 -2
- package/pipeline/skills/shared/core/multi-agent-local-autopilot/SKILL.md +8 -8
- package/pipeline/skills/shared/core/multi-agent-manual-test/SKILL.md +6 -6
- package/pipeline/skills/shared/core/multi-agent-model/SKILL.md +71 -0
- package/pipeline/skills/shared/core/multi-agent-refactor/SKILL.md +3 -3
- package/pipeline/skills/shared/core/multi-agent-resume/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-resume-local/SKILL.md +7 -7
- package/pipeline/skills/shared/core/multi-agent-route-off/SKILL.md +39 -0
- package/pipeline/skills/shared/core/multi-agent-route-on/SKILL.md +76 -0
- package/pipeline/skills/shared/core/multi-agent-route-status/SKILL.md +59 -0
- package/pipeline/skills/shared/core/multi-agent-setup/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-status/SKILL.md +5 -5
- package/pipeline/skills/shared/core/multi-agent-steer/SKILL.md +2 -2
- package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +6 -5
- package/pipeline/skills/shared/external/NOTICE-swift-ios-skills.md +1 -1
- package/pipeline/skills/shared/external/signal-community/SKILL.md +8 -1
- package/pipeline/skills/skills-index.md +8 -4
- package/pipeline/multi-agent-refs/phases/phase-1-analysis.md +0 -263
- package/pipeline/multi-agent-refs/phases/phase-2-planning.md +0 -344
- package/pipeline/multi-agent-refs/phases/phase-5-test.md +0 -182
|
@@ -68,9 +68,9 @@ template_version: v3
|
|
|
68
68
|
|
|
69
69
|
`status` is the publication claim; absent means `draft`. Under `final` an unresolved `AS-NN` or open Section 20 row is an ERROR, under `draft` it is counted. `/multi-agent:analysis-resolve` flips it, after a confirmation.
|
|
70
70
|
|
|
71
|
-
`profile` names the template the document was rendered against (Locked
|
|
71
|
+
`profile` names the template the document was rendered against (Locked 31) and `platform: none` marks the stack-optional render (Locked 34). Both are read by `validate-analysis-doc.mjs`, which applies a different contract per profile: without the key a corporate document would be judged against the global rules and its backbone would read as a pile of Locked 2 violations.
|
|
72
72
|
|
|
73
|
-
Phase 1 compares `evidence_digest` against an existing document to decide whether to reuse it (Locked
|
|
73
|
+
Phase 1 compares `evidence_digest` against an existing document to decide whether to reuse it (Locked 26). Phase 3 reads `platform` to verify file match, `mode` to know which section set to expect, and both `evidence_digest` and `base_commit` to judge freshness: the digest says the evidence changed, `base_commit` says the repo moved. Phase 2 parses the block but gates only on `template_version`.
|
|
74
74
|
|
|
75
75
|
## Layer headings (A / B / C)
|
|
76
76
|
|
|
@@ -155,7 +155,7 @@ Citation: feature definition cites the primary Confluence spec page (`[Confluenc
|
|
|
155
155
|
|
|
156
156
|
## 2. Hedefler ve Karşı Hedefler / Goals and Non-Goals
|
|
157
157
|
|
|
158
|
-
Never omitted. Locked
|
|
158
|
+
Never omitted. Locked 14 - both columns mandatory. A row in only one column is not accepted.
|
|
159
159
|
|
|
160
160
|
```markdown
|
|
161
161
|
## 2. Hedefler ve Karşı Hedefler <!-- TR -->
|
|
@@ -230,7 +230,7 @@ Confluence dispatch wraps each mermaid block in `<ac:structured-macro ac:name="m
|
|
|
230
230
|
|
|
231
231
|
## 4. Kullanıcı Hikayeleri / User Stories
|
|
232
232
|
|
|
233
|
-
Never omitted. Locked
|
|
233
|
+
Never omitted. Locked 13 - Gherkin format mandatory. **Source-story completeness gate**: Gherkin scenarios cover the key happy/error/edge paths, but a `### 4.0 Kaynak Hikaye Izlenebilirligi / Source Story Traceability` table MUST list EVERY source-spec user-story ID (US-1..US-N) verbatim, each mapped to where it is covered (a Gherkin scenario or another section). Condensing into a few Gherkin scenarios is allowed ONLY if this table preserves the full source ID set; no source user story may be silently dropped. A missing source ID is a blocker and emits a Section 20 Risk row.
|
|
234
234
|
|
|
235
235
|
```markdown
|
|
236
236
|
## 4. Kullanıcı Hikayeleri <!-- TR -->
|
|
@@ -266,7 +266,7 @@ Then <expected outcome>
|
|
|
266
266
|
|
|
267
267
|
### 4.4 İş Kuralları / Business Rules
|
|
268
268
|
|
|
269
|
-
Locked
|
|
269
|
+
Locked 30 - 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`.
|
|
270
270
|
|
|
271
271
|
**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:
|
|
272
272
|
|
|
@@ -290,7 +290,7 @@ Each scenario in 4.1-4.3 cites the matching `BR-<slug>-NN` id (and, when a serve
|
|
|
290
290
|
|
|
291
291
|
### 4.5 Mevcut Davranış / Current Behaviour (OPTIONAL)
|
|
292
292
|
|
|
293
|
-
`redesign: true` only. Locked
|
|
293
|
+
`redesign: true` only. Locked 36; contract and checks in `analysis/redesign.md`. Evidence and certainty are derived from `repoEvidence`, never graded by the writer.
|
|
294
294
|
|
|
295
295
|
```markdown
|
|
296
296
|
| Id | Davranış / Behaviour | Kanıt / Evidence | Kesinlik / Certainty |
|
|
@@ -311,7 +311,7 @@ Each scenario in 4.1-4.3 cites the matching `BR-<slug>-NN` id (and, when a serve
|
|
|
311
311
|
|
|
312
312
|
## 5. Tasarım Referansı / Design Reference
|
|
313
313
|
|
|
314
|
-
Per-platform projection. Omitted if no Figma URL AND no Code Connect mapping. Locked
|
|
314
|
+
Per-platform projection. Omitted if no Figma URL AND no Code Connect mapping. Locked 18 + 19.
|
|
315
315
|
|
|
316
316
|
```markdown
|
|
317
317
|
## 5. Tasarım Referansı <!-- TR -->
|
|
@@ -319,7 +319,7 @@ Per-platform projection. Omitted if no Figma URL AND no Code Connect mapping. Lo
|
|
|
319
319
|
|
|
320
320
|
### 5.1 Frame galerisi / Frame gallery
|
|
321
321
|
|
|
322
|
-
Drill into every Figma variant (Locked
|
|
322
|
+
Drill into every Figma variant (Locked 19). When a section URL is given, list all of its child frames.
|
|
323
323
|
|
|
324
324
|
| Frame ID | Varyant / Variant | Boyut / Dimensions | Görüntü / Screenshot | Ayırt edici / Distinctive | Code Connect |
|
|
325
325
|
|---|---|---|---|---|---|
|
|
@@ -388,7 +388,7 @@ Locked 11 - existence is resolved against `evidence.codeConnect[]` (the Code Con
|
|
|
388
388
|
|
|
389
389
|
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.
|
|
390
390
|
|
|
391
|
-
Without the traversal this table could only ever list properties the instance already used, which made "used subset" unverifiable against anything (Locked
|
|
391
|
+
Without the traversal this table could only ever list properties the instance already used, which made "used subset" unverifiable against anything (Locked 28). Phase 2+ cannot re-fetch (Locked 29), so a value missed here is missed for the whole run.
|
|
392
392
|
|
|
393
393
|
| Bileşen / Component | Eksen / Axis | Tüm değerler / All values | Bu ekranda / Used here | Karar / Disposition | Not / Note |
|
|
394
394
|
|---|---|---|---|---|---|
|
|
@@ -454,11 +454,11 @@ Per-platform projection translates token names: iOS uses `.Spacing.spacingN` enu
|
|
|
454
454
|
| <name> | Lottie | no | Figma + motion spec | new, istisna gerekçesi / exception rationale: <reason> |
|
|
455
455
|
```
|
|
456
456
|
|
|
457
|
-
Locked
|
|
457
|
+
Locked 15 - SVG default for new assets. Lottie or optimized PNG accepted with explicit rationale in the Notes column.
|
|
458
458
|
|
|
459
459
|
## 9. API Kontratları / API Contracts
|
|
460
460
|
|
|
461
|
-
Never omitted (if any service is consumed). Locked
|
|
461
|
+
Never omitted (if any service is consumed). Locked 17 - response variants exhaustive. **Service-completeness gate**: do NOT rely solely on the supplied Swagger/Confluence inputs - reconcile against the canonical Api Contract page(s) for this screen. Every endpoint listed on the screen's Api Contract page MUST appear in 9.1 (or be explicitly tagged out-of-scope with a reason). An uncovered contract endpoint is a blocker and emits a Section 20 Risk row.
|
|
462
462
|
|
|
463
463
|
```markdown
|
|
464
464
|
## 9. API Kontratları <!-- TR -->
|
|
@@ -587,11 +587,11 @@ Per-platform projection (both modes):
|
|
|
587
587
|
| <event_name> | <param1, param2> | 4.1 happy path / BR-<slug>-01 | <Firebase schema / repo / Confluence> | new |
|
|
588
588
|
| <event_name> | <params> | <story or BR id> | <source> | reuse |
|
|
589
589
|
|
|
590
|
-
Each event's Trigger cites the user story (Section 4) or business rule (`BR-` id, Section 4.4) it fires on, so the analytics plan traces to behavior (Locked
|
|
590
|
+
Each event's Trigger cites the user story (Section 4) or business rule (`BR-` id, Section 4.4) it fires on, so the analytics plan traces to behavior (Locked 30).
|
|
591
591
|
PII redaction: <list of fields hashed before telemetry>
|
|
592
592
|
```
|
|
593
593
|
|
|
594
|
-
Locked 11 - direct-match events emit reuse rows.
|
|
594
|
+
Locked 11 - direct-match events emit reuse rows. PII fields (email, phone, national ID) are hashed before emit.
|
|
595
595
|
|
|
596
596
|
## 12. Deeplink ve Push Notification / Deeplink and Push
|
|
597
597
|
|
|
@@ -646,7 +646,7 @@ Never omitted. Per-platform projection from Phase 1c conventions.
|
|
|
646
646
|
|
|
647
647
|
### 13.1 Kavram tablosu / Concept table
|
|
648
648
|
|
|
649
|
-
Locked
|
|
649
|
+
Locked 22 - platform-agnostic concept layer rendered with repo conventions.
|
|
650
650
|
|
|
651
651
|
| Kavram / Concept | Karşılığı / Realization | Confidence | Evidence |
|
|
652
652
|
|---|---|---|---|
|
|
@@ -695,7 +695,7 @@ Locked 21 - platform-agnostic concept layer rendered with repo conventions.
|
|
|
695
695
|
|
|
696
696
|
### 13.6 SwiftUI Preview block (iOS projection, SwiftUI views only)
|
|
697
697
|
|
|
698
|
-
Per Locked
|
|
698
|
+
Per Locked 27 - SwiftUI views ship with `#Preview` macro (Swift 5.9+) or `PreviewProvider` (legacy). UIKit view controllers are exempt from this section. Pass B detects the view kind via `import SwiftUI` + `: View` protocol conformance against `evidence.repoEvidence[<repo>].buckets.uiComponents`; if a feature has only UIKit `UIViewController` artefacts, this subsection is omitted with note `(N/A: UIKit-only feature)`.
|
|
699
699
|
|
|
700
700
|
One preview entry per variant matters for Xcode Canvas and snapshot test alignment. Preview macro convention is read from `conventions[<repo>].previewMacro` (Phase 1c) - the renderer picks `#Preview` for Swift 5.9+ repos and `PreviewProvider` for legacy ones.
|
|
701
701
|
|
|
@@ -769,7 +769,7 @@ Per-platform projection.
|
|
|
769
769
|
|
|
770
770
|
### 15.1 Birim testleri / Unit tests (kural bazlı / rule-driven)
|
|
771
771
|
|
|
772
|
-
Locked
|
|
772
|
+
Locked 30 - one sub-table per business rule from Section 4.4. Enumerate the cases: happy, boundary (min/max, off-by-one), error/failure, empty/nil. Each row is Given / When / Then plus a framework-correct test name that traces back to the `BR-` id. Boundary rows collapse into one parameterized test.
|
|
773
773
|
|
|
774
774
|
Framework per platform (from Phase 1c conventions; these are the modern defaults): iOS Swift Testing (`@Test`, `@Suite`, `@Test(arguments:)` for boundary tables, `#expect` / `#require`); Android JUnit5 + MockK (`coEvery` / `coVerify`) + Turbine (`flow.test { awaitItem() }`) + coroutines-test (`runTest`, `StandardTestDispatcher`); Backend pytest (parametrize); Web Vitest.
|
|
775
775
|
|
|
@@ -782,7 +782,7 @@ Framework per platform (from Phase 1c conventions; these are the modern defaults
|
|
|
782
782
|
| error | <failure state> | <action> | <error/emission> | `func rule_failure_emitsError()` |
|
|
783
783
|
| empty/nil | <empty state> | <action> | <default/guard> | `func rule_empty_returnsIdle()` |
|
|
784
784
|
|
|
785
|
-
(Repeat one sub-table per rule. A rule with no unit-test row fails the dispatch gate, Locked
|
|
785
|
+
(Repeat one sub-table per rule. A rule with no unit-test row fails the dispatch gate, Locked 30.)
|
|
786
786
|
|
|
787
787
|
### 15.2 Görsel regresyon / Snapshot tests
|
|
788
788
|
|
|
@@ -832,7 +832,7 @@ Framework: iOS XCUITest (`waitForExistence`, identifier-driven); Android Compose
|
|
|
832
832
|
|
|
833
833
|
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.
|
|
834
834
|
|
|
835
|
-
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
|
|
835
|
+
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 30 requires of unit tests.
|
|
836
836
|
|
|
837
837
|
| Senaryo / Scenario | Ön koşul / Precondition | Adımlar / Steps | Beklenen / Expected | BR ID |
|
|
838
838
|
|---|---|---|---|---|
|
|
@@ -983,7 +983,7 @@ These row types are exactly what `build-references.mjs` emits, and the example i
|
|
|
983
983
|
- **Erişim / Access** is `ok` or `erişilemedi (<reason>)`. A source that was declared but could not be fetched still gets a row. Dropping it hides the gap: the reader sees a document that never mentions the API contract and assumes there was none, rather than knowing it was unreachable.
|
|
984
984
|
- **Serbest metin** rows carry what the user stated in conversation that no fetched source contains, quoted verbatim, with the decision it settled in the `Rol` column. Scope decisions made in chat are evidence; leaving them out is how a document loses the reason it excluded something.
|
|
985
985
|
|
|
986
|
-
**Coverage gate (Locked
|
|
986
|
+
**Coverage gate (Locked 33).** Before the document is emitted, the validator compares this table against the evidence record. Every entry in `evidence.figma[]`, `evidence.confluence[]`, `evidence.jira[]`, `evidence.swagger[]`, `evidence.repo[]`, `evidence.standards[]`, `evidence.firebase[]`, `evidence.documents[]`, `evidence.outside[]`, `evidence.freeText[]` and every entry in `evidence.fetchErrors[]` must appear as a row. A source that shaped the document but is missing from References fails the dispatch gate, and a row with no matching evidence entry fails it too - an invented reference is worse than a missing one.
|
|
987
987
|
|
|
988
988
|
## 22. Sözlük / Glossary
|
|
989
989
|
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
- [Compliance Rules (maps to multi-agent-toolkit MCP audit tools)](#compliance-rules-maps-to-multi-agent-toolkit-mcp-audit-tools)
|
|
15
15
|
<!-- /toc -->
|
|
16
16
|
|
|
17
|
-
> **MUST: Figma MCP-first (BLOCKING).** If the task references any Figma frame (URL, node ID, or "from the design"), the Dev phase MUST call `mcp__claude_ai_Figma__get_design_context` for every frame BEFORE writing a single Composable line. Use the `CodeConnectSnippet` component name verbatim - no sound-alike substitutions. Authentication failure is not a skip path. Full rule, trigger conditions, and gate failure modes: `$HOME/.claude/rules/figma-pipeline.md` "MUST: Figma MCP-first (BLOCKING)". Phase wiring: `$HOME/.claude/multi-agent-refs/phases/phase-
|
|
17
|
+
> **MUST: Figma MCP-first (BLOCKING).** If the task references any Figma frame (URL, node ID, or "from the design"), the Dev phase MUST call `mcp__claude_ai_Figma__get_design_context` for every frame BEFORE writing a single Composable line. Use the `CodeConnectSnippet` component name verbatim - no sound-alike substitutions. Authentication failure is not a skip path. Full rule, trigger conditions, and gate failure modes: `$HOME/.claude/rules/figma-pipeline.md` "MUST: Figma MCP-first (BLOCKING)". Phase wiring: `$HOME/.claude/multi-agent-refs/phases/phase-2-dev.md` "MUST: Figma MCP-first (BLOCKING pre-step)".
|
|
18
18
|
|
|
19
19
|
When the task involves creating an Android UI component (Jetpack Compose), follow this architecture.
|
|
20
20
|
|
|
@@ -19,16 +19,16 @@ Standalone audit commands - runs directly via Bash, **no MCP server dependency
|
|
|
19
19
|
**These audits are on-demand.** They run when:
|
|
20
20
|
|
|
21
21
|
1. User explicitly requests: `/multi-agent test "accessibility"`, `/multi-agent test "store-ready"`
|
|
22
|
-
2. User asks during Phase
|
|
22
|
+
2. User asks during the Phase 3 user test: "run accessibility audit", "check store compliance"
|
|
23
23
|
3. Pipeline suggests and user confirms: "UI changes detected - want to run accessibility audit?"
|
|
24
24
|
|
|
25
|
-
**Pipeline never runs audits without user intent.** Phase
|
|
25
|
+
**Pipeline never runs audits without user intent.** Phase 3 does code-level review (free, automatic) and the device-level audit only when requested - both live in Review now, at different steps, which is why "Review ran" does not mean a device was touched.
|
|
26
26
|
|
|
27
27
|
---
|
|
28
28
|
|
|
29
29
|
### iOS Accessibility Audit
|
|
30
30
|
|
|
31
|
-
**When**: Phase
|
|
31
|
+
**When**: Phase 3 user test - user requests, app is running on simulator
|
|
32
32
|
**What it checks**: Missing labels, small tap targets (<44pt), missing identifiers
|
|
33
33
|
|
|
34
34
|
**How to run** (requires ui-tree-dumper.swift in project or ~/.claude/scripts/):
|
|
@@ -73,7 +73,7 @@ Accessibility Audit:
|
|
|
73
73
|
|
|
74
74
|
### Android Accessibility Audit
|
|
75
75
|
|
|
76
|
-
**When**: Phase
|
|
76
|
+
**When**: Phase 3 user test - user requests, app is running on emulator
|
|
77
77
|
**What it checks**: Missing contentDescription, small touch targets (<48dp), missing resource-id
|
|
78
78
|
|
|
79
79
|
```bash
|
|
@@ -98,7 +98,7 @@ cat /tmp/_audit_ui.xml
|
|
|
98
98
|
|
|
99
99
|
### iOS Biometric Test
|
|
100
100
|
|
|
101
|
-
**When**: Phase
|
|
101
|
+
**When**: Phase 3 user test - auth flow testing
|
|
102
102
|
|
|
103
103
|
```bash
|
|
104
104
|
DEVICE_ID=$(xcrun simctl list devices booted -j | python3 -c "import sys,json; devs=json.load(sys.stdin)['devices']; print(next(d['udid'] for ds in devs.values() for d in ds if d['state']=='Booted'))")
|
|
@@ -119,7 +119,7 @@ xcrun simctl keychain $DEVICE_ID biometric-match --face --no-match
|
|
|
119
119
|
|
|
120
120
|
### Android Launch Time
|
|
121
121
|
|
|
122
|
-
**When**: Phase
|
|
122
|
+
**When**: Phase 3 user test - performance baseline
|
|
123
123
|
|
|
124
124
|
```bash
|
|
125
125
|
# Force stop first (cold start)
|
|
@@ -143,7 +143,7 @@ adb shell am start -W -n {package_name}/.MainActivity 2>&1
|
|
|
143
143
|
|
|
144
144
|
### iOS Archive Audit (App Store Compliance)
|
|
145
145
|
|
|
146
|
-
**When**: Phase
|
|
146
|
+
**When**: Phase 4 - release branches only, user confirms
|
|
147
147
|
**Input**: Path to .xcarchive
|
|
148
148
|
|
|
149
149
|
```bash
|
|
@@ -198,7 +198,7 @@ ls "$APP_DIR/Frameworks/" 2>/dev/null
|
|
|
198
198
|
|
|
199
199
|
### Android APK Audit (Play Store Compliance)
|
|
200
200
|
|
|
201
|
-
**When**: Phase
|
|
201
|
+
**When**: Phase 4 - release branches only, user confirms
|
|
202
202
|
**Input**: Path to .apk
|
|
203
203
|
|
|
204
204
|
```bash
|
|
@@ -238,11 +238,11 @@ unzip -l "$APK" 2>/dev/null | grep "classes.*\.dex" | wc -l
|
|
|
238
238
|
|
|
239
239
|
| Phase | What Happens | Method |
|
|
240
240
|
| ---------------- | --------------------------------------------------- | ------------------------------- |
|
|
241
|
-
| Phase
|
|
242
|
-
| Phase
|
|
243
|
-
| Phase
|
|
244
|
-
| Phase
|
|
245
|
-
| Phase
|
|
241
|
+
| Phase 3 (Review) | Accessibility check - **code-level only** | AI reads source code, no device |
|
|
242
|
+
| Phase 3 (user test) | Accessibility audit - **device-level, on-demand** | Bash commands above |
|
|
243
|
+
| Phase 3 (user test) | Biometric test - **on-demand** | `xcrun simctl keychain` |
|
|
244
|
+
| Phase 3 (user test) | Launch time - **on-demand** | `adb shell am start -W` |
|
|
245
|
+
| Phase 4 (Commit) | Archive/APK audit - **release branches, on-demand** | Bash commands above |
|
|
246
246
|
|
|
247
247
|
### Graceful Degradation
|
|
248
248
|
|
|
@@ -124,10 +124,10 @@ Token resolution: `gh auth status` for the active GitHub account selected in Pha
|
|
|
124
124
|
|
|
125
125
|
## Pairing with the Progress flag updater
|
|
126
126
|
|
|
127
|
-
Every issue comment post is paired with `$HOME/.claude/scripts/update-issue-progress.sh "$TASK_ID"` in the same Phase
|
|
127
|
+
Every issue comment post is paired with `$HOME/.claude/scripts/update-issue-progress.sh "$TASK_ID"` in the same Phase 5 step. Order: comment FIRST (so the timestamp marks the run), flags SECOND (so the body diff is one logical change).
|
|
128
128
|
|
|
129
129
|
```bash
|
|
130
|
-
# Phase
|
|
130
|
+
# Phase 5 Step 5 - issue channel
|
|
131
131
|
gh issue comment "$ISSUE_NUMBER" --repo "$ORG/$REPO" --body-file /tmp/channels-$TASK_ID-issue.md
|
|
132
132
|
bash $HOME/.claude/scripts/update-issue-progress.sh "$TASK_ID"
|
|
133
133
|
```
|
|
@@ -42,7 +42,7 @@ it is the PR body (`channels/pr.md`).
|
|
|
42
42
|
|
|
43
43
|
**`summary`** - 2-5 sentences in `outputLanguage`. What changed, why, and the user-visible impact. No "we", no marketing tone. Past tense (the work is done at the time the comment goes up).
|
|
44
44
|
|
|
45
|
-
**Visual evidence inside these sections.** When `state.visualEvidence` carries artefacts, they render INSIDE `summary` and `test_scenarios` - never as a section of their own, which the fixed section order forbids. Phase
|
|
45
|
+
**Visual evidence inside these sections.** When `state.visualEvidence` carries artefacts, they render INSIDE `summary` and `test_scenarios` - never as a section of their own, which the fixed section order forbids. Phase 4 Step 2.9 has already uploaded them and written the returned name to `visualEvidence.*[].jiraFilename`: reference that name, and call `jira-attach.sh <issue> <file>...` only for an artefact whose `jiraFilename` is absent. Uploading unconditionally here attaches every file a second time whenever the comment is re-rendered - which is exactly what a post-hoc `/multi-agent:channels` run does.
|
|
46
46
|
|
|
47
47
|
- `summary`, after its sentences: one line naming the pair in `outputLanguage` (`Düzeltme öncesi / Düzeltme sonrası`), then the thumbnails on the next line - `!<file>-before.png|thumbnail! !<file>-after.png|thumbnail!`.
|
|
48
48
|
- `test_scenarios`, under the scenario the recording demonstrates: `!<file>-flow.mp4!` plus one line stating the tier used.
|
|
@@ -191,7 +191,7 @@ The adapter prepends the linked PR URL on the **first line** so reviewers can ju
|
|
|
191
191
|
```
|
|
192
192
|
PR: https://github.com/<org>/<repo>/pull/4321
|
|
193
193
|
|
|
194
|
-
Phase
|
|
194
|
+
Phase 3 review accepted 2 findings...
|
|
195
195
|
```
|
|
196
196
|
|
|
197
197
|
In multi-repo mode, `channels-multi-repo.sh render-jira <state> <body>` prepends a bulleted `* PR:` list - primary first, extras after. Single-repo tasks fall through to the unchanged body.
|
|
@@ -255,6 +255,6 @@ When the **Wiki** adapter writes pages on the same run AND `prefs.global.wikiToJ
|
|
|
255
255
|
- UTF-8 in, UTF-8 out - the body file is UTF-8 and `--data-binary` ships its bytes verbatim. Never round-trip the body through `unicode_escape`, `latin-1`, or any re-encode step, and never hand-roll a Python/curl helper that re-decodes it: that mangles Turkish chars (ç ş ı ö ü ğ) into mojibake (`Çözüm` → `Ãözüm`). Use the `jq --rawfile` + `--data-binary @file` path above as-is. Same rule for the PR / Confluence / Wiki adapters.
|
|
256
256
|
- Section order is fixed: `summary` → `test_scenarios` → `context_refs`. Never insert sections between them; never reorder.
|
|
257
257
|
- Humanizer pass runs **after** body assembly and **before** wiki-markup conversion. Tone target: informal but technical. No marketing voice, no "we are excited", no "I have...".
|
|
258
|
-
- **No decorative glyphs anywhere in the comment body** - neither emotive ( ) nor status glyphs ([done] [pending] failed skipped active ). The comment is plain technical prose. Status is written in words: `[done]` / `[pending]`, and `done · active · failed · skipped · pending` in the phase strip. This applies to every channel, not only Jira - see `channels/README` note in `phase-
|
|
258
|
+
- **No decorative glyphs anywhere in the comment body** - neither emotive ( ) nor status glyphs ([done] [pending] failed skipped active ). The comment is plain technical prose. Status is written in words: `[done]` / `[pending]`, and `done · active · failed · skipped · pending` in the phase strip. This applies to every channel, not only Jira - see `channels/README` note in `phase-5-report.md`.
|
|
259
259
|
- Body content language follows `prefs.global.outputLanguage`. Code identifiers, file paths, type names, branch names, and the wiki-markup syntax stay verbatim. The `promptLanguage="en"` lock means any LLM prompt that produces the body is in English; the body itself is then rendered in the user's language.
|
|
260
260
|
- Adapter failures are non-blocking - a missing token or 401 returns `skipped`/`failed`, the loop keeps going for PR / Confluence / Wiki.
|
|
@@ -45,7 +45,7 @@ all - it is the section whose absence over there is the point.
|
|
|
45
45
|
|
|
46
46
|
**`technical`** - the account for someone holding the diff: a short paragraph on the mechanism (what the code was actually doing wrong, or what the new code does), then the per-file bullets, then one line of diff stat (`2 files, 8 deletions, 0 insertions`). Where a change is safe for a reason that is not obvious from the diff - an equality relation preserved, an invariant kept, a call site left alone deliberately - that reason belongs here in a sentence, because it is the question the reviewer would otherwise ask in a comment. Tables are welcome when several symbols share a property worth listing side by side.
|
|
47
47
|
|
|
48
|
-
The bullet list is one item per logically distinct change. Each bullet starts with the touched component and ends with a one-line "what". The source is `$WORKTREE/.pipeline/scope-check.json` `files[].reason` (Phase
|
|
48
|
+
The bullet list is one item per logically distinct change. Each bullet starts with the touched component and ends with a one-line "what". The source is `$WORKTREE/.pipeline/scope-check.json` `files[].reason` (Phase 2 Step 3.7): a file the dev could not justify there is a file this list cannot describe either, so the bullet quotes the gate output instead of inventing a reason. Use the stack's native file extensions / module paths - the example below shows the **shape**, not a stack lock-in:
|
|
49
49
|
|
|
50
50
|
```markdown
|
|
51
51
|
## Changes
|
|
@@ -135,7 +135,7 @@ The base sha matters because "it builds" is a claim about a merge base, and the
|
|
|
135
135
|
|
|
136
136
|
Pick commands for the project's stack - the pipeline supports iOS (Swift/Xcode), Android (Gradle), web (npm/pnpm/yarn) and backend (pytest/jest/go test/etc). Multi-repo PRs (one PR per repo) emit the commands for that repo's stack only - never mix iOS + Android commands into a single PR body.
|
|
137
137
|
|
|
138
|
-
**`risk`** - only when `state.diffRisk.signals` (Phase
|
|
138
|
+
**`risk`** - only when `state.diffRisk.signals` (Phase 3 Step 1.75) contains a high-stakes signal. Four fixed lines, each answered, never left as a placeholder; the source is Phase 1 `touchedAreas` plus the signals themselves, and when a signal is present the absence of this section is a Phase 4 Step 3 blocker:
|
|
139
139
|
|
|
140
140
|
```markdown
|
|
141
141
|
## Risk and Security
|
|
@@ -146,7 +146,7 @@ Pick commands for the project's stack - the pipeline supports iOS (Swift/Xcode
|
|
|
146
146
|
- Rollback: feature flag <name> | git revert <sha> | none, and why
|
|
147
147
|
```
|
|
148
148
|
|
|
149
|
-
**`visuals`** - only when `state.visualEvidence.required`. What this section can show depends on where the artefacts are hosted, which Phase
|
|
149
|
+
**`visuals`** - only when `state.visualEvidence.required`. What this section can show depends on where the artefacts are hosted, which Phase 4 resolves into `state.visualEvidence.host`. Render the form for that host and no other.
|
|
150
150
|
|
|
151
151
|
**`host: jira`.** Filenames, never URLs. A Jira attachment URL is auth-gated and renders as a broken image for anyone reading the PR outside a Jira session, and a broken image is worse than a filename because it looks like the evidence is missing.
|
|
152
152
|
|
|
@@ -192,7 +192,7 @@ Pick commands for the project's stack - the pipeline supports iOS (Swift/Xcode
|
|
|
192
192
|
|
|
193
193
|
**Video is Jira-only.** On a GitHub-hosted run no recording is made and none is published: an mp4 behind a blob link is a download, not something a reviewer opens mid-review, and paying for a recording nobody watches is worse than saying plainly that there is none. The gap line carries that reason.
|
|
194
194
|
|
|
195
|
-
Every `state.visualEvidence.gaps[]` entry becomes its own line with the reason instead of a filename (`- Before: none - the ticket carries no image attachment`). Phase
|
|
195
|
+
Every `state.visualEvidence.gaps[]` entry becomes its own line with the reason instead of a filename (`- Before: none - the ticket carries no image attachment`). Phase 4 Step 3 blocks on a required artefact that is neither listed nor explained. Contract: `$HOME/.claude/multi-agent-refs/features/visual-evidence.md`.
|
|
196
196
|
|
|
197
197
|
**`dependencies`** - only when `Package.swift` / `Podfile` / `build.gradle` / `package.json` changed. Each entry: `package@old → new - reason`.
|
|
198
198
|
|
|
@@ -64,4 +64,4 @@ Adapter implementation chooses the right git push target + commit message format
|
|
|
64
64
|
- Screenshots cover light/dark + LTR/RTL - wiki adapter refuses to commit if any quadrant is missing.
|
|
65
65
|
- Body content language follows `prefs.global.outputLanguage`. Code identifiers, file paths, type names, design token names, and Markdown formatting stay verbatim across languages (wiki pages are `.md` files - "wiki markup" in this doc set means Jira's dialect, which never appears here). The template (this doc) is English because `promptLanguage="en"` is locked.
|
|
66
66
|
- No decorative/emotive emoji or smileys ( ) in the page prose. Only functional/structural marks a fixed template defines are allowed.
|
|
67
|
-
- Autopilot always pauses at the channels menu (per `phase-
|
|
67
|
+
- Autopilot always pauses at the channels menu (per `phase-5-report.md` autopilot contract) - even in autopilot mode the user gets to confirm wiki scope.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Component Dispatch (Phase
|
|
1
|
+
# Component Dispatch (Phase 2 short-circuit)
|
|
2
2
|
|
|
3
3
|
<!-- toc -->
|
|
4
4
|
- [Entry conditions](#entry-conditions)
|
|
@@ -13,11 +13,11 @@
|
|
|
13
13
|
|
|
14
14
|
> **TLDR** - When `taskType === "component"` (Figma URL in task description or instruction-driven figma workflow), multi-agent Phase 3 **does not run the TDD loop**. It delegates the entire phase to the enabled `ai-<platform>-toolkit` **marketplace plugin's** component skill (`create-component`, falling back to `create-ui-component`) via the Skill tool. Implementation lives in the plugin; multi-agent's job is classification, dispatch, and state report. The pipeline no longer bundles its own `figma-to-component` orchestrator - component skills live in one place, the plugin marketplace.
|
|
15
15
|
|
|
16
|
-
This doc is referenced from `$HOME/.claude/multi-agent-refs/phases/phase-
|
|
16
|
+
This doc is referenced from `$HOME/.claude/multi-agent-refs/phases/phase-2-dev.md`. Keeping it separate lets `phase-2-dev.md` remain tight (it's already the largest phase doc) and gives the orchestrator-report contract a stable URL for both Claude-side and Copilot-side implementations.
|
|
17
17
|
|
|
18
18
|
## Entry conditions
|
|
19
19
|
|
|
20
|
-
Phase
|
|
20
|
+
Phase 2 checks, in order:
|
|
21
21
|
|
|
22
22
|
1. `agent-state.json` has `taskType: "component"` (set by Phase 0 Step 7).
|
|
23
23
|
2. `agent-state.json` has a non-null `figmaUrl`.
|
|
@@ -35,7 +35,7 @@ naming the missing field and pointing at `phase0-exit-gate.mjs`.
|
|
|
35
35
|
> publish and no component review. Spacing came out `16` where the frame said
|
|
36
36
|
> `Spacing/12`, and half the branch's commits were rework.
|
|
37
37
|
>
|
|
38
|
-
> The Phase 0 exit gate now prevents reaching Phase
|
|
38
|
+
> The Phase 0 exit gate now prevents reaching Phase 2 in that state at all; this
|
|
39
39
|
> halt is the second line of defence. A component task that cannot be dispatched as
|
|
40
40
|
> one must fail loudly, because the generic path produces artefacts that look
|
|
41
41
|
> finished and are not.
|
|
@@ -109,7 +109,7 @@ When multi-repo mode is active (`state.projects.length > 1`), the dispatch layer
|
|
|
109
109
|
- View / Configuration / Modifiers / Preview → `repos.components`
|
|
110
110
|
- Wiki markdown → `repos.wiki` (if `wiki.mode === submodule` or `separate-repo`) or `repos.components/.wiki/components/` (if `wiki.mode === in-repo`)
|
|
111
111
|
|
|
112
|
-
Multi-agent does **not** split the component task into per-repo Phase
|
|
112
|
+
Multi-agent does **not** split the component task into per-repo Phase 2 runs - the dispatch layer sequences the plugin invocation so token writes to `common` precede component reads in `components`. If the plugin skill is not repo-graph aware, dispatch runs it against `repos.components` and performs the `common` token/key writes itself around the call.
|
|
113
113
|
|
|
114
114
|
## Failure + resume
|
|
115
115
|
|
|
@@ -118,13 +118,13 @@ On failure (the plugin skill returns an unrecoverable build/test error, or the d
|
|
|
118
118
|
1. The dispatch layer persists `{error, buildLog, testLog}` to `state.phases["3"].errors[]`.
|
|
119
119
|
2. Multi-agent increments `state.phases["3"].retryCount`.
|
|
120
120
|
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.
|
|
121
|
-
4. Hard kill at `retryCount === 3` → surface the errors to the user, halt Phase
|
|
121
|
+
4. Hard kill at `retryCount === 3` → surface the errors to the user, halt Phase 2. Do not loop indefinitely.
|
|
122
122
|
|
|
123
123
|
## Short-run behaviour
|
|
124
124
|
|
|
125
|
-
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
|
|
125
|
+
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 5). If the plugin does not honor a `mode` hint, dispatch simply skips the post-build wiki step itself.
|
|
126
126
|
|
|
127
|
-
Phase
|
|
127
|
+
Phase 3 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.
|
|
128
128
|
|
|
129
129
|
## Cross-CLI behaviour (intentional divergence)
|
|
130
130
|
|
|
@@ -154,7 +154,7 @@ Apply platform default + open Section 20 risk row
|
|
|
154
154
|
| Backend | not applicable | | |
|
|
155
155
|
| Web | not applicable | (Storybook stories live in `.stories.tsx` files, tracked under C2 conventions) | |
|
|
156
156
|
|
|
157
|
-
Detection: scan up to 10 SwiftUI view files in the candidate set; majority pick wins. Confidence `high` if 5+ matching examples, `medium` if 3-4, `low` if 2, `none` if 0 SwiftUI views found (Pass B then omits Section 13.6 with `(N/A: UIKit-only feature)` note per Locked
|
|
157
|
+
Detection: scan up to 10 SwiftUI view files in the candidate set; majority pick wins. Confidence `high` if 5+ matching examples, `medium` if 3-4, `low` if 2, `none` if 0 SwiftUI views found (Pass B then omits Section 13.6 with `(N/A: UIKit-only feature)` note per Locked 28).
|
|
158
158
|
|
|
159
159
|
## C7 - Dependency Injection
|
|
160
160
|
|
|
@@ -191,4 +191,4 @@ When the team standardizes on a different default, update this file directly and
|
|
|
191
191
|
- Locked 22: convention extraction mandatory (Phase 1c)
|
|
192
192
|
- Locked 23: convention fallback opens a risk row
|
|
193
193
|
- Locked 24: every Pass B cell carries a footnote
|
|
194
|
-
- Locked
|
|
194
|
+
- Locked 27: SwiftUI Preview block mandatory for iOS SwiftUI views (Section 13.6, C8 convention)
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
# Cross-CLI Contract (Claude Code · Copilot CLI · Codex CLI)
|
|
2
2
|
|
|
3
3
|
<!-- toc -->
|
|
4
|
-
- [1. Command Inventory (
|
|
4
|
+
- [1. Command Inventory (60 commands)](#1-command-inventory-60-commands)
|
|
5
5
|
- [2. Canonical Placeholder Vocabulary](#2-canonical-placeholder-vocabulary)
|
|
6
6
|
- [2.6 Intentional structural divergence - thin dispatcher vs inlined orchestrator](#26-intentional-structural-divergence---thin-dispatcher-vs-inlined-orchestrator)
|
|
7
|
+
- [2.7 One command, three different meanings: `/multi-agent:model`](#27-one-command-three-different-meanings-multi-agentmodel)
|
|
7
8
|
- [3. Frontmatter Transform Rules (Claude ↔ Copilot)](#3-frontmatter-transform-rules-claude-copilot)
|
|
8
9
|
- [4. Progress Signalling Parity](#4-progress-signalling-parity)
|
|
9
10
|
- [5. Argument Parsing Invariants](#5-argument-parsing-invariants)
|
|
@@ -19,16 +20,17 @@
|
|
|
19
20
|
|
|
20
21
|
---
|
|
21
22
|
|
|
22
|
-
## 1. Command Inventory (
|
|
23
|
+
## 1. Command Inventory (60 commands)
|
|
23
24
|
|
|
24
25
|
```
|
|
25
26
|
analysis, analysis-jira, analysis-resolve, autopilot, autopilot-off,
|
|
26
27
|
autopilot-on, autopilot-status, build-optimize, channels, complaint-analysis,
|
|
27
28
|
create-jira, design-check, diff-explain, doctor, feedback, forget,
|
|
28
29
|
garbage-collect, graph, help, ios-coding-standard, issue, jira, kill,
|
|
29
|
-
language, local, local-autopilot, log, manual-test, prune-logs,
|
|
30
|
+
language, local, local-autopilot, log, manual-test, model, prune-logs,
|
|
30
31
|
prune-prompts, purge, refactor, resume, resume-local, review,
|
|
31
|
-
review-analysis, review-issue, review-jira,
|
|
32
|
+
review-analysis, review-issue, review-jira, route-off, route-on,
|
|
33
|
+
route-status, routines, save, scan, search,
|
|
32
34
|
setup, stack, status, steer, store-ready, sync, test, test-accessibility,
|
|
33
35
|
test-dark-mode, test-dynamic-type, test-screenshots, testflight-validation,
|
|
34
36
|
uninstall, update
|
|
@@ -199,7 +201,7 @@ on skill directories would demand exactly the layout that breaks it.
|
|
|
199
201
|
|
|
200
202
|
**What must stay identical** (byte-level) across the two files:
|
|
201
203
|
|
|
202
|
-
- Phase canonical labels (Phase 0-
|
|
204
|
+
- Phase canonical labels (Phase 0-5)
|
|
203
205
|
- Input parsing table (Section 5 of this doc)
|
|
204
206
|
- Routing decisions for each input type
|
|
205
207
|
- Placeholder vocabulary (Section 2 of this doc)
|
|
@@ -216,7 +218,7 @@ Future changes that break an item in the "stay identical" list must update **bot
|
|
|
216
218
|
|
|
217
219
|
### Panel diversity per host
|
|
218
220
|
|
|
219
|
-
Phase
|
|
221
|
+
Phase 3 runs three reviewers everywhere, but the diversity those three buy is not the
|
|
220
222
|
same on every host. Copilot CLI gets cross-VENDOR disagreement for free: GPT-5.4 sits
|
|
221
223
|
beside two Claude models. Claude Code and Codex each run a one-vendor panel - three
|
|
222
224
|
Anthropic models on one, three OpenAI models on the other - so the same three-way
|
|
@@ -236,6 +238,29 @@ members available there are closer to each other than Fable and Sonnet are. That
|
|
|
236
238
|
weaker axis, not an equivalent one, and treating it as equivalent is the error this
|
|
237
239
|
section exists to prevent.
|
|
238
240
|
|
|
241
|
+
## 2.7 One command, three different meanings: `/multi-agent:model`
|
|
242
|
+
|
|
243
|
+
Most commands do the same thing on all three hosts. This one does not, and the
|
|
244
|
+
divergence is stated here rather than discovered at runtime, because a command
|
|
245
|
+
that quietly no-ops is worse than one that says it cannot act.
|
|
246
|
+
|
|
247
|
+
| Host | What `model on|off` does | Why |
|
|
248
|
+
|---|---|---|
|
|
249
|
+
| Claude Code | live switch: flips `modelFallback.fableEnabled` and realigns `costBudget.pricingModel` | the only host where the `fable` rung is Fable 5 |
|
|
250
|
+
| Copilot CLI | writes the preference, changes no dispatch | Fable 5 is not offered there; its personas never sat on this rung |
|
|
251
|
+
| Codex CLI | writes the preference, changes no dispatch, **deliberately** | the `fable` rung on Codex means `gpt-5.6 @ xhigh` - a different model on a different account. A knob named after an Anthropic model must not silently retune a Codex run |
|
|
252
|
+
|
|
253
|
+
`model-rung.sh` prints which of the three it is on every invocation. The rule it
|
|
254
|
+
follows: report the host's actual behaviour, never claim a change that did not
|
|
255
|
+
happen.
|
|
256
|
+
|
|
257
|
+
The routing trio (`route-on`, `route-off`, `route-status`) has no such split -
|
|
258
|
+
it writes `prefs.global.modelRouting` identically everywhere. Its honest limit is
|
|
259
|
+
different and applies on every host: a subagent cannot be dispatched to a
|
|
260
|
+
non-Anthropic model, because subagent dispatch belongs to the host. External
|
|
261
|
+
providers are reachable only where the pipeline makes the HTTP call itself
|
|
262
|
+
(`bulk-read.sh`, `research_ask`). `route-status` prints that on every run.
|
|
263
|
+
|
|
239
264
|
## 3. Frontmatter Transform Rules (Claude ↔ Copilot)
|
|
240
265
|
|
|
241
266
|
Each file has a different frontmatter schema. The sync flow transforms between them:
|
|
@@ -50,7 +50,7 @@ No forward check can see the second one, and it is the failure mode of building
|
|
|
50
50
|
a tree from a model's reading rather than from the document's own ids.
|
|
51
51
|
|
|
52
52
|
The atom is `BR-<slug>-NN` in the global profile and `FG-NN` in the corporate
|
|
53
|
-
one; the group is the `BR-<slug>` prefix, or `UC-NN`. Locked
|
|
53
|
+
one; the group is the `BR-<slug>` prefix, or `UC-NN`. Locked 30 guarantees both
|
|
54
54
|
exist, which is why the tree can be derived rather than invented.
|
|
55
55
|
|
|
56
56
|
`coverageOf()` is exported and tested directly. The planner cannot emit an
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
- [Two more things a long-running runner needs](#two-more-things-a-long-running-runner-needs)
|
|
10
10
|
<!-- /toc -->
|
|
11
11
|
|
|
12
|
-
**Pattern**: autopilot runs with zero interaction, which is exactly when a silent failure loop is most expensive - an agent can burn a budget re-attempting the same broken fix, or thrash between two phases, with nobody watching. A circuit-breaker converts "keep going no matter what" into "keep going until a defined unsafe condition, then halt and hand back to the user." This is the sanctioned autopilot pause (same class as the Phase
|
|
12
|
+
**Pattern**: autopilot runs with zero interaction, which is exactly when a silent failure loop is most expensive - an agent can burn a budget re-attempting the same broken fix, or thrash between two phases, with nobody watching. A circuit-breaker converts "keep going no matter what" into "keep going until a defined unsafe condition, then halt and hand back to the user." This is the sanctioned autopilot pause (same class as the Phase 5 channels pause): the run stops, records why, and waits for an explicit `resume`.
|
|
13
13
|
|
|
14
14
|
**Gated by `prefs.global.autopilotCircuitBreaker`** (`enabled` default true, `identicalFindingCycles` default 2, `maxReworkCycles` default 3; `schemas/prefs.schema.json`). Halting is always safe, so the breaker itself defaults on. Disable per-run only with an explicit override. Complements, does not replace, the existing autopilot safety rules (build-fail max 3 retries, Phase 4 blocking-finding rework, destructive-op confirmations).
|
|
15
15
|
|
|
@@ -23,7 +23,7 @@ Any one trips the breaker. All are evaluated from `agent-state.json` + telemetry
|
|
|
23
23
|
| 2 | **Identical repeated failure** | same normalized build-error signature, or the same Phase 4 finding fingerprint, recurs across consecutive Phase 3 rework cycles | 2 cycles |
|
|
24
24
|
| 3 | **Rework storm** | Phase 4 -> Phase 3 rework cycles exceed the cap (distinct from the build-retry cap) | `maxReworkCycles` = 3 |
|
|
25
25
|
| 4 | **Cost drift** | cumulative spend crosses the `costBudget` ceiling, or the projected next-phase spend would exceed it, after model-fallback has already downgraded | `costBudget` ceiling |
|
|
26
|
-
| 5 | **Merge/rebase conflict** | Phase
|
|
26
|
+
| 5 | **Merge/rebase conflict** | Phase 4 push blocked by a conflict that requires history reconciliation | any conflict |
|
|
27
27
|
|
|
28
28
|
Trigger 2 is the key addition over the plain build-retry cap: a build can "fail differently" three times (legitimate iteration) or "fail identically" twice (stuck). Only the identical-failure case is a stall; the retry cap catches the rest.
|
|
29
29
|
|
|
@@ -31,12 +31,12 @@ Trigger 2 is the key addition over the plain build-retry cap: a build can "fail
|
|
|
31
31
|
|
|
32
32
|
| Trigger | Evaluated by | Status |
|
|
33
33
|
|---|---|---|
|
|
34
|
-
| 2, finding half | `review-delta.mjs` exit 3 at Phase
|
|
34
|
+
| 2, finding half | `review-delta.mjs` exit 3 at Phase 3 Step 3.8: a blocking/important finding whose `fingerprint` (finding-fingerprint.mjs) stays in the accepted set for `identicalFindingCycles` consecutive rounds | **code** (v16.20.0) |
|
|
35
35
|
| 3 | Phase 3 re-entry item 6: the `retryCount === 3` hard-kill records the trip | **code** (v16.20.0) |
|
|
36
36
|
| 2, build-error half | needs a build-log signature normaliser | documented behaviour, no script yet |
|
|
37
37
|
| 1 | needs checkpoint-to-checkpoint artifact diffing | documented behaviour, no script yet |
|
|
38
38
|
| 4 | belongs to `cost-budget-check.mjs` | documented behaviour, no script yet |
|
|
39
|
-
| 5 | Phase
|
|
39
|
+
| 5 | Phase 4 push | documented behaviour, no script yet |
|
|
40
40
|
|
|
41
41
|
State shape: `state.circuitBreaker = {tripped, trigger, detail, checkpoint: {phase, step, iteration}, trippedAt, counters: {identicalFindingCycles, reworkCycles}}` (`schemas/agent-state.schema.json`). The per-round classification the finding half reads lives in `state.reviewIterations[i].delta` (`new`, `stillPresent`, `resolved`, `downgraded`, `recurrence`, `plateau`). `smoke-autopilot-circuit-breaker.sh` asserts the schema fields, the scripts and the phase wiring, not only this prose.
|
|
42
42
|
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
## Code Graph (Phase 1 Step 2.6 + Phase
|
|
1
|
+
## Code Graph (Phase 1 Step 2.6 + Phase 5 Step 3)
|
|
2
2
|
|
|
3
3
|
<!-- toc -->
|
|
4
4
|
- [Phase 1 Step 2.6 - query before dispatching Explore](#phase-1-step-26---query-before-dispatching-explore)
|
|
5
|
-
- [Phase
|
|
5
|
+
- [Phase 5 Step 3 - refresh after the branch changed code](#phase-5-step-3---refresh-after-the-branch-changed-code)
|
|
6
6
|
- [What the report answers that a file-level view cannot](#what-the-report-answers-that-a-file-level-view-cannot)
|
|
7
7
|
- [The graph is drawable, and one place already asks for it](#the-graph-is-drawable-and-one-place-already-asks-for-it)
|
|
8
8
|
<!-- /toc -->
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
A deterministic, LLM-free map of what a repo declares and what refers to what,
|
|
11
11
|
written to `~/.claude/knowledge/<project>/code-graph.json`. Gated by
|
|
12
12
|
`prefs.global.codeGraph.enabled` (default `false`); with it off, Phase 1 and
|
|
13
|
-
Phase
|
|
13
|
+
Phase 5 behave exactly as they did before. Design, trade and measurements:
|
|
14
14
|
`docs/adr/0010-own-code-graph.md`.
|
|
15
15
|
|
|
16
16
|
### Phase 1 Step 2.6 - query before dispatching Explore
|
|
@@ -38,7 +38,7 @@ at a graph that was never built. Pass it.
|
|
|
38
38
|
|
|
39
39
|
Build when there is no graph at all, and when `baseCommit` no longer matches
|
|
40
40
|
HEAD. The missing case is the one that matters in practice: `architecture.md`
|
|
41
|
-
and its siblings are written in Phase
|
|
41
|
+
and its siblings are written in Phase 5, which is the phase a run is least
|
|
42
42
|
likely to reach, so a repo can have a long history of tasks and an empty
|
|
43
43
|
knowledge directory. The graph must not inherit that. `--status` exits 1 on a
|
|
44
44
|
missing file, and that exit means build, not skip.
|
|
@@ -56,7 +56,7 @@ already spells out. Measured on a 4,300-file Swift app at a fixed 30k retrieval
|
|
|
56
56
|
budget, it roughly doubled coverage at under half the cost on domain-word
|
|
57
57
|
questions and lost narrowly to `grep -lw` on exact type names.
|
|
58
58
|
|
|
59
|
-
### Phase
|
|
59
|
+
### Phase 5 Step 3 - refresh after the branch changed code
|
|
60
60
|
|
|
61
61
|
Runs when `prefs.global.codeGraph.enabled` and `prefs.global.codeGraph.autoRefresh`
|
|
62
62
|
are both true.
|
|
@@ -21,7 +21,7 @@ Derived generically from an upstream corporate screen-QA tool (recorded in
|
|
|
21
21
|
catalogs and product examples are not, and were not taken - section 7 says what
|
|
22
22
|
replaces them.
|
|
23
23
|
|
|
24
|
-
Consumers: `/multi-agent:design-check` (the runner), Phase
|
|
24
|
+
Consumers: `/multi-agent:design-check` (the runner), Phase 3 review when a UI
|
|
25
25
|
diff is under review, and `features/visual-evidence.md` when a capture has to
|
|
26
26
|
prove a fix. Gate: `smoke-design-conformance.sh`.
|
|
27
27
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
# Feature: Dev Critic (Phase
|
|
1
|
+
# Feature: Dev Critic (Phase 2 Step 3.5 Evaluator-Optimizer)
|
|
2
2
|
|
|
3
|
-
**Pattern**: Anthropic's evaluator-optimizer from "Building Effective Agents" (Dec 2024). Generator (Phase
|
|
3
|
+
**Pattern**: Anthropic's evaluator-optimizer from "Building Effective Agents" (Dec 2024). Generator (Phase 2 Dev) and critic (`agents/dev-critic.md`) loop on deterministic criteria already written in `rules/*.md` before any Phase 3 reviewer call.
|
|
4
4
|
|
|
5
5
|
**Gated by `prefs.global.devCritic.enabled`** (default: `false`). When enabled, after the generator's last edit and BEFORE Phase 4:
|
|
6
6
|
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
|
|
26
26
|
## Telemetry
|
|
27
27
|
|
|
28
|
-
Each critic call emits `dev_critic.call` with `iteration`, `pass`, `gates_failed`, `blocking`, `important`, `duration_ms`, `tokens_in/out`. Phase
|
|
28
|
+
Each critic call emits `dev_critic.call` with `iteration`, `pass`, `gates_failed`, `blocking`, `important`, `duration_ms`, `tokens_in/out`. Phase 5 cost rollup lists these as `phase 3.5` line items so the net saving (Phase 3 reviewer/triage calls avoided) is measurable.
|
|
29
29
|
|
|
30
30
|
## Off by default reason
|
|
31
31
|
|