@sema-agent/server 7.150.0 → 7.152.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 (514) hide show
  1. package/MIGRATION.md +451 -0
  2. package/README.md +15 -3
  3. package/README.zh-CN.md +10 -2
  4. package/USAGE.md +144 -87
  5. package/deploy/sema-up/README.md +11 -4
  6. package/deploy/sema-up/chart/Chart.yaml +1 -1
  7. package/deploy/sema-up/chart/templates/NOTES.txt +5 -0
  8. package/deploy/sema-up/chart/templates/_helpers.tpl +15 -16
  9. package/deploy/sema-up/chart/templates/server-v4pro.yaml +5 -3
  10. package/deploy/sema-up/chart/templates/server.yaml +5 -3
  11. package/deploy/sema-up/chart/values-full-single.yaml +3 -1
  12. package/deploy/sema-up/chart/values.yaml +8 -1
  13. package/deploy/sema-up/cluster-up.sh +7 -6
  14. package/deploy/sema-up/kube-up.sh +6 -6
  15. package/deploy/sema-up/lib/flagshape.sh +36 -8
  16. package/deploy/sema-up/lib/helm-values-cluster.py +2 -0
  17. package/deploy/sema-up/lib/helm-values-kube.py +2 -0
  18. package/deploy/sema-up/machines.example.yaml +3 -1
  19. package/deploy/sema-up/sema-up.sh +22 -16
  20. package/dist/adoption/import.js +3 -3
  21. package/dist/approval-ask-audit-store.d.ts +1 -1
  22. package/dist/approval-ask-machine.d.ts +4 -10
  23. package/dist/approval-ask-retention.d.ts +1 -1
  24. package/dist/approval-card.d.ts +12 -14
  25. package/dist/approval-gate-currency.d.ts +9 -9
  26. package/dist/approval-gate-currency.js +3 -4
  27. package/dist/approval-hmac.d.ts +17 -1
  28. package/dist/approval-hmac.js +7 -1
  29. package/dist/approval-queue-kind.d.ts +1 -1
  30. package/dist/approval.d.ts +2 -2
  31. package/dist/approval.js +2 -2
  32. package/dist/auth-bridge.d.ts +20 -0
  33. package/dist/auth-bridge.js +9 -0
  34. package/dist/background-session-reap.d.ts +1 -1
  35. package/dist/bake-runner/main.d.ts +4 -2
  36. package/dist/bind-host.d.ts +3 -6
  37. package/dist/bind-host.js +4 -7
  38. package/dist/boot/budget-tracing.js +1 -1
  39. package/dist/boot/coordinators.d.ts +1 -1
  40. package/dist/boot/coordinators.js +9 -10
  41. package/dist/boot/device-lane.js +2 -0
  42. package/dist/boot/engine-lease.d.ts +5 -0
  43. package/dist/boot/engine-lease.js +1 -0
  44. package/dist/boot/execution-env.d.ts +9 -14
  45. package/dist/boot/execution-env.js +85 -22
  46. package/dist/boot/execution-lane.js +32 -5
  47. package/dist/boot/late-binds.d.ts +8 -4
  48. package/dist/boot/late-binds.js +7 -1
  49. package/dist/boot/leader.d.ts +31 -30
  50. package/dist/boot/leader.js +38 -28
  51. package/dist/boot/leg-path-adjudication.d.ts +40 -0
  52. package/dist/boot/leg-path-adjudication.js +18 -0
  53. package/dist/boot/memory-consolidation.d.ts +3 -2
  54. package/dist/boot/memory-consolidation.js +6 -6
  55. package/dist/boot/parked-revive-gate.js +3 -15
  56. package/dist/boot/reapers.d.ts +6 -1
  57. package/dist/boot/reapers.js +13 -2
  58. package/dist/boot/resolve-spec.d.ts +3 -3
  59. package/dist/boot/resolve-spec.js +43 -48
  60. package/dist/boot/runner-deps.d.ts +46 -35
  61. package/dist/boot/runner-deps.js +94 -91
  62. package/dist/boot/session-age-out.d.ts +36 -0
  63. package/dist/boot/session-age-out.js +101 -0
  64. package/dist/boot/session-faces.d.ts +5 -14
  65. package/dist/boot/session-faces.js +9 -5
  66. package/dist/boot/shutdown.d.ts +6 -0
  67. package/dist/boot/shutdown.js +10 -4
  68. package/dist/boot/stage-01-config.js +2 -0
  69. package/dist/boot/stage-02-web-admin-pull.js +4 -5
  70. package/dist/boot/stage-05-execution-env.d.ts +5 -3
  71. package/dist/boot/stage-05-execution-env.js +3 -2
  72. package/dist/boot/stage-06-runners.d.ts +9 -4
  73. package/dist/boot/stage-06-runners.js +24 -9
  74. package/dist/boot/stage-07-capability-layer.d.ts +8 -4
  75. package/dist/boot/stage-07-capability-layer.js +3 -2
  76. package/dist/boot/stage-08-reapers.d.ts +8 -4
  77. package/dist/boot/stage-08-reapers.js +4 -2
  78. package/dist/boot/stage-09-leader.d.ts +12 -5
  79. package/dist/boot/stage-09-leader.js +14 -5
  80. package/dist/boot/stage-10-http-server.d.ts +19 -5
  81. package/dist/boot/stage-10-http-server.js +14 -21
  82. package/dist/boot/stores.js +7 -4
  83. package/dist/boot/web-admin.js +5 -8
  84. package/dist/boot/workflow-orchestration.d.ts +7 -2
  85. package/dist/boot/workflow-orchestration.js +24 -7
  86. package/dist/bounded-rotation.d.ts +29 -0
  87. package/dist/bounded-rotation.js +24 -0
  88. package/dist/capabilities/approvals-push.d.ts +3 -3
  89. package/dist/capabilities/scenarios.d.ts +28 -13
  90. package/dist/capabilities/scenarios.js +2 -2
  91. package/dist/capability-facts.d.ts +43 -32
  92. package/dist/capability-facts.js +45 -51
  93. package/dist/card-rule-offers.d.ts +32 -0
  94. package/dist/card-rule-offers.js +130 -0
  95. package/dist/center-credential.d.ts +25 -6
  96. package/dist/center-credential.js +25 -5
  97. package/dist/config-catalog.d.ts +26 -7
  98. package/dist/config-catalog.js +26 -22
  99. package/dist/config-dir-trust.js +4 -2
  100. package/dist/config-invariants.d.ts +20 -8
  101. package/dist/config-invariants.js +55 -12
  102. package/dist/config-lkg.d.ts +5 -19
  103. package/dist/config-lkg.js +8 -62
  104. package/dist/config-provider.d.ts +1 -1
  105. package/dist/config-root-migration.d.ts +2 -2
  106. package/dist/config-types.d.ts +38 -42
  107. package/dist/config.d.ts +58 -7
  108. package/dist/config.js +90 -40
  109. package/dist/control-socket.d.ts +51 -0
  110. package/dist/control-socket.js +115 -0
  111. package/dist/deployment-governance.d.ts +2 -1
  112. package/dist/deployment-shape.d.ts +9 -1
  113. package/dist/deployment-shape.js +2 -1
  114. package/dist/device-protocol.d.ts +5 -4
  115. package/dist/device-protocol.js +1 -1
  116. package/dist/device-ws-hub.d.ts +7 -0
  117. package/dist/device-ws-hub.js +10 -3
  118. package/dist/device-ws-protocol.d.ts +63 -10
  119. package/dist/device-ws-protocol.js +56 -25
  120. package/dist/elicitation.js +2 -2
  121. package/dist/engine-identity.d.ts +19 -7
  122. package/dist/engine-identity.js +10 -2
  123. package/dist/entry-mode-clamp-notice.d.ts +2 -1
  124. package/dist/entry-problems.d.ts +40 -3
  125. package/dist/entry-problems.js +3 -1
  126. package/dist/execution-env-refusal.d.ts +29 -0
  127. package/dist/execution-env-refusal.js +8 -0
  128. package/dist/execution-lane-caps.d.ts +3 -1
  129. package/dist/field-conflict.d.ts +1 -1
  130. package/dist/file-history-capture.d.ts +11 -4
  131. package/dist/file-history-capture.js +9 -6
  132. package/dist/file-history-disclosure.d.ts +7 -5
  133. package/dist/file-history-disclosure.js +7 -5
  134. package/dist/fleet/drain-entry.d.ts +4 -0
  135. package/dist/fleet/engine-signal.d.ts +12 -29
  136. package/dist/fleet/engine-signal.js +1 -7
  137. package/dist/fleet-client.js +2 -5
  138. package/dist/gate-settlement.d.ts +1 -8
  139. package/dist/gate-settlement.js +0 -4
  140. package/dist/history-anchor.js +1 -1
  141. package/dist/hitl-delivery.d.ts +2 -3
  142. package/dist/hitl-delivery.js +0 -2
  143. package/dist/hooks/hook-llm.js +4 -2
  144. package/dist/hooks/hook-runner.d.ts +3 -2
  145. package/dist/hooks/hook-runner.js +18 -3
  146. package/dist/host-decision.d.ts +11 -11
  147. package/dist/host-lsp-manager.d.ts +2 -2
  148. package/dist/http/active-run-conflict.d.ts +35 -2
  149. package/dist/http/active-run-conflict.js +48 -19
  150. package/dist/http/admission.js +17 -2
  151. package/dist/http/approval-sweeps.d.ts +1 -1
  152. package/dist/http/approval-sweeps.js +10 -7
  153. package/dist/http/checkpoint-ctx.d.ts +4 -0
  154. package/dist/http/checkpoint-ctx.js +2 -0
  155. package/dist/http/dispatch.d.ts +8 -3
  156. package/dist/http/dispatch.js +59 -32
  157. package/dist/http/durable-run-leg.js +16 -17
  158. package/dist/http/health-reader.d.ts +16 -9
  159. package/dist/http/health-reader.js +2 -1
  160. package/dist/http/health-self-report.d.ts +9 -1
  161. package/dist/http/health-self-report.js +3 -1
  162. package/dist/http/owner-access.d.ts +33 -14
  163. package/dist/http/owner-access.js +40 -10
  164. package/dist/http/principal-gate.d.ts +49 -21
  165. package/dist/http/principal-gate.js +61 -11
  166. package/dist/http/request-channel.d.ts +23 -0
  167. package/dist/http/request-channel.js +9 -0
  168. package/dist/http/request-guards.js +17 -2
  169. package/dist/http/resume-ctx-read.js +42 -3
  170. package/dist/http/resume-legs.d.ts +4 -3
  171. package/dist/http/resume-legs.js +367 -117
  172. package/dist/http/route-ctx.d.ts +91 -15
  173. package/dist/http/route-ctx.js +17 -0
  174. package/dist/http/route-table.d.ts +5 -1
  175. package/dist/http/route-table.js +4 -0
  176. package/dist/http/routes/admin-config-refresh.js +3 -3
  177. package/dist/http/routes/admin-drain.d.ts +3 -0
  178. package/dist/http/routes/admin-drain.js +7 -7
  179. package/dist/http/routes/admin-memory-optout.d.ts +1 -1
  180. package/dist/http/routes/admin-memory-optout.js +3 -3
  181. package/dist/http/routes/adoption.js +3 -5
  182. package/dist/http/routes/agents-roster.js +2 -3
  183. package/dist/http/routes/approvals-assistant.d.ts +2 -1
  184. package/dist/http/routes/approvals-assistant.js +99 -51
  185. package/dist/http/routes/background.d.ts +3 -3
  186. package/dist/http/routes/capabilities.d.ts +4 -0
  187. package/dist/http/routes/capabilities.js +38 -10
  188. package/dist/http/routes/config-catalog.js +2 -2
  189. package/dist/http/routes/devices.js +1 -1
  190. package/dist/http/routes/diagnostics.d.ts +3 -3
  191. package/dist/http/routes/diagnostics.js +19 -7
  192. package/dist/http/routes/fleet.js +10 -8
  193. package/dist/http/routes/images.js +10 -10
  194. package/dist/http/routes/memory-bundle.js +3 -3
  195. package/dist/http/routes/memory-compliance.js +3 -3
  196. package/dist/http/routes/memory-consolidation.js +2 -2
  197. package/dist/http/routes/memory-origin.js +3 -3
  198. package/dist/http/routes/memory-policy.js +2 -2
  199. package/dist/http/routes/observability.js +3 -3
  200. package/dist/http/routes/projects.d.ts +3 -2
  201. package/dist/http/routes/projects.js +4 -5
  202. package/dist/http/routes/retention-ops.js +3 -3
  203. package/dist/http/routes/rules.js +5 -5
  204. package/dist/http/routes/run-permission-mode.d.ts +2 -1
  205. package/dist/http/routes/run-permission-mode.js +2 -2
  206. package/dist/http/routes/runs.d.ts +4 -9
  207. package/dist/http/routes/runs.js +171 -65
  208. package/dist/http/routes/session-sync.d.ts +22 -9
  209. package/dist/http/routes/session-sync.js +204 -107
  210. package/dist/http/routes/sessions-list.js +13 -7
  211. package/dist/http/routes/sessions.js +30 -15
  212. package/dist/http/routes/tasks.js +46 -41
  213. package/dist/http/routes/trace-usage.js +2 -2
  214. package/dist/http/routes/workflows.js +1 -1
  215. package/dist/http/server.d.ts +30 -30
  216. package/dist/http/server.js +16 -4
  217. package/dist/http/submit-ctx.d.ts +1 -1
  218. package/dist/http/submit-ctx.js +7 -4
  219. package/dist/http/wire-types.d.ts +14 -4
  220. package/dist/human-facing-args.d.ts +33 -0
  221. package/dist/human-facing-args.js +33 -0
  222. package/dist/identity-source.d.ts +20 -3
  223. package/dist/identity-source.js +14 -0
  224. package/dist/index.d.ts +5 -1
  225. package/dist/k8s-api-credentials.d.ts +29 -0
  226. package/dist/k8s-api-credentials.js +25 -0
  227. package/dist/lane-home-probe.d.ts +3 -7
  228. package/dist/lane-home-probe.js +2 -2
  229. package/dist/leader/diffup.d.ts +19 -0
  230. package/dist/leader/diffup.js +7 -0
  231. package/dist/leader/leader.d.ts +116 -11
  232. package/dist/leader/leader.js +69 -5
  233. package/dist/leader/repair-wire.js +2 -2
  234. package/dist/leader/run-entry.d.ts +2 -1
  235. package/dist/leader/run-entry.js +1 -1
  236. package/dist/leader/wire.d.ts +42 -132
  237. package/dist/leader/wire.js +81 -67
  238. package/dist/leg-facts.d.ts +13 -5
  239. package/dist/leg-facts.js +2 -1
  240. package/dist/memory-scope.d.ts +23 -11
  241. package/dist/memory-scope.js +18 -6
  242. package/dist/memory-sync-client.d.ts +30 -2
  243. package/dist/memory-sync-client.js +16 -9
  244. package/dist/model-entry-headers.d.ts +9 -10
  245. package/dist/model-entry-headers.js +0 -4
  246. package/dist/model-entry-refusal.d.ts +7 -4
  247. package/dist/model-entry-refusal.js +11 -5
  248. package/dist/model-plane-face.d.ts +1 -1
  249. package/dist/model-plane-face.js +3 -1
  250. package/dist/model-route-endpoint.d.ts +13 -7
  251. package/dist/model-route-endpoint.js +14 -11
  252. package/dist/model-select.d.ts +22 -0
  253. package/dist/model-select.js +9 -0
  254. package/dist/model-unreachable-notice.d.ts +11 -0
  255. package/dist/model-unreachable-notice.js +4 -4
  256. package/dist/object-store-buckets.d.ts +640 -6
  257. package/dist/object-store-buckets.js +166 -0
  258. package/dist/observability/err-text.d.ts +7 -0
  259. package/dist/observability/err-text.js +5 -0
  260. package/dist/observability/fail-open.d.ts +25 -17
  261. package/dist/observability/fail-open.js +25 -17
  262. package/dist/observability/logger.js +3 -1
  263. package/dist/observability/metrics.js +1 -0
  264. package/dist/operator-roster.d.ts +68 -0
  265. package/dist/operator-roster.js +32 -0
  266. package/dist/orchestration/workflow-notify-journal.d.ts +18 -1
  267. package/dist/orchestration/workflow-notify-journal.js +12 -1
  268. package/dist/orchestration/workflow-park-decision.d.ts +70 -18
  269. package/dist/orchestration/workflow-park-decision.js +49 -10
  270. package/dist/orchestration/workflow-park-holder.d.ts +65 -0
  271. package/dist/orchestration/workflow-park-holder.js +98 -0
  272. package/dist/orchestration/workflow-record-fence.d.ts +36 -0
  273. package/dist/orchestration/workflow-record-fence.js +42 -0
  274. package/dist/outbound-dispatcher.d.ts +71 -8
  275. package/dist/outbound-dispatcher.js +48 -7
  276. package/dist/owner-faces.d.ts +2 -2
  277. package/dist/parked-decide.d.ts +106 -55
  278. package/dist/parked-decide.js +153 -117
  279. package/dist/peer-directory.d.ts +2 -2
  280. package/dist/peer-inbound-face.d.ts +2 -6
  281. package/dist/peer-inbound-face.js +0 -3
  282. package/dist/permission-mode-admission.d.ts +74 -5
  283. package/dist/permission-mode-admission.js +56 -3
  284. package/dist/plugins/adoption-log-sql.d.ts +3 -1
  285. package/dist/plugins/adoption-log-sql.js +7 -1
  286. package/dist/plugins/approval-ask-store-file.d.ts +14 -2
  287. package/dist/plugins/approval-ask-store-file.js +11 -0
  288. package/dist/plugins/approval-ask-store-memory.d.ts +10 -1
  289. package/dist/plugins/approval-ask-store-memory.js +35 -10
  290. package/dist/plugins/approval-ask-store-sql.d.ts +69 -4
  291. package/dist/plugins/approval-ask-store-sql.js +45 -5
  292. package/dist/plugins/approval-exemption-store.js +3 -0
  293. package/dist/plugins/approval-nonce-store.js +2 -0
  294. package/dist/plugins/blob-backend.d.ts +83 -7
  295. package/dist/plugins/blob-backend.js +57 -6
  296. package/dist/plugins/breaker-state-sql.js +2 -0
  297. package/dist/plugins/caching-session-store.d.ts +9 -15
  298. package/dist/plugins/caching-session-store.js +6 -0
  299. package/dist/plugins/checkpoint-index-columns.d.ts +20 -16
  300. package/dist/plugins/checkpoint-index-columns.js +3 -6
  301. package/dist/plugins/checkpoint-store-face.d.ts +119 -61
  302. package/dist/plugins/checkpoint-store-face.js +134 -55
  303. package/dist/plugins/device-store-sql.js +6 -0
  304. package/dist/plugins/error-origin.d.ts +18 -0
  305. package/dist/plugins/error-origin.js +10 -0
  306. package/dist/plugins/execution-placement-sql.js +6 -6
  307. package/dist/plugins/image-bake-store-sql.js +6 -0
  308. package/dist/plugins/image-index-sql.js +4 -0
  309. package/dist/plugins/landed-attendants.d.ts +212 -0
  310. package/dist/plugins/landed-attendants.js +161 -0
  311. package/dist/plugins/leader-run-store-sql.js +4 -0
  312. package/dist/plugins/local-checkpoint-store.d.ts +13 -3
  313. package/dist/plugins/local-checkpoint-store.js +38 -49
  314. package/dist/plugins/local-session-live-reference.d.ts +40 -0
  315. package/dist/plugins/local-session-live-reference.js +39 -0
  316. package/dist/plugins/local-session-store.d.ts +71 -33
  317. package/dist/plugins/local-session-store.js +129 -27
  318. package/dist/plugins/memory-engine-pg.js +4 -0
  319. package/dist/plugins/memory-engine-sql-apply.js +5 -2
  320. package/dist/plugins/memory-engine-tidb.js +4 -0
  321. package/dist/plugins/memory-optout-grant-store-sql.js +4 -0
  322. package/dist/plugins/memory-sync-store-pg.js +5 -0
  323. package/dist/plugins/memory-sync-store-tidb.js +5 -0
  324. package/dist/plugins/one-time-migrations.d.ts +104 -80
  325. package/dist/plugins/one-time-migrations.js +226 -132
  326. package/dist/plugins/org-delivery-quota-store.js +4 -1
  327. package/dist/plugins/outcome-ledger-sql.js +2 -0
  328. package/dist/plugins/permission-rule-store-sql.js +11 -4
  329. package/dist/plugins/pg-cost-quota.js +4 -0
  330. package/dist/plugins/pg-pool.js +35 -10
  331. package/dist/plugins/pg-rate-limiter.js +2 -0
  332. package/dist/plugins/posix-shell-fs.d.ts +6 -1
  333. package/dist/plugins/posix-shell-fs.js +4 -1
  334. package/dist/plugins/remote-env-adb.d.ts +19 -15
  335. package/dist/plugins/remote-env-adb.js +41 -15
  336. package/dist/plugins/remote-env-connect-seat.d.ts +105 -0
  337. package/dist/plugins/remote-env-connect-seat.js +72 -0
  338. package/dist/plugins/remote-env-device.d.ts +22 -5
  339. package/dist/plugins/remote-env-device.js +106 -8
  340. package/dist/plugins/remote-env-e2b.d.ts +15 -6
  341. package/dist/plugins/remote-env-e2b.js +42 -32
  342. package/dist/plugins/remote-env-file-error.js +6 -2
  343. package/dist/plugins/remote-env-host.d.ts +46 -10
  344. package/dist/plugins/remote-env-host.js +124 -52
  345. package/dist/plugins/remote-env-k8s.d.ts +109 -41
  346. package/dist/plugins/remote-env-k8s.js +160 -54
  347. package/dist/plugins/remote-env-local-docker.d.ts +13 -8
  348. package/dist/plugins/remote-env-local-docker.js +34 -41
  349. package/dist/plugins/remote-env-ssh.d.ts +18 -12
  350. package/dist/plugins/remote-env-ssh.js +60 -59
  351. package/dist/plugins/remote-shell.d.ts +98 -1
  352. package/dist/plugins/remote-shell.js +218 -0
  353. package/dist/plugins/replica-registration.d.ts +1 -1
  354. package/dist/plugins/replica-registration.js +1 -1
  355. package/dist/plugins/resume-anchor-store-sql.d.ts +11 -2
  356. package/dist/plugins/resume-anchor-store-sql.js +12 -5
  357. package/dist/plugins/retention-lane-store-sql.js +4 -0
  358. package/dist/plugins/retention-sql.d.ts +20 -2
  359. package/dist/plugins/retention-sql.js +11 -0
  360. package/dist/plugins/run-store-sql.d.ts +21 -2
  361. package/dist/plugins/run-store-sql.js +31 -7
  362. package/dist/plugins/s3-presign.d.ts +23 -0
  363. package/dist/plugins/s3-presign.js +37 -3
  364. package/dist/plugins/scenario-prefix-switch-m42.d.ts +1 -1
  365. package/dist/plugins/scenario-prefix-switch-m42.js +2 -2
  366. package/dist/plugins/scheduler-support.d.ts +2 -2
  367. package/dist/plugins/scheduler-support.js +0 -3
  368. package/dist/plugins/schema-consistency.d.ts +4 -2
  369. package/dist/plugins/schema-consistency.js +19 -2
  370. package/dist/plugins/schema-indexes.js +2 -0
  371. package/dist/plugins/send-file-ledger.d.ts +2 -2
  372. package/dist/plugins/send-file-ledger.js +5 -2
  373. package/dist/plugins/send-user-file.d.ts +3 -4
  374. package/dist/plugins/send-user-file.js +56 -52
  375. package/dist/plugins/serving-requirement.d.ts +26 -7
  376. package/dist/plugins/serving-requirement.js +11 -4
  377. package/dist/plugins/session-birth.d.ts +6 -2
  378. package/dist/plugins/session-blob-claim-token.d.ts +15 -0
  379. package/dist/plugins/session-blob-claim-token.js +20 -0
  380. package/dist/plugins/session-blob-namespace.d.ts +46 -0
  381. package/dist/plugins/session-blob-namespace.js +116 -0
  382. package/dist/plugins/session-capture-record-store-sql.js +2 -0
  383. package/dist/plugins/session-ext-table.d.ts +14 -1
  384. package/dist/plugins/session-ext-table.js +5 -1
  385. package/dist/plugins/session-row-sql.d.ts +49 -2
  386. package/dist/plugins/session-row-sql.js +56 -13
  387. package/dist/plugins/session-store-sql.d.ts +34 -18
  388. package/dist/plugins/session-store-sql.js +98 -17
  389. package/dist/plugins/shared-memory-store-sql.d.ts +1 -0
  390. package/dist/plugins/shared-memory-store-sql.js +6 -2
  391. package/dist/plugins/snapshot-bucket-presence.d.ts +25 -2
  392. package/dist/plugins/snapshot-bucket-presence.js +8 -2
  393. package/dist/plugins/sql-driver.d.ts +2 -1
  394. package/dist/plugins/sql-driver.js +18 -3
  395. package/dist/plugins/sql-errors.d.ts +11 -6
  396. package/dist/plugins/sql-errors.js +5 -6
  397. package/dist/plugins/sql-json-column.d.ts +1 -1
  398. package/dist/plugins/stop-then-start-sentence.d.ts +10 -4
  399. package/dist/plugins/stop-then-start-sentence.js +14 -10
  400. package/dist/plugins/stop-then-start.d.ts +109 -0
  401. package/dist/plugins/stop-then-start.js +104 -0
  402. package/dist/plugins/store-backend.d.ts +84 -15
  403. package/dist/plugins/store-backend.js +236 -72
  404. package/dist/plugins/store-boundary.d.ts +57 -0
  405. package/dist/plugins/store-boundary.js +139 -0
  406. package/dist/plugins/store-contracts.d.ts +17 -0
  407. package/dist/plugins/store-fault-sentence-m53.d.ts +7 -0
  408. package/dist/plugins/store-fault-sentence-m53.js +25 -0
  409. package/dist/plugins/store-fault.d.ts +26 -7
  410. package/dist/plugins/store-fault.js +18 -2
  411. package/dist/plugins/task-attachment-store.d.ts +2 -1
  412. package/dist/plugins/task-attachment-store.js +14 -1
  413. package/dist/plugins/task-list-store-sql.d.ts +2 -2
  414. package/dist/plugins/task-list-store-sql.js +10 -8
  415. package/dist/plugins/tidb-cost-quota.js +4 -0
  416. package/dist/plugins/tidb-pool.js +21 -25
  417. package/dist/plugins/tidb-rate-limiter.js +4 -0
  418. package/dist/plugins/user-input-ledger-sql.js +4 -0
  419. package/dist/plugins/workflow-run-store-sql.d.ts +28 -10
  420. package/dist/plugins/workflow-run-store-sql.js +64 -4
  421. package/dist/plugins/workspace-custody.d.ts +4 -3
  422. package/dist/plugins/workspace-fill.d.ts +4 -7
  423. package/dist/plugins/workspace-fill.js +2 -1
  424. package/dist/plugins/write-behind-counter.js +5 -0
  425. package/dist/project-context.d.ts +0 -2
  426. package/dist/project-context.js +4 -8
  427. package/dist/project-registry.d.ts +46 -0
  428. package/dist/project-registry.js +44 -0
  429. package/dist/question.d.ts +2 -1
  430. package/dist/question.js +5 -13
  431. package/dist/request-form.d.ts +6 -1
  432. package/dist/request-form.js +4 -1
  433. package/dist/request-key-closure.js +1 -1
  434. package/dist/request-value-closure.d.ts +4 -0
  435. package/dist/request-value-closure.js +10 -0
  436. package/dist/rule-issue-reading.d.ts +1 -1
  437. package/dist/rules-consent.d.ts +1 -1
  438. package/dist/run-acceptance.d.ts +3 -2
  439. package/dist/run-acceptance.js +4 -6
  440. package/dist/run-local.js +9 -9
  441. package/dist/runs.d.ts +54 -16
  442. package/dist/runs.js +67 -13
  443. package/dist/runtime-governance.d.ts +5 -4
  444. package/dist/security.d.ts +30 -32
  445. package/dist/security.js +41 -7
  446. package/dist/sema-config-dir.d.ts +2 -1
  447. package/dist/server-secret-env.d.ts +12 -10
  448. package/dist/server-secret-env.js +24 -15
  449. package/dist/session-bindings.d.ts +82 -0
  450. package/dist/session-bindings.js +18 -0
  451. package/dist/session-children-retire.d.ts +2 -2
  452. package/dist/session-children-retire.js +2 -6
  453. package/dist/session-deletion.d.ts +16 -1
  454. package/dist/session-error-wire.d.ts +3 -3
  455. package/dist/session-error-wire.js +3 -3
  456. package/dist/session-incarnation.d.ts +10 -0
  457. package/dist/session-incarnation.js +10 -1
  458. package/dist/session-kind.d.ts +57 -0
  459. package/dist/session-kind.js +22 -0
  460. package/dist/session-row.d.ts +21 -1
  461. package/dist/session-row.js +7 -1
  462. package/dist/session-sync-kernel.d.ts +24 -14
  463. package/dist/session-sync-kernel.js +3 -6
  464. package/dist/session-sync.d.ts +25 -103
  465. package/dist/session-sync.js +14 -76
  466. package/dist/session-titler.d.ts +10 -3
  467. package/dist/session-titler.js +19 -6
  468. package/dist/ssh-host-key.d.ts +5 -0
  469. package/dist/ssh-host-key.js +3 -0
  470. package/dist/stores-sql/blob-index-sql.d.ts +30 -9
  471. package/dist/stores-sql/blob-index-sql.js +40 -21
  472. package/dist/stores-sql/checkpoint-store-sql.d.ts +54 -27
  473. package/dist/stores-sql/checkpoint-store-sql.js +70 -146
  474. package/dist/stores-sql/file-history-store-sql.d.ts +113 -15
  475. package/dist/stores-sql/file-history-store-sql.js +205 -95
  476. package/dist/stores-sql/pg-session-storage.d.ts +34 -7
  477. package/dist/stores-sql/pg-session-storage.js +37 -13
  478. package/dist/stores-sql/retention-store-sql.d.ts +1 -9
  479. package/dist/stores-sql/retention-store-sql.js +5 -19
  480. package/dist/stores-sql/session-policy-store-sql.d.ts +30 -7
  481. package/dist/stores-sql/session-policy-store-sql.js +61 -44
  482. package/dist/stores-sql/session-write-hooks.d.ts +11 -0
  483. package/dist/stores-sql/tidb-session-store.d.ts +58 -7
  484. package/dist/stores-sql/tidb-session-store.js +37 -13
  485. package/dist/submission-exit.d.ts +3 -2
  486. package/dist/submission-exit.js +9 -1
  487. package/dist/task-cwd.d.ts +2 -2
  488. package/dist/task-settings.d.ts +7 -5
  489. package/dist/task-settings.js +3 -3
  490. package/dist/terminal.d.ts +33 -2
  491. package/dist/terminal.js +139 -9
  492. package/dist/tool-approval.d.ts +465 -507
  493. package/dist/tool-approval.js +606 -1222
  494. package/dist/trace/core-keyset-guard.d.ts +1 -1
  495. package/dist/trace/ledger-events.d.ts +3 -3
  496. package/dist/trace/project.d.ts +2 -3
  497. package/dist/trace/redact.js +3 -2
  498. package/dist/trace/self-minted-wire.d.ts +571 -178
  499. package/dist/trace/self-minted-wire.js +189 -56
  500. package/dist/web-admin-client/apply-effective.js +2 -2
  501. package/dist/web-admin-client/read-warnings.d.ts +2 -2
  502. package/dist/web-admin-client/read-warnings.js +1 -1
  503. package/dist/web-admin-client/types.d.ts +1 -1
  504. package/dist/workspace-space.d.ts +10 -4
  505. package/dist/workspace-space.js +4 -1
  506. package/docs/DEVICE-EXECUTOR-PROTOCOL.md +79 -28
  507. package/package.json +7 -3
  508. package/scripts/embed-minimal.mjs +3 -3
  509. package/wire-changes/server@7.151.0.json +762 -0
  510. package/wire-changes/server@7.152.0.json +900 -0
  511. package/dist/config-d-migration.d.ts +0 -37
  512. package/dist/config-d-migration.js +0 -60
  513. package/dist/http/session-inherit-env.d.ts +0 -36
  514. package/dist/http/session-inherit-env.js +0 -6
@@ -9,6 +9,7 @@ import { assertMemoryScopeWidth } from "./memory-key-guards.js";
9
9
  import { exposureBandOf, exposureCarriage, originMarkedSqlPredicate, distilledCarriage } from "./memory-origin-law.js";
10
10
  import { applySqlPatches, } from "./memory-engine-sql-apply.js";
11
11
  import { ensureIndexes } from "./ensure-index.js";
12
+ import { sealStoreClass } from "./store-boundary.js";
12
13
  export const PG_MEMORY_ENGINE_TABLES = {
13
14
  entry: "agent_memory_engine_entry",
14
15
  cursor: "agent_memory_engine_cursor",
@@ -301,4 +302,7 @@ export class PgMemoryEngineBackend {
301
302
  ON CONFLICT (scope) DO UPDATE SET cursor = $2`, [scope, cursor]);
302
303
  }
303
304
  }
305
+ sealStoreClass(PgMemoryEngineBackend, "pg-memory-engine-backend", {
306
+ listHeaders: "exit", getByIds: "exit", search: "exit", applyPatches: "exit", getConsolidationCursor: "exit", setConsolidationCursor: "exit",
307
+ });
304
308
  //# sourceMappingURL=memory-engine-pg.js.map
@@ -1,6 +1,8 @@
1
1
  import { LandingsNeedAdmission, admittingLandings, computeEntryRev, requireLandingsAdmitted, } from "@sema-agent/core";
2
2
  import { memoryEntryKeyWidthRefusal } from "./memory-key-guards.js";
3
3
  import { pgHasUnstorable } from "./pg-safe-json.js";
4
+ import { storeBoundaryFault } from "../terminal.js";
5
+ import { markErrorOrigin } from "./error-origin.js";
4
6
  import { ambiguousOriginRefusal, createBatchCommittedBaseline, distilledWhitewashRefusal, originWhitewashRefusal, rememberBatchCommitted, unknownPatchOpRefusal, } from "./memory-origin-law.js";
5
7
  const FIRST_SUFFIX_STEP = 2;
6
8
  const candidateAt = (slug, n) => (n === FIRST_SUFFIX_STEP ? slug : `${slug}-${n - 1}`);
@@ -317,7 +319,8 @@ export async function applySqlPatches(patches, opts, leg) {
317
319
  throw err;
318
320
  if (issued)
319
321
  mayHaveWritten = true;
320
- report.conflicts.push({ op: patch.op, id: patch.id, reason: `io error: ${err instanceof Error ? err.message : String(err)}` });
322
+ const seen = storeBoundaryFault(err, "memory-engine.applyPatches");
323
+ report.conflicts.push({ op: patch.op, id: patch.id, reason: `io error: ${seen instanceof Error ? seen.message : String(seen)}` });
321
324
  return [];
322
325
  }
323
326
  };
@@ -345,7 +348,7 @@ export async function applySqlPatches(patches, opts, leg) {
345
348
  await admittingLandings(admit, attempt);
346
349
  }
347
350
  catch (err) {
348
- throw err instanceof CallerThrow ? err.thrown : err;
351
+ throw err instanceof CallerThrow ? markErrorOrigin(err.thrown, "caller") : err;
349
352
  }
350
353
  finally {
351
354
  if (leg.appendHistory && history.length > 0)
@@ -9,6 +9,7 @@ import { applySqlPatches, } from "./memory-engine-sql-apply.js";
9
9
  import { isMysqlDupKeyError } from "./sql-errors.js";
10
10
  import { ensureIndexes } from "./ensure-index.js";
11
11
  import { MEMORY_ENGINE_INDEXES, PG_MEMORY_ENGINE_TABLES } from "./memory-engine-pg.js";
12
+ import { sealStoreClass } from "./store-boundary.js";
12
13
  export const TIDB_MEMORY_ENGINE_TABLES = {
13
14
  entry: "agent_memory_engine_entry",
14
15
  cursor: "agent_memory_engine_cursor",
@@ -265,4 +266,7 @@ export class TiDBMemoryEngineBackend {
265
266
  await this.write(`INSERT INTO ${TIDB_MEMORY_ENGINE_TABLES.cursor} (scope, \`cursor\`) VALUES (?, ?) ON DUPLICATE KEY UPDATE \`cursor\` = VALUES(\`cursor\`)`, [scope, cursor]);
266
267
  }
267
268
  }
269
+ sealStoreClass(TiDBMemoryEngineBackend, "tidb-memory-engine-backend", {
270
+ listHeaders: "exit", getByIds: "exit", search: "exit", applyPatches: "exit", getConsolidationCursor: "exit", setConsolidationCursor: "exit",
271
+ });
268
272
  //# sourceMappingURL=memory-engine-tidb.js.map
@@ -1,5 +1,6 @@
1
1
  import { mysqlDriver, pgDriver } from "./sql-driver.js";
2
2
  import { PRINCIPAL_MAX_BYTES, RESERVED_PRINCIPALS, RESERVED_PRINCIPAL_PREFIXES } from "../principal-shape.js";
3
+ import { sealStoreClass } from "./store-boundary.js";
3
4
  export const MEMORY_OPTOUT_GRANT_TABLE = "memory_optout_grant";
4
5
  export const MEMORY_OPTOUT_DEFAULT_PRINCIPAL = "";
5
6
  export function buildMemoryOptOutVerdict(rows, principal) {
@@ -124,6 +125,9 @@ export class SqlMemoryOptOutGrantStore {
124
125
  return { principal, allow: input.allow, updatedAtMs: at, updatedBy: input.updatedBy, ...(note !== null ? { note } : {}) };
125
126
  }
126
127
  }
128
+ sealStoreClass(SqlMemoryOptOutGrantStore, "sql-memory-opt-out-grant-store", {
129
+ resolveAllow: "exit", list: "exit", putDefault: "exit", putOverride: "exit", deleteOverride: "exit",
130
+ });
127
131
  export class TiDBMemoryOptOutGrantStore extends SqlMemoryOptOutGrantStore {
128
132
  constructor(pool, now) {
129
133
  super(mysqlDriver(pool), "mysql", now);
@@ -3,6 +3,7 @@ import { ensureIndexes } from "./ensure-index.js";
3
3
  import { pgSafeJsonStringify, pgProtocolJsonStringify } from "./pg-safe-json.js";
4
4
  import { assertMemoryScopeWidth } from "./memory-key-guards.js";
5
5
  import { decodeJsonColumn, decodeNullableJsonColumn, foldJsonColumn, jsonColumnText, readNonNullJsonValueColumn, readOpaqueJsonValueColumn, readStringRecordColumn, } from "./sql-json-column.js";
6
+ import { sealStoreClass } from "./store-boundary.js";
6
7
  export const PG_MEMORY_SYNC_TABLES = {
7
8
  syncCursor: "agent_memory_engine_sync_cursor",
8
9
  syncPartition: "agent_memory_engine_sync_partition",
@@ -128,6 +129,9 @@ export class PgMemorySyncStore {
128
129
  WHERE id = $1`, [id, error, nextAttemptAtMs]);
129
130
  }
130
131
  }
132
+ sealStoreClass(PgMemorySyncStore, "pg-memory-sync-store", {
133
+ partitionIncarnation: "exit", getCursor: "exit", putCursor: "exit", enqueue: "exit", claimDue: "exit", complete: "exit", fail: "exit",
134
+ });
131
135
  export const MEMORY_HISTORY_INDEXES = [
132
136
  { table: `${PG_MEMORY_SYNC_TABLES.history}`, name: `idx_${PG_MEMORY_SYNC_TABLES.history}_scope`, columns: ["scope"] },
133
137
  ];
@@ -174,6 +178,7 @@ export class PgMemoryHistoryStore {
174
178
  return toMs(res.rows[0]?.n ?? 0);
175
179
  }
176
180
  }
181
+ sealStoreClass(PgMemoryHistoryStore, "pg-memory-history-store", { appendHistory: "exit", historyOf: "exit", countByScope: "exit" });
177
182
  export function historyRowFrom(r) {
178
183
  return {
179
184
  id: String(r.id),
@@ -3,6 +3,7 @@ import { decodeJsonColumn, jsonColumnText, readOpaqueJsonValueColumn, readString
3
3
  import { ensureIndexes } from "./ensure-index.js";
4
4
  import { MEMORY_SYNC_INDEXES, MEMORY_HISTORY_INDEXES, PG_MEMORY_SYNC_TABLES } from "./memory-sync-store-pg.js";
5
5
  import { assertMemoryScopeWidth } from "./memory-key-guards.js";
6
+ import { sealStoreClass } from "./store-boundary.js";
6
7
  export const TIDB_MEMORY_SYNC_TABLES = {
7
8
  syncCursor: "agent_memory_engine_sync_cursor",
8
9
  syncPartition: "agent_memory_engine_sync_partition",
@@ -117,6 +118,9 @@ export class TiDBMemorySyncStore {
117
118
  WHERE id = ?`, [error, nextAttemptAtMs, id]);
118
119
  }
119
120
  }
121
+ sealStoreClass(TiDBMemorySyncStore, "tidb-memory-sync-store", {
122
+ partitionIncarnation: "exit", getCursor: "exit", putCursor: "exit", enqueue: "exit", claimDue: "exit", complete: "exit", fail: "exit",
123
+ });
120
124
  export async function ensureTiDBMemoryHistorySchema(pool) {
121
125
  await pool.query(`CREATE TABLE IF NOT EXISTS ${TIDB_MEMORY_SYNC_TABLES.history} (
122
126
  id CHAR(36) NOT NULL,
@@ -160,4 +164,5 @@ export class TiDBMemoryHistoryStore {
160
164
  return toMs(rows[0]?.n ?? 0);
161
165
  }
162
166
  }
167
+ sealStoreClass(TiDBMemoryHistoryStore, "tidb-memory-history-store", { appendHistory: "exit", historyOf: "exit", countByScope: "exit" });
163
168
  //# sourceMappingURL=memory-sync-store-tidb.js.map
@@ -12,8 +12,8 @@
12
12
  * **≥** 某条未发布形的 `introducedIn` 而两格仍是 `null` ⇒ 红(发布准备提交就是回填时刻,忘了就当场红;版本更低 = 还在开发,不红)。
13
13
  * 最后一条删掉时,整个文件连同 `StoreBackend.runOneTimeMigrations()`(npm 公面上的接口成员)、`NO_SQL_MIGRATIONS`、
14
14
  * `logOneTimeMigrations` / `runAndLogOneTimeMigrations`、三只后端与两只测试夹具上的实现、`boot/stores.ts` 的调用点一起删 —— 零例外:本文件里只有带窗的迁移与它们自己的
15
- * 帮手(两只在场探针、锁腿、方言适配器)与迁移段的**段头**两步(副本能力登记、起服准入 —— 常设,码在 `replica-registration.ts` / `serving-requirement.ts`,本文件只在 {@link runSqlOneTimeMigrations}
16
- * 里排它们的序;最后一条迁移删码时,段头连同锁腿搬进起服序列,不随文件删);没有窗的东西(跳版升级的库的拒启臂)住在起服对账一族(`schema-consistency.ts`、`approval-exemption-skill-cutoff.ts`、local 的
15
+ * 帮手(两只在场探针、锁腿、方言适配器)与迁移段的**段头**两步(副本能力登记、起服准入 —— 常设,码在 `replica-registration.ts` / `serving-requirement.ts`)与锁内的**守卫段**(停-迁-起,常设,码在 `stop-then-start.ts`;本文件只在 {@link runSqlOneTimeMigrations}
16
+ * 里排它们的序;最后一条迁移删码时,段头与守卫段连同锁腿搬进起服序列,不随文件删);没有窗的东西(跳版升级的库的拒启臂)住在起服对账一族(`schema-consistency.ts`、`approval-exemption-skill-cutoff.ts`、local 的
17
17
  * `local-data-root-admission.ts`),不在这里 —— 那条迁移还在时臂只判、不拒,读本文件的 {@link migrationCarried}(行随码同删 ⇒ 删码那一版起臂恒判)。
18
18
  * 其余文件一律只写「窗口见本文件登记表」,不各写一个日期或版本 —— [ref] 之前本文件头写死了一个删除版本号(7.75.0),
19
19
  * 连同 11 个文件里的复述共 23 行;那一版过去了 28 个 minor 也没删,7.93.5 反倒往本文件里又加了一条迁移。
@@ -26,7 +26,7 @@
26
26
  * ⇒ 换成本段:**升一次级把存量字节改完,兼容臂当场删干净**。代价是每一条在它的窗内每次启动都要跑一遍(第二次起全是
27
27
  * 零命中的空转);收益是窗关之后可以把那一条连同它的 SQL 一起删,而读腿从引入那一版起就只有**一种**读法。
28
28
  *
29
- * ## 已退役的 M1–M12 与 M14
29
+ * ## 已退役的 M1–M16
30
30
  * 退役的整树快照索引表(M1)、退役的单座 steering 列(M2)、被上游改了名的闭集词 `unresolvable` → `ancestor_marked`(M3)三条的改写、计数与读数
31
31
  * 窗关后已全部删码,登记行一并删。跳过了它们直接升的库由起服对账一族的拒启臂接住(`schema-consistency.ts` 头注「第二道对账」一节:两件退役 schema
32
32
  * 任一在场 ⇒ 拒启、点名出路;先于一切建表)—— 那一道没有窗,所以不在本文件里。本段入口({@link runSqlOneTimeMigrations})不问这一问。
@@ -67,22 +67,29 @@
67
67
  *
68
68
  * M12(停驻行模式词读法记号的拒臂;不写库;7.150.0 删,窗 2026-11-08 关,发版日前已关)同样已删码,登记行一并删:判据、拒臂与答复、两处记号写点与 ctx 上的记号位都没有了,续跑重放不再问「行上有没有记号」。逐条写跳过了它直接升的库由谁接住:
69
69
  * ⑦ 停驻行模式词读法记号的拒臂(M12):没有响亮臂 —— 7.121.x 及以前写下、此刻仍停驻的行(把 `APPROVAL_TERMINAL_BACKSTOP_MS` 调长的部署,或跳过了带本条的版本直接升的库)体里是请求原词、没有记号;
70
- * 在设了 `AUTONOMY=plan` 的部署上不再被拒,续跑按体里的原词重放(运维的 plan 不再被按段重钳;`plan_review` 的驳回仍由引擎留在 plan)。存量行上的那只记号键原样留着、无人读。出路 = 升级前把这些停驻的 run 决掉 / 取消,
71
- * 或升级窗内设 `AUTONOMY=read-only`(按段的只读围栏)。
70
+ * 在设了 `AUTONOMY=plan` 的部署上不再被拒,由续跑口接住:重放之前体的词过**现**入口地板(`permission-mode-admission.ts` `stampReplayEntryMode`,与提交口同一只入口一步)——
71
+ * 这些行没有写据(体顶层模式词那一格的写者,7.152.0 起才记)⇒ 不是地板的出口写下的,每个词(含 `default` / `acceptEdits`)都照钳成 `plan`。
72
+ * 存量行上的那只记号键原样留着、无人读。出路(要按原词走完)= 升级前把这些停驻的 run 决掉 / 取消。
73
+ *
74
+ * M13(盘上 LKG 信封 formatVersion 2 → 3;不写库;7.152.0 删,窗 2026-11-09 关,发版日前已关)同样已删码,登记行一并删:`loadLkg` 读回 2 时的内存迁移(旧载体 `droppedIdentities` 搬成 `droppedCatalogEntries`、去掉 etag)与它的两只帮手都没有了。
75
+ * 逐条写跳过了它直接升的库(从 < 7.123.0 直接升到本版、中间没在 7.123.0–7.151.x 任一版起过服)由谁接住:
76
+ * ⑧ 盘上 LKG 信封 formatVersion 2 的读回迁移(M13):由既有的响亮臂接住 —— `loadLkg` 对 2 答「unknown formatVersion 2」(拒因点名版本),调用方一行 `config_lkg_unusable` + env 兜底;中心可达照拉
77
+ * (整拉,读腿铸出完整载体,新 LKG 按当期版本覆盖),断着则 env 兜底,下一份干净候选重写 —— 与回滚到 7.122.0 读 3 同一种处置。那是缓存文件、不是数据:不采纳载荷、不迁、不改写文件。
78
+ *
79
+ * M15(盘上 LKG 的载荷换代,settings-schema 10.x → 11 的形;不写库;7.152.0 删,窗 2026-11-10 关,发版日前已关)同样已删码,登记行一并删:`loadLkg` 读回时过契约的一次性迁移的那一段、读回的收据与对契约包迁移子路径的 import 都没有了。
80
+ * 逐条写跳过了它直接升的库(从 < 7.124.0 直接升到本版、中间没在 7.124.0–7.151.x 任一版起过服)由谁接住:
81
+ * ⑨ 盘上 LKG 的载荷换代(M15):由既有的响亮臂接住 —— 信封仍是 3 的 LKG(载荷是 settings-schema 10.x 的形)⇒ `loadLkg` 对 3 答「unknown formatVersion 3」,调用方一行 `config_lkg_unusable` + env 兜底;
82
+ * 中心可达照拉(整拉,新 LKG 按当期版本覆盖),断着则 env 兜底,下一份干净候选重写 —— 与回滚到 7.123.0 读 4 同一种处置。整份文件不读回(缓存、不是数据;不采纳载荷、不迁、不改写文件),
83
+ * 所以「旧键留在载荷里被下游当作缺席静默略过」这条路不存在。
84
+ *
85
+ * M16(本地 `config.d` 的起服一次性迁移;不写库;7.152.0 删,窗 2026-11-10 关,发版日前已关)同样已删码,登记行一并删:起服不再改写 `config.d` —— 接线文件、两个入口(HTTP 服务第 2 段 / `run-local`)的调用与三种迁移日志都没有了;
86
+ * 目录信任判官的文档名单(`config-dir-trust.ts` 的 `LOCAL_READER_DOCUMENTS`)本是判官自己的名单、不是迁移的,搬进了判官的文件。逐条写跳过了它直接升的库(从 < 7.124.0 直接升到本版、中间没在 7.124.0–7.151.x 任一版起过服)由谁接住:
87
+ * ⑩ 本地 `config.d` 的起服迁移(M16):由既有的、常设的契约读腿墓碑与车道合成接住 —— 目录里还带迁移前写法的文档不再被起服改写、一个字节不动:`runtime.json` 带事实 ⇒ 读腿对退役域答 `RetiredDomainError`(整份读不出);
88
+ * `models.atModelAllowlist` / `models.default` ⇒ models 域降级、rosters 整份读不出;`remote-exec.json` 的 `apiUrl` 带 `#`(SS-M7)⇒ 车道合成读它时拒启(`run-local` 退 2);同设两种钥匙的模型条目(SS-M5)⇒ 读腿能抢救就逐条丢弃那一条,没有幸存条目时 models 域降级、整份候选被拒回落 env。
89
+ * 拒句 / 告警止于今天的位 / 规则本身(settings-schema 26.0.0 删了这几步,不再点名迁移 id;它的 `migrate` 也不再改写这几形)—— 出路 = 手写到今天的位,
90
+ * 或升级前用上一个契约 major 跑一次 `npx @sema-agent/settings-schema@25 migrate <config.d 目录>`。
72
91
  *
73
92
  * ## 窗内的迁移(逐条的失败方向刻意不同)
74
- * · **M13 盘上 LKG 信封 formatVersion 2 → 3**(7.123.0)—— 不在店里(配置候选的盘上缓存):被丢目录条目收成一份载体
75
- * (`models.droppedCatalogEntries`,每条被丢的目录条目一行),7.122.0 及以前写的 2 只记了有名且启用的行、记在旧键 `droppedIdentities`。
76
- * `config-lkg.ts` `loadLkg` 读回 2 时在内存里迁一次(旧载体搬成新载体、去掉 etag ⇒ 中心可达后第一拍整拉、重铸完整载体),启动日志
77
- * `config_lkg_migrated` 一行;写盘一律写 3。规则与判形在 `config-lkg.ts` 顶注与 `migrateV2Lkg`。没有读数键(它不写库)。
78
- * · **M15 盘上 LKG 的载荷换代(settings-schema 11)**(7.124.0)—— 不在店里(与 M13 同为非店迁移):3 及更早的 LKG 载荷是 settings-schema 10.x
79
- * 的形(`models.atModelAllowlist` / `models.default` / `runtime` 域 …)。`config-lkg.ts` `loadLkg` 每次读回都过契约的一次性迁移
80
- * `migrateEffectiveSnapshot`(本仓不写任何一条改写规则;只认形、幂等),迁不动(收据 `refused`)⇒ 不读回(拒因点名迁移 id);迁过的由读回方
81
- * 按信封 formatVersion 4 写回原位,启动日志 `config_lkg_migrated` 一行(带收据)。没有读数键(它不写库)。
82
- * · **M16 本地 config.d 的一次性迁移(settings-schema 11)**(7.124.0)—— 不在店里:起服时本地配置源第一次读之前,`config-d-migration.ts`
83
- * 调契约的目录迁移 `migrateConfigDirectory`(覆盖面 = 本地读腿会读的那几份:便携域 + 退役域 `runtime`),整域终判通过才原子写回、搬空的
84
- * `runtime.json` 删;读腿不读的域文件(`hosts` / `workers` …)不碰;
85
- * 迁不动 ⇒ 一字不写、`config_dir_migration_refused` 一行。没有读数键(它不写库)。
86
93
  * · **M17 会话规则一列一文法**(7.129.0,引擎 7.51.0 [ref])—— 引擎把会话规则的 `toolDeny` / `toolAllow` 换成规则条目文法(`Bash(rm:*)` 是一条拒 `rm`
87
94
  * 的规则),退役 `commandAllow` / `commandDeny` 两只命令桶。持久面三件事,同一步做:
88
95
  * ① **列改名** `session_policy.rules` → `rule_entries`(列定义唯一属主 `session-rules-column.ts`):7.128.x 及以前的副本按整串工具名读 `rules`,
@@ -170,8 +177,8 @@
170
177
  * 改写按原文 CAS(MySQL 协议两边 `CAST(… AS BINARY)`,PG `text` 等值)+ `status = 'pending'`,第二跑零命中。**够不到的一格(如实登记)**:local 车道的停驻行在
171
178
  * 引擎自己的 File 店里(盘上格式归引擎,本仓没有合法缝改写)⇒ 那里的存量问答行照旧按「无卡」读(显示通用卡、到期 SLA 拒扫、决断口按工具名要 `answer`);
172
179
  * 那一车道的队列行门型从文档读(引擎恒写),没有可回填的列。窗 = 发布日 + 30 天 = 停驻行的终局兜底窗缺省(与 M19 同一条论证与同三类逃出窗的部署)。
173
- * · **M22 盘上 LKG 信封 formatVersion 4 → 5**(7.132.0)—— 不在店里(与 M13 / M15 同为非店迁移):中心提示层收成一种 wire 形(`{ schemaVersion: 2, artifact }`),
174
- * 4 及更早的载荷若带 prompts,那是 13.x 的两轴 wire(引擎当期不读)。`config-lkg.ts` `loadLkg` 读回 4(及迁到 4 的 2 / 3)时:载荷带 prompts ⇒ 不读回
180
+ * · **M22 盘上 LKG 信封 formatVersion 4 → 5**(7.132.0)—— 不在店里(非店迁移):中心提示层收成一种 wire 形(`{ schemaVersion: 2, artifact }`),
181
+ * 4 及更早的载荷若带 prompts,那是 13.x 的两轴 wire(引擎当期不读)。`config-lkg.ts` `loadLkg` 读回 4 时:载荷带 prompts ⇒ 不读回
175
182
  * (拒因点名版本与键);不带 ⇒ 载荷零改动读回,读回方按 5 写回原位,启动日志 `config_lkg_migrated` 一行。规则在 `config-lkg.ts` 顶注 formatVersion 5 一段与
176
183
  * `migrateV4Lkg`。没有读数键(它不写库)。
177
184
  * · **M23 存量 placed 子代行的属主**(7.133.0)—— 7.132.x 及以前两只 SQL 店建委派子代的 placed 行时属主恒 NULL,会话面的属主谓词对 NULL 放行 ⇒ 谁拿到子代的会话 id
@@ -319,7 +326,7 @@
319
326
  * 起服迁移的 local 腿(`FileApprovalAskStore.upgradeJournalEnvelope`)一次压实把整本重写成 v2。
320
327
  * **回滚**:7.141.x 对改名后的表每一条读写都响亮失败、对 v2 日志拒启 —— 回滚的唯一支持形 = 恢复升级前的备份,或手工把列改回(MIGRATION 写了语句)。
321
328
  * 读数:`askCauseColumnsChanged`(0–2 处表形改动)/ `askParkTriggersMoved`(SQL;local 恒 0)/ `askJournalRecordsUpgraded`(local;SQL 恒 0)。
322
- * · **M35 配置根上 env 模型表的决定(settings-schema SS-M11)**(7.143.0)—— 不在店里(与 M16 同为本地配置根上的起服迁移):本版起本地配置腿上,一份管模型面的
329
+ * · **M35 配置根上 env 模型表的决定(settings-schema SS-M11)**(7.143.0)—— 不在店里(本地配置根上的起服迁移):本版起本地配置腿上,一份管模型面的
323
330
  * `config.d/models.json` 在 env 模型表已声明时,只有配置根上的决定文档 `config.env-models.json` 读作 `replaced` 才被采纳(否则模型面组拒
324
331
  * `config.catalog_replaces_env_models`,`env-model-table-gate.ts`);升级前这种目录静默顶替 env 表。本条保住升级前的读法:起服、本地配置第一次读之前
325
332
  * (`config-root-migration.ts`,两个入口同调),调契约的 `migrateEnvModelsDecision` —— 先读决定与目录,再独占创建运行记录 `config.migration.SS-M11.json`
@@ -355,11 +362,11 @@
355
362
  * 逐目录点名进 warn `local_data_dir_mode_refused`(经不可缺席的披露口,窗内每次起服再报)。幂等:第二次起服零命中零写。没有读数键(它不写库)。local 独有;SQL 车道没有这些目录。
356
363
  * · **M40 没有执行环境的车道的存词 `in-process` → `none`**(7.147.0)—— 本版起每个部署都声明车道(`REMOTE_EXEC`),没有执行环境的那一条叫 `none`;本版之前没声明车道的部署在
357
364
  * 出处 / 放置格里存下的词是它的旧名,本版的车道闭集里没有它(读口一律响亮拒,补句点名本条,`execution-lane-rename-m40.ts`)。改值不丢信息,四处:SQL 两方言的
358
- * `approval_ask.execution_lane` 与会话的 `execution_lane`(`session_meta` 上;M41 搬过之后在 `session_ext` 上 —— 三张表逐张读形,列在哪张改哪张)(本段**第一步**,先于任何写:列不在 ⇒ 那一张零动作 —— 跳版升上来的库由 M32 加列、按声明车道回填,不会再铸旧词);
365
+ * `approval_ask.execution_lane` 与会话的 `execution_lane`(`session_meta` 上;M41 搬过之后在 `session_ext` 上 —— 三张表逐张读形,列在哪张改哪张)(列不在 ⇒ 那一张零动作 —— 跳版升上来的库由 M32 加列、按声明车道回填,不会再铸旧词);
359
366
  * local 的会话元数据边档(`session-incarnations.json` 的 `[会话].execution.lane`,**排在严格边档对账之前** —— `LocalBackend.ensureSchema()` 第一步,否则旧词先撞严格拒)
360
367
  * 与问账日志(排在 M32 的 local 问回填之前,一次压实重写整本)。**版本围栏(停-迁-起)**:旧副本不认 `none`、新读者不认旧词,列形不变 ⇒ 混跑没有列检查拦得住。
361
- * SQL:还有旧词行要改 ∧ 有停-迁-起证据(`readOlderReplicaEvidence`:`task_run` 的 `running` 行在 `REAP_RUN_STALE_SEC` 之内更新过 —— 收割器判活的同一条谓词 —— 且持有者没有登记为知道 M40)⇒ 拒启
362
- * (`config.execution_lane_rename_refused`,一行没改;拒句给最新心跳时刻与「全停之后何时再起」);没有旧词行 ⇒ 零动作、可滚动。local:数据根的起服锁(core `FileStorageBackend` 的 `LOCK`)
368
+ * SQL:还有旧词行要改 ∧ 有停-迁-起证据(守卫段,`stop-then-start.ts` 的 `readOlderReplicaEvidence`:`task_run` 的 `running` 行在 `REAP_RUN_STALE_SEC` 之内更新过 —— 收割器判活的同一只谓词构造 —— 且持有者没有登记为知道 M40)⇒ 拒启
369
+ * (`config.execution_lane_rename_refused`,一行没改;拒句给最新心跳时刻与「全停之后何时再起」);放行 ⇒ 改名之前记起服要求 `(M40, in_force)`;没有旧词行 ⇒ 零动作、可滚动。local:数据根的起服锁(core `FileStorageBackend` 的 `LOCK`)
363
370
  * 本来就只许一个进程 ⇒ 不另设守卫。读数 `executionLaneWordsRenamed`(四处合计)。幂等:第二次起服零命中零写。
364
371
  * · **M41 会话的部署格搬出引擎座表**(7.147.0)—— 引擎座表 `session_meta` 只带引擎的列;本服务记在会话上的十二格(标题 / 置顶 / 换源通告基线 / 位置与项目 / 执行放置七列 / fork 键)
365
372
  * 自本版起住旁表 `session_ext`(一会话一行,外键 `ON DELETE CASCADE` 随会话行走;建表、列定义、补行与级联能力探针的唯一属主 `session-ext-table.ts`,起服在本段之前已建表并证过级联)。
@@ -367,7 +374,7 @@
367
374
  * (`ON DUPLICATE KEY UPDATE` / `ON CONFLICT DO UPDATE`:旁表那一行的这几格 = 根行上的值;中断后重跑同一句同一结果);② 逐行核对(每一列 null 安全相等,旁表行不在 = 缺省)——
368
375
  * 有一行不等 ⇒ 拒启 `config.session_ext_move_refused`(`copy_mismatch`,点名那只会话;一列没删,下一次起服重搬);③ **一句** `ALTER TABLE session_meta DROP COLUMN …` 删掉在场的全部部署格列
369
376
  * (按后置条件收敛:那几列都不在)。旁表形的库(本版新建、或已搬过)⇒ 零动作。**版本围栏(停-迁-起)**:旧副本对这十二格的每一笔写在删列之后都撞未知列,
370
- * 搬与删之间落下的写会丢 ⇒ 还有列要搬 ∧ 有停-迁-起证据(与 M40 同一只读法)⇒ 拒启(`older_replica`,一字节没写;本段第二步,紧随 M40,先于任何别的写)。
377
+ * 搬与删之间落下的写会丢 ⇒ 还有列要搬 ∧ 有停-迁-起证据(与 M40 同一只读法,守卫段里判)⇒ 拒启(`older_replica`,一字节没写);放行 ⇒ ① 的第一句 upsert 之前记起服要求 `(M41, in_force)`。
371
378
  * 如实的边(7.147.0 起已披露,不改):① 搬 → ② 核对 → ③ 删列三步之间一只没被看见的旧副本落下的写会丢 —— 删列让旧写在 ③ 之后响亮失败,却挡不住 ② 与 ③ 之间那一笔。
372
379
  * **M32 × M41 的序与读表**:迁移段里 M32 先、M41 后。M32 读两种形 —— 八列在 `session_meta` 上(7.139–7.146 形:M32 全程写根行,随后 M41 连同别的格一起搬进旁表)
373
380
  * 或部署格已在旁表(本条之后 / 新库)。旁表形里 M32 的加列 / 回填 / 收尾标记(② ④ ④b ⑥)都不跑(切换早已收尾;回填前提的拒随之不判),剩 ⓪(旧版副本建回的空退役表删掉)、围栏,
@@ -376,9 +383,9 @@
376
383
  * · **M42 场景前缀的切换检查**(7.148.0)—— 本版起以 `_scn:` 开头的身份读作「某个人的某个场景」(恢复管线 `owner-brands.ts` 的 `partsOf`);更早的版本不保留这一前缀,
377
384
  * 自称 `_scn:<x>:<y>` 的调用方写下的行在本版会被读成另一个人的场景。**持久数据「响亮拒」那一半,不改写**:库里没有本条的标记 ⇒ 只读扫存量身份(本树建表句里名字以
378
385
  * owner / scope / principal / subject 结尾、且库里在的每一列;local = run / 会话 / 问 / 附件四处 File 店的属主),一处命中 ⇒ 拒启 `config.scenario_prefix_switch_refused`(点名来源与行数,
379
- * 一字节没写);零命中 ⇒ 写标记;有标记 ⇒ 不扫(本版自己写下的合法 `_scn:` 行不让第二次起服拒启)。**停-迁-起(SQL)**:零命中而有停-迁-起证据(与 M40 / M41 同一只
380
- * 读法)⇒ 同码拒启(`older_replica`),标记不写 —— 更早版本的副本不保留前缀,扫描之后它还会收下这类身份。标记随库(SQL:本条自己建的标记表一行;local:数据根里一只文件),
381
- * 不随进程。**第一步**:先于任何写(拒了就是一字节没动)。律、扫描面、拒句的唯一属主 = `scenario-prefix-switch-m42.ts`。读数 `scenarioPrefixSourcesScanned`(0 = 标记在场)。
386
+ * 一字节没写);零命中 ⇒ 记起服要求 `(M42, in_force)`、写标记;有标记 ⇒ 不扫(本版自己写下的合法 `_scn:` 行不让第二次起服拒启)。**停-迁-起(SQL)**:标记不在而有停-迁-起证据(与 M40 / M41 同一只
387
+ * 读法,守卫段里判 —— 先于扫描)⇒ 同码拒启(`older_replica`),标记不写 —— 更早版本的副本不保留前缀,扫描之后它还会收下这类身份(同时有存量命中与证据的库先看到的是 `older_replica`)。标记随库(SQL:本条自己建的标记表一行;local:数据根里一只文件),
388
+ * 不随进程。先于任何写(拒了就是一字节没动)。律、扫描面、拒句的唯一属主 = `scenario-prefix-switch-m42.ts`。读数 `scenarioPrefixSourcesScanned`(0 = 标记在场)。
382
389
  * · **M43 撤回出口的启用标记**(7.148.0)—— 不改任何存量行。提交出口撤回一只「受理之前就被拒」的提交铸下的会话之前,读旁表的客户端写计数 `client_writes`
383
390
  * (四个客户端写者在锁住根行之后同一事务 +1,`plugins/session-ext-table.ts`);更早版本的副本的写者不计数 ⇒ 混跑窗里它刚给这只会话改了标题,撤回却读到 0,会把人写过的会话删掉。
384
391
  * ⇒ 撤回出口只在本库的**标记行**落下之后启用(标记表与 M42 同一张,属主 `one-time-migration-marker.ts`;读者 = 撤回事务里的部署判据 `plugins/session-withdraw-sql.ts`,标记未落 ⇒ 答 `upgrade_pending` = 留,
@@ -386,8 +393,8 @@
386
393
  * 读数 `withdrawMarkWritten`。local 车道:数据根独占、没有混跑窗,版本位在会话元数据格上(`clientWrites`,本版铸的格都带),恒零。
387
394
  * · **M51 会话在删态的切换**(7.148.0)—— 不改任何存量行。本版起删会话按会话三态走(活 → 在删 → 没了,律在 `src/session-deletion.ts`):围栏写旁表 `session_ext.deleting_token`,
388
395
  * 认领点(规则 L)读它、删除路只在围栏判一次认领。更早版本的副本不读在删态 ⇒ 混跑时它会在一只在删的会话上收下提交、建 run,而本版删除路的账本腿已不再判认领 ——
389
- * 比修前更坏。⇒ **停-迁-起**,没有运行期开关:标记表(与 M42 同一张)无 `M51` 行 ∧ 有停-迁-起证据(与 M40 / M41 / M42 同一只读法 {@link readOlderReplicaEvidence})
390
- * ⇒ 拒启 `config.session_deleting_switch_refused`(`older_replica`,一字节不写,拒句给可再起的时刻);没有 ⇒ 落标记(之后不再判)。
396
+ * 比修前更坏。⇒ **停-迁-起**,没有运行期开关:标记表(与 M42 同一张)无 `M51` 行 ∧ 有停-迁-起证据(与 M40 / M41 / M42 同一只读法,守卫段里判)
397
+ * ⇒ 拒启 `config.session_deleting_switch_refused`(`older_replica`,一字节不写,拒句给可再起的时刻);没有 ⇒ 记起服要求 `(M51, in_force)`、落标记(之后不再判)。
391
398
  * 看不见的边与 M43 同:空闲的、早于副本登记的旧副本(零 `running` run)没有证据 —— MIGRATION 写「全部旧副本停下再起」。读数 `sessionDeletingSwitchMarked`(0 或 1)。
392
399
  * local 车道:数据根独占、没有混跑窗 ⇒ 恒零。
393
400
  * · **M44 run 的 `errorCode` 只读列**(7.148.0)—— 码的唯一读法是 `task_run.error_code` 列;写 `result` 的三个写口同写这一列(停驻两口此前不写)。**改写半场**:
@@ -449,11 +456,33 @@
449
456
  * (删 `taskId` 名下的问与批 —— 今天删会话级联的一个子集,语义不丢,`InMemoryApprovalAskStore.deleteByTaskM50`)并算删行记录,构造器末段的起服压实把整本重写成存活行的快照、记录离盘
450
457
  * (压实失败 ⇒ 位留着,下一次写或下一次窗内起服再压;重放幂等),恰一行 stderr 点名条数与账本;窗关之后 ⇒ 同一条记录拒启(`StoreBootRefusalError`,拒因点名本条、
451
458
  * 窗的最后一天与出路:用早于本条的版本起服一次 —— 它认得这只词,起服即压实删行记录),删码因此是零行为变化。没有起服读数键(它不经迁移段跑,读数是那一行 stderr)。只 local(SQL 两方言从来没有这只词)。
452
- * · **M52 停-迁-起证据的心跳一半**(7.150.0)—— 不改库。停-迁-起守卫(M40 · M41 · M42 · M51)与 M43 的标记判「库上还有不知道这条迁移的副本在服务吗」只经一只读法
453
- * `readOlderReplicaEvidence`:判活窗内心跳过的 `running` run,按持有者分组,减去登记为知道这条迁移的持有者(副本能力登记 `replica-registration.ts`,常设;本版起每只进程在
454
- * 迁移段头登记一行)。早于副本登记的副本不登记,只经它们持有的 run 心跳可见 —— 这一半(与它的判活窗输入 `liveRunWindowMs`)就是本行,窗内才在;
455
- * 登记一半本版**不判活**,只作归因(点名持有者)。看不见的边如实:空闲的、早于副本登记的副本没有任何证据(终局边界,运维停光旧副本是第一道);
456
- * 登记行不续期、不观察,**不是围栏**。没有读数键(它不写库)。local 车道:数据根独占 ⇒ 守卫没有判活腿,恒不读。
459
+ * · **M53 存量子代失败句换成对外句**(7.151.0)—— 店边界换句(SQL 店的出口只带原码 + 稳定句,`terminal.ts` 的 `storeBoundaryFault`)之前落盘的子代失败句可能逐字带库驱动的原句
460
+ * (库账号 / 内网地址 / 表名)。只改**有结构标记**的两格(判据与新值唯一一份 `store-fault-sentence-m53.ts`,新值 = 出口同一只读法 `outwardStoreMessageOf`):
461
+ * `background_agent.record_json` 的 `error`(`errorCode` 出了本仓词法;`summary` 里逐字含旧句的那一段同换)与 `task_event` 里 `tool_end` 卡的 `structured.errorMessage`
462
+ * (卡 `errorCode` 出了词法)。自由文本面(父转录、卡外的 `output` 报告行、workflow 节点句)没有结构标记 —— 不改,MIGRATION 披露。键集分批读、逐行写(后台行按 `rev` CAS、照本表写律把 `rev` 抬 1 —— 拿着改写之前那一读的写者 CAS 落空、重读,不会把旧句写回;
463
+ * 打空留给下一次起服);幂等:改过的格已是对外句。不是停-迁-起:旧副本写下的新行仍是旧句,窗内每次起服再扫。读数 `storeFaultSentencesRewritten`;local 恒 0(本地数据根上没有 SQL 驱动)。
464
+ * · **M54 退役 `checkpoint` 的展示拷贝列**(7.152.0)—— 运维队列行的动作事实(工具名、入参、风险描述、规则候选、bidi 位 ……)改为读时从续跑执行的同一份字节、同一次整行解码
465
+ * 投影(两孪生同调 `checkpoint-store-face.ts` 的 `buildQueueActionFacts`)⇒ `tool_name` / `tool_input` / `risk_descriptor` / `rule_suggestions` / `has_bidi_controls` 五列是同一事实的
466
+ * 第二份存储,再无读者、再无写者(留下的 `tool_call_id` / `bound_input_hash` / `approval_card` / `gate_kind` 有找行 / 到期谓词的读者)。任一列在 ⇒ 记起服要求 `(M54, in_force)`、
467
+ * 再一句 `ALTER TABLE checkpoint DROP COLUMN …` 删掉在场的那几列(按后置条件收敛:一列都不在);都不在 ⇒ 零动作。没有搬运:值从快照读,删列不丢信息(升级前停驻的行同样按本版读法投影)。
468
+ * 停-迁-起 `structural`(书写序 ③ 的第一形):第一笔改动就是删列 DDL,删之后更早版本副本点名这些列的每一句当场失败 —— 它的每一次停驻写(INSERT 带这些列)与每一次运维队列读。
469
+ * 这不是滚动形 ②(a):更早副本写不出的不是「旧形的一格值」,而是它的全部停驻与队列读,两版混跑不成立 ⇒ 守卫段有证据(判活窗内有不知道 M54 的持有者在跑 run)即拒启、一字节不写;
470
+ * 放行之后缺 M54 的构建起服即被准入拒(回滚形)。读数 `checkpointDisplayColumnsDropped`(本次删掉的列数,0–5);local 恒 0(LOCAL 孪生从来没有这些列)。
471
+ *
472
+ * ## 停-迁-起(常设,码不在本文件)
473
+ * 登记行的 `stopThenStart` 一格是声明(围栏类 · 欠不欠 · 有证据时的拒;每一行显式写,`null` = 不声明),律、型、唯一判官、守卫段与证据读法住 `stop-then-start.ts`(常设,不带窗)。
474
+ * 本文件只在 {@link runSqlOneTimeMigrations} 的锁内排守卫段的序(准入复核之后、第一步迁移之前:任一条拒 ⇒ 迁移段一字节没写),各条停-迁-起步在**自己的**第一笔
475
+ * 不兼容写之前记起服要求(`serving-requirement.ts` 的 `recordServingRequirement`)。证据读法没有窗:早于副本登记的副本只经它们持有的 run 心跳可见,而这样的进程在任何日期之后
476
+ * 都可能还在(回滚到早于副本登记的构建、跳过公开序列的嵌入方、登记行过了留存视界的长寿进程)—— 它曾登记为窗行 M52(7.150.0),7.151.0 起改为常设:删掉它,此后引入的
477
+ * 每一条停-迁-起迁移的守卫就零证据、静默放行。M43 的启用判同读它(不拒启,只决定标记落不落)。
478
+ *
479
+ * ## 新迁移的书写序(先满足的赢;登记行注写明前一形为什么不行)
480
+ * ① 不动存量字节:新事实进新表或新列(中央建表语句;`shapeChanges: add`)—— 不要一次性迁移、不要守卫;
481
+ * ② 滚动形(`stopThenStart: null`):迁移函数体里把存量字节改一次,改完之后更早副本还能写出的旧形必须是二者之一 ——(a)写不出(库让它失败);(b)本条在窗内每次起服再改一次,
482
+ * 且其间每个读者对旧形响亮拒。**认旧形与新形的双读只许在迁移函数体里**:新迁移不得在迁移函数体之外读旧形(不写双写窗、不写窗内才生效的读侧行为臂 —— 下面 M19 / M20 / M38 / M44 / M50
483
+ * 等既有窗行的读侧半场照留、随窗删,不作新迁移的先例);按证据推迟启用一项新行为(M43 形)也不是滚动形;
484
+ * ③ 停-迁-起 `structural`(先围后搬:第一笔改动就是围栏 DDL,搬运只从围过的对象读;M34 ① 的就地改名是先例)> `per-write`(写句读起服要求,早至少一版发出)> `accepted`(成文的残余)。
485
+ * 能两版滚动的不许声明停-迁-起。三类的判据与残余见 `stop-then-start.ts`。
457
486
  *
458
487
  * ## 收据账(一次起服一只,每一条迁移同一只)
459
488
  * 每一步把它**已提交**的改写 / 删除与点名读数当场记进同一只收据账({@link MigrationReceipts}):计数随每次提交累加、行随每次提交追加、形读数在那一步落定时写。走完 ⇒
@@ -480,7 +509,8 @@ import { type ImportedLayerRootAllowRetired, type ImportedLayerRootBucketSkipped
480
509
  import { type LocalPlacementBackfillSeat, type UnusableArchiveWord } from "../execution-placement.js";
481
510
  import type { PendingShapeChange } from "./schema-consistency.js";
482
511
  import { type OlderReplicaEvidence } from "./stop-then-start-sentence.js";
483
- import { type ReplicaCapability, type ReplicaRegistration } from "./replica-registration.js";
512
+ import { type ReplicaRegistration } from "./replica-registration.js";
513
+ import { type LiveRunWindowInput, type StopThenStartEntry, type StopThenStartRow } from "./stop-then-start.js";
484
514
  /** 迁移读数(启动日志一行写全;测试按它断言,不靠日志文本)。 */
485
515
  export interface OneTimeMigrationReport {
486
516
  /** M17:`session_policy` 装规则的那一列 —— `renamed` = 本次把 `rules` 改名成 `rule_entries`;`current` = 早已是新名(新库 / 第二跑);
@@ -557,6 +587,11 @@ export interface OneTimeMigrationReport {
557
587
  readonly withdrawMarkWritten: number;
558
588
  /** M51:本次落下会话在删态切换标记的行数(0 或 1;已落 ⇒ 0;别的副本还在心跳 ⇒ 拒启,不进读数)。SQL 独有;local 恒 0(数据根独占,没有混跑窗)。非零 = 真写了标记。 */
559
589
  readonly sessionDeletingSwitchMarked: number;
590
+ /** M53:本次把存量子代失败句换成对外句的格数(SQL `background_agent.record_json` 的 `error` / `summary` 一行算一格 + `task_event` 的 `tool_end` 卡 `errorMessage` 一行算一格)。
591
+ * local 恒 0(本地数据根上没有 SQL 驱动,存量行不可能带驱动原句)。非零 = 真写了存量行。 */
592
+ readonly storeFaultSentencesRewritten: number;
593
+ /** M54:本次从 `checkpoint` 删掉的退役展示列数(0–5:在场几列删几列)。SQL 独有;local 恒 0(LOCAL 孪生从来没有这些列)。非零 = 真改了表形。 */
594
+ readonly checkpointDisplayColumnsDropped: number;
560
595
  /** M44:本次改写了 `errorCode` 码列的 run 行数(SQL `task_run` / local `run.json`;结果投影的码 ≠ 列,或 `running` 行带码)。非零 = 真写了存量行。 */
561
596
  readonly runErrorCodeColumnRewritten: number;
562
597
  /** M45:本次改写了预览列的 run 行数(SQL `task_run` / local `run.json`;以闭集注入块开标签起头的旧形剥到不动点)。非零 = 真写了存量行。 */
@@ -703,7 +738,7 @@ export declare class OneTimeMigrationInterruptedError extends Error {
703
738
  * 规则(窗长 30 天、窗关后的第一个 minor 删码、门怎么判)在本文件头注「窗」一节,只写那一次。
704
739
  */
705
740
  export interface OneTimeMigrationWindow {
706
- /** 本文件里的条目名(头注「窗内的迁移」的 M13…)。 */
741
+ /** 本文件里的条目名(头注「窗内的迁移」的 M17…)。 */
707
742
  readonly id: string;
708
743
  /** 引入这条迁移的版本 = 第一只含其代码的发布 tag(取证:`git log -S '<该条的常量名>' -- src/plugins/one-time-migrations.ts`
709
744
  * 找引入提交 → `git tag --contains <提交> --sort=creatordate` 取最早)。 */
@@ -729,22 +764,13 @@ export interface OneTimeMigrationWindow {
729
764
  */
730
765
  readonly shapeChanges?: readonly PendingShapeChange[];
731
766
  /**
732
- * 本条是**停-迁-起**迁移:起服时的守卫在有停-迁-起证据时拒启、一字节不写(动作段的唯一属主 = `stop-then-start-sentence.ts`)。两格见 {@link StopThenStartRow}:
733
- * 缘由句与「这只库还欠不欠本条」的唯一读法 —— 起服列册对账的升级清单(`schema-consistency.ts` 的 `describeUpgradeChecklist`)只列这只库还欠的行、把缘由句原样列给运维,
734
- * 于是「本构建有哪几条要先停光旧副本」只有这一处在写、随行删码一起没。读者 = {@link stopThenStartMigrations}。
767
+ * 本条是不是**停-迁-起**迁移 —— **每一行显式写**(缺键 = tsc 红;形门 `test/one-time-migration-window-gate.test.ts` 再核一次「每行自有这一键」)。
768
+ * 一份声明({@link StopThenStartRow}:缘由句 · 这只库还欠不欠 · 有证据时本条的拒 · 围栏类)⇒ 起服时守卫段在任何写之前判证据(有 ⇒ 拒启、一字节不写),
769
+ * 本条放行之后在自己的第一笔不兼容写之前记一行起服要求;起服列册对账的升级清单只列这只库还欠的行、把缘由句原样列给运维。律、型与唯一判官在 `stop-then-start.ts`。
770
+ * `null` = 本条**不声明**停-迁-起(不拒启、不进清单的停-迁-起一步)—— 只是声明,不是混跑安全的证明;新迁移写 `null` 只许两形:改完之后更早副本写不出旧形
771
+ * (库让它失败),或本条在窗内每次起服再改一次、其间每个读者对旧形响亮拒(头注「新迁移的书写序」一节)。读者 = {@link stopThenStartMigrations}。
735
772
  */
736
- readonly stopThenStart?: StopThenStartRow;
737
- }
738
- /**
739
- * 一条停-迁-起迁移的登记格(一句话 + 一只只读判据的引用;登记表里只写引用,判据的码在本条的迁移步旁边):
740
- * · `reason` —— 一句英文:更早版本的副本在迁移之后还会写什么、写了会怎样(升级清单原样列给运维);
741
- * · `owedOn` —— **这只库还欠不欠本条**的唯一读法(只读,一字节不写):本条的守卫先问它(不欠 ⇒ 零动作、不读证据),升级清单第 2 步只列它答「欠」的行 ——
742
- * 清单不另判(修前清单按登记表全列、不判欠不欠,对走过这几条的库说「不可滚动」,与守卫的放行是一事两说)。读口是列册对账同一只无参读口
743
- * {@link SchemaProbeRead}:判据的语句只内联本文件的常量(标记键 / 退役词 / 表名列名,与 `tableExists` / `columnExists` 同形),不带参数。
744
- */
745
- export interface StopThenStartRow {
746
- readonly reason: string;
747
- readonly owedOn: (read: SchemaProbeRead, dialect: SqlDialect) => Promise<boolean>;
773
+ readonly stopThenStart: StopThenStartRow | null;
748
774
  }
749
775
  /**
750
776
  * 🔴 [ref] —— 一次性迁移登记表,本文件各条的窗的**唯一属主**。别处(接口 JSDoc、调用点、DDL 注、部署文档)只写「窗口见
@@ -770,12 +796,11 @@ export declare function migrationWindowEnd(id: string): string;
770
796
  */
771
797
  export declare function migrationCarried(id: string): boolean;
772
798
  /**
773
- * 本构建带的**停-迁-起**迁移(登记行的 `stopThenStart` 一格;行在 ⇔ 码在 ⇒ 起服会在这一条上判活),按登记表顺序。读者 = 起服列册对账的升级清单:
774
- * 逐行问 `owedOn`,只把这只库还欠的列给运维。登记表里再没有这样的行时返回空数组 —— 清单的这一步随之不出。
799
+ * 本构建带的**停-迁-起**迁移(登记行的 `stopThenStart` 不是 `null`;行在 ⇔ 码在 ⇒ 起服会在这一条上判证据),按登记表顺序,连同判官要读的 `introducedIn` / `shapeChanges`。
800
+ * 读者 = 守卫段(`stop-then-start.ts` 的 `guardOwedStopThenStart`,{@link runSqlOneTimeMigrations} 的锁内)与起服列册对账的升级清单(逐行问 `owedOn`,只把这只库还欠的列给运维)。
801
+ * 登记表里再没有这样的行时返回空数组 —— 守卫段的循环为空、清单的这一步随之不出。
775
802
  */
776
- export declare function stopThenStartMigrations(registry?: readonly Pick<OneTimeMigrationWindow, "id" | "stopThenStart">[]): readonly ({
777
- readonly id: string;
778
- } & StopThenStartRow)[];
803
+ export declare function stopThenStartMigrations(registry?: readonly Pick<OneTimeMigrationWindow, "id" | "introducedIn" | "shapeChanges" | "stopThenStart">[]): readonly StopThenStartEntry[];
779
804
  /** local 车道上 SQL 独有的几条(M17 / M18 / M21 / M23 / M24 / M26 / M27 / M29)的读数(M32 的回填两车道都有、M33 只在 local,local 腿的读数由 `LocalBackend.runOneTimeMigrations` 现算):那几张表 / 列在文件底座上从来不存在 ⇒ 如实答 absent / 0。 */
780
805
  export declare const NO_SQL_MIGRATIONS: Omit<OneTimeMigrationReport, "runErrorCodeColumnRewritten" | "runObjectivePreviewRewritten" | "shellSentinelOwnersCleared" | "shellSentinelOwnerRowsRetained" | "checkpointHostSessionsBackfilled" | "legacySkillExemptionsDropped" | "executionPlacementsBackfilled" | "askExecutionLanesBackfilled" | "executionLaneWordsRenamed" | "scenarioPrefixSourcesScanned" | "executionPlacementSessionsUnreadable" | "localArchiveRowFactsBackfilled" | "localArchivesAnonymized" | "localArchivesKeptStamped" | "localArchivesUnreadable" | "localArchiveSnapshotsRecovered" | "localArchiveTokensAdopted" | "localArchiveTokensMinted" | "askJournalRecordsUpgraded" | "importedLayerRootAllowsRetired" | "importedLayerRootBucketsSkipped" | "importedLayerRootBucketsUnnamed">;
781
806
  /** 启动期的日志口(logger 的子集)。两级各有其用,见 {@link logOneTimeMigrations}。 */
@@ -816,8 +841,10 @@ export interface MigrationDb {
816
841
  */
817
842
  export declare function createSqlImportedLayerRootSource(exec: Parameters<typeof listRuleBucketOwners>[0]): ImportedLayerRootRetirementSource;
818
843
  /**
844
+ * 取连接之前:本构建的停-迁-起声明过唯一判官(`stop-then-start.ts` 的 `assertStopThenStartDeclarations`;自相矛盾 = 构建缺陷 ⇒ 抛,一句库语句都没发)。
819
845
  * **段头**(常设两步,不带窗;只在这里排序;与迁移步同一条连接):两张表在(不在 ⇒ 拒,点名公开序列)→ 本进程登记(`replica-registration.ts`)→ 起服准入**锁外预读**(`serving-requirement.ts`)
820
- * → 取迁移锁 → **锁内复核**(同一判据;本进程等锁期间握锁的那一只写下的要求在这里读得到)→ 各迁移步。准入拒 ⇒ 一步迁移都不跑。
846
+ * → 取迁移锁 → **锁内复核**(同一判据;本进程等锁期间握锁的那一只写下的要求在这里读得到)→ **守卫段**(`stop-then-start.ts`:本构建全部还欠的停-迁-起迁移先一起判证据,
847
+ * 任一有 ⇒ 抛那一条自己的拒,迁移段一字节没写)→ 各迁移步(各停-迁-起步在自己的第一笔不兼容写之前记起服要求)。准入拒 / 守卫拒 ⇒ 一步迁移都不跑。
821
848
  * 登记在任何守卫读证据之前、本进程能持有任何 run 之前落下;跳过 `ensureSchema()` 的嵌入方走同一段。`me` 缺省 = 本进程的登记行;真库钉传别的构建(能力名单不同的起服者)。
822
849
  */
823
850
  export declare function runSqlOneTimeMigrations(dialect: SqlDialect, pool: MysqlPool | PgPool, input: SqlOneTimeMigrationInput, me?: ReplicaRegistration): Promise<OneTimeMigrationReport>;
@@ -857,12 +884,12 @@ export declare function scannedIdentityColumnsM42(db: Pick<MigrationDb, "rows">,
857
884
  }[]>;
858
885
  /**
859
886
  * 🔴 M42 的 SQL 腿:标记在场 ⇒ 返回(零扫描);否则逐列只读计数 `LIKE '<前缀>%'`,一处命中 ⇒ {@link ScenarioPrefixSwitchRefusedError}(`stored_prefix`;一字节没写,标记不写);
860
- * 零命中而有停-迁-起证据({@link readOlderReplicaEvidence})⇒ 同一只拒(`older_replica`;标记不写);否则写标记。
887
+ * 零命中 ⇒ 记起服要求 `(M42, in_force)`、再写标记(停-迁-起证据已在守卫段里判过:有证据的库在扫描之前就以 `older_replica` 拒了)。
861
888
  * 握着迁移段的那一把锁、在那一条连接上:两只副本同时起服时第二只读到第一只写下的标记(写标记用 `INSERT IGNORE` / `ON CONFLICT DO NOTHING`,收敛)。
862
889
  */
863
890
  export declare function switchScenarioPrefixM42(db: MigrationDb, dialect: SqlDialect, receipts: {
864
891
  scenarioPrefixSourcesScanned: number;
865
- }, input: LiveRunWindowInput): Promise<void>;
892
+ }): Promise<void>;
866
893
  /** M40 的拒启码(停-迁-起守卫)。 */
867
894
  export declare const EXECUTION_LANE_RENAME_REFUSED_CODE = "config.execution_lane_rename_refused";
868
895
  /**
@@ -900,33 +927,35 @@ export declare class ExecutionLaneRenameWriteRefusedError extends StoreBootRefus
900
927
  /** 落不了盘的那只文件(绝对路径)。 */
901
928
  file: string, cause: unknown);
902
929
  }
903
- /** 停-迁-起证据读法心跳一半的输入(归 M52 行):判活窗(毫秒)= 本部署的 `REAP_RUN_STALE_SEC` —— 收割器判「这条 run 的持有者还活着」用的同一个窗。 */
904
- export interface LiveRunWindowInput {
905
- readonly liveRunWindowMs: number;
906
- }
907
930
  /** M48 的输入:本部署有没有身份边界 = 部署形表 `DEPLOYMENT_SHAPE_PREDICATES.identityBoundary` 那一行的读数(只读配置;调用方读表交来,迁移步不另读配置)。
908
931
  * SQL 腿 `clearShellSentinelOwnersM48` 读它;local 腿(`LocalBackend.runOneTimeMigrations` 里 M48 那一格)读同一行,由后端构造时读一次;dev-open 判据(`devOpenDeployment`)读同一行。 */
909
932
  export interface ShellSentinelOwnerInput {
910
933
  readonly identityBoundary: boolean;
911
934
  }
912
- /** SQL 一次性迁移段的输入(各条目自己的那一半;删码车删掉它那一半)。 */
935
+ /** SQL 一次性迁移段的输入(各条目自己的那一半;删码车删掉它那一半。判活窗那一半 `LiveRunWindowInput` 归常设的守卫段 / 证据读法,`stop-then-start.ts`)。 */
913
936
  export type SqlOneTimeMigrationInput = ExecutionPlacementSwitchInput & LiveRunWindowInput & ShellSentinelOwnerInput;
914
937
  /**
915
938
  * M40 ⓪ —— 带 `execution_lane` 列的表上的旧词改成新名(问行表 + 会话的那一列所在的表:M41 搬之前在 `session_meta`、之后在 `session_ext`;一句 UPDATE 一张表;幂等:第二跑零命中)。列不在的表零动作(跳版升上来的库:M32 稍后加列、按声明车道回填,不会再铸旧词)。
916
- * 还有旧词行 ⇒ 先过停-迁-起守卫({@link refuseWhileRunsHeartbeat});没有 ⇒ 不读 run 表、零写(没跑过无车道部署的库可滚动升级)。
939
+ * 还有旧词行 ⇒(守卫段已判过证据、放行)记起服要求 `(M40, in_force)`、再改名;没有 ⇒ 零写(没跑过无车道部署的库可滚动升级)。
917
940
  */
918
941
  export declare function renameRetiredExecutionLaneWordsM40(db: MigrationDb, dialect: SqlDialect, receipts: {
919
942
  executionLaneWordsRenamed: number;
920
- }, input: LiveRunWindowInput): Promise<void>;
943
+ }): Promise<void>;
944
+ /** M54 的拒启码(确定的拒启表态:全停之后再起才有另一个答案)。 */
945
+ export declare const CHECKPOINT_DISPLAY_COLUMNS_DROP_REFUSED_CODE = "config.checkpoint_display_columns_drop_refused";
946
+ /** M54 起服拒:退役列还在,而有停-迁-起证据(拒因闭集只有 `older_replica`)。 */
947
+ export declare class CheckpointDisplayColumnsDropRefusedError extends StoreBootRefusalError {
948
+ readonly code = "config.checkpoint_display_columns_drop_refused";
949
+ readonly reason: "older_replica";
950
+ /** `tail` = 库此刻还差的列(`describeUpgradeDriftTail`;列齐 ⇒ 空串):一次起服读全,不必补一句再试。 */
951
+ constructor(evidence: OlderReplicaEvidence, tail?: string);
952
+ }
921
953
  /**
922
- * **停-迁-起证据的唯一读法**(M40 / M41 / M42 / M43 / M51 同读;拒句与读数的句子属主 = `stop-then-start-sentence.ts`):判活窗内心跳过的 `running` run
923
- * (收割器 `reapStale` 判活的同一条谓词:`status = 'running'` ∧ `updated_at` 在 `REAP_RUN_STALE_SEC` 窗内),按持有者(`task_run.instance_id`,建行铸、认领接管)分组,
924
- * **减去登记为知道 `migrationId` 的持有者**(`replica-registration.ts`;`knows` 与起服准入同一只判据)—— 剩下的 run 就是证据:持有者没有登记行(早于副本登记的副本、`NULL` 身份、
925
- * 自传身份的嵌入方)或登记了而能力名单里没有这条迁移,照算(保守)。登记一半只作归因(点名持有者),**不判活**。
926
- * 本进程此刻还在迁移段里、一条 run 都没起过 ⇒ 证据里只有别的进程。`task_run` 不在 ⇒ `undefined`。心跳一半随 M52 行删(那一行的 `removal`)。
927
- * `migrationId` 在型上就要在能力名单里(`ReplicaCapability`):一条迁移读证据 ⇔ 它的名在名单里。
954
+ * M54(规则与理由见头注 M54 段):退役列一列都不在 ⇒ 零动作;否则(守卫段已判过证据、放行)记起服要求 `(M54, in_force)`、再**一句**删掉在场的那几列
955
+ * (两方言都收多个 `DROP COLUMN`;按后置条件收敛:一列都不在)。没有第二步:删列是本条唯一的改动,也是它的围栏(`structural`)。
956
+ * 中断 ⇒ 要求行留着(保守:缺 M54 的构建拒启),下一次起服还在的列重删。读数 = 本次删掉的列数(0–5)。导出给真库钉驱动。
928
957
  */
929
- export declare function readOlderReplicaEvidence(db: MigrationDb, dialect: SqlDialect, input: LiveRunWindowInput, migrationId: ReplicaCapability): Promise<OlderReplicaEvidence | undefined>;
958
+ export declare function dropCheckpointDisplayColumnsM54(db: MigrationDb, dialect: SqlDialect, receipts: MigrationReceipts): Promise<void>;
930
959
  /** M41 的拒启码(确定的拒启表态;与 `config.schema_mismatch` 同一族)。 */
931
960
  export declare const SESSION_EXT_MOVE_REFUSED_CODE = "config.session_ext_move_refused";
932
961
  /** 拒因闭集:`older_replica` = 还有列要搬而有停-迁-起证据;`copy_mismatch` = 搬完核对有一行不等(一列没删)。 */
@@ -937,11 +966,6 @@ export declare class SessionExtMoveRefusedError extends StoreBootRefusalError {
937
966
  readonly code = "config.session_ext_move_refused";
938
967
  constructor(reason: SessionExtMoveRefusalReason, detail: string);
939
968
  }
940
- /**
941
- * M41 ⓪′ —— 停-迁-起守卫(紧随 M40 的守卫,先于任何别的写):还有部署格列要搬 ∧ 有停-迁-起证据({@link readOlderReplicaEvidence})⇒ 拒 `older_replica`,一字节没写。
942
- * 旁表形 ⇒ 零动作(不读 run 表)。
943
- */
944
- export declare function refuseSessionExtMoveWhileRunsHeartbeat(db: MigrationDb, dialect: SqlDialect, input: LiveRunWindowInput): Promise<void>;
945
969
  /**
946
970
  * M41(规则与理由见头注 M41 段):① 搬(键集分页 upsert)→ ② 逐行核对 → ③ 一句删列。旁表形 ⇒ 零动作。中断 ⇒ 下一次起服从头重跑:① 的 upsert 是「旁表这几格 = 根行上的值」,
947
971
  * 重跑同一结果;② 只读;③ 按后置条件收敛(那几列都不在)。排在迁移段最后(M32 之后:M32 读 / 写 `session_meta` 上的八列;M23 改的是引擎列)。导出给真库钉驱动「中断后续跑」。
@@ -1105,8 +1129,8 @@ export interface ParkedRowRepair {
1105
1129
  */
1106
1130
  export declare function parkedRowRepairOf(gateKindCell: unknown, gate: unknown, pendingAction: unknown): ParkedRowRepair;
1107
1131
  /**
1108
- * M21 —— 停驻行补齐引擎今天在铸点写的两格(规则、为什么、够不到的一格见头注 M21 段)。只扫 `status = 'pending'` 的候选行(`gate_kind` 为 NULL,或审批门型且
1109
- * 待决工具列是问答工具 —— 两列都是写入时从同一份文档反范式下来的;列只做预筛,判读读文档的子树),按 `token` 键集分页,每行只看一次:
1132
+ * M21 —— 停驻行补齐引擎今天在铸点写的两格(规则、为什么、够不到的一格见头注 M21 段)。只扫 `status = 'pending'` 的候选行(`gate_kind` 为 NULL,或审批门型 ——
1133
+ * 列只做预筛,「待决工具是不是问答工具」由判读读文档的子树答;7.152.0 起工具名不再落列,M54 删那一列),按 `token` 键集分页,每行只看一次:
1110
1134
  * · 回填门型:`UPDATE … SET gate_kind = ? WHERE token = ? AND status = 'pending' AND gate_kind IS NULL`(第二跑零命中);
1111
1135
  * · 续不了(列 NULL ∧ 门子树里读不出登记门型):`UPDATE … SET status = 'expired', decided_at_ms = ?`,同一守卫 —— 与到期收割同一个终态(停驻的 run 行由既有收割腿收);
1112
1136
  * · 补卡词:读整只文档一次 —— 带 `requirementsDigest`(引擎行摘要封过,`gate.approvalCard` 是它覆盖的成员)或读不懂 ⇒ 一个字节不动、计进 `parkedQuestionRowsLeftAsWritten`;