@mmerterden/multi-agent-pipeline 20.23.2 → 20.24.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 +22 -0
- package/README.md +7 -6
- package/README.tr.md +6 -5
- package/docs/architecture.md +3 -3
- package/docs/ecosystem.md +5 -5
- package/docs/facts.json +3 -3
- package/install/catalog-history.json +1 -1
- package/install/templates/claude-hooks.json +14 -1
- package/manifest.json +75 -54
- package/package.json +1 -1
- package/pipeline/commands/multi-agent/analysis-jira/SKILL.md +4 -2
- package/pipeline/commands/multi-agent/postmortem/SKILL.md +78 -0
- package/pipeline/commands/multi-agent/setup/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/sync/SKILL.md +3 -3
- package/pipeline/lib/analysis-jira-write.sh +70 -0
- package/pipeline/lib/decisions.mjs +130 -0
- package/pipeline/lib/plan-todos.sh +156 -33
- package/pipeline/lib/task-graph.mjs +446 -0
- package/pipeline/lib/tdd-evidence.mjs +579 -0
- package/pipeline/multi-agent-refs/analysis-template-corporate.md +2 -0
- package/pipeline/multi-agent-refs/analysis-template.md +4 -2
- package/pipeline/multi-agent-refs/cross-cli-contract.md +4 -4
- package/pipeline/multi-agent-refs/features/analysis-jira.md +42 -0
- package/pipeline/multi-agent-refs/features/autopilot-decisions.md +34 -0
- package/pipeline/multi-agent-refs/features/model-fallback.md +4 -2
- package/pipeline/multi-agent-refs/features/mutation-probe.md +58 -0
- package/pipeline/multi-agent-refs/features/plan-checks.md +67 -0
- package/pipeline/multi-agent-refs/features/plan-todos.md +40 -1
- package/pipeline/multi-agent-refs/features/rework-escalation.md +49 -0
- package/pipeline/multi-agent-refs/features/scope-check.md +1 -0
- package/pipeline/multi-agent-refs/help/en.md +1 -0
- package/pipeline/multi-agent-refs/help/tr.md +1 -0
- package/pipeline/multi-agent-refs/phases/phase-1-plan.md +2 -3
- package/pipeline/multi-agent-refs/phases/phase-2-dev.md +5 -7
- package/pipeline/multi-agent-refs/phases/phase-3-review.md +13 -11
- package/pipeline/multi-agent-refs/phases/phase-5-report.md +3 -3
- package/pipeline/multi-agent-refs/picker-contract.md +3 -2
- package/pipeline/multi-agent-refs/response-shape.md +65 -0
- package/pipeline/rules/response-shape.md +18 -0
- package/pipeline/schemas/agent-state.schema.json +31 -1
- package/pipeline/schemas/plan-todos.schema.json +101 -0
- package/pipeline/schemas/planning-output.schema.json +46 -0
- package/pipeline/schemas/prefs.schema.json +96 -0
- package/pipeline/scripts/_jsonl.mjs +151 -0
- package/pipeline/scripts/_plan-overlap.mjs +231 -0
- package/pipeline/scripts/_redact.mjs +124 -10
- package/pipeline/scripts/analysis-story-tree.mjs +153 -8
- package/pipeline/scripts/autopilot-publish.mjs +12 -1
- package/pipeline/scripts/cost-analyze.mjs +6 -24
- package/pipeline/scripts/decisions-log.mjs +118 -0
- package/pipeline/scripts/edit-syntax-gate.mjs +240 -0
- package/pipeline/scripts/edit-syntax-gate.sh +29 -0
- package/pipeline/scripts/find-polluter.mjs +281 -0
- package/pipeline/scripts/gate-ledger.mjs +46 -13
- package/pipeline/scripts/mutation-probe.mjs +484 -0
- package/pipeline/scripts/plan-complexity.mjs +259 -0
- package/pipeline/scripts/review-decision-gate.mjs +33 -1
- package/pipeline/scripts/rework-escalation.mjs +264 -0
- package/pipeline/scripts/test-strength.mjs +5 -3
- package/pipeline/scripts/transcript-index.mjs +950 -0
- package/pipeline/scripts/validate-planning.mjs +48 -6
- package/pipeline/skills/.skill-manifest.json +11 -7
- package/pipeline/skills/.skills-index.json +12 -1
- package/pipeline/skills/shared/README.md +4 -3
- package/pipeline/skills/shared/core/multi-agent-analysis-jira/SKILL.md +4 -2
- package/pipeline/skills/shared/core/multi-agent-postmortem/SKILL.md +66 -0
- package/pipeline/skills/shared/core/multi-agent-setup/SKILL.md +1 -1
- package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +3 -3
- package/pipeline/skills/shared/external/app-store-optimization/SKILL.md +15 -0
- package/pipeline/skills/shared/external/app-store-optimization/evals/evals.json +13 -0
- package/pipeline/skills/shared/external/debugging-strategies/SKILL.md +8 -0
- package/pipeline/skills/skills-index.md +2 -1
|
@@ -13,12 +13,20 @@
|
|
|
13
13
|
//
|
|
14
14
|
// Exit codes:
|
|
15
15
|
// 0 - valid
|
|
16
|
-
// 1 - invalid structure, missing field, bad enum,
|
|
16
|
+
// 1 - invalid structure, missing field, bad enum, broken dependsOn edges,
|
|
17
|
+
// or two tasks that both create the same file
|
|
18
|
+
//
|
|
19
|
+
// Output: {ok, code, errors[], warnings[], overlaps[]}. `overlaps` holds one
|
|
20
|
+
// anchored row per pair of tasks that share a file or a named symbol, and
|
|
21
|
+
// `warnings` the overlaps that look wrong without being certain to be
|
|
22
|
+
// (_plan-overlap.mjs). Warnings never change the exit code.
|
|
17
23
|
|
|
18
24
|
import { readFileSync } from "node:fs";
|
|
25
|
+
import { planOverlaps } from "./_plan-overlap.mjs";
|
|
19
26
|
|
|
20
27
|
const ALLOWED_TYPES = new Set(["test", "code", "refactor", "docs", "chore"]);
|
|
21
28
|
const TASK_ID_RE = /^T\d+$/;
|
|
29
|
+
const NAME_LISTS = ["creates", "removes", "produces", "consumes"];
|
|
22
30
|
|
|
23
31
|
function readInput() {
|
|
24
32
|
const arg = process.argv[2];
|
|
@@ -114,6 +122,29 @@ async function main() {
|
|
|
114
122
|
) {
|
|
115
123
|
errors.push(`tasks[${i}].requirements: must be an array of requirement ids if present`);
|
|
116
124
|
}
|
|
125
|
+
for (const key of NAME_LISTS) {
|
|
126
|
+
if (
|
|
127
|
+
t[key] !== undefined &&
|
|
128
|
+
!(Array.isArray(t[key]) && t[key].every((n) => typeof n === "string" && n.length > 0))
|
|
129
|
+
) {
|
|
130
|
+
errors.push(`tasks[${i}].${key}: must be an array of non-empty strings if present`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
if (t.complexity !== undefined) {
|
|
134
|
+
const c = t.complexity;
|
|
135
|
+
if (
|
|
136
|
+
typeof c !== "object" ||
|
|
137
|
+
c === null ||
|
|
138
|
+
!Number.isInteger(c.score) ||
|
|
139
|
+
c.score < 1 ||
|
|
140
|
+
c.score > 10 ||
|
|
141
|
+
(c.recommendSplit !== undefined && typeof c.recommendSplit !== "boolean")
|
|
142
|
+
) {
|
|
143
|
+
errors.push(
|
|
144
|
+
`tasks[${i}].complexity: must be {score: 1-10, recommendSplit?: boolean} if present`,
|
|
145
|
+
);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
117
148
|
});
|
|
118
149
|
|
|
119
150
|
// Validate dependsOn edges point to real ids and don't cycle
|
|
@@ -149,13 +180,24 @@ async function main() {
|
|
|
149
180
|
}
|
|
150
181
|
}
|
|
151
182
|
|
|
183
|
+
let overlaps = [];
|
|
184
|
+
let warnings = [];
|
|
185
|
+
if (errors.length === 0) {
|
|
186
|
+
const found = planOverlaps(parsed.tasks);
|
|
187
|
+
overlaps = found.rows;
|
|
188
|
+
warnings = found.warnings;
|
|
189
|
+
errors.push(...found.contradictions);
|
|
190
|
+
}
|
|
191
|
+
|
|
152
192
|
if (errors.length > 0) {
|
|
153
|
-
emit({ ok: false, code: 1, errors });
|
|
154
|
-
process.
|
|
193
|
+
emit({ ok: false, code: 1, errors, warnings, overlaps });
|
|
194
|
+
process.exitCode = 1;
|
|
195
|
+
return;
|
|
155
196
|
}
|
|
156
197
|
|
|
157
|
-
|
|
158
|
-
|
|
198
|
+
// exitCode, not exit(): the overlap rows grow with the plan, and exit()
|
|
199
|
+
// would cut them at the pipe buffer.
|
|
200
|
+
emit({ ok: true, code: 0, errors: [], warnings, overlaps });
|
|
159
201
|
}
|
|
160
202
|
|
|
161
203
|
/**
|
|
@@ -177,7 +219,7 @@ function hasCycle(id, graph, state) {
|
|
|
177
219
|
}
|
|
178
220
|
|
|
179
221
|
function emit(result) {
|
|
180
|
-
process.stdout.write(JSON.stringify(result) + "\n");
|
|
222
|
+
process.stdout.write(JSON.stringify({ warnings: [], overlaps: [], ...result }) + "\n");
|
|
181
223
|
}
|
|
182
224
|
|
|
183
225
|
main().catch((err) => {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": "1.0.0",
|
|
3
|
-
"generatedAt": "2026-10-
|
|
4
|
-
"skillCount":
|
|
3
|
+
"generatedAt": "2026-10-13T23:27:37Z",
|
|
4
|
+
"skillCount": 229,
|
|
5
5
|
"entries": [
|
|
6
6
|
{
|
|
7
7
|
"path": "shared/core/apple-archive-compliance/SKILL.md",
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
},
|
|
14
14
|
{
|
|
15
15
|
"path": "shared/core/multi-agent-analysis-jira/SKILL.md",
|
|
16
|
-
"sha256": "
|
|
16
|
+
"sha256": "485a44b117a5502ea54ff0830584cb69d7622a77f13e326e4684eb9e693de8a0"
|
|
17
17
|
},
|
|
18
18
|
{
|
|
19
19
|
"path": "shared/core/multi-agent-analysis-resolve/SKILL.md",
|
|
@@ -127,6 +127,10 @@
|
|
|
127
127
|
"path": "shared/core/multi-agent-model/SKILL.md",
|
|
128
128
|
"sha256": "88fe1d5676606058d505bee3273bd20a5027a874122ef5e4de21df9d27ac3c6a"
|
|
129
129
|
},
|
|
130
|
+
{
|
|
131
|
+
"path": "shared/core/multi-agent-postmortem/SKILL.md",
|
|
132
|
+
"sha256": "5de52f7cca65656061029427232f95a2de4539564d666a4b8c2e129a92cb7bf8"
|
|
133
|
+
},
|
|
130
134
|
{
|
|
131
135
|
"path": "shared/core/multi-agent-prune-logs/SKILL.md",
|
|
132
136
|
"sha256": "9e0745c2aac474b401126218a7e0d81a72942cd331ac0e591da72407d523fda9"
|
|
@@ -213,7 +217,7 @@
|
|
|
213
217
|
},
|
|
214
218
|
{
|
|
215
219
|
"path": "shared/core/multi-agent-setup/SKILL.md",
|
|
216
|
-
"sha256": "
|
|
220
|
+
"sha256": "7fa0771c2da6aae2579fe16f170a2af8c2e8dbd4702e11ac02583ce71bbb63c1"
|
|
217
221
|
},
|
|
218
222
|
{
|
|
219
223
|
"path": "shared/core/multi-agent-stack/SKILL.md",
|
|
@@ -233,7 +237,7 @@
|
|
|
233
237
|
},
|
|
234
238
|
{
|
|
235
239
|
"path": "shared/core/multi-agent-sync/SKILL.md",
|
|
236
|
-
"sha256": "
|
|
240
|
+
"sha256": "1e418fe472a93cc7b4b5bc19ff9e9b8b9d89b545e45d343a643f17a492cb0624"
|
|
237
241
|
},
|
|
238
242
|
{
|
|
239
243
|
"path": "shared/core/multi-agent-test-accessibility/SKILL.md",
|
|
@@ -337,7 +341,7 @@
|
|
|
337
341
|
},
|
|
338
342
|
{
|
|
339
343
|
"path": "shared/external/app-store-optimization/SKILL.md",
|
|
340
|
-
"sha256": "
|
|
344
|
+
"sha256": "99580fe67cbe4e42bb07a95669ab10bcece0c6ba5032acf321a25e73fee1c37d"
|
|
341
345
|
},
|
|
342
346
|
{
|
|
343
347
|
"path": "shared/external/app-store-review/SKILL.md",
|
|
@@ -445,7 +449,7 @@
|
|
|
445
449
|
},
|
|
446
450
|
{
|
|
447
451
|
"path": "shared/external/debugging-strategies/SKILL.md",
|
|
448
|
-
"sha256": "
|
|
452
|
+
"sha256": "83b0a5d8a907b5704451920c488269ac88b0410aaa41ed9267946fb0e636963d"
|
|
449
453
|
},
|
|
450
454
|
{
|
|
451
455
|
"path": "shared/external/device-integrity/SKILL.md",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": "1.0.0",
|
|
3
|
-
"skillCount":
|
|
3
|
+
"skillCount": 229,
|
|
4
4
|
"entries": [
|
|
5
5
|
{
|
|
6
6
|
"name": "accessibility-compliance-accessibility-audit",
|
|
@@ -1333,6 +1333,17 @@
|
|
|
1333
1333
|
"triggerPaths": [],
|
|
1334
1334
|
"relativePath": "shared/core/multi-agent-model/SKILL.md"
|
|
1335
1335
|
},
|
|
1336
|
+
{
|
|
1337
|
+
"name": "multi-agent-postmortem",
|
|
1338
|
+
"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.",
|
|
1339
|
+
"platform": null,
|
|
1340
|
+
"group": "core",
|
|
1341
|
+
"plugin": null,
|
|
1342
|
+
"invokeAs": "multi-agent-postmortem",
|
|
1343
|
+
"triggerKeywords": [],
|
|
1344
|
+
"triggerPaths": [],
|
|
1345
|
+
"relativePath": "shared/core/multi-agent-postmortem/SKILL.md"
|
|
1346
|
+
},
|
|
1336
1347
|
{
|
|
1337
1348
|
"name": "multi-agent-prune-logs",
|
|
1338
1349
|
"description": "Delete per-task project logs under ~/.claude/logs/multi-agent (filter by age/project/task). Audit trail + metrics are preserved. Dry-run first; confirms before deleting. Use when task logs have built up and need trimming by age, project or task.",
|
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
Single source of truth for skills delivered to both Claude Code (`~/.claude/skills/`) and Copilot CLI (`~/.copilot/skills/`) by the installer.
|
|
4
4
|
|
|
5
|
-
**Total:**
|
|
5
|
+
**Total:** 229 skills (68 core + 161 external). Auto-generated by `scripts/gen-skills-index.mjs` - do not edit by hand.
|
|
6
6
|
|
|
7
7
|
## Directory layout
|
|
8
8
|
|
|
9
|
-
- **`core/`** -
|
|
9
|
+
- **`core/`** - 68 `multi-agent*` orchestration skills that are pipeline-critical. Edits here are core-code changes.
|
|
10
10
|
- **`external/`** - 161 iOS / Android / generic skills that ship into the stack plugins. Each names its origin in `metadata.source`: `multi-agent-pipeline` when written here, or the upstream and license a `NOTICE-*.md` in this directory covers.
|
|
11
11
|
- Install destinations (ADR-0009): Claude Code gets NO local copy of `external/` - it loads those skills from the `multi-agent-plugins` marketplace, namespaced (`ai-<stack>-toolkit:<name>`); only the two compliance catalogs from `core/` land in `~/.claude/skills/`. Copilot CLI and Codex CLI receive a flat copy filtered to the enabled stacks. `external/` remains the single authoring source that `build-stack-plugins.mjs` publishes from.
|
|
12
12
|
|
|
@@ -14,7 +14,7 @@ Source layout is logical grouping only - skill discovery at runtime is unchang
|
|
|
14
14
|
|
|
15
15
|
## Categories
|
|
16
16
|
|
|
17
|
-
- [Pipeline Orchestration](#pipeline-orchestration) -
|
|
17
|
+
- [Pipeline Orchestration](#pipeline-orchestration) - 68
|
|
18
18
|
- [iOS / Apple Ecosystem](#ios-apple-ecosystem) - 94
|
|
19
19
|
- [Android / Kotlin](#android-kotlin) - 16
|
|
20
20
|
- [Web](#web) - 10
|
|
@@ -57,6 +57,7 @@ Source layout is logical grouping only - skill discovery at runtime is unchang
|
|
|
57
57
|
| [`multi-agent-log`](./core/multi-agent-log/) | `core` | 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. |
|
|
58
58
|
| [`multi-agent-manual-test`](./core/multi-agent-manual-test/) | `core` | 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 |
|
|
59
59
|
| [`multi-agent-model`](./core/multi-agent-model/) | `core` | 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 |
|
|
60
|
+
| [`multi-agent-postmortem`](./core/multi-agent-postmortem/) | `core` | Post-mortem of a run from its session transcripts: loops, stalls, root-cause hypotheses on file:line, fixes. Read-only, redacted. Use when a |
|
|
60
61
|
| [`multi-agent-prune-logs`](./core/multi-agent-prune-logs/) | `core` | Delete per-task project logs under ~/.claude/logs/multi-agent (filter by age/project/task). Audit trail + metrics are preserved. Dry-run fir |
|
|
61
62
|
| [`multi-agent-prune-prompts`](./core/multi-agent-prune-prompts/) | `core` | Zero-base prompt review: measure the always-on instruction footprint, classify every rule block, propose keep/trial-removal/delete; applies |
|
|
62
63
|
| [`multi-agent-purge`](./core/multi-agent-purge/) | `core` | ⚠️ Wipes every worktree, branch, log, and state file. Irreversible; asks for double confirmation. Use when every worktree, branch, log and s |
|
|
@@ -25,6 +25,7 @@ Contract, severities and reasoning:
|
|
|
25
25
|
- An open `EKLENECEK`/`TBD` marker or an open Section 20 row stops planning with exit 4. Resolve them with `/multi-agent-analysis-resolve` first.
|
|
26
26
|
- The epic must already exist: stories are linked to it, never an epic created. On Server/Data Center the Epic Link field is discovered from the site; when none is found the stories are created unlinked and the writer says so.
|
|
27
27
|
- Channel clones (`issueTree.cloneByChannel`) carry their own labels and are searched like stories, so a re-run never doubles them or their links.
|
|
28
|
+
- A requirement row with `Depends on: <ids>` links the stories, prerequisite first, as `issueTree.dependencyLinkType` (default Blocks). A cycle, or a prerequisite no story covers, makes the plan `incomplete`; fix the document, not the links.
|
|
28
29
|
- Story bodies hold only document text. A body warning (no user story, fewer than 2 criteria, no negative criterion) is a gap in the document; fix the document, not the ticket.
|
|
29
30
|
|
|
30
31
|
## Phase 1 - Plan, offline
|
|
@@ -60,6 +61,7 @@ what makes a preview meaningful:
|
|
|
60
61
|
- the coverage verdict **on its own line**, and the consistency verdict below it
|
|
61
62
|
- every field beside the pref key it came from, so a wrong setting shows here
|
|
62
63
|
rather than in Jira afterwards
|
|
64
|
+
- the dependency edges between stories, prerequisite first
|
|
63
65
|
- the write count
|
|
64
66
|
- every story's full description, as it will be written, with its body
|
|
65
67
|
warnings; `--brief` gives the one-line-per-node view
|
|
@@ -102,7 +104,7 @@ A run that could not be checked is allowed. One that looks checked when it was
|
|
|
102
104
|
not is the defect, so the approval has to name it and a plain "Approve" must not
|
|
103
105
|
be reachable.
|
|
104
106
|
|
|
105
|
-
`incomplete` prints its uncovered and invented ids before the question. An
|
|
107
|
+
`incomplete` prints its uncovered and invented ids, and any dependency cycle or uncovered prerequisite, before the question. An
|
|
106
108
|
invented id means the plan cites something the document does not define - treat
|
|
107
109
|
that as a defect in the plan, not a warning to click past.
|
|
108
110
|
|
|
@@ -152,7 +154,7 @@ missing-attachment warning.
|
|
|
152
154
|
|
|
153
155
|
## Phase 5 - Report
|
|
154
156
|
|
|
155
|
-
Keys created, keys skipped, the epic linked (or none), the coverage verdict, and the ledger path. If the
|
|
157
|
+
Keys created, keys skipped, the epic linked (or none), the dependency links written, the coverage verdict, and the ledger path. If the
|
|
156
158
|
verdict was `unverifiable`, say that in the report too - not only at approval
|
|
157
159
|
time, because the report is what gets pasted elsewhere.
|
|
158
160
|
|
|
@@ -0,0 +1,66 @@
|
|
|
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
|
+
On a host that writes none, a run id finds nothing (exit 3); say so and ask for
|
|
23
|
+
a transcript path rather than reporting an empty run.
|
|
24
|
+
|
|
25
|
+
## Steps
|
|
26
|
+
|
|
27
|
+
1. **Resolve the target.**
|
|
28
|
+
- A path ending in `.jsonl`: index that file (subagent files beside it are
|
|
29
|
+
included). There is no run directory, so nothing is saved unless the user
|
|
30
|
+
names one.
|
|
31
|
+
- A task id or `#N`: locate the run and its transcripts:
|
|
32
|
+
```bash
|
|
33
|
+
node "$HOME/.claude/scripts/transcript-index.mjs" --run "<id>" --locate
|
|
34
|
+
```
|
|
35
|
+
`matchedBy: "session"` means the run recorded its session id and the match
|
|
36
|
+
is exact. `"time-window"` means it did not, so the files are the sessions
|
|
37
|
+
that ran in the run's worktree or checkout while it was active; say that
|
|
38
|
+
this match is a heuristic. Exit 3 with a `reason`: report the reason, and
|
|
39
|
+
offer to take a transcript path instead.
|
|
40
|
+
- No argument: take the most recent run from
|
|
41
|
+
`node "$HOME/.claude/scripts/runs-index.mjs" --json` (latest `startedAt`)
|
|
42
|
+
and continue as above.
|
|
43
|
+
|
|
44
|
+
2. **Index.**
|
|
45
|
+
```bash
|
|
46
|
+
node "$HOME/.claude/scripts/transcript-index.mjs" --run "<id>" # or: <file.jsonl>
|
|
47
|
+
```
|
|
48
|
+
Every item in the output carries `file:line`, the line of the JSONL it came
|
|
49
|
+
from. Exit 4 means the redaction guard found a credential left in the output
|
|
50
|
+
and printed nothing: report that and stop; never fall back to reading the
|
|
51
|
+
transcript directly. Read only the index, never the transcript files.
|
|
52
|
+
|
|
53
|
+
3. **Write the post-mortem** in `prefs.global.outputLanguage`, short: what
|
|
54
|
+
happened (five lines or fewer); where it looped or stalled, with citations;
|
|
55
|
+
root-cause hypotheses, each anchored to at least one `file:line` (one with
|
|
56
|
+
no citation is left out); suggested fixes tied to a hypothesis; evidence
|
|
57
|
+
limits (matching method, malformed or truncated lines, the redaction count).
|
|
58
|
+
Quote only excerpts the index already shows.
|
|
59
|
+
|
|
60
|
+
4. **Audit pass** (`--audit`): every cited `file:line` must exist in the index
|
|
61
|
+
and say what the draft claims, every count must match. Correct or drop what
|
|
62
|
+
does not hold, and add `audit: N claims checked, M corrected`.
|
|
63
|
+
|
|
64
|
+
5. **Save.** With a run directory, write the report to
|
|
65
|
+
`<runDir>/postmortem.md` (`~` expanded) and give the path. That file is the
|
|
66
|
+
only write this command makes.
|
|
@@ -324,7 +324,7 @@ All tokens are optional in the sense that every service can be answered with Ski
|
|
|
324
324
|
|
|
325
325
|
### Step 8 - Enforcement hooks (optional, Claude Code)
|
|
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
|
|
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 four hooks that block nothing (`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
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.
|
|
@@ -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 +
|
|
36
|
+
Step 2: COPILOT Claude Code -> Copilot CLI (instructions + 65 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
|
-
**
|
|
232
|
+
**65 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
237
|
create-jira, 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,
|
|
@@ -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.
|
|
@@ -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
|
-
**
|
|
6
|
+
**229 skills** across 2 groups.
|
|
7
7
|
|
|
8
8
|
| Group | Name | Platform | Description |
|
|
9
9
|
|-------|------|----------|-------------|
|
|
@@ -128,6 +128,7 @@
|
|
|
128
128
|
| 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
129
|
| 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
130
|
| 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 |
|
|
131
|
+
| 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
132
|
| 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
133
|
| 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
134
|
| 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 |
|