@mmerterden/multi-agent-pipeline 15.3.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 CHANGED
@@ -16,62 +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
+
19
25
  ## [15.3.0] - 2026-08-15
20
26
 
21
27
  ### Added
22
28
 
23
- - **`/multi-agent:setup` onboards the usage-dashboard token (opt-in, one-time).**
24
- When a team runs the private dashboard and the admin issued this user a personal
25
- ingest token, setup stores it in the OS credential store ONLY (never a file,
26
- prefs value, git, or synced tree), maps `keychainMapping.usage_ingest`, and
27
- turns logging on. After that single paste, `/multi-agent:update` keeps it active
28
- and every run reports itself - no further steps. The token is write-only,
29
- per-user (independently revocable), and read at runtime from the credential
30
- store, transmitted only over TLS. Skipping the prompt leaves logging fully off.
31
- True zero-touch is deliberately not offered: a machine that authenticates with
32
- no prior onboarding would require an embeddable secret, which is the attack
33
- vector - one-time onboarding is the security floor.
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.
34
32
 
35
33
  ## [15.2.0] - 2026-08-15
36
34
 
37
35
  ### Added
38
36
 
39
- - **`/multi-agent:update` auto-enables usage logging when a token is onboarded.**
40
- The private dashboard stays opt-in and off by default, but once the shared
41
- ingest token exists on a machine, an update flips `usageLog.enabled` on so the
42
- admin's trusted group does not each have to toggle it by hand. It NEVER
43
- fabricates or ships a secret: it activates only when a token resolves from
44
- `MULTI_AGENT_USAGE_TOKEN`, `usageLog.token`, or the Keychain item named by the
45
- new generic `keychainMapping.usage_ingest` slot - a machine that was never
46
- given the token stays silent.
47
- - **`usage-report.mjs` reads the ingest token from the Keychain** (via
48
- `credential-store.sh`, resolved through `keychainMapping.usage_ingest`) as a
49
- fallback after env and `usageLog.token`, so the secret never has to live in a
50
- 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.
51
40
 
52
41
  ## [15.1.0] - 2026-08-14
53
42
 
54
- Opt-in run telemetry to a private dashboard, and a refactor band that mines it.
55
-
56
43
  ### Added
57
44
 
58
- - **Opt-in usage telemetry (`usageLog`).** When `prefs.global.usageLog.enabled`
59
- is set with an ingest token, each run emits one activity event, keyed by task
60
- id and refreshed live at every phase boundary via `phase-tracker.sh`, so one
61
- record always shows the last phase a run reached including runs that halt
62
- before Phase 7. Wired at Phase 7 report and the halt path; detached and
63
- best-effort, never blocking a run. The event carries activity metadata only
64
- (who, command, mode, input type, repo, phase, outcome, halt cause, review
65
- iterations, duration, token spend, cost, per-phase breakdown, OS, CLI, models,
66
- stack, plugins, integrations, credential health, invoked skills, error tags,
67
- version) — never prompts, code, diffs, token values or absolute paths. New
68
- `pipeline/scripts/usage-report.mjs`; prefs schema + template gain the
69
- `usageLog` block. Off by default; the emitter no-ops unless enabled and a
70
- token resolves.
71
- - **`/multi-agent:refactor` Step 0d (band F).** Reads the local run-error ledger
72
- (`errors-ledger.jsonl`, written by the telemetry emitter on terminal runs) and
73
- ranks recurring failures as prioritized improvement areas — lived evidence,
74
- 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.
75
49
 
76
50
  ### Changed
77
51
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mmerterden/multi-agent-pipeline",
3
- "version": "15.3.0",
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,15 +206,14 @@ 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 - Usage dashboard token (optional, opt-in)
209
+ ### Step 2.7 - Operational reporting token (optional, opt-in)
210
210
 
211
- Only relevant when the team runs a private usage dashboard and the admin has issued this user a personal ingest token. This is the ONE-TIME onboarding that makes usage logging automatic afterwards: once the token is in the credential store, `/multi-agent:update` auto-enables `usageLog` and every run reports itself. Skipping it leaves logging fully off.
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
212
 
213
213
  Ask (in `outputLanguage`), and proceed only on an explicit yes:
214
214
 
215
215
  ```
216
- Do you have a usage-dashboard ingest token from your admin?
217
- It turns on private run telemetry (who/what/when/tokens) for the team dashboard.
216
+ Do you have an operational-reporting token from your admin?
218
217
  [ Paste token / Skip ]
219
218
  ```
220
219
 
@@ -235,10 +234,10 @@ node -e '
235
234
  j.global.usageLog=Object.assign({enabled:true},j.global.usageLog||{},{enabled:true});
236
235
  fs.writeFileSync(p,JSON.stringify(j,null,2)+"\n");
237
236
  ' "${USER}_Usage_Ingest_Token"
238
- echo " -> usage logging onboarded (token in credential store; logging on)"
237
+ echo " -> operational reporting configured (token in credential store)"
239
238
  ```
240
239
 
241
- Security notes to surface to the user: the token is **write-only** (it can only append activity metadata to the dashboard - no read access, no other scope), it is stored **only in the OS credential store**, and it is **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.
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.
242
241
 
243
242
  ### Auto-learned fields (no setup step needed)
244
243
 
@@ -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-enable usage logging when a token is already onboarded.** The private
75
- usage dashboard is opt-in and off by default. This step flips it ON only when a
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 silent. Resolution order: env
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 " -> usage logging activated (ingest token found)"
93
+ echo " -> operational reporting configured (token found)"
94
94
  else
95
- echo " -> usage logging left off (no ingest token onboarded)"
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 usage ping 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 logging is off or unconfigured:
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 dashboard upserts by run id, so this halt event and a later Phase 7 event (after resume) collapse into one record.
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
- **Usage ping (optional, private dashboard).** When `prefs.global.usageLog.enabled` is true, emit one end-of-run activity event to the configured private dashboard. One POST per run (never per phase), fire-and-forget, activity metadata only - who, command, mode, input type, repo, phase reached, outcome, halt cause, review-iteration count, duration, token spend, cost, version. No prompts, code, diffs, or absolute paths. The script no-ops when `usageLog.enabled` is not true or no ingest token resolves, so the call is unconditional and never blocks the run.
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 shared ingest token for the private usage dashboard. When set, usage-report.mjs reads the token from here (never from a synced file), and /multi-agent:update auto-enables usageLog once the token is onboarded. Absent = usage logging stays off."
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 end-of-run usage ping to a private dashboard. When enabled, Phase 7 emits ONE activity event per run (never per phase) via pipeline/scripts/usage-report.mjs: who, command, mode, input type, repo, phase reached, outcome, halt cause, review-iteration count, duration, token spend, cost, version. 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.",
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 activity event. The token is sent in the X-Usage-Token header."
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 - usage ping (opt-in) for the private mission-control dashboard.
2
+ * usage-report.mjs - optional, opt-in per-run operational reporting.
3
3
  *
4
- * Emits one compact activity event keyed by run id (`taskId`). Called at each
5
- * phase boundary (status=running, via phase-tracker.sh) and once at the end
6
- * (terminal status, from Phase 7 report or the halt path). The server upserts
7
- * by run id, so per-phase calls update ONE record - it always reflects the last
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: