@mmerterden/multi-agent-pipeline 15.2.0 → 15.3.1
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 +21 -31
- package/package.json +1 -1
- package/pipeline/commands/multi-agent/setup/SKILL.md +33 -0
- package/pipeline/commands/multi-agent/update/SKILL.md +5 -5
- package/pipeline/multi-agent-refs/phases/operations.md +2 -2
- package/pipeline/multi-agent-refs/phases/phase-7-report.md +1 -1
- package/pipeline/schemas/prefs.schema.json +3 -3
- package/pipeline/scripts/usage-report.mjs +5 -12
package/CHANGELOG.md
CHANGED
|
@@ -16,46 +16,36 @@ Internal file-layout changes that don't affect the slash-command surface are sti
|
|
|
16
16
|
|
|
17
17
|
## [Unreleased]
|
|
18
18
|
|
|
19
|
+
## [15.3.1] - 2026-08-15
|
|
20
|
+
|
|
21
|
+
### Changed
|
|
22
|
+
|
|
23
|
+
- Documentation and wording clarifications.
|
|
24
|
+
|
|
25
|
+
## [15.3.0] - 2026-08-15
|
|
26
|
+
|
|
27
|
+
### Added
|
|
28
|
+
|
|
29
|
+
- `/multi-agent:setup` gains an optional one-time operational-token onboarding
|
|
30
|
+
step (opt-in). The token is stored in the OS credential store only, never in a
|
|
31
|
+
file, prefs value, git, or synced tree.
|
|
32
|
+
|
|
19
33
|
## [15.2.0] - 2026-08-15
|
|
20
34
|
|
|
21
35
|
### Added
|
|
22
36
|
|
|
23
|
-
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
admin's trusted group does not each have to toggle it by hand. It NEVER
|
|
27
|
-
fabricates or ships a secret: it activates only when a token resolves from
|
|
28
|
-
`MULTI_AGENT_USAGE_TOKEN`, `usageLog.token`, or the Keychain item named by the
|
|
29
|
-
new generic `keychainMapping.usage_ingest` slot - a machine that was never
|
|
30
|
-
given the token stays silent.
|
|
31
|
-
- **`usage-report.mjs` reads the ingest token from the Keychain** (via
|
|
32
|
-
`credential-store.sh`, resolved through `keychainMapping.usage_ingest`) as a
|
|
33
|
-
fallback after env and `usageLog.token`, so the secret never has to live in a
|
|
34
|
-
synced or plaintext file for logging to work.
|
|
37
|
+
- `/multi-agent:update` auto-configures the optional operational integration when
|
|
38
|
+
its token is already onboarded, resolving it from the credential store; it never
|
|
39
|
+
fabricates or ships a secret, so a machine without one is unaffected.
|
|
35
40
|
|
|
36
41
|
## [15.1.0] - 2026-08-14
|
|
37
42
|
|
|
38
|
-
Opt-in run telemetry to a private dashboard, and a refactor band that mines it.
|
|
39
|
-
|
|
40
43
|
### Added
|
|
41
44
|
|
|
42
|
-
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
before Phase 7. Wired at Phase 7 report and the halt path; detached and
|
|
47
|
-
best-effort, never blocking a run. The event carries activity metadata only
|
|
48
|
-
(who, command, mode, input type, repo, phase, outcome, halt cause, review
|
|
49
|
-
iterations, duration, token spend, cost, per-phase breakdown, OS, CLI, models,
|
|
50
|
-
stack, plugins, integrations, credential health, invoked skills, error tags,
|
|
51
|
-
version) — never prompts, code, diffs, token values or absolute paths. New
|
|
52
|
-
`pipeline/scripts/usage-report.mjs`; prefs schema + template gain the
|
|
53
|
-
`usageLog` block. Off by default; the emitter no-ops unless enabled and a
|
|
54
|
-
token resolves.
|
|
55
|
-
- **`/multi-agent:refactor` Step 0d (band F).** Reads the local run-error ledger
|
|
56
|
-
(`errors-ledger.jsonl`, written by the telemetry emitter on terminal runs) and
|
|
57
|
-
ranks recurring failures as prioritized improvement areas — lived evidence,
|
|
58
|
-
offline, and without auth.
|
|
45
|
+
- Optional, opt-in per-run operational reporting (`usageLog`), off by default and
|
|
46
|
+
a no-op unless configured.
|
|
47
|
+
- `/multi-agent:refactor` Step 0d (band F) reads a local run-diagnostics ledger to
|
|
48
|
+
rank recurring failures as prioritized improvement areas - offline, no auth.
|
|
59
49
|
|
|
60
50
|
### Changed
|
|
61
51
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mmerterden/multi-agent-pipeline",
|
|
3
|
-
"version": "15.
|
|
3
|
+
"version": "15.3.1",
|
|
4
4
|
"description": "8-phase AI development pipeline with full orchestration on Claude Code, Copilot CLI and Codex CLI. Analysis, planning, TDD, CLI-aware parallel review with consensus surfacing + Fable triage, default-FAIL evidence gates, secret + intent guards, per-phase cost ledger, persistent learnings memory, wiki generation, commit automation. Token-preserving uninstall.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "index.js",
|
|
@@ -206,6 +206,39 @@ Save the resolved mapping to preferences:
|
|
|
206
206
|
|
|
207
207
|
`null` = not mapped (missing or skipped). Pipeline phases read this mapping to retrieve tokens dynamically - never hardcoded key names.
|
|
208
208
|
|
|
209
|
+
### Step 2.7 - Operational reporting token (optional, opt-in)
|
|
210
|
+
|
|
211
|
+
Only relevant when the team runs the optional operational reporting integration and the admin has issued this user a token. This is the ONE-TIME onboarding that configures it afterwards: once the token is in the credential store, `/multi-agent:update` auto-configures `usageLog`. Skipping it leaves the integration fully off.
|
|
212
|
+
|
|
213
|
+
Ask (in `outputLanguage`), and proceed only on an explicit yes:
|
|
214
|
+
|
|
215
|
+
```
|
|
216
|
+
Do you have an operational-reporting token from your admin?
|
|
217
|
+
[ Paste token / Skip ]
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
On paste, store the secret in the credential store ONLY - never in a file, prefs value, git, or any synced/published tree. Use the standard per-user key name so it is revocable independently and consistent across the user's machines:
|
|
221
|
+
|
|
222
|
+
```bash
|
|
223
|
+
~/.claude/lib/credential-store.sh set "${USER}_Usage_Ingest_Token" "<pasted-token>"
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
Then map it and enable logging (the token itself stays in the credential store; only the logical mapping + the on-switch land in prefs):
|
|
227
|
+
|
|
228
|
+
```bash
|
|
229
|
+
node -e '
|
|
230
|
+
const fs=require("fs"),os=require("os"),p=os.homedir()+"/.claude/multi-agent-preferences.json";
|
|
231
|
+
const j=JSON.parse(fs.readFileSync(p,"utf8"));
|
|
232
|
+
j.global=j.global||{}; j.global.keychainMapping=j.global.keychainMapping||{};
|
|
233
|
+
j.global.keychainMapping.usage_ingest=process.argv[1];
|
|
234
|
+
j.global.usageLog=Object.assign({enabled:true},j.global.usageLog||{},{enabled:true});
|
|
235
|
+
fs.writeFileSync(p,JSON.stringify(j,null,2)+"\n");
|
|
236
|
+
' "${USER}_Usage_Ingest_Token"
|
|
237
|
+
echo " -> operational reporting configured (token in credential store)"
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
Security notes to surface to the user: the token is **write-only** (append-only to the endpoint - no read access, no other scope), stored **only in the OS credential store**, and **per-user** so the admin can revoke this one token without affecting anyone else. `usage-report.mjs` reads it from the credential store at runtime via the `usage_ingest` mapping; it is never written to a file or transmitted except over TLS to the ingest endpoint.
|
|
241
|
+
|
|
209
242
|
### Auto-learned fields (no setup step needed)
|
|
210
243
|
|
|
211
244
|
**Jira Project Key**: auto-learned from pipeline usage. User runs `/multi-agent ABC-123` → `ABC` is extracted and saved to `prefs.global.defaultJiraKey` (first ever) and `prefs.projects[{project}].jiraProjectKeys` (per-project). Multiple keys accumulate over time - most recent first, deduped. Phase 0 Step 1 (Parse Input) handles extraction.
|
|
@@ -71,10 +71,10 @@ Update the pipeline in one command. Existing preferences are preserved; only ski
|
|
|
71
71
|
fi
|
|
72
72
|
```
|
|
73
73
|
|
|
74
|
-
5b. **Auto-
|
|
75
|
-
|
|
74
|
+
5b. **Auto-configure operational reporting when a token is already onboarded.** The
|
|
75
|
+
integration is opt-in and off by default. This step turns it ON only when a
|
|
76
76
|
token can be resolved - it NEVER fabricates a secret or ships one, so a machine
|
|
77
|
-
that was never given the token stays
|
|
77
|
+
that was never given the token stays inert. Resolution order: env
|
|
78
78
|
`MULTI_AGENT_USAGE_TOKEN`, then `usageLog.token`, then the Keychain item named by
|
|
79
79
|
`keychainMapping.usage_ingest`. Endpoint is left to the emitter's default.
|
|
80
80
|
```bash
|
|
@@ -90,9 +90,9 @@ Update the pipeline in one command. Existing preferences are preserved; only ski
|
|
|
90
90
|
fi
|
|
91
91
|
if [ -n "$TOK" ]; then
|
|
92
92
|
node -e 'const fs=require("fs"),p=process.argv[1];const j=JSON.parse(fs.readFileSync(p,"utf8"));j.global=j.global||{};j.global.usageLog=j.global.usageLog||{};j.global.usageLog.enabled=true;fs.writeFileSync(p,JSON.stringify(j,null,2)+"\n");' "$PREFS"
|
|
93
|
-
echo " ->
|
|
93
|
+
echo " -> operational reporting configured (token found)"
|
|
94
94
|
else
|
|
95
|
-
echo " ->
|
|
95
|
+
echo " -> operational reporting left off (no token onboarded)"
|
|
96
96
|
fi
|
|
97
97
|
fi
|
|
98
98
|
fi
|
|
@@ -95,13 +95,13 @@ halt per the halt-visibility rule), `3` I/O error.
|
|
|
95
95
|
Reads need no wrapper; the rename makes any read see either the old or the new
|
|
96
96
|
document, never a truncated one.
|
|
97
97
|
|
|
98
|
-
**Halt visibility (required, autopilot included).** A halt is never silent. Whenever a phase halts on a hard error (validator failed twice, no subagent returned, dispatch error past fallback, lock irrecoverable), in addition to the `agent-log.md` line: (a) write `state.status = "paused"` and `state.haltReason = "<phase>:<cause>"`; (b) record the cause on the tracker via `phase-tracker.sh meta <phase> halt "<cause>"` and `phase-tracker.sh update <phase> failed`; (c) emit one `>&2` alert line `HALT phase <N>: <cause> - resume with /multi-agent:resume #<id>`; (d) if `prefs.global.usageLog.enabled` is true, emit the end-of-run
|
|
98
|
+
**Halt visibility (required, autopilot included).** A halt is never silent. Whenever a phase halts on a hard error (validator failed twice, no subagent returned, dispatch error past fallback, lock irrecoverable), in addition to the `agent-log.md` line: (a) write `state.status = "paused"` and `state.haltReason = "<phase>:<cause>"`; (b) record the cause on the tracker via `phase-tracker.sh meta <phase> halt "<cause>"` and `phase-tracker.sh update <phase> failed`; (c) emit one `>&2` alert line `HALT phase <N>: <cause> - resume with /multi-agent:resume #<id>`; (d) if `prefs.global.usageLog.enabled` is true, emit the end-of-run report so a run that never reaches Phase 7 is still recorded with the phase it stopped at (`state.currentPhase` + `haltReason`) - the emitter no-ops when it is off or unconfigured:
|
|
99
99
|
|
|
100
100
|
```bash
|
|
101
101
|
node $HOME/.claude/scripts/usage-report.mjs --state "$STATE_FILE" >/dev/null 2>&1 || true
|
|
102
102
|
```
|
|
103
103
|
|
|
104
|
-
Autopilot suppresses *confirmations*, not *halts* - the user must always be able to see why an unattended run stopped without reading the log. The
|
|
104
|
+
Autopilot suppresses *confirmations*, not *halts* - the user must always be able to see why an unattended run stopped without reading the log. The endpoint upserts by run id, so this halt record and a later Phase 7 record (after resume) collapse into one.
|
|
105
105
|
|
|
106
106
|
### Pipeline Best Practices
|
|
107
107
|
|
|
@@ -196,7 +196,7 @@ $HOME/.claude/scripts/log-metric.sh "$TASK_ID" 7 task.completed \
|
|
|
196
196
|
duration_ms=$TOTAL_DURATION
|
|
197
197
|
```
|
|
198
198
|
|
|
199
|
-
**
|
|
199
|
+
**Operational reporting (optional, opt-in).** When `prefs.global.usageLog.enabled` is true, emit one end-of-run run record to the configured endpoint. One POST per run, fire-and-forget, coarse run metadata only - no prompts, code, diffs, or absolute paths. The script no-ops when `usageLog.enabled` is not true or no token resolves, so the call is unconditional and never blocks the run.
|
|
200
200
|
|
|
201
201
|
```bash
|
|
202
202
|
node $HOME/.claude/scripts/usage-report.mjs --state "$STATE_FILE" >/dev/null 2>&1 || true
|
|
@@ -193,7 +193,7 @@
|
|
|
193
193
|
"string",
|
|
194
194
|
"null"
|
|
195
195
|
],
|
|
196
|
-
"description": "Keychain item holding the
|
|
196
|
+
"description": "Keychain item holding the ingest token for the optional operational reporting integration. When set, usage-report.mjs reads it from here (never from a synced file), and /multi-agent:update auto-configures the integration once onboarded. Absent = the integration stays off."
|
|
197
197
|
},
|
|
198
198
|
"figma_pat": {
|
|
199
199
|
"type": [
|
|
@@ -1087,7 +1087,7 @@
|
|
|
1087
1087
|
"usageLog": {
|
|
1088
1088
|
"type": "object",
|
|
1089
1089
|
"additionalProperties": false,
|
|
1090
|
-
"description": "Optional
|
|
1090
|
+
"description": "Optional, opt-in per-run operational reporting via pipeline/scripts/usage-report.mjs. Emits coarse run metadata only (never prompts, code, diffs, or absolute paths). Off by default; the emitter no-ops unless enabled is true AND a token resolves (from token below or env MULTI_AGENT_USAGE_TOKEN), so it is inert for anyone who has not configured it.",
|
|
1091
1091
|
"properties": {
|
|
1092
1092
|
"enabled": {
|
|
1093
1093
|
"type": "boolean",
|
|
@@ -1096,7 +1096,7 @@
|
|
|
1096
1096
|
},
|
|
1097
1097
|
"endpoint": {
|
|
1098
1098
|
"type": "string",
|
|
1099
|
-
"description": "Ingest URL that receives the
|
|
1099
|
+
"description": "Ingest URL that receives the run record. The token is sent in the X-Usage-Token header."
|
|
1100
1100
|
},
|
|
1101
1101
|
"token": {
|
|
1102
1102
|
"type": "string",
|
|
@@ -1,17 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* usage-report.mjs -
|
|
2
|
+
* usage-report.mjs - optional, opt-in per-run operational reporting.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* phase a run reached, including runs that halt before Phase 7. Fire-and-forget,
|
|
9
|
-
* never throws, never delays the run.
|
|
10
|
-
*
|
|
11
|
-
* Payload is activity metadata only - who, command, mode, input type, repo,
|
|
12
|
-
* phase, outcome, halt cause, review iterations, duration, token spend, cost,
|
|
13
|
-
* per-phase breakdown, language, stack, plugins, integrations, credential
|
|
14
|
-
* health, invoked skills, error tags, version. No prompts, code, diffs, token
|
|
4
|
+
* Off by default; a no-op unless prefs.global.usageLog.enabled is true and a
|
|
5
|
+
* token resolves. Emits one compact run record keyed by run id (`taskId`),
|
|
6
|
+
* upserted per phase, fire-and-forget - never throws, never delays a run.
|
|
7
|
+
* Only coarse run metadata is included; never prompts, code, diffs, token
|
|
15
8
|
* values, or absolute paths.
|
|
16
9
|
*
|
|
17
10
|
* Enable + configure via prefs.global.usageLog:
|