@mmerterden/multi-agent-pipeline 16.11.0 → 16.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/README.md +5 -3
  3. package/README.tr.md +5 -3
  4. package/docs/adr/0001-three-model-triage.md +5 -0
  5. package/docs/features.md +18 -2
  6. package/package.json +1 -1
  7. package/pipeline/claude-md-template.md +1 -1
  8. package/pipeline/commands/multi-agent/SKILL.md +1 -1
  9. package/pipeline/commands/multi-agent/analysis/SKILL.md +1 -1
  10. package/pipeline/commands/multi-agent/help/SKILL.md +2 -2
  11. package/pipeline/commands/multi-agent/resume-local/SKILL.md +2 -2
  12. package/pipeline/commands/multi-agent/review/SKILL.md +3 -3
  13. package/pipeline/commands/multi-agent/review-analysis/SKILL.md +1 -1
  14. package/pipeline/lib/figma-screenshot.sh +107 -7
  15. package/pipeline/lib/md2confluence-v3.py +133 -25
  16. package/pipeline/multi-agent-refs/analysis/locked.md +4 -3
  17. package/pipeline/multi-agent-refs/analysis/render.md +44 -9
  18. package/pipeline/multi-agent-refs/analysis/review.md +17 -1
  19. package/pipeline/multi-agent-refs/analysis-template-corporate.md +14 -3
  20. package/pipeline/multi-agent-refs/knowledge.md +1 -1
  21. package/pipeline/multi-agent-refs/phases/phase-4-review.md +8 -8
  22. package/pipeline/schemas/analysis-spec.schema.json +2 -0
  23. package/pipeline/schemas/reviewer-output.schema.json +1 -1
  24. package/pipeline/schemas/triage-output.schema.json +1 -1
  25. package/pipeline/scripts/anonymize-findings.mjs +1 -1
  26. package/pipeline/scripts/smoke-cross-cli-behavior.sh +9 -9
  27. package/pipeline/scripts/validate-analysis-doc.mjs +85 -23
  28. package/pipeline/skills/.skills-index.json +2 -2
  29. package/pipeline/skills/shared/README.md +1 -1
  30. package/pipeline/skills/shared/core/multi-agent/SKILL.md +3 -3
  31. package/pipeline/skills/shared/core/multi-agent-help/SKILL.md +2 -2
  32. package/pipeline/skills/shared/core/multi-agent-review/SKILL.md +2 -2
  33. package/pipeline/skills/skills-index.md +1 -1
@@ -24,6 +24,8 @@
24
24
  "awaiting_pass_b_approval",
25
25
  "rendering_pass_b",
26
26
  "drafting",
27
+ "reviewing_draft",
28
+ "reviewing_gaps",
27
29
  "awaiting_output_decision",
28
30
  "dispatching",
29
31
  "reporting",
@@ -3,7 +3,7 @@
3
3
  "$id": "https://github.com/mmerterden/multi-agent-pipeline/pipeline/schemas/reviewer-output.schema.json",
4
4
  "version": "1.1.0",
5
5
  "title": "Multi-Agent Pipeline - Phase 4 reviewer output",
6
- "description": "Contract for a single code-reviewer subagent's JSON output in Phase 4 Step 2. Reviewer set is CLI-aware: Claude Code dispatches 2 parallel reviewers (Fable, Sonnet); Copilot CLI dispatches 3 (Opus, GPT-5.4, Sonnet); Codex CLI dispatches 3 (gpt-5.6 at xhigh, gpt-5.4, gpt-5.6 at medium). Every reviewer must return an object matching this shape before Opus triage merges them. v1.1.0 adds the rule-ID conformance checklist: when the orchestrator supplies a ${CRITERIA} block (Phase 4 Step 1.78), the reviewer must return one conformance row per selected rule ID. Findings alone cannot answer 'was this applied completely' - a reviewer that opened nothing returns the same empty findings array as one that checked everything.",
6
+ "description": "Contract for a single code-reviewer subagent's JSON output in Phase 4 Step 2. Every host dispatches 3 parallel reviewers; the middle slot is CLI-aware: Claude Code (Fable, Opus, Sonnet); Copilot CLI (Opus, GPT-5.4, Sonnet); Codex CLI dispatches 3 (gpt-5.6 at xhigh, gpt-5.4, gpt-5.6 at medium). Every reviewer must return an object matching this shape before Opus triage merges them. v1.1.0 adds the rule-ID conformance checklist: when the orchestrator supplies a ${CRITERIA} block (Phase 4 Step 1.78), the reviewer must return one conformance row per selected rule ID. Findings alone cannot answer 'was this applied completely' - a reviewer that opened nothing returns the same empty findings array as one that checked everything.",
7
7
  "type": "object",
8
8
  "additionalProperties": false,
9
9
  "required": ["findings", "approved"],
@@ -102,7 +102,7 @@
102
102
  "reviewerCount": {
103
103
  "type": "integer",
104
104
  "minimum": 1,
105
- "description": "Reviewers dispatched this iteration (Claude Code = 2, Copilot CLI = 3, Codex CLI = 3)."
105
+ "description": "Reviewers dispatched this iteration (Claude Code = 3, Copilot CLI = 3, Codex CLI = 3)."
106
106
  },
107
107
  "verdict": {
108
108
  "type": "string",
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  // anonymize-findings.mjs - strip reviewer identity before a model judges findings.
3
3
  //
4
- // Phase 4 dispatches 2 reviewers on Claude Code (Fable + Sonnet) and 3 on
4
+ // Phase 4 dispatches 3 reviewers on Claude Code (Fable + Opus + Sonnet) and 3 on
5
5
  // Copilot CLI (GPT + Opus + Sonnet), then hands the merged findings to triage -
6
6
  // Fable on Claude Code, Opus on Copilot. On both sides the triage model is also
7
7
  // one of the reviewers, and Step 3.2 used to label the input "Reviewer 1 +
@@ -185,12 +185,12 @@ else
185
185
  fi
186
186
 
187
187
  # ──────────────────────────────────────────────────────────────────────────
188
- # CLI-aware reviewer-count contract: Claude Code = 2 (Fable + Sonnet), Copilot CLI
188
+ # CLI-aware reviewer-count contract: Claude Code = 3 (Fable + Opus + Sonnet), Copilot CLI
189
189
  # = 3 (Opus + GPT-5.4 + Sonnet), Codex CLI = 3 (gpt-5.6 xhigh + gpt-5.4 + gpt-5.6
190
190
  # medium). Nothing in code enforces the count (the orchestrator dispatches per the
191
191
  # doc), so lock the CONTRACT here against drift across the phase doc, the schema,
192
192
  # and the consensus block.
193
- echo "→ reviewer-count contract (Claude=2, Copilot=3, Codex=3)"
193
+ echo "→ reviewer-count contract (Claude=3, Copilot=3, Codex=3)"
194
194
  # `/multi-agent:update` runs this smoke on the user's machine, where the tree is
195
195
  # ~/.claude/{schemas,multi-agent-refs} and NOT <root>/pipeline/*. Resolving the
196
196
  # root by hand here reported three phantom failures in an install, which reads as
@@ -203,10 +203,10 @@ TRSCHEMA="${MA_SCHEMAS:+$MA_SCHEMAS/triage-output.schema.json}"
203
203
 
204
204
  if [ -z "$P4" ] || [ ! -f "$P4" ]; then
205
205
  echo " ↷ SKIP: phase-4-review.md not present in this $MA_LAYOUT layout"
206
- elif grep -qiE "Claude Code (dispatches|=|:) ?2|2-model" "$P4" \
206
+ elif grep -qiE "Claude Code (dispatches|=|:) ?3|Claude Code dispatches Fable \+ Opus \+ Sonnet" "$P4" \
207
207
  && grep -qiE "Copilot CLI (dispatches|=|:) ?3|3-model" "$P4" \
208
- && grep -qiE "Codex CLI (dispatches|=|:) ?3|Claude Code 2, Copilot CLI 3, Codex CLI 3" "$P4"; then
209
- pass "phase-4-review declares Claude=2 / Copilot=3 / Codex=3 reviewers"
208
+ && grep -qiE "Codex CLI (dispatches|=|:) ?3|Claude Code 3, Copilot CLI 3, Codex CLI 3" "$P4"; then
209
+ pass "phase-4-review declares Claude=3 / Copilot=3 / Codex=3 reviewers"
210
210
  else
211
211
  fail "phase-4-review does not declare the CLI-aware reviewer count for all three hosts"
212
212
  fi
@@ -231,13 +231,13 @@ else
231
231
  fail "reviewer-output schema missing the CLI-aware note"
232
232
  fi
233
233
 
234
- # consensus.reviewerCount must accommodate both 2 and 3 (min 1, no max < 3)
234
+ # consensus.reviewerCount must accommodate 3 on every host (min 1, no max < 3)
235
235
  if [ -z "$TRSCHEMA" ] || [ ! -f "$TRSCHEMA" ]; then
236
236
  echo " ↷ SKIP: triage-output.schema.json not present in this $MA_LAYOUT layout"
237
- elif grep -q '"reviewerCount"' "$TRSCHEMA" && grep -qi "Claude Code = 2, Copilot CLI = 3" "$TRSCHEMA"; then
238
- pass "triage consensus.reviewerCount documents 2 (Claude) and 3 (Copilot)"
237
+ elif grep -q '"reviewerCount"' "$TRSCHEMA" && grep -qi "Claude Code = 3, Copilot CLI = 3" "$TRSCHEMA"; then
238
+ pass "triage consensus.reviewerCount documents 3 reviewers on every host"
239
239
  else
240
- fail "triage consensus.reviewerCount does not document the 2/3 split"
240
+ fail "triage consensus.reviewerCount does not document the 3-reviewer set"
241
241
  fi
242
242
 
243
243
  echo ""
@@ -215,11 +215,15 @@ function main() {
215
215
  }
216
216
  }
217
217
 
218
- // 2a. Corporate profile: every EKLENECEK owes an open question.
218
+ // 2a. Corporate profile: every EKLENECEK owes an open question, by id.
219
219
  //
220
220
  // A placeholder with nobody assigned to resolve it is how "to be filled in"
221
- // reaches production. The pairing is what makes the backbone guarantee worth
222
- // having: the section renders, AND the gap it admits to is tracked.
221
+ // reaches production. This used to pair a gap with Section 20 by matching the
222
+ // section NUMBER inside the risks block, which is ambiguous in both directions:
223
+ // "9" is a substring of "19" and "5.9" of "5.9.5", so the regex grew guards for
224
+ // cases it still could not separate. Stable ids remove the ambiguity the same
225
+ // way IG / UC / FG already do: the body writes EKLENECEK (AS-07) and Section 20
226
+ // defines AS-07, and each side is checked against the other.
223
227
  if (profile === "corporate") {
224
228
  const lines = text.split("\n");
225
229
  const risksStart = lines.findIndex((l) =>
@@ -232,29 +236,61 @@ function main() {
232
236
  risksBlock += `${lines[i]}\n`;
233
237
  }
234
238
  }
235
- let currentSection = null;
236
- const unpaired = new Set();
239
+ const AS_ID = /\bAS-(\d{2,3})\b/g;
240
+ const definedIds = new Set(
241
+ [...risksBlock.matchAll(AS_ID)].map((m) => `AS-${m[1]}`),
242
+ );
243
+ const referencedIds = new Set();
237
244
  for (let i = 0; i < lines.length; i++) {
238
- const m = lines[i].match(/^#{2,4}\s+(\d+(?:\.\d+)*)\.?\s/);
239
- if (m) currentSection = m[1];
240
- if (!lines[i].includes("EKLENECEK")) continue;
241
245
  if (risksStart !== -1 && i > risksStart) continue;
242
- if (!currentSection) continue;
243
- // The number has to stand alone: substring matching would let section "2"
244
- // be satisfied by a "2.3" in some other row, and "9" by a "19". The
245
- // trailing guard rejects a following digit and a following ".<digit>",
246
- // but NOT a sentence-ending period - "etkilediği bölüm 9." is a real
247
- // pairing, and rejecting it would block a correct document.
248
- const token = new RegExp(
249
- `(^|[^\\d.])${currentSection.replace(/\./g, "\\.")}(?!\\d|\\.\\d)`,
250
- "m",
251
- );
252
- if (!token.test(risksBlock)) unpaired.add(currentSection);
246
+ for (const m of lines[i].matchAll(AS_ID)) referencedIds.add(`AS-${m[1]}`);
247
+ if (!lines[i].includes("EKLENECEK")) continue;
248
+ // A gap that names no id cannot be traced to an owner, which is the whole
249
+ // point of admitting it.
250
+ if (!/\bAS-\d{2,3}\b/.test(lines[i])) {
251
+ errors.push(
252
+ `line ${i + 1}: EKLENECEK carries no AS-NN reference (Locked 33)`,
253
+ );
254
+ }
253
255
  }
254
- for (const sec of unpaired) {
255
- errors.push(
256
- `section ${sec} carries EKLENECEK but no Risks and Open Questions row references it (Locked 33)`,
257
- );
256
+ for (const id of referencedIds) {
257
+ if (!definedIds.has(id)) {
258
+ errors.push(
259
+ `${id} is referenced in the body but not defined in Risks and Open Questions (Locked 33)`,
260
+ );
261
+ }
262
+ }
263
+ for (const id of definedIds) {
264
+ if (!referencedIds.has(id)) {
265
+ // An open question with no body reference is allowed only when the row
266
+ // says so; otherwise it is a question about nothing the document raises.
267
+ const row = risksBlock
268
+ .split("\n")
269
+ .find((l) => l.includes(id)) || "";
270
+ if (!/(no body reference|govde referansi yok)/i.test(row)) {
271
+ errors.push(
272
+ `${id} is defined in Risks and Open Questions but never referenced in the body (Locked 33)`,
273
+ );
274
+ }
275
+ }
276
+ }
277
+
278
+ // 2b. JSON does not fit in a table cell (Locked 37).
279
+ //
280
+ // One document rendered `Request` as inline JSON with a field note glued to
281
+ // the end, and `Response` as a proper fenced block below the table: two
282
+ // formats for the same thing, one table apart. The payload belongs under the
283
+ // table; the cell says which of the three states it is in.
284
+ for (let i = 0; i < lines.length; i++) {
285
+ const line = lines[i];
286
+ if (!/^\|\s*\*\*(Request|Response)\*\*\s*\|/.test(line)) continue;
287
+ const cell = line.split("|")[2] || "";
288
+ if (/[{}]/.test(cell)) {
289
+ errors.push(
290
+ `line ${i + 1}: ${/Request/.test(line) ? "Request" : "Response"} cell holds JSON; ` +
291
+ "put the payload in a fenced block under the table (Locked 37)",
292
+ );
293
+ }
258
294
  }
259
295
 
260
296
  // The traceability matrix is the most expensive thing in the document to get
@@ -295,6 +331,32 @@ function main() {
295
331
  }
296
332
  }
297
333
 
334
+ // 2c. Diagram labels keep their diacritics.
335
+ //
336
+ // The punctuation gate skips fenced blocks, so a mermaid diagram is the one
337
+ // place a Turkish document can quietly go ASCII: one run shipped `Hayir` and
338
+ // `Basarili` in its flow chart while every other line was correct. A warning,
339
+ // not an error - node ids are legitimately ASCII, only labels are checked.
340
+ if (parsed.fm.language === "tr") {
341
+ const mmLines = text.split("\n");
342
+ let inMermaid = false;
343
+ for (let i = 0; i < mmLines.length; i++) {
344
+ const t = mmLines[i].trim();
345
+ if (/^```mermaid\s*$/.test(t)) { inMermaid = true; continue; }
346
+ if (inMermaid && t === "```") { inMermaid = false; continue; }
347
+ if (!inMermaid) continue;
348
+ const labels = [...mmLines[i].matchAll(/[[({|]([^\]})|]{3,})[\]})|]/g)].map((m) => m[1]);
349
+ for (const lbl of labels) {
350
+ if (/^[\x20-\x7E]+$/.test(lbl) && /\b(Hayir|Basarili|Basarisiz|Odeme|Iptal|Gecerli|Gecersiz|Secim|Dogrulama|Uyari|Baslangic|Bitis|Onay|Aciklama)\b/.test(lbl)) {
351
+ errors.push(
352
+ `WARN line ${i + 1}: diagram label "${lbl}" looks like Turkish flattened to ASCII (Locked 7)`,
353
+ );
354
+ }
355
+ }
356
+ }
357
+ }
358
+
359
+
298
360
  // 2b. Opt-in coverage sections must be present when the front-matter says so.
299
361
  const uiTests = String(parsed?.fm?.ui_tests || "false").toLowerCase() === "true";
300
362
  const a11yDepth = String(parsed?.fm?.a11y_depth || "basic").toLowerCase();
@@ -950,7 +950,7 @@
950
950
  },
951
951
  {
952
952
  "name": "multi-agent",
953
- "description": "Task orchestrator: runs the full pipeline from a Jira ID or GitHub Issue URL - analysis → plan → TDD development → parallel review (Fable + Sonnet on Claude Code, GPT + Opus + Sonnet on Copilot CLI) → commit → log. Every step is written to agent-log.md. Use when given a Jira ID, a GitHub issue or ",
953
+ "description": "Task orchestrator: runs the full pipeline from a Jira ID or GitHub Issue URL - analysis → plan → TDD development → parallel review (Fable + Opus + Sonnet on Claude Code, GPT + Opus + Sonnet on Copilot CLI) → commit → log. Every step is written to agent-log.md. Use when given a Jira ID, a GitHub issue or ",
954
954
  "platform": null,
955
955
  "group": "core",
956
956
  "plugin": null,
@@ -1313,7 +1313,7 @@
1313
1313
  },
1314
1314
  {
1315
1315
  "name": "multi-agent-review",
1316
- "description": "Run parallel review on a branch diff or a Pull Request: 2 models on Claude Code (Fable + Sonnet), 3 models on Copilot CLI (GPT + Opus + Sonnet). On PR input, posts per-finding inline comments + approve/needs-work. With no input (interactive), lists open GitHub + Bitbucket PRs to multi-select. Use wh",
1316
+ "description": "Run parallel review on a branch diff or a Pull Request: 3 models on Claude Code (Fable + Opus + Sonnet), 3 models on Copilot CLI (GPT + Opus + Sonnet). On PR input, posts per-finding inline comments + approve/needs-work. With no input (interactive), lists open GitHub + Bitbucket PRs to multi-select. Use wh",
1317
1317
  "platform": null,
1318
1318
  "group": "core",
1319
1319
  "plugin": null,
@@ -60,7 +60,7 @@ Source layout is logical grouping only - skill discovery at runtime is unchang
60
60
  | [`multi-agent-refactor`](./core/multi-agent-refactor/) | `core` | Analyse the project: extract adapted best-practices, hunt real bugs + improvement areas, check upstream drift of derived skills, research th |
61
61
  | [`multi-agent-resume`](./core/multi-agent-resume/) | `core` | Resume a stopped or failed task from the phase where it left off. Use when a task stopped or failed and should carry on from where it left o |
62
62
  | [`multi-agent-resume-local`](./core/multi-agent-resume-local/) | `core` | Continue already-done LOCAL work through the pipeline tail: Review → Build+Test → Commit/PR → Report (technical analysis + Jira test-scenari |
63
- | [`multi-agent-review`](./core/multi-agent-review/) | `core` | Run parallel review on a branch diff or a Pull Request: 2 models on Claude Code (Fable + Sonnet), 3 models on Copilot CLI (GPT + Opus + Sonn |
63
+ | [`multi-agent-review`](./core/multi-agent-review/) | `core` | Run parallel review on a branch diff or a Pull Request: 3 models on Claude Code (Fable + Opus + Sonnet), 3 models on Copilot CLI (GPT + Opus + Sonn |
64
64
  | [`multi-agent-review-analysis`](./core/multi-agent-review-analysis/) | `core` | Review a written analysis document instead of a diff: resolve it from a path, a Confluence page or a Jira issue, run the deterministic gates |
65
65
  | [`multi-agent-review-issue`](./core/multi-agent-review-issue/) | `core` | Assess whether a GitHub issue is ready for multi-agent development: fetch it, grade scope / acceptance criteria / repro / design / API / sta |
66
66
  | [`multi-agent-review-jira`](./core/multi-agent-review-jira/) | `core` | Assess whether a Jira issue is ready for multi-agent development: fetch it, grade scope / acceptance criteria / repro / design / API / stack |
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: multi-agent
3
3
  language: en
4
- description: "Task orchestrator: runs the full pipeline from a Jira ID or GitHub Issue URL - analysis → plan → TDD development → parallel review (Fable + Sonnet on Claude Code, GPT + Opus + Sonnet on Copilot CLI) → commit → log. Every step is written to agent-log.md. Use when given a Jira ID, a GitHub issue or a free-text task and the whole pipeline should run."
4
+ description: "Task orchestrator: runs the full pipeline from a Jira ID or GitHub Issue URL - analysis → plan → TDD development → parallel review (Fable + Opus + Sonnet on Claude Code, GPT + Opus + Sonnet on Copilot CLI) → commit → log. Every step is written to agent-log.md. Use when given a Jira ID, a GitHub issue or a free-text task and the whole pipeline should run."
5
5
  user-invocable: true
6
6
  argument-hint: '"PROJ-12345" "feature/PROJ-12345-flight-filter" | "https://github.com/.../issues/316" | status | log #1 | resume #1 | kill #1 | clear-logs | purge | review'
7
7
  ---
@@ -455,7 +455,7 @@ For each todo (respecting dependency order):
455
455
  ### Phase 4: Review (parallel + triage)
456
456
  0. **Diff Risk Scoring (advisory, v8.3+)** - before reviewer dispatch run `node $HOME/.claude/scripts/diff-risk-score.mjs --base "$BASE_BRANCH" --top 5` and inject the top-N risk-ranked files as a `${PRIORITY_FILES}` block into each reviewer's prompt. Heuristic, deterministic, sub-second, never gates the pipeline. Disabled when `prefs.global.diffRiskAdvisory = false`. Signals: security paths (×3), schema migrations (×4), public API surfaces (×2), no-test-change (×2.5), complexity delta (×1.5), UI-critical paths (×1.5), loc changed (×1).
457
457
  1. Launch **code-reviewer** agents in parallel. Reviewer set depends on which CLI is hosting the pipeline:
458
- - **Claude Code** (2 reviewers): `claude-fable-5` (deep security + architecture) + `claude-sonnet-5` (quality + correctness)
458
+ - **Claude Code** (3 reviewers): `claude-fable-5` (deep security + architecture) + `claude-sonnet-5` (quality + correctness)
459
459
  - **Copilot CLI** (3 reviewers): `gpt-5.4` (edge cases, different perspective) + `claude-opus-5` + `claude-sonnet-5` (Fable 5 is not offered on Copilot CLI)
460
460
  - Triage: single top-tier pass over merged findings (`claude-fable-5` on Claude Code, `claude-opus-5` on Copilot CLI)
461
461
  2. Collect findings, classify:
@@ -656,7 +656,7 @@ Phase 3: Dev
656
656
  └─ TDD, token rules, code style - from global instructions
657
657
 
658
658
  Phase 4: Review (parallel + triage)
659
- Claude Code (2 parallel):
659
+ Claude Code (3 parallel):
660
660
  ├─ code-reviewer (claude-opus) → all 5 review skills
661
661
  └─ code-reviewer (claude-sonnet) → all 5 review skills
662
662
  Copilot CLI (3 parallel):
@@ -63,7 +63,7 @@ Pipeline (after Phase 0):
63
63
  Phase 2: Planning -> Task breakdown + architecture review + Plan Approval Gate
64
64
  Phase 3: Dev -> TDD: test -> code -> build (Sonnet) + build queue
65
65
  Phase 4: Review -> Deterministic gates + parallel AI review + Fable triage
66
- (Claude Code: Fable + Sonnet · Copilot CLI: GPT-5.4 + Opus + Sonnet)
66
+ (Claude Code: Fable + Opus + Sonnet · Copilot CLI: GPT-5.4 + Opus + Sonnet)
67
67
  Phase 5: Test -> Optional: switch to branch, test in Xcode
68
68
  Phase 6: Commit -> Commit -> push -> PR + issue body update (never auto-closes)
69
69
  Phase 7: Report -> Channels dispatcher (PR · Jira · Confluence · Wiki, multi-select)
@@ -240,7 +240,7 @@ Pipeline (Phase 0'dan sonra):
240
240
  Phase 2: Planning -> Task kırılımı + mimari inceleme + Plan Onay Kapısı
241
241
  Phase 3: Dev -> TDD: test -> kod -> build (Sonnet) + build queue
242
242
  Phase 4: Review -> Deterministik kapılar + paralel AI review + Fable triage
243
- (Claude Code: Fable + Sonnet · Copilot CLI: GPT-5.4 + Opus + Sonnet)
243
+ (Claude Code: Fable + Opus + Sonnet · Copilot CLI: GPT-5.4 + Opus + Sonnet)
244
244
  Phase 5: Test -> Opsiyonel: branch'e geç, Xcode'da test
245
245
  Phase 6: Commit -> Commit -> push -> PR + issue body güncelleme (hiç auto-close yok)
246
246
  Phase 7: Report -> Channels dispatcher (PR · Jira · Confluence · Wiki, multi-select)
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: multi-agent-review
3
3
  language: en
4
- description: "Run parallel review on a branch diff or a Pull Request: 2 models on Claude Code (Fable + Sonnet), 3 models on Copilot CLI (GPT + Opus + Sonnet). On PR input, posts per-finding inline comments + approve/needs-work. With no input (interactive), lists open GitHub + Bitbucket PRs to multi-select. Use when a branch diff or a pull request needs reviewing before it merges."
4
+ description: "Run parallel review on a branch diff or a Pull Request: 3 models on Claude Code (Fable + Opus + Sonnet), 3 models on Copilot CLI (GPT + Opus + Sonnet). On PR input, posts per-finding inline comments + approve/needs-work. With no input (interactive), lists open GitHub + Bitbucket PRs to multi-select. Use when a branch diff or a pull request needs reviewing before it merges."
5
5
  user-invocable: true
6
6
  argument-hint: "[#N | repo#N | PR-URL | branch] - PR by number/URL, repo+number, or branch (GitHub + Bitbucket Server). If omitted: interactive PR picker, else current branch."
7
7
  ---
@@ -33,7 +33,7 @@ Skip Phase 0-3 and review a diff only. Input shapes: a PR (`#N`, `repo#N`, GitHu
33
33
 
34
34
  3. **Start parallel reviewers** - reviewer set depends on the host CLI:
35
35
 
36
- **Claude Code (2 in parallel):**
36
+ **Claude Code (3 in parallel):**
37
37
  - Agent 1: `claude-fable-5` → security + architecture
38
38
  - Agent 2: `claude-sonnet-5` → general quality
39
39
 
@@ -126,7 +126,7 @@
126
126
  | core | `multi-agent-refactor` | - | Analyse the project: extract adapted best-practices, hunt real bugs + improvement areas, check upstream drift of derived skills, research th |
127
127
  | core | `multi-agent-resume` | - | Resume a stopped or failed task from the phase where it left off. Use when a task stopped or failed and should carry on from where it left o |
128
128
  | core | `multi-agent-resume-local` | - | Continue already-done LOCAL work through the pipeline tail: Review → Build+Test → Commit/PR → Report (technical analysis + Jira test-scenari |
129
- | core | `multi-agent-review` | - | Run parallel review on a branch diff or a Pull Request: 2 models on Claude Code (Fable + Sonnet), 3 models on Copilot CLI (GPT + Opus + Sonn |
129
+ | core | `multi-agent-review` | - | Run parallel review on a branch diff or a Pull Request: 3 models on Claude Code (Fable + Opus + Sonnet), 3 models on Copilot CLI (GPT + Opus + Sonn |
130
130
  | core | `multi-agent-review-analysis` | - | Review a written analysis document instead of a diff: resolve it from a path, a Confluence page or a Jira issue, run the deterministic gates |
131
131
  | core | `multi-agent-review-issue` | - | Assess whether a GitHub issue is ready for multi-agent development: fetch it, grade scope / acceptance criteria / repro / design / API / sta |
132
132
  | core | `multi-agent-review-jira` | - | Assess whether a Jira issue is ready for multi-agent development: fetch it, grade scope / acceptance criteria / repro / design / API / stack |