/** * 流内审批协议([ref] §3.0 对账三约束)的**终态归因词表** —— [ref] 车5。 * * 两组常量、**两个不相交的值域**(车5 §8 C-1 裁定,与车4 F34 同向): * - {@link DENY_REASONS} —— `DENIED` 终态的归因。v1 是**单员闭集**:`routing_failure_fail_closed`。 * - {@link VOID_REASONS} —— `VOID` 终态的归因。 * * 🔴 为什么必须分两组、禁混值域:§3.0 的对账约束②是「**超时永不产生 denial**」,而审计面唯一能证明这条 * 的东西就是终态 + 归因的组合。人拒恒为 `DECIDED(decision=deny)`(车4 §8),路由失败恒为 * `DENIED(routing_failure_fail_closed)`,撤卡/取消/遗孤恒为 `VOID()`——三者在 * wire 与审计上全程可分。若两组共用一个值域(或某个值同时可落两种终态),「这条 deny 是人做的、还是 * 路由失败、还是超时兜底」就再也无法从行上读出来,归因诚实性(§6.1)当场失效。 * * 落列面:两组值都写进 `approval_ask.denied_reason`(VARCHAR(64))——列名沿用车1 的 DDL(本车不改列), * 但它承载的是**终态归因**而不只是「拒绝理由」。读者靠「值属于哪一组」判别是哪条臂写的,这正是两组 * 值域不相交这条纪律的用处(`ALL_TERMINAL_REASONS` 的机器判据钉住不相交性)。 * * 写点纪律(grep 钉):全仓 `DENIED` 只有**一个**写点 = 收敛器判据 2 的非取消臂(`approval-reconciler.ts`)。 */ /** `DENIED` 终态的归因闭集(v1 单员)。 */ export declare const DENY_REASONS: { /** * 收敛器判据 2:出处 run 已到**非 suspended 的终局**(completed / blocked / 非取消的 failed)而始终 * 没有出现与本 ask 匹配的 checkpoint ⇒ 这只 ask 的投递面永远不会再出现,fail-closed 收 `DENIED`。 * 🔴 证据是**行的终局态**(journal 的肯定证据),不是「等够久了」——约束②因此成立。 */ readonly ROUTING_FAILURE: "routing_failure_fail_closed"; }; export type DenyReason = (typeof DENY_REASONS)[keyof typeof DENY_REASONS]; /** `VOID` 终态的归因闭集。 */ export declare const VOID_REASONS: { /** 判据 2 的取消分臂(§9 C3):run `failed ∧ errorCode==="cancelled"` ⇒ 取消不是路由失败,收 VOID。 */ readonly RUN_CANCELLED: "run_cancelled"; /** 判据 2 的取消分臂之二:批行已 `ABORTED`(取消腿打过 `abortBatch`)⇒ 同 abort 语义。 */ readonly BATCH_ABORTED: "batch_aborted"; /** * bind-once 的**落选者**(codex 交叉复审 round2 R2-3,2026-08-06 验真):批已 `ROUTING_BOUND` 且 * `bound_ask_id` 是**别人**——本行永远赢不了 `bindBatch`(谓词要求 `state='ROUTING_UNBOUND'`), * 却又不是路由失败(投递面好好的,只是这个决策点选了兄弟)。172 §3.0 的 bind-once 字面就是「非中选 * 兄弟收敛 VOID」;`bindBatch` 的原子事务只连坐它当时看得见的 PARKING 兄弟,**之后**才进入 PARKING 的 * 迟到行(late `ensureAsk` + `expireAsk` 不查批态,设计如此)由收敛器补判——就是这条臂。 * 不这么判的后果:该行滞留到 run 终局,然后被判据 2 误报成 `routing_failure_fail_closed`(归因失真)。 */ readonly BATCH_BOUND_ELSEWHERE: "batch_bound_elsewhere"; /** 判据 4:adhoc 腿(`sessionId === taskId` ∧ `getRun` 无行)窗过 + 宽限 —— 该腿形**结构上**没有 * durable 对账域(一次性 taskId 不进 runStore,park 目的地不可寻址),流死即 abort 语义。 * 🔴 落 VOID 不落 DENIED:VOID 不是 denial,约束②不被触碰。 */ readonly ADHOC_LEG_NO_DURABLE_DOMAIN: "adhoc_leg_no_durable_domain"; /** 判据 5:任何在 `STREAM_APPROVAL_ORPHAN_TTL_MS` 内仍未收敛的 `PARKING` 行(量 immutable 的 * `createdAtMs`,§9 C5)—— 约束①(遗孤最终可判)的最后兜底,带一条 warn。 */ readonly ORPHAN_TTL_EXCEEDED: "orphan_ttl_exceeded"; }; export type VoidReason = (typeof VOID_REASONS)[keyof typeof VOID_REASONS]; /** 两组的并集(机器判据用:值域不相交 + 列宽 ≤ 64 的钉子在 test/approval-reconciler.test.ts)。 */ export declare const ALL_TERMINAL_REASONS: readonly string[]; //# sourceMappingURL=approval-deny-reasons.d.ts.map