@sema-agent/server 7.52.0 → 7.53.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 (328) hide show
  1. package/USAGE.md +22 -5
  2. package/dist/adoption/plan.d.ts +3 -3
  3. package/dist/adoption/quiesce.d.ts +1 -1
  4. package/dist/adoption/sql.d.ts +2 -2
  5. package/dist/adoption/wire.d.ts +1 -1
  6. package/dist/approval-ask-machine.d.ts +2 -2
  7. package/dist/approval-card.d.ts +18 -18
  8. package/dist/approval-deny-reasons.d.ts +1 -1
  9. package/dist/approval-hmac.d.ts +2 -2
  10. package/dist/approval-reconciler.d.ts +14 -14
  11. package/dist/approval.d.ts +2 -2
  12. package/dist/audit.d.ts +4 -4
  13. package/dist/auth-keys.d.ts +6 -6
  14. package/dist/bench/l8/artifact.d.ts +6 -1
  15. package/dist/bench/l8/artifact.js +2 -27
  16. package/dist/bench/l8/escape.d.ts +3 -3
  17. package/dist/bench/l8/index.d.ts +1 -1
  18. package/dist/bench/s1/arms.d.ts +3 -3
  19. package/dist/bench/s1/oracle.d.ts +2 -2
  20. package/dist/bench/s1/reviewer.d.ts +1 -1
  21. package/dist/bench/s1/row.d.ts +5 -5
  22. package/dist/bench/s1/runner-ctx.d.ts +3 -3
  23. package/dist/boot/config-center.d.ts +14 -7
  24. package/dist/boot/config-center.js +2 -0
  25. package/dist/boot/coordinators.d.ts +4 -4
  26. package/dist/boot/crash-last.d.ts +1 -1
  27. package/dist/boot/device-lane.d.ts +3 -3
  28. package/dist/boot/device-lane.js +2 -0
  29. package/dist/boot/engine-lease.d.ts +4 -4
  30. package/dist/boot/governance-seams.d.ts +5 -5
  31. package/dist/boot/leader.d.ts +5 -5
  32. package/dist/boot/limit-sync.d.ts +1 -1
  33. package/dist/boot/memory-boundary.d.ts +5 -5
  34. package/dist/boot/memory-consolidation.d.ts +8 -2
  35. package/dist/boot/memory-consolidation.js +1 -0
  36. package/dist/boot/org-memory.d.ts +5 -5
  37. package/dist/boot/parked-revive-gate.d.ts +6 -6
  38. package/dist/boot/permission-rules-audit.d.ts +2 -2
  39. package/dist/boot/reapers.d.ts +8 -8
  40. package/dist/boot/resolve-spec.d.ts +4 -4
  41. package/dist/boot/retention-lane.d.ts +1 -1
  42. package/dist/boot/runner-deps.d.ts +33 -27
  43. package/dist/boot/runner-deps.js +2 -1
  44. package/dist/boot/runtime-caps.d.ts +4 -4
  45. package/dist/boot/session-faces.d.ts +1 -1
  46. package/dist/boot/shutdown.d.ts +10 -10
  47. package/dist/boot/side-query-lane.d.ts +14 -14
  48. package/dist/boot/stores.js +5 -0
  49. package/dist/boot/task-list-lane.d.ts +3 -3
  50. package/dist/boot/webfetch-summarize-lane.d.ts +9 -9
  51. package/dist/boot/workflow-orchestration.d.ts +1 -1
  52. package/dist/bounded-session-map.d.ts +1 -1
  53. package/dist/brain.d.ts +3 -3
  54. package/dist/budget.d.ts +3 -3
  55. package/dist/canonical-json.d.ts +53 -0
  56. package/dist/canonical-json.js +48 -0
  57. package/dist/capabilities/center-prompts.d.ts +13 -13
  58. package/dist/capabilities/collab-workflows.d.ts +1 -1
  59. package/dist/capabilities/hands-lane.d.ts +4 -4
  60. package/dist/capabilities/memory-notice.d.ts +4 -4
  61. package/dist/capabilities/prompt.d.ts +2 -2
  62. package/dist/capabilities/sandbox-file-send.d.ts +2 -2
  63. package/dist/capabilities/scenarios.d.ts +16 -16
  64. package/dist/capabilities/skills.d.ts +1 -1
  65. package/dist/capabilities/team.d.ts +3 -3
  66. package/dist/capabilities/tool-defer.d.ts +6 -6
  67. package/dist/config-catalog.d.ts +139 -0
  68. package/dist/config-catalog.js +556 -0
  69. package/dist/config-center/apply-effective.d.ts +20 -7
  70. package/dist/config-center/apply-effective.js +45 -0
  71. package/dist/config-center/apply-ledger.d.ts +6 -6
  72. package/dist/config-center/facade.d.ts +3 -2
  73. package/dist/config-center/hot-keys-registry.d.ts +2 -2
  74. package/dist/config-center/http-client.d.ts +5 -5
  75. package/dist/config-center/mcp-revocation.d.ts +6 -4
  76. package/dist/config-center/mcp-revocation.js +2 -12
  77. package/dist/config-center/restart-signal.d.ts +11 -1
  78. package/dist/config-center/restart-signal.js +1 -1
  79. package/dist/config-center/skills-mcp.d.ts +2 -2
  80. package/dist/config-center/stage-limits.d.ts +3 -3
  81. package/dist/config-center/types.d.ts +23 -19
  82. package/dist/config-invariants.d.ts +1 -1
  83. package/dist/config-provider.d.ts +2 -2
  84. package/dist/config-types.d.ts +157 -134
  85. package/dist/config.d.ts +32 -24
  86. package/dist/config.js +48 -6
  87. package/dist/degenerate-instrument.d.ts +1 -1
  88. package/dist/deployment-governance.d.ts +13 -13
  89. package/dist/device-store.d.ts +2 -2
  90. package/dist/device-ws-hub.d.ts +6 -4
  91. package/dist/device-ws-hub.js +9 -3
  92. package/dist/device-ws-protocol.d.ts +3 -3
  93. package/dist/digest-form.d.ts +1 -1
  94. package/dist/elicitation.d.ts +1 -1
  95. package/dist/env-facts.d.ts +7 -7
  96. package/dist/execution-lane-caps.d.ts +5 -5
  97. package/dist/fleet/fleet-bus.d.ts +56 -53
  98. package/dist/fleet/fleet-reconciler.d.ts +2 -2
  99. package/dist/fleet/fleet-terminal-window.d.ts +1 -1
  100. package/dist/fleet/subagent-tail-bus.d.ts +3 -3
  101. package/dist/fleet-client.d.ts +3 -3
  102. package/dist/fleet-lease.d.ts +1 -1
  103. package/dist/hooks/branch-transcript.d.ts +2 -2
  104. package/dist/hooks/cc-agent-hook-prompt.d.ts +2 -2
  105. package/dist/hooks/cc-stop-prompt.d.ts +2 -2
  106. package/dist/hooks/hook-llm.d.ts +1 -1
  107. package/dist/hooks/hook-runner.d.ts +12 -5
  108. package/dist/http/active-run-conflict.d.ts +31 -33
  109. package/dist/http/active-run-conflict.js +4 -2
  110. package/dist/http/route-ctx.d.ts +23 -21
  111. package/dist/http/routes/a2a-serve.d.ts +2 -2
  112. package/dist/http/routes/admin-config-refresh.d.ts +1 -1
  113. package/dist/http/routes/admin-drain.d.ts +4 -4
  114. package/dist/http/routes/admin-memory-optout.d.ts +5 -5
  115. package/dist/http/routes/adoption.d.ts +1 -1
  116. package/dist/http/routes/agents-roster.d.ts +1 -1
  117. package/dist/http/routes/approvals-assistant.d.ts +6 -6
  118. package/dist/http/routes/approvals-assistant.js +4 -1
  119. package/dist/http/routes/capabilities.d.ts +1 -1
  120. package/dist/http/routes/capabilities.js +1 -0
  121. package/dist/http/routes/config-catalog.d.ts +28 -0
  122. package/dist/http/routes/config-catalog.js +42 -0
  123. package/dist/http/routes/diagnostics.d.ts +2 -2
  124. package/dist/http/routes/fleet.d.ts +1 -1
  125. package/dist/http/routes/images.d.ts +1 -1
  126. package/dist/http/routes/leader.d.ts +1 -1
  127. package/dist/http/routes/memory-bundle.d.ts +4 -4
  128. package/dist/http/routes/memory-bundle.js +2 -3
  129. package/dist/http/routes/memory-compliance.d.ts +7 -7
  130. package/dist/http/routes/memory-consolidation.d.ts +1 -1
  131. package/dist/http/routes/memory-origin.d.ts +9 -9
  132. package/dist/http/routes/memory-policy.d.ts +3 -3
  133. package/dist/http/routes/notify-wake.d.ts +1 -1
  134. package/dist/http/routes/observability.d.ts +1 -1
  135. package/dist/http/routes/retention-ops.d.ts +1 -1
  136. package/dist/http/routes/rules.d.ts +3 -3
  137. package/dist/http/routes/run-memory-capture.d.ts +1 -1
  138. package/dist/http/routes/runs.d.ts +3 -3
  139. package/dist/http/routes/runs.js +12 -17
  140. package/dist/http/routes/session-sync.d.ts +2 -2
  141. package/dist/http/routes/sessions-list.d.ts +1 -1
  142. package/dist/http/routes/sessions.d.ts +9 -1
  143. package/dist/http/routes/sessions.js +61 -1
  144. package/dist/http/routes/shared-memory.d.ts +1 -1
  145. package/dist/http/routes/side-query.d.ts +1 -1
  146. package/dist/http/routes/tasks.d.ts +1 -1
  147. package/dist/http/routes/trace-usage.d.ts +1 -1
  148. package/dist/http/routes/workflows.d.ts +1 -1
  149. package/dist/http/run-meta.d.ts +1 -1
  150. package/dist/http/send.d.ts +6 -6
  151. package/dist/http/server.d.ts +84 -67
  152. package/dist/http/server.js +25 -12
  153. package/dist/http/sse-lifecycle.d.ts +1 -1
  154. package/dist/http/sse-log.d.ts +6 -6
  155. package/dist/http/verify-rounds.d.ts +3 -3
  156. package/dist/http/wire-gate.d.ts +2 -2
  157. package/dist/http/wire-types.d.ts +38 -38
  158. package/dist/key-resolver.d.ts +1 -1
  159. package/dist/leader/diffout.d.ts +2 -2
  160. package/dist/leader/diffup.d.ts +1 -1
  161. package/dist/leader/endpoint.d.ts +1 -1
  162. package/dist/leader/fanout.d.ts +6 -6
  163. package/dist/leader/grader-env-factory.d.ts +1 -1
  164. package/dist/leader/leader.d.ts +12 -12
  165. package/dist/leader/merge.d.ts +3 -3
  166. package/dist/leader/planner.d.ts +5 -5
  167. package/dist/leader/repair-oracle.d.ts +1 -1
  168. package/dist/leader/wire.d.ts +9 -9
  169. package/dist/lsp/manager.d.ts +2 -2
  170. package/dist/lsp/types.d.ts +1 -1
  171. package/dist/lsp/ws-transport.d.ts +2 -2
  172. package/dist/main.js +13 -2
  173. package/dist/mcp-content-origin.d.ts +1 -1
  174. package/dist/memory-bundle-engine.d.ts +5 -3
  175. package/dist/memory-bundle-engine.js +2 -2
  176. package/dist/memory-operator-faces.d.ts +41 -11
  177. package/dist/memory-operator-faces.js +12 -0
  178. package/dist/memory-origin-fence.d.ts +20 -35
  179. package/dist/memory-origin-fence.js +41 -1
  180. package/dist/memory-posture.d.ts +6 -6
  181. package/dist/memory-scope.d.ts +7 -7
  182. package/dist/model-select.d.ts +5 -5
  183. package/dist/observability/cost-quota.d.ts +6 -6
  184. package/dist/observability/cost-taxonomy.d.ts +2 -2
  185. package/dist/observability/fail-open.d.ts +1 -5
  186. package/dist/observability/fail-open.js +0 -4
  187. package/dist/observability/metrics.d.ts +1 -1
  188. package/dist/observability/prompt-manifest.d.ts +8 -8
  189. package/dist/observability/rate-limit.d.ts +2 -2
  190. package/dist/observability/secret-env-scrub.d.ts +1 -1
  191. package/dist/observability/tool-trace.d.ts +1 -1
  192. package/dist/orchestration/hardened-vm-runner.d.ts +6 -6
  193. package/dist/orchestration/hardened-vm-worker-runner.d.ts +1 -1
  194. package/dist/orchestration/subagent-steer.d.ts +3 -3
  195. package/dist/orchestration/workflow-agent-steer.d.ts +1 -1
  196. package/dist/orchestration/workflow-completion-inbox.d.ts +6 -6
  197. package/dist/orchestration/workflow-notify-journal.d.ts +6 -6
  198. package/dist/parent-watch.d.ts +1 -1
  199. package/dist/parked-decide.d.ts +11 -11
  200. package/dist/plan-cache-probe.d.ts +1 -1
  201. package/dist/plugins/adoption-log-sql.d.ts +4 -4
  202. package/dist/plugins/approval-ask-store-memory.d.ts +1 -1
  203. package/dist/plugins/approval-ask-store-memory.js +12 -0
  204. package/dist/plugins/approval-ask-store-sql.d.ts +39 -17
  205. package/dist/plugins/approval-ask-store-sql.js +23 -6
  206. package/dist/plugins/approval-payload-fingerprint.d.ts +23 -0
  207. package/dist/plugins/approval-payload-fingerprint.js +23 -0
  208. package/dist/plugins/background-agent-store-sql.d.ts +8 -8
  209. package/dist/plugins/background-shell-support.d.ts +12 -12
  210. package/dist/plugins/blob-backend.d.ts +3 -3
  211. package/dist/plugins/breaker-state-sql.d.ts +3 -3
  212. package/dist/plugins/caching-session-store.d.ts +6 -6
  213. package/dist/plugins/checkpoint-store-sql.d.ts +162 -66
  214. package/dist/plugins/checkpoint-store-sql.js +76 -33
  215. package/dist/plugins/device-store-sql.d.ts +4 -3
  216. package/dist/plugins/e2b-orphan-reclaim.d.ts +3 -3
  217. package/dist/plugins/file-history-store-sql.d.ts +9 -8
  218. package/dist/plugins/file-run-store.d.ts +27 -27
  219. package/dist/plugins/fork-routing-session-store.d.ts +9 -9
  220. package/dist/plugins/image-bake-store-sql.d.ts +1 -1
  221. package/dist/plugins/image-index-sql.d.ts +2 -2
  222. package/dist/plugins/k8s-bg-scripts.d.ts +1 -1
  223. package/dist/plugins/k8s-exec-protocol.d.ts +1 -1
  224. package/dist/plugins/leader-run-store-sql.d.ts +1 -1
  225. package/dist/plugins/local-checkpoint-store.d.ts +26 -17
  226. package/dist/plugins/local-checkpoint-store.js +21 -11
  227. package/dist/plugins/local-session-store.d.ts +5 -5
  228. package/dist/plugins/mailbox-store-sql.d.ts +6 -6
  229. package/dist/plugins/memory-embedder-fingerprint.d.ts +2 -2
  230. package/dist/plugins/memory-engine-pg.d.ts +1 -1
  231. package/dist/plugins/memory-engine-tidb.d.ts +1 -1
  232. package/dist/plugins/memory-key-guards.d.ts +3 -3
  233. package/dist/plugins/memory-optout-grant-store-sql.d.ts +10 -10
  234. package/dist/plugins/memory-origin-law.d.ts +13 -13
  235. package/dist/plugins/memory-run-store.d.ts +12 -12
  236. package/dist/plugins/outcome-ledger-sql.d.ts +3 -3
  237. package/dist/plugins/permission-rule-store-file.d.ts +3 -3
  238. package/dist/plugins/permission-rule-store-sql.d.ts +38 -33
  239. package/dist/plugins/permission-rule-store-sql.js +7 -12
  240. package/dist/plugins/pg-cost-quota.d.ts +2 -2
  241. package/dist/plugins/pg-pool.js +5 -0
  242. package/dist/plugins/pg-query.d.ts +1 -1
  243. package/dist/plugins/pg-rate-limiter.d.ts +2 -2
  244. package/dist/plugins/pg-session-storage.d.ts +9 -9
  245. package/dist/plugins/remote-env-adb.d.ts +1 -1
  246. package/dist/plugins/remote-env-device.d.ts +2 -2
  247. package/dist/plugins/remote-env-e2b.d.ts +11 -11
  248. package/dist/plugins/remote-env-file-error.d.ts +2 -2
  249. package/dist/plugins/remote-env-host.d.ts +10 -10
  250. package/dist/plugins/remote-env-k8s.d.ts +7 -7
  251. package/dist/plugins/remote-env-local-docker.d.ts +1 -1
  252. package/dist/plugins/remote-env-ssh.d.ts +9 -9
  253. package/dist/plugins/remote-scratchpad.d.ts +1 -1
  254. package/dist/plugins/resume-anchor-store-sql.d.ts +1 -1
  255. package/dist/plugins/retention-lane-store-sql.d.ts +2 -2
  256. package/dist/plugins/retention-store-sql.d.ts +11 -11
  257. package/dist/plugins/roster-store-sql.d.ts +5 -5
  258. package/dist/plugins/run-store-sql.d.ts +12 -12
  259. package/dist/plugins/scheduler-support.d.ts +1 -1
  260. package/dist/plugins/send-user-file.d.ts +1 -1
  261. package/dist/plugins/session-capture-record-store-sql.d.ts +99 -0
  262. package/dist/plugins/session-capture-record-store-sql.js +110 -0
  263. package/dist/plugins/session-placement.d.ts +1 -1
  264. package/dist/plugins/session-policy-store-sql.d.ts +2 -2
  265. package/dist/plugins/session-store.d.ts +3 -3
  266. package/dist/plugins/shared-memory-store-sql.d.ts +5 -5
  267. package/dist/plugins/sql-driver.d.ts +7 -7
  268. package/dist/plugins/sql-errors.d.ts +2 -2
  269. package/dist/plugins/sql-escape.d.ts +1 -1
  270. package/dist/plugins/sql-row-helpers.d.ts +1 -1
  271. package/dist/plugins/store-backend.d.ts +32 -19
  272. package/dist/plugins/store-backend.js +4 -0
  273. package/dist/plugins/store-contracts.d.ts +9 -9
  274. package/dist/plugins/task-list-store-sql.d.ts +3 -3
  275. package/dist/plugins/tidb-cost-quota.d.ts +3 -3
  276. package/dist/plugins/tidb-pool.js +9 -0
  277. package/dist/plugins/tidb-rate-limiter.d.ts +2 -2
  278. package/dist/plugins/tidb-session-storage.d.ts +2 -2
  279. package/dist/plugins/tidb-session-store.d.ts +11 -11
  280. package/dist/plugins/tool-result-store-sql.d.ts +8 -8
  281. package/dist/plugins/usage-window-store-sql.d.ts +3 -3
  282. package/dist/plugins/web-search.d.ts +7 -7
  283. package/dist/plugins/workflow-journal-store-sql.d.ts +6 -6
  284. package/dist/plugins/workflow-run-store-sql.d.ts +1 -1
  285. package/dist/plugins/write-behind-counter.d.ts +6 -6
  286. package/dist/principal-jwt.d.ts +2 -2
  287. package/dist/project-memory.d.ts +1 -1
  288. package/dist/prompts-domain-validate.d.ts +8 -8
  289. package/dist/question.d.ts +3 -3
  290. package/dist/resource-suspend.d.ts +4 -4
  291. package/dist/resource-window.d.ts +3 -3
  292. package/dist/router/route-orchestration.d.ts +1 -1
  293. package/dist/rules-consent.d.ts +48 -40
  294. package/dist/run-local.d.ts +5 -5
  295. package/dist/run-local.js +28 -4
  296. package/dist/runs.d.ts +19 -19
  297. package/dist/runtime-caps-resolver.d.ts +6 -6
  298. package/dist/runtime-governance.d.ts +7 -7
  299. package/dist/security.d.ts +13 -13
  300. package/dist/session-leaf-bus.d.ts +1 -1
  301. package/dist/session-sync-content.d.ts +4 -4
  302. package/dist/session-sync-kernel.d.ts +2 -2
  303. package/dist/session-sync.d.ts +13 -13
  304. package/dist/session-titler.d.ts +1 -1
  305. package/dist/session-watch.d.ts +3 -3
  306. package/dist/shared-memory-scope-authorizer.d.ts +4 -4
  307. package/dist/sighup-idle.d.ts +1 -1
  308. package/dist/spec-fields.d.ts +20 -20
  309. package/dist/ssh-host-key.d.ts +5 -5
  310. package/dist/store-live-probe.d.ts +2 -2
  311. package/dist/task-cwd.d.ts +11 -11
  312. package/dist/task-mcp.d.ts +5 -5
  313. package/dist/task-settings.d.ts +35 -35
  314. package/dist/task-workflow.d.ts +3 -3
  315. package/dist/text-bidi.d.ts +1 -1
  316. package/dist/tool-approval.d.ts +171 -160
  317. package/dist/tool-approval.js +33 -28
  318. package/dist/trace/core-keyset-guard.d.ts +21 -7
  319. package/dist/trace/engine-notice-wire.d.ts +6 -6
  320. package/dist/trace/injection-tier.d.ts +2 -2
  321. package/dist/trace/ledger-events.d.ts +3 -3
  322. package/dist/trace/ledger-sink.d.ts +7 -7
  323. package/dist/trace/project.d.ts +35 -30
  324. package/dist/trace/project.js +9 -0
  325. package/dist/turn-activity.d.ts +4 -4
  326. package/dist/usage-analytics.d.ts +1 -1
  327. package/dist/wall-clock-jump-guard.d.ts +3 -3
  328. package/package.json +6 -6
@@ -4,7 +4,7 @@ import { type CardRulePersisted, type RuleConsentLane } from "./rules-consent.js
4
4
  import { type RuleOffersAbsence, type ApprovalRequestFrame, type ApprovalRevokeFrame, type RuleEvidenceProjection } from "./approval-card.js";
5
5
  import type { ApprovalAskStore } from "./plugins/approval-ask-store-sql.js";
6
6
  import { type GovernanceAskMarks } from "./governance-ask-marks.js";
7
- /** A-002.1:审批 gate kind 闭集(core gateMatch 的 `human`/`irreversible_ask` ↔ outcome.gate "policy_ask")。
7
+ /** [ref]:审批 gate kind 闭集(core gateMatch 的 `human`/`irreversible_ask` ↔ outcome.gate "policy_ask")。
8
8
  * 此前 7 份手写副本散在两只 checkpoint store 的数组/SQL 字面与 /decide 守卫——core 加审批味 kind 时
9
9
  * 全部静默漂移。core 无导出词表(全大写导出面零命中,2026-08-09 亲验),属主落此;SQL IN 片段从
10
10
  * 数组派生保证同源。门=test/approval-gate-kinds-single-owner.test.ts(副本回潮即红)。 */
@@ -14,14 +14,14 @@ export declare function isApprovalGateKind(k: string | undefined): k is Approval
14
14
  /** 两方言同形的 SQL IN 片段(值为闭集常量字面,无注入面)。 */
15
15
  export declare const APPROVAL_GATE_KINDS_SQL_IN: string;
16
16
  /**
17
- * 🔴 S-43(案A)追记 F6 —— durable 回决口(`POST /v1/tasks/:taskId/asks/:askId/decision`)的 **200 体
17
+ * 🔴 [ref](案A)追记 F6 —— durable 回决口(`POST /v1/tasks/:taskId/asks/:askId/decision`)的 **200 体
18
18
  * additive 判别位**:这次决议在**本副本**上有没有被一条活着的腿消费掉。
19
19
  *
20
20
  * 值只有一个词(`"absent"`),因为只有 absent 这一面需要披露:在场 = 「行判了,但本机没有任何东西
21
21
  * 因此续跑」。反面(真被消费)不铸键 —— additive 只记真,与 `updatedInputForwarded`/`decisionNote`
22
22
  * 的先例逐字同族。**缺席禁读作「有消费者」的证明**:老版本 server 从不发这个键。
23
23
  *
24
- * 成因三形(S-43 复审件3 补第三形):①持有悬挂 promise 的是**另一个副本**;②本副本重启后本地窗已空;
24
+ * 成因三形([ref] 复审件3 补第三形):①持有悬挂 promise 的是**另一个副本**;②本副本重启后本地窗已空;
25
25
  * ③**弃单墓碑守卫把素批准翻成 park**({@link ToolApprovalCoordinator.guardRowDerivedApprove}:本地腿
26
26
  * 在场,但没有一条把这次 approve 当**放行**消费 —— 它们全部收成 park,人须经 durable 门再兑)。
27
27
  * 三形的处置同一句:壳读 run 面判续跑没有,绝不把 200 无键当成「run 已续跑」的证明。
@@ -35,9 +35,9 @@ export declare const APPROVAL_GATE_KINDS_SQL_IN: string;
35
35
  */
36
36
  export declare const ASK_DECISION_CONSUMER_ABSENT = "absent";
37
37
  /**
38
- * #329 §三 PARKED 臂:把一条已 park 的 ask 的决议交给**既有赎回腿**所需的全部材料。
38
+ * [ref] §三 PARKED 臂:把一条已 park 的 ask 的决议交给**既有赎回腿**所需的全部材料。
39
39
  *
40
- * 🔴 契约锚([4872] 锚①):本席是「同腿新调用方,零新终局语义」—— 决议必须走 checkpoint 的 decide
40
+ * 🔴 契约锚([ref] 锚①):本席是「同腿新调用方,零新终局语义」—— 决议必须走 checkpoint 的 decide
41
41
  * CAS(单赢者),席的实现**绝不**在 ask 行上另开第二个终局写点。gate 三坐标是 `bindBatch` 从
42
42
  * checkpoint 抄回行上的那一份,server 永不重算(绑定校验归 core 的 resume 侧,与 `/decide` 腿同姿势)。
43
43
  */
@@ -50,9 +50,9 @@ export interface ParkedAskRedeemRequest {
50
50
  gateBoundInputHash: string | null;
51
51
  /** wire 三选一映行上的二值(`allow`/`allow_session` ⇒ `approve`)。 */
52
52
  decision: "approve" | "deny";
53
- /** #229 同源的人写理由(deny 时 core 把它交给模型;allow 只进审计面)。 */
53
+ /** [ref] 同源的人写理由(deny 时 core 把它交给模型;allow 只进审计面)。 */
54
54
  note?: string;
55
- /** [1458] ctrl+g 编辑放行的实参整体替换(approve 才有意义)。 */
55
+ /** [ref] ctrl+g 编辑放行的实参整体替换(approve 才有意义)。 */
56
56
  updatedInput?: unknown;
57
57
  /** 发起本次 respond 的**已验证**调用方(live 腿 `gatedPrincipal` 的那一把)。席在赎回之前拿它与
58
58
  * **checkpoint 当下的 scope** 对一次(codex R1-[high] 一:收编改写身份之后,任何缓存的属主判据都
@@ -62,7 +62,7 @@ export interface ParkedAskRedeemRequest {
62
62
  * 缺席 ⇒ 那条腿按「无请求」形处置(它自己的成文语义,本席不替它决定)。 */
63
63
  httpReq?: IncomingMessage;
64
64
  }
65
- /** #329:赎回席(装配层注入;缺席 ⇒ PARKED 臂逐字回落修前 404)。回的是赎回腿的原始 HTTP 结果面。 */
65
+ /** [ref]:赎回席(装配层注入;缺席 ⇒ PARKED 臂逐字回落修前 404)。回的是赎回腿的原始 HTTP 结果面。 */
66
66
  export type ParkedAskRedeem = (req: ParkedAskRedeemRequest) => Promise<{
67
67
  status: number;
68
68
  body: Record<string, unknown>;
@@ -75,7 +75,7 @@ export interface ToolApprovalFrame {
75
75
  approvalId: string;
76
76
  /** "tool_approval" only: which tool asked (canonical core name as core sent it) + the policy's ask message. */
77
77
  toolName?: string;
78
- /** [1939] "tool_approval" only: **core 的 tool-call id**(`AskRequest.toolCallId`,逐字透传)——消费端用它
78
+ /** [ref] "tool_approval" only: **core 的 tool-call id**(`AskRequest.toolCallId`,逐字透传)——消费端用它
79
79
  * 把审批卡锚到助手消息里那个 `tool_use` 块。`approvalId` 是审批自己的新 uuidv7、与该块**无关**,
80
80
  * 此前帧上只有它 ⇒ 两个宿主都只能拿它当 key 铸卡,而那个 id 之后再没有任何帧提到过,卡永远停在
81
81
  * awaiting_approval。「拿最近一次 tool_start 当锚」这类补偿也不成立:**审批帧比 `tool_start` 先到**
@@ -84,18 +84,18 @@ export interface ToolApprovalFrame {
84
84
  * 多一个锚只会多一份歧义。 */
85
85
  toolCallId?: string;
86
86
  /** **只在委派子代的 ask 上在场**(现判别键 = {@link ToolApprovalFrame.fromSubagent};本字段本身
87
- * [1546] MED-1 后不再是判别式,core JSDoc 钉明「不是子代判别键」)。值 = 子代的 core session id
87
+ * [ref] MED-1 后不再是判别式,core JSDoc 钉明「不是子代判别键」)。值 = 子代的 core session id
88
88
  * (与 task_progress.taskId / bg_notification.sessionId 同值域,可关联子代行)。旧壳(< fromSubagent
89
89
  * 接线)兜底按在场性渲染归属标仍然正确。 */
90
90
  sourceTaskId?: string;
91
- /** [1550] RB-39②:core 1.378 显式判别键——委派子代 gate 发起的 ask 恒带 `true`,受信 internals 事实
92
- * (worker 不可自造/不可抑制)。取代 [1546] MED-1 的「在场 ∧ ≠ 宿主 sessionId」权宜判别式。 */
91
+ /** [ref] [ref]②:core 1.378 显式判别键——委派子代 gate 发起的 ask 恒带 `true`,受信 internals 事实
92
+ * (worker 不可自造/不可抑制)。取代 [ref] MED-1 的「在场 ∧ ≠ 宿主 sessionId」权宜判别式。 */
93
93
  fromSubagent?: true;
94
- /** [1550] 展示身份(子代 agent 名)——UNTRUSTED-for-display(core 未做秘密脱敏)→ redactSecrets 后渲。
94
+ /** [ref] 展示身份(子代 agent 名)——UNTRUSTED-for-display(core 未做秘密脱敏)→ redactSecrets 后渲。
95
95
  * 仅子代 ask 上可能在场(core 未必总能解析出名字)。 */
96
96
  sourceAgentName?: string;
97
- /** core 5.9.0 W1([2535]):审批上浮的出处链——{parentToolCallId, depth, agentName?}(孙代最内层帧
98
- * 胜出)。只读展示增强(cli [2516] 验收形=审批卡带子代出处);agentName UNTRUSTED → redactSecrets。
97
+ /** core 5.9.0 W1([ref]):审批上浮的出处链——{parentToolCallId, depth, agentName?}(孙代最内层帧
98
+ * 胜出)。只读展示增强(cli [ref] 验收形=审批卡带子代出处);agentName UNTRUSTED → redactSecrets。
99
99
  * 只在子代 ask 上在场(与 fromSubagent 同门)。 */
100
100
  delegation?: {
101
101
  parentToolCallId: string;
@@ -104,10 +104,10 @@ export interface ToolApprovalFrame {
104
104
  };
105
105
  message?: string;
106
106
  /**
107
- * [2942]/[2943] **ADDITIVE**,`"tool_approval"` only —— `true` ⇔ 这只 ask 的门来自**运维治理层**
107
+ * [ref]/[ref] **ADDITIVE**,`"tool_approval"` only —— `true` ⇔ 这只 ask 的门来自**运维治理层**
108
108
  * (`AUTONOMY` / `commandPolicy` / `MANUAL_MODE_SHELL_GATE` / `SENSITIVE_WRITE_PATTERNS` 合成的那条
109
109
  * policy,`applyRuntimeGovernance`),而不是模型默认门或客户端表态。壳据此渲染「治理强制」徽标,回答
110
- * [3031]#1/[3038] 实证的那个 UX 缺口:「我都开 bypassPermissions 了为什么还在问」。
110
+ * [ref]#1/[ref] 实证的那个 UX 缺口:「我都开 bypassPermissions 了为什么还在问」。
111
111
  *
112
112
  * 🔴 **缺席 ≠ `false`**:本键**只在为真时在场**,缺席的含义是「没有治理来源的证据」——既覆盖真正的
113
113
  * 非治理 ask(如 `APPROVAL_REQUIRE` 显式列名),也覆盖判据够不着的形(如治理层 shellGate 停在
@@ -116,15 +116,15 @@ export interface ToolApprovalFrame {
116
116
  * `governance-ask-marks.ts` 顶注。
117
117
  */
118
118
  governanceForced?: true;
119
- /** #283([4390]③/[4392];**ADDITIVE**,`"tool_approval"` only)——core PreToolUse hook/策略族铸的
119
+ /** [ref]([ref]③/[ref];**ADDITIVE**,`"tool_approval"` only)——core PreToolUse hook/策略族铸的
120
120
  * **安全类 ask 出身位**(`AskRequest.requiresRealApproval`,core 5.37 起可选、真才带)。帧顶层契约与
121
121
  * core 侧同构:**真才带,缺席绝不编 false**(governanceForced 同形)——与 `card.requiresRealApproval`
122
122
  * (approval-card.ts,恒在布尔)**两侧契约刻意不同、别混**:卡是 durable 店形(askStore 在场)专属,
123
- * 本键让 live-only 部署(店缺席、帧无卡)也能读到出身位;安全类标记不得依赖店在场([4392] 结构性
123
+ * 本键让 live-only 部署(店缺席、帧无卡)也能读到出身位;安全类标记不得依赖店在场([ref] 结构性
124
124
  * 缺口成文)。消费语义(cli 挂点已预埋):在场 ⇒ 一切自动放行让位(含记住的规则与 bypass 姿态)。 */
125
125
  requiresRealApproval?: true;
126
126
  /**
127
- * **E-14**([4537]② Trojan Source 族;**ADDITIVE**,`"tool_approval"` only)—— 这只 ask 的**工具输入**
127
+ * **E-14**([ref]② Trojan Source 族;**ADDITIVE**,`"tool_approval"` only)—— 这只 ask 的**工具输入**
128
128
  * (`AskRequest.args`)里含 bidi 控制符(LRM/RLM、嵌入/覆写、隔离符;字符类属主 `text-bidi.ts`)。
129
129
  *
130
130
  * 🔴 **真才带,缺席绝不编 `false`**(与 `governanceForced`/`requiresRealApproval` 同形)。缺席的含义是
@@ -148,17 +148,17 @@ export interface ToolApprovalFrame {
148
148
  * 在骗你的眼睛」,把两个来源折进一个布尔会让壳无法判断该给哪一段加显形标记。
149
149
  */
150
150
  inputHasBidi?: true;
151
- /** #288([4429]② cli 请托;**ADDITIVE**,`"tool_approval"` only,7.34.0+)——窗三键,与
152
- * `approval_request` 帧(design/172 呈卡帧)同名同义:`expiresAtMs` = 本 ask 的绝对到期墙钟
151
+ /** [ref]([ref]② cli 请托;**ADDITIVE**,`"tool_approval"` only,7.34.0+)——窗三键,与
152
+ * `approval_request` 帧([ref] 呈卡帧)同名同义:`expiresAtMs` = 本 ask 的绝对到期墙钟
153
153
  * (有店=行上一次铸定的 `expiresAtMs`,与卡帧/落库同值;无店 D1=注册时刻算定的同名初值),
154
- * `serverNowMs` = **帧铸造时刻**(cli [4429] 锚定语义:倒计时锚=帧到手时刻的服务器钟),
154
+ * `serverNowMs` = **帧铸造时刻**(cli [ref] 锚定语义:倒计时锚=帧到手时刻的服务器钟),
155
155
  * `expiresInMs` = `max(0, expiresAtMs - serverNowMs)` 现算。三键同生同缺(windowZero 腿不发帧,
156
- * 发出的帧恒带);旧消费端无感,新壳借此给旧族帧补倒计时([4297] Q2 那类 77 分钟死卡的根治半场)。 */
156
+ * 发出的帧恒带);旧消费端无感,新壳借此给旧族帧补倒计时([ref] Q2 那类 77 分钟死卡的根治半场)。 */
157
157
  expiresAtMs?: number;
158
158
  expiresInMs?: number;
159
159
  serverNowMs?: number;
160
160
  /**
161
- * #144(core 5.25.0,[3438] 接力契约 / [3443] 主件;**ADDITIVE**,`"tool_approval"` only)——
161
+ * [ref](core 5.25.0,[ref] 接力契约 / [ref] 主件;**ADDITIVE**,`"tool_approval"` only)——
162
162
  * 这只 ask **命中了**调用方的一条持久 allow 规则,而那条规则**没能清掉它**。值 = 被越级的那条规则
163
163
  * **原文**(core `AskRequest.persistedRuleShadowed`,四个 mint 点全带;core 侧已过 `inlineUntrusted`)。
164
164
  *
@@ -175,7 +175,7 @@ export interface ToolApprovalFrame {
175
175
  * 与 {@link ToolApprovalFrame.governanceForced} **刻意分列、不合并**:那个键回答「门是谁下的」
176
176
  * (运维治理层),本键回答「你那条规则怎么了」。governance 只是不可消音的三个来源之一,另两个
177
177
  * (doctrine `always` / 工具自带 mark)不打 governance 标 —— 合并会让后两类的 ask 要么谎报治理出身、
178
- * 要么丢掉规则解释。出身的完整推法见 [3438]:`gate.safetyAxis` + `riskDescriptor.shellGateDoctrine` +
178
+ * 要么丢掉规则解释。出身的完整推法见 [ref]:`gate.safetyAxis` + `riskDescriptor.shellGateDoctrine` +
179
179
  * `realApproval.origin` 组合读,server 不新铸出身键。
180
180
  *
181
181
  * 值是**用户内容族**(规则原文是人写的文本)⇒ 与 `message`/`sourceAgentName` 同待遇:`redactSecrets`
@@ -186,11 +186,11 @@ export interface ToolApprovalFrame {
186
186
  * 唯一的施工是**内容**:那两条读面(`GET /v1/approvals` + `/v1/approvals/stream`)在读边界对这一格补
187
187
  * `redactSecrets`(core 只中和不脱敏,而运维队列是跨租户可见的那一条 —— 见
188
188
  * `http/routes/approvals-assistant.ts` 的 `redactPendingDisclosures` 顶注)。
189
- * 两路的钉见 `test/approval-shadowed-rule-wire.test.ts` 与 db-integration 的「#209 件4」格。
189
+ * 两路的钉见 `test/approval-shadowed-rule-wire.test.ts` 与 db-integration 的「[ref] 件4」格。
190
190
  */
191
191
  persistedRuleShadowed?: string;
192
192
  /**
193
- * #154 车二(core 5.18.0 design/179):`"tool_approval"` only —— 引擎为这次 ask 铸的**规则候选**
193
+ * [ref] 车二(core 5.18.0 [ref]):`"tool_approval"` only —— 引擎为这次 ask 铸的**规则候选**
194
194
  * (`AskRequest.ruleOffers`,core 5.58.0 判别联合逐字透传:闭词表 `kind`/`match` + 引擎铸的文本,
195
195
  * server 不重铸不重排;序即契约——exact single 恒 0、batch 恒末,选择键=offer index)。
196
196
  * 壳据它渲「不再询问」,回决时用 `persistRule.rule` 报出选中的那一条。
@@ -202,16 +202,16 @@ export interface ToolApprovalFrame {
202
202
  */
203
203
  ruleOffers?: readonly RuleOffer[];
204
204
  /**
205
- * S-15 第五单(core #490 修②;**ADDITIVE**,`"tool_approval"` only)—— `ruleOffers` 的**缺席因由**:
205
+ * [ref] 第五单(core [ref] 修②;**ADDITIVE**,`"tool_approval"` only)—— `ruleOffers` 的**缺席因由**:
206
206
  * 规则车道在场却无可给时,引擎点名哪扇门关了(闭三词集 `mandated`/`shadowed`/`lane_cannot_speak`,
207
207
  * 引擎侧与 `ruleOffers` 互斥)。壳据它把「为什么没有不再询问」渲成对应文案(`mandated` 臂**不得**
208
208
  * 指向写规则)。ADVISORY 展示元数据、永不是裁决输入;**缺席不是断言**(covers「有 offers」与三扇
209
209
  * 结构门)。值经 `approval-card.ts` 的 `readRuleOffersAbsence` 窄读(闭集校验;与 `card_json`
210
- * **同一个**函数 ⇒ 两面同值),词表外的值=形不合=不铸键(#157 闭集纪律,绝不透传未知词)。
210
+ * **同一个**函数 ⇒ 两面同值),词表外的值=形不合=不铸键([ref] 闭集纪律,绝不透传未知词)。
211
211
  */
212
212
  ruleOffersAbsence?: RuleOffersAbsence;
213
213
  /**
214
- * #253 件 G1(core 5.33.0 backlog #239,判据帖 [3930] G1;**ADDITIVE**,`"tool_approval"` only)——
214
+ * [ref] 件 G1(core 5.33.0 backlog [ref],判据帖 [ref] G1;**ADDITIVE**,`"tool_approval"` only)——
215
215
  * 这次 ask **为什么**被收紧的**结构化**因由(`AskRequest.probeCause`:工具的 `reversibilityProbe`
216
216
  * 判不出可回滚时,引擎在 maybe 档收紧点铸并 `normalizeProbeCause` 校验过的那一只)。
217
217
  *
@@ -246,7 +246,7 @@ export interface ToolApprovalFrame {
246
246
  };
247
247
  };
248
248
  /**
249
- * #263 件 G2(core 5.35.0 design/252 G-2;**ADDITIVE**,`"tool_approval"` only)—— 这只 ask 背后的
249
+ * [ref] 件 G2(core 5.35.0 [ref] G-2;**ADDITIVE**,`"tool_approval"` only)—— 这只 ask 背后的
250
250
  * **规则出处证据**(`AskRequest.ruleEvidence`,引擎在 gate 内盖章):org 快照 `orgRevision` / 命中的
251
251
  * org 规则原文 `orgRule` / 被越级个人规则的 add dots `personalRuleDots`,**每员 = 值或五词命名缺席**
252
252
  * (`not_wired|not_adjudicated|unavailable|no_match|not_reported`,core `AskEvidenceAbsence` 闭集)。
@@ -268,20 +268,23 @@ export interface ToolApprovalFrame {
268
268
  * `argsOmitted: true`) when over the byte cap or unserializable. */
269
269
  args?: unknown;
270
270
  argsOmitted?: boolean;
271
- /** #329 随批小件([4845]-5 视觉真空的 server 半场;**ADDITIVE**,`"tool_approval_complete"` only,
271
+ /** [ref] 随批小件([ref]-5 视觉真空的 server 半场;**ADDITIVE**,`"tool_approval_complete"` only,
272
272
  * 真才带)——`outcome:"expired"` 一词三义(park / 当场 deny / 无设施 deny,见 outcome 注)里 **park
273
- * 那一义的显式判别位**:在场 ⇔ **这条 ask 本身**按 park 路由收尾且墓碑已落( 同一把 `approvalId`
274
- * 仍可打 `respond` 走迟到受理兑现,见 wire 契约迟到受理段)。判别与墓碑读**同一次判定**(A-058
275
- * F1/F3:首版读政策口〔unattendedPolicy+askStore 在场〕,对批内被连坐 VOID 的兄弟、取消/断连、
276
- * D5 fail-open 等非 park 终局全撒谎)。壳据此把「卡失效」改渲「已转后台候批」。缺席**禁**读作
273
+ * 那一义的显式判别位**:在场 ⇔ **这条 ask 本身**按 park 路由收尾(`parkRouted`,settle 咽喉里置位;
274
+ * [ref] F1/F3:首版读政策口〔unattendedPolicy+askStore 在场〕,对批内被连坐 VOID 的兄弟、取消/断连、
275
+ * D5 fail-open 等非 park 终局全撒谎)。⚠️ **判据是路由,不是墓碑**([ref] 起 `recordParkTombstone`
276
+ * 在两种容量拒新形下不落墓碑,置位与落墓碑可不同步;取舍全文见 settle 咽喉那段注):常态墓碑同拍
277
+ * 已落 ⇒ 同一把 `approvalId` 仍可打 `respond` 走迟到受理兑现(wire 契约迟到受理段);拒新两形下
278
+ * live 迟到腿如实 404(unknown_or_other_replica),壳按既有协议回落 durable gate([ref] Q3)。
279
+ * 壳据此把「卡失效」改渲「已转后台候批」。缺席**禁**读作
277
280
  * 「真 deny」:无店部署 / deny 政策 / VOID 兄弟都发不出这个键,缺席只是「无 park 证据」。 */
278
281
  parked?: true;
279
282
  /**
280
283
  * "tool_approval_complete" only: how the ask settled. `allowed`/`denied` = a human decision.
281
284
  *
282
285
  * 🔴 `expired` = **这张卡失效了**(TTL / abort / 断连 / 批内兄弟被撤卡 superseded),**不等于「这次调用
283
- * 被拒了」**(A-054.10:本注上一版逐字写着「fail-closed deny the shell should render as such」——那是
284
- * #241 断连转 park 与 #280 R-13 窗到期转 park **之前**的语义,两批都没回来改这一行)。同一个词今天有
286
+ * 被拒了」**([ref]:本注上一版逐字写着「fail-closed deny the shell should render as such」——那是
287
+ * [ref] 断连转 park 与 [ref] R-13 窗到期转 park **之前**的语义,两批都没回来改这一行)。同一个词今天有
285
288
  * 三种落点,由部署决定,壳**不能**从这个词自己推出终局:
286
289
  * · park 设施在场 + 缺省 `park` 政策 ⇒ core durable park(run 挂起候补批,`shapeOutcome` 交
287
290
  * `"unavailable"` 而本帧仍发 `expired`);
@@ -295,7 +298,7 @@ export interface ToolApprovalFrame {
295
298
  outcome?: "allowed" | "denied" | "expired";
296
299
  }
297
300
  /** The per-run context `ask` recovers via ALS (mirrors QuestionRunContext + sessionId, which keys the allow-all). */
298
- /** #315:`GET /v1/approvals` 第二顶层键 `livePending` 的行形(与 durable `pending` 行**分数组不混编**
301
+ /** [ref]:`GET /v1/approvals` 第二顶层键 `livePending` 的行形(与 durable `pending` 行**分数组不混编**
299
302
  * ——两族行形与决议路由不同:本族行的决议口=`POST /v1/tool-approvals/:approvalId/respond`,durable 行
300
303
  * =decide 口;数组名即路由判据)。可选位全部「只记真、缺席不编」。 */
301
304
  export interface LivePendingRow {
@@ -304,14 +307,14 @@ export interface LivePendingRow {
304
307
  toolName: string;
305
308
  /** 登记时刻(ms epoch)。 */
306
309
  ts: number;
307
- /** 窗绝对死线——与 `tool_approval` 帧 #288 三键同一次铸定的那个数。 */
310
+ /** 窗绝对死线——与 `tool_approval` 帧 [ref] 三键同一次铸定的那个数。 */
308
311
  expiresAtMs: number;
309
312
  sessionId?: string;
310
313
  requiresRealApproval?: true;
311
314
  governanceForced?: true;
312
315
  /** 发起者为委派子代(originTaskId 在场)。 */
313
316
  fromSubagent?: true;
314
- /** S-52 C2(additive):委派子代的 **canonical taskId**。值域精确成文(codex R1-F3 问询后按 core dist
317
+ /** [ref] C2(additive):委派子代的 **canonical taskId**。值域精确成文(codex R1-F3 问询后按 core dist
315
318
  * 亲证):值 = `AskRequest.sourceTaskId` = 发起 task 的 sessionId(core prepare-task `askSourceIdentity`);
316
319
  * 而 core 的 canonical taskId = `spec.taskId ?? sessionId`(runtask.js `runSourceTaskId`),Runner 铸的
317
320
  * 委派子代 spec **不带** taskId ⇒ 子代 canonical taskId ≡ 子代 sessionId ≡ 本键 ≡
@@ -326,7 +329,7 @@ export interface ToolApprovalRunContext {
326
329
  owner: string | null;
327
330
  emit: (frame: ToolApprovalFrame) => void | Promise<void>;
328
331
  /**
329
- * #151 车6:**批级撤卡帧**(`approval_revoke`,live only —— 语义见 approval-card.ts 的
332
+ * [ref] 车6:**批级撤卡帧**(`approval_revoke`,live only —— 语义见 approval-card.ts 的
330
333
  * `ApprovalRevokeFrame` 顶注)的投递口。
331
334
  *
332
335
  * 🔴 为什么是**独立的可选钩子**而不是给 `emit` 的入参加宽:`emit` 是既有 `tool_approval` 活卡腿的
@@ -342,7 +345,7 @@ export interface ToolApprovalRunContext {
342
345
  */
343
346
  emitRevoke?: (frame: ApprovalRevokeFrame) => void | Promise<void>;
344
347
  /**
345
- * #151 车3 刀 3b:**呈卡帧**(`approval_request`,design/172 §3.1)的投递口。
348
+ * [ref] 车3 刀 3b:**呈卡帧**(`approval_request`,[ref] §3.1)的投递口。
346
349
  *
347
350
  * 🔴 与 {@link ToolApprovalRunContext.emitRevoke} 同一条理由(见其顶注):新协议族的帧走**独立的可选
348
351
  * 钩子**,不把 `emit` 的入参加宽成联合 —— `emit` 是既有 `tool_approval` 活卡腿的通道,它的全部消费点
@@ -356,14 +359,14 @@ export interface ToolApprovalRunContext {
356
359
  */
357
360
  emitCard?: (frame: ApprovalRequestFrame) => void | Promise<void>;
358
361
  abortSignal?: AbortSignal;
359
- /** #151(design/172 §3.1 askId 派生的腿轴;车3 刀 3a 换轴:原 `leg?: number` → `legKey?: string`)。
362
+ /** [ref]([ref] §3.1 askId 派生的腿轴;车3 刀 3a 换轴:原 `leg?: number` → `legKey?: string`)。
360
363
  * = `sha256(resume checkpoint token)` 的 hex,**首腿缺席折空串**(空串是首腿的真值,不是「未知」)。
361
364
  * 与 `ToolApprovalRunContext.taskId`(= 派生里的 `runId` 轴)一起,使同一 `(sourceTaskId, toolCallId)`
362
365
  * 在不同 run / 不同 resume 腿下铸出不同持久行(不会被上一腿或上一 run 已终结的行绊住)。
363
366
  * 换轴动机与残留边界见 `approval-ask-machine.ts` 的 `deriveAskId` 头注。
364
367
  * 真值由装配点(刀 3b)供给,本刀只立形 + 折空串兜底。 */
365
368
  legKey?: string;
366
- /** #151 车2(design/172 §3.3 窗长三元 D3):本 leg 的 walltime deadline(`performance.now()` 单调基,
369
+ /** [ref] 车2([ref] §3.3 窗长三元 D3):本 leg 的 walltime deadline(`performance.now()` 单调基,
367
370
  * NOT `Date.now()`)。缺席 ⇒ 有效窗退化成构造时的 `ttlMs`(现行为逐字不变)。在场且
368
371
  * `legRemainingMs − windowMarginMs ≤ 0` ⇒ 不开窗,直接走窗到期同路——§3.3 不变量:窗不得把一个
369
372
  * 可 park 的 ask 拖成 abort-deny。真值由车3 的装配点供给,本车只立形+消费。 */
@@ -371,9 +374,9 @@ export interface ToolApprovalRunContext {
371
374
  }
372
375
  export type ToolApprovalDecision = "allow" | "allow_session" | "deny";
373
376
  /**
374
- * #154 车二:回决回执上 `ruleRefusal` 的**闭词表**(「不再询问」这次为什么没存上)。
377
+ * [ref] 车二:回决回执上 `ruleRefusal` 的**闭词表**(「不再询问」这次为什么没存上)。
375
378
  *
376
- * 🔴 为什么是闭集而不是 `string`(#157 词表纪律):这一格是 wire 可见的**机器可读**位 —— 壳要据它分
379
+ * 🔴 为什么是闭集而不是 `string`([ref] 词表纪律):这一格是 wire 可见的**机器可读**位 —— 壳要据它分
377
380
  * 「这次不能存」(`rule_input_edited`:编辑过输入,换下一次)与「这台部署压根不供规则」
378
381
  * (`rule_lane_unavailable`)。自由串会让每个消费端各自猜词,而 server 加一个新拒绝理由时没人会红。
379
382
  * 三格 server 自铸 + 车道自己的四格(`CardRulePersisted["reason"]`,从那个类型**派生**而不是抄):
@@ -382,13 +385,13 @@ export type ToolApprovalDecision = "allow" | "allow_session" | "deny";
382
385
  export type RuleRefusalReason = Extract<CardRulePersisted, {
383
386
  ok: false;
384
387
  }>["reason"] | "rule_lane_unavailable" | "rule_input_edited" | "rule_not_offered" | "rule_store_error"
385
- /** #204 件7:这只 ask 的门来自运维治理层(`governanceForced`)⇒ 它不进规则车道。**与
388
+ /** [ref] 件7:这只 ask 的门来自运维治理层(`governanceForced`)⇒ 它不进规则车道。**与
386
389
  * `rule_lane_unavailable` 刻意分词**:那个说的是「这台部署压根不供规则」(壳可以从此不渲这一格),
387
390
  * 这个说的是「规则车道好好的,只是**这一只** ask 归 operator 管」—— 折成同一个词会让壳把一台正常
388
391
  * 部署整条车道判死。 */
389
392
  | "rule_governance_forced"
390
393
  /**
391
- * #363:**这一行**没有可铸规则的素材 —— durable(PARKED)迟到决议腿专属。
394
+ * [ref]:**这一行**没有可铸规则的素材 —— durable(PARKED)迟到决议腿专属。
392
395
  *
393
396
  * 成因闭集(三条,处置相同):①这只 ask 从没进过规则车道(治理档 / 无属主 / 引擎没铸候选 / args 里
394
397
  * 读不出命令原字节)⇒ `rule_command` 列 NULL;②行由**加这两列之前**的构建落下;③行上的卡读不回来
@@ -401,7 +404,7 @@ export type RuleRefusalReason = Extract<CardRulePersisted, {
401
404
  */
402
405
  | "rule_material_absent";
403
406
  /**
404
- * #340([4763])—— `persistRule` 的**两个显式臂**在 wire 上的解析产物。
407
+ * [ref]([ref])—— `persistRule` 的**两个显式臂**在 wire 上的解析产物。
405
408
  *
406
409
  * `edited` 是判别位而不是「一个可选的第二字段」:候选臂的 `rule` 是**卡上那条候选的逐字文本**(定位键),
407
410
  * 编辑臂的 `rule` 是**人自己写的规则**。同一个字段两种含义,判别位必须显式带在同一个对象上。
@@ -411,7 +414,7 @@ export type ParsedPersistRule = {
411
414
  readonly rule: string;
412
415
  readonly edited: boolean;
413
416
  }
414
- /** design/377(cli 1.0.92 合窗):人勾了 **batch** offer——合取批没有单条文本可抄,选择键=帧上
417
+ /** [ref](cli 1.0.92 合窗):人勾了 **batch** offer——合取批没有单条文本可抄,选择键=帧上
415
418
  * `ruleOffers` 的下标(卡=行素材=呈卡帧同源;server 侧兑付前另过防漂等式,见
416
419
  * `persistRuleAfterDecision` 的 batch 臂)。窄开只指 batch:single 臂的防伪锚是文本等式,
417
420
  * index 不许旁路它。 */
@@ -419,18 +422,18 @@ export type ParsedPersistRule = {
419
422
  readonly kind: "batch";
420
423
  readonly batchOfferIndex: number;
421
424
  };
422
- /** #340:`persistRule.rule` 的形/上限拒句(wire 可见文案的**唯一**成形口 —— 冻结在
425
+ /** [ref]:`persistRule.rule` 的形/上限拒句(wire 可见文案的**唯一**成形口 —— 冻结在
423
426
  * `test/api-error-text-freeze.test.ts` 的常量锚格,与 `src/http/` 桶里的 `sendError` 站点同纪律)。 */
424
427
  export declare const PERSIST_RULE_TEXT_ERROR = "persistRule.rule must be a non-empty string of at most 512 characters";
425
- /** #340:`persistRule.edited` 的形拒句。非 boolean **绝不静默当 false** —— 那会把一次「我要落自由文本」
428
+ /** [ref]:`persistRule.edited` 的形拒句。非 boolean **绝不静默当 false** —— 那会把一次「我要落自由文本」
426
429
  * 悄悄折回候选臂,回来一句 `rule_not_offered`,而人以为自己写的规则被拒了。 */
427
430
  export declare const PERSIST_RULE_EDITED_FLAG_ERROR = "persistRule.edited must be a boolean when present";
428
- /** design/377:batch 选择键的形拒句(负数/非整数/非数一律响亮 400——一个被 |0 折过的下标指向的是另一条 offer)。 */
431
+ /** [ref]:batch 选择键的形拒句(负数/非整数/非数一律响亮 400——一个被 |0 折过的下标指向的是另一条 offer)。 */
429
432
  export declare const PERSIST_RULE_BATCH_INDEX_ERROR = "persistRule.batchOfferIndex must be a non-negative integer when present";
430
- /** design/377:三臂互斥拒句。同场不静默取一——两臂说的是两次不同的授权,猜哪个都等于替人改主意。 */
433
+ /** [ref]:三臂互斥拒句。同场不静默取一——两臂说的是两次不同的授权,猜哪个都等于替人改主意。 */
431
434
  export declare const PERSIST_RULE_BATCH_EXCLUSIVE_ERROR = "persistRule.batchOfferIndex is mutually exclusive with persistRule.rule / persistRule.edited \u2014 send exactly one arm";
432
435
  /**
433
- * #340 定界5:回决体**不收 scope**。
436
+ * [ref] 定界5:回决体**不收 scope**。
434
437
  *
435
438
  * 规则落在哪个 scope 由 server 从**授权发生地**自铸(`ruleScopeRootFor` 在铸卡时咨询一次)。让携带方
436
439
  * 指定 scope = 让一次「在项目 A 里点的同意」写成一条覆盖项目 B(或全局)的常驻放行 —— 那是这条轴上
@@ -449,7 +452,7 @@ export declare function parseToolApprovalResponse(body: unknown): {
449
452
  error: string;
450
453
  };
451
454
  /**
452
- * #280 R-13 C —— `UNATTENDED_APPROVAL_POLICY` 的**闭集**词表([4297]Q1「裁2:A+C」/[4338] 裁②)。
455
+ * [ref] R-13 C —— `UNATTENDED_APPROVAL_POLICY` 的**闭集**词表([ref]Q1「裁2:A+C」/[ref] 裁②)。
453
456
  *
454
457
  * 语义轴 = 「一只治理 ask 到了、而**没有任何人**能答」时这条部署要什么终局:
455
458
  * · `park`(缺省)—— 交 `"unavailable"`,由 core 走 durable park:run 挂起候人(done(suspended) +
@@ -457,13 +460,13 @@ export declare function parseToolApprovalResponse(body: unknown): {
457
460
  * 没有的话 core 自己 fail-closed deny(文案自带「no durable approval gate is armed」)。
458
461
  * · `deny` —— 真无人值守 / headless 部署的**显式**自声明:不积压 park,当场 deny 让模型自己改道。
459
462
  *
460
- * 闭集 + 穷举 `switch`/三元的理由(#157 无静默 fail-open):这条轴决定的是**权限门的终局方向**,
463
+ * 闭集 + 穷举 `switch`/三元的理由([ref] 无静默 fail-open):这条轴决定的是**权限门的终局方向**,
461
464
  * 一个拼错的词若被当成「未设」静默回缺省,运维会以为自己关掉了 park 积压而实际没有。坏值 boot 拒启
462
- * (`config.ts` 的解析腿,#210 A 档)。
465
+ * (`config.ts` 的解析腿,[ref] A 档)。
463
466
  */
464
467
  export type UnattendedApprovalPolicy = "park" | "deny";
465
468
  /**
466
- * #151 车3 刀 3b —— 「流内审批协议到底上不上场」的**单一谓词**(设计稿 §2.3 注入 / §2.4 能力面 /
469
+ * [ref] 车3 刀 3b —— 「流内审批协议到底上不上场」的**单一谓词**(设计稿 §2.3 注入 / §2.4 能力面 /
467
470
  * §8.4 park 设施自检,三处同一份判据)。
468
471
  *
469
472
  * 🔴 为什么必须是一个函数而不是三处各写一遍的合取式:车4 落地时曾在回决端点里放了一份局部的
@@ -481,7 +484,7 @@ export type UnattendedApprovalPolicy = "park" | "deny";
481
484
  * 丢失」不是一个量级(§2.2(b));File 形 ask 店落地后这一项自然翻真;
482
485
  * 5. **park 设施在场**(§8.4)—— 缺席时「窗到期 ⇒ unavailable」在 core 侧没有降级目的地,结局是
483
486
  * fail-closed deny,**比现状(5min 活卡、人能批)更差**。所以自检不满足 ⇒ **协议不上场**、现行
484
- * `tool_approval` 活卡腿逐字保留,而不是「把 ask 推向一个不存在的目的地」(§14 属主照准,core [2794]
487
+ * `tool_approval` 活卡腿逐字保留,而不是「把 ask 推向一个不存在的目的地」(§14 属主照准,core [ref]
485
488
  * 回帖确认即原意)。
486
489
  */
487
490
  export type StreamApprovalGate = {
@@ -516,7 +519,7 @@ export interface StreamApprovalGateInput {
516
519
  }
517
520
  export declare function resolveStreamApprovalGate(input: StreamApprovalGateInput): StreamApprovalGate;
518
521
  /**
519
- * #151 车3 刀 3b —— **一条执行腿的审批装配裁定**(sync / bg / resume **三腿共用**)。
522
+ * [ref] 车3 刀 3b —— **一条执行腿的审批装配裁定**(sync / bg / resume **三腿共用**)。
520
523
  *
521
524
  * 🔴 为什么必须是一个函数(codex 交叉复审 F3/F4,2026-08-06 真 finding):第一版把这套判断**只**写在
522
525
  * `routes/tasks.ts` 的 sync 腿上,bg(`runs.ts`)与 resume(`server.ts`)两腿只把「新协议的口与轴」挂在
@@ -529,19 +532,21 @@ export declare function resolveStreamApprovalGate(input: StreamApprovalGateInput
529
532
  * 一份判据、三处消费,这两类漂就结构性地不可能再发生。
530
533
  *
531
534
  * 三源(§8.3)里本仓可执行的是后两源;第一源 `forceDurableGate` 在 HTTP 装配时刻不可解析(§14 §12-5
532
- * 亲裁:不可读则该源不做,core `prepare-task.js:3330` 结构性兜底),故不在本函数内。
535
+ * 亲裁:不可读则该源不做,core 自身的 `runtimeCaps?.forceDurableGate` 消费臂结构性兜底——7.0.1
536
+ * `prepare-task.js` 的 durableMandate/contentMandate(:1415/:1417)与 durableQuestionFace(:2136)等),
537
+ * 故不在本函数内。
533
538
  *
534
539
  * **`windowZero` 的两件事必须同时做**(调用方契约):不包 ALS **且**注入 immediate-unavailable 闭包。
535
- * 只做一件另一条路仍会呈卡。⚠️ S-52 起**三腿都有** per-task `spec.onAsk` 装配点(sync=routes/tasks.ts,
540
+ * 只做一件另一条路仍会呈卡。⚠️ [ref] 起**三腿都有** per-task `spec.onAsk` 装配点(sync=routes/tasks.ts,
536
541
  * bg=runs.ts,resume=server.ts driveResumeLeg),windowZero 的第二件在三腿都是显式闭包 —— 旧文「bg/
537
542
  * resume 无装配点,不包 ALS 即等价」的缺席论证已退役,别再据它推断「少装一件也行」。
538
543
  */
539
544
  export interface ApprovalLegAssembly {
540
545
  /** 协议在本腿上是否上场。false ⇒ **既不包 ALS、也不接** `emitCard`/`emitRevoke`/`legKey`/
541
546
  * `legDeadlineMonotonic` —— **协议件**逐字保持协议之前的行为。
542
- * ⚠️ S-52 门职分离(codex R1-F1 随修):本位**不再兼职**「审批席在场性」—— `spec.onAsk = boundAsk`
547
+ * ⚠️ [ref] 门职分离(codex R1-F1 随修):本位**不再兼职**「审批席在场性」—— `spec.onAsk = boundAsk`
543
548
  * 三腿恒装(判据 = 协调器在场,即 `TOOL_APPROVAL_ENABLED`),协议关时 bg/resume 腿的 ask 也能命中
544
- * 同 (owner, session) 活流呈活卡(sync 腿 [1535] 起本就如此;bg/resume 的这条行为差 = S-52 CHANGELOG
549
+ * 同 (owner, session) 活流呈活卡(sync 腿 [ref] 起本就如此;bg/resume 的这条行为差 = [ref] CHANGELOG
545
550
  * 披露的行为面变更)。旧文「本腿逐字保持协议之前的行为」只对协议件成立,别再把它读成「协议关 = 零呈卡」。 */
546
551
  active: boolean;
547
552
  /** §8.3 窗=0 恒 park。`active` 为假时恒 false(协议都没上场,谈不上关窗)。 */
@@ -551,7 +556,7 @@ export interface ApprovalLegAssembly {
551
556
  legDeadlineMonotonic?: number;
552
557
  }
553
558
  /**
554
- * #151 车3 刀 3b(codex 交叉复审 round2 R2-1,2026-08-06 真 finding)—— 呈卡帧的**双写投递口**。
559
+ * [ref] 车3 刀 3b(codex 交叉复审 round2 R2-1,2026-08-06 真 finding)—— 呈卡帧的**双写投递口**。
555
560
  *
556
561
  * 🔴 为什么必须收成一个有属主的工厂:round1 之后「新帧送达」开始**参与**「卡到底有没有送到人手上」的
557
562
  * 判定(见 `emitOne` 顶注)。而 sync 腿原来那个内联闭包把两个 sink 的失败都吞掉、然后**正常返回** ——
@@ -587,7 +592,7 @@ export declare function resolveApprovalLeg(input: {
587
592
  * Coordinates the live tool-approval HITL for the singleton runner. Process-local + same-replica (the pending map is
588
593
  * in memory, like QuestionCoordinator): a respond that lands on another replica finds nothing → 404. Present (passed
589
594
  * into `RunnerDeps.onAsk` + the respond route) ONLY when `TOOL_APPROVAL_ENABLED` — absent ⇒ core's `resolveAsk`
590
- * keeps its headless auto-deny for every ask ([819]⑤ fail-closed default, zero behavior change).
595
+ * keeps its headless auto-deny for every ask ([ref]⑤ fail-closed default, zero behavior change).
591
596
  *
592
597
  * G1 interplay (core 1.290 sync-ask knob, prepare-task): with an onAsk present, a NON-safety ask with NO per-task
593
598
  * `durableApproval` skips the durable park and resolves on this sync leg (zero checkpoint, CC-interactive latency).
@@ -598,7 +603,7 @@ export declare function resolveApprovalLeg(input: {
598
603
  export declare class ToolApprovalCoordinator {
599
604
  private readonly als;
600
605
  private readonly pending;
601
- /** #151 车2(codex 交叉复审 round3 抓获真 finding,round5 精化成 Set):次级索引,键 = 持久层 askId
606
+ /** [ref] 车2(codex 交叉复审 round3 抓获真 finding,round5 精化成 Set):次级索引,键 = 持久层 askId
602
607
  * (与 {@link pending} 的 wire-面 uuidv7 `id` 是两条独立的身份轴,顶注同精神)——只在 askStore 在场且
603
608
  * 这只 ask 真有 askId 时才登记。**同一 askId 下可能同时挂着不止一条本地条目**(round5 抓获:
604
609
  * `ensureAsk` 是幂等 upsert,若 core 对同一 (sourceTaskId,runId,toolCallId,legKey) 真发起过两次并发调用——如
@@ -616,7 +621,7 @@ export declare class ToolApprovalCoordinator {
616
621
  private readonly pendingByAskId;
617
622
  /** Per-capability session grants — keys = sessionAllowKey(owner, sessionId, category) (修2; bounded). */
618
623
  private readonly allowAllSessions;
619
- /** [1546] HIGH-1(broker)→[1559]四 core 产品裁定「多活集合+广播+首决胜出」:per-(owner, host-session)
624
+ /** [ref] HIGH-1(broker)→[ref]四 core 产品裁定「多活集合+广播+首决胜出」:per-(owner, host-session)
620
625
  * 的**当前活跃连接集合**——boundAsk 闭包只携身份,emit 时广播给该 key 下**全部**活连接(宿主重连/
621
626
  * attach 新 SSE 时 runWithContext 各自注册进同一集合,谁也不覆盖谁);查无活连接 = "unavailable"
622
627
  * (G1 回路)。旧单指针形的缺口(file-backed local mode 无单活跃 run 409 守卫时,两个真正并发的
@@ -626,18 +631,18 @@ export declare class ToolApprovalCoordinator {
626
631
  * 收 dismiss 通知(见 askBroadcast)。 */
627
632
  private readonly streams;
628
633
  private readonly ttlMs;
629
- /** S-43(案A §3.4):**零活流铸造**的 ask 的窗(`UNREACHED_ASK_TTL_MS`,缺省
634
+ /** [ref](案A §3.4):**零活流铸造**的 ask 的窗(`UNREACHED_ASK_TTL_MS`,缺省
630
635
  * {@link DEFAULT_UNREACHED_ASK_TTL_MS} = 1h,域 [60s, 24h] 由 config 守)。只作用于
631
636
  * `AskReachability === "unreached"` 的那一支;有活流的 ask 恒用 {@link ttlMs}。 */
632
637
  private readonly unreachedTtlMs;
633
- /** #151 车2(design/172 §7 协调器半场,D1):可选持久层——缺席 ⇒ 每一条现行为逐字不变(in-memory
638
+ /** [ref] 车2([ref] §7 协调器半场,D1):可选持久层——缺席 ⇒ 每一条现行为逐字不变(in-memory
634
639
  * promise 机械即契约);在场 ⇒ 四竞争者(回决/窗到期/取消/emit 全灭)的终局多一道持久 CAS 记账。
635
640
  * additive 改造,不是替换——settle 闭包/pending map/TTL/broker 全保留,CAS 只决定「谁有权 settle
636
641
  * 成什么终局」。 */
637
642
  private readonly askStore?;
638
- /** #151 车2(design/172 §3.3 D3):窗长三元公式的安全余量,构造期定,详见 {@link effectiveAskWindowMs}。 */
643
+ /** [ref] 车2([ref] §3.3 D3):窗长三元公式的安全余量,构造期定,详见 {@link effectiveAskWindowMs}。 */
639
644
  private readonly windowMarginMs;
640
- /** #151 车3 刀 3b(设计稿 §0 X-2 写侧准入门):per-task / per-owner 的未决 ask 上限。 */
645
+ /** [ref] 车3 刀 3b(设计稿 §0 X-2 写侧准入门):per-task / per-owner 的未决 ask 上限。 */
641
646
  private readonly admitMaxPerTask;
642
647
  private readonly admitMaxPerOwner;
643
648
  /** X-2 的两把**在飞计数**。键 = 出处 taskId / owner(`null` 折一个不可能与真 principal 相撞的哨兵)。
@@ -646,54 +651,54 @@ export declare class ToolApprovalCoordinator {
646
651
  * 一群 ask 全部越过门。 */
647
652
  private readonly admitByTask;
648
653
  private readonly admitByOwner;
649
- /** S-43 F4:悬挂决议轮询腿的**轮转游标**(整数偏移,与集合成员无关 —— 理由见
654
+ /** [ref] F4:悬挂决议轮询腿的**轮转游标**(整数偏移,与集合成员无关 —— 理由见
650
655
  * `pollSuspendedDecisions` 里那段:按 askId 记的形会在「上一拍最后碰的那条被结算掉」时塌回队首,
651
656
  * 构造出永久饥饿的前缀)。只回答「上一拍扫到第几个」,单调推进、按当前长度取模。 */
652
657
  private suspendedPollOffset;
653
- /** S-43 + codex R3-[critical]:askId → **此刻正带着 `updatedInput` 决它的请求数**(见
658
+ /** [ref] + codex R3-[critical]:askId → **此刻正带着 `updatedInput` 决它的请求数**(见
654
659
  * {@link markEditedDecisionInFlight} 顶注)。只在 `decideAsk` 那一次调用期间非空,故天然有界。 */
655
660
  private readonly editedDecisionsInFlight;
656
- /** S-43 + codex R6-[critical]:askId → **弃单墓碑**到期时刻。看门狗放弃一枚在飞编辑标记时落一条,
661
+ /** [ref] + codex R6-[critical]:askId → **弃单墓碑**到期时刻。看门狗放弃一枚在飞编辑标记时落一条,
657
662
  * 此后行派生的 approve 对这只 ask 改走 park 路由(理由见 {@link notifyExternalDecision} 里那段)。
658
663
  * 有界两道:条目自带 TTL(惰性过期)+ 表大小 FIFO 上限,同 park 墓碑表的纪律。 */
659
664
  private readonly abandonedEditedDecisions;
660
- /** #151 车2(D5 一次性 warn 节流):同实例只报第一次,后续只计数(避免 store 抖动期间刷屏)。 */
665
+ /** [ref] 车2(D5 一次性 warn 节流):同实例只报第一次,后续只计数(避免 store 抖动期间刷屏)。 */
661
666
  private storeErrorWarned;
662
667
  private storeErrorTally;
663
- /** [2942]/[2943] `governanceForced` 的**读侧**表(写侧 = runtime-governance 的两只观察器)。
668
+ /** [ref]/[ref] `governanceForced` 的**读侧**表(写侧 = runtime-governance 的两只观察器)。
664
669
  * 缺席(生产形)⇒ 每条 run 腿由 {@link runWithContext} 现铸一张、经 ALS 与写侧共享;在场 ⇒ 测试注入的
665
670
  * 固定表(此时不进 ALS 作用域,读写都走这一张)。作用域理由见 `governance-ask-marks.ts` 顶注。 */
666
671
  private readonly governanceAskMarks;
667
- /** #154 车二:持久化权限规则的**同意车道**。在场 ⇔ 规则店真装配(main.ts 与 core 的
672
+ /** [ref] 车二:持久化权限规则的**同意车道**。在场 ⇔ 规则店真装配(main.ts 与 core 的
668
673
  * `RunnerDeps.permissionRuleStore` 同源于一个对象)⇒ ①ask 帧投 `ruleOffers`;②回决带
669
674
  * `persistRule` 时兑付进店。缺席 ⇒ 两件都不做(诚实缺席,不发无处可兑的候选)。 */
670
675
  private readonly ruleConsent;
671
- /** #280 R-13 C(`UNATTENDED_APPROVAL_POLICY`,设计稿 §2):**无人可答**时这条部署要的终局。
676
+ /** [ref] R-13 C(`UNATTENDED_APPROVAL_POLICY`,设计稿 §2):**无人可答**时这条部署要的终局。
672
677
  * `park`(缺省)= 交 `"unavailable"` 走 core durable park;`deny` = 显式自声明「真无人值守、不积压
673
678
  * park、要模型当场自走」⇒ 同样五臂改判 deny。**纯部署级**:不看任何客户端 posture / 表态
674
- * (memory: operator-knob-must-be-unconditional —— #153 shellGate 让部署级旋钮的生死由客户端表态
679
+ * (memory: operator-knob-must-be-unconditional —— [ref] shellGate 让部署级旋钮的生死由客户端表态
675
680
  * 决定,同病两犯过一次)。安全轴:`deny` 是收紧方向(不放行任何东西),fail-closed 铁律不受损。 */
676
681
  private readonly unattendedPolicy;
677
- /** #295(F-1,[4512] 修向 (b')):卡批「不再询问」落盘规则的 **project root 解析器**。铸卡素材时以
682
+ /** [ref](F-1,[ref] 修向 (b')):卡批「不再询问」落盘规则的 **project root 解析器**。铸卡素材时以
678
683
  * ask 的 `sessionId` 咨询一次——「这次授权是在**哪里**点的」在授权发生时捕获,不在回决时再猜。
679
684
  * 回 `undefined` = 该部署形上 run 的 workspace root 不可知(远程沙箱/多租户等)⇒ 不铸 scope,落
680
685
  * core 的 global 缺省(= 现行为,恒不更宽;也绝不错铸一个坐标系不对的 root)。装配见 main.ts:
681
686
  * registry cwd(host lane 显式注册的 launch dir)?? in-process 单用户形的 `process.cwd()`。 */
682
687
  private readonly ruleScopeRootFor;
683
- /** #329:park 路由墓碑表(键 = wire `approvalId`,插入序 = 逐出序)。语义与有界理由见
688
+ /** [ref]:park 路由墓碑表(键 = wire `approvalId`,插入序 = 逐出序)。语义与有界理由见
684
689
  * {@link ParkTombstone} 顶注。 */
685
690
  private readonly parkTombstones;
686
691
  private readonly parkTombstoneMax;
687
692
  private readonly parkTombstoneTtlMs;
688
- /** #343:per-principal 子帽(语义与取值理由见 {@link DEFAULT_PARK_TOMBSTONE_PER_PRINCIPAL_MAX})。 */
693
+ /** [ref]:per-principal 子帽(语义与取值理由见 {@link DEFAULT_PARK_TOMBSTONE_PER_PRINCIPAL_MAX})。 */
689
694
  private readonly parkTombstonePerPrincipalMax;
690
- /** #329:PARKED 臂的赎回席**取值口**(晚绑 —— 赎回腿要 checkpoint/bg 店与裸 Agent 工具,它们在协调器
695
+ /** [ref]:PARKED 臂的赎回席**取值口**(晚绑 —— 赎回腿要 checkpoint/bg 店与裸 Agent 工具,它们在协调器
691
696
  * 构造之后才装配;同款 holder 先例 = main.ts 的 `getRunDenySweep`)。取到 undefined ⇒ 该臂逐字回落
692
697
  * 修前 404,partial 部署安全。 */
693
698
  private readonly parkedRedeem;
694
699
  constructor(opts?: {
695
700
  ttlMs?: number;
696
- /** S-43(案A):零活流铸造的 ask 的窗(见 {@link unreachedTtlMs})。装配点在协议**上场**时才传
701
+ /** [ref](案A):零活流铸造的 ask 的窗(见 {@link unreachedTtlMs})。装配点在协议**上场**时才传
697
702
  * (与 `ttlMs` 同条件、同理由:悬挂的三条发现通道全长在 ask 行上);缺席 ⇒ 1h 代码默认。 */
698
703
  unreachedTtlMs?: number;
699
704
  askStore?: ApprovalAskStore;
@@ -702,23 +707,23 @@ export declare class ToolApprovalCoordinator {
702
707
  admitMaxPerOwner?: number;
703
708
  /** 缺省 = 进程级单表(写侧默认同一张)。注入口只为测试与将来的多实例形。 */
704
709
  governanceAskMarks?: GovernanceAskMarks;
705
- /** #154 车二:同意车道(在场 = 规则店已装配)。 */
710
+ /** [ref] 车二:同意车道(在场 = 规则店已装配)。 */
706
711
  ruleConsent?: RuleConsentLane;
707
- /** #280 R-13 C:无人值守政策(见 {@link ToolApprovalCoordinator.unattendedPolicy});缺省 `park`。 */
712
+ /** [ref] R-13 C:无人值守政策(见 {@link ToolApprovalCoordinator.unattendedPolicy});缺省 `park`。 */
708
713
  unattendedPolicy?: UnattendedApprovalPolicy;
709
- /** #295:卡批规则的 project root 解析器(见 {@link ToolApprovalCoordinator.ruleScopeRootFor})。 */
714
+ /** [ref]:卡批规则的 project root 解析器(见 {@link ToolApprovalCoordinator.ruleScopeRootFor})。 */
710
715
  ruleScopeRootFor?: (sessionId: string | undefined) => string | undefined;
711
- /** #329:PARKED 臂赎回席的**晚绑取值口**(见 {@link ToolApprovalCoordinator.parkedRedeem})。 */
716
+ /** [ref]:PARKED 臂赎回席的**晚绑取值口**(见 {@link ToolApprovalCoordinator.parkedRedeem})。 */
712
717
  parkedRedeem?: () => ParkedAskRedeem | undefined;
713
- /** #329:墓碑表两道界(缺省见 {@link DEFAULT_PARK_TOMBSTONE_MAX}/{@link DEFAULT_PARK_TOMBSTONE_TTL_MS})。
718
+ /** [ref]:墓碑表两道界(缺省见 {@link DEFAULT_PARK_TOMBSTONE_MAX}/{@link DEFAULT_PARK_TOMBSTONE_TTL_MS})。
714
719
  * 不是部署旋钮(不接 env),可注入只为让「有界」这件事被判据观测得到。 */
715
720
  parkTombstoneMax?: number;
716
721
  parkTombstoneTtlMs?: number;
717
- /** #343:per-principal 子帽(同上不接 env;生效值恒 `min(本值, parkTombstoneMax)`)。 */
722
+ /** [ref]:per-principal 子帽(同上不接 env;生效值恒 `min(本值, parkTombstoneMax)`)。 */
718
723
  parkTombstonePerPrincipalMax?: number;
719
724
  });
720
725
  /**
721
- * #280 R-13 C —— 「**无人可答**」这一类终局的**唯一**成形口(park 路由 vs deny 政策)。
726
+ * [ref] R-13 C —— 「**无人可答**」这一类终局的**唯一**成形口(park 路由 vs deny 政策)。
722
727
  *
723
728
  * 五臂(设计稿 §1 的表)全部读它,`unattendedPolicy` 因此是一处施加、五处消费:
724
729
  * (a) 有店窗到期 `expireAsk` 赢 CAS / (b) 无店窗到期(D1)/ (c) 有店但 `expireAsk` 报错
@@ -749,7 +754,7 @@ export declare class ToolApprovalCoordinator {
749
754
  * (`http/routes/tasks.ts` 的 sync 腿),它必须与协调器内五臂读**同一个**旋钮值,而不是各算一遍。 */
750
755
  unattendedAskOutcome(): "unavailable" | false;
751
756
  /**
752
- * #151 车3 刀 3b —— design/172 §3.3 / 设计稿 §0 X-2 的**写侧准入门**。
757
+ * [ref] 车3 刀 3b —— [ref] §3.3 / 设计稿 §0 X-2 的**写侧准入门**。
753
758
  *
754
759
  * 位置(硬条款):在落 `pending`、建 timer、`ensureAsk` 落行、发帧**之前**。资源分配发生在**创建侧**
755
760
  * (每只未决 ask 各带一条持久行 + 一只 timer + 一个 promise + 一份 SSE 载荷;`pending` map 本身无容量
@@ -769,17 +774,17 @@ export declare class ToolApprovalCoordinator {
769
774
  */
770
775
  private admit;
771
776
  /**
772
- * #154 车二:一只 ask 的**规则车道素材**,或 `undefined`(= 本 ask 不投候选、不接受 `persistRule`)。
777
+ * [ref] 车二:一只 ask 的**规则车道素材**,或 `undefined`(= 本 ask 不投候选、不接受 `persistRule`)。
773
778
  *
774
779
  * 三个合取项(缺一即 `undefined`,理由逐字见调用点上方注):①店在场 ②引擎铸了候选 ③命令原字节可读。
775
- * `req.args` 是 `unknown` ⇒ 窄读,**禁裸 as-cast**(宪法 [2704]:一个形状漂了的 args 若被 cast,
780
+ * `req.args` 是 `unknown` ⇒ 窄读,**禁裸 as-cast**(宪法 [ref]:一个形状漂了的 args 若被 cast,
776
781
  * 会把 `undefined` 当命令送进 `prepareCardApproval`,那是放宽面上的静默垃圾)。
777
782
  */
778
783
  /** 两份候选是否**逐条逐键**相等(顺序即展示序 ⇒ 顺序敏感)。两侧都缺席 = 相等;一侧缺席 = 不等。
779
784
  * 用在幂等重入的「行 = 真源」对账上(见 `ensureAsk` 那段撤回臂)。 */
780
785
  private static ruleOffersEqual;
781
786
  /**
782
- * #346 / 5.58 复审 F-1 —— OFFER 的**文本座尺**(红先修)。
787
+ * [ref] / 5.58 复审 F-1 —— OFFER 的**文本座尺**(红先修)。
783
788
  *
784
789
  * 🔴 病灶(真复现,`npm run build --flag=<700 字> && git status`):`batch` 成员的 `segment` 是复合命令
785
790
  * 那一段的**原字节**,它**不经** `parseAllowRuleText`,所以 core 的 `MAX_RULE_TEXT_CHARS` 对它一个字
@@ -802,7 +807,7 @@ export declare class ToolApprovalCoordinator {
802
807
  */
803
808
  private static boundRuleOfferTexts;
804
809
  private buildRuleLaneMaterial;
805
- /** #241([3731]/[3730] 双属主裁定):把某 wire run 的**流内未决 ask** 立即转 durable park——断连支专用。
810
+ /** [ref]([ref]/[ref] 双属主裁定):把某 wire run 的**流内未决 ask** 立即转 durable park——断连支专用。
806
811
  * 匹配键=`ctxTaskId`(wire run id)。该字段的顶注说它「不是清扫判据」——那是因为清扫要判**连接**的
807
812
  * 生死(同 id 可被两个 ctx 实例复用);本臂语义不同:调用方就是该 wire run 的承载流,断连=这个 id 的
808
813
  * 流没了,值相等即目标集;极端复用形下多转的那条也只是从流内卡变 durable 卡,方向保守。
@@ -810,19 +815,19 @@ export declare class ToolApprovalCoordinator {
810
815
  parkOpenAsksForTask(wireTaskId: string): number;
811
816
  /** 测试/可观测性钩子(X-2):某 (taskId) 维当前占用的准入名额数。 */
812
817
  admittedCount(taskId: string): number;
813
- /** #151 车2(D5 store 故障姿势):任何 store 调用 throw ⇒ fail-open 到进程内机械照旧(store 是记账/
818
+ /** [ref] 车2(D5 store 故障姿势):任何 store 调用 throw ⇒ fail-open 到进程内机械照旧(store 是记账/
814
819
  * 收敛层,不是投递面——裁决可用性不因它抖动而降级),一次性 `logger.warn`(同实例只报第一次,后续
815
820
  * 只计数)。**区分**「store threw」(本方法专管)与「CAS 输」(如实拒绝,D2 必须服从,绝不算故障、
816
821
  * 绝不走本方法)。 */
817
822
  private noteStoreError;
818
- /** #151 车5(R2-5):给一次 store 调用套墙钟上限。超时 = 以 `Error` 拒绝 ⇒ 调用点既有的 catch(D5
823
+ /** [ref] 车5(R2-5):给一次 store 调用套墙钟上限。超时 = 以 `Error` 拒绝 ⇒ 调用点既有的 catch(D5
819
824
  * fail-open / 防御性复核)原样接住,不需要为超时新增一条语义。定时器一律 `unref`(绝不持住进程),
820
825
  * 竞速输的那一路由 `Promise.race` 自己的 rejection handler 接住(不会变成 unhandled rejection)。 */
821
826
  private withStoreDeadline;
822
827
  /** 测试/可观测性钩子(D5):store 调用失败的累计次数(第一次触发 warn,其余只计数——本方法让「只计数」
823
828
  * 那部分可断言)。 */
824
829
  storeErrorCount(): number;
825
- /** #151 车2(codex 交叉复审 round3 抓获、round5 精化,真 finding,{@link pendingByAskId} 顶注有完整
830
+ /** [ref] 车2(codex 交叉复审 round3 抓获、round5 精化,真 finding,{@link pendingByAskId} 顶注有完整
826
831
  * 背景):某个 ask 赢下持久 CAS 时,同一 askId 下**全部**其余本地条目(批内被原子撤卡的兄弟、或同一
827
832
  * askId 的重复本地注册——两类成因,{@link pendingByAskId} 顶注)都对"这只 askId 其实已经有了终局"一无
828
833
  * 所知,任其自生自灭会让它们的 TTL 形同虚设(round2 之后,它们自己的窗到期/取消一旦发现 CAS 已经干净
@@ -831,14 +836,14 @@ export declare class ToolApprovalCoordinator {
831
836
  * 删除),把远程/其他调用栈发生的终局如实同步回本地——查无对应条目(不在这个副本、或从未真正注册过)
832
837
  * 是正常情况,静默跳过。
833
838
  *
834
- * 🔴 **本口只收「行真的没了」那一类**(#280 codex R3-F2,验真后拆分;红先钉在
839
+ * 🔴 **本口只收「行真的没了」那一类**([ref] codex R3-F2,验真后拆分;红先钉在
835
840
  * `test/unattended-approval-policy.test.ts`):`expireAsk` 返回的 `voidedSiblings` 的行是 **VOID**,
836
841
  * 裸 `(false,"expired")` 正是它们的真终局。而**调用方自己那个 askId** 的行是 **PARKING**(已转投递
837
842
  * 面)—— 把它混进本名单会让「同 askId 的重复本地注册」拿到裸 deny,而赢家拿的是 park 路由:同一条
838
843
  * 持久行、两种 live 终局。那一支改走 {@link settleSameAskIdParkRoute}。 */
839
844
  private settleVoidedSiblings;
840
845
  /**
841
- * #280 codex R3-F1 —— 「行上此刻有没有一个**真决议**」的一次性窄读(窗到期臂的店报错支专用)。
846
+ * [ref] codex R3-F1 —— 「行上此刻有没有一个**真决议**」的一次性窄读(窗到期臂的店报错支专用)。
842
847
  *
843
848
  * 返回 `true`/`false` = 行是 `DECIDED` 且决议是 approve/deny(**人的**裁决,或车4 端点代人落的那一次);
844
849
  * `undefined` = 其它一切(读失败、行不在、行是 STREAM_PENDING/PARKING/PARKED/DENIED/VOID)——调用方按
@@ -856,15 +861,13 @@ export declare class ToolApprovalCoordinator {
856
861
  * 统一到一次**持久**恢复流程(带 CAS 与终态回读),那是店语义级改动,须由本模块属主立设计件,施工车
857
862
  * 不私开(本批已试过整段复用 `convergeFromDurableState`,被自己的全量跑打回,理由见其顶注)。
858
863
  *
859
- * ⚠️ **第二条已登记的残余(A-054.15,2026-08-19 合并重扫 confirmed)**:本口读出的 `true` 交给 `settle`
860
- * 时第三形参 `updatedInput` 恒缺席 —— 行上没有那一列,读不出「这次批准是否带过 ctrl+g 编辑」。上一条
861
- * 残余的方向是 fail-closed(该跑的没跑),这一条**反过来**:core `d.updatedInput === undefined` 分支
862
- * 落回原始未改写实参执行 人批的是改写后的命令、真跑的是原命令 = 执行面**宽于**人所批准。因此它不能
863
- * 只靠注释登记,已按 CLAUDE.md #157 记 `P-DEBT` 债({@link recordRowDerivedApproveReplay},四个同形站点
864
- * 同一个 tag)。收口 = 给 ask 行加 `updated_input` 列(店语义级,须属主立件),届时债与 tag 同批销。
864
+ * **第二条残余已收口([ref],2026-08-19 登记 2026-08-31 [ref] 销)**:本口读出的放行此前交给
865
+ * `settle` 时第三形参 `updatedInput` 恒缺席(行上没有那一列),core 落回原始实参执行 = 执行面**宽于**
866
+ * 人所批准。现在行上有 `updated_input` 列,本口回 `{allowed, updatedInput?}` 两件,`settle` 拿到的就是
867
+ * 人批准的那份编辑;P-DEBT tag 随列撤线(fail-open.ts 撤线备注 + census 第 31 行终态)。
865
868
  */
866
869
  /**
867
- * 🔴 session grant 短路前的**持久出处复核**(A-054.20 的 codex R1-[high] 补丁;A-057.1 换判据)。
870
+ * 🔴 session grant 短路前的**持久出处复核**([ref] 的 codex R1-[high] 补丁;[ref] 换判据)。
868
871
  *
869
872
  * 回 `true` = 「这只 ask 从来没有过持久出处」⇒ 一揽子放行可以短路;
870
873
  * 回 `false` = 行在(任何状态),**或**读不出来(不知道 = 不放宽)⇒ 调用方必须往下走真出卡。
@@ -881,33 +884,34 @@ export declare class ToolApprovalCoordinator {
881
884
  * —— 所以只要行在,短路就是在用一个**更宽**的答案顶替那条路。⇒ 判据 = `row === null`。
882
885
  *
883
886
  * 这条原则是分两次到位的,两次漏的都是「行 = 真源」的一部分:
884
- * · **A-054.20**(codex R1-[high]):首版只查**本地** peek,行上标治理的那一半漏了 —— 本地标表是
887
+ * · **[ref]**(codex R1-[high]):首版只查**本地** peek,行上标治理的那一半漏了 —— 本地标表是
885
888
  * 进程内表,failover / 重启后幂等命中既有行时它恒空。
886
- * · **A-057.1**(2026-08-19 三轴组复审,refuter 真运行复现三形):补丁把行读到手里,却只看
889
+ * · **[ref]**(2026-08-19 三轴组复审,refuter 真运行复现三形):补丁把行读到手里,却只看
887
890
  * `card.governanceForced` 一个位 —— 行处于 `DECIDED=deny`(人已明确拒过这只调用)时照样回 `true`,
888
891
  * 一揽子放行把一次**已落盘的人类拒绝**在重入 / failover / deny-后到 三形里翻成放行(帧 0、行不变、
889
892
  * 无 recordFailOpen ⇒ 遥测零痕迹)。
890
- * · **codex 交叉复审**(A-057.1 同批,验真后采纳):只补终态判据仍漏「卡还在别处挂着」——
893
+ * · **codex 交叉复审**([ref] 同批,验真后采纳):只补终态判据仍漏「卡还在别处挂着」——
891
894
  * STREAM_PENDING 行意味着已有一张卡在等人,凭 grant 抢跑会让行上的终局与真实执行长期矛盾
892
895
  * (那张卡随后可被人/另一副本决成相反答案,或 TTL 到点被收敛成幻影 gate)。
893
896
  * 三次都不是各自独立的 bug,是同一句话没说全,故最终判据收成一条而不是三个分支。
894
897
  *
895
898
  * 零额外 IO(行已经在手里),且 fail-closed **by construction**:将来 `AskState` 加词也不需要动这里。
896
899
  *
897
- * 🔴 **已登记的残余(A-057.60,PARTIAL,本批不修)**:这一步是一次**非原子的 check-then-act** ——
900
+ * 🔴 **已登记的残余([ref],PARTIAL,本批不修)**:这一步是一次**非原子的 check-then-act** ——
898
901
  * 另一副本正在为同一确定性 askId 落行、而本次点读抢在其提交前完成时,本副本仍会短路。真解 = 把出处
899
902
  * 判定与 grant 消费合并成**同一次**原子存储操作(带条件 upsert / CAS),属店语义级改动,须本模块属主
900
- * 立件(与上面 R4-F1/A-054.15 两条同源残余同一处置)。「行不在 ⇒ 不短路」不是修法:grant 命中的 ask
903
+ * 立件(与上面 R4-F1/[ref] 两条同源残余同一处置)。「行不在 ⇒ 不短路」不是修法:grant 命中的 ask
901
904
  * 多半头一次到,那等于把一揽子放行整只废掉。窗的上界由本判据定死:行**一提交**窗即关。
902
905
  */
903
906
  private sessionGrantUncontestedByRow;
907
+ /** [ref]:返回值从裸布尔改成「方向 + 编辑载荷」(行带 `updatedInput` ⇒ 一并交出;`undefined` = 不知道)。 */
904
908
  private readDecidedForRecovery;
905
- /** #280 codex R3-F2:同一 askId 下**其余本地注册**(重复注册,见 {@link pendingByAskId} 顶注)按
909
+ /** [ref] codex R3-F2:同一 askId 下**其余本地注册**(重复注册,见 {@link pendingByAskId} 顶注)按
906
910
  * **park 路由**收尾 —— 行已 PARKING,它们看的是同一条行,终局必须与赢家同形(`unattendedPolicy`
907
911
  * 由各自的闭包读同一个口,deny 部署上一起是 deny)。赢家自己此刻已 settle 过、已从集合里摘除,
908
912
  * 故对它重复调用天然无操作。 */
909
913
  /**
910
- * S-43(案A)+ codex R2-[high]:同一条 askId 下,除 `self` 之外**是否还有悬挂登记在候**。
914
+ * [ref](案A)+ codex R2-[high]:同一条 askId 下,除 `self` 之外**是否还有悬挂登记在候**。
911
915
  *
912
916
  * 唯一消费者 = 投递面坍塌的两条臂(取消/断连的 `runCancel`、emit 全灭)。它们的语义是「这条连接没了」,
913
917
  * 而悬挂登记的可达性从不建立在任何连接上 —— 判据与理由全文写在 `runCancel` 的调用点注里(单一属主)。
@@ -915,11 +919,11 @@ export declare class ToolApprovalCoordinator {
915
919
  */
916
920
  private hasOtherSuspendedOwner;
917
921
  private settleSameAskIdParkRoute;
918
- /** #329:落一条 park 墓碑(容量帽按**插入序**逐出最旧,与 `allowAllSessions` 同款有界纪律)。
922
+ /** [ref]:落一条 park 墓碑(容量帽按**插入序**逐出最旧,与 `allowAllSessions` 同款有界纪律)。
919
923
  * 调用点唯一 = `settle` 里的 park 路由支(见那处注);真终局绝不调它。
920
924
  *
921
- * 🔴 **同键第二次调用 = 整个无操作**(A-070 二轮重扫,双 opus confirmed 的修法后半;红先钉
922
- * `test/parked-late-decision.test.ts` 的 A-070-④)。键换成 wire `approvalId` 之后,「同一把
925
+ * 🔴 **同键第二次调用 = 整个无操作**([ref] 二轮重扫,双 opus confirmed 的修法后半;红先钉
926
+ * `test/parked-late-decision.test.ts` 的 [ref]-④)。键换成 wire `approvalId` 之后,「同一把
923
927
  * approvalId 落两次墓碑」从不可能变成**常态**(同 askId 的重复本地注册各自按 park 路由收尾)。
924
928
  * 两件事因此必须同时成立:
925
929
  * · **不占第二格、不动插入序** —— 帽与逐出序是按「对外可见的 ask」记的;兄弟刷新插入序会把一条
@@ -930,11 +934,11 @@ export declare class ToolApprovalCoordinator {
930
934
  * 代价如实登记:`parkedAtMs` 保留**首次** park 的时刻 ⇒ TTL 从首次起算(晚到的兄弟不给续期)。
931
935
  * 方向安全(墓碑早退 = 回落修前的 404,不会错兑),且与「一只 ask 一格」的记账口径自洽。 */
932
936
  private recordParkTombstone;
933
- /** #329:取墓碑(**惰性清扫**:过期条目读到即删,不另起定时器 —— 这张表只在迟到回决那一刻被读)。
937
+ /** [ref]:取墓碑(**惰性清扫**:过期条目读到即删,不另起定时器 —— 这张表只在迟到回决那一刻被读)。
934
938
  * 属主门在调用方(与 live 腿同一句判据:`owner === null` 或逐字相等,否则按不存在处置)。 */
935
939
  private lookupParkTombstone;
936
940
  /**
937
- * #151 车4 §12-E(F29/F30 裁定形):外部回决(车4 端点或本类 respond 腿)**赢下持久 CAS 之后**,把同
941
+ * [ref] 车4 §12-E(F29/F30 裁定形):外部回决(车4 端点或本类 respond 腿)**赢下持久 CAS 之后**,把同
938
942
  * askId 下全部本地悬挂条目按**真实决议**结算——端点已是唯一权威(CAS 已落),本地只是同步终局;查无
939
943
  * 条目(跨副本/无流内窗)= 正常,返回 `{ settled: 0 }`,调用方据此诚实回显 `updatedInputForwarded`。
940
944
  *
@@ -947,7 +951,7 @@ export declare class ToolApprovalCoordinator {
947
951
  settled: number;
948
952
  };
949
953
  /**
950
- * #151 车6:把一张**批级撤卡帧**投给给定的一组连接(live only —— 见 `ApprovalRevokeFrame` 顶注:
954
+ * [ref] 车6:把一张**批级撤卡帧**投给给定的一组连接(live only —— 见 `ApprovalRevokeFrame` 顶注:
951
955
  * 撤卡帧不进 durable tail,丢帧的结构补偿是重连 preamble 的全量对账基准)。
952
956
  *
953
957
  * 空名单不发(零信息的帧只会让壳多一次无意义的对账)。每路独立 catch:一路 emit 失败(连接刚死、
@@ -955,7 +959,7 @@ export declare class ToolApprovalCoordinator {
955
959
  */
956
960
  private emitRevokeTo;
957
961
  /**
958
- * #151 车6 发射点③④:**进程外**收敛器(reaper 腿的 `approval-reconciler.ts`)产出的撤卡帧的投递口。
962
+ * [ref] 车6 发射点③④:**进程外**收敛器(reaper 腿的 `approval-reconciler.ts`)产出的撤卡帧的投递口。
959
963
  * 收敛器没有 ctx —— 它只有行上的 (owner, sessionId, taskId),经 broker 反查该身份下**当前**的活跃
960
964
  * 连接集合。查无活连接 = 正常(壳不在线;重连 preamble 会把这张卡对账掉),返回 0。
961
965
  *
@@ -978,39 +982,39 @@ export declare class ToolApprovalCoordinator {
978
982
  * ctx is no longer a live target — an ask only dies once ALL its targets are gone (fail-closed backstop, the
979
983
  * inverse of question's release-unanswered — but no longer a blunt "any one target exits ⇒ kill it" rule,
980
984
  * see {@link PendingApproval.onTargetGone}).
981
- * [1535] 注意([1539] core 点名的火):委派子代的 ask 经 {@link boundAsk} 落 pending 时不带
985
+ * [ref] 注意([ref] core 点名的火):委派子代的 ask 经 {@link boundAsk} 落 pending 时不带
982
986
  * `targetCtxs`/`onTargetGone`(只有 `originTaskId === undefined` 的宿主自身条目才带)——session-scoped
983
987
  * bg 子代活过宿主 turn 时其未决卡不被这里触碰(TTL/abortSignal 仍兜底)。 */
984
988
  runWithContext<T>(ctx: ToolApprovalRunContext, fn: () => Promise<T>): Promise<T>;
985
989
  /** 测试/可观测性钩子:该 (owner, session/taskId) broker key 下当前活跃连接数——断言多连接注册/清扫
986
990
  * 行为时用,免得伸手进私有内部状态。 */
987
991
  liveConnectionCount(owner: string | null, sessionId: string | undefined, taskId: string): number;
988
- /** `RunnerDeps.onAsk`. core's resolveAsk calls this for each policy `ask` on the sync leg. [879] G1 三值化
992
+ /** `RunnerDeps.onAsk`. core's resolveAsk calls this for each policy `ask` on the sync leg. [ref] G1 三值化
989
993
  * (core 1.295):boolean = 人的决定;`"unavailable"` = 本 ask 到达时刻判无活人可同步送达 —— core 以
990
994
  * approverUnavailable 回路把这只 ask 交回 suspendAsk 走 durable park(park 设施缺席的部署 core 自己
991
995
  * fail-closed deny)。1.199 的「durable 部署不 wire onAsk」止血就此撤除:恒 wire,park 与 live 卡两全。
992
996
  * Arrow property so it can be passed as `onAsk: coordinator.ask` with `this` bound. */
993
997
  ask: (req: AskRequest, signal?: AbortSignal) => Promise<AskOutcome>;
994
- /** [1535] server 半场(审批链战役,[1539] 定谳断点①的修;[1546] HIGH-1 broker 形):宿主 sync
998
+ /** [ref] server 半场(审批链战役,[ref] 定谳断点①的修;[ref] HIGH-1 broker 形):宿主 sync
995
999
  * streaming 腿在装配点以本闭包挂 `spec.onAsk`;core 继承链(parentConstraints 冻结
996
1000
  * `spec.onAsk ?? deps.onAsk`,1.294 起)把它逐 ancestor 冻给每个委派子代——子代(bg/嵌套孙代)的
997
1001
  * 权限 ask 不再依赖 ALS,直达宿主 live 流的审批卡。**闭包只携身份**(owner/taskId/sessionId),
998
1002
  * emit 时经 broker 取该 (owner, session) 的「当前」活跃流(宿主重连/续聊的新 SSE 自动接卡;
999
1003
  * internalsSnapshot 冻结的闭包因此永不携死流)。查无活流 = "unavailable"(G1 回路:durable 部署
1000
- * park;inherited plain-ask 的 park 回路 = core RB-39①,落地前该臂 = deny,与 1.257 前行为一致)。 */
1004
+ * park;inherited plain-ask 的 park 回路 = core [ref]①,落地前该臂 = deny,与 1.257 前行为一致)。 */
1001
1005
  boundAsk: (identity: {
1002
1006
  owner: string | null;
1003
1007
  taskId: string;
1004
1008
  sessionId?: string;
1005
1009
  legKey?: string;
1006
- /** #151 车3 刀 3b(§7.3):本腿的 walltime deadline —— 与 `legKey` 同源同理由,随**出处**走
1010
+ /** [ref] 车3 刀 3b(§7.3):本腿的 walltime deadline —— 与 `legKey` 同源同理由,随**出处**走
1007
1011
  * (子代经继承链拿到的是宿主腿的闭包,窗必须按宿主腿的剩余 walltime 算)。 */
1008
1012
  legDeadlineMonotonic?: number;
1009
1013
  }) => ((req: AskRequest, signal?: AbortSignal) => Promise<AskOutcome>);
1010
- /** 广播版裁决路径——`ask()`(ALS,恒单元素数组)与 `boundAsk`([1559]四多活集合,可能多元素)共用。
1014
+ /** 广播版裁决路径——`ask()`(ALS,恒单元素数组)与 `boundAsk`([ref]四多活集合,可能多元素)共用。
1011
1015
  * 全体 `ctxs` 保证同一 (owner, sessionId)(streamKey 分组不变式;单元素数组平凡成立)。
1012
1016
  *
1013
- * [1559]三 emit-race 加固(回黑板 [1558]三1,core 确认方向):「等 emit 完成」与「等
1017
+ * [ref]三 emit-race 加固(回黑板 [ref]三1,core 确认方向):「等 emit 完成」与「等
1014
1018
  * TTL/abort/respond 三选一落定」显式 race——`emit` 的类型契约允许异步实现(durable-append 目标),
1015
1019
  * 若挂死,旧形 `await ctx.emit(...)` 会让整条 ask 乃至调用方 turn 一起卡死,TTL/abort 定时器虽已
1016
1020
  * 触发也无人读取其结果。核心不变式:race 由非人类结局(TTL/abort)先赢、且 emit 广播尚未有任何一路
@@ -1023,12 +1027,12 @@ export declare class ToolApprovalCoordinator {
1023
1027
  * 404 (no existence oracle), body validated first (400 is existence-independent) — question/steer parity. The HTTP
1024
1028
  * layer owns auth (gatedPrincipal + REQUIRE_PRINCIPAL) before calling.
1025
1029
  *
1026
- * #151 车2(D1/D2):return type 是 UNION,不是把整个方法标 `async`——askStore 缺席时这个方法逐字同步
1030
+ * [ref] 车2(D1/D2):return type 是 UNION,不是把整个方法标 `async`——askStore 缺席时这个方法逐字同步
1027
1031
  * 完成(D1 现行为不变;现存量测试对它的同步断言/`void` 调用零改动)。在场时才真的变成 Promise(D2 的
1028
1032
  * 「settle 前先赢一把 decideAsk CAS」离不开 await,同步函数做不到)。唯一生产调用点(`routes/runs.ts`)
1029
1033
  * 统一 `await`——`await` 对非 Promise 值是恒等操作,两条路径对它透明。 */
1030
1034
  respond(id: string, principal: string | undefined, body: unknown,
1031
- /** #329:发起本次回决的真实 HTTP 请求。**只**沿 PARKED 臂透传给赎回席(那条腿要它做准入解析与
1035
+ /** [ref]:发起本次回决的真实 HTTP 请求。**只**沿 PARKED 臂透传给赎回席(那条腿要它做准入解析与
1032
1036
  * 舰队 scope,与 `/decide` 腿同姿势);live 命中路径一个字节都不看它。缺席 = 非 HTTP 调用点
1033
1037
  * (测试/内部),赎回席按「无请求」形处置。 */
1034
1038
  httpReq?: IncomingMessage): {
@@ -1039,7 +1043,7 @@ export declare class ToolApprovalCoordinator {
1039
1043
  body: unknown;
1040
1044
  }>;
1041
1045
  /**
1042
- * #345:自由文本规则的**裁决前**文本预检 —— 回 `undefined` = 放行(继续正常回决),回一个响应 = 400。
1046
+ * [ref]:自由文本规则的**裁决前**文本预检 —— 回 `undefined` = 放行(继续正常回决),回一个响应 = 400。
1043
1047
  *
1044
1048
  * 🔴 **触发条件与兑付口的前置门逐条同源**,一个都不许多(这是本方法最容易写错的地方):只有在这次回决
1045
1049
  * **真的会去兑付一条自由文本规则**时才预检。任何一条前置门本来就会把兑付挡掉的形(治理档 ask /
@@ -1051,14 +1055,14 @@ export declare class ToolApprovalCoordinator {
1051
1055
  * 那是记录级判据、不是文本级判据,`precheckEditedRuleText` 答不了也不该答。
1052
1056
  */
1053
1057
  private precheckEditedRuleBeforeDecision;
1054
- /** #340:回执上两个新键的**唯一**成形口 —— 只在这次请求真的走了**自由文本臂**时铸。
1058
+ /** [ref]:回执上两个新键的**唯一**成形口 —— 只在这次请求真的走了**自由文本臂**时铸。
1055
1059
  * 候选臂的回执因此逐字节不变(老壳按固定键集解析,多一个键就是一次没人要的 wire 变更)。 */
1056
1060
  private editedArmEcho;
1057
- /** #329:`tool_approval.not_pending` 的**唯一**成形口。文案逐字不变(存量壳/SDK 按它认这条 404),
1061
+ /** [ref]:`tool_approval.not_pending` 的**唯一**成形口。文案逐字不变(存量壳/SDK 按它认这条 404),
1058
1062
  * 只 additive 加判别位;`cause` 缺席 = 这台部署没有行可判(D1 无店)或行形不可信(见各调用点)。 */
1059
1063
  private notPending;
1060
1064
  /**
1061
- * #329 —— live 未命中之后的**状态感知分派**(设计 §三的那张表)。
1065
+ * [ref] —— live 未命中之后的**状态感知分派**(设计 §三的那张表)。
1062
1066
  *
1063
1067
  * 门两道,都在读行之前:①持久店在场(协议上场才有行可读;缺席 ⇒ D1 体逐字不变);②本副本留过
1064
1068
  * park 墓碑且属主门过(墓碑是 wire id ↔ 店内 askId 的唯一桥,见 {@link ParkTombstone})。任一不过 ⇒
@@ -1068,12 +1072,12 @@ export declare class ToolApprovalCoordinator {
1068
1072
  private respondLate;
1069
1073
  /** {@link respondLate} 的读行 + 六态穷举分派(闭集:新增 `AskState` 而不在此表态 = **编译错**)。 */
1070
1074
  private dispatchLateByRow;
1071
- /** #329:迟到腿上的 `persistRule` 兑付面 —— 本地条目(规则车道素材的载体)早已随 park 路由散场,
1075
+ /** [ref]:迟到腿上的 `persistRule` 兑付面 —— 本地条目(规则车道素材的载体)早已随 park 路由散场,
1072
1076
  * 没有任何可对的候选表 ⇒ 如实拒(裁决本身照常受理,与 {@link persistRuleAfterDecision} 的
1073
1077
  * 「失败不翻转裁决」同判)。用既有词 `rule_lane_unavailable`,不为这一支新造词。 */
1074
1078
  private lateRuleRefusal;
1075
1079
  /**
1076
- * #329 G2 —— DECIDED 行的**幂等回放**([4872] 锚③)。
1080
+ * [ref] G2 —— DECIDED 行的**幂等回放**([ref] 锚③)。
1077
1081
  *
1078
1082
  * 同向迟到答与**反向**迟到答同判:都是 200 回放**首决**。反向不是 409、不是报错、更不改判 —— 那是
1079
1083
  * 一个 CAS 败者的诚实答:决议早已由首决落定,这次请求只是晚到,响应体把首决交回去,消费端自判向。
@@ -1085,18 +1089,18 @@ export declare class ToolApprovalCoordinator {
1085
1089
  */
1086
1090
  private replayDecidedAsk;
1087
1091
  /**
1088
- * #329 G1 —— PARKED 行的迟到决议:**桥接既有赎回腿**([4872] 锚①「同腿新调用方,零新终局语义」)。
1092
+ * [ref] G1 —— PARKED 行的迟到决议:**桥接既有赎回腿**([ref] 锚①「同腿新调用方,零新终局语义」)。
1089
1093
  *
1090
1094
  * 为什么桥接而不是在这里 revive-直续:PARKED 的语义是「候下一 run 重呈或 operator 决议」,而
1091
1095
  * operator 决议早有成文入口(`/decide` 那条链:checkpoint decide CAS → resume)。桥接 = 那条链多一个
1092
1096
  * 调用方,单赢者仍是它的 CAS;直续则要发明第三种赎回形,与 core 的 park/revive 契约重叠。
1093
1097
  *
1094
- * 200 是**受理**语义(#316 先例):resume 的驱动是 core 内的 fire-and-forget,结果面走 run/events。
1098
+ * 200 是**受理**语义([ref] 先例):resume 的驱动是 core 内的 fire-and-forget,结果面走 run/events。
1095
1099
  * 非 2xx 原样透出(gate 被别人收走 ⇒ 409 等),绝不粉饰成受理。
1096
1100
  */
1097
1101
  private redeemParkedAsk;
1098
1102
  /**
1099
- * #363 —— **durable 回决腿的规则位**:PARKED 行的迟到决议携 `persistRule` 时,用**行上**的素材兑付。
1103
+ * [ref] —— **durable 回决腿的规则位**:PARKED 行的迟到决议携 `persistRule` 时,用**行上**的素材兑付。
1100
1104
  *
1101
1105
  * 回 `undefined` = 这次请求没带 `persistRule`(一个键都不加,老壳的回执逐字节不变);否则回一个
1102
1106
  * `{rulePersisted, ruleRefusal?, …echo}` 片段,由调用点铺进 200 体 —— 与 live 腿 `withFlag` 的键集
@@ -1104,8 +1108,8 @@ export declare class ToolApprovalCoordinator {
1104
1108
  *
1105
1109
  * ## 素材从哪来(这是本方法存在的全部理由)
1106
1110
  * live 腿的等式左边是**进程内条目** `PendingApproval.ruleLane`,而 park 路由把条目连同素材一起散场
1107
- * 了(#329 的墓碑只桥身份,不携素材)。本腿因此从**行**取,一件一件对着 live 腿的入参:
1108
- * · `command` = `rule_command` 列(**#363 新列**;缺席即本方法唯一的新拒因,见下);
1111
+ * 了([ref] 的墓碑只桥身份,不携素材)。本腿因此从**行**取,一件一件对着 live 腿的入参:
1112
+ * · `command` = `rule_command` 列(**[ref] 新列**;缺席即本方法唯一的新拒因,见下);
1109
1113
  * · `scope` = `rule_scope_root` 列 ⇒ `{kind:"project", root}`,缺席则**不铸 scope**(core 落 global,
1110
1114
  * = live 腿 `material.scopeRoot` 缺席时逐字同形 —— 绝不在坐标系不明时编一个 root);
1111
1115
  * · 候选表 / `toolName` / 治理位 = 行上的 `card_json`(呈卡帧的同一份;**人看见的就是它**)。
@@ -1121,18 +1125,18 @@ export declare class ToolApprovalCoordinator {
1121
1125
  * `updatedInput`(ctrl+g 编辑放行 ⇒ `rule_input_edited`:生效的是编辑后的调用,而候选是从**原始**
1122
1126
  * 命令铸的)→ 候选臂的文本等式。
1123
1127
  *
1124
- * ## 与 live 腿**刻意不同**的一处:没有裁决前的自由文本预检(#345 的那道 400)
1128
+ * ## 与 live 腿**刻意不同**的一处:没有裁决前的自由文本预检([ref] 的那道 400)
1125
1129
  * 那道门的语义是「拒的时候这张卡还在,改好再来」;而本腿走到这里时赎回腿的 CAS **已经赢了**
1126
1130
  * (checkpoint 已被消费),卡不可能还在 —— 400 回去只会把一次**已经生效**的放行谎报成失败。
1127
- * 所以编辑臂在本腿上照旧落「裁决受理 + `rulePersisted:false` + `edit-rejected`」那条老路(= #345
1131
+ * 所以编辑臂在本腿上照旧落「裁决受理 + `rulePersisted:false` + `edit-rejected`」那条老路(= [ref]
1128
1132
  * 之前 live 腿的行为),如实登记为本腿的残余。
1129
1133
  */
1130
1134
  private persistRuleFromRow;
1131
- /** #329:回执/单飞胜者的**回放形** —— 与首次受理同键集,多一位 `idempotent`,`decision` 恒是**受理时**
1135
+ /** [ref]:回执/单飞胜者的**回放形** —— 与首次受理同键集,多一位 `idempotent`,`decision` 恒是**受理时**
1132
1136
  * 那一向(反向重试不改判,与 DECIDED 臂同一条纪律)。 */
1133
1137
  private replayRedeemReceipt;
1134
1138
  /**
1135
- * #154 车二:回决携规则确认 ⇒ prepare→confirm→redeem(实现在 `rules-consent.ts`,本方法只做门与回显)。
1139
+ * [ref] 车二:回决携规则确认 ⇒ prepare→confirm→redeem(实现在 `rules-consent.ts`,本方法只做门与回显)。
1136
1140
  *
1137
1141
  * 三道门,每道都是**拒绝**而不是降级:
1138
1142
  * ① 裁决必须真落定(200)—— 见调用点注;
@@ -1147,17 +1151,17 @@ export declare class ToolApprovalCoordinator {
1147
1151
  * 时仍是纯同步函数(D1)。`askStore`/`askId`/`batchId` 由调用方在已窄化的分支里传入(避免非空断言)。 */
1148
1152
  private respondWithCas;
1149
1153
  /** 回决收尾(D1 现行为逐字不变的那一半)——session allow-all 记账 + settle + 200 响应体。原 `respond()`
1150
- * 方法体的逐字搬运(#151 车2 拆分,行为零改动)。 */
1154
+ * 方法体的逐字搬运([ref] 车2 拆分,行为零改动)。 */
1151
1155
  private finishRespond;
1152
- /** #315([4658] 案):live pending 的**列表读面**——`GET /v1/approvals` 响应第二顶层键 `livePending`
1156
+ /** [ref]([ref] 案):live pending 的**列表读面**——`GET /v1/approvals` 响应第二顶层键 `livePending`
1153
1157
  * 的唯一数据源。纯读投影,零锁/零结算语义;行键集刻意窄(**input/args 不上列表**,不开第二个脱敏
1154
1158
  * 面;详情走流帧)。`scope` 与 durable 面同一表达式:`undefined` = operator 全量(含 owner null 的
1155
1159
  * 条目),串 = 只见 `owner === scope` 的条目(null-owner 行对 principal 不可见,fail-closed——
1156
1160
  * 宁少列不超范围;`"__none__"` 未鉴权哨兵自然恒空)。行的 `approvalId` 就是 `respond()` 收的 id
1157
- * (同源可达,A-058 判据);`expiresAtMs` 照抄登记时单点铸定的窗死线(#288 三键同一个数)。 */
1161
+ * (同源可达,[ref] 判据);`expiresAtMs` 照抄登记时单点铸定的窗死线([ref] 三键同一个数)。 */
1158
1162
  listLivePending(scope: string | undefined): LivePendingRow[];
1159
1163
  /**
1160
- * 🔴 S-43(案A)追记 F4 —— **跨副本决议的执行通知**(悬挂行的一次终态轮询)。
1164
+ * 🔴 [ref](案A)追记 F4 —— **跨副本决议的执行通知**(悬挂行的一次终态轮询)。
1161
1165
  *
1162
1166
  * ## 缺口的准确形状(别照抄第一版叙述)
1163
1167
  * 案A 的**发现**路径经 durable 腿本就跨副本可达:悬挂 ask 落的是共享店里的 `STREAM_PENDING` 行,
@@ -1187,7 +1191,9 @@ export declare class ToolApprovalCoordinator {
1187
1191
  * {@link settleSameAskIdParkRoute};`DENIED|VOID` ⇒ 裸 deny(同 {@link settleVoidedSiblings} 的形)。
1188
1192
  * · 同一 askId 只读一次(多条本地注册共享一次点读)。
1189
1193
  *
1190
- * 返回 `{ polled, settled }` —— `polled` = 本轮真去店里点读的 askId 数,`settled` = 被唤醒的**本地条目**数。
1194
+ * 返回 `{ polled, settled, backlog, truncated }` —— `polled` = 本轮真去店里点读的 askId 数,`settled` =
1195
+ * 被唤醒的**本地条目**数,`backlog` = 本拍收尾时**还没轮到**的悬挂候选剩余数(`candidates.length -
1196
+ * polled` 下界 0),`truncated` = 帽/预算截断位(F4;截断同拍响亮 warn,键同名同值)。
1191
1197
  */
1192
1198
  pollSuspendedDecisions(): Promise<{
1193
1199
  polled: number;
@@ -1196,7 +1202,7 @@ export declare class ToolApprovalCoordinator {
1196
1202
  truncated: boolean;
1197
1203
  }>;
1198
1204
  /**
1199
- * S-43(案A)+ codex [critical] 的**前置门读口**:本副本对这条持久 askId 还有几条**未结算**的活体登记。
1205
+ * [ref](案A)+ codex [critical] 的**前置门读口**:本副本对这条持久 askId 还有几条**未结算**的活体登记。
1200
1206
  *
1201
1207
  * 唯一消费者 = durable 回决口(`routes/runs.ts`)在 CAS **之前**判「这次带来的 `updatedInput` 交得出去
1202
1208
  * 吗」—— 交不出去就响亮拒,绝不静默把编辑降级成不带编辑的批准(判据与理由全文在那个调用点)。
@@ -1205,7 +1211,7 @@ export declare class ToolApprovalCoordinator {
1205
1211
  */
1206
1212
  liveConsumerCount(askId: string): number;
1207
1213
  /**
1208
- * 🔴 S-43 + codex R3-[critical](真缺陷,红先复现器在 `test/case-a-reachability-queue.test.ts` 同名格)
1214
+ * 🔴 [ref] + codex R3-[critical](真缺陷,红先复现器在 `test/case-a-reachability-queue.test.ts` 同名格)
1209
1215
  * —— **带编辑的决议在飞期间,观察者不结算**。
1210
1216
  *
1211
1217
  * 病灶:`decideAsk` 是「提交 → **另起**一次回读」的形。带 `updatedInput` 的请求 W 赢下 CAS 之后、
@@ -1251,7 +1257,12 @@ export declare class ToolApprovalCoordinator {
1251
1257
  *
1252
1258
  * 收口形 = **一个判据函数、五处消费**(上面三处 + 轮询 + HTTP 观察者):把「行说 approve」这件事
1253
1259
  * 在弃单墓碑在场时翻译成 `"unavailable"`(park 路由,可逆可再批),其余取值逐字透传。
1254
- * 判据只认**行派生**的放行 —— 人的当次决议带着 `updatedInput` 走的是另一条路,不经本函数。
1260
+ * 判据只认**不带编辑的行派生**放行(裸 `true`)—— 人的当次决议带着 `updatedInput` 走的是另一条路,不经
1261
+ * 本函数;[ref] 之后行上带编辑的 approve 回放出来是对象臂 `{allow:true, updatedInput}`,载荷**在行上**,
1262
+ * 墓碑要护的「证不出载荷」这件事对它不成立,同样原样透传。
1263
+ * ⚠️ 既有边界如实记([ref] 随批复核):列在之后,一只 ask 的决议**要么**带编辑落列(回放恒对象臂,本
1264
+ * 守卫永不命中)**要么**从没带过编辑(从没设过在飞标记,永无墓碑)⇒ 本守卫在新行上结构上不再可达,
1265
+ * 留着只为老进程/老行的并存窗与既有判据格;拆除是独立件([ref] 登记),不搭本批。
1255
1266
  */
1256
1267
  private guardRowDerivedApprove;
1257
1268
  /** 丢一枚弃单墓碑的**唯一**口(过期 / 容量逐出共用):先把它还在保护的本地消费者按 park 路由收掉,
@@ -1269,10 +1280,10 @@ export declare class ToolApprovalCoordinator {
1269
1280
  setAbandonedEditTombstoneDeadlineForTest(askId: string, atMs: number): void;
1270
1281
  /** Test/observability hooks. */
1271
1282
  pendingCount(): number;
1272
- /** S-43:当前挂着的**悬挂**条目数(零投递集合铸的那一类)——运维/判据读它证「悬挂队列有多长」。 */
1283
+ /** [ref]:当前挂着的**悬挂**条目数(零投递集合铸的那一类)——运维/判据读它证「悬挂队列有多长」。 */
1273
1284
  suspendedCount(): number;
1274
1285
  sessionAllowedCount(): number;
1275
- /** #329:当前在场的 park 墓碑数(有界性的可观测面 —— 判据据它证「帽是硬的、过期会被清」)。 */
1286
+ /** [ref]:当前在场的 park 墓碑数(有界性的可观测面 —— 判据据它证「帽是硬的、过期会被清」)。 */
1276
1287
  parkTombstoneCount(): number;
1277
1288
  }
1278
1289
  //# sourceMappingURL=tool-approval.d.ts.map