@mmerterden/multi-agent-pipeline 20.29.0 → 20.33.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 (227) hide show
  1. package/CHANGELOG.md +86 -0
  2. package/README.md +50 -5
  3. package/README.tr.md +64 -5
  4. package/docs/architecture.md +3 -3
  5. package/docs/ecosystem.md +5 -5
  6. package/docs/facts.json +9 -9
  7. package/install/_unattended-profile.mjs +61 -0
  8. package/install/catalog-history.json +1 -1
  9. package/install/claude.mjs +19 -3
  10. package/install/codex.mjs +2 -0
  11. package/install/copilot.mjs +13 -0
  12. package/install/index.mjs +10 -1
  13. package/install/templates/claude-hooks.json +12 -1
  14. package/manifest.json +230 -88
  15. package/package.json +3 -1
  16. package/pipeline/commands/multi-agent/analysis/SKILL.md +4 -4
  17. package/pipeline/commands/multi-agent/autopilot-on/SKILL.md +13 -15
  18. package/pipeline/commands/multi-agent/office-off/SKILL.md +27 -0
  19. package/pipeline/commands/multi-agent/office-on/SKILL.md +51 -0
  20. package/pipeline/commands/multi-agent/office-status/SKILL.md +29 -0
  21. package/pipeline/commands/multi-agent/prune-logs/SKILL.md +4 -1
  22. package/pipeline/commands/multi-agent/review/SKILL.md +4 -3
  23. package/pipeline/commands/multi-agent/scenario-audit/SKILL.md +4 -2
  24. package/pipeline/commands/multi-agent/serve/SKILL.md +4 -2
  25. package/pipeline/commands/multi-agent/stack/SKILL.md +15 -8
  26. package/pipeline/commands/multi-agent/steer/SKILL.md +10 -9
  27. package/pipeline/commands/multi-agent/sync/SKILL.md +15 -3
  28. package/pipeline/commands/multi-agent/test-gen/SKILL.md +29 -3
  29. package/pipeline/contract/CHANGELOG.md +108 -0
  30. package/pipeline/contract/README.md +72 -12
  31. package/pipeline/contract/fixtures/error-invalid-request.json +1 -1
  32. package/pipeline/contract/fixtures/error-unauthorized.json +1 -1
  33. package/pipeline/contract/fixtures/error-unsigned.json +1 -1
  34. package/pipeline/contract/fixtures/launch-plan.json +1 -1
  35. package/pipeline/contract/fixtures/runs-awaiting-question.json +6 -1
  36. package/pipeline/contract/fixtures/runs-empty.json +1 -1
  37. package/pipeline/contract/fixtures/runs-failed.json +6 -1
  38. package/pipeline/contract/fixtures/runs-old-schema.json +6 -1
  39. package/pipeline/contract/fixtures/runs-pr-opened-redacted.json +5 -1
  40. package/pipeline/contract/fixtures/runs-pr-opened.json +6 -1
  41. package/pipeline/contract/fixtures/runs-running.json +6 -1
  42. package/pipeline/contract/manifest.json +506 -27
  43. package/pipeline/contract/types/index.d.ts +829 -4
  44. package/pipeline/lib/bg-launch.mjs +106 -0
  45. package/pipeline/lib/code-digest.mjs +49 -0
  46. package/pipeline/lib/credential-resolve.mjs +42 -2
  47. package/pipeline/multi-agent-refs/cross-cli-contract.md +5 -4
  48. package/pipeline/multi-agent-refs/features/office-threat-model.md +109 -0
  49. package/pipeline/multi-agent-refs/features/unattended-security.md +1 -1
  50. package/pipeline/multi-agent-refs/help/en.md +3 -0
  51. package/pipeline/multi-agent-refs/help/tr.md +3 -0
  52. package/pipeline/multi-agent-refs/phases/modes.md +7 -7
  53. package/pipeline/multi-agent-refs/phases/phase-5-report.md +16 -10
  54. package/pipeline/multi-agent-refs/review-standalone-tracker.md +37 -0
  55. package/pipeline/multi-agent-refs/tracker-contract.md +8 -3
  56. package/pipeline/office/NOTICE.md +45 -0
  57. package/pipeline/office/assets/ARCHIVE_BOXES.png +0 -0
  58. package/pipeline/office/assets/BIN.png +0 -0
  59. package/pipeline/office/assets/BOOKSHELF.png +0 -0
  60. package/pipeline/office/assets/CACTUS.png +0 -0
  61. package/pipeline/office/assets/CLOCK.png +0 -0
  62. package/pipeline/office/assets/COFFEE.png +0 -0
  63. package/pipeline/office/assets/COFFEE_MACHINE.png +0 -0
  64. package/pipeline/office/assets/COFFEE_TABLE.png +0 -0
  65. package/pipeline/office/assets/COUNTER_SINK.png +0 -0
  66. package/pipeline/office/assets/CUSHIONED_BENCH.png +0 -0
  67. package/pipeline/office/assets/CUSHIONED_CHAIR_BACK.png +0 -0
  68. package/pipeline/office/assets/CUSHIONED_CHAIR_FRONT.png +0 -0
  69. package/pipeline/office/assets/CUSHIONED_CHAIR_SIDE.png +0 -0
  70. package/pipeline/office/assets/DESK_FRONT.png +0 -0
  71. package/pipeline/office/assets/DESK_SIDE.png +0 -0
  72. package/pipeline/office/assets/DEVICE_STAND.png +0 -0
  73. package/pipeline/office/assets/DOUBLE_BOOKSHELF.png +0 -0
  74. package/pipeline/office/assets/FILING_CABINET.png +0 -0
  75. package/pipeline/office/assets/FRIDGE.png +0 -0
  76. package/pipeline/office/assets/HANGING_PLANT.png +0 -0
  77. package/pipeline/office/assets/LARGE_PAINTING.png +0 -0
  78. package/pipeline/office/assets/LARGE_PLANT.png +0 -0
  79. package/pipeline/office/assets/MAILBOX.png +0 -0
  80. package/pipeline/office/assets/MOP_BUCKET.png +0 -0
  81. package/pipeline/office/assets/PC_BACK.png +0 -0
  82. package/pipeline/office/assets/PC_FRONT_OFF.png +0 -0
  83. package/pipeline/office/assets/PC_FRONT_ON_1.png +0 -0
  84. package/pipeline/office/assets/PC_FRONT_ON_2.png +0 -0
  85. package/pipeline/office/assets/PC_FRONT_ON_3.png +0 -0
  86. package/pipeline/office/assets/PC_SIDE.png +0 -0
  87. package/pipeline/office/assets/PLANT.png +0 -0
  88. package/pipeline/office/assets/PLANT_2.png +0 -0
  89. package/pipeline/office/assets/POT.png +0 -0
  90. package/pipeline/office/assets/PRINTER.png +0 -0
  91. package/pipeline/office/assets/RECEPTION_DESK.png +0 -0
  92. package/pipeline/office/assets/SERVER_RACK.png +0 -0
  93. package/pipeline/office/assets/SERVER_RACK_2.png +0 -0
  94. package/pipeline/office/assets/SMALL_PAINTING.png +0 -0
  95. package/pipeline/office/assets/SMALL_PAINTING_2.png +0 -0
  96. package/pipeline/office/assets/SMALL_TABLE_FRONT.png +0 -0
  97. package/pipeline/office/assets/SMALL_TABLE_SIDE.png +0 -0
  98. package/pipeline/office/assets/SOFA_BACK.png +0 -0
  99. package/pipeline/office/assets/SOFA_FRONT.png +0 -0
  100. package/pipeline/office/assets/SOFA_SIDE.png +0 -0
  101. package/pipeline/office/assets/TABLE_FRONT.png +0 -0
  102. package/pipeline/office/assets/TOILET_STALL.png +0 -0
  103. package/pipeline/office/assets/VENDING.png +0 -0
  104. package/pipeline/office/assets/WASHBASIN.png +0 -0
  105. package/pipeline/office/assets/WATER_COOLER.png +0 -0
  106. package/pipeline/office/assets/WHITEBOARD.png +0 -0
  107. package/pipeline/office/assets/WOODEN_BENCH.png +0 -0
  108. package/pipeline/office/assets/WOODEN_CHAIR_BACK.png +0 -0
  109. package/pipeline/office/assets/WOODEN_CHAIR_FRONT.png +0 -0
  110. package/pipeline/office/assets/WOODEN_CHAIR_SIDE.png +0 -0
  111. package/pipeline/office/assets/char_0.png +0 -0
  112. package/pipeline/office/assets/char_1.png +0 -0
  113. package/pipeline/office/assets/char_2.png +0 -0
  114. package/pipeline/office/assets/char_3.png +0 -0
  115. package/pipeline/office/assets/char_4.png +0 -0
  116. package/pipeline/office/assets/char_5.png +0 -0
  117. package/pipeline/office/assets/floor_0.png +0 -0
  118. package/pipeline/office/assets/floor_1.png +0 -0
  119. package/pipeline/office/assets/floor_2.png +0 -0
  120. package/pipeline/office/assets/floor_3.png +0 -0
  121. package/pipeline/office/assets/floor_4.png +0 -0
  122. package/pipeline/office/assets/floor_5.png +0 -0
  123. package/pipeline/office/assets/floor_6.png +0 -0
  124. package/pipeline/office/assets/floor_7.png +0 -0
  125. package/pipeline/office/assets/floor_8.png +0 -0
  126. package/pipeline/office/assets/wall_0.png +0 -0
  127. package/pipeline/office/index.html +8431 -0
  128. package/pipeline/office/toolkit.json +3 -0
  129. package/pipeline/schemas/activity-chat.schema.json +78 -0
  130. package/pipeline/schemas/activity-roles.json +48 -0
  131. package/pipeline/schemas/activity-roles.schema.json +49 -0
  132. package/pipeline/schemas/activity.schema.json +613 -0
  133. package/pipeline/schemas/agent-state.schema.json +493 -115
  134. package/pipeline/schemas/autopilot-on-request.schema.json +33 -0
  135. package/pipeline/schemas/autopilot-on.schema.json +111 -0
  136. package/pipeline/schemas/contract-error.schema.json +45 -4
  137. package/pipeline/schemas/issue-maturity.schema.json +68 -0
  138. package/pipeline/schemas/job-change.schema.json +72 -0
  139. package/pipeline/schemas/job-request.schema.json +38 -0
  140. package/pipeline/schemas/launch.json +4 -4
  141. package/pipeline/schemas/ledger.schema.json +202 -0
  142. package/pipeline/schemas/office-credentials.schema.json +71 -0
  143. package/pipeline/schemas/office-jobs.json +253 -0
  144. package/pipeline/schemas/office-jobs.schema.json +62 -0
  145. package/pipeline/schemas/office-memory.schema.json +105 -0
  146. package/pipeline/schemas/office-settings-request.schema.json +30 -0
  147. package/pipeline/schemas/office-settings.schema.json +67 -0
  148. package/pipeline/schemas/permissions.schema.json +47 -0
  149. package/pipeline/schemas/phases.json +10 -2
  150. package/pipeline/schemas/phases.schema.json +86 -19
  151. package/pipeline/schemas/prefs.schema.json +19 -0
  152. package/pipeline/schemas/prs.schema.json +78 -0
  153. package/pipeline/schemas/prune-logs-request.schema.json +26 -0
  154. package/pipeline/schemas/prune-logs.schema.json +52 -0
  155. package/pipeline/schemas/repo-change.schema.json +54 -0
  156. package/pipeline/schemas/repo-request.schema.json +29 -0
  157. package/pipeline/schemas/repos.schema.json +49 -1
  158. package/pipeline/schemas/review-verdict-request.schema.json +20 -0
  159. package/pipeline/schemas/review-verdict.schema.json +62 -0
  160. package/pipeline/schemas/routine-delete.schema.json +59 -0
  161. package/pipeline/schemas/routines.schema.json +38 -0
  162. package/pipeline/schemas/run-evidence.schema.json +29 -0
  163. package/pipeline/schemas/run-results.schema.json +218 -0
  164. package/pipeline/schemas/runs-index.schema.json +257 -46
  165. package/pipeline/schemas/service-read.schema.json +58 -0
  166. package/pipeline/schemas/stack-change.schema.json +82 -0
  167. package/pipeline/schemas/stack-request.schema.json +33 -0
  168. package/pipeline/schemas/stack.schema.json +59 -0
  169. package/pipeline/schemas/steer-request.schema.json +25 -0
  170. package/pipeline/schemas/steer.schema.json +59 -0
  171. package/pipeline/schemas/system-status.schema.json +111 -0
  172. package/pipeline/schemas/tool-call-request.schema.json +19 -0
  173. package/pipeline/schemas/tool-call.schema.json +47 -0
  174. package/pipeline/schemas/tools.schema.json +65 -0
  175. package/pipeline/schemas/unattended-profile.json +7 -2
  176. package/pipeline/scripts/_active-run.mjs +2 -1
  177. package/pipeline/scripts/_cost.mjs +66 -1
  178. package/pipeline/scripts/_office-smoke-lib.sh +115 -0
  179. package/pipeline/scripts/_spawn-async.mjs +77 -0
  180. package/pipeline/scripts/_transcript-tail.mjs +274 -0
  181. package/pipeline/scripts/activity-snapshot.mjs +1223 -0
  182. package/pipeline/scripts/autopilot-control.mjs +214 -9
  183. package/pipeline/scripts/autopilot-runner.mjs +7 -5
  184. package/pipeline/scripts/contract-server.mjs +1853 -197
  185. package/pipeline/scripts/cost-analyze.mjs +2 -53
  186. package/pipeline/scripts/cost-table.json +1 -0
  187. package/pipeline/scripts/gen-mode-dispatch.mjs +3 -1
  188. package/pipeline/scripts/job-launch.mjs +477 -0
  189. package/pipeline/scripts/launch-request.mjs +94 -9
  190. package/pipeline/scripts/office-build.mjs +226 -0
  191. package/pipeline/scripts/office-control.mjs +410 -0
  192. package/pipeline/scripts/office-credentials.mjs +106 -0
  193. package/pipeline/scripts/office-ledger.mjs +409 -0
  194. package/pipeline/scripts/office-memory.mjs +200 -0
  195. package/pipeline/scripts/office-prune.mjs +125 -0
  196. package/pipeline/scripts/office-settings.mjs +145 -0
  197. package/pipeline/scripts/phase-tracker.sh +12 -5
  198. package/pipeline/scripts/prune-logs.sh +53 -2
  199. package/pipeline/scripts/routine-registry.mjs +42 -6
  200. package/pipeline/scripts/run-results.mjs +373 -0
  201. package/pipeline/scripts/runs-index.mjs +62 -2
  202. package/pipeline/scripts/service-read.mjs +244 -0
  203. package/pipeline/scripts/stack-toggle.mjs +285 -0
  204. package/pipeline/scripts/steer-run.mjs +97 -0
  205. package/pipeline/scripts/system-status.mjs +196 -0
  206. package/pipeline/scripts/task-mirror.mjs +150 -0
  207. package/pipeline/scripts/task-mirror.sh +20 -0
  208. package/pipeline/scripts/toolkit-tools.mjs +625 -0
  209. package/pipeline/scripts/transcript-index.mjs +4 -1
  210. package/pipeline/scripts/uninstall.mjs +3 -0
  211. package/pipeline/scripts/work-items.mjs +473 -0
  212. package/pipeline/skills/.skill-manifest.json +23 -11
  213. package/pipeline/skills/.skills-index.json +34 -1
  214. package/pipeline/skills/shared/README.md +6 -3
  215. package/pipeline/skills/shared/core/multi-agent-autopilot-on/SKILL.md +13 -15
  216. package/pipeline/skills/shared/core/multi-agent-office-off/SKILL.md +16 -0
  217. package/pipeline/skills/shared/core/multi-agent-office-on/SKILL.md +21 -0
  218. package/pipeline/skills/shared/core/multi-agent-office-status/SKILL.md +17 -0
  219. package/pipeline/skills/shared/core/multi-agent-prune-logs/SKILL.md +4 -1
  220. package/pipeline/skills/shared/core/multi-agent-review/SKILL.md +19 -0
  221. package/pipeline/skills/shared/core/multi-agent-scenario-audit/SKILL.md +4 -2
  222. package/pipeline/skills/shared/core/multi-agent-serve/SKILL.md +4 -2
  223. package/pipeline/skills/shared/core/multi-agent-stack/SKILL.md +14 -6
  224. package/pipeline/skills/shared/core/multi-agent-steer/SKILL.md +10 -9
  225. package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +3 -3
  226. package/pipeline/skills/shared/core/multi-agent-test-gen/SKILL.md +26 -3
  227. package/pipeline/skills/skills-index.md +4 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mmerterden/multi-agent-pipeline",
3
- "version": "20.29.0",
3
+ "version": "20.33.0",
4
4
  "description": "6-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",
@@ -86,6 +86,8 @@
86
86
  "CHANGELOG.md",
87
87
  "LICENSE",
88
88
  "SECURITY.md",
89
+ "!pipeline/office-src/**",
90
+ "!pipeline/office-art/**",
89
91
  "!pipeline/scripts/smoke-figma-config-schema.sh",
90
92
  "!pipeline/scripts/smoke-personal-data.sh",
91
93
  "!pipeline/scripts/validate-prefs.mjs",
@@ -117,7 +117,7 @@ Two channels run in parallel at every phase boundary:
117
117
  ```bash
118
118
  # Phase 0, very first shell call (every CLI):
119
119
  bash $HOME/.claude/scripts/phase-tracker.sh init "$TASK_ID"
120
- for p in "0:Init" "1:Plan" "3:Review" "4:Commit" "5:Report"; do
120
+ for p in "0:Intake" "1:Evidence" "2:Synthesis" "3:Review" "4:Publish" "5:Report"; do
121
121
  bash $HOME/.claude/scripts/phase-tracker.sh add "${p%%:*}" "${p#*:}"
122
122
  done
123
123
  bash $HOME/.claude/scripts/phase-tracker.sh update 0 in_progress
@@ -131,13 +131,13 @@ bash $HOME/.claude/scripts/phase-tracker.sh tokens <N> <in> <out> [cached]
131
131
 
132
132
  ### Visual channel - Claude Code (native TaskList widget, required)
133
133
 
134
- In Claude Code the agent MUST also drive the native TaskList widget so the user sees a sticky phase tile stack - this is the only progress signal Claude Code surfaces. Register one tile per phase of the active set (`0:Init 1:Plan 3:Review 4:Commit 5:Report`) with `TaskCreate`, persist each `taskId` via `phase-tracker.sh meta <N> tasklist_id "<taskId>"`, and at every phase entry, sub-step and exit pair a `TaskUpdate` (status or `activeForm`) with the matching `phase-tracker.sh update`. Call pattern: `$HOME/.claude/multi-agent-refs/tracker-contract.md` section "Call pattern". Mirror each with `phase-tracker.sh task` ("Mirroring the host's task list").
134
+ In Claude Code the agent MUST also drive the native TaskList widget so the user sees a sticky phase tile stack - this is the only progress signal Claude Code surfaces. Register one tile per phase of the active set (`0:Intake 1:Evidence 2:Synthesis 3:Review 4:Publish 5:Report`) with `TaskCreate`, persist each `taskId` via `phase-tracker.sh meta <N> tasklist_id "<taskId>"`, and at every phase entry, sub-step and exit pair a `TaskUpdate` (status or `activeForm`) with the matching `phase-tracker.sh update`. Call pattern: `$HOME/.claude/multi-agent-refs/tracker-contract.md` section "Call pattern". Mirror each with `phase-tracker.sh task` ("Mirroring the host's task list").
135
135
 
136
- `analysis` mode does NOT TaskCreate phase 2: register tiles for the active set only.
136
+ `analysis` mode TaskCreates all 6 phases (no phase is skipped).
137
137
 
138
138
  #### TaskCreate ordering (strict)
139
139
 
140
- **All TaskCreate calls in a batch fire in strict phase-number order BEFORE any TaskUpdate is applied**, and a later batch only ever appends phases numbered above everything already registered. For `analysis` that means: Phase 0 → Phase 1 → Phase 3 → Phase 4 → Phase 5. The native widget renders by creation order, not by phase number - out-of-order calls produce visually scrambled tile stacks (e.g. `1 ✓ · 2 ✓ · 4 ✓ · 0 ▶ · 3 ☐`) even when the underlying state is correct. Pre-marking phases as completed/skipped before Phase 0 starts is FORBIDDEN - register the tile in order, then flip status via TaskUpdate when the phase actually short-circuits. Full ordering contract in `$HOME/.claude/multi-agent-refs/tracker-contract.md` section "TaskCreate ordering (strict)".
140
+ **All TaskCreate calls in a batch fire in strict phase-number order BEFORE any TaskUpdate is applied**, and a later batch only ever appends phases numbered above everything already registered. For `analysis` that means: Phase 0 → Phase 1 → Phase 2 → Phase 3 → Phase 4 → Phase 5. The native widget renders by creation order, not by phase number - out-of-order calls produce visually scrambled tile stacks (e.g. `1 ✓ · 2 ✓ · 4 ✓ · 0 ▶ · 3 ☐`) even when the underlying state is correct. Pre-marking phases as completed/skipped before Phase 0 starts is FORBIDDEN - register the tile in order, then flip status via TaskUpdate when the phase actually short-circuits. Full ordering contract in `$HOME/.claude/multi-agent-refs/tracker-contract.md` section "TaskCreate ordering (strict)".
141
141
 
142
142
  ### Visual channel - Copilot CLI / plain shell
143
143
 
@@ -206,25 +206,23 @@ installer puts it; the runner tries the captured path first, then that `PATH`.
206
206
  "Configure only" is a real answer and the safe default to offer first: the queue
207
207
  can be watched with `autopilot-status` for a while before anything runs.
208
208
 
209
- On **Start**:
209
+ On **Start**, load the schedule and the awake agent with the same script the
210
+ office panel's `POST /v1/autopilot/on` calls, naming every repo selected in step 3:
210
211
 
211
212
  ```bash
212
- launchctl bootstrap "gui/$(id -u)" "$HOME/Library/LaunchAgents/com.multi-agent.autopilot.plist" 2>/dev/null \
213
- || launchctl load "$HOME/Library/LaunchAgents/com.multi-agent.autopilot.plist"
213
+ node "$HOME/.claude/scripts/autopilot-control.mjs" on --repo <owner/name> [--repo <owner/name>...]
214
214
  ```
215
215
 
216
- Then the awake agent, rendered from
217
- `templates/multi-agent-autopilot-awake.plist.template` with the `awake.display`
218
- answer saved above:
219
-
220
- ```bash
221
- . "$HOME/.claude/lib/autopilot-state.sh"
222
- node "$(ma_ap_asset scripts/autopilot-awake.mjs)" install
223
- ```
224
-
225
- A non-zero exit means launchd refused the job: say so, with its path, and say
226
- the Mac may sleep between ticks until it is fixed. The schedule itself stays on.
227
- "Configure only" installs neither.
216
+ It keeps exactly those repos in `config.json`, probes their credentials again
217
+ (`autopilot-arming.mjs probeCredentials`), renders
218
+ `templates/multi-agent-autopilot.plist.template` with its seven placeholders
219
+ (NODE, TICK, LABEL, ROOT, INTERVAL, HOME, CLAUDE), loads it with `launchctl
220
+ bootstrap` (falling back to `load`) and installs the awake agent with the
221
+ `awake.display` answer saved above. `scheduled: false` with probe problems means
222
+ nothing was loaded; say so with the problems. Exit 1 with `launchd refused`
223
+ means launchd refused the job: say so, with its path, and say the Mac may sleep
224
+ between ticks until it is fixed. "Configure only" is `--configure-only`, which
225
+ saves the selection and installs neither.
228
226
 
229
227
  ### 9. Report what is now true
230
228
 
@@ -0,0 +1,27 @@
1
+ ---
2
+ description: "Close the office panel and stop its local server. Use when done with the panel."
3
+ description-tr: "Ofis panelini hemen kapatır: office-on'un başlattığı yerel sözleşme sunucusunu durdurur. Arkada hiçbir şey kalmaz (relay yok, oturum yok, izleyici yok)."
4
+ argument-hint: "(no arguments)"
5
+ parameters: []
6
+ gui: button
7
+ destructive: false
8
+ confirm: none
9
+ allowed-tools: Bash
10
+ ---
11
+
12
+ # multi-agent office-off - close the panel
13
+
14
+ Stops the server `office-on` started, through the same script:
15
+
16
+ ```bash
17
+ node "$HOME/.claude/scripts/office-control.mjs" off --json
18
+ ```
19
+
20
+ Only the pid `office-on` recorded is signalled (SIGTERM), and only when its
21
+ token file still names it, its command is `contract-server.mjs` and its start
22
+ time matches; no other process is looked up or touched. The server removes its
23
+ token file on the way out, so the old page stops working.
24
+
25
+ Report in `outputLanguage`: whether a server was stopped (`stopped`), and the
26
+ `remote` line as the script gives it. A panel that was already closed is not
27
+ an error.
@@ -0,0 +1,51 @@
1
+ ---
2
+ description: "Open the office: a local browser page that shows runs and agents live and drives the ecosystem (new runs, jobs, PRs, keys, memory, system, cleanup). Use when you want to watch or drive runs from a browser."
3
+ description-tr: "Ofisi açar: koşuları ve ajanları canlı gösteren, ekosistemi yöneten yerel web sayfası (yeni koşu, işler, PR'lar, anahtarlar, hafıza, sistem, temizlik). Yerel sözleşme sunucusunu gerektiğinde başlatır; sunucu /multi-agent:office-off ile durdurulana kadar çalışır."
4
+ argument-hint: "(no arguments)"
5
+ parameters: []
6
+ gui: button
7
+ destructive: false
8
+ confirm: none
9
+ allowed-tools: Bash
10
+ ---
11
+
12
+ # multi-agent office-on - open the panel
13
+
14
+ The panel is a page (`$HOME/.claude/office/index.html`) served by the
15
+ pipeline's local contract server (`contract-server.mjs`, 127.0.0.1 only, a
16
+ fresh bearer token per start). This command and `office-off` /
17
+ `office-status` share one script, `office-control.mjs`.
18
+
19
+ ## Steps
20
+
21
+ 1. **Start or reuse the server and open the browser:**
22
+
23
+ ```bash
24
+ node "$HOME/.claude/scripts/office-control.mjs" on --json
25
+ ```
26
+
27
+ It starts `contract-server.mjs` in the background with the panel page, or
28
+ reuses the one it started earlier, then opens the browser at `/office` with
29
+ a one-time code in the URL fragment (valid 10 seconds, one use, handed over
30
+ through a 0600 launcher file, never on a command line), which the
31
+ page trades for the token. The token is never printed; do not read the
32
+ token file or pass `--print-token` yourself, since anything printed lands
33
+ in this transcript.
34
+
35
+ 2. **Report** (in `outputLanguage`): the page URL (`url`, without a code),
36
+ whether a server was started or reused (`restarted` true means the running
37
+ one was older than the installed pipeline and was replaced), that it keeps
38
+ running until `/multi-agent:office-off` stops it. If `opened` is false, tell the user
39
+ to run the command again from a desktop session; a link works once, so a
40
+ reload of the page needs a new `office-on`.
41
+
42
+ ## What it does not do
43
+
44
+ - No daemon or file watcher beside the one server, which runs until
45
+ `office-off`, and no hook of its own: the task lists come from the
46
+ `task-mirror` hook that install registers for every run.
47
+ - The panel's writes call the same scripts the terminal commands call; it adds
48
+ no behaviour of its own.
49
+ - The server listens on 127.0.0.1 only. Remote access is not part of this
50
+ installation; `office-status` says whether a separate remote layer is
51
+ present.
@@ -0,0 +1,29 @@
1
+ ---
2
+ description: "Whether the office panel is running, its URL (never the token) and its last actions. Use when unsure if the panel is open."
3
+ description-tr: "Ofis panelinin durumunu raporlar: yerel sunucu çalışıyor mu, sayfa adresi (token asla), boşta kapanma süresi, uzak erişim, eşleşmiş telefonlar ve panelden yapılan son işlemler."
4
+ argument-hint: "(no arguments)"
5
+ parameters: []
6
+ gui: button
7
+ destructive: false
8
+ confirm: none
9
+ allowed-tools: Bash
10
+ ---
11
+
12
+ # multi-agent office-status - what the panel is doing
13
+
14
+ ```bash
15
+ node "$HOME/.claude/scripts/office-control.mjs" status --json
16
+ ```
17
+
18
+ Report in `outputLanguage`:
19
+
20
+ - `running`, and when it is, `url` and `idleMinutes` (0 means it runs until `office-off`);
21
+ - `remote`: "not available in this installation" unless a separate remote
22
+ layer is installed; report the line as given;
23
+ - `pairedDevices`: the devices the phone registry lists; revoking one is
24
+ `phone-devices.mjs revoke`;
25
+ - `recentActions`: the last writes taken through the server (route, step,
26
+ status, when, and whether from the panel page), from
27
+ `office-actions.jsonl`. They carry no request body.
28
+
29
+ Never print the token or read the token file.
@@ -21,7 +21,10 @@ whole task dirs, with optional age / project / task filters.
21
21
  Backed by `$HOME/.claude/scripts/prune-logs.sh`. Safe by default: it previews
22
22
  and deletes nothing until you confirm. The audit trail (`audit.jsonl` +
23
23
  rotations) and the metrics corpus (`metrics.jsonl`, `metrics-summary.md`) live
24
- at the log-root top level and are never removed; `.counter` files survive too.
24
+ at the log-root top level and are never removed; `.counter` files survive too. A run that can still be resumed (its `agent-state.json` status is not
25
+ finished, abandoned or cancelled) keeps its log however old it is, and
26
+ so does a folder written in the last 10 minutes; `--task` names one dir and
27
+ bypasses both.
25
28
 
26
29
  Unlike `/multi-agent:purge` (which wipes worktrees, branches, logs, and state
27
30
  together), this only removes log dirs and leaves your worktrees and branches
@@ -41,10 +41,11 @@ Branch-mode runs print to chat only. PR-mode runs print to chat AND post the ver
41
41
  : "${TASK_ID:=review-$(date +%s)-$$}"
42
42
  export TASK_ID
43
43
 
44
- # Clean up scratch files on exit so /tmp doesn't accumulate diffs and SHAs.
45
44
  trap 'rm -f /tmp/multi-agent-review-${TASK_ID}-*' EXIT
46
45
  ```
47
46
 
47
+ Standalone only (a `review-` id): register a tracker record per `$HOME/.claude/multi-agent-refs/review-standalone-tracker.md`.
48
+
48
49
  ### 1. Parse the input - pick a resolution path
49
50
 
50
51
  ```bash
@@ -379,10 +380,10 @@ If the post fails (network, token, harness block), `post-pr-review.sh` exits non
379
380
  Per the `$HOME/.claude/multi-agent-refs/tracker-contract.md` tokens contract, after each reviewer LLM call:
380
381
 
381
382
  ```bash
382
- bash $HOME/.claude/scripts/phase-tracker.sh tokens 4 <input_count> <output_count>
383
+ bash $HOME/.claude/scripts/phase-tracker.sh tokens <N> <input_count> <output_count>
383
384
  ```
384
385
 
385
- Standalone `/multi-agent:review` runs use phase id 3 (matches Phase 3 Review in the full pipeline) so cost aggregation stays consistent.
386
+ `<N>`: the run's Review phase, or step 2 for a standalone review.
386
387
 
387
388
  ## Input matrix
388
389
 
@@ -55,7 +55,9 @@ Read the candidate lines it returns. A term nothing matched is listed under
55
55
 
56
56
  ## Step 3 - Verdict
57
57
 
58
- Write `/tmp/ma-verdicts.json`: `[{id, status, citations, searched, note}]`.
58
+ Write the verdicts to a file in a folder of this run's own
59
+ (`VERDICTS="$(mktemp -d)/verdicts.json"`, never a fixed `/tmp` name another
60
+ user or a second audit could share): `[{id, status, citations, searched, note}]`.
59
61
 
60
62
  | Status | When | Needs |
61
63
  |---|---|---|
@@ -66,7 +68,7 @@ Write `/tmp/ma-verdicts.json`: `[{id, status, citations, searched, note}]`.
66
68
 
67
69
  ```bash
68
70
  node "$HOME/.claude/scripts/scenario-audit.mjs" verify --csv "<scenarios.csv>" \
69
- --verdicts /tmp/ma-verdicts.json --repo "<repo>" --lang "<outputLanguage>"
71
+ --verdicts "$VERDICTS" --repo "<repo>" --lang "<outputLanguage>"
70
72
  ```
71
73
 
72
74
  ## Step 4 - Report
@@ -61,5 +61,7 @@ environment `launch.json` declares; the client starts the process.
61
61
  `POST /v1/runs/{id}/answer` accepts only an option the run's pending question
62
62
  offered. `POST /v1/runs/{id}/kill` and `POST /v1/gc` act only on a second
63
63
  request carrying the single-use confirm token the first one returned, and a
64
- kill never deletes the remote branch or the logs. Autopilot can be turned off
65
- over HTTP, never on.
64
+ kill never deletes the remote branch or the logs. Autopilot on, a stack change
65
+ and a routine removal take the same two steps, accept no browser origin but
66
+ the server's own page, and are tagged `local-only` for any future remote
67
+ carrier.
@@ -105,14 +105,21 @@ ON=$(MP="$MP" node -e 'import(process.env.HOME+"/.claude/scripts/_stack-routing.
105
105
  })' "$@") || exit 1
106
106
  ```
107
107
 
108
- After resolving `$ON`, edit `.claude/settings.json` (create `{ "enabledPlugins": {} }` if absent) so that:
109
- - every plugin in `$ON` is set to `true`,
110
- - every stack toolkit **not** in `$ON` is set to `false` (leave non-`@multi-agent-plugins` entries untouched),
111
- - `ai-common-toolkit@multi-agent-plugins` and `ai-analyst-toolkit@multi-agent-plugins` are always `true`,
112
- - every `ai-*-engineering-toolkit@multi-agent-plugins` key is **deleted** (retired names).
113
- - `xcode-integration@xcode-apple` follows `ios` (`true` with it, `false` without), only when `~/.claude/xcode-apple-marketplace` exists.
114
-
115
- Use the Read + Edit/Write tools (JSON must stay valid). Then print the resulting `enabledPlugins` block and run step 5 (Copilot/Codex refresh offer).
108
+ Then write it with the one writer of these rules (the office panel's
109
+ `POST /v1/stack` calls the same script):
110
+
111
+ ```bash
112
+ node "$HOME/.claude/scripts/stack-toggle.mjs" set --repo "$PWD" "$@" --json
113
+ ```
114
+
115
+ `stack-toggle.mjs` applies the write rules above (selection `true`, every other
116
+ stack toolkit `false`, `ai-common-toolkit` and `ai-analyst-toolkit` always
117
+ `true`, retired `ai-*-engineering-toolkit` keys deleted, `xcode-integration@xcode-apple`
118
+ following `ios` when the Apple marketplace is linked, every other key kept),
119
+ writes the file atomically and prints the resulting `enabledPlugins`. It refuses
120
+ an empty selection and an unknown stack (exit 1) and never hand-edits the JSON.
121
+ `stack-toggle.mjs status --repo "$PWD" --json` is the read for status mode.
122
+ Then print the resulting `enabledPlugins` block and run step 5 (Copilot/Codex refresh offer).
116
123
 
117
124
  ## Notes
118
125
 
@@ -71,18 +71,19 @@ is being replaced.
71
71
  and `$INSTRUCTION` the text from step 3:
72
72
 
73
73
  ```bash
74
- printf '{"pendingSteer":{"text":%s,"at":"%s","appliedAt":null,"appliedPhase":null}}' \
75
- "$(node -e 'process.stdout.write(JSON.stringify(process.argv[1]))' "$INSTRUCTION")" \
76
- "$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
77
- | node $HOME/.claude/scripts/write-state.mjs "$STATE_FILE"
74
+ node "$HOME/.claude/scripts/steer-run.mjs" "$STATE_FILE" --text "$INSTRUCTION"
78
75
  ```
79
76
 
80
- The instruction is JSON-encoded by `node -e`, not by hand: it is arbitrary
81
- user text, and a quote or newline in it would otherwise produce invalid JSON
82
- or, worse, a payload that merges into fields nobody meant to touch.
77
+ `steer-run.mjs` takes the same lock `write-state.mjs` owns and merges
78
+ `pendingSteer` (`text`, `at`, `appliedAt: null`, `appliedPhase: null`) into
79
+ the state; the instruction is passed as one argument and JSON-encoded by the
80
+ script, never by hand, so a quote or newline in it cannot produce invalid
81
+ JSON or a payload that merges into other fields. It refuses a finished run
82
+ (exit 1) and prints the unconsumed instruction it replaced, if any. The
83
+ office panel's `POST /v1/runs/{id}/steer` calls the same function.
83
84
 
84
- Exit 2 (lock timeout) → the task is mid-write. Retry once, then report it
85
- rather than forcing the write.
85
+ Exit 2 (usage) or a lock timeout → the task is mid-write. Retry once, then
86
+ report it rather than forcing the write.
86
87
 
87
88
  6. **Confirm**: `🧭 Steer queued for #N - applies at the entry to Phase {N+1}`
88
89
 
@@ -73,12 +73,13 @@ Run every step automatically:
73
73
  ```
74
74
  Step 0: DOCTOR doctor.mjs - exit 2 or 4 stops the sync
75
75
  Step 1.5: DETECT Compare timestamps, find stale targets
76
- Step 2: COPILOT Claude Code -> Copilot CLI (instructions + 66 sub-command skills)
76
+ Step 2: COPILOT Claude Code -> Copilot CLI (instructions + 69 sub-command skills)
77
77
  Step 2b: CODEX Claude Code -> Codex CLI (1 router skill + sub-command specs as refs + agent TOML)
78
78
  Step 3: REPO Claude Code -> pipeline repo (genericized, personal data scrub, bash -n on all sh)
79
79
  Step 3c: PLUGINS pipeline shared/external -> multi-agent-plugins marketplace (rebuild knowledge/,
80
80
  bump changed plugins' patch version, commit + push the plugins repo)
81
81
  Step 3d: DEV-TOOLKIT companion MCP server -> detect movement, run the ship gates, commit + publish
82
+ Step 3e: OFFICE panel page is current, installed copies match it, toolkit version recorded
82
83
  Step 4: WEBSITE Version + phase/model counts -> {website-host} (i18n + projects.ts)
83
84
  Step 5: Commit Commit + push all changed repos
84
85
  Step 6: Report Summary: synced targets, platform, changed files, deploy status, multi-agent-toolkit version
@@ -131,6 +132,7 @@ Step 0 gate rules and why: `features/doctor.md`.
131
132
  - `~/.claude/CLAUDE.md`, `~/.claude/rules/`, `~/.claude/knowledge/`
132
133
  - `~/.claude/scripts/` - EXCEPT `pre-commit-check.sh`, `agent-guard.sh`, `agent-guard.py`, and `build-stack-plugins.mjs` (generic, synced)
133
134
  - `~/.claude/settings.json`
135
+ - `~/.claude/office/` - the office panel flows the other way: its source is the repo (`pipeline/office-src`, built by `office-build.mjs` into `pipeline/office`), and the installer copies it to each host. Never copy it from `~/.claude` into the repo; Step 3e checks it instead
134
136
  - `~/.claude/multi-agent-refs/registries/` - the installer copies gate registries there from `pipeline/skills/shared/external`; the repo already holds the source
135
137
  - **Any `~/.claude/commands/multi-agent/*/SKILL.md` whose frontmatter has `local-only: true`** - these are user/repo-specific alias wrappers that delegate to a private marketplace plugin's skills exposed as `multi-agent:<name>`. Syncing them would leak the private plugin/skill names into the public pipeline. Skip them at copy time; the backstop below proves none reached `pipeline/commands/`.
136
138
  ```bash
@@ -226,9 +228,19 @@ When invoked with the `release` argument:
226
228
  8. WEBSITE Version + features -> {website-host} (maintainer identity, build verified Ready)
227
229
  9. COPILOT Copilot CLI instructions + skills sync
228
230
  9b. CODEX Codex CLI router skill + refs + agent TOML (node install.js --codex)
231
+ 9c. OFFICE Step 3e: the installed panel matches the release
229
232
  10. Report Summary: version, touched repos, deploy status
230
233
  ```
231
234
 
235
+ ### Step 3e: OFFICE (every sync, and step 9c of a release)
236
+
237
+ The office panel ships with the pipeline, so a sync carries it by checking it, not by copying it:
238
+
239
+ 1. `node ~/multi-agent-pipeline/pipeline/scripts/office-build.mjs --check`: the committed page is what `pipeline/office-src` builds to, and `office/toolkit.json` carries the toolkit version in `docs/facts.json`. Either stale fails the sync until it is rebuilt and committed; a release that regenerates facts rebuilds the office right after.
240
+ 2. After the install steps, compare `pipeline/office/index.html` with the installed copies (`~/.claude/office/`, and the Copilot and Codex trees when installed), byte for byte, plus the asset list. A difference means the install is behind: run `node install.js --installed` and compare again.
241
+ 3. Report the toolkit version the installed `office/toolkit.json` carries: it is what the office Tools window starts, and it moves forward with every release.
242
+ 4. An office server that is already running picks the update up by itself: the open page shows a reload banner, and `/multi-agent:office-on` replaces a server whose code changed. Nothing to restart by hand.
243
+
232
244
  ---
233
245
 
234
246
  ## Sub-Command Sync (Claude Code <-> Copilot CLI Skills)
@@ -241,14 +253,14 @@ same specs as reference files rather than as peer skills, via Step 2b - see
241
253
  |-------------|-------------|
242
254
  | `~/.claude/commands/multi-agent/{cmd}/SKILL.md` | `~/.copilot/skills/multi-agent-{cmd}/SKILL.md` |
243
255
 
244
- **66 commands are synced** (canonical inventory - must match `cross-cli-contract.md` section 1; drift = contract violation):
256
+ **69 commands are synced** (canonical inventory - must match `cross-cli-contract.md` section 1; drift = contract violation):
245
257
 
246
258
  ```
247
259
  analysis, analysis-jira, analysis-resolve, autopilot, autopilot-off, autopilot-on,
248
260
  autopilot-status, bug-bash, build-optimize, channels, complaint-analysis, create-jira,
249
261
  design-check, diff-explain, doctor, estimate, feedback, forget, garbage-collect, graph, help,
250
262
  ios-coding-standard, issue, jira, kill, language, log,
251
- manual-test, model, postmortem, prune-logs, prune-prompts, purge, refactor, research, resume, review, review-analysis, review-issue, review-jira, route-off, route-on, route-status,
263
+ manual-test, model, office-off, office-on, office-status, postmortem, prune-logs, prune-prompts, purge, refactor, research, resume, review, review-analysis, review-issue, review-jira, route-off, route-on, route-status,
252
264
  routines, save, scaffold, scan, scenario-audit, search, security-review, serve, setup, stack, status, steer, store-ready, sync, test,
253
265
  test-accessibility, test-dark-mode, test-dynamic-type, test-gen, test-screenshots,
254
266
  testflight-validation, uninstall, update
@@ -47,9 +47,32 @@ Scripts: `test-gen-gate.mjs` (artefact, handle and write gates),
47
47
  ## Step 1 - Prepare
48
48
 
49
49
  1. Repo: `--repo`, else the current directory; confirm it in one line.
50
- Platform: `--platform`, else detect as `/multi-agent:test` does. Run id
51
- `tg-<timestamp>`; `RUN="$HOME/.claude/logs/test-gen/<repo>/<timestamp>"`,
52
- created with `mkdir -p "$RUN"`.
50
+ Platform: `--platform`, else detect as `/multi-agent:test` does. One
51
+ timestamp names the run everywhere: `TS="$(date +%Y%m%d%H%M%S)"`, run id
52
+ `tg-$TS`, `RUN="$HOME/.claude/logs/test-gen/<repo>/$TS"`, created with
53
+ `mkdir -p "$RUN"`.
54
+ Register the run so its progress shows wherever runs are read (the office
55
+ panel, `/multi-agent:status`), with one step per stage below:
56
+
57
+ ```bash
58
+ TG_ID="tg-$TS"
59
+ S="${LOGS_ROOT:-$HOME/.claude/logs/multi-agent}/$TG_ID"; mkdir -p "$S"
60
+ printf '{"taskId":"%s","mode":"test-gen","status":"in_progress","currentPhase":0}' "$TG_ID" \
61
+ | node "$HOME/.claude/scripts/write-state.mjs" "$S/agent-state.json" >/dev/null
62
+ export MULTI_AGENT_TASK_ID="$TG_ID"
63
+ bash "$HOME/.claude/scripts/phase-tracker.sh" init "$TG_ID"
64
+ for p in "0:Prepare" "1:Inventory" "2:Discovery" "3:Handles" "4:Tests" "5:Report"; do
65
+ bash "$HOME/.claude/scripts/phase-tracker.sh" add "${p%%:*}" "${p#*:}"
66
+ done
67
+ bash "$HOME/.claude/scripts/phase-tracker.sh" update 0 in_progress
68
+ ```
69
+
70
+ Each step below starts with `update <N> in_progress` and ends with
71
+ `update <N> completed` (Step 5 and Step 6 share step 4), every call prefixed
72
+ `MULTI_AGENT_TASK_ID=<the tg- id, written out> MULTI_AGENT_STRICT_TASK_ID=1`
73
+ since it runs in a new shell where `$TG_ID` is gone, and on
74
+ Claude Code each gets a task-widget tile named as its tracker line
75
+ (`tracker-contract.md`, "Call pattern").
53
76
  2. Toolkit: `test_results_classify`, `coverage_gap` and `ui_locator_codegen`
54
77
  need `@mmerterden/multi-agent-toolkit-mcp` >= v3.25.0. Check the tool list
55
78
  once. Each missing tool has a fallback in `stages.md` (classify from the
@@ -122,3 +145,6 @@ inventory, the gaps, the triage). Then record the change base
122
145
  Offer, one question: open the product bugs through `/multi-agent` with each
123
146
  failing test as the acceptance check, or stop. **No commit, no push, no issue
124
147
  from this command.**
148
+
149
+ Last, close the run record: `phase-tracker.sh update 5 completed`, then the
150
+ same `write-state.mjs` call with `"status":"complete","currentPhase":5`.
@@ -3,6 +3,114 @@
3
3
  Versions of the client contract (`manifest.json` `contractVersion`), separate
4
4
  from the package version. See `README.md` for what counts as minor and major.
5
5
 
6
+ ## 1.6.0
7
+
8
+ Added. Nothing existing changes shape.
9
+
10
+ - `GET /v1/system` (`system-status.mjs --json`): CPU, memory, disk and the
11
+ pipeline's own processes, numbers only.
12
+ - `GET /v1/credentials` (`office-credentials.mjs --json [--probe]`, local-only):
13
+ logical names, state and probe verdict per credential, never a value.
14
+ - `GET /v1/memory` (`office-memory.mjs --json`, local-only): per-repository code
15
+ graph age and learning, finding and session-note counts, redacted.
16
+ - `POST /v1/prune-logs` (two steps, local-only): the task log folders older than
17
+ 7, 30 or 90 days, then a prune of exactly that list; 409 `changed` when the
18
+ folders moved since the preview.
19
+ - `GET /v1/settings` and `POST /v1/settings` (two steps, local-only, one change
20
+ at a time): output language, the fable rung and model routing; a route-on
21
+ preview names a saved free provider chain in `change.freeChain`.
22
+ - runs and run (1.3.0): `source`, `prNumber`, `mode`, `channels`, and the
23
+ local-only `channelUrls`, dropped from a redacted answer.
24
+ - activity, activity stream, agent chat, routines, routine delete, repo add and
25
+ remove (1.1.0): tables carry `source`, `pr`, `channels`, `waitingFor`,
26
+ `currentTask`, `progress` and each phase's `tasks`; seats carry their own
27
+ `tasks` and recent `mcp` calls.
28
+ - prs, issue maturity, review verdict (1.1.0): a pull request names the
29
+ `account` it was listed for, numbered in a redacted answer.
30
+
31
+ ## 1.5.0
32
+
33
+ Added. Nothing existing changes shape.
34
+
35
+ - `GET /v1/repos?all=1` (`launch-request.mjs repos --all`): `suggested`
36
+ (checkouts earlier runs worked in that launch does not accept yet) and
37
+ `missing` (registered entries whose folder is gone), each with an `id`; a
38
+ page sees ids and names, never paths.
39
+ - `POST /v1/repos` (two steps, `repo-request.schema.json`,
40
+ `repo-change.schema.json`, `local-only`/`high`): register a suggestion by id
41
+ or an absolute path to a git checkout. `DELETE /v1/repos/{id}` (two steps)
42
+ removes a registered entry; configured autopilot repositories are not
43
+ touched.
44
+ - `version` on `GET /v1/tools`: the exact toolkit version the panel starts.
45
+ - `GET /v1/jobs` (`office-jobs.schema.json`): the jobs the office can start,
46
+ from `schemas/office-jobs.json`. `POST /v1/jobs` (two steps,
47
+ `job-request.schema.json`, `job-change.schema.json`, `local-only`/`high`)
48
+ starts one with `claude --bg` under the unattended profile; it is the one
49
+ route that starts a session itself.
50
+ - `--idle-minutes 0` and `--max-hours 0` mean no idle stop and no lifetime.
51
+
52
+ ## 1.4.0
53
+
54
+ Added. Nothing existing changes shape; one narrowing for browser pages.
55
+
56
+ - `remote` and `risk` on every surface in `manifest.json` and every route in
57
+ `ROUTES`: the scope a remote carrier would require (`read`, `answer`,
58
+ `launch`, `local-only`) and the confirmation tier (`read`, `low`, `high`).
59
+ - `GET /v1/activity` and `GET /v1/activity/stream` (`activity.schema.json`):
60
+ a room per repository, a table (team) per run, a seat per agent; the stream is
61
+ `text/event-stream`, at most 4 at once (429 `too-many-streams`).
62
+ - `GET /v1/agents/{sessionId}/{agentId}/chat` (`activity-chat.schema.json`):
63
+ one page of an agent's transcript, redacted; `before`, `limit`.
64
+ - `POST /v1/autopilot/on` (two steps, `autopilot-on.schema.json`), `POST
65
+ /v1/runs/{id}/steer` (two steps, `launch`/`high`: the text and a preview
66
+ with a token bound to the run and the text, then the token alone;
67
+ `steer.schema.json`), `GET /v1/routines`, `DELETE /v1/routines/{name}` (two
68
+ steps), `GET /v1/stack`, `POST /v1/stack` (two steps).
69
+ - `GET /v1/ledger` (`ledger.schema.json`): tokens and estimated USD today, this
70
+ week and this month, by run, repository, model and phase, each amount with
71
+ its source; an unmeasurable run is `not-measured`, never 0.
72
+ - `GET /v1/runs/{id}/results` and `/evidence/{name}`: diff summary, review
73
+ findings, test outcome, screenshots and analysis documents from the run's
74
+ own files; a document is read only inside the run's roots (log directory,
75
+ artifacts, a worktree git lists) and only as Markdown or HTML.
76
+ - `GET /v1/issues/{key}/maturity` (lib/issue-fetcher.sh), `GET /v1/prs`
77
+ (GitHub; Bitbucket reported as not implemented), `POST
78
+ /v1/runs/{id}/review-verdict` (two steps, lib/post-pr-review.sh; only for a
79
+ finished review with every finding triaged, 409 `review-incomplete`
80
+ otherwise; the token is bound to the decision and `findingsDigest`, 409
81
+ `confirm-mismatch` when they changed).
82
+ - `GET /v1/tools`, `POST /v1/tools/{name}/call` (`local-only`): the
83
+ registered toolkit MCP server's tools, arguments checked against each
84
+ inputSchema, risk from each tool's annotations, and `allowed`/`reason`:
85
+ calls are denied by default (403 `tool-not-allowed`) except for read-only
86
+ tools that take no location and are outside the web and context families;
87
+ a `confirm` argument is refused; the toolkit child always runs with
88
+ `MULTI_AGENT_UNATTENDED=1` and `MCP_TOOLKIT_URL_POLICY=strict`.
89
+ - `GET /v1/services/confluence`, `/crashlytics`, `/figma`: one page, issue or
90
+ frame through the pipeline's existing clients; a Confluence URL only on the
91
+ configured host (409 `host-not-allowed`); one request per service at a time
92
+ (429 `busy`).
93
+ - `GET /v1/permissions`: the shape for pending host permission prompts;
94
+ `available: false` until the host records them readably.
95
+ - `GET /office`: the optional panel page, 404 when none is installed;
96
+ `POST /office/code` and `POST /office/exchange` hand the page the token
97
+ through a one-time 10 second code instead of a URL; `GET
98
+ /office/assets/<name>.png` serves its sprites.
99
+ - `--max-hours` (default 8): an absolute lifetime for the server.
100
+ - `contract-error.schema.json`: `no-selection`, `repo-not-configured`,
101
+ `invalid-config`, `not-installed`, `repo-ambiguous`, `unreadable-settings`,
102
+ `not-removable`, `not-steerable`, `too-many-streams`, `no-review`,
103
+ `upstream-failed`, `tool-not-allowed`, `busy`, `review-incomplete`,
104
+ `host-not-allowed`.
105
+ - Narrowed: a write (POST, DELETE) from a page on an `--allow-origin` origin is
106
+ now 403 `forbidden-origin`; only the server's own page may write. A native
107
+ client sends no Origin and is unaffected.
108
+ - `?repo=` also takes a repository name from `GET /v1/repos` (on the stack
109
+ route and on `POST /v1/launch`), since a browser reads that list redacted,
110
+ without paths. The repository must still be a configured or registered one:
111
+ an unknown name is 403 `repo-not-allowed`, an ambiguous one 409
112
+ `repo-ambiguous`. A relative path is no longer 400 but resolved as a name.
113
+
6
114
  ## 1.3.0
7
115
 
8
116
  Added. Every new field is optional for a decoder: a run written before this