create-walle 0.10.1 → 0.10.2

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 (341) hide show
  1. package/README.md +4 -0
  2. package/lib/owner-write-safety.js +135 -0
  3. package/lib/public-runtime.js +13 -5
  4. package/lib/release-schema.json +3 -2
  5. package/lib/runtime-closure-policy.json +6 -4
  6. package/package.json +1 -1
  7. package/template/bin/deps-doctor.js +1 -1
  8. package/template/bin/node-bin.sh +11 -0
  9. package/template/coding-task-manager/api-prompts.js +10 -22
  10. package/template/coding-task-manager/bin/claude-hook.js +7 -3
  11. package/template/coding-task-manager/bin/claude-table-parity.js +307 -0
  12. package/template/coding-task-manager/bin/conversation-storage-auto-migration-lib.js +16 -1
  13. package/template/coding-task-manager/bin/conversation-storage-generation-evidence.js +9 -2
  14. package/template/coding-task-manager/bin/conversation-storage-service-entry-lib.js +16 -1
  15. package/template/coding-task-manager/bin/conversation-storage-walle-owner.js +247 -0
  16. package/template/coding-task-manager/bin/ctm-machine-pair.js +160 -0
  17. package/template/coding-task-manager/bin/lead-wait-census.js +1348 -0
  18. package/template/coding-task-manager/bin/repair-foreign-clone.js +564 -0
  19. package/template/coding-task-manager/bin/repair-resume-echo-titles.js +248 -0
  20. package/template/coding-task-manager/bin/write-lock-bench.js +111 -0
  21. package/template/coding-task-manager/db.js +705 -286
  22. package/template/coding-task-manager/git-utils.js +44 -0
  23. package/template/coding-task-manager/lib/adopted-host-redial.js +4 -0
  24. package/template/coding-task-manager/lib/agent-presets.js +15 -0
  25. package/template/coding-task-manager/lib/agent-title-apply.js +88 -0
  26. package/template/coding-task-manager/lib/agent-title-backfill-read.js +92 -0
  27. package/template/coding-task-manager/lib/api/host-stats.js +98 -0
  28. package/template/coding-task-manager/lib/api/ingress.js +35 -12
  29. package/template/coding-task-manager/lib/api/machine-pairing.js +285 -0
  30. package/template/coding-task-manager/lib/api/machine-pool.js +307 -0
  31. package/template/coding-task-manager/lib/api/machines.js +461 -0
  32. package/template/coding-task-manager/lib/api/misc-ops.js +20 -5
  33. package/template/coding-task-manager/lib/api/providers.js +53 -6
  34. package/template/coding-task-manager/lib/api/resume-from-store.js +25 -0
  35. package/template/coding-task-manager/lib/api/sessions.js +160 -8
  36. package/template/coding-task-manager/lib/api/transcript-history.js +17 -4
  37. package/template/coding-task-manager/lib/api/worktrees.js +38 -37
  38. package/template/coding-task-manager/lib/approval-drift.js +16 -1
  39. package/template/coding-task-manager/lib/approval-logical-frame.js +5 -1
  40. package/template/coding-task-manager/lib/approval-scope.js +68 -4
  41. package/template/coding-task-manager/lib/auth-context.js +32 -2
  42. package/template/coding-task-manager/lib/auth-rate-limit.js +41 -1
  43. package/template/coding-task-manager/lib/auth-rules.js +186 -45
  44. package/template/coding-task-manager/lib/broadcast-serialize.js +2 -1
  45. package/template/coding-task-manager/lib/browser-session-broker.js +9 -1
  46. package/template/coding-task-manager/lib/browser-use-adapter.js +33 -2
  47. package/template/coding-task-manager/lib/claude-markdown-ansi.js +27 -85
  48. package/template/coding-task-manager/lib/claude-session-title.js +6 -30
  49. package/template/coding-task-manager/lib/claude-table-layout.js +322 -0
  50. package/template/coding-task-manager/lib/client-diag-handler.js +5 -0
  51. package/template/coding-task-manager/lib/codex-config-guard.js +33 -3
  52. package/template/coding-task-manager/lib/codex-harness-qualification.js +12 -0
  53. package/template/coding-task-manager/lib/codex-launch-health.js +29 -2
  54. package/template/coding-task-manager/lib/codex-link-preparation.js +9 -8
  55. package/template/coding-task-manager/lib/codex-paths.js +2 -1
  56. package/template/coding-task-manager/lib/coding-agent-models.js +21 -30
  57. package/template/coding-task-manager/lib/coding-session-model-adapters.js +27 -2
  58. package/template/coding-task-manager/lib/coding-session-model-projection.js +5 -0
  59. package/template/coding-task-manager/lib/coding-session-model-runtime.js +1 -2
  60. package/template/coding-task-manager/lib/coding-session-model-state.js +10 -0
  61. package/template/coding-task-manager/lib/coding-session-model-sync-state.js +0 -1
  62. package/template/coding-task-manager/lib/conversation-import/cursor-guard-owner.js +10 -0
  63. package/template/coding-task-manager/lib/create/resolve-launch-params.js +8 -1
  64. package/template/coding-task-manager/lib/ctm-boot-lifecycle.js +17 -1
  65. package/template/coding-task-manager/lib/db-domain-tables.js +7 -0
  66. package/template/coding-task-manager/lib/db-domains.js +21 -2
  67. package/template/coding-task-manager/lib/db-owner-op-registry.js +7 -0
  68. package/template/coding-task-manager/lib/db-schema-source-files.js +1 -0
  69. package/template/coding-task-manager/lib/feature-manifest.js +1 -1
  70. package/template/coding-task-manager/lib/fs-watcher.js +3 -2
  71. package/template/coding-task-manager/lib/harness-history-transition.js +3 -3
  72. package/template/coding-task-manager/lib/headless-inflight-ops.js +203 -0
  73. package/template/coding-task-manager/lib/headless-missing-reply.js +42 -0
  74. package/template/coding-task-manager/lib/headless-term-service.js +55 -17
  75. package/template/coding-task-manager/lib/host-control-dial.js +167 -0
  76. package/template/coding-task-manager/lib/host-handoff-orchestrator.js +16 -2
  77. package/template/coding-task-manager/lib/host-handoff.js +51 -13
  78. package/template/coding-task-manager/lib/host-health-ledger.js +164 -12
  79. package/template/coding-task-manager/lib/host-self-truth-watchdog.js +4 -0
  80. package/template/coding-task-manager/lib/host-stats.js +328 -0
  81. package/template/coding-task-manager/lib/host-threadpool-evacuation.js +160 -0
  82. package/template/coding-task-manager/lib/host-threadpool-monitor.js +14 -1
  83. package/template/coding-task-manager/lib/hosted-input-dispatch.js +203 -0
  84. package/template/coding-task-manager/lib/hosted-sync-worker.js +113 -5
  85. package/template/coding-task-manager/lib/instance-id-ownership-manifest.js +4 -0
  86. package/template/coding-task-manager/lib/instance-manifest-runtime.js +3 -0
  87. package/template/coding-task-manager/lib/instance-manifest.js +13 -1
  88. package/template/coding-task-manager/lib/instance-sync-status.js +15 -0
  89. package/template/coding-task-manager/lib/launch-model-override.js +160 -1
  90. package/template/coding-task-manager/lib/launch-plan-worker.js +59 -2
  91. package/template/coding-task-manager/lib/lead-model-switch-runtime.js +57 -4
  92. package/template/coding-task-manager/lib/lead-model-switch.js +3 -2
  93. package/template/coding-task-manager/lib/lead-model-transition-store.js +61 -3
  94. package/template/coding-task-manager/lib/legacy-draft-cancellation-recovery.js +111 -0
  95. package/template/coding-task-manager/lib/login-tripwire.js +1 -0
  96. package/template/coding-task-manager/lib/machine-pairing.js +238 -0
  97. package/template/coding-task-manager/lib/machine-pool.js +409 -0
  98. package/template/coding-task-manager/lib/machine-registry.js +749 -0
  99. package/template/coding-task-manager/lib/machine-self.js +66 -0
  100. package/template/coding-task-manager/lib/main-thread-lint-exemptions.json +52 -4
  101. package/template/coding-task-manager/lib/media-journal-control-reader.js +473 -0
  102. package/template/coding-task-manager/lib/media-journal.js +84 -27
  103. package/template/coding-task-manager/lib/media-store-options.js +43 -15
  104. package/template/coding-task-manager/lib/migrations/v56-host-samples-and-machine-pool.js +76 -0
  105. package/template/coding-task-manager/lib/mirror-feed-sanitize.js +12 -3
  106. package/template/coding-task-manager/lib/model-proxy/anthropic-face.js +4 -0
  107. package/template/coding-task-manager/lib/model-proxy/chat-response-translators.js +3 -0
  108. package/template/coding-task-manager/lib/model-proxy/handoff.js +494 -0
  109. package/template/coding-task-manager/lib/model-proxy/lead-worker-picks.js +25 -0
  110. package/template/coding-task-manager/lib/model-proxy/native-lead-listener.js +61 -7
  111. package/template/coding-task-manager/lib/model-proxy/proxy-cli.js +200 -0
  112. package/template/coding-task-manager/lib/model-proxy/proxy-instance-record.js +257 -0
  113. package/template/coding-task-manager/lib/model-proxy/stream-accounting.js +205 -0
  114. package/template/coding-task-manager/lib/model-proxy/tokens.js +78 -0
  115. package/template/coding-task-manager/lib/model-proxy/upstream-outcome.js +9 -0
  116. package/template/coding-task-manager/lib/native-history-control.js +2 -2
  117. package/template/coding-task-manager/lib/native-lead-settings-client.js +2 -1
  118. package/template/coding-task-manager/lib/native-lead-tls.js +18 -4
  119. package/template/coding-task-manager/lib/oauth-proxy-supervisor.js +628 -64
  120. package/template/coding-task-manager/lib/owner-action-manifest-data.json +14 -0
  121. package/template/coding-task-manager/lib/painted-row-recorder.js +9 -1
  122. package/template/coding-task-manager/lib/prompt-submission-contract.js +21 -1
  123. package/template/coding-task-manager/lib/provider-login-broker.js +192 -9
  124. package/template/coding-task-manager/lib/provider-login-capture.js +153 -0
  125. package/template/coding-task-manager/lib/queue-draft-status-overlay.js +36 -0
  126. package/template/coding-task-manager/lib/raw-codex-history-window.js +5 -3
  127. package/template/coding-task-manager/lib/read-pool-client.js +5 -2
  128. package/template/coding-task-manager/lib/read-pool-op-registry.js +10 -1
  129. package/template/coding-task-manager/lib/recent-catalog-query.js +26 -0
  130. package/template/coding-task-manager/lib/recent-session-catalog-response.js +9 -0
  131. package/template/coding-task-manager/lib/remote-command-context.js +12 -0
  132. package/template/coding-task-manager/lib/remote-command-runtime.js +13 -1
  133. package/template/coding-task-manager/lib/remote-machine-catalog.js +1062 -0
  134. package/template/coding-task-manager/lib/remote-machine-create.js +693 -0
  135. package/template/coding-task-manager/lib/remote-machine-link.js +939 -0
  136. package/template/coding-task-manager/lib/remote-machine-proxy.js +520 -0
  137. package/template/coding-task-manager/lib/remote-session-forward.js +306 -0
  138. package/template/coding-task-manager/lib/remote-submission-status.js +6 -0
  139. package/template/coding-task-manager/lib/restart-outcome-truth.js +20 -3
  140. package/template/coding-task-manager/lib/restart-preflight.js +9 -2
  141. package/template/coding-task-manager/lib/restore-backoff-gate.js +10 -2
  142. package/template/coding-task-manager/lib/restore-prepare-retry.js +12 -5
  143. package/template/coding-task-manager/lib/restore-resume-batch.js +22 -1
  144. package/template/coding-task-manager/lib/resume-blocked-wire.js +62 -1
  145. package/template/coding-task-manager/lib/resume-cwd.js +13 -0
  146. package/template/coding-task-manager/lib/resume-from-store.js +12 -1
  147. package/template/coding-task-manager/lib/resume-origin-facts.js +38 -1
  148. package/template/coding-task-manager/lib/resume-preflight.js +21 -16
  149. package/template/coding-task-manager/lib/review-repo-admission.js +39 -6
  150. package/template/coding-task-manager/lib/review-repo-registry.js +17 -0
  151. package/template/coding-task-manager/lib/root-delivery-runtime.js +72 -15
  152. package/template/coding-task-manager/lib/root-delivery-selection.js +37 -1
  153. package/template/coding-task-manager/lib/root-prompt-admission.js +33 -2
  154. package/template/coding-task-manager/lib/root-prompt-flow.js +167 -33
  155. package/template/coding-task-manager/lib/scrollback-archive-store.js +7 -4
  156. package/template/coding-task-manager/lib/session-analysis-memory.js +2 -0
  157. package/template/coding-task-manager/lib/session-create/codex-native-provider-gate.js +218 -0
  158. package/template/coding-task-manager/lib/session-create/codex-resume-exit-classify.js +52 -0
  159. package/template/coding-task-manager/lib/session-create/delegate-worker.js +95 -6
  160. package/template/coding-task-manager/lib/session-create/identity.js +20 -1
  161. package/template/coding-task-manager/lib/session-create/prepared.js +69 -1
  162. package/template/coding-task-manager/lib/session-create/provider-launch-context.js +77 -0
  163. package/template/coding-task-manager/lib/session-create/provider-process.js +34 -37
  164. package/template/coding-task-manager/lib/session-create/response.js +30 -12
  165. package/template/coding-task-manager/lib/session-create/transcript.js +13 -4
  166. package/template/coding-task-manager/lib/session-create/worker-continuation.js +43 -1
  167. package/template/coding-task-manager/lib/session-create/worker-notices.js +94 -5
  168. package/template/coding-task-manager/lib/session-create/worker-observability.js +99 -7
  169. package/template/coding-task-manager/lib/session-create/worker-stop.js +11 -3
  170. package/template/coding-task-manager/lib/session-create/worker-wait-watcher.js +315 -0
  171. package/template/coding-task-manager/lib/session-geometry-authority-handler.js +10 -1
  172. package/template/coding-task-manager/lib/session-host-manager.js +152 -206
  173. package/template/coding-task-manager/lib/session-jobs.js +17 -9
  174. package/template/coding-task-manager/lib/session-lifecycle.js +18 -0
  175. package/template/coding-task-manager/lib/session-model-action-preconditions.js +9 -0
  176. package/template/coding-task-manager/lib/session-resource-sampler.js +19 -9
  177. package/template/coding-task-manager/lib/session-standup.js +67 -4
  178. package/template/coding-task-manager/lib/session-status-ledger.js +42 -3
  179. package/template/coding-task-manager/lib/session-status-runtime.js +45 -1
  180. package/template/coding-task-manager/lib/session-title-mirror.js +25 -57
  181. package/template/coding-task-manager/lib/session-transcript-trash.js +8 -1
  182. package/template/coding-task-manager/lib/startup-pointer-write.js +57 -0
  183. package/template/coding-task-manager/lib/state-sync/painted-frame-field.js +11 -0
  184. package/template/coding-task-manager/lib/storage/coding-session-model-store.js +21 -22
  185. package/template/coding-task-manager/lib/surviving-owner-bootstrap.js +7 -2
  186. package/template/coding-task-manager/lib/surviving-owner-recovery.js +2 -1
  187. package/template/coding-task-manager/lib/terminal-draft-http-status.js +25 -0
  188. package/template/coding-task-manager/lib/transcript-archiver.js +229 -229
  189. package/template/coding-task-manager/lib/transcript-frame-cache.js +12 -2
  190. package/template/coding-task-manager/lib/transcript-guard-job.js +55 -4
  191. package/template/coding-task-manager/lib/transcript-link.js +77 -0
  192. package/template/coding-task-manager/lib/transcript-manifest-store.js +8 -4
  193. package/template/coding-task-manager/lib/transcript-source.js +8 -3
  194. package/template/coding-task-manager/lib/transcript-store.js +40 -0
  195. package/template/coding-task-manager/lib/tunnel-lane-governor.js +6 -3
  196. package/template/coding-task-manager/lib/typing-interaction-trace.js +92 -0
  197. package/template/coding-task-manager/lib/typing-worker-stages.js +60 -0
  198. package/template/coding-task-manager/lib/visible-revision-watchdog.js +8 -12
  199. package/template/coding-task-manager/lib/wake-skip-reasons.js +46 -0
  200. package/template/coding-task-manager/lib/walle-supervisor.js +98 -14
  201. package/template/coding-task-manager/lib/worker-failure-classify.js +13 -1
  202. package/template/coding-task-manager/lib/ws/state-sync.js +19 -2
  203. package/template/coding-task-manager/lib/ws/terminal-attach.js +32 -1
  204. package/template/coding-task-manager/lib/ws-router.js +68 -1
  205. package/template/coding-task-manager/lib/ws-send-admission.js +22 -4
  206. package/template/coding-task-manager/oauth-proxy.js +99 -55
  207. package/template/coding-task-manager/package-lock.json +24 -0
  208. package/template/coding-task-manager/package.json +3 -0
  209. package/template/coding-task-manager/providers/codex-mcp-extract.js +121 -19
  210. package/template/coding-task-manager/providers/codex-mcp.js +14 -5
  211. package/template/coding-task-manager/public/css/app.css +279 -1
  212. package/template/coding-task-manager/public/css/reviews.css +4 -0
  213. package/template/coding-task-manager/public/index.html +294 -223
  214. package/template/coding-task-manager/public/js/app/machines-page.js +1252 -0
  215. package/template/coding-task-manager/public/js/app/models-tab.js +546 -36
  216. package/template/coding-task-manager/public/js/app/worktrees-panel.js +7 -5
  217. package/template/coding-task-manager/public/js/background-work.js +13 -7
  218. package/template/coding-task-manager/public/js/coding-session-model-presentation.js +44 -4
  219. package/template/coding-task-manager/public/js/core/session-commands.js +676 -0
  220. package/template/coding-task-manager/public/js/core/session-selectors.js +5 -1
  221. package/template/coding-task-manager/public/js/history-app-seam.js +26 -2
  222. package/template/coding-task-manager/public/js/history-painted-rows.js +17 -2
  223. package/template/coding-task-manager/public/js/history-reader-park.js +13 -1
  224. package/template/coding-task-manager/public/js/history-scroller.js +187 -9
  225. package/template/coding-task-manager/public/js/history-transcript-pages.js +5 -5
  226. package/template/coding-task-manager/public/js/machine-pool-shared.js +436 -0
  227. package/template/coding-task-manager/public/js/private-state-scope.js +31 -3
  228. package/template/coding-task-manager/public/js/prompt-submission-client.js +173 -8
  229. package/template/coding-task-manager/public/js/prompt-submission-tray.js +281 -0
  230. package/template/coding-task-manager/public/js/queue-panel-submission-reconcile.js +174 -1
  231. package/template/coding-task-manager/public/js/reviews.js +7 -3
  232. package/template/coding-task-manager/public/js/root-draft-lifetime.js +139 -2
  233. package/template/coding-task-manager/public/js/root-queue-builder-lifetime.js +16 -0
  234. package/template/coding-task-manager/public/js/row-join.js +4 -2
  235. package/template/coding-task-manager/public/js/session-model-picker.js +1 -1
  236. package/template/coding-task-manager/public/js/session-search-utils.js +46 -19
  237. package/template/coding-task-manager/public/js/state-sync-client.js +4 -0
  238. package/template/coding-task-manager/public/js/terminal/runtime-02.js +16 -7
  239. package/template/coding-task-manager/public/js/terminal/runtime-03.js +41 -0
  240. package/template/coding-task-manager/public/js/terminal/runtime-04.js +41 -4
  241. package/template/coding-task-manager/public/js/terminal/runtime-12.js +52 -2
  242. package/template/coding-task-manager/public/js/terminal/runtime-16.js +12 -12
  243. package/template/coding-task-manager/public/js/terminal/runtime-18.js +14 -0
  244. package/template/coding-task-manager/public/js/terminal/runtime-19.js +8 -4
  245. package/template/coding-task-manager/public/js/terminal/runtime-20.js +210 -73
  246. package/template/coding-task-manager/public/js/terminal/runtime-21.js +19 -6
  247. package/template/coding-task-manager/public/js/terminal/runtime-22.js +86 -0
  248. package/template/coding-task-manager/public/js/terminal-history-viewport.js +1 -1
  249. package/template/coding-task-manager/public/js/terminal-wheel.js +39 -2
  250. package/template/coding-task-manager/public/js/walle/chat-conversation.js +11 -3
  251. package/template/coding-task-manager/public/js/walle-session.js +30 -7
  252. package/template/coding-task-manager/public/m/app.css +226 -8
  253. package/template/coding-task-manager/public/m/app.js +502 -9
  254. package/template/coding-task-manager/public/m/index.html +38 -1
  255. package/template/coding-task-manager/public/m/machines.js +1313 -0
  256. package/template/coding-task-manager/public/m/pool-failover.js +391 -0
  257. package/template/coding-task-manager/public/m/private-queue-actions.js +26 -7
  258. package/template/coding-task-manager/public/m/sw.js +5 -0
  259. package/template/coding-task-manager/queue-engine.js +13 -0
  260. package/template/coding-task-manager/server/approvals.js +5 -6
  261. package/template/coding-task-manager/server/boot.js +136 -17
  262. package/template/coding-task-manager/server.js +902 -239
  263. package/template/coding-task-manager/session-integrity.js +7 -9
  264. package/template/coding-task-manager/workers/db-owner-worker.js +53 -7
  265. package/template/coding-task-manager/workers/read-pool-worker.js +17 -6
  266. package/template/coding-task-manager/workers/session-host-pool-process.js +18 -4
  267. package/template/coding-task-manager/workers/session-host-process.js +14 -3
  268. package/template/coding-task-manager/workers/transcript-archive-worker.js +1 -1
  269. package/template/coding-task-manager/workers/worktree-worker.js +34 -0
  270. package/template/package-lock.json +2 -2
  271. package/template/package.json +1 -1
  272. package/template/scripts/conversation-storage-v2-migration.js +78 -11
  273. package/template/shared/conversation-storage-v2-contract.js +42 -6
  274. package/template/shared/fixtures/worker-status-payloads.json +392 -0
  275. package/template/shared/git-remote-key.js +83 -0
  276. package/template/shared/host-identity.js +98 -2
  277. package/template/shared/owner-write-safety.js +135 -0
  278. package/template/shared/public-runtime.js +13 -5
  279. package/template/shared/release-schema.json +3 -2
  280. package/template/shared/report-citations.js +14 -0
  281. package/template/shared/sqlite-write-lock.js +361 -223
  282. package/template/shared/storage/contract.js +35 -3
  283. package/template/wall-e/agent.js +21 -0
  284. package/template/wall-e/api-walle.js +5 -0
  285. package/template/wall-e/bin/brain-purge-legacy-ctm.js +3 -2
  286. package/template/wall-e/bin/walle-mcp-stdio.js +12 -6
  287. package/template/wall-e/brain/helper-rules-schema.js +129 -0
  288. package/template/wall-e/brain/migrations.js +51 -22
  289. package/template/wall-e/brain/model-deployment-facts.js +31 -1
  290. package/template/wall-e/brain/owner-call-whitelist.js +16 -0
  291. package/template/wall-e/brain/schema-ensures.js +22 -0
  292. package/template/wall-e/brain.js +1 -1
  293. package/template/wall-e/coding/journal-dispatcher.js +51 -0
  294. package/template/wall-e/coding/session-journal.js +28 -40
  295. package/template/wall-e/coding-orchestrator.js +23 -26
  296. package/template/wall-e/http/auth.js +18 -1
  297. package/template/wall-e/http/blog-views-api.js +318 -0
  298. package/template/wall-e/http/helper-rules-api.js +321 -0
  299. package/template/wall-e/http/model-proxy-providers.js +3 -1
  300. package/template/wall-e/http/telemetry-api.js +12 -0
  301. package/template/wall-e/lib/blog-view-policy.js +88 -0
  302. package/template/wall-e/lib/blog-view-store.js +169 -0
  303. package/template/wall-e/lib/client-config-lock.js +2 -1
  304. package/template/wall-e/lib/coding-journal-writer-child-client.js +67 -18
  305. package/template/wall-e/lib/error-kinds.js +10 -1
  306. package/template/wall-e/lib/feature-manifest.js +1 -1
  307. package/template/wall-e/lib/helper-rules/cell-state.js +123 -0
  308. package/template/wall-e/lib/helper-rules/evaluate.js +357 -0
  309. package/template/wall-e/lib/helper-rules/explore-rubric.md +12 -0
  310. package/template/wall-e/lib/helper-rules/grade.js +277 -0
  311. package/template/wall-e/lib/helper-rules/label.js +247 -0
  312. package/template/wall-e/lib/helper-rules/lead-call-hook.js +522 -0
  313. package/template/wall-e/lib/helper-rules/store.js +667 -0
  314. package/template/wall-e/lib/mcp-integration.js +5 -6
  315. package/template/wall-e/lib/runtime-worker-pool.js +1 -0
  316. package/template/wall-e/lib/scheduler-worker-jobs.js +6 -0
  317. package/template/wall-e/lib/telemetry-db-schema.js +37 -0
  318. package/template/wall-e/lib/telemetry-process-client.js +76 -1
  319. package/template/wall-e/llm/default-fallback.js +4 -0
  320. package/template/wall-e/llm/model-catalog.js +13 -4
  321. package/template/wall-e/llm/model-roles.js +6 -0
  322. package/template/wall-e/llm/portkey-http.js +150 -0
  323. package/template/wall-e/llm/portkey-sync.js +15 -145
  324. package/template/wall-e/llm/worker-mcp-routing.js +61 -0
  325. package/template/wall-e/llm/worker-route.js +43 -1
  326. package/template/wall-e/loops/brain-custom-writes.js +45 -0
  327. package/template/wall-e/mcp-protocol-contract.js +41 -1
  328. package/template/wall-e/mcp-server.js +13 -2
  329. package/template/wall-e/mcp-worker-schemas.js +20 -2
  330. package/template/wall-e/memory/ctm-context-client.js +25 -5
  331. package/template/wall-e/shared/release-schema.json +3 -2
  332. package/template/wall-e/shared/sqlite-write-lock.js +361 -223
  333. package/template/wall-e/shared/storage/contract.js +35 -3
  334. package/template/wall-e/skills/_templates/delegate-worker/VERSION +1 -1
  335. package/template/wall-e/skills/_templates/delegate-worker/released-sha256.json +6 -0
  336. package/template/wall-e/skills/_templates/delegate-worker/templates/claude/SKILL.md +7 -2
  337. package/template/wall-e/skills/_templates/delegate-worker/templates/codex/SKILL.md +7 -2
  338. package/template/wall-e/tools/local-tools.js +6 -4
  339. package/template/wall-e/workers/brain-owner-worker.js +9 -0
  340. package/template/wall-e/workers/coding-journal-writer-child.js +8 -1
  341. package/template/wall-e/workers/telemetry-worker.js +8 -0
@@ -33,6 +33,22 @@ function modelProcessGenerationMetadata(value) {
33
33
  return validModelProcessGeneration(value) ? { modelProcessGeneration: value } : {};
34
34
  }
35
35
  const MODEL_STORAGE_ROOT_KEYS = Object.freeze(['HOME', 'CODEX_HOME', 'CTM_CODEX_SESSIONS_DIR', 'CLAUDE_CONFIG_DIR', 'GEMINI_CLI_HOME', 'OPENCODE_DATA_DIR', 'XDG_DATA_HOME']);
36
+ // The keys a lead-model switch re-projects into the launch context (lib/lead-model-restore-reconciliation.js
37
+ // projectDeferredRestoreLaunch: HOME / CODEX_HOME from the launch context, TMPDIR alongside them). They are
38
+ // PROJECTED launch context, not per-session private overrides: a spawn still receives them, but their presence
39
+ // must never turn an otherwise empty override set into a private environment that only a surviving owner can
40
+ // reproduce. Anything else in the env is private and is captured by value.
41
+ const PROJECTED_LAUNCH_CONTEXT_KEYS = Object.freeze(['HOME', 'CODEX_HOME', 'TMPDIR']);
42
+ // Returns a NEW object holding only the non-projected entries of `env`; never mutates its input and maps a
43
+ // non-object to `{}`.
44
+ function privateOverridesFromEnv(env) {
45
+ if (!env || typeof env !== 'object' || Array.isArray(env)) return {};
46
+ const out = {};
47
+ for (const [key, value] of Object.entries(env)) {
48
+ if (!PROJECTED_LAUNCH_CONTEXT_KEYS.includes(key)) out[key] = value;
49
+ }
50
+ return out;
51
+ }
36
52
  function modelStorageRootsFromEnv(env) {
37
53
  const roots = {};
38
54
  for (const key of MODEL_STORAGE_ROOT_KEYS) {
@@ -111,6 +127,10 @@ function isAlive(pid) {
111
127
  // listSessions() -> [{ sessionId, ptyProcess, ptyClosed, cols, rows, seq, cmd, cwd, name, outputEpoch,
112
128
  // workerDisplayContext, suppressPtyHeadlessUntilInput, mirrorFeed }]; serialize(sessionId) -> {data,cols,rows}|null.
113
129
  const REPAINT_NUDGE_MS = 80;
130
+ // D-1: the old host's painted-seal await is bounded. A seal runs on its session's own op chain; a wedged chain
131
+ // (a dead libuv pool) never comes back, and no deadline is long enough to wait it out. Losing the race costs a
132
+ // restart break in that session's painted rows (an unsealed stretch cannot be joined), never the whole handoff.
133
+ const HANDOFF_SEAL_TIMEOUT_MS = 1000;
114
134
 
115
135
  function createHandoff({ hostId, workerPath, controlSocketPath, listSessions, serialize, mirrorStatus, headless, send, log = () => {}, setTimer = setTimeout, spawnSuccessor = spawnSuccessorHost }) {
116
136
  let active = null;
@@ -140,6 +160,26 @@ function createHandoff({ hostId, workerPath, controlSocketPath, listSessions, se
140
160
  (reply || send)({ type: 'handoff-aborted', handoffId: cur.handoffId, reason });
141
161
  }
142
162
 
163
+ // One session's painted-seal, raced against HANDOFF_SEAL_TIMEOUT_MS: resolves when the seal completes (its
164
+ // timer then cleared) or when the bound expires, in which case the handoff proceeds and the loss is reported.
165
+ // A rejecting seal still rejects (the begin() catch aborts the handoff, unchanged).
166
+ function raceSeal(sessionId) {
167
+ return new Promise((resolve, reject) => {
168
+ let settled = false;
169
+ const timer = setTimer(() => {
170
+ if (settled) return;
171
+ settled = true;
172
+ diagnostic(sessionId, 'host-handoff-seal-timeout', { timeoutMs: HANDOFF_SEAL_TIMEOUT_MS, oldHostId: hostId });
173
+ resolve();
174
+ }, HANDOFF_SEAL_TIMEOUT_MS);
175
+ timer?.unref?.();
176
+ Promise.resolve(headless.handleMessage({ type: 'painted-seal', sessionId })).then(
177
+ () => { if (settled) return; settled = true; clearTimeout(timer); resolve(); },
178
+ (err) => { if (settled) return; settled = true; clearTimeout(timer); reject(err); },
179
+ );
180
+ });
181
+ }
182
+
143
183
  async function begin(msg, reply) {
144
184
  const handoffId = String(msg.handoffId || '');
145
185
  if (active) { reply({ type: 'handoff-aborted', handoffId, reason: 'already-in-progress' }); return; }
@@ -153,11 +193,11 @@ function createHandoff({ hostId, workerPath, controlSocketPath, listSessions, se
153
193
  s.ptyProcess.pause();
154
194
  cur.paused.push(s);
155
195
  }
156
- const seeds = new Map();
157
- for (const s of cur.paused) {
196
+ // D-1: every seed is issued concurrently -- each `serialize` keeps its own 2 000 ms cap, so N sessions cost
197
+ // one cap, not N. The mirrorFeed flush still lands immediately before its own session's serialize.
198
+ const seeds = new Map(await Promise.all(cur.paused.map(async (s) => {
158
199
  s.mirrorFeed?.flush?.({ force: true });
159
200
  const snap = await serialize(s.sessionId);
160
- seeds.set(s.sessionId, snap);
161
201
  // Probe (observe only): what the seed carries vs what the mirror believed at the same instant.
162
202
  const seedData = String((snap && snap.data) || '');
163
203
  diagnostic(s.sessionId, 'host-handoff-mirror-seed', {
@@ -168,18 +208,16 @@ function createHandoff({ hostId, workerPath, controlSocketPath, listSessions, se
168
208
  seedBytes: Buffer.byteLength(seedData),
169
209
  oldHostId: hostId,
170
210
  });
171
- }
211
+ return [s.sessionId, snap];
212
+ })));
172
213
  if (active !== cur) return; // aborted (deadline) while serializing
173
214
  // This host exits without its headless close(): seal each painted-row stretch (with its last screen) and flush the
174
215
  // log now, before the successor exists to load it -- an unsealed stretch cannot be joined (a restart break).
175
- // Each id is listed BEFORE its seal is queued, so an abort that lands mid-seal still reopens it (the per-session op
176
- // queue runs that reopen after the seal).
177
- cur.sealed = [];
178
- for (const s of cur.paused) {
179
- if (active !== cur) return; // aborted (deadline) while sealing
180
- cur.sealed.push(s.sessionId);
181
- await headless.handleMessage({ type: 'painted-seal', sessionId: s.sessionId });
182
- }
216
+ // D-1: every id is listed BEFORE any seal is queued (so an abort that lands mid-seal still reopens all of them,
217
+ // the per-session op queue running each reopen after its seal), and every seal is raced against
218
+ // HANDOFF_SEAL_TIMEOUT_MS, so one wedged op chain cannot hold the handoff past its bound.
219
+ cur.sealed = cur.paused.map((s) => s.sessionId);
220
+ await Promise.all(cur.paused.map((s) => raceSeal(s.sessionId)));
183
221
  if (active !== cur) return; // aborted (deadline) while sealing
184
222
  const running = cur.paused.filter((s) => !s.ptyClosed);
185
223
  const entries = running.map((s, i) => {
@@ -306,4 +344,4 @@ function createHandoff({ hostId, workerPath, controlSocketPath, listSessions, se
306
344
  return { intercept, restore, resumeRestored, isActive: () => !!active };
307
345
  }
308
346
 
309
- module.exports = { handoffManifestFromArgv, writeHandoffManifest, readHandoffManifest, spawnSuccessorHost, createHandoff, validModelProcessGeneration, modelProcessGenerationFromEnv, modelProcessGenerationMetadata, modelStorageRootsFromEnv, modelStorageRootsMetadata };
347
+ module.exports = { HANDOFF_SEAL_TIMEOUT_MS, handoffManifestFromArgv, writeHandoffManifest, readHandoffManifest, spawnSuccessorHost, createHandoff, validModelProcessGeneration, modelProcessGenerationFromEnv, modelProcessGenerationMetadata, modelStorageRootsFromEnv, modelStorageRootsMetadata, PROJECTED_LAUNCH_CONTEXT_KEYS, privateOverridesFromEnv };
@@ -11,6 +11,12 @@
11
11
  // module's), no further RPCs go to that host; markCapped freezes the verdict
12
12
  // until forgetHost. Pure/in-memory except the injectable readStall hook.
13
13
  //
14
+ // WP-3 (session-stops-mid-job-2026-10-24.html, D-10..D-12): a hard serialize
15
+ // miss on a host that sent ANY frame after that request was issued (the
16
+ // injectable lastFrameAt hook) is readiness, not liveness -- it latches
17
+ // 'degraded' (reported once, cleared by a reply, never a kill). Only a silent
18
+ // host still reaches 'unresponsive'; the stall-file shortcut is unchanged.
19
+ //
14
20
  // No deps beyond node:fs/node:path for the default readStall -- kept free of
15
21
  // process globals (server.js binds dataDir into the readStall it injects).
16
22
 
@@ -31,23 +37,77 @@ function readStallFromDataDir(dataDir, hostId) {
31
37
  }
32
38
  }
33
39
 
40
+ // WP-3 (stale-pty-host-evacuation design doc, D-2, §6): the evacuation deadline
41
+ // for a continuously stalled libuv threadpool. Value provenance (§4 D-2): every
42
+ // recovered stall in the log evidence lasted <= 1.7 s, all 6 unrecovered ones
43
+ // longer; 30 s equals the existing hard-miss floor below (line 69).
44
+ const THREADPOOL_EVACUATE_MS = 30000;
45
+
34
46
  function createHostHealthLedger({
35
47
  missThreshold = 2,
36
48
  stallThresholdMs = 30000,
37
49
  readStall = null,
50
+ // WP-3 (D-10): lastFrameAt(hostId) -> number, the manager's per-host frame
51
+ // clock ("the host sent any frame", any transport). Optional: without it the
52
+ // ledger behaves exactly as it did before WP-3.
53
+ lastFrameAt = null,
38
54
  now = Date.now,
55
+ // WP-3 (D-2): the stall-evacuation episode's clock/timers/action seam. All
56
+ // three default to the real thing, so every existing caller is unaffected.
57
+ setTimer = setTimeout,
58
+ clearTimer = clearTimeout,
59
+ onEvacuate = null,
60
+ log = console.warn,
39
61
  } = {}) {
40
- const hosts = new Map(); // hostId -> { misses, lastMissAt, lastReplyAt, verdict }
62
+ // hostId -> { misses, lastMissAt, lastReplyAt, verdict, degraded, ...threadpool episode }
63
+ const hosts = new Map();
41
64
 
42
65
  function entryFor(hostId) {
43
66
  let entry = hosts.get(hostId);
44
67
  if (!entry) {
45
- entry = { misses: 0, lastMissAt: 0, lastReplyAt: 0, verdict: 'ok', cappedUntil: 0 };
68
+ entry = {
69
+ misses: 0, lastMissAt: 0, lastReplyAt: 0, verdict: 'ok', cappedUntil: 0, degraded: false,
70
+ // D-2 (WP-3) per-host stall episode: 0 = no episode in progress.
71
+ threadpoolStalledSince: 0, threadpoolOldestPendingMs: 0, evacuateFired: false, threadpoolTimer: null,
72
+ };
46
73
  hosts.set(hostId, entry);
47
74
  }
48
75
  return entry;
49
76
  }
50
77
 
78
+ function _cancelThreadpoolTimer(entry) {
79
+ if (!entry || !entry.threadpoolTimer) return;
80
+ clearTimer(entry.threadpoolTimer);
81
+ entry.threadpoolTimer = null;
82
+ }
83
+
84
+ function _threadpoolResult(entry, id) {
85
+ return {
86
+ action: 'evacuate',
87
+ hostId: id,
88
+ oldestPendingMs: Number(entry.threadpoolOldestPendingMs) || 0,
89
+ stalledForMs: now() - entry.threadpoolStalledSince,
90
+ };
91
+ }
92
+
93
+ // Fires an episode exactly once: marks it fired BEFORE calling out, so a
94
+ // re-entrant recordThreadpool from onEvacuate cannot double-fire.
95
+ function _markFired(entry, id) {
96
+ entry.evacuateFired = true;
97
+ entry.threadpoolTimer = null;
98
+ return _threadpoolResult(entry, id);
99
+ }
100
+
101
+ // The armed-timer path is the ONLY one that calls out: an immediate verdict is
102
+ // returned to the caller of recordThreadpool instead (§6 -- one action per
103
+ // episode, never both).
104
+ function _fireEvacuate(entry, id) {
105
+ const result = _markFired(entry, id);
106
+ if (typeof onEvacuate !== 'function') return; // no action bound -- the episode is still marked fired
107
+ try { onEvacuate(result); }
108
+ catch (err) { log(`[host-health] host=${id} onEvacuate threw: ${err?.message || err}`); } // REPORT: a timer callback must never throw into the event loop
109
+ }
110
+
51
111
  // Final-review fix C4: 'unresponsive-capped' used to be permanent -- markCapped
52
112
  // set it forever and recordMiss short-circuited on any non-'ok' verdict, so
53
113
  // EVERY snapshot for EVERY session on that host was answered timedOut for the
@@ -63,7 +123,7 @@ function createHostHealthLedger({
63
123
  entry.cappedUntil = 0;
64
124
  }
65
125
 
66
- function recordMiss(hostId, { sessionId, kind, deadlineMs } = {}) {
126
+ function recordMiss(hostId, { sessionId, kind, deadlineMs, issuedAt } = {}) {
67
127
  const id = String(hostId || '');
68
128
  if (!id) return null;
69
129
  // Soft (short-deadline, or explicitly non-'hard') misses never count -- D-2
@@ -74,14 +134,37 @@ function createHostHealthLedger({
74
134
  // Once a host already carries a verdict, further misses are idempotent --
75
135
  // no state change, verdict() keeps reporting it until forgetHost.
76
136
  if (entry.verdict !== 'ok') return null;
77
- entry.misses += 1;
78
- entry.lastMissAt = now();
79
137
  let stall = null;
80
138
  if (typeof readStall === 'function') {
81
139
  try { stall = readStall(id); } catch { stall = null; }
82
140
  }
83
- const stalled = stall && Number(stall.durationMs) >= stallThresholdMs;
84
- if (stalled || entry.misses >= missThreshold) {
141
+ // D-2(b), unchanged: the host's own stall report is proof it is wedged, and
142
+ // it still wins over any frame (a stalled host can relay PTY bytes).
143
+ if (stall && Number(stall.durationMs) >= stallThresholdMs) {
144
+ entry.misses += 1;
145
+ entry.lastMissAt = now();
146
+ entry.verdict = 'unresponsive';
147
+ return { verdict: 'unresponsive', misses: entry.misses, stall };
148
+ }
149
+ // D-11 (WP-3): the host sent a frame at or after this request was issued --
150
+ // a deadlined request family timing out on a TALKING host is readiness, not
151
+ // liveness. Report 'degraded' once per host since the last reply; never
152
+ // count it toward the miss threshold, never verdict the host unresponsive.
153
+ if (typeof lastFrameAt === 'function' && Number.isFinite(issuedAt)) {
154
+ const frameAt = Number(lastFrameAt(id));
155
+ if (Number.isFinite(frameAt) && frameAt >= issuedAt) {
156
+ if (entry.degraded !== true) {
157
+ entry.degraded = true;
158
+ return { verdict: 'degraded', misses: entry.misses, lastFrameAgoMs: now() - frameAt };
159
+ }
160
+ return null;
161
+ }
162
+ }
163
+ // D-12: no frame of any kind since the first missed request was issued --
164
+ // today's path. Two such misses (missThreshold) is a silent host.
165
+ entry.misses += 1;
166
+ entry.lastMissAt = now();
167
+ if (entry.misses >= missThreshold) {
85
168
  entry.verdict = 'unresponsive';
86
169
  return { verdict: 'unresponsive', misses: entry.misses, stall: stall || null };
87
170
  }
@@ -94,6 +177,9 @@ function createHostHealthLedger({
94
177
  const entry = entryFor(id);
95
178
  entry.misses = 0;
96
179
  entry.lastReplyAt = now();
180
+ // D-11: the host answered, so whatever readiness conclusion was latched is
181
+ // stale evidence -- the next talking miss reports once again.
182
+ entry.degraded = false;
97
183
  // C4: the host answered -- whatever the cap concluded is stale evidence.
98
184
  if (entry.verdict === 'unresponsive-capped') {
99
185
  entry.verdict = 'ok';
@@ -116,17 +202,78 @@ function createHostHealthLedger({
116
202
  entry.cappedUntil = now() + CRASH_CAP_WINDOW_MS;
117
203
  }
118
204
 
205
+ // WP-3 (D-2, §6): the host's own threadpool snapshot as a verdict, not a
206
+ // banner. Returns { action:'evacuate', hostId, oldestPendingMs, stalledForMs }
207
+ // exactly ONCE per stall episode, and only for a host whose pool is either
208
+ // reported stalled with an already-overdue op (oldestPendingMs >= 30 s) or
209
+ // has been continuously stalled for >= 30 s with no 'ok' frame in between.
210
+ function recordThreadpool(hostId, snapshot) {
211
+ const id = String(hostId || '');
212
+ const state = snapshot && snapshot.state;
213
+ if (!id || (state !== 'ok' && state !== 'stalled')) return null; // unknown shape -- no state change
214
+ if (state === 'ok') {
215
+ const entry = hosts.get(id);
216
+ if (!entry) return null; // nothing was in progress -- no entry to create
217
+ _cancelThreadpoolTimer(entry);
218
+ entry.threadpoolStalledSince = 0;
219
+ entry.threadpoolOldestPendingMs = 0;
220
+ entry.evacuateFired = false;
221
+ return null;
222
+ }
223
+ const entry = entryFor(id);
224
+ if (!entry.threadpoolStalledSince) entry.threadpoolStalledSince = now(); // first stalled frame starts the episode
225
+ if (entry.evacuateFired) return null; // already acted on this episode
226
+ entry.threadpoolOldestPendingMs = Number(snapshot.oldestPendingMs) || 0;
227
+ const stalledForMs = now() - entry.threadpoolStalledSince;
228
+ if (entry.threadpoolOldestPendingMs >= THREADPOOL_EVACUATE_MS || stalledForMs >= THREADPOOL_EVACUATE_MS) {
229
+ _cancelThreadpoolTimer(entry);
230
+ return _markFired(entry, id);
231
+ }
232
+ // Not yet due: arm ONE timer for the remainder of the window (never stack --
233
+ // an existing timer already targets the same deadline and its own `hosts.get`
234
+ // liveness check keeps it honest across forget/move).
235
+ if (!entry.threadpoolTimer) {
236
+ const timer = setTimer(() => {
237
+ if (hosts.get(id) !== entry || entry.threadpoolStalledSince <= 0 || entry.evacuateFired) return;
238
+ _fireEvacuate(entry, id);
239
+ }, Math.max(1, THREADPOOL_EVACUATE_MS - stalledForMs));
240
+ timer?.unref?.();
241
+ entry.threadpoolTimer = timer || null;
242
+ }
243
+ return null;
244
+ }
245
+
246
+ // WP-3: re-arm RE-EVALUATION without forgetting the episode (used when an
247
+ // evacuation was deferred -- owner recovery pending): the next stalled frame
248
+ // re-decides immediately, keeping the episode's original stalledSince.
249
+ function resetThreadpoolEpisode(hostId) {
250
+ const entry = hosts.get(String(hostId || ''));
251
+ if (!entry) return;
252
+ _cancelThreadpoolTimer(entry);
253
+ entry.evacuateFired = false;
254
+ }
255
+
119
256
  function forgetHost(hostId) {
120
- hosts.delete(String(hostId || ''));
257
+ const id = String(hostId || '');
258
+ _cancelThreadpoolTimer(hosts.get(id));
259
+ hosts.delete(id);
121
260
  }
122
261
 
123
- // WP-4: a handoff replaces the host process, not its health history -- carry the entry over.
262
+ // WP-4: a handoff replaces the host process, not its health history -- carry
263
+ // the entry over. WP-3 (D-2): the successor is a fresh process with a fresh
264
+ // libuv pool, so its stall episode is dropped -- its own frames decide.
124
265
  function moveHost(fromId, toId) {
125
266
  const from = String(fromId || ''); const to = String(toId || '');
126
267
  if (!from || !to || from === to) return;
127
268
  const entry = hosts.get(from);
128
269
  hosts.delete(from);
129
- if (entry) hosts.set(to, entry);
270
+ if (!entry) return;
271
+ _cancelThreadpoolTimer(entry);
272
+ entry.threadpoolStalledSince = 0;
273
+ entry.threadpoolOldestPendingMs = 0;
274
+ entry.evacuateFired = false;
275
+ _cancelThreadpoolTimer(hosts.get(to)); // a superseded entry's armed timer must never fire for its successor
276
+ hosts.set(to, entry);
130
277
  }
131
278
 
132
279
  function snapshot() {
@@ -138,12 +285,17 @@ function createHostHealthLedger({
138
285
  lastReplyAt: entry.lastReplyAt,
139
286
  verdict: entry.verdict,
140
287
  cappedUntil: entry.cappedUntil || 0,
288
+ threadpoolStalledSince: entry.threadpoolStalledSince || 0,
289
+ evacuateFired: entry.evacuateFired === true,
290
+ // D-11 (WP-3): a talking host that missed a hard deadline since its last
291
+ // reply -- readiness, reported once, never a kill.
292
+ degraded: entry.degraded === true,
141
293
  };
142
294
  }
143
295
  return { hosts: out };
144
296
  }
145
297
 
146
- return { recordMiss, recordReply, verdict, markCapped, forgetHost, moveHost, snapshot };
298
+ return { recordMiss, recordReply, recordThreadpool, verdict, markCapped, forgetHost, moveHost, resetThreadpoolEpisode, snapshot };
147
299
  }
148
300
 
149
- module.exports = { createHostHealthLedger, readStallFromDataDir };
301
+ module.exports = { createHostHealthLedger, readStallFromDataDir, THREADPOOL_EVACUATE_MS };
@@ -34,6 +34,10 @@ const HOST_WATCHDOG_OP_TABLE = [
34
34
  'getViewportText', 'composer-probe', 'getRows', 'reset', 'flush-archive',
35
35
  'mirror-status', 'mirrors-report', 'trim-mirrors', 'flush-tail', 'destroy',
36
36
  'painted-read', 'drop-painted',
37
+ // WP-0 (D-6/S-13): appended ONLY -- an entry's index IS its opCode, so
38
+ // reordering or removing any of the rows above would relabel every stamp a
39
+ // still-running host writes. These three were missing and stamped as 'none'.
40
+ 'serialize-bootstrap', 'painted-seal', 'painted-reopen',
37
41
  ];
38
42
 
39
43
  function _hostCpuUsageMs() {