@sema-agent/server 7.144.0 → 7.146.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.
- package/MIGRATION.md +621 -0
- package/README.md +3 -0
- package/README.zh-CN.md +1 -0
- package/USAGE.md +233 -54
- package/deploy/facts/CHANGES.json +25 -0
- package/deploy/facts/README.md +57 -0
- package/deploy/facts/lanes.json +54 -0
- package/deploy/facts/lanes.schema.json +57 -0
- package/deploy/facts/sandbox-rbac.json +113 -0
- package/deploy/facts/sandbox-rbac.schema.json +74 -0
- package/deploy/facts/sealed-key.json +9 -0
- package/deploy/facts/sealed-key.schema.json +52 -0
- package/deploy/sema-up/chart/templates/_helpers.tpl +19 -0
- package/deploy/sema-up/chart/templates/sandbox-rbac.yaml +47 -7
- package/deploy/sema-up/chart/templates/server-v4pro.yaml +4 -0
- package/deploy/sema-up/chart/templates/server.yaml +4 -0
- package/deploy/sema-up/chart/values.yaml +7 -0
- package/deploy/sema-up/stack/sema-stack-cluster.yaml +30 -14
- package/dist/adoption/import-limits.d.ts +6 -0
- package/dist/adoption/import-limits.js +7 -0
- package/dist/adoption/import.d.ts +62 -0
- package/dist/adoption/import.js +107 -0
- package/dist/adoption/wire.d.ts +52 -0
- package/dist/adoption/wire.js +9 -0
- package/dist/approval-ask-machine.d.ts +2 -2
- package/dist/approval-card.d.ts +3 -12
- package/dist/approval-card.js +0 -4
- package/dist/approval-gate-currency.d.ts +1 -1
- package/dist/approval-gate-currency.js +1 -1
- package/dist/approval-reconciler.d.ts +1 -1
- package/dist/audit.d.ts +2 -21
- package/dist/audit.js +0 -9
- package/dist/boot/deployment-mods.d.ts +11 -1
- package/dist/boot/deployment-mods.js +15 -2
- package/dist/boot/device-lane.js +2 -0
- package/dist/boot/engine-lease.d.ts +193 -21
- package/dist/boot/engine-lease.js +146 -20
- package/dist/boot/execution-env.d.ts +4 -0
- package/dist/boot/execution-env.js +12 -0
- package/dist/boot/exit-boundary.d.ts +50 -0
- package/dist/boot/exit-boundary.js +32 -0
- package/dist/boot/exit-last.d.ts +20 -4
- package/dist/boot/exit-last.js +21 -4
- package/dist/boot/governance-seams.js +1 -0
- package/dist/boot/memory-consolidation.d.ts +29 -17
- package/dist/boot/memory-consolidation.js +26 -15
- package/dist/boot/reapers.d.ts +12 -4
- package/dist/boot/reapers.js +39 -15
- package/dist/boot/resolve-spec.d.ts +2 -0
- package/dist/boot/resolve-spec.js +38 -15
- package/dist/boot/runner-deps.js +1 -1
- package/dist/boot/session-faces.d.ts +1 -1
- package/dist/boot/session-faces.js +6 -4
- package/dist/boot/shutdown.js +27 -9
- package/dist/boot/stage-01-config.js +1 -1
- package/dist/boot/stage-03-store-backend.d.ts +1 -0
- package/dist/boot/stage-03-store-backend.js +2 -2
- package/dist/boot/stage-04-stores.d.ts +1 -0
- package/dist/boot/stage-05-execution-env.d.ts +3 -0
- package/dist/boot/stage-05-execution-env.js +3 -3
- package/dist/boot/stage-06-runners.d.ts +3 -0
- package/dist/boot/stage-06-runners.js +11 -10
- package/dist/boot/stage-07-capability-layer.d.ts +3 -0
- package/dist/boot/stage-07-capability-layer.js +7 -2
- package/dist/boot/stage-08-reapers.d.ts +3 -0
- package/dist/boot/stage-08-reapers.js +3 -3
- package/dist/boot/stage-09-leader.d.ts +4 -1
- package/dist/boot/stage-10-http-server.d.ts +4 -1
- package/dist/boot/stage-10-http-server.js +4 -3
- package/dist/boot/stores.d.ts +1 -0
- package/dist/boot/stores.js +35 -19
- package/dist/boot/workflow-orchestration.d.ts +1 -1
- package/dist/boot/workflow-orchestration.js +2 -1
- package/dist/capabilities/composite-members.d.ts +3 -1
- package/dist/capabilities/composite-members.js +3 -1
- package/dist/capabilities/scenarios.d.ts +2 -2
- package/dist/capability-facts.d.ts +18 -1
- package/dist/capability-facts.js +25 -7
- package/dist/checkpoint-ctx-seal-m28.d.ts +1 -1
- package/dist/config-catalog.js +13 -4
- package/dist/config-d-migration.d.ts +3 -2
- package/dist/config-provider.d.ts +2 -2
- package/dist/config-types.d.ts +43 -4
- package/dist/config.d.ts +6 -1
- package/dist/config.js +67 -11
- package/dist/deleted-session-ids.d.ts +19 -0
- package/dist/deleted-session-ids.js +26 -0
- package/dist/deploy-facts.d.ts +155 -0
- package/dist/deploy-facts.js +94 -0
- package/dist/device-ws-hub.d.ts +48 -3
- package/dist/device-ws-hub.js +48 -2
- package/dist/error-code-family.d.ts +35 -0
- package/dist/error-code-family.js +26 -0
- package/dist/fleet/drain-entry.d.ts +39 -3
- package/dist/fleet/drain-entry.js +6 -0
- package/dist/fleet/fleet-bus.d.ts +15 -4
- package/dist/fleet/fleet-bus.js +17 -3
- package/dist/hooks/branch-transcript.d.ts +1 -1
- package/dist/hooks/branch-transcript.js +1 -0
- package/dist/hooks/classic-stations.d.ts +25 -8
- package/dist/hooks/classic-stations.js +29 -3
- package/dist/hooks/hook-runner.d.ts +33 -16
- package/dist/hooks/hook-runner.js +166 -73
- package/dist/hooks/hook-source.d.ts +14 -2
- package/dist/hooks/hook-source.js +8 -0
- package/dist/http/active-run-conflict.d.ts +1 -1
- package/dist/http/active-run-conflict.js +1 -1
- package/dist/http/admission.js +13 -2
- package/dist/http/checkpoint-ctx.d.ts +60 -71
- package/dist/http/checkpoint-ctx.js +35 -40
- package/dist/http/dispatch.js +18 -2
- package/dist/http/durable-run-leg.d.ts +5 -0
- package/dist/http/durable-run-leg.js +8 -6
- package/dist/http/execution-context.d.ts +4 -0
- package/dist/http/execution-context.js +9 -0
- package/dist/http/health-self-report.d.ts +6 -2
- package/dist/http/health-self-report.js +3 -2
- package/dist/http/memory-compliance-failure-reply.d.ts +1 -1
- package/dist/http/memory-compliance-failure-reply.js +2 -15
- package/dist/http/memory-control-plane-corrupt-reply.d.ts +25 -0
- package/dist/http/memory-control-plane-corrupt-reply.js +19 -0
- package/dist/http/principal-gate.d.ts +35 -12
- package/dist/http/principal-gate.js +16 -12
- package/dist/http/request-guards.d.ts +1 -1
- package/dist/http/request-guards.js +5 -5
- package/dist/http/resume-legs.d.ts +22 -0
- package/dist/http/resume-legs.js +31 -20
- package/dist/http/route-ctx.d.ts +26 -10
- package/dist/http/route-table.js +2 -0
- package/dist/http/routes/adoption.d.ts +11 -0
- package/dist/http/routes/adoption.js +80 -6
- package/dist/http/routes/agents-roster.js +1 -0
- package/dist/http/routes/approvals-assistant.d.ts +20 -1
- package/dist/http/routes/approvals-assistant.js +29 -7
- package/dist/http/routes/background.js +1 -0
- package/dist/http/routes/capabilities.js +4 -1
- package/dist/http/routes/diagnostics.d.ts +9 -14
- package/dist/http/routes/diagnostics.js +10 -20
- package/dist/http/routes/engine.d.ts +31 -0
- package/dist/http/routes/engine.js +81 -0
- package/dist/http/routes/memory-bundle.js +3 -0
- package/dist/http/routes/memory-consolidation.js +3 -5
- package/dist/http/routes/memory-origin.d.ts +1 -1
- package/dist/http/routes/memory-origin.js +2 -4
- package/dist/http/routes/memory-policy.js +5 -1
- package/dist/http/routes/observability.js +3 -6
- package/dist/http/routes/rules.d.ts +1 -1
- package/dist/http/routes/rules.js +5 -2
- package/dist/http/routes/runs.js +7 -3
- package/dist/http/routes/session-sync.js +24 -25
- package/dist/http/routes/sessions-list.d.ts +1 -1
- package/dist/http/routes/sessions.js +4 -0
- package/dist/http/routes/tasks.js +35 -14
- package/dist/http/routes/trace-usage.js +1 -1
- package/dist/http/run-concurrency-cap.d.ts +86 -0
- package/dist/http/run-concurrency-cap.js +54 -0
- package/dist/http/run-meta.d.ts +14 -7
- package/dist/http/run-meta.js +5 -2
- package/dist/http/server.d.ts +27 -16
- package/dist/http/server.js +21 -3
- package/dist/http/stored-body-replay.d.ts +9 -6
- package/dist/http/stored-body-replay.js +19 -5
- package/dist/http/submit-ctx.d.ts +12 -0
- package/dist/http/submit-ctx.js +23 -0
- package/dist/http/wire-types.d.ts +8 -3
- package/dist/json-body-limit.d.ts +8 -0
- package/dist/json-body-limit.js +2 -0
- package/dist/leader/diffout.d.ts +1 -1
- package/dist/local-data-root.d.ts +2 -2
- package/dist/memory-operator-faces.d.ts +9 -4
- package/dist/memory-scope-stores.d.ts +9 -7
- package/dist/memory-scope-stores.js +3 -14
- package/dist/memory-scope.d.ts +36 -0
- package/dist/memory-scope.js +32 -1
- package/dist/net-address.d.ts +53 -0
- package/dist/net-address.js +111 -0
- package/dist/observability/fail-open.d.ts +28 -12
- package/dist/observability/fail-open.js +28 -12
- package/dist/orchestration/workflow-notify-journal.js +2 -3
- package/dist/org-delivery-gate.js +1 -1
- package/dist/peer-directory.d.ts +6 -12
- package/dist/peer-directory.js +5 -1
- package/dist/plugins/approval-ask-store-file.d.ts +16 -2
- package/dist/plugins/approval-ask-store-file.js +21 -1
- package/dist/plugins/approval-ask-store-memory.d.ts +8 -2
- package/dist/plugins/approval-ask-store-memory.js +11 -8
- package/dist/plugins/caching-session-store.d.ts +6 -1
- package/dist/plugins/caching-session-store.js +6 -0
- package/dist/plugins/checkpoint-store-face.d.ts +426 -0
- package/dist/plugins/checkpoint-store-face.js +152 -0
- package/dist/plugins/file-run-store.d.ts +13 -7
- package/dist/plugins/file-run-store.js +12 -13
- package/dist/plugins/fork-routing-session-store.d.ts +6 -2
- package/dist/plugins/fork-routing-session-store.js +2 -2
- package/dist/plugins/imported-layer-root-retirement.d.ts +10 -8
- package/dist/plugins/local-checkpoint-store.d.ts +16 -5
- package/dist/plugins/local-checkpoint-store.js +25 -6
- package/dist/plugins/local-session-store.d.ts +80 -21
- package/dist/plugins/local-session-store.js +79 -22
- package/dist/plugins/memory-engine-pg.d.ts +29 -6
- package/dist/plugins/memory-engine-pg.js +96 -214
- package/dist/plugins/memory-engine-sql-apply.d.ts +121 -0
- package/dist/plugins/memory-engine-sql-apply.js +358 -0
- package/dist/plugins/memory-engine-tidb.d.ts +35 -9
- package/dist/plugins/memory-engine-tidb.js +97 -227
- package/dist/plugins/memory-key-guards.d.ts +1 -1
- package/dist/plugins/memory-origin-law.d.ts +3 -3
- package/dist/plugins/memory-run-store.d.ts +2 -0
- package/dist/plugins/memory-run-store.js +6 -0
- package/dist/plugins/one-time-migrations.d.ts +32 -56
- package/dist/plugins/one-time-migrations.js +27 -119
- package/dist/plugins/permission-rule-store-file.d.ts +17 -3
- package/dist/plugins/permission-rule-store-file.js +8 -1
- package/dist/plugins/pg-pool.js +1 -1
- package/dist/plugins/pg-session-storage.d.ts +17 -4
- package/dist/plugins/pg-session-storage.js +8 -4
- package/dist/plugins/run-store-sql.d.ts +4 -0
- package/dist/plugins/run-store-sql.js +5 -2
- package/dist/plugins/schema-ensure-legs.js +2 -2
- package/dist/plugins/session-fork.d.ts +31 -9
- package/dist/plugins/session-fork.js +3 -2
- package/dist/plugins/session-placement.d.ts +4 -2
- package/dist/plugins/session-store.d.ts +1 -1
- package/dist/plugins/sql-json-column.d.ts +5 -1
- package/dist/plugins/store-backend.d.ts +11 -8
- package/dist/plugins/store-backend.js +8 -7
- package/dist/plugins/store-contracts.d.ts +1 -11
- package/dist/plugins/store-contracts.js +0 -9
- package/dist/plugins/store-sweep.d.ts +63 -0
- package/dist/plugins/store-sweep.js +48 -0
- package/dist/plugins/tidb-pool.js +1 -1
- package/dist/plugins/tidb-session-store.d.ts +16 -3
- package/dist/plugins/tidb-session-store.js +8 -4
- package/dist/prompt-screen.d.ts +18 -0
- package/dist/prompt-screen.js +5 -0
- package/dist/rules-consent.d.ts +56 -51
- package/dist/rules-consent.js +86 -14
- package/dist/run-acceptance.d.ts +40 -10
- package/dist/run-acceptance.js +38 -5
- package/dist/run-cancel-context.d.ts +4 -1
- package/dist/run-cancel-context.js +2 -1
- package/dist/runs.js +2 -2
- package/dist/sandbox-egress-policy.js +6 -11
- package/dist/sandbox-rbac-rules.d.ts +88 -0
- package/dist/sandbox-rbac-rules.js +80 -0
- package/dist/sealed-key-layout.d.ts +17 -0
- package/dist/sealed-key-layout.js +4 -0
- package/dist/sealed-key.js +5 -5
- package/dist/security.d.ts +48 -9
- package/dist/security.js +9 -2
- package/dist/session-agent.d.ts +39 -0
- package/dist/session-agent.js +16 -0
- package/dist/session-error-wire.d.ts +4 -4
- package/dist/session-notify-door.d.ts +5 -3
- package/dist/session-resident-background.d.ts +57 -0
- package/dist/session-resident-background.js +20 -0
- package/dist/session-sync-kernel.d.ts +53 -14
- package/dist/session-sync-kernel.js +70 -1
- package/dist/session-sync.d.ts +5 -3
- package/dist/session-workspace.d.ts +1 -0
- package/dist/session-workspace.js +1 -0
- package/dist/sighup-idle.d.ts +9 -7
- package/dist/sighup-idle.js +4 -5
- package/dist/spec-fields.d.ts +16 -0
- package/dist/spec-fields.js +7 -0
- package/dist/stored-request-env-credentials-m38.d.ts +3 -0
- package/dist/stored-request-env-credentials-m38.js +8 -0
- package/dist/stored-request-prompt-profile-m30.d.ts +1 -1
- package/dist/{plugins → stores-sql}/checkpoint-store-sql.d.ts +33 -429
- package/dist/{plugins → stores-sql}/checkpoint-store-sql.js +70 -209
- package/dist/{plugins → stores-sql}/mailbox-store-sql.d.ts +2 -2
- package/dist/{plugins → stores-sql}/mailbox-store-sql.js +4 -4
- package/dist/{plugins → stores-sql}/roster-store-sql.d.ts +2 -2
- package/dist/{plugins → stores-sql}/roster-store-sql.js +1 -1
- package/dist/{plugins → stores-sql}/tool-result-store-sql.d.ts +2 -2
- package/dist/{plugins → stores-sql}/tool-result-store-sql.js +6 -6
- package/dist/{plugins → stores-sql}/workflow-journal-store-sql.d.ts +7 -12
- package/dist/{plugins → stores-sql}/workflow-journal-store-sql.js +3 -8
- package/dist/task-settings.d.ts +59 -4
- package/dist/task-settings.js +50 -4
- package/dist/tool-approval.d.ts +2 -2
- package/dist/trace/core-keyset-guard.d.ts +8 -7
- package/dist/trace/engine-notice-wire.d.ts +1 -1
- package/dist/trace/engine-notice-wire.js +2 -0
- package/dist/trace/exit-seat.d.ts +6 -0
- package/dist/trace/exit-seat.js +1 -0
- package/dist/trace/model-segment.d.ts +3 -2
- package/dist/trace/model-segment.js +16 -8
- package/dist/trace/project.js +9 -0
- package/dist/trace/redact.d.ts +79 -4
- package/dist/trace/redact.js +523 -123
- package/dist/trace/self-minted-wire.d.ts +391 -1
- package/dist/trace/self-minted-wire.js +145 -0
- package/dist/trace/wire-projection-faces.d.ts +1 -1
- package/dist/trace/wire-projection-faces.js +1 -1
- package/dist/usage-analytics.d.ts +4 -0
- package/package.json +12 -4
- package/scripts/drain-check-local.mjs +8 -29
- package/scripts/drain-check.mysql.sql +3 -24
- package/scripts/drain-check.pg.sql +3 -24
- package/skills/update-config.md +1 -1
- package/wire-changes/server@7.145.0.json +146 -0
- package/wire-changes/server@7.146.0.json +3221 -0
- package/dist/approval-batch-census.d.ts +0 -27
- package/dist/approval-batch-census.js +0 -27
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
* ⇒ 换成本段:**升一次级把存量字节改完,兼容臂当场删干净**。代价是每一条在它的窗内每次启动都要跑一遍(第二次起全是
|
|
25
25
|
* 零命中的空转);收益是窗关之后可以把那一条连同它的 SQL 一起删,而读腿从引入那一版起就只有**一种**读法。
|
|
26
26
|
*
|
|
27
|
-
* ## 已退役的 M1–
|
|
27
|
+
* ## 已退役的 M1–M8 与 M14
|
|
28
28
|
* 退役的整树快照索引表(M1)、退役的单座 steering 列(M2)、被上游改了名的闭集词 `unresolvable` → `ancestor_marked`(M3)三条的改写、计数与读数
|
|
29
29
|
* 窗关后已全部删码,登记行一并删。跳过了它们直接升的库由起服对账一族的拒启臂接住(`schema-consistency.ts` 头注「第二道对账」一节:两件退役 schema
|
|
30
30
|
* 任一在场 ⇒ 拒启、点名出路;先于一切建表)—— 那一道没有窗,所以不在本文件里。本段入口({@link runSqlOneTimeMigrations})不问这一问。
|
|
@@ -36,27 +36,18 @@
|
|
|
36
36
|
* 出路是运维给那些行各填一只互不相同的随机令牌,或删会话(MIGRATION 写了升级序)。
|
|
37
37
|
* LKG 的 formatVersion 1 迁移(M14:7.98.0 及以前写在默认路径的旧缓存文件迁进身份箱;非店迁移,不写库)同样已删码(本版提前于窗关删),登记行一并删;它没有自己的拒启臂 —— 那是缓存文件、不是数据:
|
|
38
38
|
* `CONFIG_LKG_PATH` 指到旧文件 ⇒ `loadLkg` 的 1 臂答 `config_lkg_unusable`(env 兜底),默认路径上的旧文件名不是身份箱的文件名形、不再被读,中心可达时第一份干净候选照常写出身份箱。
|
|
39
|
+
* M6 / M7 / M8 同样已删码(本版删;三条的窗 2026-11-04 … 2026-11-05 关,发版日前都已关),登记行一并删。逐条写跳过了它直接升的库(以及滚动升级窗里旧副本新写的旧形行)由谁接住:
|
|
40
|
+
* ① run 死亡判决码回填(M6;连同 SQL 行映射里的读侧半场):没有响亮臂 —— 只有句子、码列为空的 `failed` 行(只有 ≤7.115.x 的写者铸得出;7.116.0 起的写者恒同写码)不再被判成持有者死亡:
|
|
41
|
+
* 用户输入受理账本的收敛判词(`user-input-ledger.ts` `judgeOpen`)把它落到「其余」臂 `leg_over`(补落 `settled{leg_end}`、不告知),那条 run 上丢掉的 steer 不再告诉用户;`GET /v1/runs/:id` 上 `errorCode` 缺席、只剩 `error` 句子。
|
|
42
|
+
* ② 停驻行 allow 读法记号的拒臂(M7):不写库,删的是 allow 读法记号的写点与「按记号判」的读法;拒臂留为按写者版本的**永久门**(`http/checkpoint-ctx.ts` 顶注「allow 读法问」)——
|
|
43
|
+
* 体里带非空 allow、而行的写者版本证不出 ≥ 7.117.0(缺席 / 读不出 / 更早)⇒ 续跑重放拒 409 `checkpoint.unsupported_version`(响亮,出路 = 取消后作为新任务重提)。
|
|
44
|
+
* 这一门不随窗走:日历窗关不证明旧行不在。已存行上的记号键原样留着、无人读;7.117.0–7.123.x 写下、带非空 allow 的行(有记号、没有写者版本)同样拒 —— 证据只认写者版本一个源。
|
|
45
|
+
* 反向的一格(如实登记):本版写下的行不再带这只记号,滚动升级 / 回滚窗里仍跑 7.145.x 及以前的副本读到**任何**体里带非空 allow 的本版行(提交体从壳透传的
|
|
46
|
+
* CC settings 常带它)时照它自己的一问判,由那一版答 409 `checkpoint.unsupported_version`(带写者 / 读者两版本键;响亮,出路 = 由本版副本续跑)。
|
|
47
|
+
* ③ 停驻行披露位换名(M8):没有响亮臂 —— 仍带旧键 `shadowedRule` 的停驻行在运维待批队列上只缺结构化披露 `allowRuleShadowed`;旧键的文本仍经脱敏叶表「认不得的键按内容脱敏」一条
|
|
48
|
+
* 脱敏后原样显示(`observability/run-terminal.ts` `redactRiskDescriptor`),卡上 `message` 里引擎写好的那句话不受影响。
|
|
39
49
|
*
|
|
40
50
|
* ## 窗内的迁移(逐条的失败方向刻意不同)
|
|
41
|
-
* · **M6 run 死亡判决码** —— 7.116.0 起 run 店的两只死亡判决(失联收割 / 重启孤儿回收)在行上同写机读码(`error_code` =
|
|
42
|
-
* `run.stalled` / `run.orphaned`,词表属主 `store-contracts.ts` 的 `RUN_HOLDER_DEATH_CODES`),读者(`isHolderDeathVerdict`)只认码。
|
|
43
|
-
* 存量行只有句子、码列空 ⇒ **写回半场**:起服把「`failed` ∧ 码列空 ∧ 句子是那两句(接管臂的括注形按前缀认)」的行补上码
|
|
44
|
-
* (SQL 两条 `UPDATE`;local 腿 = `FileRunStore.migrateLegacyHolderDeathCodes`)。**读侧半场**:滚动升级窗里 ≤7.115.x 的副本还会写只有句子的行
|
|
45
|
-
* (起服写回覆盖不到窗内新写的行)⇒ SQL 两孪生的行映射经 `readLegacyHolderDeathCode` 把这种行读成码 —— 它是本条的一半,窗关随本条一起删
|
|
46
|
-
* (见登记表 M6 的 `removal`)。local 车道没有滚动窗(数据根独占:窗内不会有旧写者与本进程并存),读侧半场不在 File 店上。
|
|
47
|
-
*
|
|
48
|
-
* · **M7 停驻行 allow 读法记号的拒臂**(7.117.0,core 7.42.0)—— 不是改写,是**持久数据「响亮拒」那一半**:续跑重放体里带非空
|
|
49
|
-
* `settings.permissions.allow`、而 ctx 上的读法记号不是当前的 `"allow_layer"`(名单时代无记号 / 表态时代 `"statement"`)⇒ 认领之前 409、行字节不动。
|
|
50
|
-
* 规则、两句拒句与写点在 `http/checkpoint-ctx.ts`;本条只登记它的窗(7.115.0 引入的同一只拒臂当时没有登记,7.117.0 起它覆盖两代旧词,登记在这里)。
|
|
51
|
-
* 没有读数键(它不写库)。
|
|
52
|
-
* · **M8 停驻行披露位换名**(7.117.0,core 7.42.0 [ref])—— `checkpoint.risk_descriptor` 里 7.41.x 引擎写下的 `shadowedRule`(字符串:命中却清不掉的
|
|
53
|
-
* 持久 allow 规则原文)在 7.42.0 引擎里换成 `allowRuleShadowed: { member, entries, omitted? }[]`,旧键不再有人读。旧键只由规则店成员铸
|
|
54
|
-
* (core 7.41.2 `gate-lanes.ts` 的披露臂是它唯一的铸点;本仓的策略从不自铸它)⇒ **一次性改写**:`{ ..., shadowedRule: v }` →
|
|
55
|
-
* `{ ..., allowRuleShadowed: [{ member: "persisted", entries: [v] }] }`(旧值是引擎拼好的「最多五条 + and N more」一串,原样作为一条条目,不拆)。
|
|
56
|
-
* 列是 TEXT(两方言),改写在应用侧解析 + 按 `token` CAS 回写(`WHERE risk_descriptor = <读到的原文>`;第二跑零命中)。**没有读侧半场**:滚动窗里
|
|
57
|
-
* 旧副本新写的旧键行只缺结构化披露(卡上 `message` 那句话引擎已经写好),旧键的文本由脱敏叶表的「认不得的键按内容脱敏」一条兜住
|
|
58
|
-
* (`observability/run-terminal.ts` `redactRiskDescriptor`)—— 不为它开第二种读法。local 车道没有这一列(停驻行在引擎自己的 File 店里,本仓
|
|
59
|
-
* 没有合法缝改写那些字节,盘上格式归引擎):旧键留在原地、不被读,文本同样经脱敏叶表兜住。
|
|
60
51
|
* · **M9 park 指针索引改主键**(7.118.0,core 7.44.0 [ref])—— `workflow_agent_session` 的主键由 `(session_id)` 改成 `(session_id, run_id)`:
|
|
61
52
|
* 停驻持有者有了引擎写的位(`parkedBy` / `generation`)之后,判决要看到点名同一个子会话的每一条记录(续跑链 / 分叉),单列主键下后写覆盖先写。
|
|
62
53
|
* 表是派生投影 ⇒ **复制 + 原子换名**:照中央 DDL 建新形暂存表 → 一条 `INSERT … SELECT` 整表复制 → 正表换成待删名、暂存表换成正表名、删待删旧表
|
|
@@ -71,7 +62,7 @@
|
|
|
71
62
|
* (起服时没有 principal,把它判给任何人都是编造)。本条是一只**窗内才生效的行为臂**:窗开着时,带 principal 的第一次提交(attach)认领
|
|
72
63
|
* 这种会话(写进那一格,一行 info `session_owner_claimed`);窗关之后(运行期读本表 M10 行的 `removableAfter`,见 {@link migrationWindowOpen})
|
|
73
64
|
* 它照今天答无主,删码因此是零行为变化。认领的安全前提是单用户:local 后端起服门拒 `REQUIRE_PRINCIPAL=true`,授权口也只在
|
|
74
|
-
* `REQUIRE_PRINCIPAL` 关时把 principal 递给店认领。没有起服读数(
|
|
65
|
+
* `REQUIRE_PRINCIPAL` 关时把 principal 递给店认领。没有起服读数(它不在起服时写库)。
|
|
75
66
|
* · **M11 持久规则里 scope 不被引擎收的行**(7.120.0,引擎 7.46.0)—— 7.119.0 及更早的本仓入口(`/v1/rules` 写口、两条导入面)按
|
|
76
67
|
* 「root 非空」收 project scope,引擎 7.45 也收;引擎 7.46.0 把 project root 收窄成**完整绝对路径**(`isValidDurableScope`),本仓入口
|
|
77
68
|
* 同版改调同一只谓词。存量的 `project:myproj` 一类行在新引擎的读侧被丢(每次 run 一条 `permission.rule_row_dropped`),而撤销口删不动它
|
|
@@ -86,7 +77,7 @@
|
|
|
86
77
|
* ⚠️ **够不到的一格(如实登记)**:local 车道的持久规则在**引擎自己的** File 分区里 —— 引擎的写面对这种 scope 的加 / 墓碑一律拒,
|
|
87
78
|
* 本仓没有合法缝删它们,改那份盘上格式是下游改上游。那里的存量坏行照旧由引擎读侧丢并告知;出路候引擎给
|
|
88
79
|
* 一条删除缝。
|
|
89
|
-
* · **M12 停驻行模式词读法记号的拒臂**(7.122.0)——
|
|
80
|
+
* · **M12 停驻行模式词读法记号的拒臂**(7.122.0)—— 持久数据「响亮拒」那一半:7.122.0 起一条 run 的模式词只有存储体顶层 `permissionMode`
|
|
90
81
|
* 一个源(提交入口盖运维 `AUTONOMY=plan` 的地板一次),更早的行体里是请求原词、运维的 plan 由治理层每段重钳。续跑重放之前:本部署此刻有入口地板 ∧
|
|
91
82
|
* ctx 上没有当前记号 `"entry_word"` ∧ 体的生效词被地板钳会变 ⇒ 认领之前 409、行字节不动。规则、拒句与写点在 `http/checkpoint-ctx.ts` 顶注第三问。
|
|
92
83
|
* 没有读数键(它不写库)。
|
|
@@ -158,9 +149,9 @@
|
|
|
158
149
|
* 不改写存下的字节(体按原样留在 ctx 里),是一只**窗内才生效的行为臂** —— 窗开着时(运行期读本表 M19 行的 `removableAfter`,见 {@link migrationWindowOpen}),
|
|
159
150
|
* **只在续跑重放腿**、**只对判官判不过的那一格**按升级前的读法重读一次(`stored-request-tool-axes-m19.ts`),产物再交同一只判官(不过 ⇒ 整条不进的原臂),
|
|
160
151
|
* 真挂上的这类 server 各一行运维 warn `mcp_tool_axes_read_as_before_upgrade`;窗关之后照今天答(整条不进),删码因此是零行为变化。
|
|
161
|
-
* 窗 = 发布日 + 30 天 = 停驻行的终局兜底窗缺省(`APPROVAL_TERMINAL_BACKSTOP_MS` 缺省 30 天)——
|
|
152
|
+
* 窗 = 发布日 + 30 天 = 停驻行的终局兜底窗缺省(`APPROVAL_TERMINAL_BACKSTOP_MS` 缺省 30 天)—— 窗关时缺省部署上升级前停驻的行都已被收割。没有起服读数(它不写库)。
|
|
162
153
|
* 窗按**发布日**算、停驻行的期限按**停驻时刻**算 ⇒ 三类部署会有升级前停驻的行活过窗、窗关后回到「整条不进」:发布后才升级的部署(发布日到它升级那天之间
|
|
163
|
-
* 停驻的行)、把 `APPROVAL_TERMINAL_BACKSTOP_MS` 调长的部署、滚动升级里仍跑 7.129.x 的副本在窗内新写的行。与
|
|
154
|
+
* 停驻的行)、把 `APPROVAL_TERMINAL_BACKSTOP_MS` 调长的部署、滚动升级里仍跑 7.129.x 的副本在窗内新写的行。与 M18 一样如实登记,不为它们加长窗。
|
|
164
155
|
* **A2A 一面**(core 7.53.0 [ref] 提货批,同一只重读座、同一个窗,不另立迁移号):请求体 `a2aPeers[].toolAxes` 的判官也换成了引擎的 `readToolAxes`,7.131.x 的 A2A 读者
|
|
165
156
|
* 对每只 skill 的记录只挑三个轴、多余成员静默忽略 ⇒ 续跑重放腿同一只重读座按 **7.131.x 的 A2A 读法**重读一次(重读座按面分读者:两面升级前的读法不同 ——
|
|
166
157
|
* 7.131.x 的 A2A 读者对已知轴写坏是整条丢对端,重读照旧整条丢,不把 7.131.x 当时没挂上的对端救活),真挂上的对端一行 `a2a_tool_axes_read_as_before_upgrade`。窗仍按 7.130.0 的发布日算 ——
|
|
@@ -227,7 +218,7 @@
|
|
|
227
218
|
* · **M25 单用户记忆项目层换键形**(7.133.0)—— 不在店里、不在起服里(与 M10 同为**窗内才存在的行为臂**,但它是改写):项目层键从 `repo:<sha256(项目根)[:24]>`
|
|
228
219
|
* (7.98.0–7.132.x)换成带主体、跨设备的 `userrepo:<属主段>/<档>.<摘要>`(文法 `project-layer-key.ts`)。退役键是路径哈希、反推不出路径 ⇒ 起服没法枚举改写;
|
|
229
220
|
* 改为**每个项目第一次跑任务时**由项目层准备一步(`memory-project-layer.ts` `createMemoryProjectLayers`)把该 checkout 的 `repo:` 层经 core `migrateScope`
|
|
230
|
-
* 折进新键(File 与两只 SQL 孪生同一条;id 保留、CAS,冲突留原地下次再试)。本条不写起服读数(`reportKeys` 空,与
|
|
221
|
+
* 折进新键(File 与两只 SQL 孪生同一条;id 保留、CAS,冲突留原地下次再试)。本条不写起服读数(`reportKeys` 空,与 M10 同形);折了什么由运行期 info
|
|
231
222
|
* `memory_project_layer_folded` 说。常设的另一条律(`r` 档时本 checkout 的 `p` 档折进当前档)不是迁移,不随本条删。
|
|
232
223
|
* **曾属本条的另一半已退役(如实)**:同步客户端腿的旧游标文件 `sync-cursor-<peer>.json`(只按 peer 分区)的收编臂。引擎 7.59.0 起游标必带店绑定 `store`,
|
|
233
224
|
* 升级前落盘的旧文件都没有这一员,收编的形判从不认它 ⇒ 臂对任何存量文件都不可达,已整条删码(收编函数、守卫旗标、日志行一并删,零引用有钉:
|
|
@@ -256,7 +247,7 @@
|
|
|
256
247
|
* `http/checkpoint-ctx.ts` 末段「凭据位密封」;本处不重列)在 `checkpoint_ctx` 里只以封签存在,续跑上下文读口对凭据位上的明文答 409 `conflict.checkpoint_ctx_unsealable`(`reason:"plaintext"`)。升级之前写下的
|
|
257
248
|
* 行是明文 ⇒ **起服扫一遍、原地封好**:不在本文件的迁移段里(封要保管店的封签器,而本段跑在建店的 web-admin 运行时能交给它之前的店层 ——
|
|
258
249
|
* 与 M10 / M19 / M25 同为在本段之外跑的条目),编排在 `checkpoint-ctx-seal-m28.ts`(起服第 6 段,checkpoint 店建成之后、任何路由装配之前调一次),
|
|
259
|
-
* 店腿是两孪生共有的 ctx 行改写腿 `rewriteCtxRows`(`checkpoint-store-
|
|
250
|
+
* 店腿是两孪生共有的 ctx 行改写腿 `rewriteCtxRows`(`checkpoint-store-face.ts` `CheckpointCtxRowsRewriter`;M30 用同一只;SQL:键集分页 + 按原文 CAS、`updated_at_ms` 不动;local:逐档原子重写、信封的 `updatedAt` 不动),
|
|
260
251
|
* 行改写是读写两侧同一只封口(`sealStoredCheckpointCtxM28`),封的是「读口会答 `plaintext` 的每一个值」(与开口同一只判词)—— 7.135.0 闭集加了一位
|
|
261
252
|
* (command 条目的 `plugin.options`)之后,7.134.0 写下的带记号行在那一位上的明文也落在这一条里、同窗补封(本条没有新窗);7.136.0 再加四位(子进程的命令行:MCP stdio 传输与
|
|
262
253
|
* command 条目各自的 `command` / `args`,第 3 代)同理 —— 无记号行与 7.134.0 / 7.135.0 写下的第 1 / 2 代行上的明文命令行同窗补封。不删行、不改续跑语义;读不出的行计数不动;已封与不带凭据的行零写。读数不进
|
|
@@ -357,6 +348,14 @@
|
|
|
357
348
|
* 本版之前铸的卡信封(`approval_ask.card_json` / local 问账)上那一格还是旧名,`.strict()` 的卡 schema 只认新名。存卡的唯一读者入口 `readStoredCardEnvelope`
|
|
358
349
|
* 在 M18 的读侧改写与 schema 之前把它改名(`approval-card.ts` 的 `renameRetiredSourceKey`,交浅拷贝、零写回,响亮计数)。不起服改写:存卡的寿命以分钟计、
|
|
359
350
|
* 升级前结清在途审批是部署前置(MIGRATION 本版第 17 条),读侧接住的是滚动升级窗里旧副本新写的与升级前已结仍被读的那几行。没有读数键。
|
|
351
|
+
* · **M38 续跑重放腿上的存量 `settings.env` 凭据条目**(7.146.0)—— 凭据不进 `settings.env` 是本版的新规则(判据 `task-settings.ts` 的 `settingsEnvCredentialIssue`:名字是本进程的凭据变量名,
|
|
352
|
+
* 或值是秘密形 ⇒ 新提交 `400 request.env_credential_refused`)。升级前受理、存下的请求体(`checkpoint_ctx`;凭据位已由 M28 封好)里老壳写进去的这类条目,续跑一重放就撞同一只判据。
|
|
353
|
+
* 与 M19 / M20 同形:不改写存下的字节,是一只**窗内才生效的行为臂** —— 窗开着时(运行期读本表 M38 行的 `removableAfter`,`stored-request-env-credentials-m38.ts`),
|
|
354
|
+
* **只在续跑重放腿**,`resolveSpec` 把判据命中的键从这条腿唯一读到的那一份 `settings.env` 里剥掉(收窄方向:凭据离开模型的 shell 与 hooks,引擎自己用的凭据从进程环境取;剥空 = 空表,
|
|
355
|
+
* 登记它覆盖会话上一条登记 —— 会话 shell env 注册表「缺席 = 留着上一条」,不铸空表就把上一条留给了 shell),
|
|
356
|
+
* 恰一行运维 warn `settings_env_credentials_dropped`(按命中类计数,不带键名与值),任务照续;存体续跑预判窗内不拦。窗关之后 ⇒ 预判与 `resolveSpec` 同一只判据拒
|
|
357
|
+
* (续跑口 409 `resume_blocked_by_policy`,`blockedBy` = 本码),删码因此是零行为变化。窗 = 发布日 + 30 天 = 停驻行的终局兜底窗缺省(与 M19 / M20 同一条论证与同三类逃出窗的部署:
|
|
358
|
+
* 发布后才升级的、调长了 `APPROVAL_TERMINAL_BACKSTOP_MS` 的、滚动升级里旧副本在窗内新写的行),另一类如实登记:窗内续跑过、又停驻到窗外的任务,写回的存体仍带那些条目(本条零写)。没有起服读数(它不写库)。
|
|
360
359
|
*
|
|
361
360
|
* ## 收据账(一次起服一只,每一条迁移同一只)
|
|
362
361
|
* 每一步把它**已提交**的改写 / 删除与点名读数当场记进同一只收据账({@link MigrationReceipts}):计数随每次提交累加、行随每次提交追加、形读数在那一步落定时写。走完 ⇒
|
|
@@ -366,8 +365,7 @@
|
|
|
366
365
|
* 如实的残余:提交与那一行日志之间进程被杀、或一条提交的确认在连接上丢了 —— 收据没有耐久载体(不为短命的迁移另建迁移账表:有 schema 形可当「跑过了」标记的几条用它自己的形 —— M9 的主键宽度、M17 的列名;改值类的几条没有这种标记,为它们造一张账表 / 一个旋钮,就是给一条短命的迁移留一份长命的状态)。
|
|
367
366
|
*
|
|
368
367
|
* ## 幂等
|
|
369
|
-
* 改写的几条都可重复跑(
|
|
370
|
-
* M8 / M18:字样扫描 + CAS 回写 —— 写过的行不再命中;M17 的改写只在改名那一拍跑,第二跑列名已是新名 ⇒ 零读零写;续判时已带戳的行零动作;
|
|
368
|
+
* 改写的几条都可重复跑(M18:字样扫描 + CAS 回写 —— 写过的行不再命中;M17 的改写只在改名那一拍跑,第二跑列名已是新名 ⇒ 零读零写;续判时已带戳的行零动作;
|
|
371
369
|
* M24:正表 scope 列在场探针 —— 换名之后只补收尾(删待删旧表),换名之前被打断则暂存表删掉重建、回填只补缺的属主记录(`NOT EXISTS`);
|
|
372
370
|
* M27:只按判官挑 —— 删过的键不再被扫到)。并发起动由 {@link runSqlOneTimeMigrations} 的 advisory 锁 + 每步的后置条件判据兜住(见那里)。
|
|
373
371
|
*/
|
|
@@ -383,12 +381,6 @@ import { type ImportedLayerRootAllowRetired, type ImportedLayerRootBucketSkipped
|
|
|
383
381
|
import { type LocalPlacementBackfillSeat, type UnusableArchiveWord } from "../execution-placement.js";
|
|
384
382
|
/** 迁移读数(启动日志一行写全;测试按它断言,不靠日志文本)。 */
|
|
385
383
|
export interface OneTimeMigrationReport {
|
|
386
|
-
/** M6:本次给「只有句子」的死亡判决行补上机读码的 run 行数(SQL `task_run` / local `run.json`)。非零 = 这次迁移真写了存量行,必须让运维看见。 */
|
|
387
|
-
readonly holderDeathCodeRowsBackfilled: number;
|
|
388
|
-
/** M8:本次把 `checkpoint.risk_descriptor` 的旧披露键 `shadowedRule` 改写成 `allowRuleShadowed` 的行数(SQL 独有;local 恒 0)。非零 = 真写了存量行。 */
|
|
389
|
-
readonly allowRuleShadowRowsMigrated: number;
|
|
390
|
-
/** M8:带旧键字样、但这一格的 JSON 读不懂 ⇒ 没改写的行数(留给读口自己的响亮臂;非零 = 运维该看一眼这些行)。SQL 独有;local 恒 0。 */
|
|
391
|
-
readonly allowRuleShadowRowsUnreadable: number;
|
|
392
384
|
/** M9:workflow park 指针索引的主键 —— `reshaped` = 本次把只有 `session_id` 的主键改成 `(session_id, run_id)`;`current` = 早已是新形
|
|
393
385
|
* (新库 / 第二跑);`file-ledger` = local 文件车道(账本一行本来就是一条 run 的指针集,没有主键可改)。 */
|
|
394
386
|
readonly workflowParkIndexKey: "reshaped" | "current" | "file-ledger";
|
|
@@ -590,7 +582,7 @@ export declare class OneTimeMigrationInterruptedError extends Error {
|
|
|
590
582
|
* 规则(窗长 30 天、窗关后的第一个 minor 删码、门怎么判)在本文件头注「窗」一节,只写那一次。
|
|
591
583
|
*/
|
|
592
584
|
export interface OneTimeMigrationWindow {
|
|
593
|
-
/** 本文件里的条目名(头注「窗内的迁移」的
|
|
585
|
+
/** 本文件里的条目名(头注「窗内的迁移」的 M9…)。 */
|
|
594
586
|
readonly id: string;
|
|
595
587
|
/** 引入这条迁移的版本 = 第一只含其代码的发布 tag(取证:`git log -S '<该条的常量名>' -- src/plugins/one-time-migrations.ts`
|
|
596
588
|
* 找引入提交 → `git tag --contains <提交> --sort=creatordate` 取最早)。 */
|
|
@@ -616,7 +608,7 @@ export declare const ONE_TIME_MIGRATIONS: readonly OneTimeMigrationWindow[];
|
|
|
616
608
|
/**
|
|
617
609
|
* 一条登记行的窗**此刻**开着没有(`today` = UTC 日历日 YYYY-MM-DD):未发布形(`removableAfter: null`)⇒ 开;否则今天不晚于 `removableAfter` ⇒ 开
|
|
618
610
|
* (窗关当天仍开,与到期门「今天严格晚于才红」同一条边界)。
|
|
619
|
-
* 给**窗内才生效的行为臂**(M10 的认领、M19 / M20
|
|
611
|
+
* 给**窗内才生效的行为臂**(M10 的认领、M19 / M20 的续跑重读、M38 的续跑剥键)与本文件迁移段之外的起服扫描(M28 / M30)用:过了窗就停,不等删码车 —— 删码因此是零行为变化,而窗只写在本表这一处。
|
|
620
612
|
*/
|
|
621
613
|
export declare function migrationWindowOpen(window: Pick<OneTimeMigrationWindow, "removableAfter">, today: string): boolean;
|
|
622
614
|
/**
|
|
@@ -625,8 +617,8 @@ export declare function migrationWindowOpen(window: Pick<OneTimeMigrationWindow,
|
|
|
625
617
|
* 还没有日期可写)⇒ 响亮抛,不铸一句带空日期的句子。
|
|
626
618
|
*/
|
|
627
619
|
export declare function migrationWindowEnd(id: string): string;
|
|
628
|
-
/** local 车道上 SQL 独有的几条(
|
|
629
|
-
export declare const NO_SQL_MIGRATIONS: Omit<OneTimeMigrationReport, "
|
|
620
|
+
/** local 车道上 SQL 独有的几条(M9 / M11 / M17 / M18 / M21 / M23 / M24 / M26 / M27 / M29)的读数(M32 的回填两车道都有、M33 只在 local,local 腿的读数由 `LocalBackend.runOneTimeMigrations` 现算):那几张表 / 列在文件底座上从来不存在 ⇒ 如实答 absent / 0。 */
|
|
621
|
+
export declare const NO_SQL_MIGRATIONS: Omit<OneTimeMigrationReport, "executionPlacementsBackfilled" | "askExecutionLanesBackfilled" | "executionPlacementSessionsUnreadable" | "localArchiveRowFactsBackfilled" | "localArchivesAnonymized" | "localArchivesKeptStamped" | "localArchivesUnreadable" | "localArchiveSnapshotsRecovered" | "askJournalRecordsUpgraded" | "importedLayerRootAllowsRetired" | "importedLayerRootBucketsSkipped">;
|
|
630
622
|
/** 启动期的日志口(logger 的子集)。两级各有其用,见 {@link logOneTimeMigrations}。 */
|
|
631
623
|
export interface MigrationLogSink {
|
|
632
624
|
warn(msg: string, meta?: Record<string, unknown>): void;
|
|
@@ -653,7 +645,7 @@ export interface MigrationDb {
|
|
|
653
645
|
* 每条改表 DDL 的成功判据仍是它的**后置条件**({@link execUntil}),「另一个副本抢先把同一张表换了形」不会把滚动升级变成启动失败循环。
|
|
654
646
|
*
|
|
655
647
|
* ## 次序(codex r1 [medium] 同轮)
|
|
656
|
-
* 非破坏改写(
|
|
648
|
+
* 非破坏改写(M9、M18:改值不丢信息 / 复制 + 换名)在前,破坏性步骤(M11 的删行、M24 丢下跨 scope 行的换名)排在最后;
|
|
657
649
|
* M11 自己半途失败时,拒因自带已删的行(`purgeUndurableScopeRows`)—— 否则重试看不见已删的行,证据永久消失;M24 的丢行计数在换名提交之后进收据账。
|
|
658
650
|
*
|
|
659
651
|
* 本函数**不问**退役 schema:带着它的库在更早处就被 `ensureSchema()` 自身拒掉了(起服对账一族 `schema-consistency.ts` 的探针口,先于建表);走公开序列
|
|
@@ -783,23 +775,7 @@ export declare function oldGrammarEntriesOf(body: unknown, rev: number): OldGram
|
|
|
783
775
|
* 终名改名提交之后才写;`current` = 起服时已是终名);点名的行随扫到追加。
|
|
784
776
|
*/
|
|
785
777
|
export declare function migrateSessionRuleGrammar(db: MigrationDb, dialect: SqlDialect, receipts: MigrationReceipts): Promise<void>;
|
|
786
|
-
/**
|
|
787
|
-
export type ShadowedRuleRewrite = {
|
|
788
|
-
readonly kind: "rewrite";
|
|
789
|
-
readonly text: string;
|
|
790
|
-
} | {
|
|
791
|
-
readonly kind: "untouched";
|
|
792
|
-
} | {
|
|
793
|
-
readonly kind: "unreadable";
|
|
794
|
-
readonly error: unknown;
|
|
795
|
-
};
|
|
796
|
-
/**
|
|
797
|
-
* M8 的**一行**改写(纯函数;导出给钉用):`risk_descriptor` 的 JSON 文本里顶层带字符串 `shadowedRule` ⇒ 改写(旧键删、`allowRuleShadowed`
|
|
798
|
-
* 由旧值铸一条 `persisted` 记录;行上已经有 `allowRuleShadowed` ⇒ 只删旧键,不并);不是对象 / 没有旧键 / 旧键不是字符串 ⇒ `untouched`;
|
|
799
|
-
* JSON 读不懂 ⇒ `unreadable`(这一行不动,交给读口自己的响亮臂;迁移不替它猜,但把它数进读数,不静默)。
|
|
800
|
-
*/
|
|
801
|
-
export declare function migrateShadowedRuleDescriptor(text: string): ShadowedRuleRewrite;
|
|
802
|
-
/** M18 一行改写的结论(与 M8 同形,不共用型 —— 两条各自窗关各自删):改写后的文本 / 这一行不用动 / 读不懂(解析错误原样交出,调用方计数进读数)。 */
|
|
778
|
+
/** M18 一行改写的结论:改写后的文本 / 这一行不用动 / 读不懂(解析错误原样交出,调用方计数进读数)。 */
|
|
803
779
|
export type RetiredCardWordsRowRewrite = {
|
|
804
780
|
readonly kind: "rewrite";
|
|
805
781
|
readonly text: string;
|
|
@@ -6,16 +6,16 @@ import { SCHEMA_STATEMENTS, acquireEnsureSchemaLock, releaseEnsureSchemaLock } f
|
|
|
6
6
|
import { PG_SCHEMA_STATEMENTS, acquirePgEnsureSchemaLock, releasePgEnsureSchemaLock } from "./pg-pool.js";
|
|
7
7
|
import { CENTRAL_SCHEMA_INDEXES } from "./schema-indexes.js";
|
|
8
8
|
import { ensureIndexes } from "./ensure-index.js";
|
|
9
|
-
import { createObjectColumnReader, decodeJsonColumn, decodeNullableJsonColumn, isJsonColumnBodyProblem, jsonColumnText, jsonColumnTextExpr,
|
|
9
|
+
import { createObjectColumnReader, decodeJsonColumn, decodeNullableJsonColumn, isJsonColumnBodyProblem, jsonColumnText, jsonColumnTextExpr, readOpaqueJsonValueColumn, } from "./sql-json-column.js";
|
|
10
10
|
import { incarnationFromCell, sessionFaceFromRow } from "../session-incarnation.js";
|
|
11
|
-
import {
|
|
11
|
+
import { StoreBootRefusalError } from "./store-contracts.js";
|
|
12
12
|
import { PERMISSION_RULE_TABLE, SqlDurableRulePartitionProvider, isSqlBucketRefusal, isSqlBucketVanished, listRuleBucketOwners, purgeUndurableScopeRows } from "./permission-rule-store-sql.js";
|
|
13
13
|
import { SESSION_RULES_COLUMN } from "./session-rules-column.js";
|
|
14
14
|
import { readJsonObjectColumn } from "./sql-json-column.js";
|
|
15
15
|
import { retireStoredCardWords } from "../retired-card-words.js";
|
|
16
16
|
import { redactSecrets } from "../trace/redact.js";
|
|
17
17
|
import { CLAIM_OWNERLESS_PLACED_SQL, claimOwnerlessParams, isOrphanSessionOwner, judgeDelegatedOwner } from "../delegated-session-owner.js";
|
|
18
|
-
import { MAILBOX_KEYED_TABLES, mailboxKeyDeleteSql, storedMailboxKeyless } from "
|
|
18
|
+
import { MAILBOX_KEYED_TABLES, mailboxKeyDeleteSql, storedMailboxKeyless } from "../stores-sql/mailbox-store-sql.js";
|
|
19
19
|
import { SESSION_META_PLACEMENT_COLUMNS, backfillWriterStatement, countOrphanBindingsStatement, migrateDeviceBindingsStatement } from "./execution-placement-sql.js";
|
|
20
20
|
import { APPROVAL_ASK_ENDING_CAUSE_COLUMN, APPROVAL_ASK_EXECUTION_LANE_COLUMN, APPROVAL_ASK_PARK_TRIGGER_COLUMN, APPROVAL_ASK_TABLE } from "./approval-ask-store-sql.js";
|
|
21
21
|
import { retireImportedLayerRootAllows } from "./imported-layer-root-retirement.js";
|
|
@@ -23,9 +23,6 @@ import { isUnusableArchive } from "../execution-placement.js";
|
|
|
23
23
|
const RETIRED_SESSION_RULE_BUCKETS = ["commandAllow", "commandDeny"];
|
|
24
24
|
export function buildMigrationReceipts() {
|
|
25
25
|
return {
|
|
26
|
-
holderDeathCodeRowsBackfilled: 0,
|
|
27
|
-
allowRuleShadowRowsMigrated: 0,
|
|
28
|
-
allowRuleShadowRowsUnreadable: 0,
|
|
29
26
|
workflowParkIndexRowsCarried: 0,
|
|
30
27
|
undurableScopeRuleRows: [],
|
|
31
28
|
undurableScopeRuleBucketsDeferred: 0,
|
|
@@ -76,10 +73,7 @@ function completedReport(r) {
|
|
|
76
73
|
return { ...r, workflowParkIndexKey, sessionRuleColumn, workflowJournalScopeColumn };
|
|
77
74
|
}
|
|
78
75
|
function changedAnything(r) {
|
|
79
|
-
return (r.
|
|
80
|
-
r.allowRuleShadowRowsMigrated > 0 ||
|
|
81
|
-
r.allowRuleShadowRowsUnreadable > 0 ||
|
|
82
|
-
r.workflowParkIndexKey === "reshaped" ||
|
|
76
|
+
return (r.workflowParkIndexKey === "reshaped" ||
|
|
83
77
|
r.workflowParkIndexRowsCarried > 0 ||
|
|
84
78
|
r.undurableScopeRuleRows.length > 0 ||
|
|
85
79
|
r.undurableScopeRuleBucketsDeferred > 0 ||
|
|
@@ -163,42 +157,6 @@ export class OneTimeMigrationInterruptedError extends Error {
|
|
|
163
157
|
}
|
|
164
158
|
}
|
|
165
159
|
export const ONE_TIME_MIGRATIONS = [
|
|
166
|
-
{
|
|
167
|
-
id: "M6",
|
|
168
|
-
introducedIn: "7.116.0",
|
|
169
|
-
releasedOn: "2026-10-05",
|
|
170
|
-
removableAfter: "2026-11-04",
|
|
171
|
-
removal: "删 migrateOn 的 M6 步(`task_run` 两条 `UPDATE … SET error_code`)与 local 腿 `FileRunStore.migrateLegacyHolderDeathCodes`(及 " +
|
|
172
|
-
"`LocalBackend.runOneTimeMigrations` 里那一格);报告与日志行的 `holderDeathCodeRowsBackfilled`;**连同读侧半场一起删**:" +
|
|
173
|
-
"`store-contracts.ts` 的 `readLegacyHolderDeathCode` 与 SQL 行映射 `run-store-sql.ts#rowToRun` 里对它的调用(码列改回原样读)",
|
|
174
|
-
afterRemoval: "没有响亮臂:窗关删码之后仍只有句子、码列为空的行(跳过了所有带 M6 的版本直接升的库,或窗关之后还在写的 ≤7.115.x 副本)不再被判成持有者死亡 —— " +
|
|
175
|
-
"用户输入受理账本的收敛判词(`user-input-ledger.ts` `judgeOpen`)对这种行落到「其余」臂 `leg_over`:补落 `settled{leg_end}`、不告知,那条 run 上" +
|
|
176
|
-
"丢掉的 steer 不再告诉用户;`GET /v1/runs/:id` 上 `errorCode` 缺席、只剩 `error` 句子",
|
|
177
|
-
reportKeys: ["holderDeathCodeRowsBackfilled"],
|
|
178
|
-
},
|
|
179
|
-
{
|
|
180
|
-
id: "M7",
|
|
181
|
-
introducedIn: "7.117.0",
|
|
182
|
-
releasedOn: "2026-10-06",
|
|
183
|
-
removableAfter: "2026-11-05",
|
|
184
|
-
removal: "删 `http/checkpoint-ctx.ts` 的读法记号判据与拒臂(`allowListReadingUnstated` / `allowListReadingEraOf` / `allowListReadingRefusal` / " +
|
|
185
|
-
"`PERMISSIONS_ALLOW_READINGS` / `ALLOW_LIST_READING_ERAS`、`buildCheckpointCtx` 里的记号写点)、`CheckpointCtx.permissionsAllowReading`、" +
|
|
186
|
-
"`resume-legs.ts` 两个判点与 `approval-sweeps.ts` 的跳过臂、随包排空判据 `permissions-allow-list`(两份 SQL + 本地脚本那一条)",
|
|
187
|
-
afterRemoval: "没有响亮臂:删码之后仍停驻、体里带非空 allow 的旧读法行(把 `APPROVAL_TERMINAL_BACKSTOP_MS` 调长的部署,或跳过了带本条的版本直接升的库)会被按" +
|
|
188
|
-
"当前读法静默重放(名单时代的行:名单外的工具放开;表态时代的行:普通问不再问)—— 升级前按 MIGRATION 7.117.0 节跑排空判据清零",
|
|
189
|
-
reportKeys: [],
|
|
190
|
-
},
|
|
191
|
-
{
|
|
192
|
-
id: "M8",
|
|
193
|
-
introducedIn: "7.117.0",
|
|
194
|
-
releasedOn: "2026-10-06",
|
|
195
|
-
removableAfter: "2026-11-05",
|
|
196
|
-
removal: "删 migrateOn 的 M8 步(`checkpoint.risk_descriptor` 的旧键扫描 + CAS 回写)与 `migrateShadowedRuleKey` / `migrateShadowedRuleDescriptor`;" +
|
|
197
|
-
"报告、日志行与 `NO_SQL_MIGRATIONS` 的 `allowRuleShadowRowsMigrated` / `allowRuleShadowRowsUnreadable`",
|
|
198
|
-
afterRemoval: "没有响亮臂:删码之后仍带旧键的停驻行(跳过了带本条的版本直接升的库)在运维待批队列上只缺结构化披露 `allowRuleShadowed`;旧键的文本仍经脱敏叶表" +
|
|
199
|
-
"「认不得的键按内容脱敏」一条脱敏后原样显示,卡上 `message` 里引擎写好的那句话不受影响",
|
|
200
|
-
reportKeys: ["allowRuleShadowRowsMigrated", "allowRuleShadowRowsUnreadable"],
|
|
201
|
-
},
|
|
202
160
|
{
|
|
203
161
|
id: "M9",
|
|
204
162
|
introducedIn: "7.118.0",
|
|
@@ -411,7 +369,7 @@ export const ONE_TIME_MIGRATIONS = [
|
|
|
411
369
|
"`test/one-time-migrations.test.ts` 的 M23 组与 `test/one-time-migrations-db-integration.test.ts` 的 M23 格。" +
|
|
412
370
|
"**不随本条删**:`ORPHAN_SESSION_OWNER_PREFIX` 与它在 `security.ts` 保留主体前缀里的登记(已落库的行可能带哨兵,永久保留);" +
|
|
413
371
|
"属主为 NULL 的 placed 行只对 fleet 调用方放行(`security.ts` 的 `ownerlessRowOpen` / `sessionOwnerCellOf` 与各门读 `placementOf` 的那一次)—— 那是常设的读面律",
|
|
414
|
-
afterRemoval: "会话面的读面律(常设,不随本条删)接住:跳过了带本条的版本直接升的库里,属主为 NULL 的存量 placed 子代行只对 fleet 调用方放行(出示 service
|
|
372
|
+
afterRemoval: "会话面的读面律(常设,不随本条删)接住:跳过了带本条的版本直接升的库里,属主为 NULL 的存量 placed 子代行只对 fleet 调用方放行(出示 service 凭据、不报主体 —— 除非部署声明 `SERVICE_TOKEN_ACTS_FOR_DEPLOYMENT=false`,那时这一形是无身份调用方、不在其内;或 dev-open 部署上的任何调用方)," +
|
|
415
373
|
"其余调用方答 404(与别人的行同体)—— 出路是升级时先过一次带本条的版本,或运维按 `placement_root_session_id`(缺则 `placement_parent_session_id`)那一行的属主手工回填、" +
|
|
416
374
|
"推不出的写一个任何主体都不匹配的值;停驻挂点只比对宿主行属主与引擎交来的属主(复活腿交那一行自己的属主),不写无主行;" +
|
|
417
375
|
"建行那一笔记 `placement.owner` 不随本条删(那是常设的写法 —— core 盒义务 7,不是迁移)",
|
|
@@ -472,13 +430,13 @@ export const ONE_TIME_MIGRATIONS = [
|
|
|
472
430
|
introducedIn: "7.134.0",
|
|
473
431
|
releasedOn: "2026-10-21",
|
|
474
432
|
removableAfter: "2026-11-20",
|
|
475
|
-
removal: "删 `src/checkpoint-ctx-seal-m28.ts` 整个文件(`sealCheckpointCtxCredentialsM28`)与起服第 6 段(`src/boot/stage-06-runners.ts`)顶部对 `sealCheckpointCtxCredentialsM28` 的 import 行与对它的那一处调用(连同起服 info 行 `checkpoint_ctx_credentials_sealed`);两孪生共有的 ctx 行改写店腿(`src/
|
|
433
|
+
removal: "删 `src/checkpoint-ctx-seal-m28.ts` 整个文件(`sealCheckpointCtxCredentialsM28`)与起服第 6 段(`src/boot/stage-06-runners.ts`)顶部对 `sealCheckpointCtxCredentialsM28` 的 import 行与对它的那一处调用(连同起服 info 行 `checkpoint_ctx_credentials_sealed`);两孪生共有的 ctx 行改写店腿(`src/stores-sql/checkpoint-store-sql.ts`、`src/plugins/checkpoint-store-face.ts` 与 `src/plugins/local-checkpoint-store.ts` 里的 `rewriteCtxRows` / `CtxRowsRewrite` / `CtxRowRewrite` / `CheckpointCtxRowsRewriter` / 扫描页 `CTX_REWRITE_PAGE`)只在本表再无别的条目用它时(今天 M30 也用)一起删;店腿删时 `test/checkpoint-ctx-sealed-brand.test.ts` 里 `rewriteCtxRows` 的断言(`@ts-expect-error` 与 `void local.rewriteCtxRows(` 两行)一起删 —— 店腿不在后那一行的 tsc 错变成「属性不存在」,`@ts-expect-error` 照样满足,断言静默变空 —— 同文件 `putCtx` 的常设断言保留;**店腿格不随本条删**:`test/checkpoint-ctx-rows-rewrite-db-integration.test.ts`(店腿自己的 CAS / 分页 / 一行装不下三格)与 `test/checkpoint-ctx-rows-rewrite-local.test.ts`(读不出的档 / 信封 updatedAt 不动两格)用中性的行改写、不借任何一条迁移的函数,店腿还有用户时它们要活着;店腿删时两个文件整文件随店腿删,`scripts/db-integration-files.json` 里 db 那个文件的行同删;店腿删时的同族注释(店腿是两条迁移共用的,谁后删谁做;两条 removal 都点名,逐条同字面):`src/http/checkpoint-ctx.ts`:「与一次性迁移的 ctx 行改写店腿(`rewriteCtxRows`)」删;`test/checkpoint-ctx-sealed-brand.test.ts`:「与 ctx 行改写回调(M28 / M30 共用)」删、「,M28 行改写回调交回裸对象 —— 三处都是 tsc 错」改成「 —— 两处都是 tsc 错」;`test/checkpoint-ctx-credential-seal-db-integration.test.ts`:「另有各随一条一次性迁移的格」起到「别的文件的行一个都不碰);」止整段删;" +
|
|
476
434
|
"`http/checkpoint-ctx.ts` 的 `sealStoredCheckpointCtxM28`;`test/checkpoint-ctx-seal-m28.test.ts` 整个文件与 `test/checkpoint-ctx-credential-seal-db-integration.test.ts` 里的「[M28] 明文旧行」那一格(它调 `sealStoredCheckpointCtxM28`);" +
|
|
477
435
|
"`test/doc-claims-upgrade-notes.test.ts` ㊵ 组里读这处调用与日志行的三行断言随删(两格本身与其余断言留着;不删就是删码后这两格红):「锚(嵌入方段的每件事实读实现)」格的 `callSites(\"sealCheckpointCtxCredentialsM28\")` 一行;" +
|
|
478
436
|
"「锚(恢复句的每件事实读实现)」格里 guarded 上对 `sealCheckpointCtxCredentialsM28` 调用的断言与对 `logger.info(\"checkpoint_ctx_credentials_sealed\"` 日志行的断言两行;" +
|
|
479
437
|
"`test/stored-request-prompt-profile-m30.test.ts` 里钉起服第 6 段调用次序的那一格(`describe` 名含「起服接线」;M30 删码时才删它,M28 的窗先关,先删 M28 时它要活着)里读 M28 调用位置的 `const m28` 那一行(它用 indexOf 找 `sealCheckpointCtxCredentialsM28` 的调用)与「M28 在那一臂里」「M30 在那一臂里、M28 之后」两条断言,改成只相对 `guard` 比较 M30 的位置;" +
|
|
480
438
|
"依赖本行的格(行一删就红):doc-claims ㊵ 的「嵌入方一段分清两只迁移的窗」格(读 M28 / M30 两行的窗末日;哪一行先删就先删这一格,MIGRATION 7.137.0 节的文字是已发布的历史、留着不动),`test/stored-request-prompt-profile-m30.test.ts` 里「M28 登记行」组整组随删(组内三格都读 M28 行的 `removal`:「M28 的 removal 同样点名」「M28 删法条补四类漏项」「同一注释半句只归一条 removal」)、同文件 SHARED 表里 rows 含 M28 的五行改成只剩 M30 并入 SITES(M30 的登记行组已先删时该表已不在,这一句无事可做);" +
|
|
481
|
-
"同族注释(每个半句只归本条或 M30 条之一,不重复改;标〔另一条的〕的几处住在另一条迁移的文件 / 头注段里,那条已先删则宿主已不在,跳过):`src/http/checkpoint-ctx.ts`:「一次性迁移 M28 对存量行用同一只走法」删、「({@link sealStoredCheckpointCtxM28})」删、「、{@link sealStoredCheckpointCtxM28}」删、「(开口与 M28 同一只)」删、「(更早版本写下、M28 还没扫到)」改成「(更早版本写下)」、「读写两侧与一次性迁移 M28 共用」改成「读写两侧共用」、「已落盘的行由 M28 补封」改成「已落盘的行不补封(要补封须另起迁移)」、「M28 封的是」起到「窗外加位要另起迁移)。」止整段删、「(读写两侧与 M28 共用这一只)」改成「(读写两侧共用这一只)」、「(开口与 M28 共用这一只判词,闭集三词)」改成「(开口用这一只判词,闭集三词)」、「开口去开它;M28 不动它;」改成「开口去开它;」、「M28 把它封好;」删、「M28 不动它(留给读口响亮拒)」改成「(留给读口响亮拒)」、「封口 / 开口 / M28 共用的那一只」改成「封口 / 开口共用的那一只」;`src/sealed-key.ts`:「起服的一次性迁移 M28 会用它把还读得懂的明文行换成谁都开不开的密文」改成「新写的停驻行会被封成谁都开不开的密文」;`src/boot/web-admin.ts`:「与一次性迁移 M28(stage-06)」删、「M28 会拿它毁掉还读得懂的行」改成「新写的停驻行会被封成谁都开不开的密文」;`src/boot/stage-06-runners.ts`:「也是一次性迁移 M28 要它的地方。M28 在任何路由装配之前跑(窗外不扫;读数一行 info)。」删、「排在 M28 之后」删;`src/plugins/checkpoint-store-
|
|
439
|
+
"同族注释(每个半句只归本条或 M30 条之一,不重复改;标〔另一条的〕的几处住在另一条迁移的文件 / 头注段里,那条已先删则宿主已不在,跳过):`src/http/checkpoint-ctx.ts`:「一次性迁移 M28 对存量行用同一只走法」删、「({@link sealStoredCheckpointCtxM28})」删、「、{@link sealStoredCheckpointCtxM28}」删、「(开口与 M28 同一只)」删、「(更早版本写下、M28 还没扫到)」改成「(更早版本写下)」、「读写两侧与一次性迁移 M28 共用」改成「读写两侧共用」、「已落盘的行由 M28 补封」改成「已落盘的行不补封(要补封须另起迁移)」、「M28 封的是」起到「窗外加位要另起迁移)。」止整段删、「(读写两侧与 M28 共用这一只)」改成「(读写两侧共用这一只)」、「(开口与 M28 共用这一只判词,闭集三词)」改成「(开口用这一只判词,闭集三词)」、「开口去开它;M28 不动它;」改成「开口去开它;」、「M28 把它封好;」删、「M28 不动它(留给读口响亮拒)」改成「(留给读口响亮拒)」、「封口 / 开口 / M28 共用的那一只」改成「封口 / 开口共用的那一只」;`src/sealed-key.ts`:「起服的一次性迁移 M28 会用它把还读得懂的明文行换成谁都开不开的密文」改成「新写的停驻行会被封成谁都开不开的密文」;`src/boot/web-admin.ts`:「与一次性迁移 M28(stage-06)」删、「M28 会拿它毁掉还读得懂的行」改成「新写的停驻行会被封成谁都开不开的密文」;`src/boot/stage-06-runners.ts`:「也是一次性迁移 M28 要它的地方。M28 在任何路由装配之前跑(窗外不扫;读数一行 info)。」删、「排在 M28 之后」删;`src/plugins/checkpoint-store-face.ts`:「M28(凭据位明文封好)」删;`src/stored-request-prompt-profile-m30.ts`:〔另一条的〕「,与 M28 同一只」删、〔另一条的〕「本条与 M28 同在起服第 6 段」改成「本条在起服第 6 段」、〔另一条的〕「(M28 用同一只)」删;`src/plugins/one-time-migrations.ts`:〔另一条的〕「起服第 6 段 M28 之后调一次」改成「起服第 6 段调一次」、〔另一条的〕「店腿是两孪生共有的 `rewriteCtxRows`,与 M28 同一只」改成「店腿是两孪生共有的 `rewriteCtxRows`」;`test/owner-gate-single-owner.test.ts`:「两只封口 `sealCheckpointCtx` / `sealStoredCheckpointCtxM28` 经它」改成「封口 `sealCheckpointCtx` 经它」;`test/drain-check-local.test.ts`:「封口 / 开口 / M28 共用的凭据位遍历器」改成「封口 / 开口共用的凭据位遍历器」;`test/checkpoint-ctx-credential-seal.test.ts`:「(否则 M28 会把可用的明文行换成谁都开不开的密文)」改成「(否则新写的停驻行会被封成谁都开不开的密文)」;`test/helpers/ctx-sealing.ts`:「 / M28 的行改写」删;`test/checkpoint-ctx-credential-seal-db-integration.test.ts`:「/ `checkpoint-ctx-seal-m28.test.ts`」删、「窗与读数那一层在 local 半场(`checkpoint-ctx-seal-m28.test.ts`)钉」起到「两半场共用同一只行改写 `sealStoredCheckpointCtxM28`。」止整段删;`test/checkpoint-ctx-sealed-brand.test.ts`:「与 M28 的行改写(`sealStoredCheckpointCtxM28`)」删;" +
|
|
482
440
|
"**不随本条删**:凭据位密封的常设规则(封口 / 开口 / 闭集 / 读口第四态 / 409 码 / 装配期拒启)",
|
|
483
441
|
afterRemoval: "读口对凭据位上明文的常设拒臂接住:跳过了带本条的版本直接升的库,带明文凭据的停驻行续跑答 409 `conflict.checkpoint_ctx_unsealable`(`reason:\"plaintext\"`)," +
|
|
484
442
|
"行字节不动 —— 出路 = 作为新任务重提(仍停驻的先取消),或升级时先过一次带本条的版本",
|
|
@@ -502,13 +460,13 @@ export const ONE_TIME_MIGRATIONS = [
|
|
|
502
460
|
releasedOn: "2026-10-25",
|
|
503
461
|
removableAfter: "2026-11-24",
|
|
504
462
|
removal: "删 `src/stored-request-prompt-profile-m30.ts` 整个文件(`retirePromptProfileM30` / `retirePromptProfileRowM30` / `PromptProfileRetireM30Report`)与起服第 6 段(`src/boot/stage-06-runners.ts`)顶部对 `retirePromptProfileM30` 的 import 行与对它的那一处调用(连同起服 info 行 `checkpoint_ctx_prompt_profile_rewritten`);" +
|
|
505
|
-
"`http/checkpoint-ctx.ts` 的 `rewriteStoredBodyKeys` 与 `CREDENTIAL_SLOT_ROOTS`(若再无别的调用方);两孪生共有的 ctx 行改写店腿(`src/
|
|
463
|
+
"`http/checkpoint-ctx.ts` 的 `rewriteStoredBodyKeys` 与 `CREDENTIAL_SLOT_ROOTS`(若再无别的调用方);两孪生共有的 ctx 行改写店腿(`src/stores-sql/checkpoint-store-sql.ts`、`src/plugins/checkpoint-store-face.ts` 与 `src/plugins/local-checkpoint-store.ts` 里的 `rewriteCtxRows` / `CtxRowsRewrite` / `CtxRowRewrite` / `CheckpointCtxRowsRewriter` / `CTX_REWRITE_PAGE`)只在本表再无别的条目用它时一起删(今天 M28 也用);店腿删时 `test/checkpoint-ctx-sealed-brand.test.ts` 里 `rewriteCtxRows` 的断言(`@ts-expect-error` 与 `void local.rewriteCtxRows(` 两行)一起删 —— 店腿不在后那一行的 tsc 错变成「属性不存在」,`@ts-expect-error` 照样满足,断言静默变空 —— 同文件 `putCtx` 的常设断言保留;**店腿格不随本条删**:`test/checkpoint-ctx-rows-rewrite-db-integration.test.ts`(店腿自己的 CAS / 分页 / 一行装不下三格)与 `test/checkpoint-ctx-rows-rewrite-local.test.ts`(读不出的档 / 信封 updatedAt 不动两格)用中性的行改写、不借任何一条迁移的函数,店腿还有用户时它们要活着;店腿删时两个文件整文件随店腿删,`scripts/db-integration-files.json` 里 db 那个文件的行同删;店腿删时的同族注释(店腿是两条迁移共用的,谁后删谁做;两条 removal 都点名,逐条同字面):`src/http/checkpoint-ctx.ts`:「与一次性迁移的 ctx 行改写店腿(`rewriteCtxRows`)」删;`test/checkpoint-ctx-sealed-brand.test.ts`:「与 ctx 行改写回调(M28 / M30 共用)」删、「,M28 行改写回调交回裸对象 —— 三处都是 tsc 错」改成「 —— 两处都是 tsc 错」;`test/checkpoint-ctx-credential-seal-db-integration.test.ts`:「另有各随一条一次性迁移的格」起到「别的文件的行一个都不碰);」止整段删;" +
|
|
506
464
|
"`http/checkpoint-ctx.ts` 的拒句铸点 `retiredRequestKeyRefusal`:模板串里从「If whoever operates this deployment restarts this server on or before 〈窗末日〉 (UTC), the stored request is rewritten in place and the same request can be sent again; otherwise submit」起的整段换成大写开头的「Submit」(窗关后重启不再改写;只删半句会留下句首小写、悬空的 otherwise),模板串变回整句双引号字面 —— 删后整句(逐字;冻结表那一行搬回字面表时也是这一句):「this task was suspended by an earlier server version and its stored request still carries promptProfile, a request key this version no longer reads (it was replaced by the boolean promptLean: classic is promptLean: false, simple is leaving promptLean out), so continuing would run the task with a prompt form it was not submitted with. Nothing was decided and nothing was resumed. Submit the work again as a new task with promptLean in place of promptProfile, and if this task is still suspended cancel it first (POST /v1/runs/:id/cancel).」," +
|
|
507
465
|
"它的第二参数 `rewriteWindowEnd` 同删(定义处与私有的 `storedBodyReplayArmAnswer` 里 `retired_request_key` 臂上的那一处调用),`StoredBodyReplayRefusal` 的 `retired_request_key` 臂上的必填字段 `rewriteWindowEnd` 同删;" +
|
|
508
466
|
"`src/trace/self-minted-wire.ts` 的 `refusalSentenceForm` 里「409 checkpoint.unsupported_version#retired_request_key」那一行(自铸句型登记):骨架 attr 尾上的「submit the work again」改成「Submit the work again」(删后整句的形),since 改写成删码所在的版本(该表的律:改 attr 的同时改 since);" +
|
|
509
467
|
"`http/checkpoint-ctx.ts` 的日志字段铸点 `storedBodyReplayLogFields` 里 `retired_request_key` 臂的 `note` 句改成常设拒臂的句子(原句里「the one-time rewrite at startup did not reach it」与「or a restart of this version inside the window rewrites the row」两半删码后成假话,与本行 afterRemoval 的「出路 = 重提」矛盾;" +
|
|
510
468
|
"改后句:「this session's stored request still carries a request key this version retired and nothing rewrites it any more; it is not replayed — the task stays suspended until someone cancels it and resubmits it as a new task (promptLean in place of promptProfile)」);" +
|
|
511
|
-
"同族注释(每个半句只归本条或 M28 条之一,不重复改;标〔另一条的〕的几处住在另一条迁移的文件 / 头注段里,那条已先删则宿主已不在,跳过):`src/http/checkpoint-ctx.ts`:「两条出路(运维在一次性迁移的窗内重启本服务 ⇒ 起服改写存体、同一请求可再发;否则作为新任务重提,仍停驻的先取消)」改成「出路(作为新任务重提,仍停驻的先取消)」、「**窗的日期不手写**」起到「删法见登记表 M30 的」止整段删、「存体里的旧键由一次性迁移在起服时原地改写」改成「存体里的旧键没有迁移改写」、「(M30,`stored-request-prompt-profile-m30.ts`,行改写经本模块的 {@link rewriteStoredBodyKeys})。改写不到的残留行」改成「仍带旧键的残留行」、「;存体由 M30 起服改写」删、「与 {@link rewriteStoredBodyKeys}」删、「(存量行非凭据顶层体键的改写,凭据位与读法记号原样随行)」删;`src/http/wire-types.ts`:「由一次性迁移 M30 在起服时按同一张映射原地改写」改成「没有迁移改写」、「(`stored-request-prompt-profile-m30.ts`;M30 · 窗口见 `plugins/one-time-migrations.ts` 登记表)」删;`src/spec-fields.ts`:「由一次性迁移 M30 在起服时改写成 `promptLean`(`stored-request-prompt-profile-m30.ts`),」改成「不改写,」;`src/boot/stage-06-runners.ts`:「M30(存体里的退役请求键 `promptProfile` 原地改写)同在这里、」删、「(同一只 ctx 行改写店腿;不要封签器),同样早于任何续跑入口。」删;`src/plugins/checkpoint-store-
|
|
469
|
+
"同族注释(每个半句只归本条或 M28 条之一,不重复改;标〔另一条的〕的几处住在另一条迁移的文件 / 头注段里,那条已先删则宿主已不在,跳过):`src/http/checkpoint-ctx.ts`:「两条出路(运维在一次性迁移的窗内重启本服务 ⇒ 起服改写存体、同一请求可再发;否则作为新任务重提,仍停驻的先取消)」改成「出路(作为新任务重提,仍停驻的先取消)」、「**窗的日期不手写**」起到「删法见登记表 M30 的」止整段删、「存体里的旧键由一次性迁移在起服时原地改写」改成「存体里的旧键没有迁移改写」、「(M30,`stored-request-prompt-profile-m30.ts`,行改写经本模块的 {@link rewriteStoredBodyKeys})。改写不到的残留行」改成「仍带旧键的残留行」、「;存体由 M30 起服改写」删、「与 {@link rewriteStoredBodyKeys}」删、「(存量行非凭据顶层体键的改写,凭据位与读法记号原样随行)」删;`src/http/wire-types.ts`:「由一次性迁移 M30 在起服时按同一张映射原地改写」改成「没有迁移改写」、「(`stored-request-prompt-profile-m30.ts`;M30 · 窗口见 `plugins/one-time-migrations.ts` 登记表)」删;`src/spec-fields.ts`:「由一次性迁移 M30 在起服时改写成 `promptLean`(`stored-request-prompt-profile-m30.ts`),」改成「不改写,」;`src/boot/stage-06-runners.ts`:「M30(存体里的退役请求键 `promptProfile` 原地改写)同在这里、」删、「(同一只 ctx 行改写店腿;不要封签器),同样早于任何续跑入口。」删;`src/plugins/checkpoint-store-face.ts`:「、M30(退役请求键改写)」删;`src/plugins/one-time-migrations.ts`:〔另一条的〕「M30 用同一只;」删;`src/checkpoint-ctx-seal-m28.ts`:〔另一条的〕「(M30 用同一只)」删;`test/task-agents-876.test.ts`:「体由一次性迁移 M30 在起服时原地改写」改成「体没有迁移改写」;`test/allow-list-reading-park-refusal.test.ts`:「一次性迁移 M30 没改写到的残留」改成「没有迁移改写的残留」;`test/api-error-text-freeze.test.ts`:「一次性迁移 M30 没改写到的残留」改成「没有迁移改写的残留」、「洞 = 窗的最后一天(绝对日期)」起到「不手写。」止整段删;" +
|
|
512
470
|
"`http/stored-body-replay.ts` 里 `RETIRED_KEY_REWRITE_MIGRATION` 的 JSDoc 随表删;" +
|
|
513
471
|
"`http/stored-body-replay.ts` 的 `RETIRED_KEY_REWRITE_MIGRATION`(`satisfies Record<ReplayRefusedRetiredKey, string>`:M30 删后 `promptProfile` 仍是退役键,这张表只能整张删)、" +
|
|
514
472
|
"判据里 `rewriteWindowEnd: migrationWindowEnd(…)` 那一项与 `migrationWindowEnd` 的引入行;`plugins/one-time-migrations.ts` 导出的 `migrationWindowEnd` 在无别的读者时一起删;" +
|
|
@@ -570,8 +528,8 @@ export const ONE_TIME_MIGRATIONS = [
|
|
|
570
528
|
"报告 / 收据 / `changedAnything` / `readingsSnapshot` / `readingFields` 里的 `localArchiveRowFactsBackfilled` / `localArchivesAnonymized` / `localArchivesKeptStamped` / `localArchivesUnreadable` / `localArchiveSnapshotsRecovered`、" +
|
|
571
529
|
"`local_archive_kept_stamped` / `local_archive_unreadable` 两行 warn、读数行 note 里的 M33 句与头注 M33 段;`test/local-archive-owner.test.ts` 里标题含 `P3` / `P4` / `P5` / `P6` / `F1` / `F2` / `F3` 的格与 `legacyRoot` / `writeArchive` / `boot` / `M33_ZERO` / `m33Of` 助手。" +
|
|
572
530
|
"**不随本条删**:行格的 `createdAt` / `forkedFrom` 两键(常设的数据形)、`LocalArchiveSnapshotsPresentError` / `assertNoArchiveSnapshots` / `LOCAL_ARCHIVE_SNAPSHOT_DIR` 与 `LocalBackend.ensureSchema` 里调它的那一句、" +
|
|
573
|
-
"`session-error-wire.ts` 的 `StampedSessionArchiveError` / `STAMPED_SESSION_ARCHIVE_SENTENCE` / `sessionErrorWireOf`
|
|
574
|
-
afterRemoval: "三只常设臂接住:① 数据根下的快照目录非空 ⇒ 拒启(`config.local_archive_snapshot_present`,点名文件与两条出路);② 跳过了带本条的版本直接升的数据根(或本条留着的存档),带属主戳的存档被 fork
|
|
531
|
+
"`session-error-wire.ts` 的 `StampedSessionArchiveError` / `STAMPED_SESSION_ARCHIVE_SENTENCE` / `sessionErrorWireOf` 与本店带戳判的唯一读口 `assertArchiveAnonymous`(fork 的源、改日志推送的落点、会话同步导入第一阶段的早拒三处问它)、行上缺建档时刻的 F 类读法(`server.local-session-row.created-at-absent`)",
|
|
532
|
+
afterRemoval: "三只常设臂接住:① 数据根下的快照目录非空 ⇒ 拒启(`config.local_archive_snapshot_present`,点名文件与两条出路);② 跳过了带本条的版本直接升的数据根(或本条留着的存档),带属主戳的存档被 fork、改日志的推送与会话同步导入第一阶段对 fork / stale 的早拒同一只具名拒(409 `conflict.session_archive_stamped` + 固定句,零写 / 行格净零写)," +
|
|
575
533
|
"读 / 续跑 / 拉取照常 —— 出路 = 删掉会话后重推,或升级时先过一次带本条的版本并在窗内起服;③ 行上没有建档时刻的格(同一类数据根)⇒ 列表 / 会话视图 / 交出的元数据读纪元(F 类 tag 计数)",
|
|
576
534
|
reportKeys: ["localArchiveRowFactsBackfilled", "localArchivesAnonymized", "localArchivesKeptStamped", "localArchivesUnreadable", "localArchiveSnapshotsRecovered"],
|
|
577
535
|
},
|
|
@@ -611,7 +569,7 @@ export const ONE_TIME_MIGRATIONS = [
|
|
|
611
569
|
removal: "**删码前提**:本服务已不支持回滚到引擎 7.61.0 之前的版本(更早的引擎的导入门会重新铸出这种 add,本条要在每次起服把它们收掉)—— 窗关时仍支持这种回滚 ⇒ 本行两格顺延(改日期,并在本注里写明为什么),不删。" +
|
|
612
570
|
"删什么:`src/plugins/imported-layer-root-retirement.ts` 整个文件;migrateStepsOn 的 M36 步(规则表与 `grammar` 列的在场探针 + 对 `retireImportedLayerRootAllows` 的调用)与握锁连接上的 `query` 口" +
|
|
613
571
|
"(`LockedMigrationDb` 与 `mysqlDb` / `pgDb` 里的那一员,若届时再无别的步骤用它);`permission-rule-store-sql.ts` 的 `listRuleBucketOwners` / `isSqlBucketRefusal` / `isSqlBucketVanished` / `RuleBucketVanishedError`(取点那一句的具名类,届时若再无别的读者按类判它,收回成裸错)/ `IMPORT_RECORD_KIND`;" +
|
|
614
|
-
"`permission-rule-store-file.ts` 的 `FileRuleApprovalRecordStore.importRecordOwners`;`store-backend.ts` 的 `LocalBackend.runOneTimeMigrations` 里 M36 那一腿(规则目录在场判与那一处调用)与报告两键的那两行;" +
|
|
572
|
+
"`permission-rule-store-file.ts` 的 `FileRuleApprovalRecordStore.importRecordOwners` / `fileRuleBucketOwners` / `isFileBucketDamaged`;`store-backend.ts` 的 `LocalBackend.runOneTimeMigrations` 里 M36 那一腿(规则目录在场判与那一处调用)与报告两键的那两行;" +
|
|
615
573
|
"本文件的 `createSqlImportedLayerRootSource` 与 `importedLayerRootAllowsRetired` / `importedLayerRootBucketsSkipped`(报告 / 收据 / `changedAnything` / `readingsSnapshot` / `readingFields` / `receiptSentence` / `NO_SQL_MIGRATIONS` 的排除表)、" +
|
|
616
574
|
"`imported_layer_root_allow_retired` / `imported_layer_root_bucket_skipped` 两行 warn 与 `importedLayerRootSkipNote`、读数行 note 里的 M36 句与头注 M36 段;" +
|
|
617
575
|
"`test/imported-layer-root-retirement.test.ts`、`test/imported-layer-root-retirement-db-integration.test.ts`(连同 `scripts/db-integration-files.json` 里它那一行)与 `test/helpers/imported-layer-root-fixture.ts` 整文件。" +
|
|
@@ -632,6 +590,20 @@ export const ONE_TIME_MIGRATIONS = [
|
|
|
632
590
|
"幂等重入走 park、回决口按要人",
|
|
633
591
|
reportKeys: [],
|
|
634
592
|
},
|
|
593
|
+
{
|
|
594
|
+
id: "M38",
|
|
595
|
+
introducedIn: "7.146.0",
|
|
596
|
+
releasedOn: "2026-11-06",
|
|
597
|
+
removableAfter: "2026-12-06",
|
|
598
|
+
removal: "删 `src/stored-request-env-credentials-m38.ts` 整只文件(`storedEnvCredentialsDropM38`);" +
|
|
599
|
+
"`boot/resolve-spec.ts` 里凭据判据那一段的重放腿分支(`opts?.leg !== \"fresh\" && storedEnvCredentialsDropM38(…)` 那一臂、`withoutKeys` 那一行、`settings_env_credentials_dropped` 那一行 warn)与 `storedEnvCredentialsDropM38` / `withoutKeys` 的 import —— 判据命中改为两腿一律抛,`settingsEnv` 改回 `const`;" +
|
|
600
|
+
"`task-settings.ts` 的 `withoutKeys`(`readSettingsEnv` 一只读法、`ParseTaskSettingsSeats.settingsEnv` 座与 `resolveSpec` 两腿递它**不删**:判据与装配读同一份是常设的,不随窗走;删后 `reaching` 不再出现 `{}`,`SettingsEnvLayer` 文档里那半句一起删);" +
|
|
601
|
+
"`http/stored-body-replay.ts` 预判那一臂里的窗问(`storedEnvCredentialsDropM38(…)`,删后命中即拒)与它的 import;" +
|
|
602
|
+
"`test/settings-env-credential.test.ts` 里窗开的三格(剥键照续 / 剥空登记空表 / 预判窗开不拦)与「窗关当天仍开」那格、`withM38Window` 助手(窗关的几格改成不注入窗直接断言拒)、M38 登记行那一格;本文件头注 M38 段",
|
|
603
|
+
afterRemoval: "没有新的臂,接住它的是窗关之后的读法(删码零行为变化:窗关那一刻起剥键臂已经不生效):存体 `settings.env` 里仍带凭据条目的停驻行,续跑前的预判拒(409 `resume_blocked_by_policy`,`blockedBy: request.env_credential_refused`,机读位点名键与命中类),卡仍 pending —— " +
|
|
604
|
+
"出路是取消那条 run,把凭据挪进引擎进程环境后重新提交。会撞上它的是活过窗的升级前停驻行:发布后才升级的部署、调长了 `APPROVAL_TERMINAL_BACKSTOP_MS` 的部署、滚动升级里旧副本在窗内新写的行、窗内续跑过又停驻到窗外的任务(头注 M38 段)",
|
|
605
|
+
reportKeys: [],
|
|
606
|
+
},
|
|
635
607
|
];
|
|
636
608
|
export function migrationWindowOpen(window, today) {
|
|
637
609
|
return window.removableAfter === null || today <= window.removableAfter;
|
|
@@ -645,8 +617,6 @@ export function migrationWindowEnd(id) {
|
|
|
645
617
|
return row.removableAfter;
|
|
646
618
|
}
|
|
647
619
|
export const NO_SQL_MIGRATIONS = {
|
|
648
|
-
allowRuleShadowRowsMigrated: 0,
|
|
649
|
-
allowRuleShadowRowsUnreadable: 0,
|
|
650
620
|
workflowParkIndexKey: "file-ledger",
|
|
651
621
|
workflowParkIndexRowsCarried: 0,
|
|
652
622
|
undurableScopeRuleRows: [],
|
|
@@ -777,13 +747,6 @@ async function migrateOn(db, dialect, input) {
|
|
|
777
747
|
return completedReport(receipts);
|
|
778
748
|
}
|
|
779
749
|
async function migrateStepsOn(db, dialect, receipts, input) {
|
|
780
|
-
receipts.holderDeathCodeRowsBackfilled += await db.exec(dialect === "mysql"
|
|
781
|
-
? "UPDATE task_run SET error_code = ? WHERE status = 'failed' AND error_code IS NULL AND error = ?"
|
|
782
|
-
: "UPDATE task_run SET error_code = $1 WHERE status = 'failed' AND error_code IS NULL AND error = $2", [RUN_HOLDER_DEATH_CODES.stalled, RUN_STALLED_ERROR]);
|
|
783
|
-
receipts.holderDeathCodeRowsBackfilled += await db.exec(dialect === "mysql"
|
|
784
|
-
? "UPDATE task_run SET error_code = ? WHERE status = 'failed' AND error_code IS NULL AND (error = ? OR error LIKE ?)"
|
|
785
|
-
: "UPDATE task_run SET error_code = $1 WHERE status = 'failed' AND error_code IS NULL AND (error = $2 OR error LIKE $3)", [RUN_HOLDER_DEATH_CODES.orphaned, RUN_ORPHANED_ERROR, `${RUN_ORPHANED_ERROR} (%`]);
|
|
786
|
-
await migrateShadowedRuleKey(db, dialect, receipts);
|
|
787
750
|
await migrateRetiredCardWords(db, dialect, receipts);
|
|
788
751
|
await splitApprovalAskCauseColumns(db, dialect, receipts);
|
|
789
752
|
await reshapeWorkflowParkIndex(db, dialect, receipts);
|
|
@@ -1409,54 +1372,6 @@ async function finishParkIndexShape(db, dialect) {
|
|
|
1409
1372
|
if (typeof name === "string" && name !== conventional)
|
|
1410
1373
|
await db.exec(`ALTER TABLE ${WORKFLOW_PARK_INDEX_TABLE} RENAME CONSTRAINT ${name} TO ${conventional}`);
|
|
1411
1374
|
}
|
|
1412
|
-
const RETIRED_SHADOWED_RULE_KEY = "shadowedRule";
|
|
1413
|
-
export function migrateShadowedRuleDescriptor(text) {
|
|
1414
|
-
let parsed;
|
|
1415
|
-
try {
|
|
1416
|
-
parsed = decodeJsonColumn(text, readNonNullJsonValueColumn, "checkpoint.risk_descriptor (M8 rewrite)");
|
|
1417
|
-
}
|
|
1418
|
-
catch (error) {
|
|
1419
|
-
if (isJsonColumnBodyProblem(error))
|
|
1420
|
-
return { kind: "unreadable", error };
|
|
1421
|
-
throw error;
|
|
1422
|
-
}
|
|
1423
|
-
if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed))
|
|
1424
|
-
return { kind: "untouched" };
|
|
1425
|
-
const { [RETIRED_SHADOWED_RULE_KEY]: old, ...rest } = parsed;
|
|
1426
|
-
if (typeof old !== "string")
|
|
1427
|
-
return { kind: "untouched" };
|
|
1428
|
-
const next = Object.hasOwn(rest, "allowRuleShadowed") ? rest : { ...rest, allowRuleShadowed: [{ member: "persisted", entries: [old] }] };
|
|
1429
|
-
return { kind: "rewrite", text: JSON.stringify(next) };
|
|
1430
|
-
}
|
|
1431
|
-
const SHADOWED_RULE_BATCH = 500;
|
|
1432
|
-
async function migrateShadowedRuleKey(db, dialect, receipts) {
|
|
1433
|
-
const like = `%"${RETIRED_SHADOWED_RULE_KEY}"%`;
|
|
1434
|
-
let after = "";
|
|
1435
|
-
for (;;) {
|
|
1436
|
-
const rows = await db.rows(dialect === "mysql"
|
|
1437
|
-
? `SELECT token, ${jsonColumnText(dialect, "risk_descriptor")} FROM checkpoint WHERE ${jsonColumnTextExpr(dialect, "risk_descriptor")} LIKE ? AND token > ? ORDER BY token LIMIT ${SHADOWED_RULE_BATCH}`
|
|
1438
|
-
: `SELECT token, ${jsonColumnText(dialect, "risk_descriptor")} FROM checkpoint WHERE ${jsonColumnTextExpr(dialect, "risk_descriptor")} LIKE $1 AND token > $2 ORDER BY token LIMIT ${SHADOWED_RULE_BATCH}`, [like, after]);
|
|
1439
|
-
for (const r of rows) {
|
|
1440
|
-
const token = String(r.token);
|
|
1441
|
-
after = token;
|
|
1442
|
-
const text = r.risk_descriptor;
|
|
1443
|
-
if (typeof text !== "string")
|
|
1444
|
-
continue;
|
|
1445
|
-
const next = migrateShadowedRuleDescriptor(text);
|
|
1446
|
-
if (next.kind === "unreadable") {
|
|
1447
|
-
receipts.allowRuleShadowRowsUnreadable += 1;
|
|
1448
|
-
continue;
|
|
1449
|
-
}
|
|
1450
|
-
if (next.kind === "untouched")
|
|
1451
|
-
continue;
|
|
1452
|
-
receipts.allowRuleShadowRowsMigrated += await db.exec(dialect === "mysql"
|
|
1453
|
-
? `UPDATE checkpoint SET risk_descriptor = ? WHERE token = ? AND ${jsonColumnTextExpr(dialect, "risk_descriptor")} = ?`
|
|
1454
|
-
: `UPDATE checkpoint SET risk_descriptor = $1 WHERE token = $2 AND ${jsonColumnTextExpr(dialect, "risk_descriptor")} = $3`, [next.text, token, text]);
|
|
1455
|
-
}
|
|
1456
|
-
if (rows.length < SHADOWED_RULE_BATCH)
|
|
1457
|
-
return;
|
|
1458
|
-
}
|
|
1459
|
-
}
|
|
1460
1375
|
const RETIRED_CARD_WORD_PATTERNS = ['%"shadowed"%', '%"governance_unavailable"%'];
|
|
1461
1376
|
const RETIRED_CARD_WORD_BATCH = 500;
|
|
1462
1377
|
function decodeForM18(text, where) {
|
|
@@ -1706,9 +1621,6 @@ export async function inheritPlacedSessionOwners(db, dialect, receipts) {
|
|
|
1706
1621
|
}
|
|
1707
1622
|
function readingFields(r) {
|
|
1708
1623
|
return {
|
|
1709
|
-
holderDeathCodeRowsBackfilled: r.holderDeathCodeRowsBackfilled,
|
|
1710
|
-
allowRuleShadowRowsMigrated: r.allowRuleShadowRowsMigrated,
|
|
1711
|
-
allowRuleShadowRowsUnreadable: r.allowRuleShadowRowsUnreadable,
|
|
1712
1624
|
...(r.workflowParkIndexKey !== undefined ? { workflowParkIndexKey: r.workflowParkIndexKey } : {}),
|
|
1713
1625
|
workflowParkIndexRowsCarried: r.workflowParkIndexRowsCarried,
|
|
1714
1626
|
undurableScopeRuleRowsRemoved: r.undurableScopeRuleRows.length,
|
|
@@ -1759,11 +1671,7 @@ export function logOneTimeMigrations(log, backend, report) {
|
|
|
1759
1671
|
backend,
|
|
1760
1672
|
...readingFields(report),
|
|
1761
1673
|
removableAfter: Object.fromEntries(ONE_TIME_MIGRATIONS.map((w) => [w.id, w.removableAfter])),
|
|
1762
|
-
note: "one-time persisted-data migrations (
|
|
1763
|
-
"holder-death verdict written by an earlier version with only the sentence got the machine-readable code run.stalled / " +
|
|
1764
|
-
"run.orphaned; M7 writes nothing — it is the window of the refusal that keeps a suspended task whose stored allow list was written " +
|
|
1765
|
-
"under an earlier reading from resuming under the current one; M8: parked rows' allow-layer disclosure written by an earlier engine " +
|
|
1766
|
-
"under its old key shadowedRule rewritten to allowRuleShadowed; M9: the workflow park pointer index rebuilt with the key (session, run), " +
|
|
1674
|
+
note: "one-time persisted-data migrations (M9: the workflow park pointer index rebuilt with the key (session, run), " +
|
|
1767
1675
|
"its rows carried over; M10 writes nothing at boot — on the local backend, while its window is open, the first task submitted with a principal " +
|
|
1768
1676
|
"on a session written by an earlier version (which recorded no owner) claims that session for the principal, one session_owner_claimed line per claim; " +
|
|
1769
1677
|
"M11: persisted permission rules whose project scope root is not a complete absolute path — accepted by earlier versions, dropped on every read " +
|
|
@@ -27,9 +27,11 @@ export declare class FileRuleApprovalRecordStore implements RuleApprovalRecordSt
|
|
|
27
27
|
create(record: RuleApprovalRecord): Promise<void>;
|
|
28
28
|
cas(id: string, expectRev: number, next: RuleApprovalRecord): Promise<boolean>;
|
|
29
29
|
/**
|
|
30
|
-
* 一次性迁移 M36(窗口见 `plugins/one-time-migrations.ts` 登记表)在 File
|
|
31
|
-
*
|
|
32
|
-
* `
|
|
30
|
+
* 一次性迁移 M36(窗口见 `plugins/one-time-migrations.ts` 登记表)在 File 店的桶来源之一:本店**导入记录**点名过的每一个属主(逐条记录取、**这里不去重**:
|
|
31
|
+
* 多条记录点名同一属主就重复出现,按桶键去重在退役步)。引擎 File 分区的桶文件按属主名的单向摘要命名,桶的属主不写在文件里;File 腿读的桶集是
|
|
32
|
+
* {@link fileRuleBucketOwners} 取的并集 = 本店导入记录点名的属主 ∪ 引擎 `listBucketOwners().owners`(自 core 7.64.0 起的列桶口:本机属主那只桶与收编标记点名的身份),
|
|
33
|
+
* 所以记录不是 File 腿叫得出桶属主的唯一来源(SQL 店不经记录,直接列规则表)。引擎 `unnamedBuckets` 为什么本步不报、File 侧还剩的缺口,见 `imported-layer-root-retirement.ts` 头注「读哪些桶」。
|
|
34
|
+
* 上一形的记录(Stale 信封)读不出种类 ⇒ 属主读得出就算上(多读一只桶零写,少读一只会漏)。
|
|
33
35
|
* 损坏闸合着 ⇒ 抛(读不全记录就叫不全桶;与本面其余口同一条 fail-closed)。
|
|
34
36
|
*/
|
|
35
37
|
importRecordOwners(): Promise<RuleOwner[]>;
|
|
@@ -96,6 +98,18 @@ export declare class FileRuleImportTicketStore {
|
|
|
96
98
|
}
|
|
97
99
|
/** 三面束在数据根下的目录名(唯一一处;束在第一次装配时建它 —— 没开过规则店的数据根下没有它)。 */
|
|
98
100
|
export declare const FILE_PERMISSION_RULE_DIR = "permission-rules";
|
|
101
|
+
/**
|
|
102
|
+
* M36 File 腿读哪些桶(窗口见 `plugins/one-time-migrations.ts` 登记表;读法见 `imported-layer-root-retirement.ts` 头注「读哪些桶」):
|
|
103
|
+
* 导入记录点名过的属主 ∪ 引擎 File 分区后端列得出名字的属主(本机属主那只桶、收编标记点名的身份)。两源有重 ⇒ 退役步按桶键去重。
|
|
104
|
+
* 引擎列桶口的拒(目录用不了 `bucket_damaged`、列不出 `bucket_unreadable`、坏收编标记)原样抛 ⇒ 起服拒(叫不全桶就不判)。
|
|
105
|
+
*/
|
|
106
|
+
export declare function fileRuleBucketOwners(stores: Pick<FilePermissionRuleStores, "approvals" | "durable">): Promise<readonly RuleOwner[]>;
|
|
107
|
+
/**
|
|
108
|
+
* 这只读桶抛出物是不是引擎 File 分区的**确定性整桶拒**(拒码 `permission_rules.bucket_damaged`:同一份字节每次读都同样拒,读侧零规则、什么都不放行)。
|
|
109
|
+
* 别的都不是:`permission_rules.bucket_unreadable`(一次读失败,带 `errno`;证明不了以后也读不出)、`permission_rules.later_grammar`(更新的引擎写的桶)、
|
|
110
|
+
* 收编标记自己的拒、不带码的抛 —— 一律原样抛、起服拒。按码判,不读句子。
|
|
111
|
+
*/
|
|
112
|
+
export declare function isFileBucketDamaged(e: unknown): boolean;
|
|
99
113
|
/** local 车道的三面束 + 生命周期。`dispose()` 释放 core File durable 分区 provider 的写锁(见 {@link createFilePermissionRuleStores})。 */
|
|
100
114
|
export interface FilePermissionRuleStores extends PermissionRuleStoreBundle {
|
|
101
115
|
durable: FileDurableRulePartitionProvider;
|
|
@@ -2,7 +2,7 @@ import { join } from "node:path";
|
|
|
2
2
|
import { randomUUID } from "node:crypto";
|
|
3
3
|
import { readdirSync } from "node:fs";
|
|
4
4
|
import { performance } from "node:perf_hooks";
|
|
5
|
-
import { FileDurableRulePartitionProvider, AppendLog, ensureDir, } from "@sema-agent/core";
|
|
5
|
+
import { FileDurableRulePartitionProvider, PERMISSION_RULES_DAMAGED_BUCKET_CODE, AppendLog, ensureDir, } from "@sema-agent/core";
|
|
6
6
|
import { z } from "zod";
|
|
7
7
|
import { DurableRuleScopeSchema, IMPORT_RECORD_KIND, RuleOfferColumn, buildRulePayloadHash, recordOwnerOf, refusedOwnerSentence } from "./permission-rule-store-sql.js";
|
|
8
8
|
import { replayJsonlGuarded } from "../observability/corrupt-read-seat.js";
|
|
@@ -332,6 +332,13 @@ export class FileRuleImportTicketStore {
|
|
|
332
332
|
}
|
|
333
333
|
}
|
|
334
334
|
export const FILE_PERMISSION_RULE_DIR = "permission-rules";
|
|
335
|
+
export async function fileRuleBucketOwners(stores) {
|
|
336
|
+
const listed = stores.durable.listBucketOwners();
|
|
337
|
+
return [...(await stores.approvals.importRecordOwners()), ...listed.owners];
|
|
338
|
+
}
|
|
339
|
+
export function isFileBucketDamaged(e) {
|
|
340
|
+
return typeof e === "object" && e !== null && e.code === PERMISSION_RULES_DAMAGED_BUCKET_CODE;
|
|
341
|
+
}
|
|
335
342
|
export function createFilePermissionRuleStores(root, opts) {
|
|
336
343
|
const dir = join(root, FILE_PERMISSION_RULE_DIR);
|
|
337
344
|
ensureDir(dir);
|
package/dist/plugins/pg-pool.js
CHANGED
|
@@ -3,7 +3,7 @@ import { recordFailOpen } from "../observability/fail-open.js";
|
|
|
3
3
|
import { pollUntilLocked } from "./ensure-schema-lock-policy.js";
|
|
4
4
|
import { RUN_IDENTITY_COLUMNS } from "../identity-source.js";
|
|
5
5
|
import { ensureSchema as ensureSessionSchema } from "./pg-session-storage.js";
|
|
6
|
-
import { ensureSchema as ensureToolResultSchema } from "
|
|
6
|
+
import { ensureSchema as ensureToolResultSchema } from "../stores-sql/tool-result-store-sql.js";
|
|
7
7
|
import { ensureSchema as ensureCostQuotaSchema } from "./pg-cost-quota.js";
|
|
8
8
|
import { ensureSchema as ensureRateLimitSchema } from "./pg-rate-limiter.js";
|
|
9
9
|
import { ensureSchema as ensureBreakerStateSchema } from "./breaker-state-sql.js";
|