@sema-agent/server 7.150.0 → 7.151.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 (341) hide show
  1. package/MIGRATION.md +185 -0
  2. package/USAGE.md +53 -25
  3. package/deploy/sema-up/README.md +7 -1
  4. package/deploy/sema-up/chart/Chart.yaml +1 -1
  5. package/deploy/sema-up/chart/templates/NOTES.txt +5 -0
  6. package/deploy/sema-up/chart/templates/_helpers.tpl +15 -16
  7. package/deploy/sema-up/chart/templates/server-v4pro.yaml +5 -3
  8. package/deploy/sema-up/chart/templates/server.yaml +5 -3
  9. package/deploy/sema-up/chart/values-full-single.yaml +3 -1
  10. package/deploy/sema-up/chart/values.yaml +8 -1
  11. package/deploy/sema-up/cluster-up.sh +1 -0
  12. package/deploy/sema-up/kube-up.sh +1 -1
  13. package/deploy/sema-up/lib/flagshape.sh +1 -1
  14. package/deploy/sema-up/lib/helm-values-cluster.py +2 -0
  15. package/deploy/sema-up/lib/helm-values-kube.py +2 -0
  16. package/dist/adoption/import.js +3 -3
  17. package/dist/approval-ask-machine.d.ts +1 -1
  18. package/dist/approval-card.d.ts +2 -2
  19. package/dist/approval-gate-currency.d.ts +1 -1
  20. package/dist/auth-bridge.d.ts +20 -0
  21. package/dist/auth-bridge.js +9 -0
  22. package/dist/background-session-reap.d.ts +1 -1
  23. package/dist/bake-runner/main.d.ts +4 -2
  24. package/dist/bind-host.d.ts +2 -3
  25. package/dist/bind-host.js +2 -4
  26. package/dist/boot/budget-tracing.js +1 -1
  27. package/dist/boot/engine-lease.d.ts +5 -0
  28. package/dist/boot/engine-lease.js +1 -0
  29. package/dist/boot/execution-env.d.ts +8 -14
  30. package/dist/boot/execution-env.js +54 -17
  31. package/dist/boot/execution-lane.js +32 -5
  32. package/dist/boot/late-binds.d.ts +8 -4
  33. package/dist/boot/late-binds.js +7 -1
  34. package/dist/boot/memory-consolidation.d.ts +3 -2
  35. package/dist/boot/memory-consolidation.js +6 -6
  36. package/dist/boot/reapers.d.ts +5 -0
  37. package/dist/boot/reapers.js +12 -1
  38. package/dist/boot/resolve-spec.d.ts +3 -3
  39. package/dist/boot/resolve-spec.js +31 -22
  40. package/dist/boot/runner-deps.d.ts +9 -2
  41. package/dist/boot/runner-deps.js +3 -3
  42. package/dist/boot/session-age-out.d.ts +36 -0
  43. package/dist/boot/session-age-out.js +101 -0
  44. package/dist/boot/session-faces.d.ts +5 -14
  45. package/dist/boot/session-faces.js +9 -5
  46. package/dist/boot/stage-01-config.js +2 -0
  47. package/dist/boot/stage-05-execution-env.d.ts +5 -3
  48. package/dist/boot/stage-05-execution-env.js +2 -2
  49. package/dist/boot/stage-06-runners.d.ts +7 -4
  50. package/dist/boot/stage-06-runners.js +15 -6
  51. package/dist/boot/stage-07-capability-layer.d.ts +7 -4
  52. package/dist/boot/stage-07-capability-layer.js +2 -1
  53. package/dist/boot/stage-08-reapers.d.ts +7 -4
  54. package/dist/boot/stage-08-reapers.js +4 -2
  55. package/dist/boot/stage-09-leader.d.ts +11 -5
  56. package/dist/boot/stage-09-leader.js +12 -3
  57. package/dist/boot/stage-10-http-server.d.ts +11 -5
  58. package/dist/boot/stage-10-http-server.js +3 -6
  59. package/dist/boot/web-admin.js +3 -1
  60. package/dist/boot/workflow-orchestration.d.ts +7 -2
  61. package/dist/boot/workflow-orchestration.js +24 -7
  62. package/dist/bounded-rotation.d.ts +29 -0
  63. package/dist/bounded-rotation.js +24 -0
  64. package/dist/capability-facts.d.ts +22 -13
  65. package/dist/capability-facts.js +28 -18
  66. package/dist/center-credential.d.ts +25 -6
  67. package/dist/center-credential.js +25 -5
  68. package/dist/config-catalog.d.ts +26 -7
  69. package/dist/config-catalog.js +14 -11
  70. package/dist/config-invariants.d.ts +2 -1
  71. package/dist/config-invariants.js +4 -4
  72. package/dist/config-types.d.ts +10 -4
  73. package/dist/config.d.ts +51 -2
  74. package/dist/config.js +35 -24
  75. package/dist/deployment-shape.d.ts +9 -1
  76. package/dist/deployment-shape.js +2 -1
  77. package/dist/device-protocol.d.ts +5 -4
  78. package/dist/device-protocol.js +1 -1
  79. package/dist/device-ws-hub.js +3 -2
  80. package/dist/device-ws-protocol.d.ts +63 -10
  81. package/dist/device-ws-protocol.js +56 -25
  82. package/dist/engine-identity.d.ts +19 -7
  83. package/dist/engine-identity.js +10 -2
  84. package/dist/entry-mode-clamp-notice.d.ts +2 -1
  85. package/dist/execution-env-refusal.d.ts +23 -0
  86. package/dist/execution-env-refusal.js +5 -0
  87. package/dist/execution-lane-caps.d.ts +3 -1
  88. package/dist/field-conflict.d.ts +1 -1
  89. package/dist/file-history-capture.d.ts +11 -4
  90. package/dist/file-history-capture.js +9 -6
  91. package/dist/file-history-disclosure.d.ts +7 -5
  92. package/dist/file-history-disclosure.js +7 -5
  93. package/dist/fleet/drain-entry.d.ts +4 -0
  94. package/dist/hooks/hook-runner.js +2 -2
  95. package/dist/host-lsp-manager.d.ts +2 -2
  96. package/dist/http/admission.js +17 -2
  97. package/dist/http/approval-sweeps.js +5 -5
  98. package/dist/http/checkpoint-ctx.d.ts +2 -0
  99. package/dist/http/checkpoint-ctx.js +1 -0
  100. package/dist/http/dispatch.d.ts +2 -1
  101. package/dist/http/dispatch.js +34 -27
  102. package/dist/http/durable-run-leg.js +16 -16
  103. package/dist/http/health-self-report.d.ts +9 -1
  104. package/dist/http/health-self-report.js +2 -0
  105. package/dist/http/owner-access.d.ts +31 -11
  106. package/dist/http/owner-access.js +37 -6
  107. package/dist/http/resume-ctx-read.js +25 -3
  108. package/dist/http/resume-legs.d.ts +2 -1
  109. package/dist/http/resume-legs.js +259 -79
  110. package/dist/http/route-ctx.d.ts +18 -8
  111. package/dist/http/route-table.d.ts +1 -1
  112. package/dist/http/routes/admin-memory-optout.d.ts +1 -1
  113. package/dist/http/routes/agents-roster.js +2 -3
  114. package/dist/http/routes/approvals-assistant.js +4 -3
  115. package/dist/http/routes/background.d.ts +3 -3
  116. package/dist/http/routes/capabilities.js +8 -5
  117. package/dist/http/routes/fleet.js +10 -8
  118. package/dist/http/routes/projects.d.ts +3 -2
  119. package/dist/http/routes/projects.js +4 -5
  120. package/dist/http/routes/runs.js +102 -36
  121. package/dist/http/routes/session-sync.d.ts +4 -3
  122. package/dist/http/routes/session-sync.js +172 -77
  123. package/dist/http/routes/sessions-list.js +13 -7
  124. package/dist/http/routes/sessions.js +10 -6
  125. package/dist/http/routes/tasks.js +30 -16
  126. package/dist/http/routes/trace-usage.js +2 -2
  127. package/dist/http/server.d.ts +21 -27
  128. package/dist/http/server.js +2 -2
  129. package/dist/http/submit-ctx.js +5 -4
  130. package/dist/http/wire-types.d.ts +14 -4
  131. package/dist/identity-source.d.ts +20 -3
  132. package/dist/identity-source.js +14 -0
  133. package/dist/index.d.ts +4 -0
  134. package/dist/lane-home-probe.d.ts +3 -7
  135. package/dist/lane-home-probe.js +0 -1
  136. package/dist/leader/leader.d.ts +2 -1
  137. package/dist/leg-facts.d.ts +13 -5
  138. package/dist/leg-facts.js +2 -1
  139. package/dist/memory-scope.d.ts +5 -4
  140. package/dist/memory-scope.js +4 -4
  141. package/dist/memory-sync-client.d.ts +30 -2
  142. package/dist/memory-sync-client.js +16 -9
  143. package/dist/observability/err-text.d.ts +7 -0
  144. package/dist/observability/err-text.js +5 -0
  145. package/dist/observability/fail-open.d.ts +7 -3
  146. package/dist/observability/fail-open.js +7 -3
  147. package/dist/observability/metrics.js +1 -0
  148. package/dist/orchestration/workflow-notify-journal.d.ts +18 -1
  149. package/dist/orchestration/workflow-notify-journal.js +12 -1
  150. package/dist/orchestration/workflow-park-decision.d.ts +70 -18
  151. package/dist/orchestration/workflow-park-decision.js +49 -10
  152. package/dist/orchestration/workflow-park-holder.d.ts +65 -0
  153. package/dist/orchestration/workflow-park-holder.js +98 -0
  154. package/dist/orchestration/workflow-record-fence.d.ts +36 -0
  155. package/dist/orchestration/workflow-record-fence.js +42 -0
  156. package/dist/owner-faces.d.ts +1 -1
  157. package/dist/parked-decide.d.ts +104 -53
  158. package/dist/parked-decide.js +153 -117
  159. package/dist/peer-directory.d.ts +2 -2
  160. package/dist/peer-inbound-face.d.ts +2 -6
  161. package/dist/peer-inbound-face.js +0 -3
  162. package/dist/permission-mode-admission.d.ts +41 -5
  163. package/dist/permission-mode-admission.js +29 -3
  164. package/dist/plugins/adoption-log-sql.d.ts +3 -1
  165. package/dist/plugins/adoption-log-sql.js +7 -1
  166. package/dist/plugins/approval-ask-store-file.d.ts +10 -2
  167. package/dist/plugins/approval-ask-store-file.js +8 -0
  168. package/dist/plugins/approval-ask-store-memory.d.ts +6 -1
  169. package/dist/plugins/approval-ask-store-memory.js +28 -9
  170. package/dist/plugins/approval-ask-store-sql.d.ts +43 -2
  171. package/dist/plugins/approval-ask-store-sql.js +34 -5
  172. package/dist/plugins/approval-exemption-store.js +3 -0
  173. package/dist/plugins/approval-nonce-store.js +2 -0
  174. package/dist/plugins/breaker-state-sql.js +2 -0
  175. package/dist/plugins/caching-session-store.d.ts +9 -15
  176. package/dist/plugins/caching-session-store.js +6 -0
  177. package/dist/plugins/device-store-sql.js +6 -0
  178. package/dist/plugins/error-origin.d.ts +18 -0
  179. package/dist/plugins/error-origin.js +10 -0
  180. package/dist/plugins/execution-placement-sql.js +6 -6
  181. package/dist/plugins/image-bake-store-sql.js +6 -0
  182. package/dist/plugins/image-index-sql.js +4 -0
  183. package/dist/plugins/landed-attendants.d.ts +212 -0
  184. package/dist/plugins/landed-attendants.js +161 -0
  185. package/dist/plugins/leader-run-store-sql.js +4 -0
  186. package/dist/plugins/local-session-live-reference.d.ts +40 -0
  187. package/dist/plugins/local-session-live-reference.js +39 -0
  188. package/dist/plugins/local-session-store.d.ts +71 -33
  189. package/dist/plugins/local-session-store.js +129 -27
  190. package/dist/plugins/memory-engine-pg.js +4 -0
  191. package/dist/plugins/memory-engine-sql-apply.js +5 -2
  192. package/dist/plugins/memory-engine-tidb.js +4 -0
  193. package/dist/plugins/memory-optout-grant-store-sql.js +4 -0
  194. package/dist/plugins/memory-sync-store-pg.js +5 -0
  195. package/dist/plugins/memory-sync-store-tidb.js +5 -0
  196. package/dist/plugins/one-time-migrations.d.ts +57 -63
  197. package/dist/plugins/one-time-migrations.js +162 -90
  198. package/dist/plugins/org-delivery-quota-store.js +4 -1
  199. package/dist/plugins/outcome-ledger-sql.js +2 -0
  200. package/dist/plugins/permission-rule-store-sql.js +11 -4
  201. package/dist/plugins/pg-cost-quota.js +4 -0
  202. package/dist/plugins/pg-pool.js +24 -1
  203. package/dist/plugins/pg-rate-limiter.js +2 -0
  204. package/dist/plugins/posix-shell-fs.d.ts +6 -1
  205. package/dist/plugins/posix-shell-fs.js +4 -1
  206. package/dist/plugins/remote-env-adb.d.ts +19 -15
  207. package/dist/plugins/remote-env-adb.js +41 -15
  208. package/dist/plugins/remote-env-connect-seat.d.ts +105 -0
  209. package/dist/plugins/remote-env-connect-seat.js +72 -0
  210. package/dist/plugins/remote-env-device.d.ts +22 -5
  211. package/dist/plugins/remote-env-device.js +106 -8
  212. package/dist/plugins/remote-env-e2b.d.ts +15 -6
  213. package/dist/plugins/remote-env-e2b.js +42 -32
  214. package/dist/plugins/remote-env-file-error.js +6 -2
  215. package/dist/plugins/remote-env-host.d.ts +17 -0
  216. package/dist/plugins/remote-env-host.js +30 -38
  217. package/dist/plugins/remote-env-k8s.d.ts +41 -39
  218. package/dist/plugins/remote-env-k8s.js +53 -30
  219. package/dist/plugins/remote-env-local-docker.d.ts +13 -8
  220. package/dist/plugins/remote-env-local-docker.js +34 -41
  221. package/dist/plugins/remote-env-ssh.d.ts +18 -12
  222. package/dist/plugins/remote-env-ssh.js +60 -59
  223. package/dist/plugins/remote-shell.d.ts +98 -1
  224. package/dist/plugins/remote-shell.js +218 -0
  225. package/dist/plugins/resume-anchor-store-sql.d.ts +11 -2
  226. package/dist/plugins/resume-anchor-store-sql.js +12 -5
  227. package/dist/plugins/retention-lane-store-sql.js +4 -0
  228. package/dist/plugins/retention-sql.d.ts +20 -2
  229. package/dist/plugins/retention-sql.js +11 -0
  230. package/dist/plugins/run-store-sql.d.ts +21 -2
  231. package/dist/plugins/run-store-sql.js +31 -7
  232. package/dist/plugins/scenario-prefix-switch-m42.d.ts +1 -1
  233. package/dist/plugins/scenario-prefix-switch-m42.js +2 -2
  234. package/dist/plugins/schema-consistency.d.ts +4 -2
  235. package/dist/plugins/schema-consistency.js +19 -2
  236. package/dist/plugins/send-file-ledger.js +3 -0
  237. package/dist/plugins/serving-requirement.d.ts +26 -7
  238. package/dist/plugins/serving-requirement.js +11 -4
  239. package/dist/plugins/session-birth.d.ts +6 -2
  240. package/dist/plugins/session-capture-record-store-sql.js +2 -0
  241. package/dist/plugins/session-ext-table.d.ts +14 -1
  242. package/dist/plugins/session-ext-table.js +5 -1
  243. package/dist/plugins/session-row-sql.d.ts +49 -2
  244. package/dist/plugins/session-row-sql.js +56 -13
  245. package/dist/plugins/session-store-sql.d.ts +34 -18
  246. package/dist/plugins/session-store-sql.js +98 -17
  247. package/dist/plugins/shared-memory-store-sql.d.ts +1 -0
  248. package/dist/plugins/shared-memory-store-sql.js +6 -2
  249. package/dist/plugins/sql-driver.d.ts +2 -1
  250. package/dist/plugins/sql-driver.js +18 -3
  251. package/dist/plugins/sql-errors.d.ts +11 -6
  252. package/dist/plugins/sql-errors.js +5 -6
  253. package/dist/plugins/stop-then-start-sentence.d.ts +10 -4
  254. package/dist/plugins/stop-then-start-sentence.js +14 -10
  255. package/dist/plugins/stop-then-start.d.ts +109 -0
  256. package/dist/plugins/stop-then-start.js +104 -0
  257. package/dist/plugins/store-backend.d.ts +40 -13
  258. package/dist/plugins/store-backend.js +169 -27
  259. package/dist/plugins/store-boundary.d.ts +57 -0
  260. package/dist/plugins/store-boundary.js +139 -0
  261. package/dist/plugins/store-contracts.d.ts +17 -0
  262. package/dist/plugins/store-fault-sentence-m53.d.ts +7 -0
  263. package/dist/plugins/store-fault-sentence-m53.js +25 -0
  264. package/dist/plugins/store-fault.d.ts +26 -7
  265. package/dist/plugins/store-fault.js +18 -2
  266. package/dist/plugins/task-attachment-store.js +9 -0
  267. package/dist/plugins/task-list-store-sql.d.ts +2 -2
  268. package/dist/plugins/task-list-store-sql.js +10 -8
  269. package/dist/plugins/tidb-cost-quota.js +4 -0
  270. package/dist/plugins/tidb-pool.js +2 -1
  271. package/dist/plugins/tidb-rate-limiter.js +4 -0
  272. package/dist/plugins/user-input-ledger-sql.js +4 -0
  273. package/dist/plugins/workflow-run-store-sql.d.ts +28 -10
  274. package/dist/plugins/workflow-run-store-sql.js +64 -4
  275. package/dist/plugins/workspace-fill.d.ts +4 -7
  276. package/dist/plugins/workspace-fill.js +2 -1
  277. package/dist/plugins/write-behind-counter.js +5 -0
  278. package/dist/project-context.d.ts +0 -2
  279. package/dist/project-context.js +4 -8
  280. package/dist/project-registry.d.ts +46 -0
  281. package/dist/project-registry.js +44 -0
  282. package/dist/request-key-closure.js +1 -1
  283. package/dist/request-value-closure.d.ts +4 -0
  284. package/dist/request-value-closure.js +10 -0
  285. package/dist/run-acceptance.d.ts +3 -2
  286. package/dist/run-acceptance.js +4 -6
  287. package/dist/run-local.js +1 -0
  288. package/dist/runs.d.ts +37 -8
  289. package/dist/runs.js +53 -12
  290. package/dist/runtime-governance.d.ts +5 -4
  291. package/dist/security.d.ts +30 -32
  292. package/dist/security.js +41 -7
  293. package/dist/server-secret-env.d.ts +12 -10
  294. package/dist/server-secret-env.js +24 -15
  295. package/dist/session-bindings.d.ts +82 -0
  296. package/dist/session-bindings.js +18 -0
  297. package/dist/session-children-retire.d.ts +2 -2
  298. package/dist/session-children-retire.js +2 -6
  299. package/dist/session-deletion.d.ts +16 -1
  300. package/dist/session-error-wire.d.ts +3 -3
  301. package/dist/session-error-wire.js +3 -3
  302. package/dist/session-incarnation.d.ts +10 -0
  303. package/dist/session-incarnation.js +10 -1
  304. package/dist/session-kind.d.ts +57 -0
  305. package/dist/session-kind.js +22 -0
  306. package/dist/session-row.d.ts +21 -1
  307. package/dist/session-row.js +7 -1
  308. package/dist/session-sync-kernel.d.ts +24 -14
  309. package/dist/session-sync-kernel.js +3 -6
  310. package/dist/session-sync.d.ts +4 -98
  311. package/dist/session-sync.js +1 -71
  312. package/dist/session-titler.d.ts +10 -3
  313. package/dist/session-titler.js +19 -6
  314. package/dist/ssh-host-key.d.ts +5 -0
  315. package/dist/ssh-host-key.js +3 -0
  316. package/dist/stores-sql/file-history-store-sql.d.ts +52 -2
  317. package/dist/stores-sql/file-history-store-sql.js +108 -70
  318. package/dist/stores-sql/pg-session-storage.d.ts +34 -7
  319. package/dist/stores-sql/pg-session-storage.js +37 -13
  320. package/dist/stores-sql/retention-store-sql.d.ts +1 -9
  321. package/dist/stores-sql/retention-store-sql.js +2 -10
  322. package/dist/stores-sql/session-policy-store-sql.d.ts +30 -7
  323. package/dist/stores-sql/session-policy-store-sql.js +61 -44
  324. package/dist/stores-sql/session-write-hooks.d.ts +11 -0
  325. package/dist/stores-sql/tidb-session-store.d.ts +58 -7
  326. package/dist/stores-sql/tidb-session-store.js +37 -13
  327. package/dist/submission-exit.d.ts +3 -2
  328. package/dist/submission-exit.js +9 -1
  329. package/dist/task-cwd.d.ts +2 -2
  330. package/dist/task-settings.d.ts +6 -5
  331. package/dist/terminal.d.ts +33 -2
  332. package/dist/terminal.js +139 -9
  333. package/dist/tool-approval.d.ts +140 -6
  334. package/dist/tool-approval.js +165 -72
  335. package/dist/trace/self-minted-wire.d.ts +290 -27
  336. package/dist/trace/self-minted-wire.js +101 -13
  337. package/docs/DEVICE-EXECUTOR-PROTOCOL.md +78 -27
  338. package/package.json +2 -2
  339. package/wire-changes/server@7.151.0.json +762 -0
  340. package/dist/http/session-inherit-env.d.ts +0 -36
  341. package/dist/http/session-inherit-env.js +0 -6
@@ -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 反倒往本文件里又加了一条迁移。
@@ -67,8 +67,9 @@
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
+ * `bypassPermissions` / `auto` / `dontAsk` / 无词钳成 `plan`;`default` / `acceptEdits` 与 plan 地板的出口词(`plan_review` 批准写下的词)同字、读不出是谁写的,原样重放。
72
+ * 存量行上的那只记号键原样留着、无人读。出路(要那两个词也不按原词续跑)= 升级前把这些停驻的 run 决掉 / 取消,或升级窗内设 `AUTONOMY=read-only`(按段的只读围栏)。
72
73
  *
73
74
  * ## 窗内的迁移(逐条的失败方向刻意不同)
74
75
  * · **M13 盘上 LKG 信封 formatVersion 2 → 3**(7.123.0)—— 不在店里(配置候选的盘上缓存):被丢目录条目收成一份载体
@@ -355,11 +356,11 @@
355
356
  * 逐目录点名进 warn `local_data_dir_mode_refused`(经不可缺席的披露口,窗内每次起服再报)。幂等:第二次起服零命中零写。没有读数键(它不写库)。local 独有;SQL 车道没有这些目录。
356
357
  * · **M40 没有执行环境的车道的存词 `in-process` → `none`**(7.147.0)—— 本版起每个部署都声明车道(`REMOTE_EXEC`),没有执行环境的那一条叫 `none`;本版之前没声明车道的部署在
357
358
  * 出处 / 放置格里存下的词是它的旧名,本版的车道闭集里没有它(读口一律响亮拒,补句点名本条,`execution-lane-rename-m40.ts`)。改值不丢信息,四处:SQL 两方言的
358
- * `approval_ask.execution_lane` 与会话的 `execution_lane`(`session_meta` 上;M41 搬过之后在 `session_ext` 上 —— 三张表逐张读形,列在哪张改哪张)(本段**第一步**,先于任何写:列不在 ⇒ 那一张零动作 —— 跳版升上来的库由 M32 加列、按声明车道回填,不会再铸旧词);
359
+ * `approval_ask.execution_lane` 与会话的 `execution_lane`(`session_meta` 上;M41 搬过之后在 `session_ext` 上 —— 三张表逐张读形,列在哪张改哪张)(列不在 ⇒ 那一张零动作 —— 跳版升上来的库由 M32 加列、按声明车道回填,不会再铸旧词);
359
360
  * local 的会话元数据边档(`session-incarnations.json` 的 `[会话].execution.lane`,**排在严格边档对账之前** —— `LocalBackend.ensureSchema()` 第一步,否则旧词先撞严格拒)
360
361
  * 与问账日志(排在 M32 的 local 问回填之前,一次压实重写整本)。**版本围栏(停-迁-起)**:旧副本不认 `none`、新读者不认旧词,列形不变 ⇒ 混跑没有列检查拦得住。
361
- * SQL:还有旧词行要改 ∧ 有停-迁-起证据(`readOlderReplicaEvidence`:`task_run` 的 `running` 行在 `REAP_RUN_STALE_SEC` 之内更新过 —— 收割器判活的同一条谓词 —— 且持有者没有登记为知道 M40)⇒ 拒启
362
- * (`config.execution_lane_rename_refused`,一行没改;拒句给最新心跳时刻与「全停之后何时再起」);没有旧词行 ⇒ 零动作、可滚动。local:数据根的起服锁(core `FileStorageBackend` 的 `LOCK`)
362
+ * SQL:还有旧词行要改 ∧ 有停-迁-起证据(守卫段,`stop-then-start.ts` 的 `readOlderReplicaEvidence`:`task_run` 的 `running` 行在 `REAP_RUN_STALE_SEC` 之内更新过 —— 收割器判活的同一只谓词构造 —— 且持有者没有登记为知道 M40)⇒ 拒启
363
+ * (`config.execution_lane_rename_refused`,一行没改;拒句给最新心跳时刻与「全停之后何时再起」);放行 ⇒ 改名之前记起服要求 `(M40, in_force)`;没有旧词行 ⇒ 零动作、可滚动。local:数据根的起服锁(core `FileStorageBackend` 的 `LOCK`)
363
364
  * 本来就只许一个进程 ⇒ 不另设守卫。读数 `executionLaneWordsRenamed`(四处合计)。幂等:第二次起服零命中零写。
364
365
  * · **M41 会话的部署格搬出引擎座表**(7.147.0)—— 引擎座表 `session_meta` 只带引擎的列;本服务记在会话上的十二格(标题 / 置顶 / 换源通告基线 / 位置与项目 / 执行放置七列 / fork 键)
365
366
  * 自本版起住旁表 `session_ext`(一会话一行,外键 `ON DELETE CASCADE` 随会话行走;建表、列定义、补行与级联能力探针的唯一属主 `session-ext-table.ts`,起服在本段之前已建表并证过级联)。
@@ -367,7 +368,7 @@
367
368
  * (`ON DUPLICATE KEY UPDATE` / `ON CONFLICT DO UPDATE`:旁表那一行的这几格 = 根行上的值;中断后重跑同一句同一结果);② 逐行核对(每一列 null 安全相等,旁表行不在 = 缺省)——
368
369
  * 有一行不等 ⇒ 拒启 `config.session_ext_move_refused`(`copy_mismatch`,点名那只会话;一列没删,下一次起服重搬);③ **一句** `ALTER TABLE session_meta DROP COLUMN …` 删掉在场的全部部署格列
369
370
  * (按后置条件收敛:那几列都不在)。旁表形的库(本版新建、或已搬过)⇒ 零动作。**版本围栏(停-迁-起)**:旧副本对这十二格的每一笔写在删列之后都撞未知列,
370
- * 搬与删之间落下的写会丢 ⇒ 还有列要搬 ∧ 有停-迁-起证据(与 M40 同一只读法)⇒ 拒启(`older_replica`,一字节没写;本段第二步,紧随 M40,先于任何别的写)。
371
+ * 搬与删之间落下的写会丢 ⇒ 还有列要搬 ∧ 有停-迁-起证据(与 M40 同一只读法,守卫段里判)⇒ 拒启(`older_replica`,一字节没写);放行 ⇒ ① 的第一句 upsert 之前记起服要求 `(M41, in_force)`。
371
372
  * 如实的边(7.147.0 起已披露,不改):① 搬 → ② 核对 → ③ 删列三步之间一只没被看见的旧副本落下的写会丢 —— 删列让旧写在 ③ 之后响亮失败,却挡不住 ② 与 ③ 之间那一笔。
372
373
  * **M32 × M41 的序与读表**:迁移段里 M32 先、M41 后。M32 读两种形 —— 八列在 `session_meta` 上(7.139–7.146 形:M32 全程写根行,随后 M41 连同别的格一起搬进旁表)
373
374
  * 或部署格已在旁表(本条之后 / 新库)。旁表形里 M32 的加列 / 回填 / 收尾标记(② ④ ④b ⑥)都不跑(切换早已收尾;回填前提的拒随之不判),剩 ⓪(旧版副本建回的空退役表删掉)、围栏,
@@ -376,9 +377,9 @@
376
377
  * · **M42 场景前缀的切换检查**(7.148.0)—— 本版起以 `_scn:` 开头的身份读作「某个人的某个场景」(恢复管线 `owner-brands.ts` 的 `partsOf`);更早的版本不保留这一前缀,
377
378
  * 自称 `_scn:<x>:<y>` 的调用方写下的行在本版会被读成另一个人的场景。**持久数据「响亮拒」那一半,不改写**:库里没有本条的标记 ⇒ 只读扫存量身份(本树建表句里名字以
378
379
  * 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 = 标记在场)。
380
+ * 一字节没写);零命中 ⇒ 记起服要求 `(M42, in_force)`、写标记;有标记 ⇒ 不扫(本版自己写下的合法 `_scn:` 行不让第二次起服拒启)。**停-迁-起(SQL)**:标记不在而有停-迁-起证据(与 M40 / M41 同一只
381
+ * 读法,守卫段里判 —— 先于扫描)⇒ 同码拒启(`older_replica`),标记不写 —— 更早版本的副本不保留前缀,扫描之后它还会收下这类身份(同时有存量命中与证据的库先看到的是 `older_replica`)。标记随库(SQL:本条自己建的标记表一行;local:数据根里一只文件),
382
+ * 不随进程。先于任何写(拒了就是一字节没动)。律、扫描面、拒句的唯一属主 = `scenario-prefix-switch-m42.ts`。读数 `scenarioPrefixSourcesScanned`(0 = 标记在场)。
382
383
  * · **M43 撤回出口的启用标记**(7.148.0)—— 不改任何存量行。提交出口撤回一只「受理之前就被拒」的提交铸下的会话之前,读旁表的客户端写计数 `client_writes`
383
384
  * (四个客户端写者在锁住根行之后同一事务 +1,`plugins/session-ext-table.ts`);更早版本的副本的写者不计数 ⇒ 混跑窗里它刚给这只会话改了标题,撤回却读到 0,会把人写过的会话删掉。
384
385
  * ⇒ 撤回出口只在本库的**标记行**落下之后启用(标记表与 M42 同一张,属主 `one-time-migration-marker.ts`;读者 = 撤回事务里的部署判据 `plugins/session-withdraw-sql.ts`,标记未落 ⇒ 答 `upgrade_pending` = 留,
@@ -386,8 +387,8 @@
386
387
  * 读数 `withdrawMarkWritten`。local 车道:数据根独占、没有混跑窗,版本位在会话元数据格上(`clientWrites`,本版铸的格都带),恒零。
387
388
  * · **M51 会话在删态的切换**(7.148.0)—— 不改任何存量行。本版起删会话按会话三态走(活 → 在删 → 没了,律在 `src/session-deletion.ts`):围栏写旁表 `session_ext.deleting_token`,
388
389
  * 认领点(规则 L)读它、删除路只在围栏判一次认领。更早版本的副本不读在删态 ⇒ 混跑时它会在一只在删的会话上收下提交、建 run,而本版删除路的账本腿已不再判认领 ——
389
- * 比修前更坏。⇒ **停-迁-起**,没有运行期开关:标记表(与 M42 同一张)无 `M51` 行 ∧ 有停-迁-起证据(与 M40 / M41 / M42 同一只读法 {@link readOlderReplicaEvidence})
390
- * ⇒ 拒启 `config.session_deleting_switch_refused`(`older_replica`,一字节不写,拒句给可再起的时刻);没有 ⇒ 落标记(之后不再判)。
390
+ * 比修前更坏。⇒ **停-迁-起**,没有运行期开关:标记表(与 M42 同一张)无 `M51` 行 ∧ 有停-迁-起证据(与 M40 / M41 / M42 同一只读法,守卫段里判)
391
+ * ⇒ 拒启 `config.session_deleting_switch_refused`(`older_replica`,一字节不写,拒句给可再起的时刻);没有 ⇒ 记起服要求 `(M51, in_force)`、落标记(之后不再判)。
391
392
  * 看不见的边与 M43 同:空闲的、早于副本登记的旧副本(零 `running` run)没有证据 —— MIGRATION 写「全部旧副本停下再起」。读数 `sessionDeletingSwitchMarked`(0 或 1)。
392
393
  * local 车道:数据根独占、没有混跑窗 ⇒ 恒零。
393
394
  * · **M44 run 的 `errorCode` 只读列**(7.148.0)—— 码的唯一读法是 `task_run.error_code` 列;写 `result` 的三个写口同写这一列(停驻两口此前不写)。**改写半场**:
@@ -449,11 +450,26 @@
449
450
  * (删 `taskId` 名下的问与批 —— 今天删会话级联的一个子集,语义不丢,`InMemoryApprovalAskStore.deleteByTaskM50`)并算删行记录,构造器末段的起服压实把整本重写成存活行的快照、记录离盘
450
451
  * (压实失败 ⇒ 位留着,下一次写或下一次窗内起服再压;重放幂等),恰一行 stderr 点名条数与账本;窗关之后 ⇒ 同一条记录拒启(`StoreBootRefusalError`,拒因点名本条、
451
452
  * 窗的最后一天与出路:用早于本条的版本起服一次 —— 它认得这只词,起服即压实删行记录),删码因此是零行为变化。没有起服读数键(它不经迁移段跑,读数是那一行 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 车道:数据根独占 ⇒ 守卫没有判活腿,恒不读。
453
+ * · **M53 存量子代失败句换成对外句**(7.151.0)—— 店边界换句(SQL 店的出口只带原码 + 稳定句,`terminal.ts` 的 `storeBoundaryFault`)之前落盘的子代失败句可能逐字带库驱动的原句
454
+ * (库账号 / 内网地址 / 表名)。只改**有结构标记**的两格(判据与新值唯一一份 `store-fault-sentence-m53.ts`,新值 = 出口同一只读法 `outwardStoreMessageOf`):
455
+ * `background_agent.record_json` 的 `error`(`errorCode` 出了本仓词法;`summary` 里逐字含旧句的那一段同换)与 `task_event` 里 `tool_end` 卡的 `structured.errorMessage`
456
+ * (卡 `errorCode` 出了词法)。自由文本面(父转录、卡外的 `output` 报告行、workflow 节点句)没有结构标记 —— 不改,MIGRATION 披露。键集分批读、逐行写(后台行按 `rev` CAS、照本表写律把 `rev` 抬 1 —— 拿着改写之前那一读的写者 CAS 落空、重读,不会把旧句写回;
457
+ * 打空留给下一次起服);幂等:改过的格已是对外句。不是停-迁-起:旧副本写下的新行仍是旧句,窗内每次起服再扫。读数 `storeFaultSentencesRewritten`;local 恒 0(本地数据根上没有 SQL 驱动)。
458
+ *
459
+ * ## 停-迁-起(常设,码不在本文件)
460
+ * 登记行的 `stopThenStart` 一格是声明(围栏类 · 欠不欠 · 有证据时的拒;每一行显式写,`null` = 不声明),律、型、唯一判官、守卫段与证据读法住 `stop-then-start.ts`(常设,不带窗)。
461
+ * 本文件只在 {@link runSqlOneTimeMigrations} 的锁内排守卫段的序(准入复核之后、第一步迁移之前:任一条拒 ⇒ 迁移段一字节没写),各条停-迁-起步在**自己的**第一笔
462
+ * 不兼容写之前记起服要求(`serving-requirement.ts` 的 `recordServingRequirement`)。证据读法没有窗:早于副本登记的副本只经它们持有的 run 心跳可见,而这样的进程在任何日期之后
463
+ * 都可能还在(回滚到早于副本登记的构建、跳过公开序列的嵌入方、登记行过了留存视界的长寿进程)—— 它曾登记为窗行 M52(7.150.0),7.151.0 起改为常设:删掉它,此后引入的
464
+ * 每一条停-迁-起迁移的守卫就零证据、静默放行。M43 的启用判同读它(不拒启,只决定标记落不落)。
465
+ *
466
+ * ## 新迁移的书写序(先满足的赢;登记行注写明前一形为什么不行)
467
+ * ① 不动存量字节:新事实进新表或新列(中央建表语句;`shapeChanges: add`)—— 不要一次性迁移、不要守卫;
468
+ * ② 滚动形(`stopThenStart: null`):迁移函数体里把存量字节改一次,改完之后更早副本还能写出的旧形必须是二者之一 ——(a)写不出(库让它失败);(b)本条在窗内每次起服再改一次,
469
+ * 且其间每个读者对旧形响亮拒。**认旧形与新形的双读只许在迁移函数体里**:新迁移不得在迁移函数体之外读旧形(不写双写窗、不写窗内才生效的读侧行为臂 —— 下面 M19 / M20 / M38 / M44 / M50
470
+ * 等既有窗行的读侧半场照留、随窗删,不作新迁移的先例);按证据推迟启用一项新行为(M43 形)也不是滚动形;
471
+ * ③ 停-迁-起 `structural`(先围后搬:第一笔改动就是围栏 DDL,搬运只从围过的对象读;M34 ① 的就地改名是先例)> `per-write`(写句读起服要求,早至少一版发出)> `accepted`(成文的残余)。
472
+ * 能两版滚动的不许声明停-迁-起。三类的判据与残余见 `stop-then-start.ts`。
457
473
  *
458
474
  * ## 收据账(一次起服一只,每一条迁移同一只)
459
475
  * 每一步把它**已提交**的改写 / 删除与点名读数当场记进同一只收据账({@link MigrationReceipts}):计数随每次提交累加、行随每次提交追加、形读数在那一步落定时写。走完 ⇒
@@ -480,7 +496,8 @@ import { type ImportedLayerRootAllowRetired, type ImportedLayerRootBucketSkipped
480
496
  import { type LocalPlacementBackfillSeat, type UnusableArchiveWord } from "../execution-placement.js";
481
497
  import type { PendingShapeChange } from "./schema-consistency.js";
482
498
  import { type OlderReplicaEvidence } from "./stop-then-start-sentence.js";
483
- import { type ReplicaCapability, type ReplicaRegistration } from "./replica-registration.js";
499
+ import { type ReplicaRegistration } from "./replica-registration.js";
500
+ import { type LiveRunWindowInput, type StopThenStartEntry, type StopThenStartRow } from "./stop-then-start.js";
484
501
  /** 迁移读数(启动日志一行写全;测试按它断言,不靠日志文本)。 */
485
502
  export interface OneTimeMigrationReport {
486
503
  /** M17:`session_policy` 装规则的那一列 —— `renamed` = 本次把 `rules` 改名成 `rule_entries`;`current` = 早已是新名(新库 / 第二跑);
@@ -557,6 +574,9 @@ export interface OneTimeMigrationReport {
557
574
  readonly withdrawMarkWritten: number;
558
575
  /** M51:本次落下会话在删态切换标记的行数(0 或 1;已落 ⇒ 0;别的副本还在心跳 ⇒ 拒启,不进读数)。SQL 独有;local 恒 0(数据根独占,没有混跑窗)。非零 = 真写了标记。 */
559
576
  readonly sessionDeletingSwitchMarked: number;
577
+ /** M53:本次把存量子代失败句换成对外句的格数(SQL `background_agent.record_json` 的 `error` / `summary` 一行算一格 + `task_event` 的 `tool_end` 卡 `errorMessage` 一行算一格)。
578
+ * local 恒 0(本地数据根上没有 SQL 驱动,存量行不可能带驱动原句)。非零 = 真写了存量行。 */
579
+ readonly storeFaultSentencesRewritten: number;
560
580
  /** M44:本次改写了 `errorCode` 码列的 run 行数(SQL `task_run` / local `run.json`;结果投影的码 ≠ 列,或 `running` 行带码)。非零 = 真写了存量行。 */
561
581
  readonly runErrorCodeColumnRewritten: number;
562
582
  /** M45:本次改写了预览列的 run 行数(SQL `task_run` / local `run.json`;以闭集注入块开标签起头的旧形剥到不动点)。非零 = 真写了存量行。 */
@@ -729,22 +749,13 @@ export interface OneTimeMigrationWindow {
729
749
  */
730
750
  readonly shapeChanges?: readonly PendingShapeChange[];
731
751
  /**
732
- * 本条是**停-迁-起**迁移:起服时的守卫在有停-迁-起证据时拒启、一字节不写(动作段的唯一属主 = `stop-then-start-sentence.ts`)。两格见 {@link StopThenStartRow}:
733
- * 缘由句与「这只库还欠不欠本条」的唯一读法 —— 起服列册对账的升级清单(`schema-consistency.ts` 的 `describeUpgradeChecklist`)只列这只库还欠的行、把缘由句原样列给运维,
734
- * 于是「本构建有哪几条要先停光旧副本」只有这一处在写、随行删码一起没。读者 = {@link stopThenStartMigrations}。
752
+ * 本条是不是**停-迁-起**迁移 —— **每一行显式写**(缺键 = tsc 红;形门 `test/one-time-migration-window-gate.test.ts` 再核一次「每行自有这一键」)。
753
+ * 一份声明({@link StopThenStartRow}:缘由句 · 这只库还欠不欠 · 有证据时本条的拒 · 围栏类)⇒ 起服时守卫段在任何写之前判证据(有 ⇒ 拒启、一字节不写),
754
+ * 本条放行之后在自己的第一笔不兼容写之前记一行起服要求;起服列册对账的升级清单只列这只库还欠的行、把缘由句原样列给运维。律、型与唯一判官在 `stop-then-start.ts`。
755
+ * `null` = 本条**不声明**停-迁-起(不拒启、不进清单的停-迁-起一步)—— 只是声明,不是混跑安全的证明;新迁移写 `null` 只许两形:改完之后更早副本写不出旧形
756
+ * (库让它失败),或本条在窗内每次起服再改一次、其间每个读者对旧形响亮拒(头注「新迁移的书写序」一节)。读者 = {@link stopThenStartMigrations}。
735
757
  */
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>;
758
+ readonly stopThenStart: StopThenStartRow | null;
748
759
  }
749
760
  /**
750
761
  * 🔴 [ref] —— 一次性迁移登记表,本文件各条的窗的**唯一属主**。别处(接口 JSDoc、调用点、DDL 注、部署文档)只写「窗口见
@@ -770,12 +781,11 @@ export declare function migrationWindowEnd(id: string): string;
770
781
  */
771
782
  export declare function migrationCarried(id: string): boolean;
772
783
  /**
773
- * 本构建带的**停-迁-起**迁移(登记行的 `stopThenStart` 一格;行在 ⇔ 码在 ⇒ 起服会在这一条上判活),按登记表顺序。读者 = 起服列册对账的升级清单:
774
- * 逐行问 `owedOn`,只把这只库还欠的列给运维。登记表里再没有这样的行时返回空数组 —— 清单的这一步随之不出。
784
+ * 本构建带的**停-迁-起**迁移(登记行的 `stopThenStart` 不是 `null`;行在 ⇔ 码在 ⇒ 起服会在这一条上判证据),按登记表顺序,连同判官要读的 `introducedIn` / `shapeChanges`。
785
+ * 读者 = 守卫段(`stop-then-start.ts` 的 `guardOwedStopThenStart`,{@link runSqlOneTimeMigrations} 的锁内)与起服列册对账的升级清单(逐行问 `owedOn`,只把这只库还欠的列给运维)。
786
+ * 登记表里再没有这样的行时返回空数组 —— 守卫段的循环为空、清单的这一步随之不出。
775
787
  */
776
- export declare function stopThenStartMigrations(registry?: readonly Pick<OneTimeMigrationWindow, "id" | "stopThenStart">[]): readonly ({
777
- readonly id: string;
778
- } & StopThenStartRow)[];
788
+ export declare function stopThenStartMigrations(registry?: readonly Pick<OneTimeMigrationWindow, "id" | "introducedIn" | "shapeChanges" | "stopThenStart">[]): readonly StopThenStartEntry[];
779
789
  /** local 车道上 SQL 独有的几条(M17 / M18 / M21 / M23 / M24 / M26 / M27 / M29)的读数(M32 的回填两车道都有、M33 只在 local,local 腿的读数由 `LocalBackend.runOneTimeMigrations` 现算):那几张表 / 列在文件底座上从来不存在 ⇒ 如实答 absent / 0。 */
780
790
  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
791
  /** 启动期的日志口(logger 的子集)。两级各有其用,见 {@link logOneTimeMigrations}。 */
@@ -816,8 +826,10 @@ export interface MigrationDb {
816
826
  */
817
827
  export declare function createSqlImportedLayerRootSource(exec: Parameters<typeof listRuleBucketOwners>[0]): ImportedLayerRootRetirementSource;
818
828
  /**
829
+ * 取连接之前:本构建的停-迁-起声明过唯一判官(`stop-then-start.ts` 的 `assertStopThenStartDeclarations`;自相矛盾 = 构建缺陷 ⇒ 抛,一句库语句都没发)。
819
830
  * **段头**(常设两步,不带窗;只在这里排序;与迁移步同一条连接):两张表在(不在 ⇒ 拒,点名公开序列)→ 本进程登记(`replica-registration.ts`)→ 起服准入**锁外预读**(`serving-requirement.ts`)
820
- * → 取迁移锁 → **锁内复核**(同一判据;本进程等锁期间握锁的那一只写下的要求在这里读得到)→ 各迁移步。准入拒 ⇒ 一步迁移都不跑。
831
+ * → 取迁移锁 → **锁内复核**(同一判据;本进程等锁期间握锁的那一只写下的要求在这里读得到)→ **守卫段**(`stop-then-start.ts`:本构建全部还欠的停-迁-起迁移先一起判证据,
832
+ * 任一有 ⇒ 抛那一条自己的拒,迁移段一字节没写)→ 各迁移步(各停-迁-起步在自己的第一笔不兼容写之前记起服要求)。准入拒 / 守卫拒 ⇒ 一步迁移都不跑。
821
833
  * 登记在任何守卫读证据之前、本进程能持有任何 run 之前落下;跳过 `ensureSchema()` 的嵌入方走同一段。`me` 缺省 = 本进程的登记行;真库钉传别的构建(能力名单不同的起服者)。
822
834
  */
823
835
  export declare function runSqlOneTimeMigrations(dialect: SqlDialect, pool: MysqlPool | PgPool, input: SqlOneTimeMigrationInput, me?: ReplicaRegistration): Promise<OneTimeMigrationReport>;
@@ -857,12 +869,12 @@ export declare function scannedIdentityColumnsM42(db: Pick<MigrationDb, "rows">,
857
869
  }[]>;
858
870
  /**
859
871
  * 🔴 M42 的 SQL 腿:标记在场 ⇒ 返回(零扫描);否则逐列只读计数 `LIKE '<前缀>%'`,一处命中 ⇒ {@link ScenarioPrefixSwitchRefusedError}(`stored_prefix`;一字节没写,标记不写);
860
- * 零命中而有停-迁-起证据({@link readOlderReplicaEvidence})⇒ 同一只拒(`older_replica`;标记不写);否则写标记。
872
+ * 零命中 ⇒ 记起服要求 `(M42, in_force)`、再写标记(停-迁-起证据已在守卫段里判过:有证据的库在扫描之前就以 `older_replica` 拒了)。
861
873
  * 握着迁移段的那一把锁、在那一条连接上:两只副本同时起服时第二只读到第一只写下的标记(写标记用 `INSERT IGNORE` / `ON CONFLICT DO NOTHING`,收敛)。
862
874
  */
863
875
  export declare function switchScenarioPrefixM42(db: MigrationDb, dialect: SqlDialect, receipts: {
864
876
  scenarioPrefixSourcesScanned: number;
865
- }, input: LiveRunWindowInput): Promise<void>;
877
+ }): Promise<void>;
866
878
  /** M40 的拒启码(停-迁-起守卫)。 */
867
879
  export declare const EXECUTION_LANE_RENAME_REFUSED_CODE = "config.execution_lane_rename_refused";
868
880
  /**
@@ -900,33 +912,20 @@ export declare class ExecutionLaneRenameWriteRefusedError extends StoreBootRefus
900
912
  /** 落不了盘的那只文件(绝对路径)。 */
901
913
  file: string, cause: unknown);
902
914
  }
903
- /** 停-迁-起证据读法心跳一半的输入(归 M52 行):判活窗(毫秒)= 本部署的 `REAP_RUN_STALE_SEC` —— 收割器判「这条 run 的持有者还活着」用的同一个窗。 */
904
- export interface LiveRunWindowInput {
905
- readonly liveRunWindowMs: number;
906
- }
907
915
  /** M48 的输入:本部署有没有身份边界 = 部署形表 `DEPLOYMENT_SHAPE_PREDICATES.identityBoundary` 那一行的读数(只读配置;调用方读表交来,迁移步不另读配置)。
908
916
  * SQL 腿 `clearShellSentinelOwnersM48` 读它;local 腿(`LocalBackend.runOneTimeMigrations` 里 M48 那一格)读同一行,由后端构造时读一次;dev-open 判据(`devOpenDeployment`)读同一行。 */
909
917
  export interface ShellSentinelOwnerInput {
910
918
  readonly identityBoundary: boolean;
911
919
  }
912
- /** SQL 一次性迁移段的输入(各条目自己的那一半;删码车删掉它那一半)。 */
920
+ /** SQL 一次性迁移段的输入(各条目自己的那一半;删码车删掉它那一半。判活窗那一半 `LiveRunWindowInput` 归常设的守卫段 / 证据读法,`stop-then-start.ts`)。 */
913
921
  export type SqlOneTimeMigrationInput = ExecutionPlacementSwitchInput & LiveRunWindowInput & ShellSentinelOwnerInput;
914
922
  /**
915
923
  * M40 ⓪ —— 带 `execution_lane` 列的表上的旧词改成新名(问行表 + 会话的那一列所在的表:M41 搬之前在 `session_meta`、之后在 `session_ext`;一句 UPDATE 一张表;幂等:第二跑零命中)。列不在的表零动作(跳版升上来的库:M32 稍后加列、按声明车道回填,不会再铸旧词)。
916
- * 还有旧词行 ⇒ 先过停-迁-起守卫({@link refuseWhileRunsHeartbeat});没有 ⇒ 不读 run 表、零写(没跑过无车道部署的库可滚动升级)。
924
+ * 还有旧词行 ⇒(守卫段已判过证据、放行)记起服要求 `(M40, in_force)`、再改名;没有 ⇒ 零写(没跑过无车道部署的库可滚动升级)。
917
925
  */
918
926
  export declare function renameRetiredExecutionLaneWordsM40(db: MigrationDb, dialect: SqlDialect, receipts: {
919
927
  executionLaneWordsRenamed: number;
920
- }, input: LiveRunWindowInput): Promise<void>;
921
- /**
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`):一条迁移读证据 ⇔ 它的名在名单里。
928
- */
929
- export declare function readOlderReplicaEvidence(db: MigrationDb, dialect: SqlDialect, input: LiveRunWindowInput, migrationId: ReplicaCapability): Promise<OlderReplicaEvidence | undefined>;
928
+ }): Promise<void>;
930
929
  /** M41 的拒启码(确定的拒启表态;与 `config.schema_mismatch` 同一族)。 */
931
930
  export declare const SESSION_EXT_MOVE_REFUSED_CODE = "config.session_ext_move_refused";
932
931
  /** 拒因闭集:`older_replica` = 还有列要搬而有停-迁-起证据;`copy_mismatch` = 搬完核对有一行不等(一列没删)。 */
@@ -937,11 +936,6 @@ export declare class SessionExtMoveRefusedError extends StoreBootRefusalError {
937
936
  readonly code = "config.session_ext_move_refused";
938
937
  constructor(reason: SessionExtMoveRefusalReason, detail: string);
939
938
  }
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
939
  /**
946
940
  * M41(规则与理由见头注 M41 段):① 搬(键集分页 upsert)→ ② 逐行核对 → ③ 一句删列。旁表形 ⇒ 零动作。中断 ⇒ 下一次起服从头重跑:① 的 upsert 是「旁表这几格 = 根行上的值」,
947
941
  * 重跑同一结果;② 只读;③ 按后置条件收敛(那几列都不在)。排在迁移段最后(M32 之后:M32 读 / 写 `session_meta` 上的八列;M23 改的是引擎列)。导出给真库钉驱动「中断后续跑」。