@mmerterden/multi-agent-pipeline 20.23.2 → 20.25.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 (123) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/README.md +8 -6
  3. package/README.tr.md +7 -5
  4. package/docs/architecture.md +3 -3
  5. package/docs/ecosystem.md +5 -5
  6. package/docs/facts.json +7 -6
  7. package/docs/features.md +9 -4
  8. package/install/catalog-history.json +1 -1
  9. package/install/templates/claude-hooks.json +14 -1
  10. package/install/templates/codex-hooks.json +18 -0
  11. package/manifest.json +126 -98
  12. package/package.json +1 -1
  13. package/pipeline/agents/task-clarifier.md +1 -1
  14. package/pipeline/commands/multi-agent/analysis-jira/SKILL.md +4 -2
  15. package/pipeline/commands/multi-agent/deps/SKILL.md +61 -0
  16. package/pipeline/commands/multi-agent/model/SKILL.md +2 -2
  17. package/pipeline/commands/multi-agent/postmortem/SKILL.md +90 -0
  18. package/pipeline/commands/multi-agent/review/SKILL.md +5 -5
  19. package/pipeline/commands/multi-agent/route-on/SKILL.md +1 -1
  20. package/pipeline/commands/multi-agent/setup/SKILL.md +7 -5
  21. package/pipeline/commands/multi-agent/sync/SKILL.md +4 -4
  22. package/pipeline/commands/multi-agent/testflight-validation/SKILL.md +2 -3
  23. package/pipeline/contract/fixtures/runs-failed.json +1 -1
  24. package/pipeline/contract/fixtures/runs-old-schema.json +1 -1
  25. package/pipeline/contract/fixtures/runs-pr-opened-redacted.json +1 -1
  26. package/pipeline/contract/fixtures/runs-pr-opened.json +1 -1
  27. package/pipeline/contract/fixtures/runs-running.json +1 -1
  28. package/pipeline/lib/analysis-jira-write.sh +70 -0
  29. package/pipeline/lib/credential-inventory.sh +5 -5
  30. package/pipeline/lib/decisions.mjs +130 -0
  31. package/pipeline/lib/fetch-crashlytics.sh +6 -8
  32. package/pipeline/lib/model-rung.sh +1 -1
  33. package/pipeline/lib/plan-todos.sh +177 -37
  34. package/pipeline/lib/post-pr-review.sh +4 -6
  35. package/pipeline/lib/route-state.sh +1 -1
  36. package/pipeline/lib/shadow-git.sh +4 -5
  37. package/pipeline/lib/task-graph.mjs +446 -0
  38. package/pipeline/lib/tdd-evidence.mjs +579 -0
  39. package/pipeline/multi-agent-refs/analysis-template-corporate.md +2 -0
  40. package/pipeline/multi-agent-refs/analysis-template.md +4 -2
  41. package/pipeline/multi-agent-refs/cross-cli-contract.md +10 -11
  42. package/pipeline/multi-agent-refs/features/analysis-jira.md +42 -0
  43. package/pipeline/multi-agent-refs/features/autopilot-decisions.md +34 -0
  44. package/pipeline/multi-agent-refs/features/cost-analysis.md +4 -0
  45. package/pipeline/multi-agent-refs/features/dep-bump.md +176 -0
  46. package/pipeline/multi-agent-refs/features/model-fallback.md +21 -14
  47. package/pipeline/multi-agent-refs/features/mutation-probe.md +58 -0
  48. package/pipeline/multi-agent-refs/features/plan-checks.md +67 -0
  49. package/pipeline/multi-agent-refs/features/plan-todos.md +40 -1
  50. package/pipeline/multi-agent-refs/features/rework-escalation.md +49 -0
  51. package/pipeline/multi-agent-refs/features/scope-check.md +1 -0
  52. package/pipeline/multi-agent-refs/help/en.md +2 -0
  53. package/pipeline/multi-agent-refs/help/tr.md +2 -0
  54. package/pipeline/multi-agent-refs/phases/phase-0-init.md +1 -1
  55. package/pipeline/multi-agent-refs/phases/phase-1-plan.md +2 -3
  56. package/pipeline/multi-agent-refs/phases/phase-2-dev.md +7 -7
  57. package/pipeline/multi-agent-refs/phases/phase-3-review.md +18 -16
  58. package/pipeline/multi-agent-refs/phases/phase-5-report.md +3 -3
  59. package/pipeline/multi-agent-refs/picker-contract.md +3 -2
  60. package/pipeline/multi-agent-refs/response-shape.md +65 -0
  61. package/pipeline/multi-agent-refs/tracker-contract.md +6 -6
  62. package/pipeline/rules/response-shape.md +18 -0
  63. package/pipeline/schemas/agent-state.schema.json +36 -1
  64. package/pipeline/schemas/phases.json +4 -0
  65. package/pipeline/schemas/plan-todos.schema.json +104 -3
  66. package/pipeline/schemas/planning-output.schema.json +46 -0
  67. package/pipeline/schemas/prefs.schema.json +122 -3
  68. package/pipeline/scripts/_code-graph.mjs +2 -2
  69. package/pipeline/scripts/_jsonl.mjs +151 -0
  70. package/pipeline/scripts/_plan-overlap.mjs +231 -0
  71. package/pipeline/scripts/_redact.mjs +124 -10
  72. package/pipeline/scripts/_transcript-hosts.mjs +406 -0
  73. package/pipeline/scripts/analysis-story-tree.mjs +153 -8
  74. package/pipeline/scripts/autopilot-publish.mjs +12 -1
  75. package/pipeline/scripts/build-stack-plugins.mjs +3 -3
  76. package/pipeline/scripts/capture-flush.sh +7 -7
  77. package/pipeline/scripts/code-graph-rules/android.json +1 -1
  78. package/pipeline/scripts/cost-analyze.mjs +32 -43
  79. package/pipeline/scripts/cost-table.json +35 -19
  80. package/pipeline/scripts/decisions-log.mjs +118 -0
  81. package/pipeline/scripts/dep-bump.mjs +1556 -0
  82. package/pipeline/scripts/edit-syntax-gate.mjs +362 -0
  83. package/pipeline/scripts/edit-syntax-gate.sh +32 -0
  84. package/pipeline/scripts/find-polluter.mjs +281 -0
  85. package/pipeline/scripts/gate-ledger.mjs +46 -13
  86. package/pipeline/scripts/gc-abandoned.sh +2 -2
  87. package/pipeline/scripts/gen-mode-dispatch.mjs +3 -3
  88. package/pipeline/scripts/git-path.mjs +1 -2
  89. package/pipeline/scripts/host-hooks.mjs +265 -0
  90. package/pipeline/scripts/jira-attach.sh +1 -1
  91. package/pipeline/scripts/keychain.py +3 -3
  92. package/pipeline/scripts/mutation-probe.mjs +484 -0
  93. package/pipeline/scripts/output-quality-check.sh +1 -1
  94. package/pipeline/scripts/phase-tracker.sh +5 -6
  95. package/pipeline/scripts/phase0-exit-gate.mjs +3 -3
  96. package/pipeline/scripts/plan-complexity.mjs +259 -0
  97. package/pipeline/scripts/pre-push-check.sh +3 -6
  98. package/pipeline/scripts/review-decision-gate.mjs +33 -1
  99. package/pipeline/scripts/rework-escalation.mjs +264 -0
  100. package/pipeline/scripts/test-strength.mjs +5 -3
  101. package/pipeline/scripts/transcript-index.mjs +1131 -0
  102. package/pipeline/scripts/uninstall.mjs +90 -4
  103. package/pipeline/scripts/update-issue-progress.sh +4 -6
  104. package/pipeline/scripts/usage-report.mjs +2 -2
  105. package/pipeline/scripts/validate-planning.mjs +48 -6
  106. package/pipeline/skills/.skill-manifest.json +20 -12
  107. package/pipeline/skills/.skills-index.json +23 -1
  108. package/pipeline/skills/shared/README.md +5 -3
  109. package/pipeline/skills/shared/core/multi-agent/SKILL.md +6 -6
  110. package/pipeline/skills/shared/core/multi-agent-analysis-jira/SKILL.md +4 -2
  111. package/pipeline/skills/shared/core/multi-agent-deps/SKILL.md +60 -0
  112. package/pipeline/skills/shared/core/multi-agent-model/SKILL.md +2 -2
  113. package/pipeline/skills/shared/core/multi-agent-postmortem/SKILL.md +69 -0
  114. package/pipeline/skills/shared/core/multi-agent-review/SKILL.md +5 -5
  115. package/pipeline/skills/shared/core/multi-agent-route-on/SKILL.md +1 -1
  116. package/pipeline/skills/shared/core/multi-agent-setup/SKILL.md +7 -5
  117. package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +4 -4
  118. package/pipeline/skills/shared/core/multi-agent-testflight-validation/SKILL.md +2 -3
  119. package/pipeline/skills/shared/external/app-store-optimization/SKILL.md +15 -0
  120. package/pipeline/skills/shared/external/app-store-optimization/evals/evals.json +13 -0
  121. package/pipeline/skills/shared/external/debugging-strategies/SKILL.md +8 -0
  122. package/pipeline/skills/shared/external/ios-coding-standard/references/rules.yml +2 -2
  123. package/pipeline/skills/skills-index.md +3 -1
@@ -0,0 +1,69 @@
1
+ ---
2
+ name: multi-agent-postmortem
3
+ description: "Post-mortem of a run from its session transcripts: loops, stalls, root-cause hypotheses on file:line, fixes. Read-only, redacted. Use when a run went wrong or ran far too long."
4
+ user-invocable: true
5
+ argument-hint: "[#id | transcript.jsonl] [--audit] - a run (task id or #N) or a session file; no argument means the most recent run. --audit re-checks the draft against the index"
6
+ metadata:
7
+ language: en
8
+ ---
9
+
10
+ # multi-agent postmortem - Run Post-Mortem
11
+
12
+ **Input**: $ARGUMENTS
13
+
14
+ Explains what a run actually did, read from the session transcripts it ran in,
15
+ not from what the run log says it decided. The evidence comes from a
16
+ deterministic indexer; the model only interprets it.
17
+
18
+ **Read-only.** Nothing is sent anywhere: no issue comment, no PR, no channel.
19
+ The one write is the report itself, saved under the run's log directory.
20
+
21
+ The indexer reads Claude Code session files (`~/.claude/projects/<dir>/<session>.jsonl`),
22
+ Copilot CLI session logs (`~/.copilot/session-state/<session>/events.jsonl`) and
23
+ Codex rollouts (`~/.codex/sessions/YYYY/MM/DD/rollout-*.jsonl`), detecting the
24
+ format per file. Copilot CLI reports tokens per session, so its totals come from
25
+ the shutdown record. When a run id finds nothing (exit 3), say so and ask for a
26
+ transcript path rather than reporting an empty run.
27
+
28
+ ## Steps
29
+
30
+ 1. **Resolve the target.**
31
+ - A path ending in `.jsonl` (any of the three hosts): index that file
32
+ (Claude Code subagent files beside it are included). There is no run directory, so nothing is saved unless the user
33
+ names one.
34
+ - A task id or `#N`: locate the run and its transcripts:
35
+ ```bash
36
+ node "$HOME/.claude/scripts/transcript-index.mjs" --run "<id>" --locate
37
+ ```
38
+ `matchedBy: "session"` means the run recorded its session id and the match
39
+ is exact. `"time-window"` means it did not, so the files are the sessions,
40
+ on any host, that ran in the run's worktree or checkout while it was active; say that
41
+ this match is a heuristic. Exit 3 with a `reason`: report the reason, and
42
+ offer to take a transcript path instead.
43
+ - No argument: take the most recent run from
44
+ `node "$HOME/.claude/scripts/runs-index.mjs" --json` (latest `startedAt`)
45
+ and continue as above.
46
+
47
+ 2. **Index.**
48
+ ```bash
49
+ node "$HOME/.claude/scripts/transcript-index.mjs" --run "<id>" # or: <file.jsonl>
50
+ ```
51
+ Every item in the output carries `file:line`, the line of the JSONL it came
52
+ from. Exit 4 means the redaction guard found a credential left in the output
53
+ and printed nothing: report that and stop; never fall back to reading the
54
+ transcript directly. Read only the index, never the transcript files.
55
+
56
+ 3. **Write the post-mortem** in `prefs.global.outputLanguage`, short: what
57
+ happened (five lines or fewer); where it looped or stalled, with citations;
58
+ root-cause hypotheses, each anchored to at least one `file:line` (one with
59
+ no citation is left out); suggested fixes tied to a hypothesis; evidence
60
+ limits (matching method, malformed or truncated lines, the redaction count).
61
+ Quote only excerpts the index already shows.
62
+
63
+ 4. **Audit pass** (`--audit`): every cited `file:line` must exist in the index
64
+ and say what the draft claims, every count must match. Correct or drop what
65
+ does not hold, and add `audit: N claims checked, M corrected`.
66
+
67
+ 5. **Save.** With a run directory, write the report to
68
+ `<runDir>/postmortem.md` (`~` expanded) and give the path. That file is the
69
+ only write this command makes.
@@ -43,14 +43,14 @@ Skip Phase 0-3 and review a diff only. Input shapes: a PR (`#N`, `repo#N`, GitHu
43
43
 
44
44
  **Claude Code (3 in parallel while the fable rung is on, 2 while it is off).** Resolve the fable slots first; this command has no Phase 0:
45
45
  `REVIEW_RUNG=$(bash "$HOME/.claude/lib/model-dispatch.sh" subagent --persona reviewer --default fable)` and the same with `--persona triage` for `TRIAGE_RUNG`. Anything but `fable` drops Agent 1 and runs triage on `TRIAGE_RUNG`.
46
- - Agent 1: `claude-fable-5` → security + architecture (only when `REVIEW_RUNG` is `fable`)
47
- - Agent 2: `claude-opus-5` → edge cases, different perspective
48
- - Agent 3: `claude-sonnet-5` → general quality
46
+ - Agent 1: `claude-fable-5-1` → security + architecture (only when `REVIEW_RUNG` is `fable`)
47
+ - Agent 2: `claude-opus-5-5` → edge cases, different perspective
48
+ - Agent 3: `claude-sonnet-5-5` → general quality
49
49
 
50
50
  **Copilot CLI (3 in parallel):**
51
- - Agent 1: `claude-opus-5` → security + architecture (Fable 5 is not offered on Copilot CLI)
51
+ - Agent 1: `claude-opus-4.7` → security + architecture (Fable is not offered on Copilot CLI)
52
52
  - Agent 2: `gpt-5.4` → edge cases, different perspective
53
- - Agent 3: `claude-sonnet-5` → general quality
53
+ - Agent 3: `claude-sonnet-4.6` → general quality
54
54
 
55
55
  **Codex CLI (3 in parallel, single vendor):**
56
56
  - Agent 1: `gpt-5.6` @ `xhigh` → security + architecture
@@ -29,7 +29,7 @@ honoured only at `bulk-read` and `delegate` and only while `--free` is on.
29
29
 
30
30
  **Rung names are the contract; model ids are not.** `opus` is a rung here and a
31
31
  model id in `cost-table.json`, and the second can change without anyone editing
32
- a rule. Writing `claude-opus-5` into a rule pins a decision to a string that will
32
+ a rule. Writing `claude-opus-5-5` into a rule pins a decision to a string that will
33
33
  go stale.
34
34
 
35
35
  Set rules with:
@@ -322,14 +322,16 @@ On a new machine: (1) `npx @{npm-scope}/multi-agent-pipeline install`; (2) `/mul
322
322
 
323
323
  All tokens are optional in the sense that every service can be answered with Skip - but the ASKING is not optional: the Step 3 sequential loop still walks every missing service one by one (token → author → host). Phase 0 re-asks at runtime only for tokens the user skipped here.
324
324
 
325
- ### Step 8 - Enforcement hooks (optional, Claude Code)
325
+ ### Step 8 - Enforcement hooks (optional)
326
326
 
327
- Offer to merge `$HOME/.claude/templates/claude-hooks.json`: three `PreToolUse` gates that block on a non-zero exit (secret scan, agent-guard, read-size) plus three capture hooks that block nothing (`PreCompact`, `SessionEnd`, `SessionStart`). What each does: `$HOME/.claude/multi-agent-refs/picker-contract.md`.
327
+ On Claude Code, offer to merge `$HOME/.claude/templates/claude-hooks.json`: three blocking `PreToolUse` gates (secret scan, agent-guard, read-size) plus four non-blocking hooks (`PreCompact`, `SessionEnd`, `SessionStart`, `PostToolUse`). What each does: `$HOME/.claude/multi-agent-refs/picker-contract.md`.
328
328
 
329
329
  - Ask (picker): "Install the pipeline's hooks into `~/.claude/settings.json`?" Default Yes.
330
- - On Yes, deep-merge EVERY event in the template's `hooks` object, not `PreToolUse` alone - merging one event silently drops the capture hooks. Preserve existing hooks; never duplicate a matcher already calling the same script.
331
- - Say what the merge does NOT cover: only the three gates need no run-specific arguments, so only they are hookable; the rest are phase-enforced.
332
- - Say what it does not turn on: the read-size gate is inert until `prefs.global.bulkRead.mode` is set. Recommend `observe` first. Why, and the Phase 3 exemption: `$HOME/.claude/multi-agent-refs/picker-contract.md`.
330
+ - On Yes, deep-merge EVERY event in the template's `hooks` object (merging `PreToolUse` alone drops the capture hooks); keep existing hooks, never duplicate a matcher calling the same script.
331
+ - Say only the three gates are hookable (no run-specific arguments); the rest are phase-enforced.
332
+ - Say the read-size gate stays inert until `prefs.global.bulkRead.mode` is set; recommend `observe` first (why, and the Phase 3 exemption: `picker-contract.md`).
333
+
334
+ Codex: offer only the syntax gate, then run `node "$HOME/.codex/scripts/host-hooks.mjs" install --host codex`. Copilot CLI: offer no hook (it discards `postToolUse` output as of 1.0.45).
333
335
 
334
336
  ### Step 9 - Default stack plugin enablement
335
337
 
@@ -33,7 +33,7 @@ Run all steps automatically:
33
33
  ```
34
34
  Step 0: DOCTOR node $HOME/.claude/scripts/doctor.mjs - exit 2 or 4 STOPS the sync
35
35
  Step 1: DETECT Compare timestamps, find stale targets
36
- Step 2: COPILOT Claude Code -> Copilot CLI (instructions + 64 sub-command skills)
36
+ Step 2: COPILOT Claude Code -> Copilot CLI (instructions + 66 sub-command skills)
37
37
  Step 2b: CODEX Claude Code -> Codex CLI (1 router skill + sub-command specs as refs + agent TOML)
38
38
  Step 3: REPO Claude Code -> pipeline repo (genericized, personal data scrub)
39
39
  Step 3d: DEV-TOOLKIT Companion MCP server -> detect movement, ship gates, commit + publish
@@ -229,14 +229,14 @@ When invoked with the `release` argument:
229
229
  |-------------|-------------|
230
230
  | `~/.claude/commands/multi-agent/{cmd}/SKILL.md` | `~/.copilot/skills/multi-agent-{cmd}/SKILL.md` |
231
231
 
232
- **64 commands are synced** (canonical inventory - must match `cross-cli-contract.md` section 1; drift = contract violation):
232
+ **66 commands are synced** (canonical inventory - must match `cross-cli-contract.md` section 1; drift = contract violation):
233
233
 
234
234
  ```
235
235
  analysis, analysis-jira, analysis-resolve, autopilot, autopilot-off,
236
236
  autopilot-on, autopilot-status, bug-bash, build-optimize, channels, complaint-analysis,
237
- create-jira, design-check, diff-explain, doctor, estimate, feedback, forget,
237
+ create-jira, deps, design-check, diff-explain, doctor, estimate, feedback, forget,
238
238
  garbage-collect, graph, help, ios-coding-standard, issue, jira, kill,
239
- language, log, manual-test, model, prune-logs,
239
+ language, log, manual-test, model, postmortem, prune-logs,
240
240
  prune-prompts, purge, refactor, research, resume, review,
241
241
  review-analysis, review-issue, review-jira, route-off, route-on,
242
242
  route-status, routines, save, scaffold, scan, scenario-audit, search,
@@ -9,10 +9,9 @@ metadata:
9
9
 
10
10
  # multi-agent-testflight-validation - iOS alias for store-ready
11
11
 
12
- This skill is an alias. The implementation it used to carry was merged into
12
+ This skill is an alias. The implementation lives in
13
13
  `multi-agent-store-ready`, which runs the same three gates on iOS and adds the
14
- Android side, so there is one flow to maintain instead of two that had already
15
- started to drift.
14
+ Android side, so there is one flow to maintain instead of two that drift.
16
15
 
17
16
  The name is kept because it is the one people reach for when the target is
18
17
  TestFlight, and removing a surface is a breaking change.
@@ -189,6 +189,21 @@ autoplay off, its poster frame is all they see, so pick a frame that could stand
189
189
  alone as a screenshot. Device sizes and other screenshot requirements are in
190
190
  `app-store-review`.
191
191
 
192
+ **Composing the frame.** The screen inside every frame is a real capture of the
193
+ shipping app; a generated or mocked-up UI misrepresents the app and is a review
194
+ risk. When a designer or an image tool builds the marketing frame around that
195
+ capture, brief it in this order so nothing is left to guess:
196
+
197
+ 1. Platform, device frame and exact output size or aspect ratio.
198
+ 2. The capture itself, named as the asset to place, unedited.
199
+ 3. The caption, quoted verbatim per locale, with its position (above or below).
200
+ 4. Layout and style from the brand's own tokens: background, type, accent.
201
+ 5. Explicit exclusions: no invented UI or data, no other brands' devices or
202
+ logos, no prices or offers that differ by market, nothing over the status
203
+ bar or the capture's own text.
204
+
205
+ Keep the brief as text beside the frames so a new locale or size reuses it.
206
+
192
207
  ## Asking for reviews in the app
193
208
 
194
209
  Use the SwiftUI environment value `RequestReviewAction` or, from UIKit,
@@ -45,6 +45,19 @@
45
45
  "Keeps an ASO cross-check of listing copy and screenshots for accuracy and conversion",
46
46
  "Never suggests competitor names, unrelated keywords or misleading screenshots"
47
47
  ]
48
+ },
49
+ {
50
+ "id": 4,
51
+ "name": "screenshot-frame-brief",
52
+ "prompt": "Our designer wants to use an AI image tool to make the App Store screenshots for our budgeting app, including the app screens. Write the brief we should give them for the first three frames.",
53
+ "expected_output": "Insists the screen inside each frame is a real capture of the shipping app, not generated UI. Orders the brief: device frame and size, the capture as the asset, the verbatim caption per locale and its position, layout and style from brand tokens, and explicit exclusions (no invented UI or data, no other brands' devices or logos, no market-specific prices). Gives each of the three frames a distinct benefit with the main value proposition first.",
54
+ "expectations": [
55
+ "Says the screen in each frame must be a real capture of the shipping app, not generated or mocked-up UI",
56
+ "Orders the brief: device frame and size, the capture as the asset, the verbatim caption per locale and its position, layout and style from brand tokens, explicit exclusions",
57
+ "Lists exclusions including no invented UI or data and no other brands' devices or logos",
58
+ "Puts the main value proposition in the first frame and gives each of the three a different benefit"
59
+ ],
60
+ "files": []
48
61
  }
49
62
  ]
50
63
  }
@@ -58,6 +58,14 @@ reproduction that runs in seconds:
58
58
  For an intermittent failure, loop it: run the test a few hundred times and count
59
59
  failures. A rate is an observation you can compare before and after a change.
60
60
 
61
+ A test that passes alone but fails in the suite, or a file the suite leaves
62
+ behind, is pollution from an earlier test: bisect the test list instead of reading
63
+ every test. With the multi-agent pipeline installed, `node
64
+ $HOME/.claude/scripts/find-polluter.mjs --run "<cmd> {test}" --list <file> --target
65
+ <id> --reset "<cmd>"` (or `--absent <path>`) does the halving. The reset command
66
+ restores whatever the tests mutate before each trial; without it a target whose
67
+ state persists between trials stops the search with exit 2.
68
+
61
69
  ## 3. Shrink the failing case
62
70
 
63
71
  A smaller case has fewer places for the bug to hide.
@@ -704,7 +704,7 @@ rules:
704
704
  enforcement: judgement
705
705
  rationale: testability
706
706
  check: >
707
- Two things used to be one rule here, and conflating them pushed modules toward the wrong fix
707
+ Two concerns meet in this rule, and conflating them pushes modules toward the wrong fix
708
708
  in both directions. Separate them:
709
709
  **The failure vocabulary is module-scoped.** The set of ways a call can fail - offline,
710
710
  timeout, unauthorised, not-found, conflict, server, unknown - is one type the whole module
@@ -925,7 +925,7 @@ rules:
925
925
  check: >
926
926
  When the app ships a wrapper for a platform affordance - a sheet, a date picker, a toast -
927
927
  a feature module calls the wrapper, never the OS API underneath. The wrapper exists
928
- because the OS changed the affordance once already and will again: iOS 26 forced a
928
+ because the OS changes the affordance between releases: iOS 26 forced a
929
929
  Liquid-Glass inset onto partial-detent sheets with no opt-out, which put a gap down the
930
930
  side and bottom of every raw `.sheet` and swallowed a pushed picker's selection.
931
931
  The tell that this rule was skipped: one module's sheets look different from the rest of
@@ -3,7 +3,7 @@
3
3
  > Auto-generated by `pipeline/scripts/build-skills-index.mjs` - do not hand-edit.
4
4
  > Regenerate with `node pipeline/scripts/build-skills-index.mjs`.
5
5
 
6
- **228 skills** across 2 groups.
6
+ **230 skills** across 2 groups.
7
7
 
8
8
  | Group | Name | Platform | Description |
9
9
  |-------|------|----------|-------------|
@@ -111,6 +111,7 @@
111
111
  | core | `multi-agent-channels` | - | Multi-channel reporter - Jira/Confluence/Wiki/PR description. Multi-select channels + content, humanizer pass, reviewer-preserving Bitbuck |
112
112
  | core | `multi-agent-complaint-analysis` | - | Customer-complaint triage. Ingests complaints (paste, csv/xlsx/txt/json file, Jira issue, Confluence URL), fetches Graylog evidence per trx/ |
113
113
  | core | `multi-agent-create-jira` | - | Create a standards-compliant Jira issue (Task / Bug / Story): asks the type, mines project conventions, drafts from a standard template with |
114
+ | core | `multi-agent-deps` | - | Bump one dependency, fix only what the bump broke, review, open a PR; rolls back past the fix round cap. SwiftPM, Gradle, npm, pip. Use when |
114
115
  | core | `multi-agent-design-check` | - | Mock-mode vs Figma design audit (iOS / Android, local-only). Pick repo + module, gate on mock support, enumerate every state driver into a c |
115
116
  | core | `multi-agent-diff-explain` | - | Map Phase 3 triage findings to branch diff lines. Read-only post-hoc command, used after review to answer 'which finding lines up with which |
116
117
  | core | `multi-agent-doctor` | - | Health check for the installed pipeline: layout, preferences, credentials, hooks and host capabilities, each with one actionable step. Exit |
@@ -128,6 +129,7 @@
128
129
  | core | `multi-agent-log` | - | Show the agent-log.md for the given task. With no ID, shows the most recent task. Use when asked what a task did, or to read its log. |
129
130
  | core | `multi-agent-manual-test` | - | Switch to the active task's branch and prepare it for manual testing in Xcode. Phase 3 user-test step, standalone (the UI Bug Hunter lives a |
130
131
  | core | `multi-agent-model` | - | Turn the top model rung on or off and keep the cost ledger's pricing in step with it. Use when asked to enable or disable Fable, or which mo |
132
+ | core | `multi-agent-postmortem` | - | Post-mortem of a run from its session transcripts: loops, stalls, root-cause hypotheses on file:line, fixes. Read-only, redacted. Use when a |
131
133
  | core | `multi-agent-prune-logs` | - | Delete per-task project logs under ~/.claude/logs/multi-agent (filter by age/project/task). Audit trail + metrics are preserved. Dry-run fir |
132
134
  | core | `multi-agent-prune-prompts` | - | Zero-base prompt review: measure the always-on instruction footprint, classify every rule block, propose keep/trial-removal/delete; applies |
133
135
  | core | `multi-agent-purge` | - | ⚠️ Wipes every worktree, branch, log, and state file. Irreversible; asks for double confirmation. Use when every worktree, branch, log and s |