@staix/agent-hub 0.19.0 → 0.21.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 (184) hide show
  1. package/CHANGELOG.md +70 -3
  2. package/README.md +2 -2
  3. package/docs/agent-notes/README.md +11 -0
  4. package/docs/agent-notes/adapters.md +10 -5
  5. package/docs/agent-notes/benchmarks.md +27 -0
  6. package/docs/agent-notes/budget.md +2 -1
  7. package/docs/agent-notes/bus.md +3 -3
  8. package/docs/agent-notes/daemon.md +20 -7
  9. package/docs/agent-notes/local-worker.md +5 -0
  10. package/docs/agent-notes/models.md +2 -0
  11. package/docs/agent-notes/tasks.md +20 -10
  12. package/docs/agent-notes/tests.md +13 -5
  13. package/docs/bench.md +1 -1
  14. package/docs/data-policy.md +2 -0
  15. package/docs/dogfood.md +41 -5
  16. package/docs/events.md +2 -1
  17. package/docs/memory.md +9 -3
  18. package/docs/operations.md +598 -63
  19. package/docs/profiles.md +13 -1
  20. package/docs/quickstart.md +18 -9
  21. package/docs/research.md +7 -4
  22. package/docs/sdlc.md +66 -10
  23. package/docs/security.md +397 -35
  24. package/docs/smoke.md +127 -0
  25. package/docs/specs/2026-09-19-agent-hub-design.md +1149 -19
  26. package/docs/verification/2026-10-27-0.19.0.md +5 -5
  27. package/docs/verification/2026-10-27-0.20.0.md +75 -0
  28. package/docs/verification/2026-10-28-claude-2.1.311-2.1.312-bash-permission.json +635 -0
  29. package/docs/verification/2026-10-28-claude-2.1.311-2.1.312-permission-transport.json +403 -0
  30. package/docs/verification/2026-10-28-claude-implementer-permission-triage.md +123 -0
  31. package/docs/verification/2026-10-28-jcode-0.99.1-usage.md +41 -0
  32. package/docs/verification/2026-10-28-realpath-name-audit.md +222 -0
  33. package/docs/verification/2026-10-28-routing-f0bb8ad0.md +1000 -0
  34. package/docs/verification/2026-10-29-0.21.0.md +61 -0
  35. package/docs/verification/2026-10-29-model-effort-capabilities.md +123 -0
  36. package/docs/verification/2026-10-29-modelrouting-b152ddb9.md +953 -0
  37. package/docs/verification/claude-implementer-permission-triage.ts +160 -0
  38. package/docs/verification/claude-permission-transport-native.py +71 -14
  39. package/docs/verification/profiles/YYYY-MM-DD-research.md +1 -1
  40. package/docs/verified.json +26 -18
  41. package/package.json +2 -2
  42. package/plugins/agent-hub/.claude-plugin/plugin.json +1 -1
  43. package/plugins/agent-hub/server.js +1116 -284
  44. package/src/adapters/acp.ts +87 -3
  45. package/src/adapters/channel-peer.ts +11 -5
  46. package/src/adapters/claude-channel.ts +13 -6
  47. package/src/adapters/claude-implementer.ts +61 -7
  48. package/src/adapters/codex-appserver.ts +88 -5
  49. package/src/adapters/conformance/enrollment.ts +4 -4
  50. package/src/adapters/conformance/factories.ts +2 -1
  51. package/src/adapters/conformance/fakes/jcode-agent.ts +6 -2
  52. package/src/adapters/conformance/kit.ts +10 -6
  53. package/src/adapters/definitions/builtin-metadata.ts +3 -114
  54. package/src/adapters/definitions/native-config-defaults.ts +1 -1
  55. package/src/adapters/definitions/native-config-policy.ts +3 -2
  56. package/src/adapters/definitions/native-context.ts +12 -0
  57. package/src/adapters/external-metadata.ts +48 -0
  58. package/src/adapters/external-modules.ts +63 -3
  59. package/src/adapters/jcode.ts +6 -2
  60. package/src/adapters/local-worker.ts +42 -25
  61. package/src/adapters/native-proof-ports.ts +10 -0
  62. package/src/adapters/pi.ts +7 -0
  63. package/src/adapters/registry-types.ts +4 -0
  64. package/src/adapters/reviewer-print.ts +1 -0
  65. package/src/broker/protocol.ts +203 -0
  66. package/src/broker/server.ts +314 -0
  67. package/src/broker/store.ts +548 -0
  68. package/src/cli/bench.ts +3 -2
  69. package/src/cli/broker.ts +58 -0
  70. package/src/cli/conductor-recovery.ts +142 -0
  71. package/src/cli/configured-acp-entry.ts +26 -6
  72. package/src/cli/console-state.ts +59 -17
  73. package/src/cli/console.ts +17 -2
  74. package/src/cli/facts-hook.ts +3 -1
  75. package/src/cli/help.ts +28 -16
  76. package/src/cli/identity.ts +23 -10
  77. package/src/cli/init.ts +34 -7
  78. package/src/cli/intake-output.ts +33 -0
  79. package/src/cli/main.ts +314 -71
  80. package/src/cli/output.ts +41 -1
  81. package/src/cli/recovery-package.ts +18 -1
  82. package/src/cli/role-holders.ts +35 -0
  83. package/src/cli/room.ts +304 -0
  84. package/src/cli/say-input.ts +16 -0
  85. package/src/cli/schedule-output.ts +49 -0
  86. package/src/cli/sdlc-output.ts +44 -6
  87. package/src/cli/smoke-pty-bridge.ts +33 -0
  88. package/src/cli/smoke-pty.ts +145 -0
  89. package/src/cli/smoke-run.ts +139 -0
  90. package/src/cli/smoke-target.ts +130 -0
  91. package/src/cli/source-output.ts +29 -0
  92. package/src/cli/task-output.ts +3 -2
  93. package/src/cli/upgrade-runtime.ts +98 -16
  94. package/src/cli/upgrade.ts +66 -7
  95. package/src/hub/ask.ts +76 -12
  96. package/src/hub/board.ts +132 -22
  97. package/src/hub/bus.ts +399 -56
  98. package/src/hub/child-process.ts +2 -0
  99. package/src/hub/ci-watch.ts +162 -0
  100. package/src/hub/claude-failure-stage.ts +85 -0
  101. package/src/hub/claude-launch-proof.ts +67 -2
  102. package/src/hub/claude-shell-wrapper.ts +11 -5
  103. package/src/hub/conductor.ts +17 -4
  104. package/src/hub/config-apply.ts +32 -5
  105. package/src/hub/config-reload.ts +7 -5
  106. package/src/hub/config-trust.ts +8 -1
  107. package/src/hub/context-window.ts +33 -3
  108. package/src/hub/control-client.ts +14 -2
  109. package/src/hub/corpus-config.ts +34 -0
  110. package/src/hub/corpus-evidence.ts +184 -0
  111. package/src/hub/corpus.ts +373 -0
  112. package/src/hub/cost-governance.ts +26 -0
  113. package/src/hub/daemon.ts +1228 -242
  114. package/src/hub/deliverable-files.ts +8 -2
  115. package/src/hub/delivery-journal.ts +123 -17
  116. package/src/hub/dogfood-profile.ts +32 -5
  117. package/src/hub/dogfood-read.ts +6 -2
  118. package/src/hub/envelope.ts +11 -0
  119. package/src/hub/eval-gate.ts +131 -0
  120. package/src/hub/events.ts +1 -1
  121. package/src/hub/external-instance.ts +69 -0
  122. package/src/hub/facts.ts +15 -5
  123. package/src/hub/folder-trigger.ts +223 -0
  124. package/src/hub/hub-tools.ts +2 -1
  125. package/src/hub/inference.ts +20 -5
  126. package/src/hub/instance-config.ts +69 -3
  127. package/src/hub/instance-execution.ts +6 -2
  128. package/src/hub/instances.ts +32 -4
  129. package/src/hub/intake.ts +125 -0
  130. package/src/hub/learning.ts +85 -0
  131. package/src/hub/lifecycle.ts +7 -3
  132. package/src/hub/limits.ts +12 -5
  133. package/src/hub/native-permission-request.ts +77 -0
  134. package/src/hub/operational-authority.ts +63 -5
  135. package/src/hub/operational-settings.ts +76 -0
  136. package/src/hub/operational-view.ts +1 -1
  137. package/src/hub/packs.ts +132 -0
  138. package/src/hub/path-policy.ts +7 -0
  139. package/src/hub/peer-doing.ts +130 -0
  140. package/src/hub/peers.ts +46 -0
  141. package/src/hub/queue-backpressure.ts +58 -0
  142. package/src/hub/read-tools.ts +2 -0
  143. package/src/hub/recovery-authority.ts +151 -0
  144. package/src/hub/recovery-policy.ts +220 -0
  145. package/src/hub/research.ts +24 -14
  146. package/src/hub/restart.ts +7 -0
  147. package/src/hub/routing.ts +54 -11
  148. package/src/hub/schedules.ts +266 -0
  149. package/src/hub/sdlc-merge.ts +38 -14
  150. package/src/hub/sdlc-metrics.ts +32 -10
  151. package/src/hub/sdlc-queue.ts +7 -1
  152. package/src/hub/sdlc-release.ts +1 -1
  153. package/src/hub/sdlc.ts +37 -7
  154. package/src/hub/security-baseline.ts +38 -0
  155. package/src/hub/settings.ts +7 -1
  156. package/src/hub/shipped-packs.ts +8 -0
  157. package/src/hub/snapshots.ts +72 -6
  158. package/src/hub/source-read.ts +160 -0
  159. package/src/hub/sources.ts +311 -0
  160. package/src/hub/task-shell-default.ts +3 -2
  161. package/src/hub/tasks.ts +1047 -115
  162. package/src/hub/workflow.ts +1 -1
  163. package/src/local/deny.ts +21 -0
  164. package/src/local/doc-read.ts +69 -0
  165. package/src/local/proxy.ts +4 -13
  166. package/src/local/sandbox.ts +3 -1
  167. package/src/local/tools.ts +37 -3
  168. package/src/local/web-fetch-config.ts +43 -0
  169. package/src/local/web-fetch.ts +183 -0
  170. package/src/memory/brief.ts +85 -13
  171. package/src/memory/capture.ts +1 -1
  172. package/src/rooms/application.ts +114 -0
  173. package/src/rooms/boundary.ts +103 -0
  174. package/src/rooms/commands.ts +294 -0
  175. package/src/rooms/crypto.ts +371 -0
  176. package/src/rooms/link.ts +584 -0
  177. package/src/rooms/policy.ts +82 -0
  178. package/src/rooms/remote-peer.ts +80 -0
  179. package/src/rooms/service.ts +426 -0
  180. package/src/rooms/status.ts +146 -0
  181. package/src/rooms/store.ts +1210 -0
  182. package/src/rooms/wire.ts +465 -0
  183. package/src/ui/index.html +91 -4
  184. package/templates/packs/example.pack.json +13 -0
@@ -0,0 +1,953 @@
1
+ # Model-routing promotion receipt: b152ddb9
2
+
3
+ Surface: model-routing. Corpus 3366190f8e7e, split `test` (21 deterministic cases). Generated 2026-10-29.
4
+ Verdict: **pass**.
5
+ Deterministic cases: **pass**. Live judge cases: live-not-run.
6
+
7
+ - Current default (`origin/main`): model-routing keys sha256 `b152ddb9bb8da9e943fae62f00f7ab82f65cfe161d90228a1b1b49169fa6e52a`, template sha256 `f0bb8ad0b4b544df2a5287103578235fa92aec80fa8cb8773ddec87c91e71b29`
8
+ - Candidate (`templates/routing.toml`): model-routing keys sha256 `b152ddb9bb8da9e943fae62f00f7ab82f65cfe161d90228a1b1b49169fa6e52a`, template sha256 `f0bb8ad0b4b544df2a5287103578235fa92aec80fa8cb8773ddec87c91e71b29`
9
+ - Keys that differ: none (the same model-routing keys)
10
+ - Live half required: no (no model-routing key changed: this is the baseline of the shipped default against itself)
11
+ - Served model ids: live-not-run
12
+
13
+ | Metric | Current default | Candidate |
14
+ | --- | --- | --- |
15
+ | deterministic case pass rate (primary) | 100.0% (21/21) | 100.0% (21/21) |
16
+ | route cases (18) | 100.0% | 100.0% |
17
+ | selection cases (3) | 100.0% | 100.0% |
18
+
19
+ Regressions: none. PII or hard-override regressions: none. Improvements: none.
20
+
21
+ ```json receipt
22
+ {
23
+ "kind": "model-routing-receipt",
24
+ "version": 1,
25
+ "surface": "model-routing",
26
+ "corpus_hash": "3366190f8e7e4a6f613f6bcaac3cbbd3565d45c80d09c92529f9e52b35c17f8b",
27
+ "split": "test",
28
+ "base": {
29
+ "ref": "origin/main",
30
+ "sha256": "b152ddb9bb8da9e943fae62f00f7ab82f65cfe161d90228a1b1b49169fa6e52a",
31
+ "template_sha256": "f0bb8ad0b4b544df2a5287103578235fa92aec80fa8cb8773ddec87c91e71b29",
32
+ "config": {
33
+ "classes": {
34
+ "bulk_edit": {
35
+ "fixed_model": "fast",
36
+ "pi_backend": "dgx"
37
+ },
38
+ "implement": {
39
+ "pi_backend": "dgx",
40
+ "route": "hub/stage"
41
+ },
42
+ "plan": {},
43
+ "review": {},
44
+ "summarize": {
45
+ "fixed_model": "fast",
46
+ "pi_backend": "mlx"
47
+ },
48
+ "test": {
49
+ "fixed_model": "fast",
50
+ "pi_backend": "dgx"
51
+ },
52
+ "triage": {
53
+ "fixed_model": "fast",
54
+ "pi_backend": "mlx"
55
+ }
56
+ },
57
+ "hub_routes": {
58
+ "hub/advisor": {
59
+ "capable": "coding",
60
+ "efficient": "fast",
61
+ "gate_min_tool_results": 1,
62
+ "max_reviews": 1,
63
+ "trigger": "no_tool_call",
64
+ "type": "advisor"
65
+ },
66
+ "hub/escalation": {
67
+ "capable": "coding",
68
+ "confirmations": 2,
69
+ "efficient": "fast",
70
+ "type": "escalation"
71
+ },
72
+ "hub/plan": {
73
+ "capable": "coding",
74
+ "efficient": "fast",
75
+ "type": "plan_execute"
76
+ },
77
+ "hub/stage": {
78
+ "capable": "coding",
79
+ "confidence_threshold": 0.5,
80
+ "efficient": "fast",
81
+ "hold_turns": 2,
82
+ "type": "stage"
83
+ }
84
+ },
85
+ "local": {
86
+ "fixed_model": "coding",
87
+ "route": "hub/stage"
88
+ },
89
+ "max_switch_prefill_tokens": 32000,
90
+ "pi": {
91
+ "dgx_max_context_tokens": 262144,
92
+ "mlx_max_context_tokens": 16000
93
+ },
94
+ "stay_switch": "shadow"
95
+ }
96
+ },
97
+ "candidate": {
98
+ "sha256": "b152ddb9bb8da9e943fae62f00f7ab82f65cfe161d90228a1b1b49169fa6e52a",
99
+ "template_sha256": "f0bb8ad0b4b544df2a5287103578235fa92aec80fa8cb8773ddec87c91e71b29",
100
+ "config": {
101
+ "classes": {
102
+ "bulk_edit": {
103
+ "fixed_model": "fast",
104
+ "pi_backend": "dgx"
105
+ },
106
+ "implement": {
107
+ "pi_backend": "dgx",
108
+ "route": "hub/stage"
109
+ },
110
+ "plan": {},
111
+ "review": {},
112
+ "summarize": {
113
+ "fixed_model": "fast",
114
+ "pi_backend": "mlx"
115
+ },
116
+ "test": {
117
+ "fixed_model": "fast",
118
+ "pi_backend": "dgx"
119
+ },
120
+ "triage": {
121
+ "fixed_model": "fast",
122
+ "pi_backend": "mlx"
123
+ }
124
+ },
125
+ "hub_routes": {
126
+ "hub/advisor": {
127
+ "capable": "coding",
128
+ "efficient": "fast",
129
+ "gate_min_tool_results": 1,
130
+ "max_reviews": 1,
131
+ "trigger": "no_tool_call",
132
+ "type": "advisor"
133
+ },
134
+ "hub/escalation": {
135
+ "capable": "coding",
136
+ "confirmations": 2,
137
+ "efficient": "fast",
138
+ "type": "escalation"
139
+ },
140
+ "hub/plan": {
141
+ "capable": "coding",
142
+ "efficient": "fast",
143
+ "type": "plan_execute"
144
+ },
145
+ "hub/stage": {
146
+ "capable": "coding",
147
+ "confidence_threshold": 0.5,
148
+ "efficient": "fast",
149
+ "hold_turns": 2,
150
+ "type": "stage"
151
+ }
152
+ },
153
+ "local": {
154
+ "fixed_model": "coding",
155
+ "route": "hub/stage"
156
+ },
157
+ "max_switch_prefill_tokens": 32000,
158
+ "pi": {
159
+ "dgx_max_context_tokens": 262144,
160
+ "mlx_max_context_tokens": 16000
161
+ },
162
+ "stay_switch": "shadow"
163
+ }
164
+ },
165
+ "changed_keys": [],
166
+ "live_required": false,
167
+ "served_models": "live-not-run",
168
+ "overall": {
169
+ "verdict": "pass",
170
+ "reasons": []
171
+ },
172
+ "evidence": {
173
+ "split": "test",
174
+ "n": 21,
175
+ "primary": {
176
+ "metric": "deterministic case pass rate",
177
+ "base": 1,
178
+ "candidate": 1,
179
+ "baseCorrect": 21,
180
+ "candidateCorrect": 21
181
+ },
182
+ "secondary": {
183
+ "kinds": {
184
+ "route": {
185
+ "n": 18,
186
+ "base": 1,
187
+ "candidate": 1
188
+ },
189
+ "selection": {
190
+ "n": 3,
191
+ "base": 1,
192
+ "candidate": 1
193
+ }
194
+ }
195
+ },
196
+ "regressions": [],
197
+ "guardRegressions": [],
198
+ "improvements": [],
199
+ "verdict": "pass",
200
+ "reasons": [],
201
+ "cases": [
202
+ {
203
+ "id": "select-implement-uses-stage-route",
204
+ "kind": "selection",
205
+ "base": {
206
+ "route": "hub/stage",
207
+ "model": "coding"
208
+ },
209
+ "candidate": {
210
+ "route": "hub/stage",
211
+ "model": "coding"
212
+ },
213
+ "basePass": true,
214
+ "candidatePass": true
215
+ },
216
+ {
217
+ "id": "select-bulk-edit-fixed-alias",
218
+ "kind": "selection",
219
+ "base": {
220
+ "route": null,
221
+ "model": "fast"
222
+ },
223
+ "candidate": {
224
+ "route": null,
225
+ "model": "fast"
226
+ },
227
+ "basePass": true,
228
+ "candidatePass": true
229
+ },
230
+ {
231
+ "id": "select-unlisted-class-takes-local-default",
232
+ "kind": "selection",
233
+ "base": {
234
+ "route": "hub/stage",
235
+ "model": "coding"
236
+ },
237
+ "candidate": {
238
+ "route": "hub/stage",
239
+ "model": "coding"
240
+ },
241
+ "basePass": true,
242
+ "candidatePass": true
243
+ },
244
+ {
245
+ "id": "stage-fresh-task-efficient",
246
+ "kind": "route",
247
+ "base": {
248
+ "turns": [
249
+ {
250
+ "tier": "efficient",
251
+ "model": "fast",
252
+ "source": "default",
253
+ "staySwitch": "shadow",
254
+ "judgeCalls": 0,
255
+ "outcome": "none",
256
+ "planned": false,
257
+ "prefillRecorded": true
258
+ }
259
+ ]
260
+ },
261
+ "candidate": {
262
+ "turns": [
263
+ {
264
+ "tier": "efficient",
265
+ "model": "fast",
266
+ "source": "default",
267
+ "staySwitch": "shadow",
268
+ "judgeCalls": 0,
269
+ "outcome": "none",
270
+ "planned": false,
271
+ "prefillRecorded": true
272
+ }
273
+ ]
274
+ },
275
+ "basePass": true,
276
+ "candidatePass": true
277
+ },
278
+ {
279
+ "id": "stage-import-error-then-repeat-capable",
280
+ "kind": "route",
281
+ "guard": "hard_override",
282
+ "base": {
283
+ "turns": [
284
+ {
285
+ "tier": "capable",
286
+ "model": "coding",
287
+ "source": "override",
288
+ "staySwitch": "shadow",
289
+ "judgeCalls": 0,
290
+ "outcome": "none",
291
+ "planned": false,
292
+ "prefillRecorded": true
293
+ }
294
+ ]
295
+ },
296
+ "candidate": {
297
+ "turns": [
298
+ {
299
+ "tier": "capable",
300
+ "model": "coding",
301
+ "source": "override",
302
+ "staySwitch": "shadow",
303
+ "judgeCalls": 0,
304
+ "outcome": "none",
305
+ "planned": false,
306
+ "prefillRecorded": true
307
+ }
308
+ ]
309
+ },
310
+ "basePass": true,
311
+ "candidatePass": true
312
+ },
313
+ {
314
+ "id": "stage-critical-oom-capable",
315
+ "kind": "route",
316
+ "guard": "hard_override",
317
+ "base": {
318
+ "turns": [
319
+ {
320
+ "tier": "capable",
321
+ "model": "coding",
322
+ "source": "override",
323
+ "staySwitch": "shadow",
324
+ "judgeCalls": 0,
325
+ "outcome": "none",
326
+ "planned": false,
327
+ "prefillRecorded": true
328
+ }
329
+ ]
330
+ },
331
+ "candidate": {
332
+ "turns": [
333
+ {
334
+ "tier": "capable",
335
+ "model": "coding",
336
+ "source": "override",
337
+ "staySwitch": "shadow",
338
+ "judgeCalls": 0,
339
+ "outcome": "none",
340
+ "planned": false,
341
+ "prefillRecorded": true
342
+ }
343
+ ]
344
+ },
345
+ "basePass": true,
346
+ "candidatePass": true
347
+ },
348
+ {
349
+ "id": "stage-spinning-below-threshold-stays-efficient",
350
+ "kind": "route",
351
+ "base": {
352
+ "turns": [
353
+ {
354
+ "tier": "efficient",
355
+ "model": "fast",
356
+ "source": "default",
357
+ "staySwitch": "shadow",
358
+ "judgeCalls": 0,
359
+ "outcome": "none",
360
+ "planned": false,
361
+ "prefillRecorded": true
362
+ }
363
+ ]
364
+ },
365
+ "candidate": {
366
+ "turns": [
367
+ {
368
+ "tier": "efficient",
369
+ "model": "fast",
370
+ "source": "default",
371
+ "staySwitch": "shadow",
372
+ "judgeCalls": 0,
373
+ "outcome": "none",
374
+ "planned": false,
375
+ "prefillRecorded": true
376
+ }
377
+ ]
378
+ },
379
+ "basePass": true,
380
+ "candidatePass": true
381
+ },
382
+ {
383
+ "id": "stage-many-different-failures-capable-by-dimensions",
384
+ "kind": "route",
385
+ "base": {
386
+ "turns": [
387
+ {
388
+ "tier": "capable",
389
+ "model": "coding",
390
+ "source": "dimensions",
391
+ "staySwitch": "shadow",
392
+ "judgeCalls": 0,
393
+ "outcome": "none",
394
+ "planned": false,
395
+ "prefillRecorded": true
396
+ }
397
+ ]
398
+ },
399
+ "candidate": {
400
+ "turns": [
401
+ {
402
+ "tier": "capable",
403
+ "model": "coding",
404
+ "source": "dimensions",
405
+ "staySwitch": "shadow",
406
+ "judgeCalls": 0,
407
+ "outcome": "none",
408
+ "planned": false,
409
+ "prefillRecorded": true
410
+ }
411
+ ]
412
+ },
413
+ "basePass": true,
414
+ "candidatePass": true
415
+ },
416
+ {
417
+ "id": "stage-hold-after-override",
418
+ "kind": "route",
419
+ "base": {
420
+ "turns": [
421
+ {
422
+ "tier": "capable",
423
+ "model": "coding",
424
+ "source": "override",
425
+ "staySwitch": "shadow",
426
+ "judgeCalls": 0,
427
+ "outcome": "none",
428
+ "planned": false,
429
+ "prefillRecorded": true
430
+ },
431
+ {
432
+ "tier": "capable",
433
+ "model": "coding",
434
+ "source": "hold",
435
+ "staySwitch": "shadow",
436
+ "judgeCalls": 0,
437
+ "outcome": "none",
438
+ "planned": false,
439
+ "prefillRecorded": true
440
+ }
441
+ ]
442
+ },
443
+ "candidate": {
444
+ "turns": [
445
+ {
446
+ "tier": "capable",
447
+ "model": "coding",
448
+ "source": "override",
449
+ "staySwitch": "shadow",
450
+ "judgeCalls": 0,
451
+ "outcome": "none",
452
+ "planned": false,
453
+ "prefillRecorded": true
454
+ },
455
+ {
456
+ "tier": "capable",
457
+ "model": "coding",
458
+ "source": "hold",
459
+ "staySwitch": "shadow",
460
+ "judgeCalls": 0,
461
+ "outcome": "none",
462
+ "planned": false,
463
+ "prefillRecorded": true
464
+ }
465
+ ]
466
+ },
467
+ "basePass": true,
468
+ "candidatePass": true
469
+ },
470
+ {
471
+ "id": "stage-records-shadow-plan",
472
+ "kind": "route",
473
+ "base": {
474
+ "turns": [
475
+ {
476
+ "tier": "efficient",
477
+ "model": "fast",
478
+ "source": "default",
479
+ "staySwitch": "shadow",
480
+ "judgeCalls": 0,
481
+ "outcome": "none",
482
+ "planned": false,
483
+ "prefillRecorded": true
484
+ }
485
+ ]
486
+ },
487
+ "candidate": {
488
+ "turns": [
489
+ {
490
+ "tier": "efficient",
491
+ "model": "fast",
492
+ "source": "default",
493
+ "staySwitch": "shadow",
494
+ "judgeCalls": 0,
495
+ "outcome": "none",
496
+ "planned": false,
497
+ "prefillRecorded": true
498
+ }
499
+ ]
500
+ },
501
+ "basePass": true,
502
+ "candidatePass": true
503
+ },
504
+ {
505
+ "id": "stage-pii-trace-has-no-prefill",
506
+ "kind": "route",
507
+ "guard": "pii",
508
+ "base": {
509
+ "turns": [
510
+ {
511
+ "tier": "efficient",
512
+ "model": "fast",
513
+ "source": "default",
514
+ "staySwitch": "shadow",
515
+ "judgeCalls": 0,
516
+ "outcome": "none",
517
+ "planned": false,
518
+ "prefillRecorded": false
519
+ }
520
+ ]
521
+ },
522
+ "candidate": {
523
+ "turns": [
524
+ {
525
+ "tier": "efficient",
526
+ "model": "fast",
527
+ "source": "default",
528
+ "staySwitch": "shadow",
529
+ "judgeCalls": 0,
530
+ "outcome": "none",
531
+ "planned": false,
532
+ "prefillRecorded": false
533
+ }
534
+ ]
535
+ },
536
+ "basePass": true,
537
+ "candidatePass": true
538
+ },
539
+ {
540
+ "id": "plan-read-only-plans-on-capable",
541
+ "kind": "route",
542
+ "base": {
543
+ "turns": [
544
+ {
545
+ "tier": "capable",
546
+ "model": "coding",
547
+ "source": "default",
548
+ "staySwitch": null,
549
+ "judgeCalls": 0,
550
+ "outcome": "none",
551
+ "planned": true,
552
+ "prefillRecorded": false
553
+ }
554
+ ]
555
+ },
556
+ "candidate": {
557
+ "turns": [
558
+ {
559
+ "tier": "capable",
560
+ "model": "coding",
561
+ "source": "default",
562
+ "staySwitch": null,
563
+ "judgeCalls": 0,
564
+ "outcome": "none",
565
+ "planned": true,
566
+ "prefillRecorded": false
567
+ }
568
+ ]
569
+ },
570
+ "basePass": true,
571
+ "candidatePass": true
572
+ },
573
+ {
574
+ "id": "plan-first-edit-hands-to-efficient",
575
+ "kind": "route",
576
+ "base": {
577
+ "turns": [
578
+ {
579
+ "tier": "efficient",
580
+ "model": "fast",
581
+ "source": "default",
582
+ "staySwitch": null,
583
+ "judgeCalls": 0,
584
+ "outcome": "none",
585
+ "planned": false,
586
+ "prefillRecorded": false
587
+ }
588
+ ]
589
+ },
590
+ "candidate": {
591
+ "turns": [
592
+ {
593
+ "tier": "efficient",
594
+ "model": "fast",
595
+ "source": "default",
596
+ "staySwitch": null,
597
+ "judgeCalls": 0,
598
+ "outcome": "none",
599
+ "planned": false,
600
+ "prefillRecorded": false
601
+ }
602
+ ]
603
+ },
604
+ "basePass": true,
605
+ "candidatePass": true
606
+ },
607
+ {
608
+ "id": "advisor-held-answer-reviewed",
609
+ "kind": "route",
610
+ "base": {
611
+ "turns": [
612
+ {
613
+ "tier": "none",
614
+ "model": null,
615
+ "source": null,
616
+ "staySwitch": null,
617
+ "judgeCalls": 1,
618
+ "outcome": "redo",
619
+ "planned": false,
620
+ "prefillRecorded": false
621
+ }
622
+ ]
623
+ },
624
+ "candidate": {
625
+ "turns": [
626
+ {
627
+ "tier": "none",
628
+ "model": null,
629
+ "source": null,
630
+ "staySwitch": null,
631
+ "judgeCalls": 1,
632
+ "outcome": "redo",
633
+ "planned": false,
634
+ "prefillRecorded": false
635
+ }
636
+ ]
637
+ },
638
+ "basePass": true,
639
+ "candidatePass": true
640
+ },
641
+ {
642
+ "id": "advisor-approve-lets-it-stop",
643
+ "kind": "route",
644
+ "base": {
645
+ "turns": [
646
+ {
647
+ "tier": "none",
648
+ "model": null,
649
+ "source": null,
650
+ "staySwitch": null,
651
+ "judgeCalls": 1,
652
+ "outcome": "approve",
653
+ "planned": false,
654
+ "prefillRecorded": false
655
+ }
656
+ ]
657
+ },
658
+ "candidate": {
659
+ "turns": [
660
+ {
661
+ "tier": "none",
662
+ "model": null,
663
+ "source": null,
664
+ "staySwitch": null,
665
+ "judgeCalls": 1,
666
+ "outcome": "approve",
667
+ "planned": false,
668
+ "prefillRecorded": false
669
+ }
670
+ ]
671
+ },
672
+ "basePass": true,
673
+ "candidatePass": true
674
+ },
675
+ {
676
+ "id": "advisor-answer-before-any-tool-not-reviewed",
677
+ "kind": "route",
678
+ "base": {
679
+ "turns": [
680
+ {
681
+ "tier": "none",
682
+ "model": null,
683
+ "source": null,
684
+ "staySwitch": null,
685
+ "judgeCalls": 0,
686
+ "outcome": "none",
687
+ "planned": false,
688
+ "prefillRecorded": false
689
+ }
690
+ ]
691
+ },
692
+ "candidate": {
693
+ "turns": [
694
+ {
695
+ "tier": "none",
696
+ "model": null,
697
+ "source": null,
698
+ "staySwitch": null,
699
+ "judgeCalls": 0,
700
+ "outcome": "none",
701
+ "planned": false,
702
+ "prefillRecorded": false
703
+ }
704
+ ]
705
+ },
706
+ "basePass": true,
707
+ "candidatePass": true
708
+ },
709
+ {
710
+ "id": "advisor-max-reviews-one",
711
+ "kind": "route",
712
+ "base": {
713
+ "turns": [
714
+ {
715
+ "tier": "none",
716
+ "model": null,
717
+ "source": null,
718
+ "staySwitch": null,
719
+ "judgeCalls": 1,
720
+ "outcome": "redo",
721
+ "planned": false,
722
+ "prefillRecorded": false
723
+ },
724
+ {
725
+ "tier": "none",
726
+ "model": null,
727
+ "source": null,
728
+ "staySwitch": null,
729
+ "judgeCalls": 0,
730
+ "outcome": "none",
731
+ "planned": false,
732
+ "prefillRecorded": false
733
+ }
734
+ ]
735
+ },
736
+ "candidate": {
737
+ "turns": [
738
+ {
739
+ "tier": "none",
740
+ "model": null,
741
+ "source": null,
742
+ "staySwitch": null,
743
+ "judgeCalls": 1,
744
+ "outcome": "redo",
745
+ "planned": false,
746
+ "prefillRecorded": false
747
+ },
748
+ {
749
+ "tier": "none",
750
+ "model": null,
751
+ "source": null,
752
+ "staySwitch": null,
753
+ "judgeCalls": 0,
754
+ "outcome": "none",
755
+ "planned": false,
756
+ "prefillRecorded": false
757
+ }
758
+ ]
759
+ },
760
+ "basePass": true,
761
+ "candidatePass": true
762
+ },
763
+ {
764
+ "id": "advisor-pii-without-campus-no-judge",
765
+ "kind": "route",
766
+ "guard": "pii",
767
+ "base": {
768
+ "turns": [
769
+ {
770
+ "tier": "none",
771
+ "model": null,
772
+ "source": null,
773
+ "staySwitch": null,
774
+ "judgeCalls": 0,
775
+ "outcome": "none",
776
+ "planned": false,
777
+ "prefillRecorded": false
778
+ }
779
+ ]
780
+ },
781
+ "candidate": {
782
+ "turns": [
783
+ {
784
+ "tier": "none",
785
+ "model": null,
786
+ "source": null,
787
+ "staySwitch": null,
788
+ "judgeCalls": 0,
789
+ "outcome": "none",
790
+ "planned": false,
791
+ "prefillRecorded": false
792
+ }
793
+ ]
794
+ },
795
+ "basePass": true,
796
+ "candidatePass": true
797
+ },
798
+ {
799
+ "id": "escalation-first-turn-efficient-and-judged",
800
+ "kind": "route",
801
+ "base": {
802
+ "turns": [
803
+ {
804
+ "tier": "efficient",
805
+ "model": "fast",
806
+ "source": "default",
807
+ "staySwitch": null,
808
+ "judgeCalls": 1,
809
+ "outcome": "none",
810
+ "planned": false,
811
+ "prefillRecorded": false
812
+ }
813
+ ]
814
+ },
815
+ "candidate": {
816
+ "turns": [
817
+ {
818
+ "tier": "efficient",
819
+ "model": "fast",
820
+ "source": "default",
821
+ "staySwitch": null,
822
+ "judgeCalls": 1,
823
+ "outcome": "none",
824
+ "planned": false,
825
+ "prefillRecorded": false
826
+ }
827
+ ]
828
+ },
829
+ "basePass": true,
830
+ "candidatePass": true
831
+ },
832
+ {
833
+ "id": "escalation-two-fresh-confirmations-latch",
834
+ "kind": "route",
835
+ "base": {
836
+ "turns": [
837
+ {
838
+ "tier": "efficient",
839
+ "model": "fast",
840
+ "source": "default",
841
+ "staySwitch": null,
842
+ "judgeCalls": 1,
843
+ "outcome": "none",
844
+ "planned": false,
845
+ "prefillRecorded": false
846
+ },
847
+ {
848
+ "tier": "capable",
849
+ "model": "coding",
850
+ "source": "classifier",
851
+ "staySwitch": null,
852
+ "judgeCalls": 1,
853
+ "outcome": "none",
854
+ "planned": false,
855
+ "prefillRecorded": false
856
+ }
857
+ ]
858
+ },
859
+ "candidate": {
860
+ "turns": [
861
+ {
862
+ "tier": "efficient",
863
+ "model": "fast",
864
+ "source": "default",
865
+ "staySwitch": null,
866
+ "judgeCalls": 1,
867
+ "outcome": "none",
868
+ "planned": false,
869
+ "prefillRecorded": false
870
+ },
871
+ {
872
+ "tier": "capable",
873
+ "model": "coding",
874
+ "source": "classifier",
875
+ "staySwitch": null,
876
+ "judgeCalls": 1,
877
+ "outcome": "none",
878
+ "planned": false,
879
+ "prefillRecorded": false
880
+ }
881
+ ]
882
+ },
883
+ "basePass": true,
884
+ "candidatePass": true
885
+ },
886
+ {
887
+ "id": "escalation-pii-without-campus-no-judge",
888
+ "kind": "route",
889
+ "guard": "pii",
890
+ "base": {
891
+ "turns": [
892
+ {
893
+ "tier": "efficient",
894
+ "model": "fast",
895
+ "source": "default",
896
+ "staySwitch": null,
897
+ "judgeCalls": 0,
898
+ "outcome": "none",
899
+ "planned": false,
900
+ "prefillRecorded": false
901
+ }
902
+ ]
903
+ },
904
+ "candidate": {
905
+ "turns": [
906
+ {
907
+ "tier": "efficient",
908
+ "model": "fast",
909
+ "source": "default",
910
+ "staySwitch": null,
911
+ "judgeCalls": 0,
912
+ "outcome": "none",
913
+ "planned": false,
914
+ "prefillRecorded": false
915
+ }
916
+ ]
917
+ },
918
+ "basePass": true,
919
+ "candidatePass": true
920
+ }
921
+ ]
922
+ },
923
+ "generated": "2026-10-29"
924
+ }
925
+ ```
926
+
927
+ ## Deterministic cases
928
+
929
+ Each cell is the tier, why (`override`, `hold`, `dimensions`), judge calls (`jN`) and advisor outcome per turn; a selection case shows route / alias. A mark is whether the case passes.
930
+
931
+ | Case | Guard | Current default | Candidate |
932
+ | --- | --- | --- | --- |
933
+ | select-implement-uses-stage-route | | hub/stage / coding ok | hub/stage / coding ok |
934
+ | select-bulk-edit-fixed-alias | | direct / fast ok | direct / fast ok |
935
+ | select-unlisted-class-takes-local-default | | hub/stage / coding ok | hub/stage / coding ok |
936
+ | stage-fresh-task-efficient | | efficient/default ok | efficient/default ok |
937
+ | stage-import-error-then-repeat-capable | hard_override | capable/override ok | capable/override ok |
938
+ | stage-critical-oom-capable | hard_override | capable/override ok | capable/override ok |
939
+ | stage-spinning-below-threshold-stays-efficient | | efficient/default ok | efficient/default ok |
940
+ | stage-many-different-failures-capable-by-dimensions | | capable/dimensions ok | capable/dimensions ok |
941
+ | stage-hold-after-override | | capable/override > capable/hold ok | capable/override > capable/hold ok |
942
+ | stage-records-shadow-plan | | efficient/default ok | efficient/default ok |
943
+ | stage-pii-trace-has-no-prefill | pii | efficient/default ok | efficient/default ok |
944
+ | plan-read-only-plans-on-capable | | capable/default ok | capable/default ok |
945
+ | plan-first-edit-hands-to-efficient | | efficient/default ok | efficient/default ok |
946
+ | advisor-held-answer-reviewed | | none j1 redo ok | none j1 redo ok |
947
+ | advisor-approve-lets-it-stop | | none j1 approve ok | none j1 approve ok |
948
+ | advisor-answer-before-any-tool-not-reviewed | | none ok | none ok |
949
+ | advisor-max-reviews-one | | none j1 redo > none ok | none j1 redo > none ok |
950
+ | advisor-pii-without-campus-no-judge | pii | none ok | none ok |
951
+ | escalation-first-turn-efficient-and-judged | | efficient/default j1 ok | efficient/default j1 ok |
952
+ | escalation-two-fresh-confirmations-latch | | efficient/default j1 > capable/classifier j1 ok | efficient/default j1 > capable/classifier j1 ok |
953
+ | escalation-pii-without-campus-no-judge | pii | efficient/default ok | efficient/default ok |