@sema-agent/client-core 0.84.0 → 0.85.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 (101) hide show
  1. package/CHANGELOG.md +247 -0
  2. package/README.md +27 -13
  3. package/dist/abortableSleep.d.ts +10 -0
  4. package/dist/abortableSleep.js +37 -0
  5. package/dist/adapt/arms.js +1 -1
  6. package/dist/adapt.d.ts +1 -1
  7. package/dist/adapt.js +1 -1
  8. package/dist/adapter/downstream/terminalToSdkResult.d.ts +1 -0
  9. package/dist/adapter/downstream/terminalToSdkResult.js +19 -10
  10. package/dist/adapter/runStream.js +6 -2
  11. package/dist/agentSession/engineSessionBackgroundStop.d.ts +50 -0
  12. package/dist/agentSession/engineSessionBackgroundStop.js +291 -0
  13. package/dist/agentsWireCaps.d.ts +2 -1
  14. package/dist/agentsWireCaps.js +8 -0
  15. package/dist/cloudConfigWireCaps.js +2 -1
  16. package/dist/corruptSession.d.ts +3 -0
  17. package/dist/corruptSession.js +29 -0
  18. package/dist/corruptSessionCopy.d.ts +1 -0
  19. package/dist/corruptSessionCopy.js +4 -0
  20. package/dist/decideFailureNote.d.ts +2 -1
  21. package/dist/decideFailureNote.js +8 -3
  22. package/dist/decideReceipt.d.ts +6 -0
  23. package/dist/decideReceipt.js +30 -1
  24. package/dist/detachWire.d.ts +1 -0
  25. package/dist/detachWire.js +13 -5
  26. package/dist/displayUntrusted.js +114 -18
  27. package/dist/effortWire.d.ts +2 -1
  28. package/dist/effortWire.js +2 -4
  29. package/dist/engineErrorCodes.d.ts +11 -0
  30. package/dist/engineErrorCodes.js +32 -0
  31. package/dist/engineNoticeCodes.d.ts +39 -4
  32. package/dist/engineNoticeCodes.js +117 -161
  33. package/dist/engineWireFor.d.ts +43 -0
  34. package/dist/engineWireFor.js +399 -0
  35. package/dist/engineWireSdk.d.ts +6 -0
  36. package/dist/fileHistoryCaptureCapability.d.ts +4 -1
  37. package/dist/fileHistoryCaptureCapability.js +43 -9
  38. package/dist/gateVocabulary.d.ts +1 -2
  39. package/dist/gateVocabulary.js +1 -22
  40. package/dist/generated/engineNoticeTables.d.ts +3 -0
  41. package/dist/generated/engineNoticeTables.js +156 -0
  42. package/dist/generated/toolNameTables.d.ts +2 -0
  43. package/dist/generated/toolNameTables.js +43 -0
  44. package/dist/headlessPermissionModeWire.js +2 -4
  45. package/dist/hitl/askGateWire.d.ts +1 -1
  46. package/dist/hitl/askGateWire.js +1 -1
  47. package/dist/hitl/frameRouter.js +4 -2
  48. package/dist/hitl/hitlHostSurface.js +1 -1
  49. package/dist/hitl/parkResolver.d.ts +1 -0
  50. package/dist/hitl/parkResolver.js +11 -3
  51. package/dist/hitl/planReviewWire.d.ts +41 -3
  52. package/dist/hitl/planReviewWire.js +264 -49
  53. package/dist/hitl/rosterMountedNames.d.ts +2 -0
  54. package/dist/hitl/rosterMountedNames.js +38 -0
  55. package/dist/hitl/sessionPolicyDeliverable.d.ts +8 -2
  56. package/dist/hitl/sessionPolicyDeliverable.js +39 -48
  57. package/dist/hitl/sessionPolicyWire.d.ts +40 -0
  58. package/dist/hitl/sessionPolicyWire.js +173 -0
  59. package/dist/hitl/toolApprovalWire.d.ts +4 -2
  60. package/dist/hitl/toolApprovalWire.js +6 -4
  61. package/dist/index.d.ts +10 -3
  62. package/dist/index.js +7 -2
  63. package/dist/liveInitToolFace.js +28 -10
  64. package/dist/permissionWireCaps.d.ts +2 -1
  65. package/dist/permissionWireCaps.js +2 -7
  66. package/dist/request/taskRequest.d.ts +2 -0
  67. package/dist/request/taskRequest.js +18 -1
  68. package/dist/resumeRefusalCopy.d.ts +11 -0
  69. package/dist/resumeRefusalCopy.js +42 -2
  70. package/dist/runTerminal.js +4 -0
  71. package/dist/sandboxWire.js +1 -1
  72. package/dist/sealedKeyCapability.d.ts +17 -0
  73. package/dist/sealedKeyCapability.js +42 -0
  74. package/dist/seatContract.d.ts +2 -1
  75. package/dist/seatContract.js +5 -21
  76. package/dist/subagent/engineCompactWire.d.ts +13 -2
  77. package/dist/subagent/engineCompactWire.js +48 -37
  78. package/dist/subagent/engineDelegatedPrompt.d.ts +9 -1
  79. package/dist/subagent/engineDelegatedPrompt.js +16 -16
  80. package/dist/subagent/engineRowStopGate.d.ts +2 -2
  81. package/dist/subagent/engineRowStopGate.js +4 -4
  82. package/dist/subagent/engineSubagentOutput.d.ts +8 -0
  83. package/dist/subagent/engineSubagentOutput.js +37 -18
  84. package/dist/subagent/engineSubagentResume.d.ts +11 -2
  85. package/dist/subagent/engineSubagentResume.js +28 -14
  86. package/dist/subagent/engineSubagentSteer.d.ts +10 -1
  87. package/dist/subagent/engineSubagentSteer.js +16 -11
  88. package/dist/subagent/engineSubagentTail.d.ts +10 -1
  89. package/dist/subagent/engineSubagentTail.js +35 -17
  90. package/dist/subagent/engineTaskHandleWire.d.ts +13 -0
  91. package/dist/subagent/engineTaskHandleWire.js +41 -20
  92. package/dist/systemReminderTag.d.ts +5 -0
  93. package/dist/systemReminderTag.js +20 -9
  94. package/dist/taskRequestWords.d.ts +5 -0
  95. package/dist/taskRequestWords.js +4 -0
  96. package/dist/wireErrorTriage.d.ts +1 -0
  97. package/dist/wireErrorTriage.js +3 -1
  98. package/dist/wireRefusalCopy.d.ts +10 -0
  99. package/dist/wireRefusalCopy.js +62 -2
  100. package/docs/INTEGRATION-CLIENTS.md +1128 -22
  101. package/package.json +1 -1
@@ -19,11 +19,11 @@
19
19
 
20
20
  | 项 | 值 | 真源 |
21
21
  |---|---|---|
22
- | 本包 | `@sema-agent/client-core` **0.84.0**(本批发布版 = **minor**:peer sdk 地板 `>=11.3.0` → `>=12.0.1`;后台代理登记读数 —— 读口 / 取代判定 / 归类口 / 登记键桥 / 补行谓词,缺席行下半场(CC-194);读目录授权结论通告读口 `readReadRootGrantNotice`(CC-185);接线回执 `hands` 段 `_sema_hands` + 读口 `handsSeamReadingOf` / `handsSeamDetail`,`handsMountedDetail` 坏入参不再抛(CC-206);陈旧逻辑清扫(CC-223):退役键 `rewind.rewindFiles` 构造期拒收、`WorkflowRunState.agentCount` 改可选、26 个内部件退出根入口、九张公面判定表换只读 Set 子类、十五张判定数组冻结、`resume_at` 文本兼容腿退役;根公面 1278 → 1260;公面类型 +10;§107)。上一版 0.83.6 = **patch**:会话规则记录的无损判定 `sessionPolicyDeliverable` 把引擎会在准备阶段拒启的两类名字(引擎退役名、含 `__` 而不以协议前缀开头的名字)改判「不写」,成因词 `legacy_tool_name`(闭集 5 → 6),引擎说「改名为 X」的退役名带 `currentName` 出路位;`peer_wide` 那句改措辞(判决不变)(CC-226);根公面 1278 不变;peer sdk 地板 `>=11.3.0` 不动;§106)。上一版 0.83.5 = **patch**:展示层出口 `displayUntrusted` 的连接符 ZWJ / ZWNJ 按语境判(🔴 默认形输出字节变)、两只可选开关 `escapeBackslashes` / `blanks` 与标记位置读口 `displayUntrustedMarks`(CC-204);凭据两网的判别视图认孤代理项,机读字节 `errors[]` / 合成终局行同批(CC-207);转义记号在凭据再扫里原子与四处凭据读法存量修复(相对 0.83.4 零新增外泄);hooks 启动模式可选词读口 `SettingsPort.hooksStartupMode()`,安全 / bare 模式下设置来源只发 managed(CC-200),设置来源里同一条 hook 只发一份(CC-208);自愈三条重发结局 +1 可选位 `releaseConfirmedByEngine`、行句按释放证据分说(CC-212);活段接入指引订正;公面类型 +3;peer sdk 地板 `>=11.3.0` 不动;根公面 1278;§105)。上一版 0.83.4 = **patch**:只增 —— plan 审批卡「用户亲手关掉的卡,自动触发不在同一道门上放回屏上」的判定归包(`reopenPlanReviewCard` 加触发者位 `trigger`、拒开位 `dismissedByUser`,409 自愈腿按提交出身替宿主传触发者、结局与整行由包出;CC-201);座位审批请求补强制位 / 强制理由词 / 报价缺席因由 / 出身词四个可选位与过境口 `toolPermissionRequestAskBits`(CC-203);`<system-reminder>` 剥离 / 解包两只口上公面并改线性时间(CC-205);两条展示层接入指引订正;开发依赖引擎 `~7.33.1`;公面类型 +2;peer sdk 地板 `>=11.3.0` 不动;根公面 1277;§104)。上一版 0.83.3 = **patch**:入参 / 来源面 —— hooks 投影加 flag 来源(`--settings` 那一层,排在 local 之后;设置来源 hooks 维持托管在前拼接);规则列举口 `listAllPersistedRules` 入参只要 `list`(`RulesListFacade`,其余四口作可选成员);模型身份认目录缺省(本机读数加宿主报位 `engineAcceptsCatalogDefault`,位 `true` 才算目录可解析);公面类型 +1;peer sdk 地板 `>=11.3.0` 不动;根公面 1273;§103)。上一版 0.83.2 = **patch**:只增 —— 审批卡一族三件(常驻姿态下的放行谓词 `askSurvivesPosture`,三态、「不知道」不折成放行;卡上 `mandate` 六词闭集 + 读口 + 每词一句说明,通告码册 +2,开发依赖引擎 `~7.32.0`;停泊卡带出身词 `origin`;CC-193 / CC-195 / CC-196)与后台子代缺席行的判定、计数、sweep 豁免、回收与措辞单源(回收只在后台代理登记确认离场时;CC-194);公面类型 +13;peer sdk 地板 `>=11.3.0` 不动;根公面 1273;§102)。上一版 0.83.1 = **patch**:只增 + 行为订正 —— 展示层安全出口三端单源 `displayUntrusted`(凭据两网 ∘ 字符三网,选项按载体选;CC-112);本包合成的终局行正文与结果帧 `errors[]` 在铸点洗凭据(`errors[]` wire 可见,方向只会更安全)、交互车道合成行带上行类旗,回决备注与子代续跑收据多收双向 / 格式字符(CC-187 / CC-112);会话规则记录的无损判定 `sessionPolicyDeliverable` + 措辞单源 `sessionPolicyWithheldNotice` + 五词成因 `SESSION_POLICY_WITHHELD_WHY`(整批可送才送,首尾带空白的名字比宿主侧更严;CC-117);插件 hook 每轮计划 `hooksWirePlan` + `SettingsPort` 可选读口 `enabledPluginHooks` + `hooksForWire({ plan })`,逐条判「投给引擎 / 本客户端执行 / 如实不跑」、开机「不会执行」清单与 `/hooks` 标注措辞单源(投给引擎那一臂候引擎能力位 `taskSettings.pluginHooks`),设置来源的 `mcp_tool` 与 exec 形 hook 条目不再上请求体、手写的 `plugin` 键剥掉(CC-174);公面类型 +26;peer sdk 地板 `>=11.3.0` 不动;根公面 1254;§101)。上一版 0.83.0 = **minor**:行为面与型面都有 BREAKING —— CC 形消息 24 项按裁定 C-R103 退役名:结果帧 `degraded` / `errorCode` / `model` 与错误信封 `result` → `_sema_model_degraded` / `_sema_error_code` / `_sema_selected_model` / `_sema_salvaged_result`,合成终局行 `isApiErrorMessage` → `_sema_api_error_message`,工具结果记录删过渡名 `toolUseResult`,system 行 `attachedFiles` → `_sema_attached_files`、到达时戳 `timestamp` 与 `isMeta` 删,print 完成通知帧十三键平铺 `_sema_*`,记忆写入改走 chrome 臂 `memory_saved`(新型 `MemorySavedChromeEvent`,`CHROME_ARMS` required);本包只铸新名、端两名并读一版 + 结果帧 CC 键 `terminal_reason` 与读口 `terminalReasonForResult`(CC-175),错误信封知道就铸 `_sema_selected_model` + 转录 id 改 UUID 形(CC-147)+ `SettingsPort` 可选合并读口 `mergedDisableAllHooks`、用户层 `disableAllHooks` 在引擎腿上生效(CC-162)+ 退化审批卡三形拒收改写、`FsApprovalOutcome` 的 `failed` 臂 +可选位 `editRefused`(CC-135)+ 注入件自愈句整族重写 + 联网搜索旧三读口 `webSearchFromEnv` / `webSearchFromSettings` / `resolveWebSearch` 退出公面,`resolveLiveInitToolFace` 可选 `opts.webSearchStamped`(`LiveInitToolFaceOptions`),endpoint userinfo 律跟服务端 7.101.0(CC-184)+ 公面类型 −4(CC-171)+ 通告码册 69 → 71 与结构化卡白名单 +`read-inbox`(CC-186,开发依赖引擎 `~7.31.0`)+ 合成终局行 `uuid` 改 UUID 形;peer sdk 地板 `>=11.3.0` 不动;根公面 1238;§100)。上一版 0.82.7 = **patch**:只增不改 —— 每请求联网搜索配置的三态判决 `judgeWebSearchSettings` / `webSearchVerdictFromEnv` / `resolveWebSearchVerdict`(与 7.100.0 及以后 server 的受理判官同序同判,认不出的 provider 判形错、不再静默丢段;settings 段凭据注入回调 `apiKeyFor`)+ 措辞单源 `webSearchVerdictMessage`(不回显任何用户配的值)+ 调试日志用 `webSearchEndpointForDisplay`;旧三读口 `webSearchFromEnv` / `webSearchFromSettings` / `resolveWebSearch` 行为不变、标过渡期,0.83.0 删(CC-182);peer sdk 地板 `>=11.3.0` 不动;根公面 1240;§99)。上一版 0.82.6 = **patch**:只增不改 —— 停泊行上选「本会话允许」却没被记住时与活卡腿同句告知(回体 `rememberApplied: false`,或 server 以会话级放行专属拒绝码拒了 remember 后回退普通批准;其余失败一律未知不告知),回执 `DecideReceiptView` +1 可选位 `rememberApplied`(CC-181);决断落定后与桥重试臂的诊断留痕不再因宿主日志口抛错回流进决断;接入文档改口:server ≥7.100.0 上 park 行卡的 `requiresRealApproval` / `approvalIsMandated` 生效(CC-180,零代码改动);peer sdk 地板 `>=11.3.0` 不动;根公面 1235;§98)。上一版 0.82.5 = **patch**:只增不改 —— print 车道 init 帧工具面名册优先:流包装器 `withPrintInitFrame`(首选接法,init 恒为首行、其后按到达序)/ 判定闸 `createPrintInitGate` / 分类口 `printInitRosterSignal` / 判定口 `decidePrintInitToolFace` / 留痕措辞 `printInitToolFaceDebugLine` + 等待上界 `PRINT_INIT_ROSTER_WAIT_MS`(150 000);回落估计表补 `ListAgents`(7.30.0 及以后的引擎上与 `SendMessage` 同条件)(CC-169);peer sdk 地板 `>=11.3.0` 不动;根公面 1235;§97)。上一版 0.82.4 = **patch**:只增不改 —— park 行审批卡新增门类位 `irreversibleParkGate`(待决行门类恰为 irreversible_ask,今天即生效,门类事实不是保证);`requiresRealApproval` 在待决行顶层带时透传(就绪,待决列表带出后才生效,今天零行为变化)(CC-180);`ApprovalCardRequest` +1 可选位;peer sdk 地板 `>=11.3.0` 不动;根公面 1229;§96)。上一版 0.82.3 = **patch**:只增不改的公面 —— 自愈提示的「保住对话」出路槽 `keepSessionWayOut` 与交互面引擎决断入口开关 `engineDecidePath`(CC-177;两位都不给时措辞与 0.82.2 逐字节同);自愈结局两臂 +机读位 `pendingRowGone`(重开链证实待决项已不在);peer sdk 地板 `>=11.3.0` 不动;根公面 1229;§95)。上一版 0.82.2 = **patch**:只增不改的公面 + 若干行为订正 —— 新增措辞单源 `cloudEffectiveNotices`:云控制面有效配置回体的降级告警 / 预算 / 能力上限三读数(CC-164,四态,不读成 0 或「没有预算」);本机引擎 models 文档在宿主注入本机条目判定 `entryAccepted` 时补 `default` / `tierGroups` / `activeTierGroup`,剔掉会让本机整份拒收的目录引用与判定口不收的条目,去掉 registry 注记键 `origin` / `overridesTeam`(CC-165;结果新增 `modelRefIssues`);计划复核结局机读位 `_sema_planReviewOutcome`(CC-160 ①);停泊审批决断操作起止回调 `onDecideOperation` 与操作句柄 `openDecideOperation`(CC-160 ③);新增超集键 `_sema_planReviewOutcome`;peer sdk 地板 `>=11.3.0` 不动;根公面 1229;§94)。上一版 0.82.1 = **patch**:只增不改的公面 + 若干行为订正 —— 新增读口 15 个(续跑折叠码读口与措辞 / 文件历史捕获读口六口 / 模型身份可解析判据五口 / 自定义代理载荷作废重投口 / 决断失败码「门还在」判定)+ 宿主车道声明 `EmitContext.lane`;新增超集键 `_sema_response_model`(终帧 / 每轮用量)与 chrome 用量两臂 `responseModel`、重开判决 `_sema_decisionInFlight`、自愈结局两臂 `decisionInFlight`、内部臂 `_sema_denial_unclassified`、通知码 +1;行为订正:计划复核决断在飞不重开卡且自愈提示不再教人再决一次(CC-160 ②)、决断出口补折叠句且停泊腿不再把折叠 / 坏档误判已决(CC-154)、执行车道 `in-process` 措辞(CC-153)、`-p` 车道 Bash 良性退出与交互同判(CC-168)、`-p` 工具结果帧补结构化结果(CC-149)、被拒分类词两车道同判(CC-172)、非交互车道子代工具帧(CC-158,宿主声明车道才生效)、终帧被拒清单对账流内拒绝(CC-159)、自定义代理载荷作废重投(CC-161);peer sdk 地板 `>=11.3.0` 不动;根公面 1228;§93)。上一版 0.82.0 = **minor**:只增不改 —— 新增只读读口 17 个 + 1 常量、工具名册行一格 `mountedBy`、turn 错误判决 `http` 臂一格 `storedRowWhere`:`/rewind` 代码档与对话档能不能用由引擎能力位回答(CC-146)、云控制面额度读数三分(CC-150)、装配期「这一条腿有没有手」(CC-152)、续跑拒收按原码判(CC-154);两处既有面行为订正:自动模式分类器拒的类别词由 `permission-rule` 改为 `automode-*` 三词(CC-155,订正 0.81.1)、续跑上下文读不出时引擎点名的那一行不再丢(CC-156);0.81.0 预告的 23 键 + 1 子型删改**改到 0.83.0**(§92y ㉙);零 wire 键、零投影臂;peer sdk 地板 `>=11.3.0` 不动;§92。上一版 0.81.1 = **patch**:被拒分类词读器加第③路(CC-148):引擎「没问过就拒」的工具调用(deny 规则 / 权限模式 / hook / 分类器 / 写保护 —— 无 `settlement` 只有 `gate.disposition.deniedBy`)在 user 工具结果记录与终帧 `permission_denials[]` 上此前恒缺 `_sema_denial_kind` / `toolDenialKind`,现按层名落 `permission-rule`(其中「分类器」一项已由 0.82.0 CC-155 订正)(`ask_resolution` 无结算 / 结算段不成形 / 层名表外仍缺席不猜);交互与 `--print` 两条车道同一只读器;另钉终帧两臂 `_sema_effective_*` 键集不变量 —— 成功臂展开单铸函数、错误信封显式重发,覆盖性钉在返回对象自己的类型上(漏键 / 多键编译期即红)+ 门格判两臂键集相等且值逐字节同,给单铸函数加键时错误臂不会再静默少键(本版无键增减);零 wire 键、零投影臂、根公面 1195;§91。上一版 0.81.0 = **minor**:CC 形消息一张脸(C-R85 / CC-131):user 工具结果记录加 SDK 面键 `tool_use_result`(与过渡键 `toolUseResult` 同引用,删驼峰原定 0.82.0、已改到 0.83.0)+ DS-19 普查门升硬门(键集按语法解析、按 type/subtype 分表;23 键 + 1 子型过渡表到期窗原为 0.82.0、已改到 0.83.0,零常驻豁免)+ CC-145 `/rewind` both 臂改发 `restoreFiles:true`、`projectRewind(pending)` 单参;零 wire 键、零投影臂、根公面 1195;§90。上一版 0.80.2 = **patch**:`conflict.resume_context_unavailable` 的 `staleAfterSec` / `runId` 在真 SDK 上读不到(CC-137:sdk 11.1.0 起 `APIError` 把体上非具名键收进 `extra`,这一码映射成 `ConflictError` 无具名位,读口只读顶层 ⇒ 真调用链恒缺席)⇒ 体源结构位改「顶层有效值优先、`extra` 兜底」三只类型化读口单铸,有具名子类位的三处(`retryAfterSec` × 2 / `allowlist`)行为不变只多兜底,头源 `retryAfterMs` 只读具名位;零 wire 键、零投影臂、根公面 1195;§89。上一版 0.80.1 = **patch**:去键重发判据句按「铸」计(CC-143;§87「带键的体恰一次」作废 → 被铸恰一次,POST 几次随传输层)+ 接入文档段落自带射程限定词自 §88 起向前执法 + 模型预设表 deepseek 项改闭集真名 deepseek-flash(CC-144,C-R82 ①)+ 门里 git 兜底自陈探针(CC-142);零 wire 键、零投影臂、根公面 1195;§88。上一版 0.80.0 = **minor**:🔴 peer sdk 地板 >=11.2.1 → >=11.3.0 + 策略拒的归因上 wire(CC-133:发送面 deny+policy 带 settledBy / 读侧 policy_refused 十三词入 CC 规则桶 / 三错误码读口 / 直连门去键重发恰一次)+ 删除规则后果句归包(CC-132)+ /mcp 详情卡两腿分说归包(CC-134:六档读口 + 九句铸点,同批改口八处说满的话)+ 🔴 终帧旧拼法 `structuredOutput` 按 0.79.1 的宣告删除(只剩 CC 形 `structured_output`);根公面 1195;§87。上一版 0.79.1 = **patch**:终帧结构化产出同帧铸 CC 形 `structured_output`(旧拼法 `structuredOutput` 过渡一版,0.80.0 删;CC-130)+ 写审批 `argsOmitted` 退化卡在无受护写入部署形上重新解得出路径(CC-129)+ 云控制面十值二型经本包第二个入口 `@sema-agent/client-core/registry` 原样转口(根入口零变;CC-128 ①);根公面 1184;§86。上一版 0.79.0 = **minor**:server 7.93.0 过境批 —— peer sdk 地板 >=11.2.1 + 写口回执第六臂 unverified 与 503 体 committed 分臂(CC-124)+ 无 run 可读的 MCP 状态面(CC-74)+ 审批卡 mandated 位(CC-110)+ 请求装配第三车道 utility 与 approverPosture / maxTokens / outputRetries 三键 + print 车道 model 座(CC-116 / 118 / 123)+ 拒因两面分铸与四个机读位(CC-125)+ 模型轮边界划消息界(CC-126)+ 委派结果人类面读口按来源声明体内定位(CC-127)+ sdk 转口三件(CC-128)+ 通告码 memory.project_scope_absent(CC-122);公面 1184;§85。上一版 0.78.2 = **patch**:门的棘轮登记数字单真源 —— 五只门十一格棘轮 + 218 条沿革账搬进 scripts/registry.json、门只读不抄、负控改篡改登记物、下调通道 RATCHET-SLACK、新门 run-registry-test(CC-79 第一期)+ 两格存量松量收掉 + submit-wiring-manifest 门补 count===1 边界格;src 零改动,dist 逐字节同 0.78.1;公面 1154;§84。上一版 0.78.1 = **patch**:两辆并行车收货 + 三张跟进票 —— displayBody 人类面读口 + 围栏解析头尾配对收紧(CC-113)/ MCP 两处「没报」措辞分句(CC-115)/ 记忆治理面五动词调用口(CC-97 b)/ 非流式提交回执接线回执读口 readSubmitWiringManifest(CC-121)/ 三份失败判官抛出物读取收口(CC-119);公面 1154;§83。上一版 0.78.0 = **minor**:peer sdk 地板 >=9.8.1 → >=11.0.1(CC-106)+ 单步写口 200 体按 stillLive 判别联合改读、第五臂 revoked、三型取自 sdk、RulesFacade.write 必填、PersistedRuleLiveness 转口(CC-103)+ DeniedBy 第十词 read_boundary 专句(CC-106 ④)+ excludeAllTools 车道行;型面 BREAKING 三处、行为面同 0.77.2;公面 1143;§82。上一版 0.77.2 = **patch**:出包面结构卫生 —— 构建期 removeComments,dist js / d.ts 零注释(新门 run-dist-comments-test.mjs + 卫生门词表 32 条 + 文档向前执法;CC-100)+ gateDeniedByDetail 表外词兜底句改「本版不认识这个层名」(CC-111 ①);行为 / 型面逐字节同 0.77.1;公面 1143;§81。上一版 0.77.1 = **patch**:外部验收三件回填 —— 读器族边界残留 projectMcpReconnectCapability 只认自有键(CC-107)/ rewind 四子键恰读一次(CC-108)/ 子代输出合并按回体 output.type · retrieval_status 定处置(CC-109,server ≥7.92.0 cursorSemantics 缺席面);型面 additive 一处;公面 1143;§80。上一版 0.77.0 = **minor**:请求装配逐键去向回执 + print 车道补座 + 表外键响亮拒(CC-101,四条行为 BREAKING)/ 会话策略写端口(CC-105)/ 持久规则单步写面(CC-103)/ workflow 子代面板行代际三向恢复(CC-104,零改码)/ 能力位读器族口径整族改齐 + 外部验收 F-A / F-B 处置 + 合并树异源复审两轮处置;公面 1143;§79。上一版 0.76.2 = **patch**:制品卫生 —— 清 dist 重 build 去掉两只已撤出源码的编译产物 + dist ⇄ src 对账门;零源码 / 零型面 / 零行为改动;公面 1122;§78。上一版 0.76.1 = **patch**:能力位读器工厂(CC-75)/ MCP 活性观察读口(CC-36)/ `capabilities.peerLane` · `permissionRulesWrite` 四态读口(CC-102)/ 记忆治理面两只读口 + 三只条目面回体读口(CC-97 a)/ 主车道证明逐次新建(CC-99)+ 修 0.76.0 的 F1 / F2(身份四键一次性快照只修了投影口一侧);公面 1122;§77。上一版 0.76.0 = **minor**:六票一批 —— `prompt_assembled` 投影臂 / 审批 feed 三态(**型面 BREAKING**)/ `ApprovalResolution` 单源联合 / 记忆 spec 读口 / 终态词表上游钉 / `tasks_expand` 退役(**型面 BREAKING**),外加身份四键一次性快照(跨全部内部臂);公面 1081;§76。上一版 0.75.1 = **patch**:面板短命子代反序缓行放不出的残洞(外部复验 D1)+ 同代 running 帧三向定形(B4)+ #969 提货 `spawnName` 透传与 `agentType` 改读诚实来源(CC-95);§75。上一版 0.75.0 = **minor**:压缩的非 compacted 结局上 chrome 面 `compaction_outcome`(新内部臂 —— 自建 print 出口的端先表态)+ peer sdk 地板 `>=9.8.1`;型面 additive(ChromeEvent +1 臂)、公面 1065、零 wire 新键;§74。上一版 0.74.5 = **patch**:core 7.24.0 提货 `_sema_freed_tokens?` + 首见即终态的行零事件(幽灵完成行)+ `isNewEngineAgentPanelCycle` / `approvalOutcomeNoteOf` 上公面;型面 additive、公面 1065、peer 不动;§73。上一版 0.74.4 = **patch**:面板键「先发布的键为准」(tick 归不了一的三序不再两行)+ 前代 UUID 迟到 tick 丢弃 + `readRunCancelContext` 下钻收紧;型面 additive、公面 1061、peer 不动;§72。上一版 0.74.3 = **patch**:面板子代身份归一(tick / end 的 UUID 归到 fleet 尾段,宿主零改)+ run 记录 `cancelContext` 读口与成因四词 + workflow 行 `errorCode` + reopen 第二臂两件;型面纯 additive、公面 1061、peer 不动;§71。上一版 0.74.2 = **patch**:`capabilities.deviceExecutor.management` 四态读口(缺席 ≠ false;`deviceExecutor: false` = 车道缺席;管理动词可用性三态归包);公面 1052;§70。上一版 0.74.1 = **patch**:审批卡无决断收口 + 结局回交;§69。上一版 0.74.0 = **minor**:peer sdk 地板 >=9.7.1 + covers 过境 + 面板周期身份 + 离场读口;§68。上一版 0.73.5 = **patch**:workflow 规模告警判定上收进包(`evaluateWorkflowSize` 三态:未知的规模不当作规模正常;分母口径与帽优先级单源;env 读口纯函数);型面纯 additive、公面 1044、peer 不动;§67。上一版 0.73.4 = **patch**:终帧 `permission_denials` 第三键 ⇐ 同一条流 `tool_start` 入参按 `toolCallId` join(三道闸;join 不上留 sema 载体;🔴 更正 0.73.2「自动升级收口」一句)+ 审批 feed push 侧取件失败的欠账退避重试;型面纯 additive、公面 1033、peer 不动;§66。上一版 0.73.3 = **patch**:CC-61 sdk 9.7.1 提货 + `capabilities.approvalsStreamLive` 四态读口(缺席 = 判不出;`livePendingNeedsReconcile` 只在引擎明说会推时才让对账节拍降兜底)+ CC-60 五条模型面文案锚包侧半场(cursorSemantics 机读位 / result 行注记 / bash 首行两变体与良性槽 / 通知 seed 并集 / parked 臂);型面纯 additive、公面 1032、peer 不动;§65。上一版 0.73.2 = **patch**:CC-59 悬挂 ask 全卡 —— `livePending[].frame`(server ≥7.87.0)两道闸窄读进视图,在场即走流内帧腿同一条路(入参可见、改写可转发),缺席保持盲卡;CC-34 收口(引擎半场随 7.87.0 到货,判据交黑盒);型面纯 additive、公面 1026、peer 不动;§64。上一版 0.73.1 = **patch**:CC-57 `decidePlanReview` outcome 尾句按「决断有没有生效」四态选(单铸点 `planReviewOutcomeTail`;此前本地拒发仍让模型汇报已拒绝)+ CC-56 cancel 的 409 按机器码分家(`cancelConflictFromError` 三形 / 新安全码 `cancel_run_not_running`)与提交面 429 用量窗读口 + 人话;型面纯 additive、公面 1026、peer 不动;§63。上一版 0.73.0 = **minor,型面 BREAKING**:fleet 视图八个数值键改可选 —— CC-52 `FleetTaskView.elapsedMs` / `tokens` / `queuedCount` 与 `FleetWorkflowView.doneCount` / `totalCount` / `failedCount` / `tokens` / `elapsedMs` 不再 `?? 0`(有键 = 真值含真 0,缺键 = 不知道;逐键缺席语义见 §62b)+ 台账补偿链无基数不铸;公面导出名零增减 1019、零 wire 变化、peer 不动;§62。上一版 0.72.14 = **patch**:悬挂的流内 ask 拉半场 —— CC-55 `startApprovalsFeed` 快照加 `livePending` 段并进变化摘要(键缺席 = 未报,不铸空)+ 视图 / 去重账 / 与流内帧腿同链的决断口(入参不可见上卡明说、改写不转发)+ 宿主闸对账节拍 + 待决计数读口(不知道 = null);型面纯 additive、公面 1019、peer 不动;§61。上一版 0.72.13 = **patch**:server 7.86.0 提货 —— CC-46 plan_review `permissionModeAfter` 发口(三选卡双闸:宿主声明只读起步 ∧ 引擎 ≥7.86.0;400 field_conflict 两种处置)+ CC-54 `capabilities.executionLane` 四态读面(键缺席 ≠ 不是本机车道;`toolsRunHere` 判据归包)+ CC-53 detach 版本闸三态;型面 additive(另撤回 0.72.12 的主通道 `absent` 臂,改独立缺席订阅口)、公面 1011、peer 不动;§60;**预告 0.73.0 BREAKING**:fleet 视图数值键改可选。上一版 0.72.12 = **patch**:「缺席被折成正向终态」按类清剿 —— CC-50 M1 头条(fleet 行缺席改发 `absent` 不再铸 `end{isError:false}`)+ 六站一次改齐(缺席 ⇒ `unknown`)+ 结果边界 fail-closed 取舍 + `_sema_outcome` + `Outcome unknown:` 行 + CC-51 M6(default 臂不再谎报 running)+ 普查门 + DS-06;型面 additive、公面 993、peer 不动;行为面三处真变化见 CHANGELOG 取舍段;§59。上一版 0.72.11 = **patch**:core 7.23.0 提货 —— CC-49 通告码 66 → 67 `config.write_protection_unresolved`(operator;兄弟码 `target_view_absent` = 没有视图,这枚 = 有视图解析不出)+ `permission_denials` 自动升级腿通电(`gates[].toolCallId` ⇒ `tool_use_id`;CC-34 引擎半场);型面零变化、公面 989、peer 不动、devDep core ~7.23.0;§58。上一版 0.72.10 = **patch**:CC-41 leader run 终局 `needs_human` + `result.conflict` 三形读面(none 缺席不可分 / unreadable 在场读不懂 / conflict;`salvaged[]` 原样给落盘口;措辞单源不提重试);型面纯 additive、公面 989、peer 不动;§57。上一版 0.72.9 = **patch**:server 7.85.0 提货 —— CC-30 会话内 MCP re-dial 消费口(`reconnectMcpServer` 三态 / unsupported 恒五键 / 交易文案单源)+ CC-39② memory-status `autoConsolidationArmed` 三态 + CC-45 resume 补充句渲保留秒数;型面纯 additive、公面 985、peer 不动;§56。上一版 0.72.8 = **patch**:清账三票 —— `memory:"off"` 请求键(CC-39③,server 7.84.0 S-405)+ `runStream` 第二条中性臂 `Model output error:`(CC-43)+ 注入件撞活 run 自动 steer 零卡(CC-44);型面纯 additive、公面 977、peer 不动;§55。上一版 0.72.7 = **patch**:core 7.22.0 提货 —— 通告码 66 `mcp.server_redialed` + 读器 `readMcpServerRedialed` + `wiring_manifest.readDeny` 第九段 `_sema_readDeny`(缺席 = 没有内置行判这条腿);型面纯 additive、公面 971、peer 不动、devDep core ~7.22.0;§54。上一版 0.72.6 = **patch**:cli L-379 包侧半场 —— `steerFollowIntent` steer 后续听意图三态(tail / after-decision / after-wake)+ `activeRunSelfHealRow` 续听声明第五参;型面纯 additive、公面 969、peer 不动;§53。上一版 0.72.5 = **patch**:server 7.82.1 提货 —— `capabilities.webSearch.backend` 部署默认 WebSearch 后端四态读面(键缺席 = 老引擎判不了 ≠ `none`);型面纯 additive、公面 968、peer 不动;§52。上一版 0.72.4 = **patch**:core 7.21.x 三件经 server 7.82.0 提货 —— `wiring_manifest.autoConsolidation` 第八段 `_sema_autoConsolidation`(缺席 = indeterminate 不折 false);型面纯 additive、公面 962、peer 不动;§51。上一版 0.72.3 = **patch**:core #863 记忆单系统半场 ① —— `projectAgentsForWire` 投影 `agents[].memory`(user|project|local 三词同映射引擎平面 agent:<type>);型面纯 additive、公面 962、零 wire 新键、peer 不动;§50。上一版 0.72.2 = **patch**:workflow 视图两票 —— `LiveWorkflowController.resolution()` 六态(snapshot() 的 null 三义拆开)+ `noteOwnWorkflowRun` own 台账同拍登记;型面纯 additive、公面 961、零 wire 键、peer 不动;§49。上一版 0.72.1 = **patch**:server 7.80.1 提货 —— 409 `conflict.resume_context_unavailable` 结构读数(`staleAfterSec` / `runId`;sdk 9.6.0 尚未带键,经 sdk 今天恒缺席)+ `SkillSpec.baseDir`(只在本机车道带);型面纯 additive、公面 960、peer 不动;§48。上一版 0.72.0 = **minor**:型面 BREAKING —— 39 个零消费导出退出公面(CC-32 退役批,[7419] §45 预告 / cli [7422] 同意 / web-client·desktop 过节拍沉默 = 同意;名单见 §47a S-1);运行期零 BREAKING、公面 956、peer 不动、devDep core ~7.20.1;随批:已退役名账 `removed` + export-liveness 门 G 段 + 冻结账门 ⑧c;§47。上一版 0.71.4 = **patch**:core 7.20.1 提货 —— `ENGINE_NOTICE_CODES` 65 + `wiring_manifest.writeProtection` 第七段 `_sema_writeProtection`;型面纯 additive、公面 995、peer 不动、devDep core `~7.20.1`;§46。上一版 0.71.3 = **patch**:门体系清账批 —— CC-24 export-liveness 门 + 39 个导出退役预告(0.72.0 删,表态制)/ CC-26 `as unknown as` 铸链棘轮 / CC-25 冻结账门 ⑧ 段 / CC-06 B-081 包侧半场(终帧 `_sema_effective_reasoning` / `_sema_effective_memory_scopes` + resume reopen 族 + `routePairingVerdict`);型面纯 additive、公面 986 → 995、peer 不动;§45。上一版 0.71.2 = **patch**:接入方验收两票归包 —— CC-28 B-132 decide 拒体三句去内部车道词 / CC-29 B-133 committedUuids 唯一性(重复 ⇒ 形 f);零型面变化、公面 986、peer 不动;§44。上一版 0.71.1 = **patch**:接入档打回修正 —— CC-27 `ApprovalCardRequest.readRootCandidate?` 帧→卡透传位 + 新导出型 `ReadRootCandidateView`;型面纯 additive、公面 986 不变、peer 不动;§43。上一版 0.71.0 = **minor**:型面 BREAKING 六件 —— peer sdk 地板 >=9.6.0 + agent-types >=0.3.0 / `SkillsListingTruncatedFactsView` 删 `requestedBudgetBytes?`·`laneClamped?` / `WiringManifestMcpEntry` → `WiringManifestMcpEntryView` / `MAX_AGENT_SKILLS` 删 / `decide.workflow_host_not_parked` 退役;运行期零 BREAKING。内容:core 7.20.0 提货(闭集 +5 六十四码)/ 🔴 CC-16 `text_segment_end.committedUuids[]` / CC-08 全五件(tool_disclosure / tool_progress 两 chrome 臂、wiring_manifest tools·hooks·lsp 进切片、tool_roster_delta 接上、context_usage 进切片、`readRootCandidate` 镜像)/ CC-19 `mcpEngineLegPresence` 归包 / CC-20 not_parked clean-cut;公面 986;§42 / 42y 八条)|
23
- | peer:wire 契约 | `@sema-agent/sdk` **>=12.0.1**(value-level,非 type-only;**0.84.0 抬版**:12.x 声明每会话后台登记列表 `sessions.background`、能力位 `capabilities.background.listFace` 与七词闭集的后台状态型,本包三者都读(登记读口的端点门与归类口的编译期穷举),按 12.0.1 编译,11.3.0 失去物料见证。此前 **0.80.0 曾抬到 >=11.3.0**:11.3.0 在两条回决口体上声明 `settledBy?: "policy"`、`Settlement.kind` 第十三词 `policy_refused` 与三错误码(0.80.0 至 0.83.6 都在这条地板上);**0.79.0 曾抬到 >=11.2.1**:11.2.x 声明 `capabilities.mcpProbe`、`mcpCapabilities` / `probeMcp` + `McpProbeFace`、写回执第三支 `stillLive: "unknown"`,11.2.1 再补 `TaskRequest.approverPosture` 与审批帧键 `mandated`(型面 + 运行期键锚),本包按 11.2.1 编译,11.0.1 失去物料见证;**0.78.0 曾抬到 >=11.0.1**:11.x 声明 `DeniedBy` 第十词 `read_boundary`、`rules.write` 200 体按 `stillLive` 判别联合、`RemovalLiveness` / `RuleWriteRequest` / `RuleWriteResult` / `RuleWriteBehavior` 包根导出、`TaskRequest.excludeAllTools`,本包按 11.0.1 编译,9.8.1 失去物料见证;**0.75.0 曾抬到 >=9.8.1**:9.8.x 声明 `Capabilities.deviceExecutor.management?`,9.7.1 失去物料见证;**0.74.0 曾抬到 >=9.7.1**:9.7.x 追平的六处型面是本包 0.73.3 起的编译基线,且 9.6.0 失去物料见证;**0.71.0 曾抬到 >=9.6.0**:`tool_disclosure` / `tool_progress` 两帧型与 `ToolApprovalFrame.readRootCandidate` 自 9.6.0 起;0.69.0 曾抬到 >=9.4.0(`reasoning_end` / `lastLegMcp`),0.60.0 抬到 >=8.4.0;地板由 `scripts/run-sdk-floor-test.mjs` 的 `FLOOR` 与 public-surface 门 C-CC-3「不低于见证到的最低实装版」双钉)| `package.json` `peerDependencies` |
22
+ | 本包 | `@sema-agent/client-core` **0.85.0**(本批发布版 = **minor**:引擎事实表(通告码册 / 受众表 / MCP 注入丢弃原因 / 会话规则翻译判定内部两表)改为构建期生成,`ASK_ORIGIN_WORDS` / `APPROVAL_MANDATE_WORDS` 就是 SDK 导出的数组(不再冻结),四个思考档 / 权限模式型改为 SDK 型的别名,包内单源(CC-230);子代族八入口与两只行停止门收注入 client,写动词失败结局 +`unconfirmed`,`classifySubagentResumeFailure` 同判(CC-236);`sessionPolicyDeliverable` 收可选名册,`SessionPolicyWithheldWhy` 六词 → 七词(CC-228);过渡物退役登记与到期门,`adapt()` 不再认旧名 `attachedFiles`,三个运行期名字退出根入口(逐名见 §2z),`surfaceRememberNotApplied` 撤回退役预告(CC-221);plan-review 决断台账六口,`reopenPlanReviewCard` 按台账拒开(CC-241);会话后台任务停止口 `stopEngineSessionBackground` 与受据归类口 `engineSessionBackgroundReceiptReadingOf`(CC-246);服务端 7.104.0 会话侧:会话存档读不出三载体读口与人话 `corruptSessionContent`、`session.records_skipped` 进册(`SERVER_NOTICE_AUDIENCE` 三行)、删会话 409 读口、`/decide` 停驻挪动族读口(CC-217 / CC-243);服务端 7.104.0 能力 / 同步体侧:同步 park 新体与 park 行 `result`、`fileHistoryCaptureMode` 认 `on-optional` 与请求词片段口 `fileHistoryDeclarationField`、公钥发现读口 `projectSealedKeyCapability`、折叠粗码 `isStatusDerivedCoarseCode`(CC-243);同名影子对账门按语义判(CC-222);导出存活门读已提交历史(CC-240);根公面 1275 → 1307;测试钩 59 → 60;公面类型 +34;peer sdk 地板 `>=12.0.1` 不动;§109)。上一版 0.84.1 = **patch**:`<system-reminder>` 开标签定位口 `findSystemReminderOpenTag`(CC-210);detach durable-off 400 纯判定 `isDetachDurableOff400`,`detachDurableOffHint` 对读属性会抛的错误对象改回 `null`(CC-219);服务端自铸通告码进码册与受众表 `SERVER_NOTICE_AUDIENCE`(`instructions.source_changed` 回到用户面)+ 事实读器 `readInstructionsSourceChanged`(CC-213);按码派发的通告事实口 `readEngineNoticeFacts` + 派发表 `ENGINE_NOTICE_FACT_READERS`,`readReadRootGrantNotice` 入参型放宽(CC-214);停泊审批决断 422 `parked_resume.startup_failed` 的读口 / 一句话 / 判定与码优先 `isCodeClassifiedGateFailure`(CC-225);拒启会话的窄撤销动词 `removeRefusedSessionRules` 与出路句 `legacyToolNameFailureNoteOf`,`CONFIG_REFUSAL_CODES` 七员 → 八员(CC-229);plan-review 编排三口与两只能力探针收注入 client(CC-209);CC 形 `permission_denials` 收入参只被传输层脱敏过的拒绝 + 超集位 `_sema_tool_input_redacted`(CC-235);凭据读法两处放行收口(CC-234);根公面 1260 → 1275;公面类型 +18;peer sdk 地板 `>=12.0.1` 不动;§108)。上一版 0.84.0 = **minor**:peer sdk 地板 `>=11.3.0` → `>=12.0.1`;后台代理登记读数 —— 读口 / 取代判定 / 归类口 / 登记键桥 / 补行谓词,缺席行下半场(CC-194);读目录授权结论通告读口 `readReadRootGrantNotice`(CC-185);接线回执 `hands` 段 `_sema_hands` + 读口 `handsSeamReadingOf` / `handsSeamDetail`,`handsMountedDetail` 坏入参不再抛(CC-206);陈旧逻辑清扫(CC-223):退役键 `rewind.rewindFiles` 构造期拒收、`WorkflowRunState.agentCount` 改可选、26 个内部件退出根入口、九张公面判定表换只读 Set 子类、十五张判定数组冻结、`resume_at` 文本兼容腿退役;根公面 1278 → 1260;公面类型 +10;§107)。上一版 0.83.6 = **patch**:会话规则记录的无损判定 `sessionPolicyDeliverable` 把引擎会在准备阶段拒启的两类名字(引擎退役名、含 `__` 而不以协议前缀开头的名字)改判「不写」,成因词 `legacy_tool_name`(闭集 5 → 6),引擎说「改名为 X」的退役名带 `currentName` 出路位;`peer_wide` 那句改措辞(判决不变)(CC-226);根公面 1278 不变;peer sdk 地板 `>=11.3.0` 不动;§106)。上一版 0.83.5 = **patch**:展示层出口 `displayUntrusted` 的连接符 ZWJ / ZWNJ 按语境判(🔴 默认形输出字节变)、两只可选开关 `escapeBackslashes` / `blanks` 与标记位置读口 `displayUntrustedMarks`(CC-204);凭据两网的判别视图认孤代理项,机读字节 `errors[]` / 合成终局行同批(CC-207);转义记号在凭据再扫里原子与四处凭据读法存量修复(相对 0.83.4 零新增外泄);hooks 启动模式可选词读口 `SettingsPort.hooksStartupMode()`,安全 / bare 模式下设置来源只发 managed(CC-200),设置来源里同一条 hook 只发一份(CC-208);自愈三条重发结局 +1 可选位 `releaseConfirmedByEngine`、行句按释放证据分说(CC-212);活段接入指引订正;公面类型 +3;peer sdk 地板 `>=11.3.0` 不动;根公面 1278;§105)。上一版 0.83.4 = **patch**:只增 —— plan 审批卡「用户亲手关掉的卡,自动触发不在同一道门上放回屏上」的判定归包(`reopenPlanReviewCard` 加触发者位 `trigger`、拒开位 `dismissedByUser`,409 自愈腿按提交出身替宿主传触发者、结局与整行由包出;CC-201);座位审批请求补强制位 / 强制理由词 / 报价缺席因由 / 出身词四个可选位与过境口 `toolPermissionRequestAskBits`(CC-203);`<system-reminder>` 剥离 / 解包两只口上公面并改线性时间(CC-205);两条展示层接入指引订正;开发依赖引擎 `~7.33.1`;公面类型 +2;peer sdk 地板 `>=11.3.0` 不动;根公面 1277;§104)。上一版 0.83.3 = **patch**:入参 / 来源面 —— hooks 投影加 flag 来源(`--settings` 那一层,排在 local 之后;设置来源 hooks 维持托管在前拼接);规则列举口 `listAllPersistedRules` 入参只要 `list`(`RulesListFacade`,其余四口作可选成员);模型身份认目录缺省(本机读数加宿主报位 `engineAcceptsCatalogDefault`,位 `true` 才算目录可解析);公面类型 +1;peer sdk 地板 `>=11.3.0` 不动;根公面 1273;§103)。上一版 0.83.2 = **patch**:只增 —— 审批卡一族三件(常驻姿态下的放行谓词 `askSurvivesPosture`,三态、「不知道」不折成放行;卡上 `mandate` 六词闭集 + 读口 + 每词一句说明,通告码册 +2,开发依赖引擎 `~7.32.0`;停泊卡带出身词 `origin`;CC-193 / CC-195 / CC-196)与后台子代缺席行的判定、计数、sweep 豁免、回收与措辞单源(回收只在后台代理登记确认离场时;CC-194);公面类型 +13;peer sdk 地板 `>=11.3.0` 不动;根公面 1273;§102)。上一版 0.83.1 = **patch**:只增 + 行为订正 —— 展示层安全出口三端单源 `displayUntrusted`(凭据两网 ∘ 字符三网,选项按载体选;CC-112);本包合成的终局行正文与结果帧 `errors[]` 在铸点洗凭据(`errors[]` wire 可见,方向只会更安全)、交互车道合成行带上行类旗,回决备注与子代续跑收据多收双向 / 格式字符(CC-187 / CC-112);会话规则记录的无损判定 `sessionPolicyDeliverable` + 措辞单源 `sessionPolicyWithheldNotice` + 五词成因 `SESSION_POLICY_WITHHELD_WHY`(整批可送才送,首尾带空白的名字比宿主侧更严;CC-117);插件 hook 每轮计划 `hooksWirePlan` + `SettingsPort` 可选读口 `enabledPluginHooks` + `hooksForWire({ plan })`,逐条判「投给引擎 / 本客户端执行 / 如实不跑」、开机「不会执行」清单与 `/hooks` 标注措辞单源(投给引擎那一臂候引擎能力位 `taskSettings.pluginHooks`),设置来源的 `mcp_tool` 与 exec 形 hook 条目不再上请求体、手写的 `plugin` 键剥掉(CC-174);公面类型 +26;peer sdk 地板 `>=11.3.0` 不动;根公面 1254;§101)。上一版 0.83.0 = **minor**:行为面与型面都有 BREAKING —— CC 形消息 24 项按裁定 C-R103 退役名:结果帧 `degraded` / `errorCode` / `model` 与错误信封 `result` → `_sema_model_degraded` / `_sema_error_code` / `_sema_selected_model` / `_sema_salvaged_result`,合成终局行 `isApiErrorMessage` → `_sema_api_error_message`,工具结果记录删过渡名 `toolUseResult`,system 行 `attachedFiles` → `_sema_attached_files`、到达时戳 `timestamp` 与 `isMeta` 删,print 完成通知帧十三键平铺 `_sema_*`,记忆写入改走 chrome 臂 `memory_saved`(新型 `MemorySavedChromeEvent`,`CHROME_ARMS` required);本包只铸新名、端两名并读一版 + 结果帧 CC 键 `terminal_reason` 与读口 `terminalReasonForResult`(CC-175),错误信封知道就铸 `_sema_selected_model` + 转录 id 改 UUID 形(CC-147)+ `SettingsPort` 可选合并读口 `mergedDisableAllHooks`、用户层 `disableAllHooks` 在引擎腿上生效(CC-162)+ 退化审批卡三形拒收改写、`FsApprovalOutcome` 的 `failed` 臂 +可选位 `editRefused`(CC-135)+ 注入件自愈句整族重写 + 联网搜索旧三读口 `webSearchFromEnv` / `webSearchFromSettings` / `resolveWebSearch` 退出公面,`resolveLiveInitToolFace` 可选 `opts.webSearchStamped`(`LiveInitToolFaceOptions`),endpoint userinfo 律跟服务端 7.101.0(CC-184)+ 公面类型 −4(CC-171)+ 通告码册 69 → 71 与结构化卡白名单 +`read-inbox`(CC-186,开发依赖引擎 `~7.31.0`)+ 合成终局行 `uuid` 改 UUID 形;peer sdk 地板 `>=11.3.0` 不动;根公面 1238;§100)。上一版 0.82.7 = **patch**:只增不改 —— 每请求联网搜索配置的三态判决 `judgeWebSearchSettings` / `webSearchVerdictFromEnv` / `resolveWebSearchVerdict`(与 7.100.0 及以后 server 的受理判官同序同判,认不出的 provider 判形错、不再静默丢段;settings 段凭据注入回调 `apiKeyFor`)+ 措辞单源 `webSearchVerdictMessage`(不回显任何用户配的值)+ 调试日志用 `webSearchEndpointForDisplay`;旧三读口 `webSearchFromEnv` / `webSearchFromSettings` / `resolveWebSearch` 行为不变、标过渡期,0.83.0 删(CC-182);peer sdk 地板 `>=11.3.0` 不动;根公面 1240;§99)。上一版 0.82.6 = **patch**:只增不改 —— 停泊行上选「本会话允许」却没被记住时与活卡腿同句告知(回体 `rememberApplied: false`,或 server 以会话级放行专属拒绝码拒了 remember 后回退普通批准;其余失败一律未知不告知),回执 `DecideReceiptView` +1 可选位 `rememberApplied`(CC-181);决断落定后与桥重试臂的诊断留痕不再因宿主日志口抛错回流进决断;接入文档改口:server ≥7.100.0 上 park 行卡的 `requiresRealApproval` / `approvalIsMandated` 生效(CC-180,零代码改动);peer sdk 地板 `>=11.3.0` 不动;根公面 1235;§98)。上一版 0.82.5 = **patch**:只增不改 —— print 车道 init 帧工具面名册优先:流包装器 `withPrintInitFrame`(首选接法,init 恒为首行、其后按到达序)/ 判定闸 `createPrintInitGate` / 分类口 `printInitRosterSignal` / 判定口 `decidePrintInitToolFace` / 留痕措辞 `printInitToolFaceDebugLine` + 等待上界 `PRINT_INIT_ROSTER_WAIT_MS`(150 000);回落估计表补 `ListAgents`(7.30.0 及以后的引擎上与 `SendMessage` 同条件)(CC-169);peer sdk 地板 `>=11.3.0` 不动;根公面 1235;§97)。上一版 0.82.4 = **patch**:只增不改 —— park 行审批卡新增门类位 `irreversibleParkGate`(待决行门类恰为 irreversible_ask,今天即生效,门类事实不是保证);`requiresRealApproval` 在待决行顶层带时透传(就绪,待决列表带出后才生效,今天零行为变化)(CC-180);`ApprovalCardRequest` +1 可选位;peer sdk 地板 `>=11.3.0` 不动;根公面 1229;§96)。上一版 0.82.3 = **patch**:只增不改的公面 —— 自愈提示的「保住对话」出路槽 `keepSessionWayOut` 与交互面引擎决断入口开关 `engineDecidePath`(CC-177;两位都不给时措辞与 0.82.2 逐字节同);自愈结局两臂 +机读位 `pendingRowGone`(重开链证实待决项已不在);peer sdk 地板 `>=11.3.0` 不动;根公面 1229;§95)。上一版 0.82.2 = **patch**:只增不改的公面 + 若干行为订正 —— 新增措辞单源 `cloudEffectiveNotices`:云控制面有效配置回体的降级告警 / 预算 / 能力上限三读数(CC-164,四态,不读成 0 或「没有预算」);本机引擎 models 文档在宿主注入本机条目判定 `entryAccepted` 时补 `default` / `tierGroups` / `activeTierGroup`,剔掉会让本机整份拒收的目录引用与判定口不收的条目,去掉 registry 注记键 `origin` / `overridesTeam`(CC-165;结果新增 `modelRefIssues`);计划复核结局机读位 `_sema_planReviewOutcome`(CC-160 ①);停泊审批决断操作起止回调 `onDecideOperation` 与操作句柄 `openDecideOperation`(CC-160 ③);新增超集键 `_sema_planReviewOutcome`;peer sdk 地板 `>=11.3.0` 不动;根公面 1229;§94)。上一版 0.82.1 = **patch**:只增不改的公面 + 若干行为订正 —— 新增读口 15 个(续跑折叠码读口与措辞 / 文件历史捕获读口六口 / 模型身份可解析判据五口 / 自定义代理载荷作废重投口 / 决断失败码「门还在」判定)+ 宿主车道声明 `EmitContext.lane`;新增超集键 `_sema_response_model`(终帧 / 每轮用量)与 chrome 用量两臂 `responseModel`、重开判决 `_sema_decisionInFlight`、自愈结局两臂 `decisionInFlight`、内部臂 `_sema_denial_unclassified`、通知码 +1;行为订正:计划复核决断在飞不重开卡且自愈提示不再教人再决一次(CC-160 ②)、决断出口补折叠句且停泊腿不再把折叠 / 坏档误判已决(CC-154)、执行车道 `in-process` 措辞(CC-153)、`-p` 车道 Bash 良性退出与交互同判(CC-168)、`-p` 工具结果帧补结构化结果(CC-149)、被拒分类词两车道同判(CC-172)、非交互车道子代工具帧(CC-158,宿主声明车道才生效)、终帧被拒清单对账流内拒绝(CC-159)、自定义代理载荷作废重投(CC-161);peer sdk 地板 `>=11.3.0` 不动;根公面 1228;§93)。上一版 0.82.0 = **minor**:只增不改 —— 新增只读读口 17 个 + 1 常量、工具名册行一格 `mountedBy`、turn 错误判决 `http` 臂一格 `storedRowWhere`:`/rewind` 代码档与对话档能不能用由引擎能力位回答(CC-146)、云控制面额度读数三分(CC-150)、装配期「这一条腿有没有手」(CC-152)、续跑拒收按原码判(CC-154);两处既有面行为订正:自动模式分类器拒的类别词由 `permission-rule` 改为 `automode-*` 三词(CC-155,订正 0.81.1)、续跑上下文读不出时引擎点名的那一行不再丢(CC-156);0.81.0 预告的 23 键 + 1 子型删改**改到 0.83.0**(§92y ㉙);零 wire 键、零投影臂;peer sdk 地板 `>=11.3.0` 不动;§92。上一版 0.81.1 = **patch**:被拒分类词读器加第③路(CC-148):引擎「没问过就拒」的工具调用(deny 规则 / 权限模式 / hook / 分类器 / 写保护 —— 无 `settlement` 只有 `gate.disposition.deniedBy`)在 user 工具结果记录与终帧 `permission_denials[]` 上此前恒缺 `_sema_denial_kind` / `toolDenialKind`,现按层名落 `permission-rule`(其中「分类器」一项已由 0.82.0 CC-155 订正)(`ask_resolution` 无结算 / 结算段不成形 / 层名表外仍缺席不猜);交互与 `--print` 两条车道同一只读器;另钉终帧两臂 `_sema_effective_*` 键集不变量 —— 成功臂展开单铸函数、错误信封显式重发,覆盖性钉在返回对象自己的类型上(漏键 / 多键编译期即红)+ 门格判两臂键集相等且值逐字节同,给单铸函数加键时错误臂不会再静默少键(本版无键增减);零 wire 键、零投影臂、根公面 1195;§91。上一版 0.81.0 = **minor**:CC 形消息一张脸(C-R85 / CC-131):user 工具结果记录加 SDK 面键 `tool_use_result`(与过渡键 `toolUseResult` 同引用,删驼峰原定 0.82.0、已改到 0.83.0)+ DS-19 普查门升硬门(键集按语法解析、按 type/subtype 分表;23 键 + 1 子型过渡表到期窗原为 0.82.0、已改到 0.83.0,零常驻豁免)+ CC-145 `/rewind` both 臂改发 `restoreFiles:true`、`projectRewind(pending)` 单参;零 wire 键、零投影臂、根公面 1195;§90。上一版 0.80.2 = **patch**:`conflict.resume_context_unavailable` 的 `staleAfterSec` / `runId` 在真 SDK 上读不到(CC-137:sdk 11.1.0 起 `APIError` 把体上非具名键收进 `extra`,这一码映射成 `ConflictError` 无具名位,读口只读顶层 ⇒ 真调用链恒缺席)⇒ 体源结构位改「顶层有效值优先、`extra` 兜底」三只类型化读口单铸,有具名子类位的三处(`retryAfterSec` × 2 / `allowlist`)行为不变只多兜底,头源 `retryAfterMs` 只读具名位;零 wire 键、零投影臂、根公面 1195;§89。上一版 0.80.1 = **patch**:去键重发判据句按「铸」计(CC-143;§87「带键的体恰一次」作废 → 被铸恰一次,POST 几次随传输层)+ 接入文档段落自带射程限定词自 §88 起向前执法 + 模型预设表 deepseek 项改闭集真名 deepseek-flash(CC-144,C-R82 ①)+ 门里 git 兜底自陈探针(CC-142);零 wire 键、零投影臂、根公面 1195;§88。上一版 0.80.0 = **minor**:🔴 peer sdk 地板 >=11.2.1 → >=11.3.0 + 策略拒的归因上 wire(CC-133:发送面 deny+policy 带 settledBy / 读侧 policy_refused 十三词入 CC 规则桶 / 三错误码读口 / 直连门去键重发恰一次)+ 删除规则后果句归包(CC-132)+ /mcp 详情卡两腿分说归包(CC-134:六档读口 + 九句铸点,同批改口八处说满的话)+ 🔴 终帧旧拼法 `structuredOutput` 按 0.79.1 的宣告删除(只剩 CC 形 `structured_output`);根公面 1195;§87。上一版 0.79.1 = **patch**:终帧结构化产出同帧铸 CC 形 `structured_output`(旧拼法 `structuredOutput` 过渡一版,0.80.0 删;CC-130)+ 写审批 `argsOmitted` 退化卡在无受护写入部署形上重新解得出路径(CC-129)+ 云控制面十值二型经本包第二个入口 `@sema-agent/client-core/registry` 原样转口(根入口零变;CC-128 ①);根公面 1184;§86。上一版 0.79.0 = **minor**:server 7.93.0 过境批 —— peer sdk 地板 >=11.2.1 + 写口回执第六臂 unverified 与 503 体 committed 分臂(CC-124)+ 无 run 可读的 MCP 状态面(CC-74)+ 审批卡 mandated 位(CC-110)+ 请求装配第三车道 utility 与 approverPosture / maxTokens / outputRetries 三键 + print 车道 model 座(CC-116 / 118 / 123)+ 拒因两面分铸与四个机读位(CC-125)+ 模型轮边界划消息界(CC-126)+ 委派结果人类面读口按来源声明体内定位(CC-127)+ sdk 转口三件(CC-128)+ 通告码 memory.project_scope_absent(CC-122);公面 1184;§85。上一版 0.78.2 = **patch**:门的棘轮登记数字单真源 —— 五只门十一格棘轮 + 218 条沿革账搬进 scripts/registry.json、门只读不抄、负控改篡改登记物、下调通道 RATCHET-SLACK、新门 run-registry-test(CC-79 第一期)+ 两格存量松量收掉 + submit-wiring-manifest 门补 count===1 边界格;src 零改动,dist 逐字节同 0.78.1;公面 1154;§84。上一版 0.78.1 = **patch**:两辆并行车收货 + 三张跟进票 —— displayBody 人类面读口 + 围栏解析头尾配对收紧(CC-113)/ MCP 两处「没报」措辞分句(CC-115)/ 记忆治理面五动词调用口(CC-97 b)/ 非流式提交回执接线回执读口 readSubmitWiringManifest(CC-121)/ 三份失败判官抛出物读取收口(CC-119);公面 1154;§83。上一版 0.78.0 = **minor**:peer sdk 地板 >=9.8.1 → >=11.0.1(CC-106)+ 单步写口 200 体按 stillLive 判别联合改读、第五臂 revoked、三型取自 sdk、RulesFacade.write 必填、PersistedRuleLiveness 转口(CC-103)+ DeniedBy 第十词 read_boundary 专句(CC-106 ④)+ excludeAllTools 车道行;型面 BREAKING 三处、行为面同 0.77.2;公面 1143;§82。上一版 0.77.2 = **patch**:出包面结构卫生 —— 构建期 removeComments,dist js / d.ts 零注释(新门 run-dist-comments-test.mjs + 卫生门词表 32 条 + 文档向前执法;CC-100)+ gateDeniedByDetail 表外词兜底句改「本版不认识这个层名」(CC-111 ①);行为 / 型面逐字节同 0.77.1;公面 1143;§81。上一版 0.77.1 = **patch**:外部验收三件回填 —— 读器族边界残留 projectMcpReconnectCapability 只认自有键(CC-107)/ rewind 四子键恰读一次(CC-108)/ 子代输出合并按回体 output.type · retrieval_status 定处置(CC-109,server ≥7.92.0 cursorSemantics 缺席面);型面 additive 一处;公面 1143;§80。上一版 0.77.0 = **minor**:请求装配逐键去向回执 + print 车道补座 + 表外键响亮拒(CC-101,四条行为 BREAKING)/ 会话策略写端口(CC-105)/ 持久规则单步写面(CC-103)/ workflow 子代面板行代际三向恢复(CC-104,零改码)/ 能力位读器族口径整族改齐 + 外部验收 F-A / F-B 处置 + 合并树异源复审两轮处置;公面 1143;§79。上一版 0.76.2 = **patch**:制品卫生 —— 清 dist 重 build 去掉两只已撤出源码的编译产物 + dist ⇄ src 对账门;零源码 / 零型面 / 零行为改动;公面 1122;§78。上一版 0.76.1 = **patch**:能力位读器工厂(CC-75)/ MCP 活性观察读口(CC-36)/ `capabilities.peerLane` · `permissionRulesWrite` 四态读口(CC-102)/ 记忆治理面两只读口 + 三只条目面回体读口(CC-97 a)/ 主车道证明逐次新建(CC-99)+ 修 0.76.0 的 F1 / F2(身份四键一次性快照只修了投影口一侧);公面 1122;§77。上一版 0.76.0 = **minor**:六票一批 —— `prompt_assembled` 投影臂 / 审批 feed 三态(**型面 BREAKING**)/ `ApprovalResolution` 单源联合 / 记忆 spec 读口 / 终态词表上游钉 / `tasks_expand` 退役(**型面 BREAKING**),外加身份四键一次性快照(跨全部内部臂);公面 1081;§76。上一版 0.75.1 = **patch**:面板短命子代反序缓行放不出的残洞(外部复验 D1)+ 同代 running 帧三向定形(B4)+ #969 提货 `spawnName` 透传与 `agentType` 改读诚实来源(CC-95);§75。上一版 0.75.0 = **minor**:压缩的非 compacted 结局上 chrome 面 `compaction_outcome`(新内部臂 —— 自建 print 出口的端先表态)+ peer sdk 地板 `>=9.8.1`;型面 additive(ChromeEvent +1 臂)、公面 1065、零 wire 新键;§74。上一版 0.74.5 = **patch**:core 7.24.0 提货 `_sema_freed_tokens?` + 首见即终态的行零事件(幽灵完成行)+ `isNewEngineAgentPanelCycle` / `approvalOutcomeNoteOf` 上公面;型面 additive、公面 1065、peer 不动;§73。上一版 0.74.4 = **patch**:面板键「先发布的键为准」(tick 归不了一的三序不再两行)+ 前代 UUID 迟到 tick 丢弃 + `readRunCancelContext` 下钻收紧;型面 additive、公面 1061、peer 不动;§72。上一版 0.74.3 = **patch**:面板子代身份归一(tick / end 的 UUID 归到 fleet 尾段,宿主零改)+ run 记录 `cancelContext` 读口与成因四词 + workflow 行 `errorCode` + reopen 第二臂两件;型面纯 additive、公面 1061、peer 不动;§71。上一版 0.74.2 = **patch**:`capabilities.deviceExecutor.management` 四态读口(缺席 ≠ false;`deviceExecutor: false` = 车道缺席;管理动词可用性三态归包);公面 1052;§70。上一版 0.74.1 = **patch**:审批卡无决断收口 + 结局回交;§69。上一版 0.74.0 = **minor**:peer sdk 地板 >=9.7.1 + covers 过境 + 面板周期身份 + 离场读口;§68。上一版 0.73.5 = **patch**:workflow 规模告警判定上收进包(`evaluateWorkflowSize` 三态:未知的规模不当作规模正常;分母口径与帽优先级单源;env 读口纯函数);型面纯 additive、公面 1044、peer 不动;§67。上一版 0.73.4 = **patch**:终帧 `permission_denials` 第三键 ⇐ 同一条流 `tool_start` 入参按 `toolCallId` join(三道闸;join 不上留 sema 载体;🔴 更正 0.73.2「自动升级收口」一句)+ 审批 feed push 侧取件失败的欠账退避重试;型面纯 additive、公面 1033、peer 不动;§66。上一版 0.73.3 = **patch**:CC-61 sdk 9.7.1 提货 + `capabilities.approvalsStreamLive` 四态读口(缺席 = 判不出;`livePendingNeedsReconcile` 只在引擎明说会推时才让对账节拍降兜底)+ CC-60 五条模型面文案锚包侧半场(cursorSemantics 机读位 / result 行注记 / bash 首行两变体与良性槽 / 通知 seed 并集 / parked 臂);型面纯 additive、公面 1032、peer 不动;§65。上一版 0.73.2 = **patch**:CC-59 悬挂 ask 全卡 —— `livePending[].frame`(server ≥7.87.0)两道闸窄读进视图,在场即走流内帧腿同一条路(入参可见、改写可转发),缺席保持盲卡;CC-34 收口(引擎半场随 7.87.0 到货,判据交黑盒);型面纯 additive、公面 1026、peer 不动;§64。上一版 0.73.1 = **patch**:CC-57 `decidePlanReview` outcome 尾句按「决断有没有生效」四态选(单铸点 `planReviewOutcomeTail`;此前本地拒发仍让模型汇报已拒绝)+ CC-56 cancel 的 409 按机器码分家(`cancelConflictFromError` 三形 / 新安全码 `cancel_run_not_running`)与提交面 429 用量窗读口 + 人话;型面纯 additive、公面 1026、peer 不动;§63。上一版 0.73.0 = **minor,型面 BREAKING**:fleet 视图八个数值键改可选 —— CC-52 `FleetTaskView.elapsedMs` / `tokens` / `queuedCount` 与 `FleetWorkflowView.doneCount` / `totalCount` / `failedCount` / `tokens` / `elapsedMs` 不再 `?? 0`(有键 = 真值含真 0,缺键 = 不知道;逐键缺席语义见 §62b)+ 台账补偿链无基数不铸;公面导出名零增减 1019、零 wire 变化、peer 不动;§62。上一版 0.72.14 = **patch**:悬挂的流内 ask 拉半场 —— CC-55 `startApprovalsFeed` 快照加 `livePending` 段并进变化摘要(键缺席 = 未报,不铸空)+ 视图 / 去重账 / 与流内帧腿同链的决断口(入参不可见上卡明说、改写不转发)+ 宿主闸对账节拍 + 待决计数读口(不知道 = null);型面纯 additive、公面 1019、peer 不动;§61。上一版 0.72.13 = **patch**:server 7.86.0 提货 —— CC-46 plan_review `permissionModeAfter` 发口(三选卡双闸:宿主声明只读起步 ∧ 引擎 ≥7.86.0;400 field_conflict 两种处置)+ CC-54 `capabilities.executionLane` 四态读面(键缺席 ≠ 不是本机车道;`toolsRunHere` 判据归包)+ CC-53 detach 版本闸三态;型面 additive(另撤回 0.72.12 的主通道 `absent` 臂,改独立缺席订阅口)、公面 1011、peer 不动;§60;**预告 0.73.0 BREAKING**:fleet 视图数值键改可选。上一版 0.72.12 = **patch**:「缺席被折成正向终态」按类清剿 —— CC-50 M1 头条(fleet 行缺席改发 `absent` 不再铸 `end{isError:false}`)+ 六站一次改齐(缺席 ⇒ `unknown`)+ 结果边界 fail-closed 取舍 + `_sema_outcome` + `Outcome unknown:` 行 + CC-51 M6(default 臂不再谎报 running)+ 普查门 + DS-06;型面 additive、公面 993、peer 不动;行为面三处真变化见 CHANGELOG 取舍段;§59。上一版 0.72.11 = **patch**:core 7.23.0 提货 —— CC-49 通告码 66 → 67 `config.write_protection_unresolved`(operator;兄弟码 `target_view_absent` = 没有视图,这枚 = 有视图解析不出)+ `permission_denials` 自动升级腿通电(`gates[].toolCallId` ⇒ `tool_use_id`;CC-34 引擎半场);型面零变化、公面 989、peer 不动、devDep core ~7.23.0;§58。上一版 0.72.10 = **patch**:CC-41 leader run 终局 `needs_human` + `result.conflict` 三形读面(none 缺席不可分 / unreadable 在场读不懂 / conflict;`salvaged[]` 原样给落盘口;措辞单源不提重试);型面纯 additive、公面 989、peer 不动;§57。上一版 0.72.9 = **patch**:server 7.85.0 提货 —— CC-30 会话内 MCP re-dial 消费口(`reconnectMcpServer` 三态 / unsupported 恒五键 / 交易文案单源)+ CC-39② memory-status `autoConsolidationArmed` 三态 + CC-45 resume 补充句渲保留秒数;型面纯 additive、公面 985、peer 不动;§56。上一版 0.72.8 = **patch**:清账三票 —— `memory:"off"` 请求键(CC-39③,server 7.84.0 S-405)+ `runStream` 第二条中性臂 `Model output error:`(CC-43)+ 注入件撞活 run 自动 steer 零卡(CC-44);型面纯 additive、公面 977、peer 不动;§55。上一版 0.72.7 = **patch**:core 7.22.0 提货 —— 通告码 66 `mcp.server_redialed` + 读器 `readMcpServerRedialed` + `wiring_manifest.readDeny` 第九段 `_sema_readDeny`(缺席 = 没有内置行判这条腿);型面纯 additive、公面 971、peer 不动、devDep core ~7.22.0;§54。上一版 0.72.6 = **patch**:cli L-379 包侧半场 —— `steerFollowIntent` steer 后续听意图三态(tail / after-decision / after-wake)+ `activeRunSelfHealRow` 续听声明第五参;型面纯 additive、公面 969、peer 不动;§53。上一版 0.72.5 = **patch**:server 7.82.1 提货 —— `capabilities.webSearch.backend` 部署默认 WebSearch 后端四态读面(键缺席 = 老引擎判不了 ≠ `none`);型面纯 additive、公面 968、peer 不动;§52。上一版 0.72.4 = **patch**:core 7.21.x 三件经 server 7.82.0 提货 —— `wiring_manifest.autoConsolidation` 第八段 `_sema_autoConsolidation`(缺席 = indeterminate 不折 false);型面纯 additive、公面 962、peer 不动;§51。上一版 0.72.3 = **patch**:core #863 记忆单系统半场 ① —— `projectAgentsForWire` 投影 `agents[].memory`(user|project|local 三词同映射引擎平面 agent:<type>);型面纯 additive、公面 962、零 wire 新键、peer 不动;§50。上一版 0.72.2 = **patch**:workflow 视图两票 —— `LiveWorkflowController.resolution()` 六态(snapshot() 的 null 三义拆开)+ `noteOwnWorkflowRun` own 台账同拍登记;型面纯 additive、公面 961、零 wire 键、peer 不动;§49。上一版 0.72.1 = **patch**:server 7.80.1 提货 —— 409 `conflict.resume_context_unavailable` 结构读数(`staleAfterSec` / `runId`;sdk 9.6.0 尚未带键,经 sdk 今天恒缺席)+ `SkillSpec.baseDir`(只在本机车道带);型面纯 additive、公面 960、peer 不动;§48。上一版 0.72.0 = **minor**:型面 BREAKING —— 39 个零消费导出退出公面(CC-32 退役批,[7419] §45 预告 / cli [7422] 同意 / web-client·desktop 过节拍沉默 = 同意;名单见 §47a S-1);运行期零 BREAKING、公面 956、peer 不动、devDep core ~7.20.1;随批:已退役名账 `removed` + export-liveness 门 G 段 + 冻结账门 ⑧c;§47。上一版 0.71.4 = **patch**:core 7.20.1 提货 —— `ENGINE_NOTICE_CODES` 65 + `wiring_manifest.writeProtection` 第七段 `_sema_writeProtection`;型面纯 additive、公面 995、peer 不动、devDep core `~7.20.1`;§46。上一版 0.71.3 = **patch**:门体系清账批 —— CC-24 export-liveness 门 + 39 个导出退役预告(0.72.0 删,表态制)/ CC-26 `as unknown as` 铸链棘轮 / CC-25 冻结账门 ⑧ 段 / CC-06 B-081 包侧半场(终帧 `_sema_effective_reasoning` / `_sema_effective_memory_scopes` + resume reopen 族 + `routePairingVerdict`);型面纯 additive、公面 986 → 995、peer 不动;§45。上一版 0.71.2 = **patch**:接入方验收两票归包 —— CC-28 B-132 decide 拒体三句去内部车道词 / CC-29 B-133 committedUuids 唯一性(重复 ⇒ 形 f);零型面变化、公面 986、peer 不动;§44。上一版 0.71.1 = **patch**:接入档打回修正 —— CC-27 `ApprovalCardRequest.readRootCandidate?` 帧→卡透传位 + 新导出型 `ReadRootCandidateView`;型面纯 additive、公面 986 不变、peer 不动;§43。上一版 0.71.0 = **minor**:型面 BREAKING 六件 —— peer sdk 地板 >=9.6.0 + agent-types >=0.3.0 / `SkillsListingTruncatedFactsView` 删 `requestedBudgetBytes?`·`laneClamped?` / `WiringManifestMcpEntry` → `WiringManifestMcpEntryView` / `MAX_AGENT_SKILLS` 删 / `decide.workflow_host_not_parked` 退役;运行期零 BREAKING。内容:core 7.20.0 提货(闭集 +5 六十四码)/ 🔴 CC-16 `text_segment_end.committedUuids[]` / CC-08 全五件(tool_disclosure / tool_progress 两 chrome 臂、wiring_manifest tools·hooks·lsp 进切片、tool_roster_delta 接上、context_usage 进切片、`readRootCandidate` 镜像)/ CC-19 `mcpEngineLegPresence` 归包 / CC-20 not_parked clean-cut;公面 986;§42 / 42y 八条)|
23
+ | peer:wire 契约 | `@sema-agent/sdk` **>=12.0.1**(value-level,非 type-only;**0.84.0 抬版**:12.x 声明每会话后台登记列表 `sessions.background`、能力位 `capabilities.background.listFace` 与七词闭集的后台状态型,本包三者都读(登记读口的端点门与归类口的编译期穷举),按 12.0.1 编译,11.3.0 失去物料见证;0.84.1 / 0.85.0 不动。此前 **0.80.0 曾抬到 >=11.3.0**:11.3.0 在两条回决口体上声明 `settledBy?: "policy"`、`Settlement.kind` 第十三词 `policy_refused` 与三错误码(0.80.0 至 0.83.6 都在这条地板上);**0.79.0 曾抬到 >=11.2.1**:11.2.x 声明 `capabilities.mcpProbe`、`mcpCapabilities` / `probeMcp` + `McpProbeFace`、写回执第三支 `stillLive: "unknown"`,11.2.1 再补 `TaskRequest.approverPosture` 与审批帧键 `mandated`(型面 + 运行期键锚),本包按 11.2.1 编译,11.0.1 失去物料见证;**0.78.0 曾抬到 >=11.0.1**:11.x 声明 `DeniedBy` 第十词 `read_boundary`、`rules.write` 200 体按 `stillLive` 判别联合、`RemovalLiveness` / `RuleWriteRequest` / `RuleWriteResult` / `RuleWriteBehavior` 包根导出、`TaskRequest.excludeAllTools`,本包按 11.0.1 编译,9.8.1 失去物料见证;**0.75.0 曾抬到 >=9.8.1**:9.8.x 声明 `Capabilities.deviceExecutor.management?`,9.7.1 失去物料见证;**0.74.0 曾抬到 >=9.7.1**:9.7.x 追平的六处型面是本包 0.73.3 起的编译基线,且 9.6.0 失去物料见证;**0.71.0 曾抬到 >=9.6.0**:`tool_disclosure` / `tool_progress` 两帧型与 `ToolApprovalFrame.readRootCandidate` 自 9.6.0 起;0.69.0 曾抬到 >=9.4.0(`reasoning_end` / `lastLegMcp`),0.60.0 抬到 >=8.4.0;地板由 `scripts/run-sdk-floor-test.mjs` 的 `FLOOR` 与 public-surface 门 C-CC-3「不低于见证到的最低实装版」双钉)| `package.json` `peerDependencies` |
24
24
  | peer:会话词汇表 | `@sema-agent/agent-types` **>=0.3.0**(type-only,零运行时;0.71.0 抬版:devDep 与 peer 同步,type-superset 门 ④ 撞名预警对着 0.3.0 的 .d.ts 求值) | 同上 |
25
25
  | runtime dep | `diff` ^9.0.0(**唯一**一条;portability 门按**等值**钉死) | `package.json` `dependencies` |
26
- | 公开导出面 | **1260** 个运行期符号(+ **59 个测试钩,两种拼法**:35 个 `__*ForTests` + 24 个单下划线开头(22 个 `_*ForTest` + `_resetLiveQuestionStore` / `_resetUltracodePreset`) —— 两种都在 `public-export-baseline.json` 的 `testHookNames` 里、各自受棘轮管,**不在** `names` 的 1260 里。运行期 `Object.keys(dist/index.js)` 的全量 = 1260 + 59 = **1319**;只剔双下划线那 35 个会多数出 24 个来,那不是棘轮盲区;最简单的剔法是去掉所有以 `_` 开头的名字(公面运行期名没有一个以 `_` 开头);= 下一版(未发布)的值:相对 0.75.1 **+16**,两票合计 —— **CC-77 ①** 审批决断结局单源判别联合 6 件:`approvalResolutionOf` / `isApprovalDecided` / `approvalNotSentCause` / `approvalUnsettledCause` + 两张 cause 词表 `APPROVAL_NOT_SENT_CAUSES` / `APPROVAL_UNSETTLED_CAUSES`(域 3);**CC-96** 记忆 spec 读面 10 件:`readAgentMemorySpec` / `unknownMemorySpecKeys` / `unknownMemorySpecKeysNote` / `memoryConfigRefusalNoteOf` / `KNOWN_AGENT_MEMORY_SPEC_KEYS` / `PENDING_MEMORY_SPEC_KEYS` / `MAX_UNKNOWN_MEMORY_SPEC_KEYS` / `CONFIG_MEMORY_PROJECT_KEY_SPELLING` / `CONFIG_MEMORY_WRITE_SCOPE_MISMATCH` + 判别形型(域 6 / 16)。CC-89 / CC-91 / CC-92 / CC-98 四票**零值导出增减**(新臂走 `ChromeEvent` 联合与内部臂表,`tasks_expand` 退役删的是联合成员不是导出名);1065 = 0.74.5 / 0.75.0 / 0.75.1 的值:相对 0.74.4 +4 —— `isNewEngineAgentPanelCycle`(CC-87,域 4)+ `approvalOutcomeNoteOf` 与两句固定文案常量(CC-88,域 3);1065 = 0.74.5 / 0.75.0 的值:相对 0.74.4 +4 —— `isNewEngineAgentPanelCycle`(CC-87,域 4)+ `approvalOutcomeNoteOf` 与两句固定文案常量(CC-88,域 3);1061 = 0.74.3 / 0.74.4 的值:相对 0.74.2 +9 —— CC-70 / CC-71 / CC-72 / CC-73 八件 + CC-80 `lastFlagValue`,见 §2b 域 3 / 4 / 10 / 15;1052 = 0.74.2 的值:相对 0.74.1 +6 —— CC-69 六件,见 §2b 域 9;1046 = 0.74.1 的值:相对 0.74.0 +1 —— `RETRACTED_CARD_DECISION_KIND`,见 §2b 域 3;1045 = 0.74.0 的值:相对 0.73.5 +1 —— `isStaleEngineAgentPanelEnd`,见 §2b 域 4;1044 = 0.73.5 的值:相对 0.73.4 +11 —— CC-58 规模告警十一件,名单见 §2b 域 12;1033 = 0.73.4 的值:相对 0.73.3 +1 —— `TOOL_INPUT_JOIN_MAX_CALLS`,见 §2b 域 1;1032 = 0.73.3 的值:相对 0.73.2 +6 —— CC-61 六件,名单见 §2b 域 9;1026 = 0.73.2 的值(导出名零增减);= 0.73.1 的值:相对 0.73.0 +7 —— CC-56 六件 / CC-57 一件,名单见 §2b 域 3 / 15;1019 = 0.73.0 的值(导出名零增减,BREAKING 在类型面);= 0.72.14 的值:相对 0.72.13 +8 —— CC-55 八件,名单见 §2b 域 3;1011 = 0.72.13 的值:相对 0.72.12 +18 —— CC-46 八件 / CC-54 六件 / CC-53 两件 / CC-50 缺席口两件,名单见 §2b 域 3 / 4 / 9 / 10;993 = 0.72.12 的值(测试钩 45):相对 0.72.11 +4 —— CC-50 `OUTCOME_UNKNOWN_ROW_PREFIX` / `isOutcomeUnknownRowText` / `TASK_NOTIFICATION_TERMINAL_STATUSES` / `isTaskNotificationTerminalStatus`;989 = 0.72.10 的值:相对 0.72.9 +4 —— CC-41 `LEADER_RUN_STATUSES` / `LEADER_REJ_HEAD_DISPLAY_MAX` / `projectLeaderConflict` / `leaderConflictDetail`;985 = 0.72.9 的值:相对 0.72.8 +8 —— CC-30 `MCP_RECONNECT_OUTCOMES` / `MCP_RECONNECT_TRANSACTION_NOTICE` / `projectMcpReconnectResult` / `classifyMcpReconnectFailure` / `reconnectMcpServer` / `projectMcpReconnectCapability` / `mcpReconnectOutcomeDetail`、CC-39② `readAutoConsolidationArmed`;977 = 0.72.8 的值:相对 0.72.7 +6 —— CC-39③ `MEMORY_OFF` / `memoryOffDeclarationField` / `memoryOffDeclared`、CC-43 `MODEL_OUTPUT_ERROR_PREFIX` / `isModelOutputErrorText` / `isModelOutputErrorRowText`;971 = 0.72.7 的值:相对 0.72.6 +2 —— CC-42 core 7.22.0 提货 `MCP_REDIAL_OUTCOMES` / `readMcpServerRedialed`;969 = 0.72.6 的值:相对 0.72.5 +1 —— CC-40 `steerFollowIntent`;968 = 0.72.5 的值:相对 0.72.4 +6 —— CC-31 server 7.82.1 提货 `capabilities.webSearch.backend` 四态读面:`WEB_SEARCH_BACKEND_NONE` / `projectWebSearchBackendCapability` / `observedWebSearchBackend` / `noteEngineCapsForWebSearchBackend` / `forgetWebSearchBackendReading` / `webSearchBackendDoctorDetail`;962 = 0.72.3 的值:相对 0.72.2 +1 —— CC-39① `AGENT_MEMORY_WORDS`;0.72.2 相对 0.72.1 +1 —— CC-37 `noteOwnWorkflowRun`;0.72.1 相对 0.72.0 +4 —— CC-33 server 7.80.1 提货:`RESUME_CONTEXT_UNAVAILABLE` / `resumeContextUnavailableFromError` / `resumeContextUnavailableContent` / `skillBaseDirOf`;0.72.0 相对 0.71.4 −39 —— CC-32 退役批删 export-liveness 登记 retire 的 39 个零消费导出(23 常量 + 16 函数,名单见 §47);995 = 0.71.3 的值:相对 0.71.2 +9 —— CC-06 `readEffectiveReasoning` / `readEffectiveMemoryScopes` / `resumeReopenFromError` / `resumeReopenContent` / `routePairingVerdict` 五函数 + `RESUME_REOPEN_CODES` / `RESUME_ENV_FAILED` / `RESUME_TOOL_UNAVAILABLE` / `RESUME_TOOL_CONTRACT_MISMATCH` 四常量;986 = 0.71.0 的值:相对 0.70.2 −`MAX_AGENT_SKILLS` −`DECIDE_WORKFLOW_HOST_NOT_PARKED` +`projectToolRosterDelta` +`mcpEngineLegPresence`;986 = 0.70.0 的值:相对 0.69.2 **一件 additive(`readSkillsListingTruncated`,§39)、零删除**;985 = 0.69.2 的值:相对 0.69.1 **三件 additive、零删除**(CC-13 `isSubFlowSegmentEnd` / `SEGMENT_END_IDENTITY_KEYS` / `droppedWhySentence`,§38);982 = 0.69.0 未发布版的值(原排 0.68.3,因 peer 地板抬升改 minor)= 相对 0.68.2 **十七件 additive、零删除**:`fetchMcpPanel`(CC-03 补件,§36e)+ `readWorkflowResumeAdmissionIncomplete`(CC-05 core 7.18.0 #755)+ `installCoreValuePorts`/`hasCoreValuePorts`/`hasCoreValuePort`/`coreValuePortMisses`/`CORE_VALUE_PORT_NAMES` + 十读口(CC-07 core 值级端口,§36d);0.68.2 相对 0.68.1 十三件 additive:`SEMA_SEGMENT_ID_KEY`(CC-01 段身份键,§35f)/ `projectMcpPanel`+`mcpPanelLastLegDetail`+`projectMcpSection`(CC-03 `/mcp` 面板读视图,§35g)/ `resolveTextSegmentAuthority`/`createTextSegmentLedger`(L-318 `text_end` 权威段替换的判决单源 + print 形段账,详见 §35b/§35c)/ `memoryCaptureDeclarationField`/`MEMORY_CAPTURE_OFF`(L-316 会话级隐私声明的字面唯一铸点,§35d)/ `engineUrl`/`probeHealth`(L-61 件④ SDK 纯工具面原样转口,§35d)/ `AgentClient`/`isApprovalRequestFrameV1`/`isApprovalRevokeFrameV1`(L-61 存量清零:SDK **wire 面**原样转口,§35e)。`0.68.1`/`0.68.0` 是 **952**,那批是相对 0.67.2 **二十件 additive、🔴 两件删除(BREAKING)**:additive = `TERMINAL_CAUSE_KINDS`/`isTerminalCauseKind`/`RUN_TERMINAL_NOT_SUCCESS_STATUSES`/`RUN_TERMINAL_STATUSES`(L-247 终态词两表分源,详见 §33b)/ `SEMA_SUBAGENT_USAGE_PARTIAL_KEY`/`subagentUsageIsPartial`(L-244 子代下界位自有名,§33g)/ `ASK_UNRESOLVABLE_CAUSES`/`readAskUnresolvable`/`DURABLE_MANDATE_SOURCES`/`readDurableGateUnavailable`(core 7.17.0 #709 ①② 两只通告事实窄读器,§33c)/ `WORKFLOW_PARK_TRUTH_UNREADABLE`/`WORKFLOW_PARK_NOT_PENDING`/`WORKFLOW_PARK_BINDING_BROKEN`/`WORKFLOW_PARK_REQUIRES_RUN_STORE`(四个单码常量 🔧 0.72.0 退役)/`WORKFLOW_PARK_REFUSAL_CODES`/`isWorkflowParkRefusalCode`/`readWorkflowParks`(core 7.17.0 #652 park 真相四码 + parks 三键读器,§33d)/ `ENGINE_STOP_REASONS`/`engineStopReasonToCc`(L-246 A13 停止原词映射下沉,§33g)/ `readCancelRequested`(L-230 读面,§33f);🔴 **删除两件** `TERMINAL_NOT_SUCCESS_STATUSES`/`TERMINAL_STATUSES`(随 L-247 两表分源更名成 `RUN_TERMINAL_*`,clean-cut **不留别名** —— 留一个别名等于让端可以继续按合起来的那张表读,分源就白做了,详见 §33b)。`0.67.0` 是 **934**,那批是相对 0.66.0 **七件 additive、🔴 两件删除**:additive = `CLASSIFIER_DENY_CAUSES`/`isClassifierDenyCause`/`classifierDenyCauseOf`/`classifierDenyCauseDetail`(core 7.14.0 退役 `classifierUnavailable` 之后的**拒绝面**继任读器与措辞,详见 §32b)/ `RULE_STORE_UNREADABLE_KINDS`/`isRuleStoreUnreadableKind`/`ruleStoreUnreadableDetail`(core 7.14.0 #688 C3 的规则店机制位三件,详见 §32d);🔴 **删除两件** `classifierUnavailableOf`/`classifierUnavailableDetail`(随 core 7.14.0 的 Retired keys 表整族退役,clean-cut 不留别名,详见 §32b;同批删的还有**型** `ClassifierUnavailableView`、卡位与帧位 `classifierUnavailable`、以及一条恒真的型面钉 `_askOriginWordsPin`)。`0.66.0` 是 **929**,那批是一件 additive、零删除:`readRunCostFacts`(终局成本事实的唯一读器:`costBreakdown` / `nested` 窄读 + 对账三段与两个判别位,终帧超集键与 chrome 对账臂共用它;详见 §31c);已发的 **0.65.x 十一件 additive、两件删除**:additive = `DECIDE_WORKFLOW_HOST_UNKNOWN`/`DECIDE_WORKFLOW_HOST_NOT_PARKED`/`DECIDE_WORKFLOW_REMEMBER_UNSUPPORTED`/`DECIDE_WORKFLOW_LANE_CODES`/`readDecideReceipt`/`decideAcceptedNotResolved`/`decideRefusalFromError`(B-070 `/decide` 回执读面与三码人话,详见 §30h)/ `TERMINAL_NOT_SUCCESS_STATUSES`/`isTerminalNotSuccess`/`TERMINAL_STATUSES`/`isTerminalStatus`(L-215② 终局词汇单铸谓词,详见 §30j);🔴 **删除两件** `AUTO_MODE_BREAKER_CAUSES`/`classifierBreakerOf`(熔断族随 core 7.12.0 的 Removed(BREAKING) 整只退役,clean-cut 不留别名,详见 §30k②;同批删的还有**型** `ClassifierBreakerView` 与 `ClassifierStatusView.breaker` 一位)。`0.64.2` 是 **919**,那批是一件 additive、零删除:`readDenialLimitFallback`(限额回落卡的窄读器上公面,壳侧同判据副本退役,详见 §29③);`0.64.0` 是 **918**,那批是件①+件② 十三件 additive、零删除:`CLASSIFIER_STATUS_STATES`/`classifierBreakerOf`/`classifierStatusOf`/`classifierStatusDetail`(分类器状态面,详见 §28②)/ `THINKING_FORMATS`/`THINKING_FORMAT_WIRE_TWINS`/`THINKING_DISABLE_PROBE_ORDER`/`MODEL_PROBE_VERDICTS`/`PROBE_PROMPT`/`PROBE_MAX_TOKENS`(两个探针常量 🔧 0.72.0 退役)/`probeRequestBody`/`probeModelCapability`/`applyProbeToEntry`(模型思考能力探测,详见 §28①);`0.63.0` 是 **905**,那批是八件 additive、零删除:`projectServerGateKnobs`/`postureKnobSourceOf`/`postureSourceIsOperatorPinned`/`postureKnobDetail`/`POSTURE_SOURCE_WORDS`(S-178 三根 posture 旋钮读数,详见 §27b)/ `PERSISTED_RULE_BEHAVIORS`/`PERSISTED_RULE_BEHAVIOR_UNKNOWN`/`persistedRuleBehaviorOf`/`persistedRuleBehaviorLabel`/`revokeTargetFromPersistedRule`(三态规则身份,§27c)/ `engineIdentityOf`/`engineIdentityVerdict`/`engineIdentityChanged`/`engineIdentityChangedBy`/`ENGINE_IDENTITY_ANCHORS`(S-179 代际锚,§27d)/ `GATE_DENIED_BY_WORDS`/`gateDeniedByDetail`/`ASK_ORIGIN_WORDS`/`askOriginDetail`(门词汇 +2,§27e)/ `PERMISSION_RULE_ISSUE_CODES`/`RETIRED_PERMISSION_RULE_ISSUE_CODES`/`permissionRuleIssueDetail`(规则 lint 码表,§27f)/ `projectToolRoster`/`toolRosterNames`/`toolShimFromRoster`/`applyToolRosterDelta`(L-161 工具名册,§27g)/ `ENGINE_NOTICE_CODES`/`ENGINE_NOTICE_AUDIENCE`/`noticeAudienceOf`/`engineNoticeInCatalog`/`MCP_INJECTION_DROP_REASONS`/`readMcpInjectionDrop`(L-167 通告码册,§27h)/ `AUTO_MODE_UNAVAILABLE_CAUSES`/`AUTO_MODE_BREAKER_CAUSES`/`classifierUnavailableOf`/`classifierUnavailableDetail`(件⑧ 分类器不可用事实,§27h2);`0.62.0` 是 **869**,那批是五件 additive、**零删除**:`capForDisplay`(呈前消毒 + 封长的共用铸点,详见 §26⑦)/ `SEAT_SEND_MESSAGE_KEY_ORIGINS`(座位载荷逐键出身表,详见 §26③)/ `configureSubagentContentStore`+`subagentContentStoreConfig`+`SUBAGENT_CONTENT_STORE_DEFAULTS`(子代内容账本字节预算,测试钩 `__resetSubagentContentStoreConfigForTests` +1,详见 §26②);`0.61.0` 是 **864**,那批是三件 additive、**零删除**:`projectReadFacePosture`/`readFacePostureDetail`/`readFaceDisagreement`(S-167 READ 容纳面 operator 读器,详见 §25);`0.60.0` 是 **861**,那批是二十五件 additive、**零删除**:`readRunTerminal`/`runTerminalCode`/`runTerminalGateKind`/`runTerminalGateToolName`/`isReviewPark`/`REVIEW_PARK_GATE_KINDS` 六件终局因由读器 + `gateOutcomeOf`/`isDeniedGate`/`gateDeniedBy`/`gateApprover`/`isApprovalWindowExpiredGate`/`isDenialLimitAutoDeniedGate`/`isParkSlaExpiredGate`/`isHumanSettledGate` 八件门记录读器 + `projectWriteProtectionCapability`/`noteEngineCapsForWriteProtection`/`observedWriteProtection`/`forgetWriteProtectionReading`/`writeProtectionDoctorDetail`/`projectWriteProtectionPosture`/`writeProtectionPostureDetail` 七件写保护读面(测试钩 `__resetWriteProtectionReadingsForTests` +1)+ `readWireErrorCode` + 真机边界①的两件 `isGateParkedToolEnd`/`GATE_PARKED_ERROR_CODE` + 异源复审逼出的 `engineCapsGeneration`;`0.59.0` 是 **836**,那批是八件 additive:`RULE_OFFERS_ABSENCE_REASONS`/`DENIAL_LIMIT_KINDS` 两张闭词表再导出 + `engineCapValue` 能力位四态通用读口 + `projectSqlEngineCapability`/`observedSqlEngine`/`noteEngineCapsForSqlEngine`/`forgetSqlEngineReading`/`sqlEngineDoctorDetail` 五件 SQL 姿态读面(测试钩 `__resetSqlEngineReadingsForTests` +1);`0.58.0` 是 **828**,那批是三件 additive:`RULE_OFFER_MATCHES`/`RULE_OFFER_BATCH_MEMBER_KINDS`/`RULE_OFFER_UNCOVERED_REASONS` 三张闭词表再导出 + `RESUME_REFUSAL_CODES`/`RESUME_PLACEMENT_MISMATCH`/`resumeRefusalFromError`/`resumeRefusalContent` 四件文案铸点;`0.57.0` 是 **821**;`0.56.0`/`0.55.0` 是 **815**;已发 `0.54.0`(design/385 十件 additive 含 `AUTHORITY_ENVELOPE_TAGS` 🔧 0.72.0 退役);`0.52.0` 是 **805**(L-69⑨ 两件);`0.51.0` 是 **803**;`0.50.0` 是 **800**(S-81 五件);`0.49.0` 是 **795**;`0.48.0` 是 **794**;npm `0.47.0` 是 **790**,`0.46.0` 是 **787**,`0.44.0` 是 **783**,`0.43.1`/`0.43.0` 是 **776**,`0.42.0` 是 **771**,`0.41.0` 是 **767**,`0.39.0` 是 **766**,`0.38.0` 是 **764**;`0.37.0` 是 **753**,见 `CHANGELOG.md`) | `scripts/public-export-baseline.json` 的 `count` / `testHookCount` —— **别手抄进别处,以该文件为准** |
26
+ | 公开导出面 | **1307** 个运行期符号(+ **60 个测试钩,两种拼法**:36 个 `__*ForTests` + 24 个单下划线开头(22 个 `_*ForTest` + `_resetLiveQuestionStore` / `_resetUltracodePreset`) —— 两种都在 `public-export-baseline.json` 的 `testHookNames` 里、各自受棘轮管,**不在** `names` 的 1307 里。运行期 `Object.keys(dist/index.js)` 的全量 = 1307 + 60 = **1367**;只剔双下划线那 36 个会多数出 24 个来,那不是棘轮盲区;最简单的剔法是去掉所有以 `_` 开头的名字(公面运行期名没有一个以 `_` 开头);= 下一版(未发布)的值:相对 0.75.1 **+16**,两票合计 —— **CC-77 ①** 审批决断结局单源判别联合 6 件:`approvalResolutionOf` / `isApprovalDecided` / `approvalNotSentCause` / `approvalUnsettledCause` + 两张 cause 词表 `APPROVAL_NOT_SENT_CAUSES` / `APPROVAL_UNSETTLED_CAUSES`(域 3);**CC-96** 记忆 spec 读面 10 件:`readAgentMemorySpec` / `unknownMemorySpecKeys` / `unknownMemorySpecKeysNote` / `memoryConfigRefusalNoteOf` / `KNOWN_AGENT_MEMORY_SPEC_KEYS` / `PENDING_MEMORY_SPEC_KEYS` / `MAX_UNKNOWN_MEMORY_SPEC_KEYS` / `CONFIG_MEMORY_PROJECT_KEY_SPELLING` / `CONFIG_MEMORY_WRITE_SCOPE_MISMATCH` + 判别形型(域 6 / 16)。CC-89 / CC-91 / CC-92 / CC-98 四票**零值导出增减**(新臂走 `ChromeEvent` 联合与内部臂表,`tasks_expand` 退役删的是联合成员不是导出名);1065 = 0.74.5 / 0.75.0 / 0.75.1 的值:相对 0.74.4 +4 —— `isNewEngineAgentPanelCycle`(CC-87,域 4)+ `approvalOutcomeNoteOf` 与两句固定文案常量(CC-88,域 3);1065 = 0.74.5 / 0.75.0 的值:相对 0.74.4 +4 —— `isNewEngineAgentPanelCycle`(CC-87,域 4)+ `approvalOutcomeNoteOf` 与两句固定文案常量(CC-88,域 3);1061 = 0.74.3 / 0.74.4 的值:相对 0.74.2 +9 —— CC-70 / CC-71 / CC-72 / CC-73 八件 + CC-80 `lastFlagValue`,见 §2b 域 3 / 4 / 10 / 15;1052 = 0.74.2 的值:相对 0.74.1 +6 —— CC-69 六件,见 §2b 域 9;1046 = 0.74.1 的值:相对 0.74.0 +1 —— `RETRACTED_CARD_DECISION_KIND`,见 §2b 域 3;1045 = 0.74.0 的值:相对 0.73.5 +1 —— `isStaleEngineAgentPanelEnd`,见 §2b 域 4;1044 = 0.73.5 的值:相对 0.73.4 +11 —— CC-58 规模告警十一件,名单见 §2b 域 12;1033 = 0.73.4 的值:相对 0.73.3 +1 —— `TOOL_INPUT_JOIN_MAX_CALLS`,见 §2b 域 1;1032 = 0.73.3 的值:相对 0.73.2 +6 —— CC-61 六件,名单见 §2b 域 9;1026 = 0.73.2 的值(导出名零增减);= 0.73.1 的值:相对 0.73.0 +7 —— CC-56 六件 / CC-57 一件,名单见 §2b 域 3 / 15;1019 = 0.73.0 的值(导出名零增减,BREAKING 在类型面);= 0.72.14 的值:相对 0.72.13 +8 —— CC-55 八件,名单见 §2b 域 3;1011 = 0.72.13 的值:相对 0.72.12 +18 —— CC-46 八件 / CC-54 六件 / CC-53 两件 / CC-50 缺席口两件,名单见 §2b 域 3 / 4 / 9 / 10;993 = 0.72.12 的值(测试钩 45):相对 0.72.11 +4 —— CC-50 `OUTCOME_UNKNOWN_ROW_PREFIX` / `isOutcomeUnknownRowText` / `TASK_NOTIFICATION_TERMINAL_STATUSES` / `isTaskNotificationTerminalStatus`;989 = 0.72.10 的值:相对 0.72.9 +4 —— CC-41 `LEADER_RUN_STATUSES` / `LEADER_REJ_HEAD_DISPLAY_MAX` / `projectLeaderConflict` / `leaderConflictDetail`;985 = 0.72.9 的值:相对 0.72.8 +8 —— CC-30 `MCP_RECONNECT_OUTCOMES` / `MCP_RECONNECT_TRANSACTION_NOTICE` / `projectMcpReconnectResult` / `classifyMcpReconnectFailure` / `reconnectMcpServer` / `projectMcpReconnectCapability` / `mcpReconnectOutcomeDetail`、CC-39② `readAutoConsolidationArmed`;977 = 0.72.8 的值:相对 0.72.7 +6 —— CC-39③ `MEMORY_OFF` / `memoryOffDeclarationField` / `memoryOffDeclared`、CC-43 `MODEL_OUTPUT_ERROR_PREFIX` / `isModelOutputErrorText` / `isModelOutputErrorRowText`;971 = 0.72.7 的值:相对 0.72.6 +2 —— CC-42 core 7.22.0 提货 `MCP_REDIAL_OUTCOMES` / `readMcpServerRedialed`;969 = 0.72.6 的值:相对 0.72.5 +1 —— CC-40 `steerFollowIntent`;968 = 0.72.5 的值:相对 0.72.4 +6 —— CC-31 server 7.82.1 提货 `capabilities.webSearch.backend` 四态读面:`WEB_SEARCH_BACKEND_NONE` / `projectWebSearchBackendCapability` / `observedWebSearchBackend` / `noteEngineCapsForWebSearchBackend` / `forgetWebSearchBackendReading` / `webSearchBackendDoctorDetail`;962 = 0.72.3 的值:相对 0.72.2 +1 —— CC-39① `AGENT_MEMORY_WORDS`;0.72.2 相对 0.72.1 +1 —— CC-37 `noteOwnWorkflowRun`;0.72.1 相对 0.72.0 +4 —— CC-33 server 7.80.1 提货:`RESUME_CONTEXT_UNAVAILABLE` / `resumeContextUnavailableFromError` / `resumeContextUnavailableContent` / `skillBaseDirOf`;0.72.0 相对 0.71.4 −39 —— CC-32 退役批删 export-liveness 登记 retire 的 39 个零消费导出(23 常量 + 16 函数,名单见 §47);995 = 0.71.3 的值:相对 0.71.2 +9 —— CC-06 `readEffectiveReasoning` / `readEffectiveMemoryScopes` / `resumeReopenFromError` / `resumeReopenContent` / `routePairingVerdict` 五函数 + `RESUME_REOPEN_CODES` / `RESUME_ENV_FAILED` / `RESUME_TOOL_UNAVAILABLE` / `RESUME_TOOL_CONTRACT_MISMATCH` 四常量;986 = 0.71.0 的值:相对 0.70.2 −`MAX_AGENT_SKILLS` −`DECIDE_WORKFLOW_HOST_NOT_PARKED` +`projectToolRosterDelta` +`mcpEngineLegPresence`;986 = 0.70.0 的值:相对 0.69.2 **一件 additive(`readSkillsListingTruncated`,§39)、零删除**;985 = 0.69.2 的值:相对 0.69.1 **三件 additive、零删除**(CC-13 `isSubFlowSegmentEnd` / `SEGMENT_END_IDENTITY_KEYS` / `droppedWhySentence`,§38);982 = 0.69.0 未发布版的值(原排 0.68.3,因 peer 地板抬升改 minor)= 相对 0.68.2 **十七件 additive、零删除**:`fetchMcpPanel`(CC-03 补件,§36e)+ `readWorkflowResumeAdmissionIncomplete`(CC-05 core 7.18.0 #755)+ `installCoreValuePorts`/`hasCoreValuePorts`/`hasCoreValuePort`/`coreValuePortMisses`/`CORE_VALUE_PORT_NAMES` + 十读口(CC-07 core 值级端口,§36d);0.68.2 相对 0.68.1 十三件 additive:`SEMA_SEGMENT_ID_KEY`(CC-01 段身份键,§35f)/ `projectMcpPanel`+`mcpPanelLastLegDetail`+`projectMcpSection`(CC-03 `/mcp` 面板读视图,§35g)/ `resolveTextSegmentAuthority`/`createTextSegmentLedger`(L-318 `text_end` 权威段替换的判决单源 + print 形段账,详见 §35b/§35c)/ `memoryCaptureDeclarationField`/`MEMORY_CAPTURE_OFF`(L-316 会话级隐私声明的字面唯一铸点,§35d)/ `engineUrl`/`probeHealth`(L-61 件④ SDK 纯工具面原样转口,§35d)/ `AgentClient`/`isApprovalRequestFrameV1`/`isApprovalRevokeFrameV1`(L-61 存量清零:SDK **wire 面**原样转口,§35e)。`0.68.1`/`0.68.0` 是 **952**,那批是相对 0.67.2 **二十件 additive、🔴 两件删除(BREAKING)**:additive = `TERMINAL_CAUSE_KINDS`/`isTerminalCauseKind`/`RUN_TERMINAL_NOT_SUCCESS_STATUSES`/`RUN_TERMINAL_STATUSES`(L-247 终态词两表分源,详见 §33b)/ `SEMA_SUBAGENT_USAGE_PARTIAL_KEY`/`subagentUsageIsPartial`(L-244 子代下界位自有名,§33g)/ `ASK_UNRESOLVABLE_CAUSES`/`readAskUnresolvable`/`DURABLE_MANDATE_SOURCES`/`readDurableGateUnavailable`(core 7.17.0 #709 ①② 两只通告事实窄读器,§33c)/ `WORKFLOW_PARK_TRUTH_UNREADABLE`/`WORKFLOW_PARK_NOT_PENDING`/`WORKFLOW_PARK_BINDING_BROKEN`/`WORKFLOW_PARK_REQUIRES_RUN_STORE`(四个单码常量 🔧 0.72.0 退役)/`WORKFLOW_PARK_REFUSAL_CODES`/`isWorkflowParkRefusalCode`/`readWorkflowParks`(core 7.17.0 #652 park 真相四码 + parks 三键读器,§33d)/ `ENGINE_STOP_REASONS`/`engineStopReasonToCc`(L-246 A13 停止原词映射下沉,§33g)/ `readCancelRequested`(L-230 读面,§33f);🔴 **删除两件** `TERMINAL_NOT_SUCCESS_STATUSES`/`TERMINAL_STATUSES`(随 L-247 两表分源更名成 `RUN_TERMINAL_*`,clean-cut **不留别名** —— 留一个别名等于让端可以继续按合起来的那张表读,分源就白做了,详见 §33b)。`0.67.0` 是 **934**,那批是相对 0.66.0 **七件 additive、🔴 两件删除**:additive = `CLASSIFIER_DENY_CAUSES`/`isClassifierDenyCause`/`classifierDenyCauseOf`/`classifierDenyCauseDetail`(core 7.14.0 退役 `classifierUnavailable` 之后的**拒绝面**继任读器与措辞,详见 §32b)/ `RULE_STORE_UNREADABLE_KINDS`/`isRuleStoreUnreadableKind`/`ruleStoreUnreadableDetail`(core 7.14.0 #688 C3 的规则店机制位三件,详见 §32d);🔴 **删除两件** `classifierUnavailableOf`/`classifierUnavailableDetail`(随 core 7.14.0 的 Retired keys 表整族退役,clean-cut 不留别名,详见 §32b;同批删的还有**型** `ClassifierUnavailableView`、卡位与帧位 `classifierUnavailable`、以及一条恒真的型面钉 `_askOriginWordsPin`)。`0.66.0` 是 **929**,那批是一件 additive、零删除:`readRunCostFacts`(终局成本事实的唯一读器:`costBreakdown` / `nested` 窄读 + 对账三段与两个判别位,终帧超集键与 chrome 对账臂共用它;详见 §31c);已发的 **0.65.x 十一件 additive、两件删除**:additive = `DECIDE_WORKFLOW_HOST_UNKNOWN`/`DECIDE_WORKFLOW_HOST_NOT_PARKED`/`DECIDE_WORKFLOW_REMEMBER_UNSUPPORTED`/`DECIDE_WORKFLOW_LANE_CODES`/`readDecideReceipt`/`decideAcceptedNotResolved`/`decideRefusalFromError`(B-070 `/decide` 回执读面与三码人话,详见 §30h)/ `TERMINAL_NOT_SUCCESS_STATUSES`/`isTerminalNotSuccess`/`TERMINAL_STATUSES`/`isTerminalStatus`(L-215② 终局词汇单铸谓词,详见 §30j);🔴 **删除两件** `AUTO_MODE_BREAKER_CAUSES`/`classifierBreakerOf`(熔断族随 core 7.12.0 的 Removed(BREAKING) 整只退役,clean-cut 不留别名,详见 §30k②;同批删的还有**型** `ClassifierBreakerView` 与 `ClassifierStatusView.breaker` 一位)。`0.64.2` 是 **919**,那批是一件 additive、零删除:`readDenialLimitFallback`(限额回落卡的窄读器上公面,壳侧同判据副本退役,详见 §29③);`0.64.0` 是 **918**,那批是件①+件② 十三件 additive、零删除:`CLASSIFIER_STATUS_STATES`/`classifierBreakerOf`/`classifierStatusOf`/`classifierStatusDetail`(分类器状态面,详见 §28②)/ `THINKING_FORMATS`/`THINKING_FORMAT_WIRE_TWINS`/`THINKING_DISABLE_PROBE_ORDER`/`MODEL_PROBE_VERDICTS`/`PROBE_PROMPT`/`PROBE_MAX_TOKENS`(两个探针常量 🔧 0.72.0 退役)/`probeRequestBody`/`probeModelCapability`/`applyProbeToEntry`(模型思考能力探测,详见 §28①);`0.63.0` 是 **905**,那批是八件 additive、零删除:`projectServerGateKnobs`/`postureKnobSourceOf`/`postureSourceIsOperatorPinned`/`postureKnobDetail`/`POSTURE_SOURCE_WORDS`(S-178 三根 posture 旋钮读数,详见 §27b)/ `PERSISTED_RULE_BEHAVIORS`/`PERSISTED_RULE_BEHAVIOR_UNKNOWN`/`persistedRuleBehaviorOf`/`persistedRuleBehaviorLabel`/`revokeTargetFromPersistedRule`(三态规则身份,§27c)/ `engineIdentityOf`/`engineIdentityVerdict`/`engineIdentityChanged`/`engineIdentityChangedBy`/`ENGINE_IDENTITY_ANCHORS`(S-179 代际锚,§27d)/ `GATE_DENIED_BY_WORDS`/`gateDeniedByDetail`/`ASK_ORIGIN_WORDS`/`askOriginDetail`(门词汇 +2,§27e)/ `PERMISSION_RULE_ISSUE_CODES`/`RETIRED_PERMISSION_RULE_ISSUE_CODES`/`permissionRuleIssueDetail`(规则 lint 码表,§27f)/ `projectToolRoster`/`toolRosterNames`/`toolShimFromRoster`/`applyToolRosterDelta`(L-161 工具名册,§27g)/ `ENGINE_NOTICE_CODES`/`ENGINE_NOTICE_AUDIENCE`/`noticeAudienceOf`/`engineNoticeInCatalog`/`MCP_INJECTION_DROP_REASONS`/`readMcpInjectionDrop`(L-167 通告码册,§27h)/ `AUTO_MODE_UNAVAILABLE_CAUSES`/`AUTO_MODE_BREAKER_CAUSES`/`classifierUnavailableOf`/`classifierUnavailableDetail`(件⑧ 分类器不可用事实,§27h2);`0.62.0` 是 **869**,那批是五件 additive、**零删除**:`capForDisplay`(呈前消毒 + 封长的共用铸点,详见 §26⑦)/ `SEAT_SEND_MESSAGE_KEY_ORIGINS`(座位载荷逐键出身表,详见 §26③)/ `configureSubagentContentStore`+`subagentContentStoreConfig`+`SUBAGENT_CONTENT_STORE_DEFAULTS`(子代内容账本字节预算,测试钩 `__resetSubagentContentStoreConfigForTests` +1,详见 §26②);`0.61.0` 是 **864**,那批是三件 additive、**零删除**:`projectReadFacePosture`/`readFacePostureDetail`/`readFaceDisagreement`(S-167 READ 容纳面 operator 读器,详见 §25);`0.60.0` 是 **861**,那批是二十五件 additive、**零删除**:`readRunTerminal`/`runTerminalCode`/`runTerminalGateKind`/`runTerminalGateToolName`/`isReviewPark`/`REVIEW_PARK_GATE_KINDS` 六件终局因由读器 + `gateOutcomeOf`/`isDeniedGate`/`gateDeniedBy`/`gateApprover`/`isApprovalWindowExpiredGate`/`isDenialLimitAutoDeniedGate`/`isParkSlaExpiredGate`/`isHumanSettledGate` 八件门记录读器 + `projectWriteProtectionCapability`/`noteEngineCapsForWriteProtection`/`observedWriteProtection`/`forgetWriteProtectionReading`/`writeProtectionDoctorDetail`/`projectWriteProtectionPosture`/`writeProtectionPostureDetail` 七件写保护读面(测试钩 `__resetWriteProtectionReadingsForTests` +1)+ `readWireErrorCode` + 真机边界①的两件 `isGateParkedToolEnd`/`GATE_PARKED_ERROR_CODE` + 异源复审逼出的 `engineCapsGeneration`;`0.59.0` 是 **836**,那批是八件 additive:`RULE_OFFERS_ABSENCE_REASONS`/`DENIAL_LIMIT_KINDS`(后者 🔧 0.85.0 退出公面)两张闭词表再导出 + `engineCapValue` 能力位四态通用读口 + `projectSqlEngineCapability`/`observedSqlEngine`/`noteEngineCapsForSqlEngine`/`forgetSqlEngineReading`/`sqlEngineDoctorDetail` 五件 SQL 姿态读面(测试钩 `__resetSqlEngineReadingsForTests` +1);`0.58.0` 是 **828**,那批是三件 additive:`RULE_OFFER_MATCHES`/`RULE_OFFER_BATCH_MEMBER_KINDS`/`RULE_OFFER_UNCOVERED_REASONS` 三张闭词表再导出 + `RESUME_REFUSAL_CODES`/`RESUME_PLACEMENT_MISMATCH`/`resumeRefusalFromError`/`resumeRefusalContent` 四件文案铸点;`0.57.0` 是 **821**;`0.56.0`/`0.55.0` 是 **815**;已发 `0.54.0`(design/385 十件 additive 含 `AUTHORITY_ENVELOPE_TAGS` 🔧 0.72.0 退役);`0.52.0` 是 **805**(L-69⑨ 两件);`0.51.0` 是 **803**;`0.50.0` 是 **800**(S-81 五件);`0.49.0` 是 **795**;`0.48.0` 是 **794**;npm `0.47.0` 是 **790**,`0.46.0` 是 **787**,`0.44.0` 是 **783**,`0.43.1`/`0.43.0` 是 **776**,`0.42.0` 是 **771**,`0.41.0` 是 **767**,`0.39.0` 是 **766**,`0.38.0` 是 **764**;`0.37.0` 是 **753**,见 `CHANGELOG.md`) | `scripts/public-export-baseline.json` 的 `count` / `testHookCount` —— **别手抄进别处,以该文件为准** |
27
27
  | 常驻门 | 以 `scripts/gates-manifest.json` 的 `suites` 长度为准(**本档不抄这个数**) | `scripts/gates-manifest.json`;`npm test` 的名单等值门与它逐名对账 |
28
28
  | 沿革档 | 0.29.0 起建 `CHANGELOG.md`;更早批次记账在 `src/index.ts` 文件头 + `docs/REFACTOR-LEDGER.md` | — |
29
29
 
@@ -125,7 +125,7 @@ SDK 核对「本包 import 的每个值级符号仍然导出」「`TaskStats.cos
125
125
 
126
126
  > 📦 **随包 / 不随包**:npm 包只带 `dist` / `README` / `CHANGELOG` / 本档 / `LICENSE`。本档各处提到的 `docs/type-superset.json`、`scripts/*.json`、`scripts/run-*-test.mjs` 都是**仓内登记物与门,不随包发出** —— 装包的消费者找不到它们是预期;`_sema_` 超集键的**随包契约**就是本档各 §NNz 逐键处置表(键名 / 值域 / 缺席语义逐条在表里)。
127
127
  >
128
- > 全集真源 = `scripts/public-export-baseline.json` 的 `names`(**1260** 项;该基线只覆盖**根**入口,子路径入口 `./registry` 的名单在 §86 与 `scripts/run-sdk-registry-transit-test.mjs` A / C 段)。
128
+ > 全集真源 = `scripts/public-export-baseline.json` 的 `names`(**1307** 项;该基线只覆盖**根**入口,子路径入口 `./registry` 的名单在 §86 与 `scripts/run-sdk-registry-transit-test.mjs` A / C 段)。
129
129
  > 本节**不逐名抄**,只给「域 → 承重导出 → 用途 → 实现锚」。承重导出 = 一个端为了让这个域干活
130
130
  > **必须**直接调到的那几个符号;其余是它们的类型、变体与辅助位。
131
131
  > 两个入口:根 `import { … } from '@sema-agent/client-core'`(会话运行时;`exports` 的 `.`)+ `import { … } from '@sema-agent/client-core/registry'`(云控制面原样转口,0.79.1 起;`exports` 的 `./registry`,§86);
@@ -149,36 +149,49 @@ SDK 核对「本包 import 的每个值级符号仍然导出」「`TaskStats.cos
149
149
  `WorkflowsGateUnknownDenial` 四形**不在**基线里,`src/selfOrchestrationDenial.ts` 对基线贡献
150
150
  **4** 项运行期导出(三个函数 + `SELF_ORCHESTRATION_RETRY_WITHOUT`)。
151
151
 
152
- 1260 项的内部构成(帮助端估读表大小;0.84.0 +8 函数 −7 常量 −19 函数(CC-194 B 半登记读数五口 / CC-185 读目录授权结论通告读口 / CC-206 `hands` 段读口与措辞两口;CC-223 收回 0.71.3 预告的 26 个 `export *` 放大件,🔧 0.84.0 退出公面,逐名见 CHANGELOG 0.84.0);0.83.5 +1 函数(CC-204 字符面标记位置读口 `displayUntrustedMarks`);0.83.4 +4 函数(CC-205 `<system-reminder>` 剥离 / 解包两口;CC-203 座位过境口;CC-201 清「用户关卡」记号口);0.83.2 +15 函数 +4 常量(CC-193 姿态放行谓词 / CC-195 强制词闭集 + 成员判据 + 读口 + 措辞 / CC-194 缺席行判定 11 函数 + 3 常量);0.83.1 +10 函数 +6 常量(CC-112 展示层安全出口 `displayUntrusted` / CC-117 会话规则记录无损判定 + 措辞单源 + 五词成因闭集 / CC-174 插件 hook 每轮计划 + 查询口 + 事件判定口 + 四只措辞口 + 五张闭集);0.83.0 −3 函数(联网搜索旧三读口 `webSearchFromEnv` / `webSearchFromSettings` / `resolveWebSearch` 🔧 0.83.0 退出公面)+1 函数(CC-175 `terminalReasonForResult`);0.82.7 +5 函数(CC-182 每请求联网搜索配置三态判决:段判决 / env 判决 / 两车道合成 / 措辞单源 / endpoint 显示形);0.82.5 +5 函数 +1 常量(CC-169 print 车道 init 帧工具面:流包装器 / 判定闸 / 名册信号分类口 / 判定口 / 留痕措辞单源 + 等待上界常量);0.82.2 +1 函数(CC-164 云控制面有效配置回体措辞单源 `cloudEffectiveNotices`);0.82.1 +15 函数(CC-154 续跑折叠码读口 + 措辞 / CC-163 文件历史捕获读口六口 / CC-151 模型身份可解析判据五口 / CC-161 自定义代理载荷作废重投口 / 决断失败码「门还在」判定;测试钩 +1);0.82.0 +17 函数 +1 常量(CC-146 `/rewind` 代码档与对话档可用性读口投影 + 三口读账 + 两只判据 + 三句措辞 / CC-150 额度投影三口 / CC-152 装配期无手两口 / CC-154 取码单源 + 折叠码常量 / CC-156 坏档行坐标读口 + 措辞);0.80.0 +1 常量 +10 函数(CC-133 结算词表镜像 `SETTLEMENT_KIND_WORDS` + 五函数 / CC-134 三函数 / CC-132 两函数);0.79.0 +8 常量 +21 函数 +1 类(CC-74 MCP 状态面两张词表 + 九函数 / CC-110 `approvalIsMandated` + `mandatedApprovalDetail` / CC-116 · 118 · 123 `APPROVER_POSTURE_BYPASS` + `REQUEST_LANES` + 三函数 / CC-125 拒因两面四常量 `HITL_POLICY_DENY_MESSAGE` `APPROVAL_DENY_SETTLED_BY_WORDS` `SEMA_DENIAL_KIND_KEY` `CC_TOOL_DENIAL_KINDS` + 四函数 / CC-128 会话 bundle 面转口 `pushSessionBundle` `pullSessionBundle` `importSessionBundle` + 错误类 `APIError`;测试钩 +1);0.78.1 +2 常量 +9 函数(CC-113 displayBody / CC-97 b 五动词 + 判官 + 覆盖面判词 / CC-121 readSubmitWiringManifest);0.77.0 +2 常量 +2 函数(CC-101)+ 5 常量 +12 函数(CC-105 / CC-103;测试钩 +1);0.76.1 +1 常量 +4 函数(CC-36)+ 13 函数(CC-102;测试钩 +2)+ 1 常量 +20 函数(CC-97a;测试钩 +2)+ 2 函数(身份快照助手上公面);0.76.0 +8 常量 +8 函数(CC-77 ① 2+4 / CC-96 6+4);0.74.5 +2 常量 +2 函数(CC-87 / CC-88);0.74.3 +2 常量 +7 函数(CC-70 / CC-71 / CC-72 / CC-73 / CC-80;测试钩 +1);0.74.2 +6 函数(CC-69;测试钩 +1);0.74.1 +1 常量(CC-67);0.74.0 +1 函数(CC-66);0.73.5 +8 常量 +3 函数(CC-58);0.73.4 +1 常量(CC-34);0.73.3 +6 函数(CC-61;测试钩 +1);0.73.1 +2 常量 +5 函数(CC-56 / CC-57;测试钩 +1);0.72.14 +1 常量 +7 函数(CC-55);0.72.13 +4 常量 +14 函数(CC-46 / CC-54 / CC-53 / CC-50 缺席口);0.72.12 +2 常量 +2 函数(CC-50);0.72.10 +2 常量 +2 函数(CC-41);0.72.9 +2 常量 +6 函数(CC-30 / CC-39②);0.72.8 +2 常量 +4 函数(CC-39③ / CC-43);0.72.7 +1 常量 +1 函数(CC-42);0.72.6 +1 函数(CC-40);0.72.5 +1 常量 +5 函数(CC-31);0.72.3 +1 常量(CC-39①);0.72.2 +1 函数(CC-37);0.72.1 +1 常量 +3 函数(CC-33);0.72.0 −23 常量 −16 函数(CC-32 退役批);0.71.3 +4 常量 +5 函数(CC-06);0.71.0 −2 常量 `MAX_AGENT_SKILLS` / `DECIDE_WORKFLOW_HOST_NOT_PARKED` +2 函数 `projectToolRosterDelta` / `mcpEngineLegPresence`;0.70.0 起 +1 函数;0.69.2 起 +3:常量 1 / 函数 2):**344** 项是 `SCREAMING_SNAKE` 常量数据表/词汇表
152
+ 1307 项的内部构成(帮助端估读表大小;0.85.0 +26 函数 +9 常量 −2 函数 −1 常量(CC-241 plan-review 决断台账六口;CC-246 会话后台任务停止口 + 受据归类口 + 三态闭集;CC-217 / CC-243 服务端 7.104.0 会话侧:存档读不出三载体读口 + 判定 + 人话 + 码常量、跳过记录通告读器 + 补句、删会话 409 读口 + 措辞 + 码常量、停驻挪动族读口 + 措辞 + 判定 + 闭集 + 三码常量;CC-243 能力 / 同步体侧:公钥发现四口、文件历史请求词片段口 + 常量、粗码识别表 + 判定;CC-221 三个运行期名字退出公面,逐名见 §2z);0.84.1 +11 函数 +4 常量(CC-210 开标签定位口 / CC-219 detach 400 纯判定 / CC-213 服务端自铸码受众表 + 事实读器 / CC-214 按码派发口 + 派发表 / CC-225 停泊决断 422 读口 + 措辞 + 码优先判定 + 码常量 / CC-229 撤销动词 + 措辞 + 出路句 + 判据本体 + 码常量);0.84.0 +8 函数 −7 常量 −19 函数(CC-194 B 半登记读数五口 / CC-185 读目录授权结论通告读口 / CC-206 `hands` 段读口与措辞两口;CC-223 收回 0.71.3 预告的 26 个 `export *` 放大件,🔧 0.84.0 退出公面,逐名见 CHANGELOG 0.84.0);0.83.5 +1 函数(CC-204 字符面标记位置读口 `displayUntrustedMarks`);0.83.4 +4 函数(CC-205 `<system-reminder>` 剥离 / 解包两口;CC-203 座位过境口;CC-201 清「用户关卡」记号口);0.83.2 +15 函数 +4 常量(CC-193 姿态放行谓词 / CC-195 强制词闭集 + 成员判据 + 读口 + 措辞 / CC-194 缺席行判定 11 函数 + 3 常量);0.83.1 +10 函数 +6 常量(CC-112 展示层安全出口 `displayUntrusted` / CC-117 会话规则记录无损判定 + 措辞单源 + 五词成因闭集 / CC-174 插件 hook 每轮计划 + 查询口 + 事件判定口 + 四只措辞口 + 五张闭集);0.83.0 −3 函数(联网搜索旧三读口 `webSearchFromEnv` / `webSearchFromSettings` / `resolveWebSearch` 🔧 0.83.0 退出公面)+1 函数(CC-175 `terminalReasonForResult`);0.82.7 +5 函数(CC-182 每请求联网搜索配置三态判决:段判决 / env 判决 / 两车道合成 / 措辞单源 / endpoint 显示形);0.82.5 +5 函数 +1 常量(CC-169 print 车道 init 帧工具面:流包装器 / 判定闸 / 名册信号分类口 / 判定口 / 留痕措辞单源 + 等待上界常量);0.82.2 +1 函数(CC-164 云控制面有效配置回体措辞单源 `cloudEffectiveNotices`);0.82.1 +15 函数(CC-154 续跑折叠码读口 + 措辞 / CC-163 文件历史捕获读口六口 / CC-151 模型身份可解析判据五口 / CC-161 自定义代理载荷作废重投口 / 决断失败码「门还在」判定;测试钩 +1);0.82.0 +17 函数 +1 常量(CC-146 `/rewind` 代码档与对话档可用性读口投影 + 三口读账 + 两只判据 + 三句措辞 / CC-150 额度投影三口 / CC-152 装配期无手两口 / CC-154 取码单源 + 折叠码常量 / CC-156 坏档行坐标读口 + 措辞);0.80.0 +1 常量 +10 函数(CC-133 结算词表镜像 `SETTLEMENT_KIND_WORDS` + 五函数 / CC-134 三函数 / CC-132 两函数);0.79.0 +8 常量 +21 函数 +1 类(CC-74 MCP 状态面两张词表 + 九函数 / CC-110 `approvalIsMandated` + `mandatedApprovalDetail` / CC-116 · 118 · 123 `APPROVER_POSTURE_BYPASS` + `REQUEST_LANES` + 三函数 / CC-125 拒因两面四常量 `HITL_POLICY_DENY_MESSAGE` `APPROVAL_DENY_SETTLED_BY_WORDS` `SEMA_DENIAL_KIND_KEY` `CC_TOOL_DENIAL_KINDS` + 四函数 / CC-128 会话 bundle 面转口 `pushSessionBundle` `pullSessionBundle` `importSessionBundle` + 错误类 `APIError`;测试钩 +1);0.78.1 +2 常量 +9 函数(CC-113 displayBody / CC-97 b 五动词 + 判官 + 覆盖面判词 / CC-121 readSubmitWiringManifest);0.77.0 +2 常量 +2 函数(CC-101)+ 5 常量 +12 函数(CC-105 / CC-103;测试钩 +1);0.76.1 +1 常量 +4 函数(CC-36)+ 13 函数(CC-102;测试钩 +2)+ 1 常量 +20 函数(CC-97a;测试钩 +2)+ 2 函数(身份快照助手上公面);0.76.0 +8 常量 +8 函数(CC-77 ① 2+4 / CC-96 6+4);0.74.5 +2 常量 +2 函数(CC-87 / CC-88);0.74.3 +2 常量 +7 函数(CC-70 / CC-71 / CC-72 / CC-73 / CC-80;测试钩 +1);0.74.2 +6 函数(CC-69;测试钩 +1);0.74.1 +1 常量(CC-67);0.74.0 +1 函数(CC-66);0.73.5 +8 常量 +3 函数(CC-58);0.73.4 +1 常量(CC-34);0.73.3 +6 函数(CC-61;测试钩 +1);0.73.1 +2 常量 +5 函数(CC-56 / CC-57;测试钩 +1);0.72.14 +1 常量 +7 函数(CC-55);0.72.13 +4 常量 +14 函数(CC-46 / CC-54 / CC-53 / CC-50 缺席口);0.72.12 +2 常量 +2 函数(CC-50);0.72.10 +2 常量 +2 函数(CC-41);0.72.9 +2 常量 +6 函数(CC-30 / CC-39②);0.72.8 +2 常量 +4 函数(CC-39③ / CC-43);0.72.7 +1 常量 +1 函数(CC-42);0.72.6 +1 函数(CC-40);0.72.5 +1 常量 +5 函数(CC-31);0.72.3 +1 常量(CC-39①);0.72.2 +1 函数(CC-37);0.72.1 +1 常量 +3 函数(CC-33);0.72.0 −23 常量 −16 函数(CC-32 退役批);0.71.3 +4 常量 +5 函数(CC-06);0.71.0 −2 常量 `MAX_AGENT_SKILLS` / `DECIDE_WORKFLOW_HOST_NOT_PARKED` +2 函数 `projectToolRosterDelta` / `mcpEngineLegPresence`;0.70.0 起 +1 函数;0.69.2 起 +3:常量 1 / 函数 2):**356** 项是 `SCREAMING_SNAKE` 常量数据表/词汇表
153
153
  (矩阵、键集、env 名、锚串)而非可调用物;**7** 项是 PascalCase 运行期值
154
154
  (`ControlRouter` / `ControlSafetyError` / `HitlBridge` / `HitlSafetyError` / `DecideTransportRetryExhaustedError` / `APIError`);
155
155
  **34** 项是 `*For(sessionKey, …)` 的 per-session 变体(0.84.0 −3:`notePlanReviewAnsweredFor` / `planReviewArmedKeyFor` / `waitForGateArmedFor` 🔧 0.84.0 退出公面;0.72.0 −4:`clearArmedGateFor` / `onGateArmedFor` / `registerArmedGateFromQuestionIdFor` / `notePlanReviewAnsweredIfDecisiveFor` 退出公面)(§6;其中 `engineNamespaceKeyFor` 是命名巧合 —— 参数是 baseUrl 不是 sessionKey,见域 14)。
156
156
 
157
- ### 2b. 域图(16 域,逐域计数之和 = 1260)
157
+ ### 2b. 域图(16 域,逐域计数之和 = 1307)
158
158
 
159
159
  | # | 域 | 名数 | 承重导出 | 用途 | 实现锚 |
160
160
  |---|---|---|---|---|---|
161
- | 1 | **适配内核(下行主链)** | 69 | `handsSeamReadingOf` / `handsSeamDetail`(0.84.0 CC-206:接线回执 `hands` 段三态读口 + 措辞单源,「没有自带工具」那一句与 `handsMountedDetail` 同句首句尾,两者不是同一个事实;§107)· `terminalReasonForResult`(0.83.0 CC-175:结果帧 CC 键 `terminal_reason` 的读口,与铸点同一只判据,给端自拼的结果帧与旧转录;§100)· `handsMountedFromManifest` / `handsMountedDetail`(0.82.0 CC-152:装配期「这一 run 有没有手」三态判据 + 措辞单源,读 `wiring_manifest` 名册的 `mountedBy`;§92)· `readSubmitWiringManifest`(0.78.1 CC-121:非流式提交 200 体 `TaskResult.wiringManifest` 的三态读口,view 与流式腿 chrome 臂同一张;§83)· `TOOL_INPUT_JOIN_MAX_CALLS`(0.73.4 CC-34:终帧拒绝清单第三键的本流快照上限;§66)· `OUTCOME_UNKNOWN_ROW_PREFIX` / `isOutcomeUnknownRowText`(0.72.12 CC-50:第三条中性终局行「结局不知道」,读结果帧 `_sema_outcome`;§59)· `MODEL_OUTPUT_ERROR_PREFIX` / `isModelOutputErrorText` / `isModelOutputErrorRowText`(0.72.8 CC-43:runStream 第二条中性臂 —— core malformed tool-call 一族的行身份;§55)· `readEffectiveReasoning` · `readEffectiveMemoryScopes`(0.71.3 CC-06:终帧 `_sema_effective_reasoning` / `_sema_effective_memory_scopes` 的窄读器,§45)· `isSubFlowSegmentEnd` · `SEGMENT_END_IDENTITY_KEYS` · `droppedWhySentence`(0.69.2 CC-13:三件出公面,§38)· `adapt` · `createWireToCcAdapter` · `runStream` · `eventToSdkMessage` · `terminalToSdkResult` · `SEMA_SEGMENT_ID_KEY`(0.68.2 CC-01:committed assistant 文本行顶层段身份键的唯一字面量出处,壳只读)· `projectMcpSection`(0.68.2 CC-03:`wiring_manifest.mcp[]` 与 `/mcp` 面板 `lastLegMcp.mcp[]` 共用的同一只条目读器)· `readRunCostFacts`(0.66.0:终局成本事实的**唯一读器** —— `TaskStats.costBreakdown` / `nested` 逐键窄读 + 对账三段(own/nested/compaction)与两个「没定价」判别位;终帧的两个超集键与 chrome 臂 `run_cost_reconciled` **共用它**,两面不会各算各的,详见 §31c)· `TERMINAL_CAUSE_KINDS`/`isTerminalCauseKind`(0.68.0 / L-247:**core 终局因由**闭集,四词 `completed|failed|blocked|paused`)· `RUN_TERMINAL_NOT_SUCCESS_STATUSES`/`isTerminalNotSuccess`/`RUN_TERMINAL_STATUSES`/`isTerminalStatus`(L-215② 终局词汇的**单铸谓词**,0.68.0 随 L-247 **两表分源**更名 —— `killed` 属 server run 行状态面、`paused` 属 core 因由面,合成一张会让两边加词时都读不出该改哪儿;`blocked` 是 agent 自报终态,`suspended`/`needs_review` 刻意不在表里,详见 §33b / §30j)· `SEMA_SUBAGENT_USAGE_PARTIAL_KEY`/`subagentUsageIsPartial`(0.68.0 / L-244:子代用量下界位的**自有名**与唯一判据,与终帧 `_sema_usage_lower_bound` 分名,详见 §33g) · `turnUsageToModelUsage` · `isRunStreamActive` · `ADAPTER_DIVERGENCES` · `readRunTerminal` / `runTerminalCode` / `runTerminalGateKind` / `runTerminalGateToolName` / `isReviewPark` / `REVIEW_PARK_GATE_KINDS`(0.60.0 / engine ≥7.64.0:一次 run **怎么结束的**唯一读器 —— 终局从八个平面键换成一条带标因由 `terminal`,四臂 + `unknown` 防御臂 + `plane` 两代字节标;🔴 不认识的终态词绝不折成成功、本包不提供「因由→五词 status」的兼容投影,详见 §24b)| 引擎 SSE `AgentEvent` → 端要渲的**双面输出**:transcript(`SDKMessage`)+ chrome(瞬态 `ChromeEvent`)。**本包存在的理由** | `src/adapt.ts`、`src/adapt/{arms,wireShapes,panelTasks}.ts`(经 `adapt.ts` 再导出)、`src/adapter/runStream.ts`、`src/adapter/downstream/*`、`src/adapter/types.ts`、`src/runTerminal.ts` |
161
+ | 1 | **适配内核(下行主链)** | 68 | `handsSeamReadingOf` / `handsSeamDetail`(0.84.0 CC-206:接线回执 `hands` 段三态读口 + 措辞单源,「没有自带工具」那一句与 `handsMountedDetail` 同句首句尾,两者不是同一个事实;§107)· `terminalReasonForResult`(0.83.0 CC-175:结果帧 CC 键 `terminal_reason` 的读口,与铸点同一只判据,给端自拼的结果帧与旧转录;§100)· `handsMountedFromManifest` / `handsMountedDetail`(0.82.0 CC-152:装配期「这一 run 有没有手」三态判据 + 措辞单源,读 `wiring_manifest` 名册的 `mountedBy`;§92)· `readSubmitWiringManifest`(0.78.1 CC-121:非流式提交 200 体 `TaskResult.wiringManifest` 的三态读口,view 与流式腿 chrome 臂同一张;§83)· `TOOL_INPUT_JOIN_MAX_CALLS`(0.73.4 CC-34:终帧拒绝清单第三键的本流快照上限;§66)· `OUTCOME_UNKNOWN_ROW_PREFIX` / `isOutcomeUnknownRowText`(0.72.12 CC-50:第三条中性终局行「结局不知道」,读结果帧 `_sema_outcome`;§59)· `MODEL_OUTPUT_ERROR_PREFIX` / `isModelOutputErrorText` / `isModelOutputErrorRowText`(0.72.8 CC-43:runStream 第二条中性臂 —— core malformed tool-call 一族的行身份;§55)· `readEffectiveReasoning` · `readEffectiveMemoryScopes`(0.71.3 CC-06:终帧 `_sema_effective_reasoning` / `_sema_effective_memory_scopes` 的窄读器,§45)· `isSubFlowSegmentEnd` · `SEGMENT_END_IDENTITY_KEYS` · `droppedWhySentence`(0.69.2 CC-13:三件出公面,§38)· `adapt` · `createWireToCcAdapter` · `runStream` · `eventToSdkMessage` · `terminalToSdkResult` · `SEMA_SEGMENT_ID_KEY`(0.68.2 CC-01:committed assistant 文本行顶层段身份键的唯一字面量出处,壳只读)· `projectMcpSection`(0.68.2 CC-03:`wiring_manifest.mcp[]` 与 `/mcp` 面板 `lastLegMcp.mcp[]` 共用的同一只条目读器)· `readRunCostFacts`(0.66.0:终局成本事实的**唯一读器** —— `TaskStats.costBreakdown` / `nested` 逐键窄读 + 对账三段(own/nested/compaction)与两个「没定价」判别位;终帧的两个超集键与 chrome 臂 `run_cost_reconciled` **共用它**,两面不会各算各的,详见 §31c)· `TERMINAL_CAUSE_KINDS`/`isTerminalCauseKind`(0.68.0 / L-247:**core 终局因由**闭集,四词 `completed|failed|blocked|paused`)· `RUN_TERMINAL_NOT_SUCCESS_STATUSES`/`isTerminalNotSuccess`/`RUN_TERMINAL_STATUSES`/`isTerminalStatus`(L-215② 终局词汇的**单铸谓词**,0.68.0 随 L-247 **两表分源**更名 —— `killed` 属 server run 行状态面、`paused` 属 core 因由面,合成一张会让两边加词时都读不出该改哪儿;`blocked` 是 agent 自报终态,`suspended`/`needs_review` 刻意不在表里,详见 §33b / §30j)· `SEMA_SUBAGENT_USAGE_PARTIAL_KEY`/`subagentUsageIsPartial`(0.68.0 / L-244:子代用量下界位的**自有名**与唯一判据,与终帧 `_sema_usage_lower_bound` 分名,详见 §33g) · `turnUsageToModelUsage` · `isRunStreamActive` · `ADAPTER_DIVERGENCES` · `readRunTerminal` / `runTerminalCode` / `runTerminalGateKind` / `runTerminalGateToolName` / `isReviewPark` / `REVIEW_PARK_GATE_KINDS`(0.60.0 / engine ≥7.64.0:一次 run **怎么结束的**唯一读器 —— 终局从八个平面键换成一条带标因由 `terminal`,四臂 + `unknown` 防御臂 + `plane` 两代字节标;🔴 不认识的终态词绝不折成成功、本包不提供「因由→五词 status」的兼容投影,详见 §24b)| 引擎 SSE `AgentEvent` → 端要渲的**双面输出**:transcript(`SDKMessage`)+ chrome(瞬态 `ChromeEvent`)。**本包存在的理由** | `src/adapt.ts`、`src/adapt/{arms,wireShapes,panelTasks}.ts`(经 `adapt.ts` 再导出)、`src/adapter/runStream.ts`、`src/adapter/downstream/*`、`src/adapter/types.ts`、`src/runTerminal.ts` |
162
162
  | 2 | **seam 公共契约** | 4(其余为 type-only) | `CHROME_ARMS` · `deriveTranscriptId` · `snapshotSegmentIdentity` / `snapshotIsSubFlow`(0.76.1:身份四键一次性快照助手,投影口与 adapt 侧全部臂的唯一身份读点;§77)| 公共词汇 + **id 确定性不变量**(同一条流重放 ⇒ 同一串 id)。`CHROME_ARMS` = 端「我要消费哪些 chrome 臂」的对照清单 | `src/seam.ts` |
163
- | 3 | **HITL 决断卡链**(§4/§5 主战场) | 210 | `toolPermissionRequestAskBits` / `clearPlanReviewUserDismissals`(0.83.4 CC-203 / CC-201:卡请求 → 座位请求的四位过境口,与卡请求同一把窄读;会话换代时清「用户关卡」记号;§104)· `askSurvivesPosture` / `readApprovalMandate`(0.83.2 CC-193 / CC-195:常驻姿态下「这一张卡能不能由姿态答掉」三态谓词;卡上强制词读口,缺席答缺席;§102)· `sessionPolicyDeliverable` / `sessionPolicyWithheldNotice` / `SESSION_POLICY_WITHHELD_WHY`(0.83.1 CC-117:一批规则串能不能无损写进会话规则记录 —— 整批可送才送、五词成因闭集、每词一句措辞单源;宿主侧那一份的继任;§101)· `isPolicyRefusedGate` / `denyAttributionRefusalFromError` / `denyAttributionRefusalContent` / `removalConsequenceLineForBehavior` / `ruleRemovalBehaviorOf`(0.80.0 CC-133 · CC-132:策略拒谓词 + 归因键三码读口与人话 + 删除规则后果句铸点与闭集读口;§87)· `HITL_POLICY_DENY_MESSAGE` / `APPROVAL_DENY_SETTLED_BY_WORDS` / `readApprovalDenySettledBy` / `SEMA_DENIAL_KIND_KEY`(0.79.0 CC-125:deny 收口帧按 `settledBy` 分两串的冻结句、决断对象归因位的两词可达子集与只认自有数据属性的读器、分类词信封键名;§85)· `approvalIsMandated`(0.79.0 CC-110:审批卡「清不掉」判据口,帧位 ∨ 寄存行缺席词两条腿一个真源;§85)· `readSessionPolicy` / `tightenSessionPolicy` / `tightenedSessionRules` / `classifySessionPolicyFailure` / `sessionPolicyTightenNotice` / `SESSION_POLICY_RULE_FIELDS` / `SESSION_POLICY_TIGHTEN_UNKNOWN_WHY`(0.77.0 CC-105:会话策略窄读 + 收紧编排五臂判别联合)· `writePersistedRule` / `PERSISTED_RULE_WRITE_BEHAVIORS` / `PERSISTED_RULE_WRITE_REFUSAL_CAUSES` / `PERSISTED_RULE_WRITE_UNKNOWN_REASONS`(0.77.0 CC-103:持久规则单步写面,词表派生不手抄;§79)· `persistedRulesWriteAvailable`(0.76.1 CC-102:单步写入口便利口,只派生自写键自己的四态,不与撤销面那只合取;§77)· `approvalResolutionOf` / `isApprovalDecided` / `approvalNotSentCause` / `approvalUnsettledCause` / `APPROVAL_NOT_SENT_CAUSES` / `APPROVAL_UNSETTLED_CAUSES`(CC-77 ①:「一次审批决断最后怎么了」的单源判别联合 `decided` / `not_sent` / `unsettled`,两条腿的结局对象一次判别;既有结局型面一字不动)· `approvalOutcomeNoteOf` / `APPROVAL_NOTE_RETRACTED_DETAIL` / `APPROVAL_NOTE_EDIT_REFUSED_DETAIL`(0.74.5 CC-88:审批结局便签单源;§73)· `decideReceiptReopen` / `suspendedReopenOf`(0.74.3 CC-73:reopen 族第二臂;§71)· `RETRACTED_CARD_DECISION_KIND`(0.74.1 CC-67:卡口无决断收口;§69)· `planReviewOutcomeTail`(0.73.1 CC-57:outcome 尾句六态单铸点;投递口闩;§63)· `readLivePendingRows` / `suspendedSubagentAsks` / `countApprovalsAwaitingDecision` / `createSuspendedAskTracker` / `livePendingRowToApprovalFrame` / `surfaceSuspendedAskAndRespond` / `surfaceEditRefusedOnBlindAsk` + `EDIT_REFUSED_ON_BLIND_ASK_WARN_TEXT`(0.72.14 CC-55:悬挂的流内 ask 读面 / 视图 / 去重账 / 决断口;§61)· `planReviewCardOptions` / `planReviewChoiceFromAnswer` / `versionSupportsPlanReviewModeAfter` / `isPlanReviewModeAfter` + `PLAN_REVIEW_APPROVE_AUTO_LABEL` / `PLAN_REVIEW_APPROVE_MANUAL_LABEL` / `PLAN_REVIEW_MODE_AFTER_WORDS` / `PLAN_REVIEW_MODE_AFTER_MIN_ENGINE`(0.72.13 CC-46:plan_review 批准后模式 `permissionModeAfter` 发口与三选卡双闸;§60)· `makeHitlCanUseTool` · `HitlBridge` · `findPendingForTask` · `readDecideReceipt`/`decideAcceptedNotResolved`/`decideRefusalFromError`(B-070:`/decide` 200 = **投递受理**不是「门已解决」;`executionOutcome` 缺席 = 未知,详见 §30h) · `HitlSafetyError` · `bridgeAskUserQuestionGates` · `surfaceToolApprovalFrameAndRespond` / `surfaceFsApprovalAndDecide` · `readToolApprovalRespondAck` · `installApprovalCardPort(For)` · `installHitlHostSurface(For)` · `armPlanReviewApproval` · `reopenPlanReviewCard` · `decidePlanReview` · `startApprovalsFeed` · `pendingRowIsOwnedByThisSession` · `approvalCallKey`/`liveFrameCallKey`/`planReviewQuestionId` · `registerArmedGateFor`/`wasGateArmedFor` · `waitForGateArmed`/`onGateArmed`/`gateArmedWaitMs`(#244 F1 呈现回执事件源) · `planReviewArmedKey`/`notePlanReviewAnswered`/`notePlanReviewAnsweredIfDecisive`(A-024.4 plan 呈现分代;`waitForGateArmed` / `planReviewArmedKey` / `notePlanReviewAnswered` 三只的 `*For` 变体 0.84.0 退出公面) · `toolEndOutputText` · `waitForParkRowBirth` · `classifyAskParkRows` / `askParkRowArm` / `classifyAskParkChainFailure` · `readDecisionNoteAudit` / `decisionNoteAuditLine` · `resumeRunningOptions` / `resumeChoiceFromLabels` · `persistedRulesLaneAvailable`/`persistedRulesGovernanceAvailable` · `classifyRulesFailure` · `listAllPersistedRules` · `classifySkippedReason` · `readRulePersistOutcome`(#244 F2:persist-ack 读口与 `readToolApprovalRespondAck` 合成一处) · `parseLocalAllowRule`(durable 腿本地落规则窄化骨架,谓词经 `LocalAllowRuleDeps` 注入) · `readToolApprovalRespondRefusal`(#225 件5,0.42.0:respond 抛错的结构化原文读口 —— 三位各自防御读、各自缺席不铸、**三位皆缺席时整只返 `undefined`**;原样交还零加工,UNTRUSTED-for-display)· `installEditedRuleTextPrechecker` / `hasEditedRuleTextPrechecker` / `precheckEditedRuleText`([5076] 转出口,0.42.0:core 5.57.0 `precheckEditedRuleText` 的**端口注入形** —— 类型面 + 注入口 + 诚实缺席读口。🔴 **不是** value 级 re-export,理由见 §7 缺口 **P-34**;未装 ⇒ 返 `undefined`,绝不编一个 `{ok:true}`)· `RULE_NOT_SENT_WARN_TEXT` + `RULE_NOT_SENT_REJECTED_WARN_TEXT`(#334,0.43.0:人在卡上按下的「不再询问」被整条丢弃时的诚实告知(文案两句;发告知的两只函数 0.84.0 起是包内件)——**两条刻意分开**:前者=**引擎能力位未确认**(换台引擎/等探测就好),后者=**这次选择没过包内表核/互斥核**(表外文本/坏下标/两臂同场,换引擎也不会变) —— 编辑臂 `respondFreeFormRules` 与批臂 `respondBatchRuleOffers` 两条同形存量共用一条,与 `surfaceRememberNotApplied` 同族纪律:决断照送、只是规则没存,静默丢掉用户明确意图 = 让人以为功能坏了)· `projectCrashConverged`(L-38,0.49.0:`/v1/approvals` additive 键 `crashConverged` 的分桶投影 —— 崩溃收敛的孤儿审批读面,**缺席 ≠ 空数组**、分桶恰一个合取、坏行丢弃并计数,详见 §12;同批把 `ApprovalsResourceLike.list()` 的返回位 additive 放宽成 `ApprovalsListEnvelope`,老形 `{pending}` 仍可赋值)· `readRuleOffers` / `readRuleOfferSupply`(L-103/[C228],0.57.0 additive 导出:「不再询问」候选两代 wire 键的窄读器**公面化** —— 此前只经卡端口出包,不走卡端口架构的宿主只能自己重铸一把,而它承载的是兑付安全判据(原始下标不前移/逐条丢坏/闭集 kind/两代取舍序),详见 §20)· `RULE_OFFERS_ABSENCE_REASONS` / `DENIAL_LIMIT_KINDS`(0.59.0 / sdk 8.3.0 提货:`ruleOffersAbsence` 三词与 `denialLimitFallback.limit` 二词的**运行期**闭词表再导出 —— 与 0.58.0 那三张同一条纪律:端拿它做判定别再手抄字面量。⚠️ **本包自己不拿这两张表做窄读判定**(两处都按开集透传,词表属主是 core、server 已按闭集拒过),再导出只是给端的 `switch` 一份可数的表,端仍必须带 `default` 臂,详见 §23a)· `DecideTransportRetryExhaustedError`(Inkglow-1085 P0a:decide 出站瞬断重试耗尽的 typed 判别 —— HitlBridge 内建单次退避重试,耗尽走重呈臂不判死 turn;端一般只消费行为,不需要 instanceof) · `gateOutcomeOf` / `isDeniedGate` / `gateDeniedBy` / `gateApprover` / `isApprovalWindowExpiredGate` / `isDenialLimitAutoDeniedGate` / `isParkSlaExpiredGate` / `isHumanSettledGate`(0.60.0 / engine ≥7.64.0:`tool_end.gate` 整条门记录的窄读器 + 判定谓词 —— 取代退役的四个正交词 `settledBy`/`resolution`/`autoDenied`/`approver`。🔴 **判定归包**:「是不是审批窗自己走完的拒绝」旧形上是端各自拼的两键合取,而三条窗词现在分得开、合并读回去等于把刚修好的判别力扔掉;⚠️ 公面型一律带 `View` 后缀 —— 本文件的 `GateOutcome`(决断腿结局)与 sdk 的 `GateOutcome`(引擎门记录)**同名不同义**,详见 §24c)· `isGateParkedToolEnd`(「这次调用没在这里结算」的**第二形**谓词:gate 缺席 + `errorCode:"gate.parked"`;端判这件事必须与 `isApprovalWindowExpiredGate` **两形合读**) · `readWireErrorCode`(B-037 候包件②:decide/取件失败上引擎 wire 机器码的单源读口,结构视图读不 `instanceof`;与本包铸的 `code` 是两个命名空间,详见 §24g)| suspended→decide→resume 环。🔴 **D-1 两元组 verbatim 回显**是字节级断言的安全不变量,端**不许重实现它的任何一段**。🔴 键空间边界(web [C1] d3 拦截):`gateIdentity` 四常量两函数只覆盖 HITL questionId/callKey 空间;seat 的 `TOOL_PERMISSION_REQUEST_ID_DOMAINS`(`plan:` 等)是另一键空间,**两者绝不合并**(合并=座位校验器静默拒全部 plan-review 卡) | `src/hitl/hitlBridge.ts`、`toolApprovalWire.ts`、`askGateWire.ts`、`planReviewWire.ts`、`hitlHostSurface.ts`、`gateIdentity.ts`、`armedGateRegistry.ts`、`parkOwnership.ts`、`parkResolver.ts`、`approvalsFeed.ts`、`frameRouter.ts`(**只挑名导出** `toolEndOutputText`/`ENGINE_ABORT_TOOL_RESULT`/`HITL_REJECT_MESSAGE`/`HITL_INTERRUPT_MESSAGE_FOR_TOOL_USE`)、`parkRowBirthWait.ts`、`approvalDecisionNoteAudit.ts`、`askParkRowRouting.ts`、`resumeRunningCard.ts`(#265 上收的判定层)、`persistedRulesWire.ts`、`localAllowRule.ts`(#244 F2 规则侧)、`crashConverged.ts`(L-38 崩溃收敛读面)、`sessionPolicyDeliverable.ts`(0.83.1 CC-117 会话规则无损判定)、`askSurvivesPosture.ts`(0.83.2 CC-193 姿态放行谓词)、`src/gateOutcome.ts` |
164
- | 4 | **子代 wire + 面板侧信道台账** | 107 | `readEngineAgentRegistry` / `isEngineAgentRegistryListingSuperseded` / `engineAgentRegistryReadingOf` / `engineAgentRegistryKeyOf` / `engineAgentRegistryRowsMissingFromHost`(0.84.0 CC-194 B 半:后台代理登记读口 + 取代判定 + 归类口 + 登记键桥 + 补行谓词,宿主据此给缺席行回收入参的 `registry` 位填真读数;§107)· `isEngineAgentAbsentRow` / `engineAgentAbsenceMarkOf` / `engineAgentAbsenceClockStopMs` / `engineAgentPanelEventClearsAbsence` / `engineAgentRowCountsAsRunning` / `tallyEngineAgentRows` / `engineAgentTurnSweepSettles` / `reapEngineAgentAbsentRows` / `engineAgentAbsenceTtlDueAtMs` / `engineAgentAbsenceDroppedLine` / `engineAgentTerminalAfterDropLine` + `ENGINE_AGENT_ABSENT_ROW_TEXT` / `ENGINE_AGENT_ABSENCE_TTL_MS` / `ENGINE_AGENT_REGISTRY_READINGS`(0.83.2 CC-194:后台子代缺席行的判定 / 计数 / sweep 豁免 / 回收 / 措辞单源,回收只在后台代理登记确认离场时;§102)· `isNewEngineAgentPanelCycle`(0.74.5 CC-87:新周期单源判据;§73)· `resolveEnginePanelTaskId` / `MAX_HELD_WIRE_TICK_BEATS` / `clearEnginePanelTaskResidentByWire`(0.74.3 CC-70:子代身份归一读口、缓一拍节拍上限、按 wire id 清常驻标(前代终态不清当代);§71)· `isStaleEngineAgentPanelEnd`(0.74.0 CC-66:面板 end 的周期身份判据;§68)· `subscribeEngineAgentPanelAbsence` / `publishEngineAgentPanelAbsence`(0.72.13:fleet 行缺席上报的**独立订阅口** —— 不上主通道,老消费者结构上收不到;§60 S-5)· `tailEngineSubagent` · `installSubagentActivitySink` · `installSubagentTailMetaSink`(#280 件2:tail meta 帧发布口,`contentFrames` 判别位载体)· `stopEngineTask` + `classifyTaskStopConflict` · `fetchEngineSubagentReport` · `steerEngineSubagent`(0.32.0 未发布 #280 件A:additive 第三参 `childTaskId` —— 端有行上下文时**应当**传,传了就走「台账优先 / 缺席即诚实缺席 + 缺席留痕」的 Q3 口径,与 tail·taskOutput·subagentOutput 三腿同姿势、与孪生 resume 腿共用同一个 `resolveOwnerRunId` 判据;**不传**则逐字维持旧行为=回落在飞 run)· `resumeSettledSubagent` + `resolveSubagentResumeContext` + `resolveOwnerRunId` + `classifySubagentResumeFailure` + `subagentResumeAvailable`(#242 批 2 A-028.7:resume 判定半场上收,与 steer 孪生同居;取址三态 = 台账有行用行值 / 指名了行但台账缺席则**诚实缺席绝不回落在飞 run** / 没指名行才回落。出路文案归端)· `recordSubagentOwnerFromProgress` + `getBgParentRunOwner`(A-028.6:「子代 → 宿主 run」**单表**,宿主 run 必须由持 stream-local 值的调用方显式传入,包内绝不从 `activeEngineRunId()` 推断)· `auditRetainWithoutWake`([4000] Q5:引擎宣示 `subagentResume` + 本端在付 `retainSubagentSessions` + 端未实现 `wakeSubagent` ⇒ 响亮一条;`CLIENT_VERBS.wakeSubagent` 维持 fail-soft)· `subscribeSubagentContent` · `subscribeEngineAgentPanel` · `publishQuestionFrame` / `respondToQuestion` · `configureSubagentContentStore` / `subagentContentStoreConfig` / `SUBAGENT_CONTENT_STORE_DEFAULTS`(0.62.0:子代内容账本的**字节预算** —— 此前只有条数帽而单条无上限,一条 base64 工具结果就能让一个子代槽吃到十几 MB;越限从最早的内容开始丢并留一条可渲染的 `truncated` 记录,总帽淘汰整条最久未用的账本。配置面 fail-loud,详见 §26②)| 驱动与观测委派子代;经 module 级台账喂活体 agent/task 面板。全部**能力位 gate**(§5b) | `src/subagent/*.ts`、`src/subagentContentStore.ts`、`src/engineAgentPanelStore.ts`、`src/engineAgentAbsence.ts`(0.83.2 CC-194 缺席行判定与措辞)、`src/agentSession/engineAgentRegistryRead.ts`(0.84.0 CC-194 B 半登记读口)、`src/engineInlineTaskStats.ts`、`src/engineToolLabelStore.ts`、`src/liveQuestionStore.ts` |
163
+ | 3 | **HITL 决断卡链**(§4/§5 主战场) | 226 | `decideParkMovedFromError` / `decideParkMovedContent` / `isDecideParkMovedCode` / `DECIDE_PARK_MOVED_CODES` + `DECIDE_NOT_PARKED` / `DECIDE_GATE_MOVED` / `DECIDE_CLAIM_LOST`(0.85.0 CC-243:`/decide` 停驻挪动三码的读口、按码分说的一句与判定,四个决断出口补句、停泊腿按码续读流;`isCodeClassifiedGateFailure` 不收本族;§109)· `notePlanReviewDecisionHandedOver` / `planReviewPendingReadMark` / `planReviewDecisionInFlight` / `notePlanReviewDecisionNotApplied` / `notePlanReviewGateLeft` / `latestPlanReviewDecisionMark`(0.85.0 CC-241:plan-review 决断台账 —— 交出登记 + 读起点刻度 + 拒开判据 + 「没生效」与「离门」两只说一声的口 + 交出刻度;`reopenPlanReviewCard` 按它拒开;§109)· `isCodeClassifiedGateFailure`(0.84.1 CC-225:这枚决断失败码自己说清了处置、失败文字不许再按「门已决」词表扫 —— `isGateStandingErrorCode` 的两码 ∪ 422 `parked_resume.startup_failed`;§108)· `removeRefusedSessionRules` / `sessionPolicyRemovalNotice` / `isEngineRefusedToolName`(0.84.1 CC-229:会话规则记录里引擎会拒启的条目的窄撤销动词 + 八臂措辞单源 + 引擎准备期按名字拒启的判据本体,比 `sessionPolicyDeliverable` 的 `legacy_tool_name` 判词宽;撤销动词必交这台部署一跑的工具名册,名册里的名与别名不撤;§108)· `toolPermissionRequestAskBits` / `clearPlanReviewUserDismissals`(0.83.4 CC-203 / CC-201:卡请求 → 座位请求的四位过境口,与卡请求同一把窄读;会话换代时清「用户关卡」记号;§104)· `askSurvivesPosture` / `readApprovalMandate`(0.83.2 CC-193 / CC-195:常驻姿态下「这一张卡能不能由姿态答掉」三态谓词;卡上强制词读口,缺席答缺席;§102)· `sessionPolicyDeliverable` / `sessionPolicyWithheldNotice` / `SESSION_POLICY_WITHHELD_WHY`(0.83.1 CC-117:一批规则串能不能无损写进会话规则记录 —— 整批可送才送、五词成因闭集、每词一句措辞单源;宿主侧那一份的继任;§101)· `isPolicyRefusedGate` / `denyAttributionRefusalFromError` / `denyAttributionRefusalContent` / `removalConsequenceLineForBehavior` / `ruleRemovalBehaviorOf`(0.80.0 CC-133 · CC-132:策略拒谓词 + 归因键三码读口与人话 + 删除规则后果句铸点与闭集读口;§87)· `HITL_POLICY_DENY_MESSAGE` / `APPROVAL_DENY_SETTLED_BY_WORDS` / `readApprovalDenySettledBy` / `SEMA_DENIAL_KIND_KEY`(0.79.0 CC-125:deny 收口帧按 `settledBy` 分两串的冻结句、决断对象归因位的两词可达子集与只认自有数据属性的读器、分类词信封键名;§85)· `approvalIsMandated`(0.79.0 CC-110:审批卡「清不掉」判据口,帧位 ∨ 寄存行缺席词两条腿一个真源;§85)· `readSessionPolicy` / `tightenSessionPolicy` / `tightenedSessionRules` / `classifySessionPolicyFailure` / `sessionPolicyTightenNotice` / `SESSION_POLICY_RULE_FIELDS` / `SESSION_POLICY_TIGHTEN_UNKNOWN_WHY`(0.77.0 CC-105:会话策略窄读 + 收紧编排五臂判别联合)· `writePersistedRule` / `PERSISTED_RULE_WRITE_BEHAVIORS` / `PERSISTED_RULE_WRITE_REFUSAL_CAUSES` / `PERSISTED_RULE_WRITE_UNKNOWN_REASONS`(0.77.0 CC-103:持久规则单步写面,词表派生不手抄;§79)· `persistedRulesWriteAvailable`(0.76.1 CC-102:单步写入口便利口,只派生自写键自己的四态,不与撤销面那只合取;§77)· `approvalResolutionOf` / `isApprovalDecided` / `approvalNotSentCause` / `approvalUnsettledCause` / `APPROVAL_NOT_SENT_CAUSES` / `APPROVAL_UNSETTLED_CAUSES`(CC-77 ①:「一次审批决断最后怎么了」的单源判别联合 `decided` / `not_sent` / `unsettled`,两条腿的结局对象一次判别;既有结局型面一字不动)· `approvalOutcomeNoteOf` / `APPROVAL_NOTE_RETRACTED_DETAIL` / `APPROVAL_NOTE_EDIT_REFUSED_DETAIL`(0.74.5 CC-88:审批结局便签单源;§73)· `decideReceiptReopen` / `suspendedReopenOf`(0.74.3 CC-73:reopen 族第二臂;§71)· `RETRACTED_CARD_DECISION_KIND`(0.74.1 CC-67:卡口无决断收口;§69)· `planReviewOutcomeTail`(0.73.1 CC-57:outcome 尾句六态单铸点;投递口闩;§63)· `readLivePendingRows` / `suspendedSubagentAsks` / `countApprovalsAwaitingDecision` / `createSuspendedAskTracker` / `livePendingRowToApprovalFrame` / `surfaceSuspendedAskAndRespond` / `surfaceEditRefusedOnBlindAsk` + `EDIT_REFUSED_ON_BLIND_ASK_WARN_TEXT`(0.72.14 CC-55:悬挂的流内 ask 读面 / 视图 / 去重账 / 决断口;§61)· `planReviewCardOptions` / `planReviewChoiceFromAnswer` / `versionSupportsPlanReviewModeAfter` / `isPlanReviewModeAfter` + `PLAN_REVIEW_APPROVE_AUTO_LABEL` / `PLAN_REVIEW_APPROVE_MANUAL_LABEL` / `PLAN_REVIEW_MODE_AFTER_WORDS` / `PLAN_REVIEW_MODE_AFTER_MIN_ENGINE`(0.72.13 CC-46:plan_review 批准后模式 `permissionModeAfter` 发口与三选卡双闸;§60)· `makeHitlCanUseTool` · `HitlBridge` · `findPendingForTask` · `readDecideReceipt`/`decideAcceptedNotResolved`/`decideRefusalFromError`(B-070:`/decide` 200 = **投递受理**不是「门已解决」;`executionOutcome` 缺席 = 未知,详见 §30h) · `HitlSafetyError` · `bridgeAskUserQuestionGates` · `surfaceToolApprovalFrameAndRespond` / `surfaceFsApprovalAndDecide` · `readToolApprovalRespondAck` · `installApprovalCardPort(For)` · `installHitlHostSurface(For)` · `armPlanReviewApproval` · `reopenPlanReviewCard` · `decidePlanReview` · `startApprovalsFeed` · `pendingRowIsOwnedByThisSession` · `approvalCallKey`/`liveFrameCallKey`/`planReviewQuestionId` · `registerArmedGateFor`/`wasGateArmedFor` · `waitForGateArmed`/`onGateArmed`/`gateArmedWaitMs`(#244 F1 呈现回执事件源) · `planReviewArmedKey`/`notePlanReviewAnswered`/`notePlanReviewAnsweredIfDecisive`(A-024.4 plan 呈现分代;`waitForGateArmed` / `planReviewArmedKey` / `notePlanReviewAnswered` 三只的 `*For` 变体 0.84.0 退出公面) · `toolEndOutputText` · `waitForParkRowBirth` · `classifyAskParkRows` / `askParkRowArm` / `classifyAskParkChainFailure` · `readDecisionNoteAudit` / `decisionNoteAuditLine` · `resumeRunningOptions` / `resumeChoiceFromLabels` · `persistedRulesLaneAvailable`/`persistedRulesGovernanceAvailable` · `classifyRulesFailure` · `listAllPersistedRules` · `classifySkippedReason` · `readRulePersistOutcome`(#244 F2:persist-ack 读口与 `readToolApprovalRespondAck` 合成一处) · `parseLocalAllowRule`(durable 腿本地落规则窄化骨架,谓词经 `LocalAllowRuleDeps` 注入) · `readToolApprovalRespondRefusal`(#225 件5,0.42.0:respond 抛错的结构化原文读口 —— 三位各自防御读、各自缺席不铸、**三位皆缺席时整只返 `undefined`**;原样交还零加工,UNTRUSTED-for-display)· `installEditedRuleTextPrechecker` / `hasEditedRuleTextPrechecker` / `precheckEditedRuleText`([5076] 转出口,0.42.0:core 5.57.0 `precheckEditedRuleText` 的**端口注入形** —— 类型面 + 注入口 + 诚实缺席读口。🔴 **不是** value 级 re-export,理由见 §7 缺口 **P-34**;未装 ⇒ 返 `undefined`,绝不编一个 `{ok:true}`)· `RULE_NOT_SENT_WARN_TEXT` + `RULE_NOT_SENT_REJECTED_WARN_TEXT`(#334,0.43.0:人在卡上按下的「不再询问」被整条丢弃时的诚实告知(文案两句;发告知的两只函数 0.84.0 起是包内件)——**两条刻意分开**:前者=**引擎能力位未确认**(换台引擎/等探测就好),后者=**这次选择没过包内表核/互斥核**(表外文本/坏下标/两臂同场,换引擎也不会变) —— 编辑臂 `respondFreeFormRules` 与批臂 `respondBatchRuleOffers` 两条同形存量共用一条,与 `surfaceRememberNotApplied` 同族纪律:决断照送、只是规则没存,静默丢掉用户明确意图 = 让人以为功能坏了)· `projectCrashConverged`(L-38,0.49.0:`/v1/approvals` additive 键 `crashConverged` 的分桶投影 —— 崩溃收敛的孤儿审批读面,**缺席 ≠ 空数组**、分桶恰一个合取、坏行丢弃并计数,详见 §12;同批把 `ApprovalsResourceLike.list()` 的返回位 additive 放宽成 `ApprovalsListEnvelope`,老形 `{pending}` 仍可赋值)· `readRuleOffers` / `readRuleOfferSupply`(L-103/[C228],0.57.0 additive 导出:「不再询问」候选两代 wire 键的窄读器**公面化** —— 此前只经卡端口出包,不走卡端口架构的宿主只能自己重铸一把,而它承载的是兑付安全判据(原始下标不前移/逐条丢坏/闭集 kind/两代取舍序),详见 §20)· `RULE_OFFERS_ABSENCE_REASONS` / `DENIAL_LIMIT_KINDS`〔后者 🔧 0.85.0 退出公面,值改从 `@sema-agent/sdk` 根入口取〕(0.59.0 / sdk 8.3.0 提货:`ruleOffersAbsence` 三词与 `denialLimitFallback.limit` 二词的**运行期**闭词表再导出 —— 与 0.58.0 那三张同一条纪律:端拿它做判定别再手抄字面量。⚠️ **本包自己不拿这两张表做窄读判定**(两处都按开集透传,词表属主是 core、server 已按闭集拒过),再导出只是给端的 `switch` 一份可数的表,端仍必须带 `default` 臂,详见 §23a)· `DecideTransportRetryExhaustedError`(Inkglow-1085 P0a:decide 出站瞬断重试耗尽的 typed 判别 —— HitlBridge 内建单次退避重试,耗尽走重呈臂不判死 turn;端一般只消费行为,不需要 instanceof) · `gateOutcomeOf` / `isDeniedGate` / `gateDeniedBy` / `gateApprover` / `isApprovalWindowExpiredGate` / `isDenialLimitAutoDeniedGate` / `isParkSlaExpiredGate` / `isHumanSettledGate`(0.60.0 / engine ≥7.64.0:`tool_end.gate` 整条门记录的窄读器 + 判定谓词 —— 取代退役的四个正交词 `settledBy`/`resolution`/`autoDenied`/`approver`。🔴 **判定归包**:「是不是审批窗自己走完的拒绝」旧形上是端各自拼的两键合取,而三条窗词现在分得开、合并读回去等于把刚修好的判别力扔掉;⚠️ 公面型一律带 `View` 后缀 —— 本文件的 `GateOutcome`(决断腿结局)与 sdk 的 `GateOutcome`(引擎门记录)**同名不同义**,详见 §24c)· `isGateParkedToolEnd`(「这次调用没在这里结算」的**第二形**谓词:gate 缺席 + `errorCode:"gate.parked"`;端判这件事必须与 `isApprovalWindowExpiredGate` **两形合读**) · `readWireErrorCode`(B-037 候包件②:decide/取件失败上引擎 wire 机器码的单源读口,结构视图读不 `instanceof`;与本包铸的 `code` 是两个命名空间,详见 §24g)| suspended→decide→resume 环。🔴 **D-1 两元组 verbatim 回显**是字节级断言的安全不变量,端**不许重实现它的任何一段**。🔴 键空间边界(web [C1] d3 拦截):`gateIdentity` 四常量两函数只覆盖 HITL questionId/callKey 空间;seat 的 `TOOL_PERMISSION_REQUEST_ID_DOMAINS`(`plan:` 等)是另一键空间,**两者绝不合并**(合并=座位校验器静默拒全部 plan-review 卡) | `src/hitl/hitlBridge.ts`、`toolApprovalWire.ts`、`askGateWire.ts`、`planReviewWire.ts`、`hitlHostSurface.ts`、`gateIdentity.ts`、`armedGateRegistry.ts`、`parkOwnership.ts`、`parkResolver.ts`、`approvalsFeed.ts`、`frameRouter.ts`(**只挑名导出** `toolEndOutputText`/`ENGINE_ABORT_TOOL_RESULT`/`HITL_REJECT_MESSAGE`/`HITL_INTERRUPT_MESSAGE_FOR_TOOL_USE`)、`parkRowBirthWait.ts`、`approvalDecisionNoteAudit.ts`、`askParkRowRouting.ts`、`resumeRunningCard.ts`(#265 上收的判定层)、`persistedRulesWire.ts`、`localAllowRule.ts`(#244 F2 规则侧)、`crashConverged.ts`(L-38 崩溃收敛读面)、`sessionPolicyDeliverable.ts`(0.83.1 CC-117 会话规则无损判定)、`askSurvivesPosture.ts`(0.83.2 CC-193 姿态放行谓词)、`src/gateOutcome.ts` |
164
+ | 4 | **子代 wire + 面板侧信道台账** | 110 | `stopEngineSessionBackground` / `engineSessionBackgroundReceiptReadingOf` / `ENGINE_SESSION_BACKGROUND_RECEIPT_STATES`(0.85.0 CC-246:会话后台任务停止口 + 受据三态归类口与闭集镜像,三端公共转调与单源措辞;认不出的受据词一律归「可能仍在跑」;§109)· `readEngineAgentRegistry` / `isEngineAgentRegistryListingSuperseded` / `engineAgentRegistryReadingOf` / `engineAgentRegistryKeyOf` / `engineAgentRegistryRowsMissingFromHost`(0.84.0 CC-194 B 半:后台代理登记读口 + 取代判定 + 归类口 + 登记键桥 + 补行谓词,宿主据此给缺席行回收入参的 `registry` 位填真读数;§107)· `isEngineAgentAbsentRow` / `engineAgentAbsenceMarkOf` / `engineAgentAbsenceClockStopMs` / `engineAgentPanelEventClearsAbsence` / `engineAgentRowCountsAsRunning` / `tallyEngineAgentRows` / `engineAgentTurnSweepSettles` / `reapEngineAgentAbsentRows` / `engineAgentAbsenceTtlDueAtMs` / `engineAgentAbsenceDroppedLine` / `engineAgentTerminalAfterDropLine` + `ENGINE_AGENT_ABSENT_ROW_TEXT` / `ENGINE_AGENT_ABSENCE_TTL_MS` / `ENGINE_AGENT_REGISTRY_READINGS`(0.83.2 CC-194:后台子代缺席行的判定 / 计数 / sweep 豁免 / 回收 / 措辞单源,回收只在后台代理登记确认离场时;§102)· `isNewEngineAgentPanelCycle`(0.74.5 CC-87:新周期单源判据;§73)· `resolveEnginePanelTaskId` / `MAX_HELD_WIRE_TICK_BEATS` / `clearEnginePanelTaskResidentByWire`(0.74.3 CC-70:子代身份归一读口、缓一拍节拍上限、按 wire id 清常驻标(前代终态不清当代);§71)· `isStaleEngineAgentPanelEnd`(0.74.0 CC-66:面板 end 的周期身份判据;§68)· `subscribeEngineAgentPanelAbsence` / `publishEngineAgentPanelAbsence`(0.72.13:fleet 行缺席上报的**独立订阅口** —— 不上主通道,老消费者结构上收不到;§60 S-5)· `tailEngineSubagent` · `installSubagentActivitySink` · `installSubagentTailMetaSink`(#280 件2:tail meta 帧发布口,`contentFrames` 判别位载体)· `stopEngineTask` + `classifyTaskStopConflict` · `fetchEngineSubagentReport` · `steerEngineSubagent`(0.32.0 未发布 #280 件A:additive 第三参 `childTaskId` —— 端有行上下文时**应当**传,传了就走「台账优先 / 缺席即诚实缺席 + 缺席留痕」的 Q3 口径,与 tail·taskOutput·subagentOutput 三腿同姿势、与孪生 resume 腿共用同一个 `resolveOwnerRunId` 判据;**不传**则逐字维持旧行为=回落在飞 run)· `resumeSettledSubagent` + `resolveSubagentResumeContext` + `resolveOwnerRunId` + `classifySubagentResumeFailure` + `subagentResumeAvailable`(#242 批 2 A-028.7:resume 判定半场上收,与 steer 孪生同居;取址三态 = 台账有行用行值 / 指名了行但台账缺席则**诚实缺席绝不回落在飞 run** / 没指名行才回落。出路文案归端)· `recordSubagentOwnerFromProgress` + `getBgParentRunOwner`(A-028.6:「子代 → 宿主 run」**单表**,宿主 run 必须由持 stream-local 值的调用方显式传入,包内绝不从 `activeEngineRunId()` 推断)· `auditRetainWithoutWake`([4000] Q5:引擎宣示 `subagentResume` + 本端在付 `retainSubagentSessions` + 端未实现 `wakeSubagent` ⇒ 响亮一条;`CLIENT_VERBS.wakeSubagent` 维持 fail-soft)· `subscribeSubagentContent` · `subscribeEngineAgentPanel` · `publishQuestionFrame` / `respondToQuestion` · `configureSubagentContentStore` / `subagentContentStoreConfig` / `SUBAGENT_CONTENT_STORE_DEFAULTS`(0.62.0:子代内容账本的**字节预算** —— 此前只有条数帽而单条无上限,一条 base64 工具结果就能让一个子代槽吃到十几 MB;越限从最早的内容开始丢并留一条可渲染的 `truncated` 记录,总帽淘汰整条最久未用的账本。配置面 fail-loud,详见 §26②)| 驱动与观测委派子代;经 module 级台账喂活体 agent/task 面板。全部**能力位 gate**(§5b) | `src/subagent/*.ts`、`src/subagentContentStore.ts`、`src/engineAgentPanelStore.ts`、`src/engineAgentAbsence.ts`(0.83.2 CC-194 缺席行判定与措辞)、`src/agentSession/engineAgentRegistryRead.ts`(0.84.0 CC-194 B 半登记读口)、`src/engineInlineTaskStats.ts`、`src/engineToolLabelStore.ts`、`src/liveQuestionStore.ts` |
165
165
  | 5 | **fleet 投影** | 38 | `displayUntrustedMarks`(0.83.5 CC-204:同一只出口另报每一枚字符面标记的 UTF-16 区间,`text` 与同选项的出口逐字节同;§105)· `displayUntrusted`(0.83.1 CC-112:wire 派生文本上屏前的合成出口三端单源 —— 凭据两网 ∘ 字符三网,选项按载体选;本域 `escapeDisplayControlChars` / `collapseLabel` / `capForDisplay` 三只旧口改由同一只字符面引擎实现、输出逐字节不变,字符集窄于新口默认;§101)· `createFleetLedger` · `projectTasks` · `projectWorkflows` · `projectFleetAgentRows` · `readEngineActiveBgTasks` · `FLEET_TASK_VIEW_KEYS` · `escapeDisplayControlChars`(不可见字符可见化,行标签/描述消毒的共享底座)· `capForDisplay`(0.62.0:呈前**消毒 + 封长**的共用铸点 —— 先转义、后按转义结果封长,截点避开半截转义 token 与合法代理对;本包该族四处此前各写一份、其中三份顺序是反的,详见 §26⑦) | 老 `fleetClient` 那一刀的成品:**帧体归库、连接归端** —— 端持 SSE 连接,库做行投影 + 保留台账 | `src/fleet/fleetProjection.ts`、`src/fleet/fleetLedger.ts`、`src/fleetAgentPanelProjection.ts`、`src/fleetTaskDesc.ts`、`src/displayUntrusted.ts`(0.83.1 CC-112:展示层安全出口单源,本域三只旧口的字符面引擎) |
166
- | 6 | **请求装配(上行唯一构造口)** | 30 | `REQUEST_LANES` / `APPROVER_POSTURE_BYPASS` / `approverPostureDeclarationField` / `taskRequestOmissionCauseDetail` / `parseMaxCostUsd`(0.79.0 CC-116 · 118 · 123:第三条车道清单、审批姿态声明的唯一铸点与意图位片段、回执成因人话、花费上限文本解析;§85)· `assembleTaskRequest` / `taskRequestSeatOf` / `TASK_REQUEST_OMISSION_CAUSES` / `UPSTREAM_ABSENT_REQUEST_INTENTS`(0.77.0 CC-101:逐键去向回执 + 座位读数 + 成因词表 + 上游无对位表;§79)· `readAgentMemorySpec` / `unknownMemorySpecKeys` / `unknownMemorySpecKeysNote` / `memoryConfigRefusalNoteOf` / `KNOWN_AGENT_MEMORY_SPEC_KEYS` / `PENDING_MEMORY_SPEC_KEYS` / `RETIRED_MEMORY_SPEC_SINGULAR_KEY` / `MAX_UNKNOWN_MEMORY_SPEC_KEYS`(CC-96:`agents[].memory` 记忆 spec 的三态读口与闭白名单判官 —— 未列键拒掉的是**整只 agent 定义**)· `MEMORY_OFF` / `memoryOffDeclarationField` / `memoryOffDeclared`(0.72.8 CC-39③:`memory:"off"` 请求级整面关的意图位片段;§55)· `buildTaskRequest` · `REQUEST_FIELD_MATRIX` · `unregisteredRequestKeys` · `applyLiveRequestDefaults` · `taskNotificationToPrintFrame` | 两条车道(`interactive`/`print`)出站请求的**唯一**构造器;`unregisteredRequestKeys` 是可执行门 —— 端偷带一个未登记键上 wire 就红 | `src/request/taskRequest.ts`、`src/request/printNotification.ts` |
166
+ | 6 | **请求装配(上行唯一构造口)** | 32 | `fileHistoryDeclarationField` / `FILE_HISTORY_DISABLED`(0.85.0 CC-243:「这一次运行别捕获文件历史」请求词片段口 —— 只在能力读数是 `on-optional` 且宿主意图是别捕获时给 `{ fileHistory: 'disabled' }`,老服务端对这一键整条 400;字面常量供断言锚;§109)· `REQUEST_LANES` / `APPROVER_POSTURE_BYPASS` / `approverPostureDeclarationField` / `taskRequestOmissionCauseDetail` / `parseMaxCostUsd`(0.79.0 CC-116 · 118 · 123:第三条车道清单、审批姿态声明的唯一铸点与意图位片段、回执成因人话、花费上限文本解析;§85)· `assembleTaskRequest` / `taskRequestSeatOf` / `TASK_REQUEST_OMISSION_CAUSES` / `UPSTREAM_ABSENT_REQUEST_INTENTS`(0.77.0 CC-101:逐键去向回执 + 座位读数 + 成因词表 + 上游无对位表;§79)· `readAgentMemorySpec` / `unknownMemorySpecKeys` / `unknownMemorySpecKeysNote` / `memoryConfigRefusalNoteOf` / `KNOWN_AGENT_MEMORY_SPEC_KEYS` / `PENDING_MEMORY_SPEC_KEYS` / `RETIRED_MEMORY_SPEC_SINGULAR_KEY` / `MAX_UNKNOWN_MEMORY_SPEC_KEYS`(CC-96:`agents[].memory` 记忆 spec 的三态读口与闭白名单判官 —— 未列键拒掉的是**整只 agent 定义**)· `MEMORY_OFF` / `memoryOffDeclarationField` / `memoryOffDeclared`(0.72.8 CC-39③:`memory:"off"` 请求级整面关的意图位片段;§55)· `buildTaskRequest` · `REQUEST_FIELD_MATRIX` · `unregisteredRequestKeys` · `applyLiveRequestDefaults` · `taskNotificationToPrintFrame` | 两条车道(`interactive`/`print`)出站请求的**唯一**构造器;`unregisteredRequestKeys` 是可执行门 —— 端偷带一个未登记键上 wire 就红 | `src/request/taskRequest.ts`、`src/request/printNotification.ts` |
167
167
  | 7 | **通知与 outstanding 台账** | 49 | `noteOwnWorkflowRun`(0.72.2 CC-37:own 台账显式登记口,adapter workflow lane 门在 own-run 正向证明下同拍调;§49)· `installNotificationQueuePort` · `normalizeTaskNotification` · `taskNotificationDedupKeyFromWire` · `registerOutstandingBgTask` / `registerOutstandingWorkflowRun` · `notificationQueuePortMisses` · `subscribeOutstandingWorkflows` · `outstandingDeliverableWorkflowCount` | `task_notification` 归一 + 去重 + 投递进宿主命令队列的**一把闸**;`outstandingDeliverableWorkflowCount()` 是 headless `-p` 的**退出门** · `classifyPeerNotification` / `renderPeerFrameTranscriptText` / `parsePeerFrameText` / `peerFrameDisplayName` + 三张闭集表(design/385,0.54.0:同一条 `task_notification` 车道上三条**引擎注入帧**的类型化投影 —— 判别位=载体在场而非 summary 文本,详见 §17) | `src/notifications.ts`(11 个 module 台账) |
168
- | 8 | **工具结果卡** | 27 | `stripSystemReminderBlocks` / `unwrapSystemReminder`(0.83.4 CC-205:引擎 `<system-reminder>` 信封壳的剥离与整条解包,开标签只认引擎铸的两形,线性时间;§104)· `displayBody`(0.78.1 CC-113:工具结果正文的人类面读口,剥本包铸的不可信围栏,三形互不折叠;§83)· `structuredToToolUseResult` · `readAsyncLaunchedAgentReceipt` · `wireOutputToBody` · `parseModelFacingBash` · `getPatchFromContents` · `toolEndResultToUserFrame` · `flattenToolOutput` | 铸端要渲的 `tool_result` 卡体,含客户端 diff hunk(唯一 runtime dep 的用处) | `src/toolResult.ts`、`src/printToolResultFrame.ts`、`src/diff/patch.ts` |
169
- | 9 | **能力/旋钮 wire 门族** | 179 | `hooksWirePlan` / `pluginHookVerdictOf` / `hooksNotRunNotice` / `pluginHookExecutorLabel` / `pluginHookReasonText` / `settingsHookDropText` / `isEngineFiredHookEvent` + `ENGINE_FIRED_HOOK_EVENTS` / `PLUGIN_HOOK_DISPOSITIONS` / `PLUGIN_HOOK_REASONS` / `PLUGIN_HOOK_EXCLUSION_REASONS` / `SETTINGS_HOOK_DROP_REASONS`(0.83.1 CC-174:插件 hook 每轮计划 —— 逐条判「投给引擎 / 本客户端执行 / 如实不跑」,请求体 hooks 与本地跳过用同一份,开机「不会执行」清单与 `/hooks` 标注措辞单源,五张闭集;读口是 `SettingsPort` 的可选成员 `enabledPluginHooks`(型面,不计名数);§101)· `invalidateTaskAgentsWire`(0.82.1 CC-161:自定义代理载荷作废并重投,就绪门等最新一代,§93 S-14)· `projectFileHistoryCaptureCapability` / `noteEngineCapsForFileHistoryCapture` / `observedFileHistoryCapture` / `forgetFileHistoryCaptureReading` / `fileHistoryCaptureMode` / `fileHistoryCaptureDoctorDetail`(0.82.1 CC-163:`capabilities.fileHistoryCapture` 四态读口 + 判据 + 措辞单源;§93)· `observedRewindArchive` / `rewindCodeArchiveAvailability` / `rewindConversationAvailability` / `rewindArchiveDoctorDetail` / `rewindConversationDoctorDetail`(0.82.0 CC-146:`/rewind` 代码档与对话档可用性四位窄读口 + 端判据三态 + 措辞单源,替掉壳侧「本地备份表非空」那条判据;§92)· `mcpEngineLegLivenessOf` / `mcpDetailLegNote` / `isMcpLivenessState`(0.80.0 CC-134:引擎腿活性六档读口 + 九句范围说明铸点 + 活性三词判据上公面;§87)· `projectMcpProbeCapability` / `noteEngineCapsForMcpProbe` / `observedMcpProbe` / `forgetMcpProbeReading` / `mcpProbeAvailable` / `mcpProbeDoctorDetail`(0.79.0 CC-74:`capabilities.mcpProbe` 四态读口 + 「这次调用要不要上 wire」三态 + doctor 句;§85)· `projectSessionPolicyCapability` / `observedSessionPolicy` / `sessionPolicyFaceAvailable`(0.77.0 CC-105:`capabilities.sessionPolicy` 四态读口 + 渲不渲写入口三态;§79)· `projectMemoryComplianceCapability` / `memoryComplianceVerbsAvailable` · `projectMemoryOriginCapability` / `memoryOriginVerbsAvailable`(0.76.1 CC-97a:`capabilities.memoryCompliance` / `memoryOrigin` 两只四态读口,同判据不同位、各持一张表;§77)· `projectPeerLaneCapability` / `observedPeerLane` / `peerLaneAvailable`(0.76.1 CC-102:`capabilities.peerLane` 四态读口 + 露不露跨会话入口的三态判据;非 HTTP 面)· `projectPermissionRulesWriteCapability` / `observedPermissionRulesWrite` / `permissionRulesWriteAvailable`(0.76.1 CC-102:`capabilities.permissionRulesWrite` 四态读口 —— 键缺席 = 二进制比单步写口老、藏入口;在场按本键的值判这次够不够得着;§77)· `projectDeviceExecutorManagementCapability` / `noteEngineCapsForDeviceExecutorManagement` / `observedDeviceExecutorManagement` / `forgetDeviceExecutorManagementReading` / `deviceExecutorManagementDoctorDetail` / `deviceManagementVerbsAvailable`(0.74.2 CC-69;§70)· `projectApprovalsStreamLiveCapability` / `noteEngineCapsForApprovalsStreamLive` / `observedApprovalsStreamLive` / `forgetApprovalsStreamLiveReading` / `approvalsStreamLiveDoctorDetail` / `livePendingNeedsReconcile`(0.73.3 CC-61;§65)· `projectExecutionLaneCapability` / `noteEngineCapsForExecutionLane` / `observedExecutionLane` / `forgetExecutionLaneReading` / `executionLaneDoctorDetail` / `toolsRunHereFromExecutionLane`(0.72.13 CC-54:`capabilities.executionLane` 四态读面,键缺席 ≠ 不是本机车道;§60)· `AGENT_MEMORY_WORDS`(0.72.3 CC-39①:`memory: user|project|local` 三词;`projectAgentsForWire` 把它们同映射为 `agents[].memory = { scopes:[agent:<type>], writeScope }`;§50)· `skillBaseDirOf`(0.72.1 CC-33:`SkillSpec.baseDir` 窄读 = server 顶层门同一只结构判据;`skillCommandsToSpecs` 第三参 `{ toolsRunHere }` 只在本机车道带;§48)· `projectAgentsForWire` / `awaitTaskAgentsWire` · `hooksForWire` · `mcpConfigsToSpecs` · `ultracodeForRequest` · `buildWebSearchEnv`(`resolveWebSearch` 🔧 0.83.0 退出公面,换读域 15 的 `resolveWebSearchVerdict`) · `attachmentsForRequest` · `projectEffectiveBody` · `classifySelfOrchestrationRefusal` / `stripSelfOrchestrationIntent` / `projectWorkflowsGate` / `SELF_ORCHESTRATION_RETRY_WITHOUT`(S-81,server 7.57.0:上面两条 stamp 腿的**背面** —— 半配置多租户形态下 server 把带 `selfOrchestration` / `settings.ultracode` 的提交 501 拒掉,判型/去键/caps 闸三处都是判定不是文案,详见 §13) · `engineCapsGeneration`(0.60.0,异源对抗复审 [medium] 逼出:caps 探测的**当代号**读口 —— 代际闸在 probe **返回之后**才跑,而宿主的读面 tee 是在 probe **内部**落地的 ⇒ 一次慢的旧探测能把上一台引擎的读数写回来。宿主在**起探测那一刻**抓号、tee 时交回 `{generation}`,陈旧那一发整只丢掉;不传 = 逐字节同行为,详见 §24e)| 逐功能的「引擎有没有这个能力 + 这个字段怎么上 wire」投影器,由 `buildTaskRequest` 组装。🔴 `hooksForWire()` 是 **fail-closed**:无 `SettingsPort` ⇒ 返回 `undefined`(信任门,不是取值) | 17 个 `src/*WireCaps.ts` + `src/scratchpadWireCaps.ts`、`src/hooksWireCaps.ts`、`src/goalStopHook.ts`、`src/websearch/searchProviderPresets.ts`、`src/selfOrchestrationDenial.ts`(S-81 拒绝判定层)、`src/pluginHooksWire.ts`(0.83.1 CC-174:插件 hook 判定 / 措辞 / 闭集,经 `src/hooksWireCaps.ts` 编排) |
170
- | 10 | **headless / 部署旋钮 wire** | 61 | `lastFlagValue`(0.74.3 CC-80:argv 末次旗值扫描原语上公面;§71)· `probeEngineDetachSupport` / `detachSupportDisclosure`(0.72.13 CC-53:detach 版本闸三态读口 + 披露句;§60)· `parseSandboxArgv` / `sandboxRequestFields` · `parseLimitsArgv` / `limitsForPrint` · `resolveHeadlessFinalVerify` · `resolveHeadlessPermissionMode` · `resolveHeadlessInteractiveTools` · `armDetachCancel` + `detachCancelArm` + `isDetachArmed` · `withHeadlessR1Reconnect` | `-p`/headless 车道的 env+argv 旋钮。🔴 `detachWire` 是**拆**的补偿:判定与 cancel-arm 台账在库,信号路径的裸 fetch 留宿主(`detachCancelArm()` 是取件口) | `src/sandboxWire.ts`、`scenarioWire.ts`、`finalVerifyWire.ts`、`limitsWire.ts`、`interactiveToolsWire.ts`、`headlessPermissionModeWire.ts`、`headlessReconnectWire.ts`、`detachWire.ts` |
168
+ | 8 | **工具结果卡** | 28 | `findSystemReminderOpenTag`(0.84.1 CC-210:开标签定位口,与剥离 / 解包同一个判定,文法常量不上公面;§108)· `stripSystemReminderBlocks` / `unwrapSystemReminder`(0.83.4 CC-205:引擎 `<system-reminder>` 信封壳的剥离与整条解包,开标签只认引擎铸的两形,线性时间;§104)· `displayBody`(0.78.1 CC-113:工具结果正文的人类面读口,剥本包铸的不可信围栏,三形互不折叠;§83)· `structuredToToolUseResult` · `readAsyncLaunchedAgentReceipt` · `wireOutputToBody` · `parseModelFacingBash` · `getPatchFromContents` · `toolEndResultToUserFrame` · `flattenToolOutput` | 铸端要渲的 `tool_result` 卡体,含客户端 diff hunk(唯一 runtime dep 的用处) | `src/toolResult.ts`、`src/printToolResultFrame.ts`、`src/diff/patch.ts` |
169
+ | 9 | **能力/旋钮 wire 门族** | 183 | `projectSealedKeyCapability` / `noteEngineCapsForSealedKey` / `observedSealedKey` / `forgetSealedKeyReading`(0.85.0 CC-243:能力面公钥发现段 `sealedKey` 的四态读口与读账,只出公钥三键、键缺席 = 不要封;§109)· `hooksWirePlan` / `pluginHookVerdictOf` / `hooksNotRunNotice` / `pluginHookExecutorLabel` / `pluginHookReasonText` / `settingsHookDropText` / `isEngineFiredHookEvent` + `ENGINE_FIRED_HOOK_EVENTS` / `PLUGIN_HOOK_DISPOSITIONS` / `PLUGIN_HOOK_REASONS` / `PLUGIN_HOOK_EXCLUSION_REASONS` / `SETTINGS_HOOK_DROP_REASONS`(0.83.1 CC-174:插件 hook 每轮计划 —— 逐条判「投给引擎 / 本客户端执行 / 如实不跑」,请求体 hooks 与本地跳过用同一份,开机「不会执行」清单与 `/hooks` 标注措辞单源,五张闭集;读口是 `SettingsPort` 的可选成员 `enabledPluginHooks`(型面,不计名数);§101)· `invalidateTaskAgentsWire`(0.82.1 CC-161:自定义代理载荷作废并重投,就绪门等最新一代,§93 S-14)· `projectFileHistoryCaptureCapability` / `noteEngineCapsForFileHistoryCapture` / `observedFileHistoryCapture` / `forgetFileHistoryCaptureReading` / `fileHistoryCaptureMode` / `fileHistoryCaptureDoctorDetail`(0.82.1 CC-163:`capabilities.fileHistoryCapture` 四态读口 + 判据 + 措辞单源;§93)· `observedRewindArchive` / `rewindCodeArchiveAvailability` / `rewindConversationAvailability` / `rewindArchiveDoctorDetail` / `rewindConversationDoctorDetail`(0.82.0 CC-146:`/rewind` 代码档与对话档可用性四位窄读口 + 端判据三态 + 措辞单源,替掉壳侧「本地备份表非空」那条判据;§92)· `mcpEngineLegLivenessOf` / `mcpDetailLegNote` / `isMcpLivenessState`(0.80.0 CC-134:引擎腿活性六档读口 + 九句范围说明铸点 + 活性三词判据上公面;§87)· `projectMcpProbeCapability` / `noteEngineCapsForMcpProbe` / `observedMcpProbe` / `forgetMcpProbeReading` / `mcpProbeAvailable` / `mcpProbeDoctorDetail`(0.79.0 CC-74:`capabilities.mcpProbe` 四态读口 + 「这次调用要不要上 wire」三态 + doctor 句;§85)· `projectSessionPolicyCapability` / `observedSessionPolicy` / `sessionPolicyFaceAvailable`(0.77.0 CC-105:`capabilities.sessionPolicy` 四态读口 + 渲不渲写入口三态;§79)· `projectMemoryComplianceCapability` / `memoryComplianceVerbsAvailable` · `projectMemoryOriginCapability` / `memoryOriginVerbsAvailable`(0.76.1 CC-97a:`capabilities.memoryCompliance` / `memoryOrigin` 两只四态读口,同判据不同位、各持一张表;§77)· `projectPeerLaneCapability` / `observedPeerLane` / `peerLaneAvailable`(0.76.1 CC-102:`capabilities.peerLane` 四态读口 + 露不露跨会话入口的三态判据;非 HTTP 面)· `projectPermissionRulesWriteCapability` / `observedPermissionRulesWrite` / `permissionRulesWriteAvailable`(0.76.1 CC-102:`capabilities.permissionRulesWrite` 四态读口 —— 键缺席 = 二进制比单步写口老、藏入口;在场按本键的值判这次够不够得着;§77)· `projectDeviceExecutorManagementCapability` / `noteEngineCapsForDeviceExecutorManagement` / `observedDeviceExecutorManagement` / `forgetDeviceExecutorManagementReading` / `deviceExecutorManagementDoctorDetail` / `deviceManagementVerbsAvailable`(0.74.2 CC-69;§70)· `projectApprovalsStreamLiveCapability` / `noteEngineCapsForApprovalsStreamLive` / `observedApprovalsStreamLive` / `forgetApprovalsStreamLiveReading` / `approvalsStreamLiveDoctorDetail` / `livePendingNeedsReconcile`(0.73.3 CC-61;§65)· `projectExecutionLaneCapability` / `noteEngineCapsForExecutionLane` / `observedExecutionLane` / `forgetExecutionLaneReading` / `executionLaneDoctorDetail` / `toolsRunHereFromExecutionLane`(0.72.13 CC-54:`capabilities.executionLane` 四态读面,键缺席 ≠ 不是本机车道;§60)· `AGENT_MEMORY_WORDS`(0.72.3 CC-39①:`memory: user|project|local` 三词;`projectAgentsForWire` 把它们同映射为 `agents[].memory = { scopes:[agent:<type>], writeScope }`;§50)· `skillBaseDirOf`(0.72.1 CC-33:`SkillSpec.baseDir` 窄读 = server 顶层门同一只结构判据;`skillCommandsToSpecs` 第三参 `{ toolsRunHere }` 只在本机车道带;§48)· `projectAgentsForWire` / `awaitTaskAgentsWire` · `hooksForWire` · `mcpConfigsToSpecs` · `ultracodeForRequest` · `buildWebSearchEnv`(`resolveWebSearch` 🔧 0.83.0 退出公面,换读域 15 的 `resolveWebSearchVerdict`) · `attachmentsForRequest` · `projectEffectiveBody` · `classifySelfOrchestrationRefusal` / `stripSelfOrchestrationIntent` / `projectWorkflowsGate` / `SELF_ORCHESTRATION_RETRY_WITHOUT`(S-81,server 7.57.0:上面两条 stamp 腿的**背面** —— 半配置多租户形态下 server 把带 `selfOrchestration` / `settings.ultracode` 的提交 501 拒掉,判型/去键/caps 闸三处都是判定不是文案,详见 §13) · `engineCapsGeneration`(0.60.0,异源对抗复审 [medium] 逼出:caps 探测的**当代号**读口 —— 代际闸在 probe **返回之后**才跑,而宿主的读面 tee 是在 probe **内部**落地的 ⇒ 一次慢的旧探测能把上一台引擎的读数写回来。宿主在**起探测那一刻**抓号、tee 时交回 `{generation}`,陈旧那一发整只丢掉;不传 = 逐字节同行为,详见 §24e)| 逐功能的「引擎有没有这个能力 + 这个字段怎么上 wire」投影器,由 `buildTaskRequest` 组装。🔴 `hooksForWire()` 是 **fail-closed**:无 `SettingsPort` ⇒ 返回 `undefined`(信任门,不是取值) | 17 个 `src/*WireCaps.ts` + `src/scratchpadWireCaps.ts`、`src/hooksWireCaps.ts`、`src/goalStopHook.ts`、`src/websearch/searchProviderPresets.ts`、`src/selfOrchestrationDenial.ts`(S-81 拒绝判定层)、`src/pluginHooksWire.ts`(0.83.1 CC-174:插件 hook 判定 / 措辞 / 闭集,经 `src/hooksWireCaps.ts` 编排) |
170
+ | 10 | **headless / 部署旋钮 wire** | 62 | `isDetachDurableOff400`(0.84.1 CC-219:detach durable-off 400 纯判定,不带进程门,只认锚句不认码,一律不抛;§108)· `lastFlagValue`(0.74.3 CC-80:argv 末次旗值扫描原语上公面;§71)· `probeEngineDetachSupport` / `detachSupportDisclosure`(0.72.13 CC-53:detach 版本闸三态读口 + 披露句;§60)· `parseSandboxArgv` / `sandboxRequestFields` · `parseLimitsArgv` / `limitsForPrint` · `resolveHeadlessFinalVerify` · `resolveHeadlessPermissionMode` · `resolveHeadlessInteractiveTools` · `armDetachCancel` + `detachCancelArm` + `isDetachArmed` · `withHeadlessR1Reconnect` | `-p`/headless 车道的 env+argv 旋钮。🔴 `detachWire` 是**拆**的补偿:判定与 cancel-arm 台账在库,信号路径的裸 fetch 留宿主(`detachCancelArm()` 是取件口) | `src/sandboxWire.ts`、`scenarioWire.ts`、`finalVerifyWire.ts`、`limitsWire.ts`、`interactiveToolsWire.ts`、`headlessPermissionModeWire.ts`、`headlessReconnectWire.ts`、`detachWire.ts` |
171
171
  | 11 | **模型目录与预算** | 72 | `modelIdentityResolvability` / `modelIdentityDetail` / `modelSetupDecision` / `modelSetupNotice` / `observedEngineAnswer`(0.82.1 CC-151:「引擎启动时拿不拿得到模型名」三态判据 + 向导两位决策 + 措辞单源,§93 S-11)· `routePairingVerdict`(0.71.3 CC-06:`ModelInfo.routePairing` ok / broken / unknown 三态读口,§45)· `resolveModelCatalog` · `loadCatalogWithSources` · `PROVIDER_PRESETS` / `MODEL_FAMILIES` · `defaultMaxTokensFor` · `getLiveModelCatalog` / `setLiveModelCatalogRefresher` · `providerAuthMethods` / `beginDeviceCodeAuth` · `providerCatalogRows` / `providerCatalogRowDetail` / `providerPresetById`(#244 F4 族D A-028.17:46 家表的规范折表层 —— 全表不重排、诚实缺席「model id typed in」,cli 目录/web 向导同一份折表)· `TIER_ORDER` / `CC_TIER_ALIASES` / `isTier` / `resolveTierBinding`(A-028.18:档位词表+校验+fail-open 降档派生单源;settings 存储归宿主)· `resolveEntryVision` / `computeDeleteBlockers` / `computeDeleteWarnings`(0.38.0 #318 件③ 上收:Model Hub 供给面的三端公共判定 —— vision 生效值+来源三态、删除断链核(拒删+指路)、删除降级后果(照删但必说)。**零 IO**,读盘那半场留各端;`doc === null` 的两义在调用方分流) | 三层 provider 目录解析(线上 URL → 包内预设 → 用户覆盖)+ per-model `maxTokens` 封顶。线上腿需注入 `CatalogFetchJson`,缺席 ⇒ 整条不启用(`online.reason='no-fetch-port'`);缓存落盘经 `CatalogCachePort` | `src/model/{catalog,catalogLoader,providerAuth,providerPresets,providerCatalog,tierVocabulary}.ts`、`src/liveModelCatalog.ts`、`src/modelBudgetRule.ts`、`src/sessionModelLatch.ts`、`src/effortWire.ts` |
172
172
  | 12 | **workflow 与后台工作视图** | 36 | `evaluateWorkflowSize` / `readWorkflowSizeWarningEnvCaps` / `workflowSizeWarningTextForWidth` + `WORKFLOW_SIZE_WARNING_AGENT_CAP` / `_TOKEN_CAP` / `_TOKENS_PER_AGENT` / `_ENV_NAMES` / `_TEXT_LONG` / `_TEXT_SHORT` / `_TEXT_MIN` / `WORKFLOW_SIZE_GUIDELINE_AGENT_CAPS`(0.73.5 CC-58:规模告警判定三态;§67)· `projectLeaderConflict` / `leaderConflictDetail` + `LEADER_RUN_STATUSES` / `LEADER_REJ_HEAD_DISPLAY_MAX`(0.72.10 CC-41:leader run 终局 `needs_human` + `result.conflict` 三形读面 none / unreadable / conflict,缺席不可分、filesTruncated 只认 true、salvaged 原样给落盘口;§57)· `projectWorkflowRun` · `readWorkflowResumeAdmissionIncomplete`(0.68.3 CC-05:core 7.18.0 `resumeAdmissionIncomplete` 在场 = 不是 resume 基,与 `readWorkflowParks` 同一条投影义务)· `createLiveWorkflowSource` · `ensureWorkflowActivityLedger` · `readWorkflowActivityLedger` · `stopWorkflowActivityLedger` · `resetWorkflowActivityLedgers` · `createBackgroundView` · `projectBackgroundView` · `recordWorkflowAgentTaskId` · `agentDisplayStatus` | 活过一个 turn 的长任务读面:workflow run + 跨 session 后台任务归一表(`assistant.tasks` 与 fleet SSE **两源独立降级**) | `src/workflow.ts`、`src/workflowClient.ts`、`src/workflowMonitor.ts`、`src/agentSession/backgroundView.ts`(+ 纯类型 `src/agentSession/contract.ts`) |
173
173
  | 13 | **座位 IPC 契约** | 34 | `LOCAL_SESSIONS_SPEC` · `SEAT_METHOD_NAMES` · `SEAT_EVENT_TYPES` · `isLocalSessionEvent` · `isToolPermissionRequest` · `toolPermissionRequestId` · `SEAT_VALIDATOR_KEY_COVERAGE` · `SEAT_SEND_MESSAGE_KEY_ORIGINS`(0.62.0:座位载荷**逐键出身**登记 —— 每个位要么写明转投哪个引擎请求位、要么写明为什么不上 wire;常驻门对**装在盘上的** sdk 型面逐名核,详见 §26③)| desktop↔web 座位 IPC 契约的**单一真源**(此前两边各一份、名字零重合 ⇒ 编译器永远不会告诉你它们漂了)。🔴 加 verb 忘了加 `LOCAL_SESSIONS_SPEC` **不报错**:preload 不注册 channel、渲染端读到 `undefined` | `src/seatContract.ts`(**零 import**,纯类型 + 常量 + 纯谓词)。🔴 **证据等级标注(0.42.0,test [5087] 的「语料**种类**缺口」/ cli [5088] 认领件)**:该文件里所有以「CC 如何如何」为形的断言(`212 methods` / `854-channel census` / 方法名逐字保留 / `fQe` 逐字段对照 / 一切 `.vite/build/index.chunk-*.js` 坐标)**证据等级 = 桌面 unpack,本地语料库不可复验** —— 本仓手边可复验的参照语料**只覆盖终端 CLI 形态**的静态产物,拿它去 grep 桌面壳里的符号只会零命中,而零命中在这里**既不证真也不证伪**。复核这些断言**不得**拿本仓语料当反证 |
174
174
  | 14 | **宿主端口与会话槽** | 41 | `installHost` · `installHostFor` · `installCoreValuePorts` + 十读口 + 三存在性口(0.69.0 CC-07:core 值级面端口注入,Node 宿主装配根装、浏览器 lane 恒缺席)· `hostPortMisses(For)` · `DEFAULT_SESSION_KEY` · `hostEnv` · `unrefTimer` · `parseLocaleTag` / `pickUiLanguage`(#244 F4 族D A-028.20:locale tag 手术单源 + UI 语言判定;与 `resolveRegionHint` 双出口成文 —— 语言偏好域 en/zh ≠ 地址可达域 cn/intl/unknown,`zh-Hant` 前者 zh 后者 intl 是设计)· `engineNamespaceKeyFor` / `mergeSessionMapRecord` / `mergeEngineEntry`(A-028.12:会话 id 映射单一键形 + merge 判定;存储经 `SessionMapStorePort` 归端 —— cli 文件锁/原子写,web localStorage)| 进程/端级装配层(settings/fs/queue/timers/session/log/probe),与 per-turn 的 `AdapterContext` **分层**。头注的判定规则:**这个能力每 turn 都会变吗?** 会 ⇒ `ctx`;不会 ⇒ `installHost` | `src/host.ts`、`src/hostEnv.ts`、`src/sessionSlot.ts`、`src/unrefTimer.ts`、`src/env/{localeGeo,localeTag,uiLanguage}.ts`、`src/sessionMap.ts` |
175
- | 15 | **控制面与传输** | 193 | `judgeWebSearchSettings` / `webSearchVerdictFromEnv` / `resolveWebSearchVerdict` / `webSearchVerdictMessage` / `webSearchEndpointForDisplay`(0.82.7 CC-182:每请求联网搜索配置三态判决,与 server ≥7.100.0 判官同判;§99)· `withPrintInitFrame` / `createPrintInitGate` / `printInitRosterSignal` / `decidePrintInitToolFace` / `printInitToolFaceDebugLine` / `PRINT_INIT_ROSTER_WAIT_MS`(0.82.5 CC-169:print 车道 init 帧工具面名册优先 —— 流包装器、判定闸、名册信号三态分类、判定口、留痕措辞单源、等待上界;§97)· `projectRegistryQuotaUsage` / `quotaAmountText` / `registryQuotaDoctorDetail`(0.82.0 CC-150:云控制面 quota/usage 回体的纯投影 —— 两种 null 的正面事实与「判不出」三分,措辞零 0;§92)· `pushSessionBundle` / `pullSessionBundle` / `importSessionBundle` / `APIError`(0.79.0 CC-128:会话 bundle 面四名原样转口,与 `AgentClient` 同一张存量转口表;§85)· `readMcpCapabilities` / `probeMcpServers` / `classifyMcpProbeFailure` / `MCP_PROBE_REFUSAL_CAUSES` / `MCP_PROBE_UNKNOWN_WHYS`(0.79.0 CC-74:无 run 可读的 MCP 状态面两只调用口 + 单一失败判官 + 两张闭集词表;§85)· `readEntryProvenance` / `eraseMemoryEntries` / `listExternalOriginEntries` / `listOriginClearances` / `clearEntryOrigin` / `classifyMemoryFailure` / `externalOriginCoverage` / `MEMORY_VERB_REFUSAL_CAUSES` / `MEMORY_VERB_UNKNOWN_WHYS`(0.78.1 CC-97 b:记忆治理面五动词调用口 + 单一失败判官 + 两张闭集 + 覆盖面判词;§83)· `readMemoryExportRows` / `scopeExternalOriginVerdict` / `readMemoryEraseReceipt` / `memoryEraseCounts` / `memoryEraseErasedNothing` / `eraseNotFoundHistoryVerdict` / `memoryEraseReplayPosture` / `readMemoryOriginClearanceReceipt` / `MEMORY_ENGINE_REQUIRED_CODE`(0.76.1 CC-97a:记忆条目面三个回体的窄读口 + 判词口;「空答绝不读作本店干净」的代码落点;§77)· `readMcpLiveness` / `mcpLivenessRollupOf` / `mcpEngineLegHealthOf` / `mcpEngineLegHealthDetail` / `MCP_LIVENESS_STATES`(0.76.1 CC-36:`wiring_manifest.mcp[].liveness` 活性观察的行级三向读口 + 腿级四读数判词 + 措辞铸点;§77)· `readRunCancelContext` / `classifyRunAbortCause` / `RUN_CANCELLED_CODE`(0.74.3 CC-71:run 取消现场与成因;§71)· `cancelConflictFromError` / `cancelConflictContent` / `usageWindowExhaustedFromError` / `usageWindowExhaustedContent` + `CONFLICT_APPROVAL_SETTLED` / `CONFLICT_RUN_NOT_RUNNING`(0.73.1 CC-56:cancel 409 按码分家 + 提交面 429 用量窗;§63)· `reconnectMcpServer` / `projectMcpReconnectResult` / `classifyMcpReconnectFailure` / `projectMcpReconnectCapability` / `mcpReconnectOutcomeDetail` + `MCP_RECONNECT_OUTCOMES` / `MCP_RECONNECT_TRANSACTION_NOTICE`(0.72.9 CC-30:会话内 MCP re-dial 消费口,outcome 三态 / unsupported 恒五键 / 名册按 toolNames 在场性;§56)· `readAutoConsolidationArmed`(0.72.9 CC-39②:memory-status `autoConsolidationArmed` 三态,缺席 = 老 server 判不了;§56)· `steerFollowIntent`(0.72.6 CC-40:steer 后续听意图三态 tail / after-decision / after-wake,按 `SteerReceipt.delivery` 判;§53)· `projectWebSearchBackendCapability` / `observedWebSearchBackend` / `noteEngineCapsForWebSearchBackend` / `forgetWebSearchBackendReading` / `webSearchBackendDoctorDetail` + `WEB_SEARCH_BACKEND_NONE`(0.72.5 CC-31:`capabilities.webSearch.backend` 四态读面 —— 键缺席 = 老引擎判不了 ≠ `none` = 引擎明说没有默认后端;与 `sqlEngineCapability` / `writeProtectionCapability` 同构;§52)· `resumeContextUnavailableFromError` / `resumeContextUnavailableContent`(0.72.1 CC-33:409 `conflict.resume_context_unavailable` 读数 `{ code, staleAfterSec?, runId? }` + 三句人话;§48)· `mcpEngineLegPresence`(0.71.0 CC-19:引擎侧 MCP 在场三值,只从面板视图求;§42)· `ControlRouter`(+ `ControlSafetyError`)· `fetchMcpPanel`(0.69.0:经 sdk `sessions.mcp` 取体 + 投视图,不裸 fetch)· `projectMcpPanel` + `mcpPanelLastLegDetail`(0.68.2 CC-03:`GET /v1/sessions/:id/mcp` 面板体防御读视图 + `lastLegMcp` 一行措辞铸点;缺席 = 键不铸、读不懂 = `lastLegMcpUnreadable`、禁与 `servers[]` 对账)· `makeEngineWireClient` + `resolveWireAuth` · `installEngineWireTarget` · `diagnoseSseIdleTear` / `isSseIdleError` · `attemptActiveRunSelfHeal` + `activeRunBusySignal` + `activeRunSelfHealRow` / `activeRunBusyHeadlessRow` · `kickEngineCapsProbe` / `engineCapTrue` / `invalidateEngineCaps(baseUrl, probe?)`(#307 S25:引擎温切后的 caps 生产失效口 —— kick 自带幂等闸,同 baseUrl 重启后不显式失效就永远读到旧引擎那一版能力位;调用方 = 壳的 respawn/restartEngine。🔴 **推荐两参形**:第二参给替代探测则「推进代际 + 注册新探测」在同一同步块内完成,失效与下一次 kick 之间那个「等待者读到未判」的窗按构造不存在;单参形保留给「只丢缓存、这一刻没有替代探测」的调用方,那种情形下读到未判是诚实结局) · `engineCapValue`(S-131,0.59.0:能力位的**四态**通用读口 `unobserved`/`not_reported`/`null`/`value` —— 既有三口把四种「读不出」全折成 fail-closed 一档,对**放行**问题是对的、对**读面/诊断**问题是错的:`null`(引擎明确说没有,正面事实)会与「老引擎不报」「还没探到」在屏上同形。`value` 位刻意不做形校验,形归各能力位自己的窄读器,详见 §23b)· `projectSqlEngineCapability` / `observedSqlEngine` / `noteEngineCapsForSqlEngine` / `forgetSqlEngineReading` / `sqlEngineDoctorDetail`(S-131,0.59.0:`Capabilities.sql`(server ≥7.60.0)的四态读面**从壳侧上收** —— 归层债,0.58.0 时它长在壳里正是因为包侧没有嵌套对象读口。🔴 **导出名与壳侧那份逐字同名 = drift-lock**;`txnMode: null` 是铸点域内的合法值不是畸形;换代失效口清成未观测而不是留旧值,详见 §23b)· `mapBrainStatusToRetry` · `waitForClaimRelease` + `CLAIM_RELEASED_STATES` / `CLAIM_HELD_STATES` · `atMostOnceFailureClass` / `readSteerDelivery` · `clearRunningChoiceOffer`(Inkglow-1085 P0b①:「Do nothing」登记的清口 —— 端的「重新打开操作菜单」入口;登记在场时 attemptActiveRunSelfHeal 不整卡重弹,not-parked 结局带 `alreadyOffered: true` 判别位,端据此降级渲一行)· `INTERACTIVE_WAY_OUT`(默认出路串单源)· `engineSessionParamFor`(design/285 批 0:`?session=` 派生的 **per-key** 形 —— `hostSessionFor(sessionKey)?.currentSessionId()` + [1501] 空串归一;零参 `engineSessionParam()` = 默认槽兼容层,取值链逐字等价)· `normalizeWirePrincipal`(A-028.10:principal 在场性 trim 原语 —— 全空白=缺席不发头,engineWireTarget 两臂/makeEngineWireClient/壳 livePrincipal 同尺)· `readSessionMemoryStatus` / `classifyMemoryStatusFailure` / `readCaptureOptOut` / `readLastCapture`(S-53 会话记忆姿态读面,0.48.0:失败分诊**码优先**——两个 404 分道 `not_found.session` / `not_found.route`,无码 404 不猜落 failed;五键逐键缺席语义两个合读器,`lastCapture` 三态的判别材料是 `committedCount` 不是本键;IO 归宿主注入 `MemoryStatusClientLike`,详见 §11) · `classifyTurnWireError` / `isWireTransportError` / `isPreStreamDrainingReject` / `isResumeAtRejection` / `drainingRetryDelayMs` / `scenarioDenyFromError` + `WIRE_NETWORK_ERROR_PATTERN`(A-028.11/.13:turn 错误分型判定半场,人话文案与渲染归端)· `resumeRetryLaterFromError`(L-102,0.57.0:resume 族**时间性拒绝**二码的判型半场 —— 这一族里唯一**带得出「等多久」**(`retryAfterSec`)的两个码。🔴 闭集**不是**「哪些码可以等」的名单:同族 `resume.row_recycling` 同样可等(窗口自清)只是没有秒数 ⇒ 本读口返回 `null` 只意味着没命中这两码,详见 §21) · `projectWriteProtectionCapability` / `observedWriteProtection` / `noteEngineCapsForWriteProtection` / `forgetWriteProtectionReading` / `writeProtectionDoctorDetail` / `projectWriteProtectionPosture` / `writeProtectionPostureDetail`(S-138,0.60.0:`Capabilities.writeProtection` (engine ≥7.63.0)的**四态**读面 + operator 面行表 —— 与上面 S-131 那一格**同构同纪律**。🔴 三位刻意不合成一个布尔;`not_reported` **不是**「这台部署没有写保护表」(座位缺席恰是缺省表在岗);逐行 name/kind 走**最小披露**只上 operator 面,详见 §24e)· `projectReadFacePosture` / `readFacePostureDetail` / `readFaceDisagreement`(S-167,0.61.0:operator 面 `diagnostics.wiring.readFace`(engine ≥7.65.0)的窄读器 —— 与上面S-138 那一格**同构同纪律**。🔴 三句「答不出来」逐字互异且没有一句等于「没有 READ 档」;`source` 按开集读;与租户面 `capabilities.readFace` 刻意不合流,只带一个纯比较函数,详见 §25)| 上行通道的**监管**半场(submit / steer / kill / 队列命令定序)+ 传输构造、caps 探测、SSE 断流分诊、**409 active-run 自愈** | `src/controlRouter.ts`、`steering.ts`、`sseIdleTriage.ts`、`retryStatus.ts`、`diagnostics.ts`、`engineWireSdk.ts`、`engineWireTarget.ts`、`src/principalWire.ts`、`src/wireErrorTriage.ts`、`engineSessionParam.ts`、`engineCapsCache.ts`、`liveInitToolFace.ts`、`adapter/activeRunSelfHeal.ts`、`src/sessionMemoryStatus.ts`、`src/writeProtectionCapability.ts`、`src/webSearchBackendCapability.ts`、`src/mcpReconnect.ts`、`src/readFacePosture.ts` |
176
- | 16 | **引擎词汇表与包自检** | 110 | `readReadRootGrantNotice`(0.84.0 CC-185:读目录授权两枚结论通告 `approval.read_root_granted` / `approval.read_root_grant_rejected` 的事实读口,按 `toolCallId` 对卡,没有 granted 通告 = 什么都没加;§107)· `APPROVAL_MANDATE_WORDS` / `isApprovalMandateWord` / `approvalMandateDetail`(0.83.2 CC-195:强制位站在哪一个词上的六词闭集,与引擎型面编译期双向钉;成员判据;每词一句说明;§102)· `resumePolicyBlockFromError` / `resumePolicyBlockContent`(0.82.1 CC-154:续跑折叠码 `resume_blocked_by_policy` 自己的读数与措辞,原码三态;§93)· `corruptStoredRowWhere` / `corruptStoredRowContent`(0.82.0 CC-156:续跑上下文坏档时引擎点名的那一行的读口与措辞单源;§92)· `effectiveWireErrorCode` / `RESUME_POLICY_FOLD_CODE`(0.82.0 CC-154:政策折叠码与「按原码判」的取码单源;§92)· `SETTLEMENT_KIND_WORDS` / `ccToolDenialKindForSettledBy` / `ccToolDenialKindForToolEnd`(0.80.0 CC-133:结算词十三词镜像 + 「谁结算的」→ CC 分类词单铸映射 + `tool_end` 帧合流读口;§87)· `CC_TOOL_DENIAL_KINDS` / `isCcToolDenialKind` / `isCcToolDenialKindADenial` / `isGateDeniedByWord`(0.79.0 CC-125:上游转录记录键 `toolDenialKind` 七词镜像 + 两只谓词 + `DeniedBy` 十词成员谓词;§85)· `mandatedApprovalDetail`(0.79.0 CC-110:「这张卡清不掉」那一句的唯一铸点;§85)· `CONFIG_MEMORY_PROJECT_KEY_SPELLING` / `CONFIG_MEMORY_WRITE_SCOPE_MISMATCH`(CC-96:记忆面两个**构造期**拒码,进既有 `config.` 族识别表;400 拼写 / 409 冲突,分诊归引擎)· `TASK_NOTIFICATION_TERMINAL_STATUSES` / `isTaskNotificationTerminalStatus`(0.72.12 CC-50:通知自己的四终态词,含 `cancelled`;与 run 级终态表两张表;§59)· `ENGINE_NOTICE_CODES` 71(0.83.0 CC-186:引擎 7.30.0 / 7.31.0 +2 `config.context_settings_swapped` / `config.secret_env_scrubbed`,均 operator;§100。历史:0.82.1 69、0.79.0 68、0.72.11 CC-49 67 —— core 7.23.0 +1 `config.write_protection_unresolved`,operator,兄弟码 `target_view_absent` 之后;§58)· `MCP_REDIAL_OUTCOMES` / `readMcpServerRedialed`(0.72.7 CC-42:通告 `mcp.server_redialed` 事实读器,outcome 三词闭集、added/removed 计数;§54)· `RESUME_CONTEXT_UNAVAILABLE`(0.72.1 CC-33;不进两个 resume 闭集:不可等、也不是换参数)· `RESUME_REOPEN_CODES` / `RESUME_ENV_FAILED` / `RESUME_TOOL_UNAVAILABLE` / `RESUME_TOOL_CONTRACT_MISMATCH` · `resumeReopenFromError` / `resumeReopenContent`(0.71.3 CC-06:resume reopen 族三码闭集 + 读口 + 三句,§45)· `readSkillsListingTruncated`(0.70.0 CC-04:`skills.listing_truncated` 事实读器,§39)· `CONFIG_REFUSAL_CODES` / `isConfigRefusalCode` · `DECIDE_WORKFLOW_LANE_CODES`(+ 三个具名码;`/decide` workflow 车道,三条出路刻意不合并,详见 §30h)· `STOP_CONFLICT_CODES` · `isInterruptedToolEndCode` · `isRewindFamilyCode` · `CLIENT_VERBS` · `compensationSplitViolations` · `DELEGATION_CAP_CODES` / `isDelegationCapCode` / `DELEGATION_CONCURRENCY_CAP` / `DELEGATION_SESSION_CAP`(0.38.0 #318 件④:core 5.48.0 design/323 委派席位到限**两码,处置不对称禁合并** —— 并发帽=**可等**(兄弟结束即有位)/ 会话累计帽=**等也没用**(这条会话的配额用尽))· `CONFIG_DELEGATION_ENTRY_CAPS`(同批入 `CONFIG_REFUSAL_CODES` 识别表)· `delegationCapDispositionOf` / `MCP_SERVER_REVOKED`(0.39.0 载体到货消费件:core 5.50.0 补 `{ error: code, code }` 孪生拼法后两码真上 `tool_end.errorCode`,0.38.0「先立词不落消费分支」的已知局限自此解除;处置轴 `wait-for-slot` / `reuse-existing-or-await-reap` 机器可读(累计帽=retained-window 帐,行回收配额即回,处置=SendMessage 复用,**非**「换会话/永久耗尽」——0.38.0 段该句系勘误),未知 `delegation.*` 码 ⇒ `undefined`;`mcp.server_revoked` = 操作员 mid-session 吊销 server 后的工具面本地闸(被吊销的 server **名**今天不过 wire 境:detail.server 是进程内位,抬升腿只 lift code——归因渲染候 core 补 typed detail,已点名);载体门 = engine-vocab G3 腿锚 core dist 铸点)· `CAPABILITY_SELF_ORCHESTRATION_REQUIRED`(S-81,server 7.57.0:提交面的 selfOrchestration 准入拒绝码。🔴 **复用码** —— 与其它 `capability.*` 501 同体形而处置不同,消费点必须按**恰等**判、绝不放宽成前缀判;判型与「去键重发一次」归 `src/selfOrchestrationDenial.ts`,详见 §13) · `GATE_PARKED_ERROR_CODE`(0.60.0:「门把这次调用 park 了」的机读码单源 —— `frameRouter` 的连坐/中断判据与 `gateOutcome.isGateParkedToolEnd` 读同一个常量;真机黑盒直证 park 短路帧上**没有 `gate`**,这个码是那一形唯一的信号,详见 §24c)| 三端分臂共用的**去字面化** `errorCode` 词表(病根正是三端各抄一份字面);编译期 verb 闭合门;搬迁补偿登记表 | `src/engineErrorCodes.ts`(计数以 `scripts/public-export-baseline.json` 为准,别手抄;A-028.11/.13 补 `DRAINING_ERROR_CODE`/`SCENARIO_NOT_ALLOWED_ERROR_CODE`/`RESUME_AT_ERROR_CODE_PREFIX`;#318 件④ 补 `delegation.*` 族四位 + `config.delegation_entry_caps`;0.39.0 补三新码消费件三位);S-81 补 `capability.self_orchestration_required` 一位;L-102 补 `resume.*` 时间性拒绝二码 + 闭集 `RESUME_RETRY_LATER_CODES` 三位)、`src/classifierVerdictWire.ts`、`src/compensations.ts`、`src/clientSlice.ts`;**0.67.0 补锚**(这三件的导出一直计在本域,而本表此前没有它们的锚行 —— 如实补上,不是搬家):`src/gateVocabulary.ts`(`GATE_DENIED_BY_WORDS`/`gateDeniedByDetail`/`ASK_ORIGIN_WORDS`/`askOriginDetail` + 🆕 `RULE_STORE_UNREADABLE_KINDS`/`isRuleStoreUnreadableKind`/`ruleStoreUnreadableDetail`,详见 §32d)、`src/autoModeUnavailable.ts`(`AUTO_MODE_UNAVAILABLE_CAUSES` + 🆕 `CLASSIFIER_DENY_CAUSES`/`isClassifierDenyCause`/`classifierDenyCauseOf`/`classifierDenyCauseDetail`;🔴 同批**删**`classifierUnavailableOf`/`classifierUnavailableDetail`,详见 §32b)、`src/classifierStatus.ts`(`CLASSIFIER_STATUS_STATES`/`classifierStatusOf`/`classifierStatusDetail`)|
175
+ | 15 | **控制面与传输** | 192 | `judgeWebSearchSettings` / `webSearchVerdictFromEnv` / `resolveWebSearchVerdict` / `webSearchVerdictMessage` / `webSearchEndpointForDisplay`(0.82.7 CC-182:每请求联网搜索配置三态判决,与 server ≥7.100.0 判官同判;§99)· `withPrintInitFrame` / `createPrintInitGate` / `printInitRosterSignal` / `decidePrintInitToolFace` / `printInitToolFaceDebugLine` / `PRINT_INIT_ROSTER_WAIT_MS`(0.82.5 CC-169:print 车道 init 帧工具面名册优先 —— 流包装器、判定闸、名册信号三态分类、判定口、留痕措辞单源、等待上界;§97)· `projectRegistryQuotaUsage` / `quotaAmountText` / `registryQuotaDoctorDetail`(0.82.0 CC-150:云控制面 quota/usage 回体的纯投影 —— 两种 null 的正面事实与「判不出」三分,措辞零 0;§92)· `pushSessionBundle` / `pullSessionBundle` / `importSessionBundle` / `APIError`(0.79.0 CC-128:会话 bundle 面四名原样转口,与 `AgentClient` 同一张存量转口表;§85)· `readMcpCapabilities` / `probeMcpServers` / `classifyMcpProbeFailure` / `MCP_PROBE_REFUSAL_CAUSES` / `MCP_PROBE_UNKNOWN_WHYS`(0.79.0 CC-74:无 run 可读的 MCP 状态面两只调用口 + 单一失败判官 + 两张闭集词表;§85)· `readEntryProvenance` / `eraseMemoryEntries` / `listExternalOriginEntries` / `listOriginClearances` / `clearEntryOrigin` / `classifyMemoryFailure` / `externalOriginCoverage` / `MEMORY_VERB_REFUSAL_CAUSES` / `MEMORY_VERB_UNKNOWN_WHYS`(0.78.1 CC-97 b:记忆治理面五动词调用口 + 单一失败判官 + 两张闭集 + 覆盖面判词;§83)· `readMemoryExportRows` / `scopeExternalOriginVerdict` / `readMemoryEraseReceipt` / `memoryEraseCounts` / `memoryEraseErasedNothing` / `eraseNotFoundHistoryVerdict` / `memoryEraseReplayPosture` / `readMemoryOriginClearanceReceipt` / `MEMORY_ENGINE_REQUIRED_CODE`(0.76.1 CC-97a:记忆条目面三个回体的窄读口 + 判词口;「空答绝不读作本店干净」的代码落点;§77)· `readMcpLiveness` / `mcpLivenessRollupOf` / `mcpEngineLegHealthOf` / `mcpEngineLegHealthDetail` / `MCP_LIVENESS_STATES`(0.76.1 CC-36:`wiring_manifest.mcp[].liveness` 活性观察的行级三向读口 + 腿级四读数判词 + 措辞铸点;§77)· `readRunCancelContext` / `classifyRunAbortCause` / `RUN_CANCELLED_CODE`(0.74.3 CC-71:run 取消现场与成因;§71)· `cancelConflictFromError` / `cancelConflictContent` / `usageWindowExhaustedFromError` / `usageWindowExhaustedContent` + `CONFLICT_APPROVAL_SETTLED` / `CONFLICT_RUN_NOT_RUNNING`(0.73.1 CC-56:cancel 409 按码分家 + 提交面 429 用量窗;§63)· `reconnectMcpServer` / `projectMcpReconnectResult` / `classifyMcpReconnectFailure` / `projectMcpReconnectCapability` / `mcpReconnectOutcomeDetail` + `MCP_RECONNECT_OUTCOMES` / `MCP_RECONNECT_TRANSACTION_NOTICE`(0.72.9 CC-30:会话内 MCP re-dial 消费口,outcome 三态 / unsupported 恒五键 / 名册按 toolNames 在场性;§56)· `readAutoConsolidationArmed`(0.72.9 CC-39②:memory-status `autoConsolidationArmed` 三态,缺席 = 老 server 判不了;§56)· `steerFollowIntent`(0.72.6 CC-40:steer 后续听意图三态 tail / after-decision / after-wake,按 `SteerReceipt.delivery` 判;§53)· `projectWebSearchBackendCapability` / `observedWebSearchBackend` / `noteEngineCapsForWebSearchBackend` / `forgetWebSearchBackendReading` / `webSearchBackendDoctorDetail` + `WEB_SEARCH_BACKEND_NONE`(0.72.5 CC-31:`capabilities.webSearch.backend` 四态读面 —— 键缺席 = 老引擎判不了 ≠ `none` = 引擎明说没有默认后端;与 `sqlEngineCapability` / `writeProtectionCapability` 同构;§52)· `resumeContextUnavailableFromError` / `resumeContextUnavailableContent`(0.72.1 CC-33:409 `conflict.resume_context_unavailable` 读数 `{ code, staleAfterSec?, runId? }` + 三句人话;§48)· `mcpEngineLegPresence`(0.71.0 CC-19:引擎侧 MCP 在场三值,只从面板视图求;§42)· `ControlRouter`(+ `ControlSafetyError`)· `fetchMcpPanel`(0.69.0:经 sdk `sessions.mcp` 取体 + 投视图,不裸 fetch)· `projectMcpPanel` + `mcpPanelLastLegDetail`(0.68.2 CC-03:`GET /v1/sessions/:id/mcp` 面板体防御读视图 + `lastLegMcp` 一行措辞铸点;缺席 = 键不铸、读不懂 = `lastLegMcpUnreadable`、禁与 `servers[]` 对账)· `makeEngineWireClient` + `resolveWireAuth` · `installEngineWireTarget` · `diagnoseSseIdleTear` / `isSseIdleError` · `attemptActiveRunSelfHeal` + `activeRunBusySignal` + `activeRunSelfHealRow` / `activeRunBusyHeadlessRow` · `kickEngineCapsProbe` / `engineCapTrue` / `invalidateEngineCaps(baseUrl, probe?)`(#307 S25:引擎温切后的 caps 生产失效口 —— kick 自带幂等闸,同 baseUrl 重启后不显式失效就永远读到旧引擎那一版能力位;调用方 = 壳的 respawn/restartEngine。🔴 **推荐两参形**:第二参给替代探测则「推进代际 + 注册新探测」在同一同步块内完成,失效与下一次 kick 之间那个「等待者读到未判」的窗按构造不存在;单参形保留给「只丢缓存、这一刻没有替代探测」的调用方,那种情形下读到未判是诚实结局) · `engineCapValue`(S-131,0.59.0:能力位的**四态**通用读口 `unobserved`/`not_reported`/`null`/`value` —— 既有三口把四种「读不出」全折成 fail-closed 一档,对**放行**问题是对的、对**读面/诊断**问题是错的:`null`(引擎明确说没有,正面事实)会与「老引擎不报」「还没探到」在屏上同形。`value` 位刻意不做形校验,形归各能力位自己的窄读器,详见 §23b)· `projectSqlEngineCapability` / `observedSqlEngine` / `noteEngineCapsForSqlEngine` / `forgetSqlEngineReading` / `sqlEngineDoctorDetail`(S-131,0.59.0:`Capabilities.sql`(server ≥7.60.0)的四态读面**从壳侧上收** —— 归层债,0.58.0 时它长在壳里正是因为包侧没有嵌套对象读口。🔴 **导出名与壳侧那份逐字同名 = drift-lock**;`txnMode: null` 是铸点域内的合法值不是畸形;换代失效口清成未观测而不是留旧值,详见 §23b)· `mapBrainStatusToRetry` · `waitForClaimRelease` + `CLAIM_RELEASED_STATES` / `CLAIM_HELD_STATES` · `atMostOnceFailureClass` / `readSteerDelivery` · `clearRunningChoiceOffer`(Inkglow-1085 P0b①:「Do nothing」登记的清口 —— 端的「重新打开操作菜单」入口;登记在场时 attemptActiveRunSelfHeal 不整卡重弹,not-parked 结局带 `alreadyOffered: true` 判别位,端据此降级渲一行)· `INTERACTIVE_WAY_OUT`(默认出路串单源)· `engineSessionParamFor`(design/285 批 0:`?session=` 派生的 **per-key** 形 —— `hostSessionFor(sessionKey)?.currentSessionId()` + [1501] 空串归一;零参 `engineSessionParam()` = 默认槽兼容层,取值链逐字等价)· `normalizeWirePrincipal`(A-028.10:principal 在场性 trim 原语 —— 全空白=缺席不发头,engineWireTarget 两臂/makeEngineWireClient/壳 livePrincipal 同尺)· `readSessionMemoryStatus` / `classifyMemoryStatusFailure` / `readCaptureOptOut` / `readLastCapture`(S-53 会话记忆姿态读面,0.48.0:失败分诊**码优先**——两个 404 分道 `not_found.session` / `not_found.route`,无码 404 不猜落 failed;五键逐键缺席语义两个合读器,`lastCapture` 三态的判别材料是 `committedCount` 不是本键;IO 归宿主注入 `MemoryStatusClientLike`,详见 §11) · `classifyTurnWireError` / `isWireTransportError` / `isPreStreamDrainingReject` / `isResumeAtRejection` / `drainingRetryDelayMs` / `scenarioDenyFromError` + `WIRE_NETWORK_ERROR_PATTERN`(A-028.11/.13:turn 错误分型判定半场,人话文案与渲染归端)· `resumeRetryLaterFromError`(L-102,0.57.0:resume 族**时间性拒绝**二码的判型半场 —— 这一族里唯一**带得出「等多久」**(`retryAfterSec`)的两个码。🔴 闭集**不是**「哪些码可以等」的名单:同族 `resume.row_recycling` 同样可等(窗口自清)只是没有秒数 ⇒ 本读口返回 `null` 只意味着没命中这两码,详见 §21) · `projectWriteProtectionCapability` / `observedWriteProtection` / `noteEngineCapsForWriteProtection` / `forgetWriteProtectionReading` / `writeProtectionDoctorDetail` / `projectWriteProtectionPosture` / `writeProtectionPostureDetail`(S-138,0.60.0:`Capabilities.writeProtection` (engine ≥7.63.0)的**四态**读面 + operator 面行表 —— 与上面 S-131 那一格**同构同纪律**。🔴 三位刻意不合成一个布尔;`not_reported` **不是**「这台部署没有写保护表」(座位缺席恰是缺省表在岗);逐行 name/kind 走**最小披露**只上 operator 面,详见 §24e)· `projectReadFacePosture` / `readFacePostureDetail` / `readFaceDisagreement`(S-167,0.61.0:operator 面 `diagnostics.wiring.readFace`(engine ≥7.65.0)的窄读器 —— 与上面S-138 那一格**同构同纪律**。🔴 三句「答不出来」逐字互异且没有一句等于「没有 READ 档」;`source` 按开集读;与租户面 `capabilities.readFace` 刻意不合流,只带一个纯比较函数,详见 §25)| 上行通道的**监管**半场(submit / steer / kill / 队列命令定序)+ 传输构造、caps 探测、SSE 断流分诊、**409 active-run 自愈** | `src/controlRouter.ts`、`steering.ts`、`sseIdleTriage.ts`、`retryStatus.ts`、`diagnostics.ts`、`engineWireSdk.ts`、`engineWireTarget.ts`、`src/principalWire.ts`、`src/wireErrorTriage.ts`、`engineSessionParam.ts`、`engineCapsCache.ts`、`liveInitToolFace.ts`、`adapter/activeRunSelfHeal.ts`、`src/sessionMemoryStatus.ts`、`src/writeProtectionCapability.ts`、`src/webSearchBackendCapability.ts`、`src/mcpReconnect.ts`、`src/readFacePosture.ts` |
176
+ | 16 | **引擎词汇表与包自检** | 132 | `isCorruptSessionError` / `isCorruptSessionResult` / `isCorruptSessionRunRow` / `isCorruptSessionCode` / `corruptSessionContent` / `CORRUPT_SESSION_ERROR_CODE`(0.85.0 CC-217:会话存档读不出在 HTTP 拒体 / 终局因由 / run 行三处载体同一判定 + 单源人话;§109)· `readSessionRecordsSkipped` / `sessionRecordsSkippedNote`(0.85.0 CC-217:服务端自铸通告 `session.records_skipped` 的事实读器,计数读不出答 `'unknown'` 不折 0;§109)· `sessionDeleteConflictFromError` / `sessionDeleteConflictContent` / `CONFLICT_SESSION_CHILDREN_ALIVE`(0.85.0 CC-243:删会话 409 按码分三形与三句;§109)· `STATUS_DERIVED_COARSE_CODES` / `isStatusDerivedCoarseCode`(0.85.0 CC-243:服务端分发器按状态补的粗码识别表与判定,以铸点为准;§109)· `SERVER_NOTICE_AUDIENCE` / `readInstructionsSourceChanged`(0.84.1 CC-213:服务端自铸通告码 → 受众两行,在册判据与受众读口同认;`instructions.source_changed` 的事实读器;§108)· `readEngineNoticeFacts` / `ENGINE_NOTICE_FACT_READERS`(0.84.1 CC-214:按码派发的 typed 通告事实口 + 派发表,七只读器八个码,只有受众 `user` 的六码属用户面;§108)· `PARKED_RESUME_STARTUP_FAILED` / `parkedResumeStartupFromError` / `parkedResumeStartupContent`(0.84.1 CC-225:停泊审批决断 422 的码常量、读口与按成因分说的一句话,同一个决定不重发、deny 照开;§108)· `CONFIG_LEGACY_TOOL_NAME` / `legacyToolNameFailureNoteOf`(0.84.1 CC-229:拒启码常量与启动失败出路句,只按码判,列四处可能的位置;§108)· `readReadRootGrantNotice`(0.84.0 CC-185:读目录授权两枚结论通告 `approval.read_root_granted` / `approval.read_root_grant_rejected` 的事实读口,按 `toolCallId` 对卡,没有 granted 通告 = 什么都没加;§107)· `APPROVAL_MANDATE_WORDS` / `isApprovalMandateWord` / `approvalMandateDetail`(0.83.2 CC-195:强制位站在哪一个词上的六词闭集,与引擎型面编译期双向钉;成员判据;每词一句说明;§102)· `resumePolicyBlockFromError` / `resumePolicyBlockContent`(0.82.1 CC-154:续跑折叠码 `resume_blocked_by_policy` 自己的读数与措辞,原码三态;§93)· `corruptStoredRowWhere` / `corruptStoredRowContent`(0.82.0 CC-156:续跑上下文坏档时引擎点名的那一行的读口与措辞单源;§92)· `effectiveWireErrorCode` / `RESUME_POLICY_FOLD_CODE`(0.82.0 CC-154:政策折叠码与「按原码判」的取码单源;§92)· `SETTLEMENT_KIND_WORDS` / `ccToolDenialKindForSettledBy` / `ccToolDenialKindForToolEnd`(0.80.0 CC-133:结算词十三词镜像 + 「谁结算的」→ CC 分类词单铸映射 + `tool_end` 帧合流读口;§87)· `CC_TOOL_DENIAL_KINDS` / `isCcToolDenialKind` / `isCcToolDenialKindADenial` / `isGateDeniedByWord`(0.79.0 CC-125:上游转录记录键 `toolDenialKind` 七词镜像 + 两只谓词 + `DeniedBy` 十词成员谓词;§85)· `mandatedApprovalDetail`(0.79.0 CC-110:「这张卡清不掉」那一句的唯一铸点;§85)· `CONFIG_MEMORY_PROJECT_KEY_SPELLING` / `CONFIG_MEMORY_WRITE_SCOPE_MISMATCH`(CC-96:记忆面两个**构造期**拒码,进既有 `config.` 族识别表;400 拼写 / 409 冲突,分诊归引擎)· `TASK_NOTIFICATION_TERMINAL_STATUSES` / `isTaskNotificationTerminalStatus`(0.72.12 CC-50:通知自己的四终态词,含 `cancelled`;与 run 级终态表两张表;§59)· `ENGINE_NOTICE_CODES` 71(0.83.0 CC-186:引擎 7.30.0 / 7.31.0 +2 `config.context_settings_swapped` / `config.secret_env_scrubbed`,均 operator;§100。历史:0.82.1 69、0.79.0 68、0.72.11 CC-49 67 —— core 7.23.0 +1 `config.write_protection_unresolved`,operator,兄弟码 `target_view_absent` 之后;§58)· `MCP_REDIAL_OUTCOMES` / `readMcpServerRedialed`(0.72.7 CC-42:通告 `mcp.server_redialed` 事实读器,outcome 三词闭集、added/removed 计数;§54)· `RESUME_CONTEXT_UNAVAILABLE`(0.72.1 CC-33;不进两个 resume 闭集:不可等、也不是换参数)· `RESUME_REOPEN_CODES` / `RESUME_ENV_FAILED` / `RESUME_TOOL_UNAVAILABLE` / `RESUME_TOOL_CONTRACT_MISMATCH` · `resumeReopenFromError` / `resumeReopenContent`(0.71.3 CC-06:resume reopen 族三码闭集 + 读口 + 三句,§45)· `readSkillsListingTruncated`(0.70.0 CC-04:`skills.listing_truncated` 事实读器,§39)· `CONFIG_REFUSAL_CODES` / `isConfigRefusalCode` · `DECIDE_WORKFLOW_LANE_CODES`(+ 三个具名码;`/decide` workflow 车道,三条出路刻意不合并,详见 §30h)· `STOP_CONFLICT_CODES` · `isInterruptedToolEndCode` · `isRewindFamilyCode` · `CLIENT_VERBS` · `compensationSplitViolations` · `DELEGATION_CAP_CODES` / `isDelegationCapCode` / `DELEGATION_CONCURRENCY_CAP` / `DELEGATION_SESSION_CAP`(0.38.0 #318 件④:core 5.48.0 design/323 委派席位到限**两码,处置不对称禁合并** —— 并发帽=**可等**(兄弟结束即有位)/ 会话累计帽=**等也没用**(这条会话的配额用尽))· `CONFIG_DELEGATION_ENTRY_CAPS`(同批入 `CONFIG_REFUSAL_CODES` 识别表)· `delegationCapDispositionOf` / `MCP_SERVER_REVOKED`(0.39.0 载体到货消费件:core 5.50.0 补 `{ error: code, code }` 孪生拼法后两码真上 `tool_end.errorCode`,0.38.0「先立词不落消费分支」的已知局限自此解除;处置轴 `wait-for-slot` / `reuse-existing-or-await-reap` 机器可读(累计帽=retained-window 帐,行回收配额即回,处置=SendMessage 复用,**非**「换会话/永久耗尽」——0.38.0 段该句系勘误),未知 `delegation.*` 码 ⇒ `undefined`;`mcp.server_revoked` = 操作员 mid-session 吊销 server 后的工具面本地闸(被吊销的 server **名**今天不过 wire 境:detail.server 是进程内位,抬升腿只 lift code——归因渲染候 core 补 typed detail,已点名);载体门 = engine-vocab G3 腿锚 core dist 铸点)· `CAPABILITY_SELF_ORCHESTRATION_REQUIRED`(S-81,server 7.57.0:提交面的 selfOrchestration 准入拒绝码。🔴 **复用码** —— 与其它 `capability.*` 501 同体形而处置不同,消费点必须按**恰等**判、绝不放宽成前缀判;判型与「去键重发一次」归 `src/selfOrchestrationDenial.ts`,详见 §13) · `GATE_PARKED_ERROR_CODE`(0.60.0:「门把这次调用 park 了」的机读码单源 —— `frameRouter` 的连坐/中断判据与 `gateOutcome.isGateParkedToolEnd` 读同一个常量;真机黑盒直证 park 短路帧上**没有 `gate`**,这个码是那一形唯一的信号,详见 §24c)| 三端分臂共用的**去字面化** `errorCode` 词表(病根正是三端各抄一份字面);编译期 verb 闭合门;搬迁补偿登记表 | `src/engineErrorCodes.ts`(计数以 `scripts/public-export-baseline.json` 为准,别手抄;A-028.11/.13 补 `DRAINING_ERROR_CODE`/`SCENARIO_NOT_ALLOWED_ERROR_CODE`/`RESUME_AT_ERROR_CODE_PREFIX`;#318 件④ 补 `delegation.*` 族四位 + `config.delegation_entry_caps`;0.39.0 补三新码消费件三位);S-81 补 `capability.self_orchestration_required` 一位;L-102 补 `resume.*` 时间性拒绝二码 + 闭集 `RESUME_RETRY_LATER_CODES` 三位)、`src/classifierVerdictWire.ts`、`src/compensations.ts`、`src/clientSlice.ts`;**0.67.0 补锚**(这三件的导出一直计在本域,而本表此前没有它们的锚行 —— 如实补上,不是搬家):`src/gateVocabulary.ts`(`GATE_DENIED_BY_WORDS`/`gateDeniedByDetail`/`ASK_ORIGIN_WORDS`/`askOriginDetail` + 🆕 `RULE_STORE_UNREADABLE_KINDS`/`isRuleStoreUnreadableKind`/`ruleStoreUnreadableDetail`,详见 §32d)、`src/autoModeUnavailable.ts`(`AUTO_MODE_UNAVAILABLE_CAUSES` + 🆕 `CLASSIFIER_DENY_CAUSES`/`isClassifierDenyCause`/`classifierDenyCauseOf`/`classifierDenyCauseDetail`;🔴 同批**删**`classifierUnavailableOf`/`classifierUnavailableDetail`,详见 §32b)、`src/classifierStatus.ts`(`CLASSIFIER_STATUS_STATES`/`classifierStatusOf`/`classifierStatusDetail`)|
177
177
 
178
178
  🔴 **`engineErrorCodes` 的开集纪律**(该文件头注逐字):这些 `ReadonlySet` / 前缀谓词一律是**识别表**,
179
179
  回答的是「我认不认得这个码」,**绝不是**「合法码只有这些」。消费点 `switch` **必须留 `default`**,
180
180
  未知码**原样透传 + 落诚实兜底臂** ——「塌进已知形 = 替 server 编了一个它没说的原因」。
181
181
 
182
+ ### 2z. 已退出公面的名字(退役名录)
183
+
184
+ 冻结段是历史记录,其中提到的名字以本名录为准。冻结段 = 已发版本的 `§NN` 段(标题里带那一版的版本号);那些段不回改,段里可能仍把下表的名字写成可用导出 —— 以本表为准:下表每个名字都已不在根入口,`import` 会扑空。本表只列运行期名字;型面照旧的,在「改用什么」里写明。
185
+
186
+ | 退役 | 名 | 退出版本 | 改用什么 |
187
+ |---|---|---|---|
188
+ | 🔧 退出公面 | `DENIAL_LIMIT_KINDS` | 0.85.0 | `@sema-agent/sdk` 根入口的同名运行期值(同一个数组);型面 `DenialLimitKind` 在本包照旧导出 |
189
+ | 🔧 退出公面 | `engineCapNestedTrue` | 0.85.0 | 无公开替代(退出时四端产品源码零具名 import;包内能力读口照旧用它) |
190
+ | 🔧 退出公面 | `shortTaskLabel` | 0.85.0 | 无公开替代(子代卡的短标签由 `adapt()` 铸在卡上,端读卡上的标签) |
191
+ | 🔧 退出公面 | 26 个内部件:`DEFAULT_DENY_REASON` `MAX_HOOK_NOTICE_TEXT_CHARS` `STOP_NOT_LANDED` `STOP_NOT_LOCAL` `STOP_PARKED` `STOP_PARK_ARBITER_UNREACHABLE` `STOP_PARK_RESUME_WON` `clearBgTerminalFacts` `denyReasonForWire` `engineWireDebugEnabled` `isAskTool` `listNotifiedRuns` `listWorkflowCompletionCardsEnqueued` `noteBgOwnerAbsence` `notePlanReviewAnsweredFor` `planReviewArmedKeyFor` `projectDiagnosticsFrame` `registerSubagentContentAlias` `resolveOwnerContext` `surfaceEditNotForwarded` `surfaceRuleArmNotSent` `surfaceRuleArmRejected` `unregisterLocalQuestionResponder` `waitForGateArmedFor` `wireCycleSeq` `wireParentId` | 0.84.0 | 无(包内件,`export *` 放大出去的;退出时四端零具名 import,§107) |
192
+ | 🔧 退出公面 | 23 个常量:`AUTHORITY_ENVELOPE_TAGS` `CANCEL_RELEASE_WAIT_MS` `CATALOG_CACHE_RELATIVE_PATH` `CATALOG_CACHE_STALE_MS` `DEFAULT_CATALOG_TIMEOUT_MS` `DEVICE_CODE_BACKOFF_STEP_MS` `DEVICE_CODE_HTTP_TIMEOUT_MS` `DEVICE_CODE_MAX_LIFETIME_MS` `DEVICE_CODE_MIN_INTERVAL_MS` `HITL_ASK_QUESTION_ID_PREFIX` `HITL_FRAME_CALL_KEY_PREFIX` `LIMITS_ERROR_CODE_PREFIX` `MAX_DENY_REASON_CHARS` `ONE_SHOT_ENV` `PROBE_MAX_TOKENS` `PROBE_PROMPT` `PROMPT_PROFILE_ENV` `TOOL_END_INTERRUPTED_CODES` `WORKFLOW_DEFER_ENV` `WORKFLOW_PARK_BINDING_BROKEN` `WORKFLOW_PARK_NOT_PENDING` `WORKFLOW_PARK_REQUIRES_RUN_STORE` `WORKFLOW_PARK_TRUTH_UNREADABLE` | 0.72.0 | 无(退出时四端零消费;声明留作包内私有,§47) |
193
+ | 🔧 退出公面 | 16 个函数:`clearArmedGateFor` `deriveAgentLabel` `notePlanReviewAnsweredIfDecisiveFor` `onGateArmedFor` `parseBackgroundReceipt` `parseFinalVerifyArgv` `providerApiShortName` `registerArmedGateFromQuestionIdFor` `wireCurrentTool` `wireEditedFiles` `wireParentToolCallId` `wireRetiredBy` `wireStartedCount` `wireStoppedBy` `wireToolUses` `wireTranscriptId` | 0.72.0 | 无(退出时四端零消费;声明留作包内私有,§47) |
194
+
182
195
  ---
183
196
 
184
197
  ## §3 事件投影契约(下行)
@@ -1220,19 +1233,22 @@ respawn/restart 后调 `invalidateEngineCaps(baseUrl, probe?)`(**推荐两参形
1220
1233
  - 🔴 **唯一构造点纪律不破**:relay 形也走 `makeEngineWireClient()`(`src/engineWireSdk.ts`),
1221
1234
  没有第二个铸口。
1222
1235
 
1223
- **今天放宽了的入参面只有两个**(⚠️ 这一条决定端能不能真用上):
1236
+ **今天放宽了的入参面只有两个**(⚠️ 这一条决定端能不能真用上;0.84.1 起另有两处注入口,0.85.0 起子代族再加一处,见表末三行):
1224
1237
 
1225
1238
  | 入参面 | 类型 | 实现锚 | 端怎么用 |
1226
1239
  |---|---|---|---|
1227
1240
  | `EngineWireClientConfig.token` | `string \| { mode: 'same-origin-relay' }` | `src/engineWireSdk.ts` | 自己直调 `makeEngineWireClient({ baseUrl, token: { mode:'same-origin-relay' } })` 的路径可用 |
1228
1241
  | `LiveWorkflowConfig.authToken` | `string \| { mode: 'same-origin-relay' }` | `src/workflowClient.ts`(`createLiveWorkflowSource`) | workflow 活体读面可用 |
1242
+ | `DecidePlanReviewOptions.wire` / `armPlanReviewApproval` `opts.wire` / `ReopenPlanReviewOpts.wire` | `{ client: PlanReviewWireClient; capsBaseUrl?: string }` | `src/hitl/planReviewWire.ts` | 🆕 0.84.1 注入口:把自己的中继 `AgentClient` 交进来,plan-review 三口整条编排(闩 / 双闸 / 去键重发 / 回拉六态 / 结局)在包内跑;版本证据键给 `capsBaseUrl`;这只 client 的 `timeoutMs` 不低于 6 h、建议 `maxRetries: 0`(§108a-9) |
1243
+ | `EngineProbeOpts.client` | `EngineProbeClient` | `src/engineWireSdk.ts` | 🆕 0.84.1 注入口:两只探针直接用它,`timeoutMs` 是 独立落定的截止(到点答「不知道」并中止底层请求;§108) |
1244
+ | 子代族八入口的 `opts.wire`(`fetchEngineSubagentReport` / `tailEngineSubagent` / `fetchEngineTaskOutput` / `stopEngineTask` / `steerEngineSubagent` / `resolveSubagentResumeContext` / `requestEngineCompact` + `onEngineTaskBound` / `fetchDelegatedPrompt`)· 两只行停止门的 `capsBaseUrl` 参 · 会话后台任务停止口 `stopEngineSessionBackground` 的 `opts.wire` | `EngineWireInjection<C>` = `{ client: C; capsBaseUrl?: string }` | `src/engineWireFor.ts`(共用构造点)· `src/subagent/*` · `src/agentSession/engineSessionBackgroundStop.ts` | 🆕 0.85.0 注入口:把自己的中继 `AgentClient` 交进来,子代族编排与会话后台任务停止在包内跑;能力证据键给 `capsBaseUrl`(= `kickEngineCapsProbe` 用的那把);每一发有本包独立落定的截止(读 / 写 60 s),写动词没答复带 `unconfirmed: true`(§109a-2 / 109a-3) |
1229
1245
 
1230
1246
  🔴 **没放宽的那一半(端接之前必须知道)**:`EngineWireTarget.token` 仍是 `string`
1231
1247
  (`src/engineWireTarget.ts`),而 `installEngineWireTarget()` 是**非 Node 宿主唯一的装配入口** ——
1232
1248
  包内经 `engineWireTarget()` 取址再构造 client 的那 **10 处**(plan review ×2 / 子代 tail / steer /
1233
- output / compact ×2 / taskHandle ×2 / delegated prompt)因此**装不进** relay 形。详见缺口 **P-28**。
1234
- 浏览器宿主今天能走通的只有上表那两条自带入参面的路径;走 `engineWireTarget()` 的动词
1235
- 在同源反代部署下**没有合法凭证形**可传。
1249
+ output / compact ×2 / taskHandle ×2 / delegated prompt)因此**装不进** relay 形 —— 🆕 0.84.1 起 plan review 那 2 处有注入形,🆕 0.85.0 起子代族 8 处与 resume 族 3 处也有注入形(上表末三行);`EngineWireTarget.token` 本身仍是串形(有意不放宽)。详见缺口 **P-28**。
1250
+ 浏览器宿主今天能走通的是上表那几条自带入参面 / 注入口的路径;**不交注入连线**、走 `engineWireTarget()` 的子代族动词
1251
+ 在同源反代部署下仍**没有合法凭证形**可传(失效形按下两表 B / C 档)。
1236
1252
 
1237
1253
  🔴 **没放宽的还有第二个入参面**(0.30.0 发包扫描补记 —— 此前本节与 P-28 只点了上面那 10 处,
1238
1254
  读者会以为「不经 `engineWireTarget()` 就没事」):`EngineProbeOpts.authToken` 仍是
@@ -1241,7 +1257,7 @@ output / compact ×2 / taskHandle ×2 / delegated prompt)因此**装不进** rel
1241
1257
  它们在浏览器 relay 部署下同样构造不出 client,失效形属下表 **C 档(零日志零信号)**:
1242
1258
  前者 `return undefined`(= 「不知道有没有这个能力」,不是 `false`),后者 `return null`。
1243
1259
  ⚠️ 端**不要**把这两个 `undefined`/`null` 读成「引擎不支持」——它们在 relay 部署下**恒**如此,
1244
- 与引擎能力无关;正位解同 P-28(放宽入参面 + 透传),**不许端侧侧路补救**。
1260
+ 与引擎能力无关;正位解同 P-28(放宽入参面 + 透传),**不许端侧侧路补救**。🆕 0.84.1:`EngineProbeOpts.client`(`EngineProbeClient`,`AgentClient` 直接满足)是中继宿主的正位入口 —— 交了注入 client 的宿主上两只探针照常读(`timeoutMs` 是独立落定的截止),上面的「恒 `undefined` / `null`」只对不交的宿主成立(§108)。
1245
1261
 
1246
1262
  ⚠️ **失效形:构造失败一律吞成 `null`,但「之后怎么办」逐点不同 —— 别当成一律静默**。
1247
1263
  `makeEngineWireClient()` 的构造被 SDK 守卫拒时走 `catch { return null }`(`src/engineWireSdk.ts`),
@@ -1256,7 +1272,7 @@ output / compact ×2 / taskHandle ×2 / delegated prompt)因此**装不进** rel
1256
1272
  🔴 **A 档的用户可见性是有前提的,别当成保证**(#252 复审 R2 命中):`enqueuePlanReviewOutcome()`
1257
1273
  (`src/notifications.ts`)在**队列口没装**时直接 `return false`;装了但**没有 `enqueueMetaPrompt`** 时
1258
1274
  `queuePortMisses++` 后 `return false`。`decidePlanReview` 对 `false` 只再补一行
1259
- `hostLog('error', 'planReviewWire: outcome enqueue MISSED …')`,投递口抛错则只落一行 `debug`。所以:
1275
+ `hostLog('error', 'planReviewWire: outcome enqueue MISSED …')`,投递口抛错则只落一行 `debug`。🆕 0.84.1:`decidePlanReview` 的 `onOutcome` 回调(§108)是与队列口**并行**的第二条可见通道 —— 宿主接了回调时,队列口缺席不再打 error 级 MISSED(改一行 debug),结局照样交到宿主手里;两条都没有才照旧 error 级。所以(不接回调时):
1260
1276
 
1261
1277
  | 结局 | 用户看不看得见 |
1262
1278
  |---|---|
@@ -1563,7 +1579,7 @@ CHANGELOG 0.29.0「已知局限」段与相应 JSDoc 都有成文。**别在读
1563
1579
  | **P-25** | 结构 | 类型小环 1 条:`seam → turnUsageToModelUsage → adapter/types → seam` | `docs/REFACTOR-LEDGER.md` 在册 | 纯类型环,无运行时影响;端无动作 |
1564
1580
  | **P-26** | **已落**(0.29.x,2026-08-12) | seat requestId 域的**正向铸口**已在位:`toolPermissionRequestId(domain, id)` —— 往返性成契约(铸出的键必被读口 `toolPermissionRequestIdDomain` 认回同域,校验器同表放行);三类坏入参 fail-loud(未登记域含忘尾冒号 / 空串与非串 id / id 自带域前缀的双前缀键),**绝不静默吐坏键** | `src/seatContract.ts`(`toolPermissionRequestId` / `TOOL_PERMISSION_REQUEST_ID_DOMAINS` / `toolPermissionRequestIdDomain`) | 铸 requestId 一律 `toolPermissionRequestId(域, id)`,**不要**再手抄 `` `plan:${id}` `` 类模板串(手抄的失效形是运行期路由到不存在的目标,编译期不响) |
1565
1581
  | **P-27** | 立票设计件(web [C1] 疑点③,族A 二段票同批) | `ToolPermissionDecision` **无 note 席位**且座位宿主无 caps 缓存读口 ⇒ #229 回决备注在两座位端(web/desktop)**结构性无法供给**。修形二选一未裁:decision 形补 `note?` + 能力位随 `ToolPermissionRequest` 下发,或宿主侧统一判 | `src/seatContract.ts`(`ToolPermissionDecision`,682 行域) | 座位端今天**不要**渲 note 输入位(渲了也送不出去=假 affordance);候本条落地随提货单换 |
1566
- | **P-28** | 🔴 med(浏览器面) | ⚠️ 2026-08-14 补记:除下面那 10 处外,**第二个未放宽的入参面** `EngineProbeOpts.authToken`(`src/engineWireSdk.ts`)另喂 2 处探针(`agentsWireCaps.ts` 的 `engineSupportsTaskAgents` ⇒ `undefined` / `liveInitToolFace.ts` 的 `probeScenarioTools` ⇒ `null`,均属 C 档静默),合计 **12** 处 —— 见 §5d 末尾那段。 **`same-origin-relay` 只放宽了 2 个入参面,装配入口没跟**:`EngineWireClientConfig.token` 与 `LiveWorkflowConfig.authToken` 收了 `\| { mode:'same-origin-relay' }`,而 `EngineWireTarget.token` 仍是 `string` —— `installEngineWireTarget()` 恰恰是**非 Node 宿主唯一**的装配入口。经 `engineWireTarget()` 取址再构造 client 的 **10 处**(`hitl/planReviewWire.ts` ×2 · `subagent/engineSubagentTail.ts` · `engineSubagentSteer.ts` · `engineSubagentOutput.ts` · `engineCompactWire.ts` ×2 · `engineTaskHandleWire.ts` ×2 · `engineDelegatedPrompt.ts`)在同源反代部署下**没有合法凭证形可传**。⚠️ 失效形**逐点不同**(§5d 末两表:A 响亮 + **有条件**用户可见 = `decidePlanReview`,可见性取决于通知队列口装没装 / B 结构化 reason = steer 与 taskStop / C 无条件静默 = 其余七处),但**构造失败一律吞成 null、从不抛异常** | `src/engineWireTarget.ts`(`EngineWireTarget.token`)· `src/engineWireSdk.ts`(`makeEngineWireClient` 的 catch 臂)· §5d 的两表 | 浏览器同源宿主今天**只能**走 §5d 上表那两条自带入参面的路径(直调 `makeEngineWireClient` / `createLiveWorkflowSource`);走 `engineWireTarget()` 的子代与 plan-review 动词**别指望在 relay 部署下发得出去**,也**不要**把「动词没反应」读成「引擎没这个能力」(⚠️ plan-review 那条**只在通知队列口装上时**才到达用户,见 §5d 末表 —— 队列口没装就退回零用户通道,端的兜底告知别急着撤)。🔴 正位解在包侧(放宽 `EngineWireTarget.token` + 10 处透传),**不许端侧侧路补救**(跨仓缺陷源头修复);要它落地按 [C162] 令④ 回 C 板 |
1582
+ | **P-28** | ✅ **已解(注入形)**:plan-review 半场 0.84.1、子代族半场 0.85.0 | `same-origin-relay` 只放宽了 `EngineWireClientConfig.token` 与 `LiveWorkflowConfig.authToken` 两个入参面,`EngineWireTarget.token` 仍是 `string`(`installEngineWireTarget()` 是非 Node 宿主唯一的装配入口;有意不放宽)。**0.84.1 起**:plan-review 三口(`decidePlanReview` / `armPlanReviewApproval` / `reopenPlanReviewCard`)与两只探针(`engineSupportsTaskAgents` / `probeScenarioTools`)收注入 client(§108)。**0.85.0 起**:子代族八入口(报告 / 尾随 / 任务输出 / 停止 / 转向 / resume 取址 / 压缩两口 / 委托提示)与两只行停止门收注入连线 `wire: { client, capsBaseUrl? }`,经共用构造点(§109a P-1–P-9)—— 浏览器同源中继宿主把自己的中继 `AgentClient` 交进来即可,包内不接触任何凭证。仍只吃已装目标的只有「不交连线」那一形(失效形按 §5d 末两表 B / C 档,构造失败吞成 `null`、不抛);十五只能力读器的默认参读目标槽,端显式传 `baseUrl` 即可(不是缺口) | `src/hitl/planReviewWire.ts` · `src/engineWireSdk.ts`(`EngineProbeOpts.client` / `EngineWireInjection`)· `src/engineWireFor.ts`(共用构造点)· `src/engineWireTarget.ts`(`EngineWireTarget.token`,未动)· §5d 的两表 | 浏览器同源宿主:plan-review、两只探针与子代族动词都走注入连线(§108d / §109d);不交连线时**别指望在 relay 部署下发得出去**,也**不要**把「动词没反应」读成「引擎没这个能力」 |
1567
1583
  | **P-29** | low(自检面) | **通知队列口没有存在性读口**:审批卡口有 `hasApprovalCardPort(For)`、HITL 面有 `hitlHostSurfaceFor`、宿主端口族有 `hostSettings()` 等无副作用读口(见 §5a 的 (a) 表),**唯独 `installNotificationQueuePort()` 没有对偶谓词**。而它的 `notificationQueuePortMisses()` 与同族几个 miss 计数一样**初值为 0**,只有真发生过一次「用到了但没装」才递增 ⇒ 「完全没装 + 还没有任何投递」照样是 0。拿它做**启动装配自检**必然假绿 —— §5a 此前正是这么写的(#252 复审 R3/R4 命中,已按端口拆成「存在性读口」与「回归探针」两类) | `src/notifications.ts`(`installNotificationQueuePort` 无对偶读口;`queuePortMisses` 初值与 `port()` 的 null 分支) | 队列口:按 §8-B 真调 `installNotificationQueuePort()`,miss 计数只当**跑过真流量之后**的回归探针用;其余端口按 §5a (a) 表用各自的存在性读口做启动校验。要队列口的读口按 [C162] 令④ 回 C 板提(正位解在包侧:补一个 `hasNotificationQueuePort()` 谓词) |
1568
1584
  | **P-30** | med(HITL 路由面) | **durable 审批腿不按 `gateKind` 路由,且取行有「同 taskId 任意行」回落** (0.30.0 发包扫描 对抗复审 finding① 坐实,**非本窗引入**):`findPendingForTask` 在工具名谓词无命中时走 `?? rows.find(r => r.taskId === taskId)`,而 `surfaceFsApprovalAndDecide` 拿到行之后**不校 `gateKind`** ⇒ 同一 task 上同时停着 `plan_review` / `resource_limit` 行时,会弹出一张 `toolName` 为空串的**工具审批卡**。⚠️ **不会误批**(server 侧 fail-closed):本腿打的是 `POST /v1/approvals/:sessionId/decide`,非工具门在该端点上回 **409 `gate_not_tool_approval`**(SDK `dist/errors.d.ts`;⚠️ **不是** `gate_not_resumable` / `gate_not_plan_review` —— 那两个分别是 `/resume` 与 plan-review 端点的守卫,2026-08-14 对抗复审 R2 订正本条初稿的错码)。🔴 **但后果不止「一次失败的决断」**:decide 抛错 ⇒ `surfaceFsApprovalAndDecide` 折成 `{kind:'failed'}` ⇒ `parkResolver` 走 fail-soft 结束**本次客户端 turn**;而 server 侧 checkpoint 因为 fail-closed **没被消费**,run/session 仍 suspended、仍持 claim ⇒ 重试还会再撞一次。⚠️ **终帧按入口分两形,排障别只等一个码**(2026-08-14 对抗复审 R3 订正本条初稿的单一描述):① **初始 park 入口**(`done{…park…}` 经 `frameRouter.routeDone` 进来,`park.pendingDone` **在场**)⇒ 先 `led.flushHeld()` 吐出 park 期被 HOLD 的**毒化帧**(`tool_end{isError:true, output:'Operation aborted'}`,`frameRouter.ENGINE_ABORT_TOOL_RESULT`),再原样回吐那条 `done` —— **没有**合成 `failed` 终帧、**没有** `hitl_unanswered` 错误码,可观察到的失败信号只有那条 isError 的 `tool_end`。⚠️ **它与「用户真按了拒绝」可以分辨,按 `output` 分**(2026-08-14 对抗复审 R5 订正本条初稿的「同形不可分」;**0.43.0 起是三分不是两分**,见下):fail-soft 这条是 `flushHeld()` 吐出的**毒化帧**,`output` 逐字是 `ENGINE_ABORT_TOOL_RESULT`(`'Operation aborted'`);真 deny 走 `frameRouter` 的 `denied-call` / `deny-stamp-next` 臂,`output` 被改写成 `HITL_REJECT_MESSAGE`(CC `REJECT_MESSAGE` 逐字)。🆕 **0.43.0 新增第三形(#323 症状②)**:fail-soft 的原因若是**用户在门卡上中断**(`GateOutcome.kind === 'aborted'`,= 用户按 Esc/Ctrl+C),同一批毒化帧的 `output` 被归一成 `HITL_INTERRUPT_MESSAGE_FOR_TOOL_USE`(CC `[Request interrupted by user for tool use]` 逐字,公面导出)——`isError` / `errorCode`(含 `gate.parked`)/ `_sema_collateral_abort` 等机读位**一个都不改**。⇒ 端做归因的 `output` 三分:`'Operation aborted'` = 非中断原因的 fail-soft(卡面不可用 / no_pending / 传输失败)· CC 中断串 = 用户中断 · CC REJECT 串 = 用户真拒绝。端**不要**再假定「fail-soft ⇒ 必是引擎原文」;② **续流 / durable re-attach 入口**(`suspended` 进来,无 `pendingDone`)⇒ 才合成 `failed{errorCode:'hitl_unanswered'}`。⇒ 端做告警/埋点时**不要**只锚 `hitl_unanswered`,①那条路径上它根本不出现。⚠️ 定性要分清:这条 fail-soft 链是 durable 腿**通用**的失败路径(设计如此 —— 替代方案是谎报成功,更坏),**不是**本缺口独有;本缺口的**增量**是「弹了一张 `toolName` 为空的卡 + 发了一次注定 409 的 decide + 把用户的一次表态浪费掉」 | `src/hitl/hitlBridge.ts`(`findPendingForTask` 的第二条 `rows.find`)· `src/hitl/toolApprovalWire.ts`(`surfaceFsApprovalAndDecide` 全程零 `gateKind` 读)· 常驻登记见 `scripts/run-durable-card-display-keys-test.mjs` ⑦ 段 `gateKind` 那条未投影理由 | 端**不要**把「durable 卡弹出来了」读成「这一定是个工具门」;拿到 `toolName` 为空串的卡按异常处置、别渲成可决断卡。🔴 正位解在包侧(本腿按 `gateKind` 严格路由 + 回落收窄),要同批想好 pre-`gate_kind` 历史行 `gateKind` 缺席时的降级 —— 属独立设计件,按 [C162] 令④ 回 C 板提 |
1569
1585
 
@@ -9614,6 +9630,1096 @@ installCoreValuePorts({ resolveAutonomousLoopPrompt, loosenReasons, combinePolic
9614
9630
 
9615
9631
  **包侧缺口:** ① 出包面注释存量(别仓名 / 票号 / 帖号 / 过程词)与卫生门判据太窄(CC-100)—— 方案候拍板(dist 去注释 vs 手清),0.77.2 · ② `DeniedBy` 第十词 `read_boundary` / `teamName` / `stillLive` 三词随 sdk 10 型面在 0.78.0 吸收(CC-106)· ③ `capabilities.mcpProbe` 候 core 7.26.0 #951 → server 7.93.0(CC-74)。
9616
9632
 
9633
+ ## §109 🆕 0.85.0(2026-09-29)引擎事实表构建期生成与两张出身 / 强制词表即 SDK 的值 + 子代族与 resume 编排收注入 client + 会话规则无损判定收可选名册 + 过渡物退役登记与三名退出公面 + plan-review 决断台账收进包 + 会话后台任务停止口转调 + 服务端 7.104.0 提货(会话存档读不出 · 跳过记录通告 · 删会话 409 · `/decide` 停驻挪动 · 同步 park 体 · 文件历史两代词与请求词 · 公钥发现段 · 折叠粗码)+ 同名影子对账门按语义判 + 导出存活门读已提交历史(🔴 minor;型面 BREAKING 一处〔三个运行期名字退出根入口〕;根公面运行期导出 1275 → 1307〔+35 −3〕;测试钩 59 → 60;公面类型 +34;`SessionPolicyWithheldWhy` +1 员 `not_in_roster`〔穷尽分支的端编译期红〕;`SESSION_POLICY_WITHHELD_WHY` 6 → 7;`ASK_ORIGIN_WORDS` / `APPROVAL_MANDATE_WORDS` 改为 SDK 的数组、不再冻结;四个型改为 SDK 型的别名;子代写动词失败结局 +1 可选键 `unconfirmed`;`reopenPlanReviewCard` 拒开面变宽;`adapt()` 不再认旧名 `attachedFiles`;`FileHistoryCaptureMode` / `EngineNoticeFactsCode` 各 +1 员〔穷尽分支的端编译期红〕;`SERVER_NOTICE_AUDIENCE` 两行 → 三行;请求键 +1 `fileHistory`;零新投影臂;超集键零增减;peer sdk 地板 `>=12.0.1` 不动)
9634
+
9635
+ > **minor**,十件同发,另有一条宿主动作成文(本节按 0.85.0 的读法写;若与本版发布帖不一致,以发布帖为准):
9636
+ > ① **引擎事实表构建期生成**(CC-230):通告码册 / 受众表 / MCP 注入丢弃原因与会话规则翻译判定内部的两张表,改由构建期生成器从已装引擎包的包根出口生成,值与 0.84.1 逐元素逐序相同;出身词 / 强制词两张公面词表直接就是 SDK 导出的那两个数组(不再冻结、成员跟随已装 SDK);思考档 / 权限模式四个型改为 SDK 型的别名;包内同一事实的多份字面收成一份。
9637
+ > ② **子代族与 resume 编排收注入 client**(CC-236;§7 P-28 后半场):八个入口与两只行停止门各收一个可选的注入连线,经一个共用构造点(plan-review 族同迁);注入形的每一发有本包独立落定的截止;三只写动词的失败结局加机读位 `unconfirmed: true`(可能已送到、却没有答复:时限到点,或请求送达后连接断了等说不出没送出的传输失败)。旧签名逐字节同答。
9638
+ > ③ **会话规则无损判定收可选名册**(CC-228):交了这一跑的工具名册,名册里没有的名字以 `not_in_roster` 扣下;只收紧,今天被扣下的名字在名册里也照扣。
9639
+ > ④ **过渡物退役登记**(CC-221):只写在注释里的退役条件逐条进机读登记与到期门;本版执行两条(附带文件旧名读法、差分门的一只参照侧归一器);按 §107 的预告三个运行期名字退出根入口,第四个撤回退役预告;活段新增退役名录 §2z。
9640
+ > ⑤ **plan-review 决断台账收进包**(CC-241):重开口按一本三端共用的台账拒开,拒开面从「POST 未落地」扩到「交出 → 结算」整段与陈旧读起点。
9641
+ > ⑥ **会话后台任务停止口**(CC-246):`sessions.backgroundStop` 由本包转调(§107 B-7 的「端直调」订正 —— 端不直连 sdk),经共用构造点;能力门先于一切请求;按码分结局、窄读受据、「没答复」机读位;另给受据三态归类口,认不出的受据词一律归「可能仍在跑」。
9642
+ > ⑦ **服务端 7.104.0 会话侧**(CC-217 / CC-243):会话存档读不出(`corrupt_session`)在 HTTP 拒体 / 终局因由 / run 行三处载体同一判定与一句人话(包内终局行与结果帧补那一句);`session.records_skipped` 进册、受众 user、计数可能是 `'unknown'`;删会话 409 按码分三形;`/decide` 停驻挪动三码按码读,决断出口补句、停泊腿按码续读流。
9643
+ > ⑧ **服务端 7.104.0 能力 / 同步体侧**(CC-243):同步 park 新体与 park 行 `result` 两代都认(判序对齐 sdk 13);文件历史捕获两代词与「这一次别捕获」请求词片段口;能力面公钥发现段读口;折叠拒绝的粗码不再说成「一道检查」。本段零 import sdk 13 才有的型或值。
9644
+ > ⑨ **同名影子对账门按语义判**(CC-222)与 ⑩ **导出存活门读已提交历史**(CC-240):只改门,出包面零变化。
9645
+ > ⑪ **常驻姿态谓词答 `unknown` 时宿主怎么做**(成文;判定不变):本包不认识的出身词 ⇒ 出卡问人,不折成姿态放行(109a-12)。
9646
+ > **到货点名**:终端 —— 必改一行门登记(109d);常驻姿态谓词换读本包口时按 109a-12 接 `unknown`;plan-review 决断台账换读(L-1–L-8);「停 / 杀会话」与退出对话框两处接会话后台任务停止口(S-1 / S-7);🔴 文件历史请求词片段接进拼请求处(不接 ⇒ 关闭开关不生效)、旁路一次性问答判成功改读因由(M-4 / M-1);存档读不出补那一句、「门已决」链先问停驻挪动判定(K-1 / K-8)。网页端 —— 子代族直发路径的失败回执可按 `unconfirmed` 分句(P-13,非必改);两只同名影子要改名或换读(109d);🔴 5xx 臂一律劝重试(对存档读不出是错出路)、删会话把所有 409 说成有活跑(对子代仍在跑是错话)两处要改(K-1 / K-6)。管理台 —— 🔴 两处测试夹具拿退出公面的名字当「在公面上的名字」,换钉前换名(D-3);本地同名的 detach 判定改从本包导入;本地 `/decide` 三码字面表换成包的判定(K-8);`parkKindOf` 漏认 `needs_review` 那一形复核门(既有差分,建议改调 `isReviewPark`)(109d)。桌面端 —— 冻结期零改动。
9647
+
9648
+ ### 109a. 处置表
9649
+
9650
+ 包处置列:`added` = 本包自有面本版新增;`changed` = 本版改(括注改的是什么);`removed` = 退出公面;`consumed` = 本版读上游的事实;`不变` = 回归约束;`gates` = 只改门;`成文` = 判定不变、把宿主动作写成文。各端列:`pending` = 有读点待改(格内注明必改与否);`n/a` = 该端零读点或零改动即得(按本机克隆的只读检索,读的是哪一个提交见 109d)。
9651
+
9652
+ | # | 面 | 包处置 | 旧 → 新 | 终端 | 网页端 | 桌面端 | 管理台 | 验收方 | 本节 |
9653
+ |---|---|---|---|---|---|---|---|---|---|
9654
+ | T-1 | `ENGINE_NOTICE_CODES` / `ENGINE_NOTICE_AUDIENCE` / `MCP_INJECTION_DROP_REASONS` | consumed(构建期生成) | 手抄镜像 → 构建期生成物(引擎包根 `ENGINE_NOTICE_CODES` / `NOTICE_AUDIENCE` / 同名表);值 / 序 / 冻结 / 型全同,对象换成生成物那一只;受众表键序仍是码册序(不是引擎那张表按受众分组的序) | n/a(零改动) | n/a | n/a | n/a | 回归约束 | 109a-1 · G-T1 / G-T7 |
9655
+ | T-2 | 会话规则翻译判定内部的两张表(协议命名空间前缀、退役工具名 → 现名) | consumed(构建期生成;不上公面) | 手抄 → 生成物(引擎包根 `PROTOCOL_TABLE` 各员前缀 / `RETIRED_TOOL_NAMES`;现名由引擎说明串派生,认不出的说明形拒生成);值 / 序全同 | n/a | n/a | n/a | n/a | 回归约束 | 109a-1 |
9656
+ | T-3 | `SERVER_NOTICE_AUDIENCE` | 不生成(本包手写;属主是服务端,引擎表里没有);本版 +1 行见 K-4 | 不生成;组合规则不变;两行 → 三行(K-4) | n/a | n/a | n/a | n/a | 回归约束 | 109a-1 · G-T7 |
9657
+ | T-4 | `ASK_ORIGIN_WORDS` | changed(身份 / 冻结性 / 成员来源) | 本包冻结抄件 → SDK 包根 `ASK_ORIGINS` 那个数组(`===`);不再冻结;成员跟随已装 SDK;型不变 | n/a(测试按值遍历,零改动) | n/a(同左) | n/a | n/a(判「出身已知」的读点随管理台自己装的 SDK 走,SDK 12.0.1 下零差别;见 109d) | pending(改锚) | 109a′ · G-T2 / G-T3 |
9658
+ | T-5 | `APPROVAL_MANDATE_WORDS`;连带 `ApprovalMandateWord` / `isApprovalMandateWord` / `readApprovalMandate` | changed(同上;后三者判定不变) | 本包冻结抄件 → SDK 包根 `PERSISTED_RULE_MANDATES` 那个数组(`===`);不再冻结;型与两只判定口仍按构建时那一代六词 | n/a | n/a | n/a | n/a | pending(改锚) | 109a′ · G-T2–G-T4 |
9659
+ | T-6 | `ReasoningEffort` / `WireThinkingLevel` / `PermissionMode` / `PermissionModeIntent` | changed(型的来源) | 本包手写字面联合 → SDK `NonNullable<TaskRequest['reasoningEffort']>` / `NonNullable<TaskRequest['permissionMode']>` 的别名,跟随已装 SDK(12.0.1 下成员逐词同);运行期词表仍在本包 —— SDK 只出了型、没出值,候 SDK 出值后直接用(pending) | n/a | n/a | n/a | n/a | n/a | 109a′ · G-T5 |
9660
+ | T-7 | `SEAT_REASONING_EFFORTS` / `PERMISSION_MODE_INTENTS` / `HEADLESS_PERMISSION_WIRE_MODES`;取消终态码;档位五词 | 包内单源 | 每组词各一份字面,三只数组由同一只元组派生;值 / 序 / 各自独立对象 / 不冻结 全同 | n/a | n/a | n/a | n/a | 回归约束 | G-T5 |
9661
+ | T-8 | `HITL_REJECT_MESSAGE` / `REJECT_MESSAGE` | 包内单源(产物字面位置变) | 字节同;这句字面在产物里只剩 `dist/adapt/wireShapes.js`,`dist/hitl/frameRouter.js` 不再含它 | 🔴 pending(必改一行门登记,109d) | n/a | n/a | n/a | 回归约束 | 109a′ · G-T6 |
9662
+ | P-1 | `EngineWireInjection<C>`(通用连线形 `{ client: C; capsBaseUrl?: string }`) | added | 无 → 子代族各入口 `wire` 位的通用形;给了就只用它,坏形 / 缺动词 ⇒ 各入口既有「发不出」臂 | n/a(Node 宿主继续装目标) | 接(见 109d) | n/a(冻结) | n/a | pending | 109a-2 |
9663
+ | P-2 | `fetchEngineSubagentReport(taskId, { signal?, wire? })`;型 `SubagentReportWire` / `SubagentReportWireClient` | added | 无 → 注入形经 client 的 `capabilities` + `runs.subagentOutput`;行会话参数照带;`capsBaseUrl` 只作探测缓存键(缺席 ⇒ 每次都探) | 零改动 | 候(今天零读点;接后台子代终报面时用) | n/a | n/a | pending | G-P1 · G-P4 |
9664
+ | P-3 | `tailEngineSubagent(taskId, { wire? })`;型 `SubagentTailWire` / `SubagentTailWireClient` | added | 无 → 注入形经 `capabilities` + `runs.subagentStream`(SSE 经 client 的 `fetch`);探测有 60 s 截止,流本身长命 | 零改动 | 候(零读点) | n/a | n/a | pending | G-P1 |
9665
+ | P-4 | `fetchEngineTaskOutput(handle, { signal?, wire? })` / `stopEngineTask(handle, { signal?, wire? })`;型 `EngineTaskOutputWire` / `EngineTaskOutputWireClient` / `EngineTaskStopWire` / `EngineTaskStopWireClient` | added | 无 → 注入形;🔴 能力门只从 `wire.capsBaseUrl` 读 `capabilities.taskHandles`(缺席 ⇒ `null` / `{ ok: false, reason: 'unavailable', detail }`,零请求;已装目标有证据也不回落);停止没答复 ⇒ `error` + `unconfirmed: true` | 零改动(可选:失败回执按 `unconfirmed` 分句) | 候(停止今天直发,见 109d;非必改) | n/a | n/a | pending | G-P1 · G-P2 |
9666
+ | P-5 | `steerEngineSubagent(target, text, childTaskId?, { wire? })`;型 `SubagentSteerWire` / `SubagentSteerWireClient` | added | 无 → 注入形经 `runs.steerSubagent`;闸序不变(先连线、后取址);写动词 60 s 截止 ⇒ `error` + `unconfirmed: true`;已装目标形撞 sdk 时限同位 | 零改动(可选:失败回执按 `unconfirmed` 分句) | 候(今天直发,见 109d;非必改) | n/a | n/a | pending | G-P1 · G-P5 |
9667
+ | P-6 | `resolveSubagentResumeContext(childTaskId?, { wire? })`;型 `SubagentResumeWire` / `SubagentResumeWireClient` | added | 无 → 注入形的 `facade` 把每一发包上 60 s 截止(错误对象原样交给分类器);坏 client ⇒ `facade: null`(取址也不读);没答复 ⇒ `error` + `unconfirmed: true` | 零改动(可选:失败回执按 `unconfirmed` 分句) | 候(今天直发,见 109d;非必改) | n/a | n/a | pending | G-P1 · G-P5 |
9668
+ | P-7 | `requestEngineCompact(sessionKey?, { wire? })` / `onEngineTaskBound(taskId, sessionKey?, { wire? })`;型 `EngineCompactWire` / `EngineCompactWireClient` | added | 无 → 注入形;`capsBaseUrl` 给了才预热能力位并缓存,缺席不预热、fail-open 发;发射用的 client 在 bind 那一拍冻结;404 单次重试用同一只 | 零改动 | 候(零读点) | n/a | n/a | pending | G-P1 · G-P6 |
9669
+ | P-8 | `fetchDelegatedPrompt(taskId, { wire? })`;型 `DelegatedPromptWire` / `DelegatedPromptWireClient` | added | 无 → 注入形经 `sessions.get`;截止 / 坏 client ⇒ `unreadable`(记号已撤,可重试) | 零改动 | 候(零读点) | n/a | n/a | pending | G-P1 |
9670
+ | P-9 | `engineTaskHandlesCapable(sessionKey?, capsBaseUrl?)` / `engineRowNeedsStopConfirm(taskId, sessionKey?, capsBaseUrl?)` | added(可选位) | 槽 baseUrl → 显式键赢、缺席读槽 | 零改动 | 候(行停止分诊接 `capsBaseUrl`) | n/a | n/a | pending | G-P3 |
9671
+ | P-10 | plan-review 三口的 client 构造 | changed(实现搬家,行为不变) | 自持「注入或目标」判定 → 共用构造点;三条「发不出」句子逐字不变;函数型命名空间 client(`assistant` / `runs` 本身可调用、动词挂在它上面)照发、照出卡(与 0.84.1 同答) | 回归约束 | 回归约束 | n/a | n/a | 回归约束 | G-P8 / G-P13 |
9672
+ | P-11 | 已装目标那条路(八入口不带新位)/ `EngineWireTarget` / `makeEngineWireClient` | 不变 | 逐字节同 0.84.1(时限 / 传输失败 / 发出后取消三臂见 P-13);目标在解析那一刻按值快照 —— 宿主用 getter / 原地改值表达「当前引擎」时,压缩的延迟发射与 404 重试仍去原引擎、带原凭证(与 0.84.1 同答);plan-review 决后回拉同样去原引擎、带原凭证 —— 这一形与 0.84.1 **不同**(0.84.1 在回拉那一刻才读目标),见 109a′ 第 27 条 | 回归约束 | n/a | n/a | n/a | 回归约束 | G-P7 / G-P12 |
9673
+ | P-12 | 十五只能力读器的默认参 `baseUrl = engineWireTarget()?.baseUrl`;`subagentResumeAvailable(baseUrl)` / `auditRetainWithoutWake({ baseUrl })` | 不变(已可用形) | 端显式传 `baseUrl` 即中继宿主可用,不经目标槽 | n/a | 接:显式传 `capsBaseUrl` 那把键 | n/a | n/a | n/a | §7 P-28(活段已改) |
9674
+ | P-13 | 三只写动词失败结局的可选键 `unconfirmed: true`(`SubagentSteerOutcome` / `EngineTaskStopOutcome` / `SubagentResumeOutcome` 各 +1 可选成员);分类器判决 `SubagentResumeFailureVerdict` +1 同名可选键(`classifySubagentResumeFailure` 单源给出) | added(型)+ changed(已装目标形 sdk 时限那一臂、「传输失败而说不出没送出」那一臂与 `stopEngineTask` / `resumeSettledSubagent`「请求发出之后调用方取消」那一臂的 `detail` 句与新键;分类器对前两类无码入参的 `detail` 从原句改为对应的同一句) | 无 → 只在「可能已送到、却没答复」时出现(时限到点;传输失败而读不到可证没送出的证据;或动词调用之后调用方取消了等待) | 可选(失败回执按它分句;按 `detail` 原句断言的判据眼作废) | 接:按它渲「可能已生效」;直发路径经分类器透传这一位(109d) | n/a | n/a | pending | 109a-3 · 109a′ · G-P5 / G-P10 / G-P11 / G-P15 / G-P17 / G-P18 |
9675
+ | N-1 | `sessionPolicyDeliverable(behavior, rules, opts?)`;型 `SessionPolicyDeliverableOptions { readonly roster?: ToolRosterView }` | added | 两参 → 可选第三参;交了名册 ⇒ 逐条判据判能写而名字不在名册名 ∪ 别名里的,以 `not_in_roster` 扣下 | pending(建议:判定整段换调本口并交 `{ roster: 当下名册 }`,删端侧名册闸 —— 前提见 109d;非必改) | n/a(零读点;没有名册,不交第三参照旧可用) | n/a(零读点) | n/a(零读点;测试里的两参调用逐字节同答) | pending | 109a-4 · G-N1 / G-N4 / G-N6 |
9676
+ | N-2 | `SessionPolicyWithheldWhy` / `SESSION_POLICY_WITHHELD_WHY` | changed(+1 员) | 六词 → **七词**(+`not_in_roster`,排在最后;旧六词序与措辞不变) | n/a(今天不对成因词分支;换调后对 `withheld` 逐条取句即得) | n/a | n/a | n/a | pending(按「恰六词」断言的改锚) | 109a′ · G-N2 |
9677
+ | N-3 | `sessionPolicyWithheldNotice('not_in_roster')` | added | — → 新增一句 | pending(随 N-1) | n/a | n/a | n/a | n/a | 109a-5 · G-N2 |
9678
+ | N-4 | `SessionPolicyDeliverability.unreadable` | changed(触发条件,只在交了第三参时) | 整批读不懂 → 另含「第三参不是对象 / 名册读不成」 | n/a(交的是本包窄读出的名册视图,读得懂) | n/a | n/a | n/a | pending | 109b · G-N5 |
9679
+ | N-5 | 不交第三参的全部调用 | 不变 | 与 0.84.1 逐字节同答(`opts` 缺席 / `undefined` / `null` / `{}` / `roster` 为 `undefined` / `null` 六形同) | 回归约束 | 回归约束 | 回归约束 | 回归约束 | 回归约束 | G-N3 |
9680
+ | D-1 | `adapt()`(`createWireToCcAdapter().adapt`)system 臂:`compact_boundary` 附带文件 → 「Referenced file」附件行 | changed(已发导出改行为;兑现 §100a K-6 的预告) | 两名并读(`_sema_attached_files` 优先,旧名 `attachedFiles` 照认)→ **只认** `_sema_attached_files`;只带旧名的行照常过境(键原样)、零附件行 | n/a(零读点;附件行不进转录落盘) | n/a(零读点) | n/a(冻结) | n/a(零读点) | pending | 109a-6 · G-D1–G-D3 |
9681
+ | D-2 | 过渡物退役登记与门(`scripts/retirement-ledger.json` + `run-retirement-ledger-test.mjs`) | gates(无行为面:不读、不铸任何 wire 键,不改任何导出) | — → 注释式退役条件逐条机读执法 | n/a | n/a | n/a | n/a | 可选(源码目录自跑) | 109a-7 · G-D4–G-D6 |
9682
+ | D-3 | 根入口运行期名字 `DENIAL_LIMIT_KINDS` / `engineCapNestedTrue` / `shortTaskLabel`(🔧 0.85.0 退出公面) | removed(型面 BREAKING;兑现 §107 的 0.85.0 预告) | 根入口导出 → 不导出;三名的替代见 §2z | n/a(零具名 import) | n/a(零具名 import) | n/a(冻结) | 🔴 pending(测试夹具换名,见 109d) | pending | 109a-8 · G-D7 |
9683
+ | D-4 | `surfaceRememberNotApplied` | 不变(撤回 §107 的退役预告) | 定 0.85.0 退出 → 留在公面;行为不变 | 在用(见 109d) | n/a | n/a | n/a | 回归约束 | 109a-8 · G-D8 |
9684
+ | D-5 | 本档的已退役名规则 | changed(文档规则) | 全档每处提及带退役注记 → 活段带注记;冻结段(已发版本的 §NN)不回改,由 §2z 退役名录兜底 | 读 §2z | 读 §2z | 读 §2z | 读 §2z | n/a | 109a-8 · G-D9 |
9685
+ | E-1 | 同名影子对账门的豁免登记(`scripts/layering-shadow-exemptions.json` + `run-layering-shadow-export-test.mjs`) | gates(无行为面) | 按名豁免 → 按语义分类(六类 + 机器证明 / 语义差分 / 钉声明哈希的核对记录;改名跟踪、预登) | pending(同名影子要退或改名,见 109d) | pending(同左) | n/a | pending(同左) | 可选(源码目录自跑) | 109a-9 · G-E1 / G-E2 |
9686
+ | F-1 | 导出存活门 E 段(`run-export-liveness-test.mjs`) | gates(无行为面) | 读各端检出的工作区 → 读已提交历史(主干 ∪ 近 14 天本地分支头 ∪ 检出的 `HEAD`);消费按真绑定判,退役按「绑定 ∪ 词级 ∪ 整面转口后可见」判 | n/a | n/a | n/a | n/a | 可选(源码目录自跑) | 109a-10 · G-F1 / G-F2 |
9687
+ | L-1 | `notePlanReviewDecisionHandedOver(taskId): PlanReviewDecisionHandle \| null`;型 `PlanReviewDecisionHandle` | added | 无 → 宿主在交出**之前**登记一笔;`settle()` 自带投递路径落定时调(被本包投递口认领后是 no-op);`revoke()` 作答没被 responder 收下时调;同任务已有一笔未结算 ⇒ `null`;坏入参 ⇒ `null` | pending(交互作答与 hook 自动应答两处在 `respondToQuestion` 之前调;respond 被拒 ⇒ `revoke()`;自带投递路径不再另记) | n/a(尚未接 plan 重开链;接入时同形) | n/a | n/a | pending | 109a-11 · 109b · G-L2 / G-L8 / G-L10 |
9688
+ | L-2 | `planReviewPendingReadMark(): number`;`ReopenPlanReviewOpts.pendingReadStartedAt?: number` | added | 无 → 读待决行**发起之前**取刻度,随那次读拿到的行带进重开口;缺席 = 只问此刻在飞;非数按缺席 | pending(对账 / 补捞腿读队列前取刻度,直接交给本包重开口;删自带的守卫层) | n/a | n/a | n/a | pending | 109b · G-L3 / G-L5 / G-L6 |
9689
+ | L-3 | `planReviewDecisionInFlight(taskId, pendingReadStartedAt?): boolean` | added | 无 → 重开口本体的拒开判据,也供宿主的「没生效」告知等判定读 | pending(换读;删自带同名判定) | n/a | n/a | n/a | pending | G-L3 / G-L4 |
9690
+ | L-4 | `notePlanReviewDecisionNotApplied(taskId)` | added | 无 → 宿主证出最近一笔已结算的决断没生效 ⇒ 那一笔不再让陈旧快照拒开;还有一笔在飞 ⇒ 不动;本包自证 `not_sent`,以及证得出同一道门实例的 `still_parked`(109a-11) | pending(证出「同一道门实例在结算之后仍待决」处调;自带的回声窗关闭半场留端) | n/a | n/a | n/a | pending | 109b · G-L4 / G-L7 / G-L15 |
9691
+ | L-5 | `notePlanReviewGateLeft(taskId)` | added | 无 → 正面证据「run 已离开那道门」⇒ 结算这条 run 全部未结算的笔;不放投递口闩 | pending(409 体证出离门处、在关自带回声窗的同一拍调) | n/a | n/a | n/a | pending | G-L9 |
9692
+ | L-6 | `latestPlanReviewDecisionMark(taskId): number \| null` | added | 无 → 最近一笔的交出刻度 | pending(「一笔决断至多告知一次」的键换读) | n/a | n/a | n/a | pending | G-L1 |
9693
+ | L-7 | `reopenPlanReviewCard` 拒开面 | changed(已发导出改行为) | 本包投递口 POST 未落地 ⇒ 拒 → 台账任一笔未结算(本包投递口从 POST 到投出结局的整段 / 宿主登记的交出)或读起点早于某笔结算且那一笔未证出没生效 ⇒ 拒;判决形不变 | 零改动即得(换读 L-1 / L-2 后自带守卫层可删) | 零改动即得 | 零改动即得 | n/a | pending | 109a′ · G-L5 / G-L11 |
9694
+ | L-8 | `_sema_planReviewOutcome` 的认领 | changed(宿主义务撤销) | 宿主按 `taskId` 等值认领 / 无主按数对账 → 每条结局恰对应台账一笔;宿主不再需要认领 | pending(队列口里删自带的结局认领与按数对账;「这条结局是谁的」直接读 `cmd._sema_planReviewOutcome.taskId`) | n/a | n/a | n/a | pending | 109b |
9695
+ | L-9 | `__resetPlanReviewDecisionLatchForTests()` | changed(名不变) | 清投递口闩 → 清整本账 | 零改动即得 | n/a | n/a | n/a | n/a | 109a-11 |
9696
+ | S-1 | `client.sessions.backgroundStop(sessionId, { includeRetained }, { signal })`(`POST /v1/sessions/:id/background/stop`,服务端 ≥7.102.0) | consumed(0.84.0 为 declined,本版订正) | 端直调(端不直连 sdk ⇒ 实际无合规调用面)→ 本包转调口 `stopEngineSessionBackground(sessionId, { includeRetained }, opts?)` → `EngineSessionBackgroundStopResult`;经共用构造点(注入 client 或已装目标);本口自铸恰好一键的体;每次调用恰一发;绝不抛 | pending(两处读点,见 109d) | n/a(今天无退出时停后台任务的面) | n/a(冻结) | n/a(无 UI 入口) | pending | 109a-13 · G-H1 · G-H6 |
9697
+ | S-2 | `capabilities.background.exitFaces` | consumed(同上订正) | 端直读 → 停止口的端点门:自有严格 `true` 才发;没读到 ⇒ `capability_unknown`、读到但不是严格 `true` ⇒ `no_exit_face`,都零请求;证据键 = 注入形的 `capsBaseUrl` / 已装目标的 `baseUrl` | 宿主照旧起能力探测(`kickEngineCapsProbe(baseUrl, …)`),把同一把键交给注入形 | n/a | n/a | n/a | pending | 109a-13 · G-H2 |
9698
+ | S-3 | 200 体 `{ receipts: [{ id, outcome }] }` | consumed(窄读) | 无 → `stopped.receipts`:每条恰 `{ id, outcome }`(`id` 非空串、`outcome` 非空串,原样;认不出的词保留该行、不改写);`id` 读不出或词不是非空串的行计 `unreadableReceipts`(≥ 1 才带);整只读不出 ⇒ `receipts` 缺席(不折空表);行上与体顶层的多余键不带 | 逐条交归类口渲(见 109a-14) | n/a | n/a | n/a | pending | 109a-14 · G-H3 |
9699
+ | S-4 | 拒绝面(503 / 501 / 404 ×2 / 400 / 401 · 403 / 429 / 其余 4xx)与失败面 | consumed(按码分) | 无 → `refused` 八因(码先于状态;认不出的码按状态兜底)/ 5xx 与传输层失败 ⇒ `error`;`status` / `errorCode` / `retryAfterMs` 读得到才带 | 按 `why` 分句 | n/a | n/a | n/a | pending | 109a-13 · G-H4 |
9700
+ | S-5 | 没答复 | consumed(与本版子代族同一判据) | 无 → `error` + `unconfirmed: true`(本包 60 s 截止 / client 每请求时限 / 请求送达后连接断了等说不出没送出的传输失败 / 停止请求发出之后调用方取消);真答复 / 可证没送出(调用前就已取消 —— 零请求;注入动词同步抛;成因链上带连接阶段 / 构造期(含参数校验)/ 证书校验与客户端握手配置的码;OpenSSL 原因码 `ERR_SSL_*` 不算)⇒ 键缺席 | 渲「可能已停」 | n/a | n/a | n/a | pending | G-H5 / G-H12 / G-H13 |
9701
+ | S-6 | 型 `EngineSessionBackgroundStopClient` / `EngineSessionBackgroundStopWire` / `EngineSessionBackgroundStopOptions` / `EngineSessionBackgroundReceipt` / `EngineSessionBackgroundStopUnavailableWhy` / `EngineSessionBackgroundStopRefusedWhy` / `EngineSessionBackgroundStopResult` / `EngineSessionBackgroundReceiptState` / `EngineSessionBackgroundReceiptReading` | added | 无 → 九个具名型(闭集成员见 109a-13 / 109a-14) | 换钉即得 | 同 | 同 | 同 | 核型面 | — |
9702
+ | S-7 | `engineSessionBackgroundReceiptReadingOf(outcome)` → `{ state, text, unrecognizedOutcome? }`;`ENGINE_SESSION_BACKGROUND_RECEIPT_STATES` | added | 无 → 受据词归三态(`stopped` / `still_running` / `may_be_running`)+ 每态唯一一句用户面话;认不出的词 / 坏入参 ⇒ `may_be_running`(认不出的词原样带出),绝不归成已停;纯函数、绝不抛;闭集镜像冻结、由措辞表键派生 | pending(渲受据时调它,不按表自判) | n/a(随 S-1) | n/a | n/a | pending | 109a-14 · G-H11 |
9703
+ | K-1 | 错误码 `corrupt_session`(500;HTTP 拒体:同步提交零工作 / 流式提交应答头之前 / 直接读会话的各口) | consumed | 通用 500 → `isCorruptSessionError(err)`;turn 判决 `http` 臂 `sessionUnreadable: true`;人话 `corruptSessionContent()` | pending(补充链,见 109d) | 🔴 pending(5xx 臂今天一律劝「通常是暂时的,再试」,对本码是错出路;见 109d) | n/a(冻结) | pending(若渲 turn 错误) | pending | 109a-15 · G-K1 · G-K2 |
9704
+ | K-2 | 同一码在终局因由上(`done.result.terminal = {kind:'failed', code:'corrupt_session'}`;做过工作的同步 200 + failed 体) | consumed | 通用 failed → `isCorruptSessionResult(result)`;包内流上终局行与结果帧 `errors[0]` 补那一句 | 换钉即得(`-p` 与 REPL 两路都读包的呈现) | 若自渲终局,调 `isCorruptSessionResult` + 同一句 | n/a | 同网页端 | pending | 109a-15 · G-K3 |
9705
+ | K-3 | 同一码在 run 行上(`GET /v1/runs/:id`:`result.terminal.code` 或行列 `errorCode`) | consumed | 无 → `isCorruptSessionRunRow(row)`(结果优先、行列兜底);包的续收合成走 K-2 同一路 | 换钉即得(续收合成) | 后台 run 列表若渲失败因由,调它 | n/a | 同网页端 | pending | 109a-15 · G-K4 |
9706
+ | K-4 | 通告码 `session.records_skipped`(受众 user;`detail{dropped, entriesKept, sessionId}`) | consumed | 册外 / operator / 派发口 `undefined` → 在册 / user / 派发口给 typed 事实;`readSessionRecordsSkipped` 计数逐格 `'unknown'`;补句 `sessionRecordsSkippedNote` | pending(通告行 `entriesKept === 0` 补那一句) | n/a(今天无通告面) | n/a | pending(通告臂可改读派发口) | pending | 109a′ · G-K5 · G-K6 |
9707
+ | K-5 | 服务端接入契约第 17.4 节:非流式同步提交口与续跑 verify 腿没有通告投递口 | consumed(缺席语义) | 无 → 109b 写明「这两条腿上没收到 ≠ 没跳过」;本包不补、不推断 | 同上 | 同上 | n/a | 同上 | 核缺席语义 | 109b |
9708
+ | K-6 | 删会话 409 `conflict.session_children_alive` + `remaining[]` | consumed | 无读口(端各自「409 = 有活跑」)→ `sessionDeleteConflictFromError(err)` 三形 + `sessionDeleteConflictContent(detail)` | n/a(今天无删会话动作) | 🔴 pending(「任何 409 ⇒ 有活跑」对本码是错话;见 109d) | n/a | pending(中继照传;前端若渲拒因,调它) | pending | G-K7 · G-K8 |
9709
+ | K-7 | 删会话 409 `conflict.session_active_run` + `activeTaskId` | consumed(随 K-6 同一读口) | 无 → `active_run` 臂 | n/a | 随 K-6 | n/a | 随 K-6 | pending | G-K7 |
9710
+ | K-8 | `decide.not_parked` / `decide.gate_moved` / `decide.claim_lost`(`not_parked` 7.104.0 起多一种触发:根会话被删) | consumed | 扫原句(会话被删形扫不中 ⇒ 真失败)→ 按码:`decideParkMovedFromError` + 专句;四个决断出口补句;停泊腿按码续读流 | pending(自有「门已决」链在扫词前问 `isDecideParkMovedCode`) | 换钉即得(若经包的决断腿;自有决断动词的失败分类见 109d) | n/a | 🔴 pending(本地三码字面表是端上第二份,换成包的判定;见 109d) | pending | 109a-16 · G-K9–G-K11 |
9711
+ | K-9 | 型 `NoticeCountReading` / `SessionRecordsSkippedFactsView` / `SessionDeleteConflictKind` / `SessionDeleteConflictDetail` / `DecideParkMovedDetail` | added | 无 → 五个具名型 | 换钉即得 | 同 | 同 | 同 | 核型面 | — |
9712
+ | M-1 | `POST /v1/tasks`(非流式)停在门上的 200 体 = 引擎结果(`terminal{kind:"paused", gate, checkpointId?}`、`toolCallId?`、`result`、`stats` …)+ 回执三键 `taskId` / `sessionId` / `status`(`suspended` / `needs_review`) | consumed(读法两代都认;判序对齐 sdk 13) | 老服务端三键体 ⇒ `readRunTerminal` 扁平臂(`plane:'flat'`、`flatStatus` 带词、无门)→ 新体 ⇒ 因由臂 `paused`(`plane:'cause'`、`flatStatus` 带回执词、门 / `checkpointId` 读得到);`isReviewPark` 两代同答;投影仍走 park 臂 | pending(旁路一次性问答判成功改读因由,见 109d) | n/a(不走同步提交) | n/a(冻结) | n/a(读流式 `done`) | pending | 109a-17 · G-M1 / G-M2 |
9713
+ | M-2 | `GET /v1/runs/:id` park 中的行带 `result`(= 同步体去掉回执 `status`;`needs_review` 行信封另带 `errorCode:"review.pending"`) | consumed(行为变化成文) | park 行无 `result` ⇒ 无头重连腿计预算重试、耗尽走判死文案 → 立刻合成 `done`(paused)交下游,与活流同形;信封码不冒充失败码;无 `result` 的 park 行照旧重试 | 无头 `-p` 断线重连腿受益(零改动) | n/a | n/a | n/a | pending | 109a-17 · G-M3 |
9714
+ | M-3 | 能力词 `fileHistoryCapture`:7.104.0 闭集 `off` / `on-optional`(`on-always` 删词,7.97.0–7.103.x 仍发) | consumed + changed(坏读数) | `fileHistoryCaptureMode` 两词 + `unknown` → 三词 + `unknown`;返回型 +1 员(成文改口);判据口与 `fileHistoryCaptureDoctorDetail` 对坏读数(非对象 / 认不出的 `kind` / 不带非空串词 / 读属性就抛)由抛改为答值(`'unknown'` / 「not observed」那一句) | pending(「文件检查点」开关的显隐判据,见 109d) | n/a(零读点) | n/a | n/a | pending | 109a-18 · G-M4 / G-M9 |
9715
+ | M-4 | 请求体键 `fileHistory: "disabled"`(唯一词;`POST /v1/tasks` · `/v1/tasks/stream` · `/v1/runs`;坏值 400 `request.field_invalid`;与还原键同交 400 `request.field_conflict`) | consumed(新出口) | 无 → 车道表一行(interactive + print、live 门后;utility 无座)+ 片段口 `fileHistoryDeclarationField(reading, captureOff)`(只在 `on-optional` 时给)+ 常量 `FILE_HISTORY_DISABLED`;坏值构造期 `TypeError` | 🔴 pending(开关关掉时经片段口给值,并先等能力探测落地;不接 ⇒ 开关渲了、关掉没用;见 109d) | n/a(今天无此开关) | n/a | n/a | pending | 109a-18 · G-M5 |
9716
+ | M-5 | 接线回执 `fileHistory` 段(`"on"` / `"disabled"`;每条腿) | pending(不投) | 接线回执视图十段不变,这一段不上 chrome 臂 / 非流式回执视图 | n/a | n/a | n/a | n/a | n/a | KL-245 |
9717
+ | M-6 | `FILE_HISTORY_CAPTURE=false`:7.104.0 起只关捕获,`rewindFiles` / `restoreFiles` / `rewindFilesTo` / `sessionSync` 照真 | consumed(零改动,钉格) | 两只读器本来就各答各的:捕获读 `off`,回退可用性只由回退读器答 | 零改动 | n/a | n/a | n/a | pending | G-M4 |
9718
+ | M-7 | `GET /v1/capabilities.sealedKey { alg, publicKeyId, publicKey }`(保管店建成才在场) | consumed | 无 → 四态读口 `projectSealedKeyCapability` / `noteEngineCapsForSealedKey` / `observedSealedKey` / `forgetSealedKeyReading`(型 `SealedKeyReading`) | pending(能力探测 tee 一行 + 换代失效一行,见 109d;今天零读点) | n/a(零读点) | n/a | 可选(配置面封模型 key 时读) | pending | 109a-19 · G-M6 |
9719
+ | M-8 | 折叠体 `409 resume_blocked_by_policy` 的 `blockedBy` 恒在(带码原码;不带码 ⇒ 分发器按状态的粗码) | consumed | `blockedBy` 在场一律「The check that refused it: <码>」→ 粗码 ⇒ 「did not name a more specific check (… <粗码>)」;新增 `STATUS_DERIVED_COARSE_CODES` / `isStatusDerivedCoarseCode` | 零改动(经决断失败补句) | 零改动 | n/a | n/a | pending | 109a-20 · G-M7 / G-M8 |
9720
+ | M-9 | 同步口 `rewind.store_unconfigured` 200 → 409、`rewind.capture_disabled` → 422 | declined | 本包无同步提交读点(同步提交由宿主直调);流式腿照旧 2xx + 终态同码 | 宿主按码读 | n/a | n/a | n/a | n/a | — |
9721
+ | A-1 | `askSurvivesPosture` 答 `unknown` 时宿主怎么做 | 成文(判定不变) | 「拿到 `unknown` 按自己的 settings 规则判」→ 两形分开:宿主没报读数 ⇒ 跑自己的匹配、把读数报进来再问一次;报了读数仍 `unknown`(= 本包不认识的出身词)⇒ **出卡问人**,不折成姿态放行 | pending(自持那一份对本包不认识的出身词放行;换读本包口时按本条接,见 109d) | n/a(无姿态自动应答) | n/a | n/a | pending | 109a-12 · 109a′ · G-A1 / G-A2 |
9722
+ | X-1 | `sandboxDegradeHint`(镜像索引缺席那一臂) | changed(已发导出的输出字节) | 括注里的配置中心旧名改用现名 →「This worker has no sandbox image index configured (the sema-web-admin config center is not attached), so per-task profiles cannot resolve.」(配置中心用现名;第二行与另三臂、判别逐字节不变) | 零改动(零读点;按原句断言的格改锚) | 同左 | 同左 | 同左 | 回归约束 | 109a′ · G-X1 |
9723
+
9724
+ #### 109a-1 · 构建期生成物与通告码组合规则
9725
+
9726
+ - 生成器 `scripts/gen-upstream-tables.mjs` 只读本包自己依赖目录里装的那一份引擎包(解析落到上层目录 / 别的检出目录 ⇒ 拒读),从引擎包根出口取表,写成 `src/generated/` 下的纯字面模块(头注写明生成器与引擎版本,零 import,随源码入库)。本包运行期仍不 import 引擎包。
9727
+ - 引擎侧任何一张表缺席 / 为空、通告码与受众行不逐键对应、受众出现第三值、退役名说明串形状认不出 ⇒ 生成器**拒生成**,不产出空表或半张表。
9728
+ - **通告码组合规则(不另铸合并表)**:在册 = 码 ∈ 生成的引擎码册 ∪ `SERVER_NOTICE_AUDIENCE` 的自有键;受众 = 引擎那一行 ?? 服务端那一行 ?? `operator`(引擎先查)。两表零交集由门钉;按表遍历全集要两张都遍历(与 0.84.1 同)。
9729
+ - `ASK_ORIGIN_WORDS` / `APPROVAL_MANDATE_WORDS` 就是 SDK 包根那两个数组(引用相等)。本包的判定不读这两个数组:出身措辞、常驻姿态判定与强制词三只口的键集在构建期由 SDK 型派生、两向钉住 —— 开发依赖 SDK 加一词而本包没跟,构建先红。
9730
+
9731
+ #### 109a-2 · 共用构造点与 `wire` 位的判定(逐条)
9732
+
9733
+ - 求值序:`wire !== undefined` ⇒ 只看连线(槽一次都不读);缺席 ⇒ 读该行 / 该会话槽(行台账的归属键,缺席 = 默认槽,与 0.84.1 同)。
9734
+ - 连线可用 = 连线是对象 ∧ `client` 是对象 ∧ 该入口的动词都是函数(逐入口切片见 109a 表 P-2–P-8);动词路径的中间段是对象**或函数**(`assistant` / `runs` 本身可调用、动词挂在它上面的函数型命名空间照收 —— 与 0.84.1 plan-review 守卫同答);读属性抛 ⇒ 不可用。
9735
+ - 不可用的处置 = 各入口既有的「无连线」出路(报告 / 任务输出 / 委托提示 `null`,尾随不开流,转向 `no-wire`,停止 `unavailable`,压缩 `offline`,resume `facade: null`),零请求;报告 / 尾随另留一行 debug。
9736
+ - `capsBaseUrl` 窄化:非空串才算在场。
9737
+ - 已装目标形:解析那一刻把 `{ baseUrl, token, principal }` **按值快照**,client 从这份快照构造(延迟 / 重试路径不再读槽,也不再读宿主那只目标对象 —— 宿主用 getter / 原地改值表达「当前引擎」时,温切之后旧 run 的那一发仍去原引擎、带原凭证 —— 子代族各入口与 0.84.1 同答;plan-review 的决后回拉那一形与 0.84.1 不同,见 109a′ 第 27 条);压缩发射用的 client 仍在 bind 那一拍构造(与 0.84.1 同拍)。
9738
+ - 注入动词**同步抛**(没先返回 promise)与 Promise 拒绝同一处置:错误对象原样交给该入口的失败分类(停止 / resume 按 `status` / `errorCode` 分,不被拍平成串)。
9739
+
9740
+ #### 109a-3 · 逐动词的宿主须知(注入 client 路径)
9741
+
9742
+ sdk 12.0.1 的逐请求选项只有取消信号:本包改不了注入 client 的 `timeoutMs` / `maxRetries`。事实:GET 读动词按 client 的 `maxRetries`(缺省 2)重试,且退避 / `Retry-After` 睡眠期间不看取消信号;非提交类 POST(steer / resume / stop / compact / planReview)**不重试**(`maxRetries` 对它们无效)。据此:
9743
+
9744
+ | 动词 | 读 / 写 | 本包截止 | 宿主须 | 不满足时会看到 |
9745
+ |---|---|---|---|---|
9746
+ | `capabilities`(报告 / 尾随探测) | 读 | 60 s | 无 | client 带读重试且撞 429 / 5xx:本包截止照样按时落定(入口按失败臂落),那只 client 可能再睡一轮(≤ 60 s)才收手 |
9747
+ | `capabilities`(压缩预热) | 读 | 5 s | 须交 `capsBaseUrl` 才预热 | 不交 ⇒ 不预热、fail-open 发;引擎 `manualCompact:false` 时 501 只留 debug |
9748
+ | `runs.subagentOutput` / `runs.taskOutput` / `sessions.get` | 读 | 60 s | 任务输出须先 `kickEngineCapsProbe(capsBaseUrl, …)` 并交同一把键 | 到点 ⇒ `null` / `unreadable`;任务输出不交键 ⇒ `null` + debug 行,零请求 |
9749
+ | `runs.subagentStream` | 流 | 无(探测 60 s) | client 的 `fetch` 须能承载 SSE(响应体可读流);client 的 `timeoutMs` 不作用于流 | 承载不了 ⇒ 流立即撕裂,尾随台账收口(debug 行) |
9750
+ | `runs.taskStop` | 写(终态幂等) | 60 s | 交 `capsBaseUrl`;client 逐次单发(真 `AgentClient` 即如此) | 不交键 ⇒ `unavailable` + detail;到点 ⇒ `{ ok: false, reason: 'error', detail: 'no answer …', unconfirmed: true }`,行不翻、下一拍由行帧归因(渲「可能已停」) |
9751
+ | `runs.steerSubagent` | 写(非幂等) | 60 s | client 逐次单发;宿主不得在 client 外再包自动重发 | 外包重发 ⇒ 同一句话在子代下一轮工具回合送达两次(本包察觉不到、不去重);到点 ⇒ `{ ok: false, reason: 'error', detail: 'no answer …', unconfirmed: true }`,消息可能仍会送达(渲「可能已送达」) |
9752
+ | `runs.resumeSubagent` | 写(至多一次) | 60 s(经 `facade`) | 同上 | 外包重发 ⇒ 子代多跑一轮(第二发 409 `steering.still_running`);到点 ⇒ `{ ok: false, reason: 'error', detail: 'no answer …', unconfirmed: true }`,子代可能已被叫醒(渲「可能已继续」,不重发) |
9753
+ | `runs.compact` | 写(202 即回;重复 = 新请求) | 60 s | `requestEngineCompact` 与 `onEngineTaskBound` **两口都交** `wire` | bind 不交且目标槽空 ⇒ 那一记 arm 留着不发射(debug 行);到点 ⇒ 只留 debug |
9754
+ | `assistant.planReview` | 写(同步驱动续跑) | 无(宿主 client 的 `timeoutMs`) | `timeoutMs` ≥ 6 h(§108a-9,不变) | 短 ⇒ `unconfirmed` |
9755
+ | `runs.get`(决后回拉) | 读 | 15 s | 无 | 不变(§108a-9) |
9756
+
9757
+ 🔴 **`unconfirmed: true` 的读法**(三只写动词共同):`ok: false` ∧ `reason: 'error'` ∧ `unconfirmed === true` = 「可能已送到、没有答复、可能已生效」—— 宿主渲「可能已生效」的句子,**不要**渲「失败」,也不要按它重发(steer 会送两次、resume 会多跑一轮)。键缺席 = 引擎真答了(按 `reason` / `detail` 渲)或**可证没送出**。原则:能证明没送出才说没送出,说不清的一律标。判据四形:注入形本包截止先到;两形 client 自己的每请求时限到点(fetch `TimeoutError`);传输失败而说不出没送出(fetch 的网络错误 `TypeError`,成因链上读不到下面那些码 —— 请求送达后、答复前连接被断,浏览器拿不到成因,fetch 的坏端口拦截,undici 不带码的非法头值;`detail` 说「no answer from the engine — the connection failed before an answer came back (the request may still have been received)」);**动词调用之后**调用方取消了等待(两形;取消停得了等待、停不了已送出的请求;`detail` 说「no answer from the engine — the wait was cancelled after the request was sent (cancelling stops only the wait, not the request: it may still have been received)」)。可证没送出 ⇒ 不标:调用前就已取消(注入形动词不调、零请求;已装目标形 sdk 在 fetch 之前以那只信号的取消原因落定 —— 取消原因不必是 `AbortError`:`AbortSignal.timeout(…)` 到点后才交进来、自定义取消原因同样不标,`detail` 是原取消句;按「拒绝的就是那只原因」认,不看错误名);注入动词同步抛(没返回 promise;只对那一次同步抛成立 —— 宿主复用同一只错误对象、之后在已送出的一发上异步拒绝它,照标);成因链上带发出之前就失败的码 —— 连接阶段 `ECONNREFUSED` / `ENOTFOUND` / `EAI_AGAIN` / `UND_ERR_CONNECT_TIMEOUT`,`syscall` 为 `connect` 的 `EHOSTUNREACH` / `ENETUNREACH` / `ETIMEDOUT`(多地址合并错误要每一次尝试都是);构造期 `ERR_INVALID_URL` / `ERR_INVALID_CHAR` / `ERR_HTTP_INVALID_HEADER_VALUE`,参数校验 `ERR_INVALID_ARG_TYPE`(外来 / polyfill 信号交给 sdk 的并联口,在任何 I/O 之前);证书校验与客户端握手配置(Node 的证书校验码、握手期 `ERR_TLS_*`)。🔴 OpenSSL 原因码 `ERR_SSL_*` 一只都不算没送出:同名码在对端收下请求之后照样出现(对端读完请求后回一条损坏的记录 ⇒ `ERR_SSL_CIPHER_OPERATION_FAILED`;对端在 TLS 连接上回明文 ⇒ `ERR_SSL_WRONG_VERSION_NUMBER`),握手期那几形(如 `https` 指向明文端口)因此照标(保守方向,KL-249)。射程:调用方把 `AbortSignal.timeout(…)` 当自己的信号交进来、在动词调用之后到点也标(按「发出后取消」那一句;调用前就已到点的不标;KL-203);证书校验码仍按握手期判(KL-252);直发 sdk 的宿主交给 `classifySubagentResumeFailure` 的取消错误分不出发前 / 发后 ⇒ 键缺席(KL-253)。调用方信号 `null` 与不给同读;宿主装了两份本包时,一份抛的截止 / 发出后取消错误交另一份的分类器同判。
9758
+
9759
+ #### 109a-4 · 名册那一步(在 §106a-1 的逐条判据之后)
9760
+
9761
+ §106a-1 的 deny 逐条判据走完(第 6 步 `legacy_tool_name` 之后)仍判「恰好一个工具名」的名字,**在交了名册时**再问一步:
9762
+
9763
+ 7. 名字在名册的名 ∪ 别名里吗(每行的 `name` 与 `aliases`,原样比、分大小写)?不在 ⇒ `not_in_roster`;在 ⇒ 能写。
9764
+ 8. 其余 ⇒ 恰好一个工具名(原第 7 步)。
9765
+
9766
+ - **只收紧**:这一步只改「不交名册也判能写」的名字。已被前面某一步扣下的名字,在名册里也照扣、成因不变(`Task` 在名册里照旧是 `legacy_tool_name`、现名 `Agent` 照旧带着;`foo__bar` / ` Read` / `Bash*` / `mcp__srv` / `Bash(x)` 同理)。
9767
+ - **别名算在册**:引擎准备期的名字审计认名 ∪ 别名;写成别名的 deny 写进会话规则记录,与同一条规则走设置那条路同义,所以是无损的。
9768
+ - **协议工具名**同样按原样比:名册里有 `mcp__srv__tool` 时,`mcp__srv__other` / `mcp__other__tool` / `mcp__SRV__tool` 都是 `not_in_roster`;`MCP__srv__tool`(前缀大小写不对)照旧先落 `legacy_tool_name`。
9769
+ - **引擎的命名空间覆盖形**(`mcp__srv` / `a2a__peer` / 工具段带 `*`)今天在前面几步就被扣下(`peer_wide` / `wildcard`,带括号的 `qualified_deny`),名册在场时成因不换。
9770
+ - 名册里多出来的键(`count` / `digest` / 行上的其余键)不影响读法;行上只看 `name` / `aliases`。
9771
+ - ask 批不受名册影响(照旧每条 `ask_no_bucket`),除非名册读不成(109b)。
9772
+
9773
+ #### 109a-5 · `not_in_roster` 那一句
9774
+
9775
+ `Not written to this session’s rule record: the tool roster supplied for this check has no tool by exactly this name, as a name or an alias, with letter case counted — it may be misspelled, or name a tool this deployment does not provide — so recorded as it is it would block nothing here.`
9776
+
9777
+ 与 `legacy_tool_name` 那一句是两件事:那一句是「引擎会拒启」(写进去之后每一跑启动即失败),这一句是「这一部署没有恰叫这个名字的工具」(写进去一只都拦不住;引擎只告警、不拒启)。同其余六句的纪律:只收成因词、不回显规则串、不替宿主承诺回落路。
9778
+
9779
+ #### 109a-6 · 附带文件旧名读法退役的射程
9780
+
9781
+ - 现役流(宿主 `adapt(runStream(…))`)不受影响:投影口自 0.83.0 起只铸 `_sema_attached_files`,旧名在这条路上从不出现。
9782
+ - 受影响的只有:宿主把 0.82.x 及更早落盘的 CC 形 `system/compact_boundary` 行**直接喂回** `adapt()`。那一行本身照常作为转录行交出(`attachedFiles` 键原样,不剥、不改名),只是不再产出 `compact_file_reference` 附件行。两名同在时只认新名(与 0.83.0 起一致)。
9783
+ - 要在旧转录上继续出附件行的宿主:喂回之前自己把 `attachedFiles` 改名成 `_sema_attached_files`(值原样)。本包不提供迁移口(0.83.0 成文「旧转录不迁移、不改写」)。
9784
+
9785
+ #### 109a-7 · 退役登记门执法什么(只改门)
9786
+
9787
+ - 登记三类触发:按本包版本(`retireBy`,当前版本 ≥ 即红,含当天)· 按上游(已装版本 ≥ `atLeast` / 包入口导出名全在场 / 某型上成员全声明,多式是合取)· 按端侧事件(差分门参照树装的本包版本 ≥ 阈值)。一行至少一个机读触发;条件量不出的必带 `retireBy` 作复核期;`retireBy` 最远到当前 minor + 3 之前。
9788
+ - 另判:锚(过渡物本身的代码原文)找不到 = 死行;源码注释里的条件原句与登记对不上 = 漂移;已退役的锚复活。
9789
+ - 本版补登的扫法(一次性,不常驻,见 KL-207):`src/**/*.ts` 与 `scripts/*.mjs` 全树两遍正则检索 —— 第一遍「起删 / 退役条件 / 退役条款 / 之后删 / 后删 / 届时删 / 到期 / 过渡一版 / 过渡期 / 留一版 / 下一 minor / remove after / retire… / retireBy / 候上游 / 整只退役 / 整条退役 / 即退役 / 即换 / 可以删 / 再删 / 一并删」(`src` 103 行、`scripts` 116 行),第二遍「@deprecated / 候上游 / 候 sdk / 等上游 / sdk 补 / 补声明 / 声明后 / 到货后 / 追平后 / 换钉后 / 临时形 / 兼容腿 / 兼容读 / 两名并读 / 并读一版 / 下一版删 / next minor / TODO / FIXME」(`src` 51 行);两遍各在植入文件里放一句已知的退役条件证明会响。命中逐条分类:大多是 TTL 到期 / 「一起删掉」一类非退役用语、已兑现的历史记账,或已由别的登记物执法(导出存活登记、端侧同名影子豁免、消息键过渡表、按文本分支的具名放行、审批帧键领先登记、压缩分割线记账格);补登的是条件只写在注释里、且今天还没有任何门在条件满足时响的那几条。
9790
+
9791
+ #### 109a-8 · 三名退出、一名撤回预告、退役名录
9792
+
9793
+ - 三名退出公面后,从本包根入口按名 import 这一类写法在 TS 下编译不过(没有这个导出成员),在 JS 下拿到 `undefined`。拒绝上限词表(🔧 0.85.0 退出公面)换成从 `@sema-agent/sdk` 根入口取同名值,即得同一个数组对象;另两名没有公开替代(本包内部照旧使用)。逐名的「改用什么」见活段 §2z 退役名录。
9794
+ - `surfaceRememberNotApplied()` 继续在公面:零参,在当前会话的宿主面上顶一条 warning(正文 = `REMEMBER_NOT_APPLIED_WARN_TEXT`,十秒后只清自己那一条);没装宿主面时静默不抛。自己读决断回体、不经本包停泊腿的宿主,在回体 `rememberApplied === false` 时调它说同一句。
9795
+ - **退役名录**落在活段 §2 末尾(§2z):首格是退役标签,名录行因此不被当作裸推荐;冻结段(已发版本的 `§NN` 段)不回改,段里可能仍把名录里的名字写成可用导出 —— 以名录为准。冻结段里仍提到的已退役名(本版门实数 42 个:0.72.0 那 39 个在 §45 / §47,本版三名在 §23 / §107)全部在名录里;0.84.0 那 26 名不在任何冻结段里,名录照列是为了完整。
9796
+
9797
+ #### 109a-9 · 同名影子对账门按语义判(只改门;无行为面)
9798
+
9799
+ - **无行为面**:只改一道门、它的豁免登记物,以及门里的机读差分件;dist、公面导出、型面、wire 键零变化。
9800
+ - **门执法什么**(`run-layering-shadow-export-test.mjs`,读各端同一棵树的 `origin/main`,不在才退回 `HEAD`):
9801
+ 1. 端上自己声明的顶层运行时导出,与本包公面同名 ⇒ 必须登记(同前)。
9802
+ 2. 每一条登记带一个类别和匹配的证据:本包函数对象的别名、只注入宿主依赖的薄包装 ⇒ 门每次按语法树重证,证明不成立即红,到期看核对期限(最远当前 minor + 2);多出来的逻辑经端确认属宿主的包装 ⇒ 端的确认原句与出处 + 钉声明哈希的核对记录,按核对期限到期;带自己判定的包装、同名不同物 ⇒ 核对记录钉端上那份声明的规范化哈希,端上一改即红;同一件事的第二份实现 ⇒ 语义差分:端侧代码与本包喂同一批语料逐例比,分歧只许落在登记过的类里。
9803
+ 3. 端上改了名、或不导出的旧实现,也可以登记(`renamedTo` 跟新名);两个名都不在就是死行,必须同批删掉。
9804
+ 4. 预登(`awaitUntil`):端上还没出现的影子可以先登记,截止版本前缺席不判死行。
9805
+ - 登记行的到期版本以登记物为真源;只有被机器证明为本包函数别名或薄包装的行、以及多出来的逻辑经端确认属宿主的行,改按核对期限到期。各端要动的读点见 109d。
9806
+
9807
+ #### 109a-10 · 导出存活门读已提交历史(只改门;无行为面)
9808
+
9809
+ - **无行为面**:只改门、负控套与门的读源件;dist、公面导出、型面、wire 键零变化。
9810
+ - **门执法什么**(`run-export-liveness-test.mjs` E 段):
9811
+ 1. 读源 = 各端 `origin/main`(不在才 `HEAD`)∪ 近 14 天内有提交的本地分支头 ∪ 检出的 `HEAD`(不论多旧),只读已提交的历史,不读工作区。与同名影子对账门共用同一份定位与读取实现,两道门看同一端时,主干是同一个快照。
9812
+ 2. 已登记 retire 的名字,在任何一个所读 ref 上被端用到了 ⇒ 红,点名端、判据、文件:行和 ref。「用到」按宽口径算:真绑定、`from` 本包的文件里词级命中、整面转口之后名字在端源码里出现,任一种都算。一个导出只要还有在飞分支可能在用,就不能退出公面。
9813
+ 3. contract 行自报的消费端,必须等于这些 ref 上**真绑定**这个名字的端;internal 行被端真绑定 ⇒ 应改登 contract。端上与本包同名的本地声明不算消费。
9814
+ 4. 每读一个 ref 打一行 `SOURCE`。登记名只在非主干 ref 上被消费时,打 `INFLIGHT` 读数。读不到的端单列 `SKIPPED-SECTION`,不当作「该端零消费」。
9815
+
9816
+ #### 109a-11 · plan-review 决断台账:账与拒开判据
9817
+
9818
+ - **一本账**:每一笔 = `{ taskId, 交出刻度, 结算刻度 | 未结算, 阶段(已交出 / POST 在飞 / POST 已落地), 没生效 }`,插入序 = 交出序;每进程至多 32 笔(到顶先挤最旧的**已结算且本包调用已返回**的笔,再挤最旧的宿主登记、本包还没认领的笔;本包投递口自己在飞的笔 —— POST 在飞与回拉 / 结局在途,不论结算刻度是否已被离门证据写上 —— **永不因容量被挤**,挤不下就暂时超出上限、落定后回落:被挤掉的若是投递口闩,同一次批准就会发两次);交出、结算与读起点共用一只单调的逻辑时钟。此前的投递口闩并进来:「POST 未落地」= 一笔处在 POST 在飞阶段;投递口闩的判据不变(有一笔 POST 在飞 ⇒ 第二次 `decidePlanReview` 拒;落地即放,其后回拉期间的第二次照发)。
9819
+ - **结算 = 本包投出结局那一拍**(在结局进队列口 / 回调 `onOutcome` 之前落结算刻度 —— 宿主在队列口里同步发起的读取到的刻度因此晚于结算);`decidePlanReview` 意外抛出时外层再补一次幂等结算,不留一笔永不结算的账。
9820
+ - **认领**:`decidePlanReview` 被闩放行时,找同任务一笔已交出、未结算的登记认领为自己的;没有就自铸一笔。被闩拒的那次投递不动账。
9821
+ - **拒开判据**(重开口入口守卫与异步判定的读后复核同一只):有一笔未结算 ⇒ 拒;给了读起点 ∧ 有一笔结算晚于读起点 ∧ 那一笔没被判「没生效」⇒ 拒。读后复核用「调用方读起点」与「判定前取的刻度」中较早的一枚。`decisionHandedOver` 谓词保留,台账没说话时再问它(并联,严格 `true` 才拒)。
9822
+ - **没生效**:本包自证 `not_sent`(一个字节没送出)与**证得出同一道门实例**的 `still_parked` —— `acceptEdits` 被引擎按契约拒收(状态一个字节没动),或卡由 `armPlanReviewApproval` 立、立卡结果上的 `checkpointId` 与决后回拉 run 行 `result` 上 paused 因由的 `checkpointId` 两边读得出且相等(run 行上的 `result` 是这条 run 自己的 park 因由:park 时写、认领续跑即清)。回拉只说 `needs_review` 而证不出同一道门(公开口直调、重开卡上的决断都没有决断前的门身份;缺一边)⇒ **不自证**;两边身份读得出而**不同** = 决断生效、run 停在新的一道 plan 门 ⇒ 结局 `advanced`(「advanced to a NEW approval gate」那一句),同样不自证:run 推进到**新的一道** plan 门时状态词同样是 `needs_review`,拿旧快照重开会顶掉当前卡(KL-250);`not_applied`(4xx)/ `unconfirmed` 不自证(404 时门已不在;409 折叠时门在但本包证不出),留给宿主的强证口 `notePlanReviewDecisionNotApplied`。
9823
+ - 与 HITL 桥的工具审批决断起止回调不是一回事:那对回调管 `/v1/approvals/:id/decide`,不经本台账;plan 决断不走那座桥。本版不给台账加观察者回调:宿主要的三件(在飞 / 陈旧 / 没生效)都由判定口回答。
9824
+
9825
+ #### 109a-12 · 常驻姿态谓词答 `unknown` 时宿主怎么做(成文;判定不变)
9826
+
9827
+ `askSurvivesPosture` 的三态与判法不变(§102a-1)。`unknown` 有两形,宿主动作分开写成文:
9828
+
9829
+ 1. **宿主没报 settings 读数**(`facts` 缺席 / `settingsAskRuleMatched` 非布尔):settings ask 规则那一路命没命中不知道 ⇒ 宿主跑自己的匹配,把读数报进来再问一次(或按自己的 settings 规则判:命中 ⇒ 出卡)。
9830
+ 2. **本包不认识的出身词**(宿主报了没命中也一样):⇒ 宿主**出卡问人**,不折成姿态放行。常驻姿态「几乎零卡」的取向不适用于本包不认识的出身词 —— 它可能恰是一个新的必问出身。
9831
+
9832
+ 宿主分得出两形:报了 `settingsAskRuleMatched`(布尔)而仍答 `unknown`,只可能是第 2 形(报了 `true` 必答 `must_ask`;报了 `false` 而出身缺席或是认得的非必问词必答 `posture_may_answer`)。所以接法一句话:**先把读数报进来;拿到 `unknown` 就出卡**。治理 / 只有真人能清 / 强制三项检查照旧排在本谓词之前(§102a-1)。
9833
+
9834
+ #### 109a-13 · 会话后台任务停止口:求值序与结局闭集(逐条)
9835
+
9836
+ - 求值序:入参 ⇒ 连线 ⇒ 能力门 ⇒ 发一次。前三步任一不过 ⇒ `unavailable`,一个字节都不发。`unavailable` / `refused` / `error` 三臂都带一句 `detail`(英文一句,说清是哪一步、有没有发出去)。
9837
+ - 入参:`sessionId` 非空串;`body` 是对象且**自有** `includeRetained` 是布尔(`'true'` / `1` / 只在原型链上 / 取值器抛 ⇒ `bad_input`);`opts` 缺席或 `null` = 不给,别的非对象 ⇒ `bad_input`;`opts.sessionKey` 给了就必须是非空串;`opts.signal` 缺席或 `null` = 不给,给了就必须是取消信号形(否则 `bad_input`,不让它在发送路径上抛成一条「发了但失败」)。
9838
+ - 连线:`opts.wire !== undefined` ⇒ 只看连线(槽一次都不读);连线可用 = 对象 ∧ `client` 是对象 ∧ `client.sessions.backgroundStop` 是函数;不可用 ⇒ `no_wire`。缺席 ⇒ 读 `opts.sessionKey` 槽(缺省默认槽)的已装目标;槽空 ⇒ `no_wire`。
9839
+ - 能力门:注入形没给 `capsBaseUrl` ⇒ `capability_unknown`(已装目标上有证据也不回落);给了 ⇒ 读那把键;已装目标形读目标 `baseUrl` 那把键。缓存里没有读数 ⇒ `capability_unknown`(宿主可 `await engineCapsSettled(key)` 后再调);有读数而 `background` 不是对象、或 `exitFaces` 不是**自有**严格 `true` ⇒ `no_exit_face`。
9840
+ - 发一次:注入形带本包 60 s 独立截止(调用方信号并联;到点中止底层请求);已装目标形用 client 自己的每请求时限(sdk 缺省 60 s)。服务端在收敛完成之后才答(有后台行时慢一次宽限,缺省约 1 s)。
9841
+ - `refused` 八因的判法(码先于状态):`auth.service_token_required` ⇒ `credentials_required`;`capability.session_ownership_required` ⇒ `ownership_required`;`not_found.session` ⇒ `session_not_found`;`not_found.route` ⇒ `route_absent`;`limit.rate_exceeded` ⇒ `rate_limited`;其余 `auth.*` ⇒ `not_permitted`;其余 `request.*` ⇒ `bad_request`。服务端在拒绝不带码时按状态补的粗码(`isStatusDerivedCoarseCode`:`request.rejected` / `request.payload_too_large` / `request.unprocessable` / `not_found.resource` / …)不比状态多说什么 ⇒ 读得到状态时当无码处置、按状态兜底(409 `request.rejected` 与无码 409 同落 `other`;只带粗码、没有状态的错误对象照旧按码读,KL-254)。无码或认不出的码:429 ⇒ `rate_limited`、401 / 403 ⇒ `not_permitted`、400 ⇒ `bad_request`、其余 4xx ⇒ `other`;5xx ⇒ `error`(带码的「超时」答复也按码分,不标 `unconfirmed`)。
9842
+ - 🔴 **不幂等**:重复停止安全(已收掉的行答 `already_gone`,不会被再伤一次)但不是空操作 —— 每一次都对那一刻还活着的全部后台工作再收敛一遍,两次之间新起的后台命令也会被停。`unconfirmed: true` 之后要不要再发由宿主定;本包不自动重发、不铸去重键(KL-229)。
9843
+
9844
+ #### 109a-14 · 受据怎么渲:调 `engineSessionBackgroundReceiptReadingOf`,不要自己按表判
9845
+
9846
+ 🔴 端对每条受据调 `engineSessionBackgroundReceiptReadingOf(receipt.outcome)`,按返回的 `state` 分组、用返回的 `text` 上屏;不要在端里写「`no_pgid` ⇒ …」这类分支,也不要自铸三态的句子(三端各写一份 = 三份判定、三份措辞)。下表只说明这只口的判法(照 sdk 与服务端注释),**不是**给端照抄的表:
9847
+
9848
+ | `outcome` | 含义 | `state` | `text` |
9849
+ |---|---|---|---|
9850
+ | `killed` | 这一次调用的硬收落地了 | `stopped` | Stopped. |
9851
+ | `already_gone` | 观察得出已经不在(早已退出 / 已被收过 / 宽限里自己退了) | `stopped` | 同上 |
9852
+ | `retained_skipped` | `includeRetained: false` 留下的显式保留服务,进程还在 | `still_running` | Still running — it was set to keep running, so it was left in place. |
9853
+ | `no_pgid` | 没有同步硬收落地(远端 / 沙箱执行的常态;普通停止已派) | `may_be_running` | May still be running — the engine could not confirm that it ended. |
9854
+ | 其它串(认不出的词) | 上游将来的新词、大小写 / 空白 / 近形不同 | `may_be_running`,并带 `unrecognizedOutcome`(原词) | 同上 |
9855
+ | 非串 | 坏入参 | `may_be_running`,不带词 | 同上 |
9856
+
9857
+ - 🔴 放宽方向闭合失败:认不出的一律归「可能仍在跑」,绝不归「已停」。`unrecognizedOutcome` 是引擎侧来的原字节,端若要显示它,按不可信文本处置。
9858
+ - 停止口的 `receipts` 里可能出现四词之外的词(行保留、词原样):端照样逐条交这只口,得到「可能仍在跑」那一句,并能点名那一条的 `id`。
9859
+ - 三态闭集 `ENGINE_SESSION_BACKGROUND_RECEIPT_STATES`(冻结,序 = `stopped` / `still_running` / `may_be_running`)供端枚举分组;同一态恒同一句。
9860
+ - 受据只含 shell 行;后台代理 / 工作流由会话结算、不出受据 ⇒ 要列「停了哪些后台代理」,停前读一次登记(`readEngineAgentRegistry`)、停后再读一次对比(KL-227)。`unreadableReceipts` 在场 ⇒ 受据表不完整,说「还有 N 条读不出」,不要当全集。
9861
+
9862
+ #### 109a-15 · 会话存档读不出:三处载体,一只判定(K-1–K-3)
9863
+
9864
+ - 唯一判定 `isCorruptSessionCode(code)`:严格等值 `corrupt_session`(不按前缀、不折大小写、不去空白)。三只载体读口只负责「从这种载体上把码取出来」:
9865
+ - 抛出物:`effectiveWireErrorCode(err)`(折叠码 `resume_blocked_by_policy` 时按 `blockedBy` 里的原码)→ 判定;
9866
+ - 结果:`readRunTerminal(result)` → 只认 failed 臂的码 → 判定;
9867
+ - run 行:先读 `row.result` 的终局(读得出就只信它,**行列不翻结果**);读不出终局(`result` 缺席 / 连终态词都没有)才读行列 `row.errorCode`。
9868
+ - 🔴 按码不扫词:引擎原句(「Session <id> is unreadable: …」;SQL 后端那一句只留坐标)是展示文本;原句一字不差而码不是本码 ⇒ 不认。
9869
+ - 与 CC-156 的 `corrupt`(续跑上下文里读不出的**一行**,带 `where`)是两个码:那一个点名一行,本码说的是整只会话的存档。两者的人话都说「要运维修」,不说「重试」。
9870
+ - 那一句(`corruptSessionContent()`):「This session's saved history cannot be read — its stored log is damaged — so the engine cannot open this session. Retrying will not help: whoever operates this engine has to repair or remove that stored log. Until then, continue in a new session.」—— 只说三处载体都成立的话,不说「什么都没跑」(直接读会话的口与删会话的口上不对题)。
9871
+
9872
+ #### 109a-16 · `/decide` 停驻挪动族在停泊腿上怎么走(K-8)
9873
+
9874
+ | 码 | 服务端原句(7.104.0) | 修前(扫词) | 修后(按码) |
9875
+ |---|---|---|---|
9876
+ | `decide.not_parked`(被停 / 已被别处决定) | 「… (stopped or already decided)」 | 带 already ⇒ 「门早已决」⇒ 续读流 | 续读流(同) |
9877
+ | `decide.not_parked`(根会话被删,7.104.0 新触发) | 「the session this agent belongs to was deleted … — nothing was resumed」 | 扫不中 ⇒ 真失败收场 | **续读流**(与同族一致) |
9878
+ | `decide.gate_moved` | 「… (re-parked or already settled) — re-check the pending list」 | 续读流 | 续读流(同) |
9879
+ | `decide.claim_lost` | 「… already claimed — either a concurrent decide won …, or a stale claim is pending automatic cleanup …」 | 续读流 | 续读流(同);悬挂认领那一形第二次同因即诚实收场(同修前) |
9880
+
9881
+ - 🔴 放宽方向(真失败 → 续读流)只对会话被删那一形,闭合失败臂 = 「门早已决」那一臂既有的同因连续限次(一次):续读流后仍撞同一族 ⇒ 第二次即诚实收场、终帧带真因,不空转。
9882
+ - 公面 `isCodeClassifiedGateFailure` **不收**本族(那一口的意思是「别当门已决」,本族恰相反)。端侧自有「门已决」判据链的,在扫词之前问 `isDecideParkMovedCode(errorCode)`:真 ⇒ 按「门已不在原处」处置。
9883
+
9884
+ #### 109a-17 · 同步 park 体与 park 行:怎么读(M-1 / M-2)
9885
+
9886
+ - `readRunTerminal(body)` 的判序(与 sdk 13 三代读法同序):① 载体上有 `terminal` 且成形 ⇒ **先看顶层 `status`**:是 `suspended` / `needs_review` ⇒ `{ kind:'paused', plane:'cause', flatStatus:<那个词>, gate?, checkpointId?, restoreMode? }`(门三位只从 `paused` 因由上取);不是 park 词 ⇒ 按 `terminal.kind` 读(顶层 `status` 不参与)。② 有 `terminal` 却读不出 ⇒ `unknown`(park 词不救一座坏因由;两者都是非成功终局;KL-248)。③ 没有 `terminal` ⇒ 扁平臂(老服务端三键体 / 历史回放行 / 409 拒绝信封)。
9887
+ - 真字节上回执词由同一个因由投出(`plan_review` / `needs_review` 两种门 ⇒ `needs_review`,其余 ⇒ `suspended`),与因由不打架;打架形(服务端不产)park 词赢。
9888
+ - 「这是复核还是交互作答」一律调 `isReviewPark(read)`(门种 ∪ park 词两来源合读),**不要**自己写 `gate.kind === "plan_review"` 这类判据(会漏掉另一种复核门)。
9889
+ - 🔴 分代判据:要知道「这是不是 7.104.0 的新体」读 `plane`(`'cause'`)不读 `flatStatus`(两代都可能带词);要知道「是不是停在门上」读 `kind === 'paused'`,两代同答。
9890
+ - park 行:7.104.0 起行上 `result` = 同步体去掉回执 `status`(引擎结果本身没有 `status` 键),读成 `paused` 因由臂、`flatStatus` 缺席。无头重连腿(`withHeadlessR1Reconnect`)续收失败后查行:行带 `result` ⇒ 当场交出 `done`(paused),下游投影出「在等一次作答 / 复核」那一句;行不带 `result`(老服务端,或续跑腿那一拍诚实写空)⇒ 照旧计预算重试。审批过期被收割的行(`failed` + `approval.expired`、无 `result`)⇒ 照旧合成 `failed`。
9891
+
9892
+ #### 109a-18 · 文件历史:能力词两代 + 请求词(M-3 / M-4 / M-6)
9893
+
9894
+ | 能力读数 | `fileHistoryCaptureMode` | 契约读法(宿主) | 片段口 `fileHistoryDeclarationField(reading, true)` |
9895
+ |---|---|---|---|
9896
+ | `present` / `on-optional`(≥7.104.0) | `'on-optional'` | 渲「关闭捕获」开关;关 = 这条会话的**每个**提交都带请求词 | `{ fileHistory: 'disabled' }` |
9897
+ | `present` / `on-always`(7.97.0–7.103.x) | `'on-always'` | 只渲一句只读真话(恒捕获,关不掉),不渲开关 | `{}` |
9898
+ | `present` / `off` | `'off'` | 不渲开关;能不能回退看回退读器 | `{}` |
9899
+ | 认不出的词 / `not_reported` / `unobserved` | `'unknown'` | 不渲开关 | `{}` |
9900
+
9901
+ - 片段口第二参为假 ⇒ 恒 `{}`(缺席就是「照常捕获」的唯一写法)。本口只答「下一条提交带不带这一键」,不答「这一轮真没捕获」—— 后者是这条腿接线回执的 `fileHistory` 段(本版不投,KL-245)。
9902
+ - 🔴 **宿主义务(定案)**:用户关了文件历史时,**第一次提交前先等这把键的能力探测落地**(`await engineCapsSettled(baseUrl)` 之后再拼请求)。读数还没到(`unobserved`)时片段口按设计不给请求词(老服务端对这一键整条 400,没有读数就不知道对面认不认),那一次运行照常捕获 —— 不等就会出现「关了捕获,第一轮仍被捕获」(KL-244)。
9903
+ - 🔴 关着捕获时再要还原文件:`rewind.restoreFiles: true` 或 `rewind.rewindFilesTo` 与请求词同交 ⇒ 服务端受理时 400 `request.field_conflict`(副作用之前,会话与文件都不动)。本包不预判(两键原样上请求体);宿主二选一:关着捕获时不给「回退代码」入口,或在那一次还原提交上不带请求词(那一轮照常捕获)。取舍归宿主(KL-243)。
9904
+ - 7.104.0 起 `FILE_HISTORY_CAPTURE=false` 的部署:捕获读 `off`,回退四位照真 ⇒ 「回退代码」入口照常可用(只看回退读器)。7.97.0–7.103.x 的 `off` 部署回退四位同为假 —— 同一个 `off`,回退答案只来自回退读器。
9905
+
9906
+ #### 109a-19 · 公钥发现段(M-7)
9907
+
9908
+ - 只有 `present` 才能拿来封;`not_reported` / `unobserved` ⇒ 不要封(改用环境变量里的钥匙名,或修好保管目录后重启再取)。同一只能力回体的 `version` 能分「老服务端」与「没建成保管店」两形,本读口不分(同一个动作)。
9909
+ - 读数按引擎地址分格;引擎温切后调 `forgetSealedKeyReading(baseUrl)`,与其余能力位读器同一处。
9910
+ - 封好的密文连同读数里的 `alg` / `publicKeyId` 写进模型条目;对着 A 副本的公钥封的密文在 B 副本上开不了(逐模型失败,不回落任何别的钥匙)。
9911
+
9912
+ #### 109a-20 · 折叠粗码(M-8)
9913
+
9914
+ - 粗码表以服务端分发器的铸点为准 —— 状态兜底:400 `request.rejected` · 401 `auth.unauthorized` · 403 `auth.forbidden` · 404 `not_found.resource` · 413 `request.payload_too_large` · 422 `request.unprocessable` · 429 `limit.rate_exceeded` · 501 `capability.unavailable` · 其余 5xx `internal.error` · 其余 4xx(含 409)`request.rejected`。🔴 与按「404 ⇒ `not_found`、409 ⇒ `conflict`」写的读法有两处不同:404 是 `not_found.resource`(不是裸 `not_found`);分发器没有 409 专臂,409 不带码时落 `request.rejected`(不是 `conflict`)。
9915
+ - `resumePolicyBlockFromError` 的读数照旧 `named` 原码(读数不改写 wire);分句在 `resumePolicyBlockContent` 里做。宿主若自己渲读数,用 `isStatusDerivedCoarseCode(code)` 判同一件事,不要自抄表。
9916
+ - `effectiveWireErrorCode(err)`:不带码的折叠上答粗码(修前答折叠码)。本包三个按码判的读口(续跑锚 / 读不出行 / 场景拒)认的都是具体码,粗码不命中 ⇒ 行为不变;宿主若拿它的返回值直接分支,按粗码表认「没有具体码」。
9917
+
9918
+ ### 109a′. 成文改口(旧判据眼作废 → 新判据眼)
9919
+
9920
+ **作废**(旧判据眼装 0.85.0 后判红是预期行为,不是回归):
9921
+
9922
+ 1. 「`Object.isFrozen(ASK_ORIGIN_WORDS) === true`」「`APPROVAL_MANDATE_WORDS` 冻结」「这两张表的成员不随 SDK 变」—— 本版起两者就是 SDK 导出的数组(`===`)、不冻结、成员跟随已装 SDK(SDK 12.0.1 下逐词同)。新判据眼:G-T2 / G-T3 / G-T4。
9923
+ 2. 「`ReasoningEffort` / `WireThinkingLevel` / `PermissionMode` / `PermissionModeIntent` 与 SDK 无关、升 SDK 不会变」—— 本版起型 == SDK `NonNullable<TaskRequest[…]>`;运行期词表见 G-T5。
9924
+ 3. 「`HITL_REJECT_MESSAGE` 的字面在 `dist/adapt/wireShapes.js` 与 `dist/hitl/frameRouter.js` 各有一份」—— 本版起只剩前者(G-T6)。
9925
+ 4. 已装目标形 steer / stop / resume 撞 sdk 每请求时限那一臂「`detail` 是 `TimeoutError` 原句(如 `The operation was aborted due to timeout`)」—— 本版起 `detail` 是「no answer from the engine within the time limit this client allows — …」且 `unconfirmed === true`(G-P10);别的失败臂逐字节不变。
9926
+ 5. `classifySubagentResumeFailure` 对无 `status` / 无 `errorCode` 且 `name === 'TimeoutError'` 的入参「`{ reason: 'error', detail: <原句> }`」—— 本版起 `detail` 是同一句「no answer …time limit this client allows…」且 `unconfirmed === true`(G-P11);别的入参逐字节不变。
9927
+ 6. 断言 `SESSION_POLICY_WITHHELD_WHY` 恰六词 / `sessionPolicyWithheldNotice` 六句互异 —— 改七(G-N2)。
9928
+ 7. §100c **G-S2** 第一格「把 0.82.x 形只带 `attachedFiles` 的 `compact_boundary` 行喂 `adapt()` ⇒ 照旧产出附件行」—— 本版起不产出(G-D1)。该格自注的「0.84.0 起改判」实际生效版本是 0.85.0:0.84.0 / 0.84.1 上那一格仍产出。
9929
+ 8. §93(0.82.1)「闩在 POST 落地即放 ⇒ 落地之后的重开照常」—— 本版起重开口按台账判:本包投递口从 POST 到投出结局的整段都拒开(含决后回拉),宿主登记的交出、读起点早于结算的陈旧快照同样拒开。新判据眼分三向:① 结局投出(或宿主结算 / 离门证据)之后、不带读起点的重开照开;② 读起点早于结算 ⇒ 拒;③ 证出没生效的那一笔不拒(G-L2–G-L7)。
9930
+ 9. §102a-1 末段、§102d S-1 与 §102y 第 2 条「拿到 `unknown` 时按自己的 settings 规则判」—— 对「本包不认识的出身词」那一形不成立(宿主已报了没命中,再按自己的规则判就等于折成放行):本版起这一形宿主**出卡问人**;宿主没报读数的那一形照旧先跑自己的匹配(109a-12;G-A1 / G-A2)。
9931
+ 10. §107a **B-7** 行(`client.sessions.backgroundStop` / `capabilities.background.exitFaces`:declined,「宿主动作(退出时停后台任务),不属判定;本包零读点」,端列「端直调」)—— 旧判据眼「本包零读点、端直调」作废。新判据眼:两者由本包消费(S-1 / S-2);端经 `stopEngineSessionBackground` 调,本包之外不再有这一口的合规调用面;验收时「端里有没有 `sessions.backgroundStop` 直调」按违例看,「端经本包口调、按结局闭集渲」为正形(G-H1–G-H7)。
9932
+ 11. 「服务端自铸码表恰两行」「`engineNoticeInCatalog('session.records_skipped') === false`」「`noticeAudienceOf('session.records_skipped') === 'operator'`」「`readEngineNoticeFacts` 对它答 `undefined`」—— 本版起三行、在册、受众 `'user'`、派发口答 `{ code: 'session.records_skipped', audience: 'user', facts }`;按表遍历的消费方仍要两张表都遍历(G-K5)。
9933
+ 12. 「派发表八行」「用户面恰六码」(`ENGINE_NOTICE_FACT_READERS` / `EngineNoticeFactsCode` / `EngineNoticeFacts`)—— 本版起九行、用户面七码;按 `f.code` 穷举到 `never` 的 `switch` 当场编译红,加一臂(计数是 `number | 'unknown'`)。
9934
+ 13. 对 turn 错误判决 `http` 臂做键集恒等断言 —— 本版起多一个可选位 `sessionUnreadable`(码为 `corrupt_session` 时在场、恒 `true`,别的码键缺席、不铸 `false`)(G-K1)。
9935
+ 14. 「`corrupt_session` 的终局行 = `API Error: <引擎原句>`」「`errors[0]` = 引擎原句」—— 本版起两处都是引擎原句 + 换行 + `corruptSessionContent()`,行 === `API Error: ` + `errors[0]`;行的身份前缀不变(仍 `API Error:`,KL-239);别的码逐字节同旧(G-K3)。
9936
+ 15. 「`decide(approve|deny) failed: <String(e)>` 逐字」(审批卡腿 `failed.reason`、提问卡腿、中断撤卡的上屏 warn 与日志)—— 停驻挪动三码上本版起是原句 + ` — ` + `decideParkMovedContent(…)`;别的码逐字节同旧(G-K9)。
9937
+ 16. 停泊腿「会话被删那一形(`decide.not_parked`,原句不带 already)⇒ 真失败、`gate not decided` 那一行上宿主日志」—— 本版起按码续读流(宿主日志出「gate already resolved … re-attaching」那一行);第二次同因诚实收场;另三形走法不变,只是判据从原句换成码(G-K10)。
9938
+ 17. 「`fileHistoryCaptureMode` 只认 `off` / `on-always`,`on-optional` 读 `unknown`」—— 本版起三词两代都认、`on-optional` 单列一态,返回型四员;端侧按旧型写的穷举分支编译红 = 该接新态(G-M4)。
9939
+ 18. 「`readRunTerminal` 的 `flatStatus` 在因由形上恒缺席」—— 只对活流 `done` / run 行 `result` 仍成立;同时带 `terminal` 与 park 词的载体(7.104.0 同步 park 体)上 `flatStatus` 带回那个词,打架形 park 词赢(G-M1)。
9940
+ 19. 「同步 park 体 ⇒ `plane:'flat'`、门种读口恒 `undefined`」—— 只对 7.64.0–7.103.x 成立;7.104.0 起 `plane:'cause'`、门种 / 工具名读得到(G-M1 / G-M2)。
9941
+ 20. 「park 行读不到 `result` ⇒ 无头重连腿计预算重试到耗尽」—— 只对老服务端成立;7.104.0 起立刻交出 `done`(paused)(G-M3)。
9942
+ 21. 「折叠体 `blockedBy` 在场 ⇒ 说 The check that refused it」—— 在场且是粗码 ⇒ 说 did not name a more specific check(括注粗码);在场且是具体码 ⇒ 照旧点名;缺席(老服务端)⇒ 照旧(G-M7 / G-M8)。
9943
+ 22. 三只写动词(`steerEngineSubagent` / `stopEngineTask` / `resumeSettledSubagent`)撞上**传输失败**「`unconfirmed` 键缺席、`detail` 是原句(`TypeError: fetch failed` / `fetch failed`)」—— 只对**可证没送出**的成立:成因链上带连接阶段码(`ECONNREFUSED` / `ENOTFOUND` / `EAI_AGAIN` / `UND_ERR_CONNECT_TIMEOUT`,`syscall` 为 `connect` 的 `EHOSTUNREACH` / `ENETUNREACH` / `ETIMEDOUT`)、构造期码(`ERR_INVALID_URL` / `ERR_INVALID_CHAR` / `ERR_HTTP_INVALID_HEADER_VALUE` / 参数校验 `ERR_INVALID_ARG_TYPE`)、证书校验码与握手期 `ERR_TLS_*`,以及注入动词同步抛(没返回 promise);请求送达后、答复前连接被断,拿不到成因的网络错误,fetch 的坏端口拦截与 undici 不带码的非法头值,OpenSSL 原因码 `ERR_SSL_*`(含 `https` 指向明文端口时握手期的 `ERR_SSL_WRONG_VERSION_NUMBER`;见第 29 条),本版起 `detail` 是「no answer from the engine — the connection failed before an answer came back (the request may still have been received)」且 `unconfirmed === true`;`classifySubagentResumeFailure` 同判(KL-249 / KL-252)(G-P15 / G-P17 / G-P20 / G-H12 / G-H13 / G-H15)。
9944
+ 23. §108a′ 第 14 条与 §108c **G-W10** ④ 的「连接被拒 / 断网那一形照旧 could not reach the engine」—— 只对**可证没送出**的成立(与第 22 条同一张码表,另加决断动词同步抛;已装目标形与注入形同判):那几形本版照旧「The plan_review decision could not reach the engine: <错误串>」,与 0.84.1 逐字节同;决断体送达后连接断了、拿不到成因的网络错误、fetch 的坏端口拦截与 undici 不带码的非法头值、OpenSSL 原因码 `ERR_SSL_*` ⇒ 本版起结局正文是「The plan_review <决断> got no answer from the engine: the connection failed before an answer came back, and the request may already have reached the engine — it may have taken effect (…)」(`effect` 仍 `unconfirmed`、机读位不变);拿 fetch 的坏端口(1 / 9 等)当「无人监听的端口」的格读数会变,换监听后关掉的端口(G-P16 / G-P17 / G-P20)。
9945
+ 24. 「`fileHistoryCaptureMode(null)` / `fileHistoryCaptureDoctorDetail(null)` 抛」「doctor 口对认不出的 `kind` 答 `undefined`」—— 本版起两只口对坏读数都答值、不抛(`'unknown'` / 「not observed」那一句)(G-M9)。
9946
+ 25. 按原句逐字断言 `sandboxDegradeHint` 镜像索引缺席那一臂(括注用配置中心旧名的 0.84.1 原句)—— 本版起「… configured (the sema-web-admin config center is not attached), so per-task profiles cannot resolve.」;第二行与另三臂不变(G-X1)。
9947
+ 26. `stopEngineTask` / `resumeSettledSubagent`「调用方取消 ⇒ `{ ok: false, reason: 'error', detail: <取消原句> }`、不标」—— 只对**调用前就已取消**的成立(取消原因不必是 `AbortError`:`AbortSignal.timeout(…)` 到点后才交进来、自定义取消原因同样不标、`detail` 是原取消句,G-P21);请求发出之后才取消(动词已调用;已装目标形的请求可能已送达)⇒ 本版起 `detail` 是「no answer from the engine — the wait was cancelled after the request was sent (cancelling stops only the wait, not the request: it may still have been received)」且 `unconfirmed === true`(取消停得了等待、停不了已送出的停止 / 叫醒);`resumeSettledSubagent` 对宿主自给的 facade 同判;注入形的取消从此**立即落定**,不再被 client 的退避 / `Retry-After` 睡眠拖住(G-P18 / G-P19;直发 sdk 的宿主交给分类器的取消错误分不出发前 / 发后,KL-253)。
9948
+ 27. §108(0.84.1)plan-review 已装目标形「决后回拉在回拉那一刻读已装目标」—— 本版起决断与回拉都从解析那一刻的按值快照构造:宿主的 getter / 原地改值目标在 POST 与回拉之间温切,回拉仍去原引擎、带原凭据(依赖回拉带上轮换后新 token 的判据眼作废;温切只影响下一次决断)(G-P12 同律)。
9949
+ 28. 决后回拉 `needs_review` 而门身份变了(卡由 `armPlanReviewApproval` 立于 `cp_A`,回拉行 paused 因由是 `cp_B`)「`effect: 'still_parked'`、正文「… STILL locked on the same review gate … did NOT take effect …」」—— 本版起 `effect: 'advanced'`、正文「The plan was <approved|rejected> and the task advanced to a NEW approval gate (post-decide status: needs_review) — …」、尾句随 `advanced`;身份相同 / 缺一边 / 公开口直调照旧 `still_parked`(G-L15 / G-L17)。
9950
+ 29. 「TLS 握手失败(OpenSSL 原因码 `ERR_SSL_*`,如 `https` 指向明文端口的 `ERR_SSL_WRONG_VERSION_NUMBER`)⇒ 写动词 `unconfirmed` 键缺席、plan-review 决断说「could not reach the engine」」—— 作废:同名码在对端收下请求之后照样出现(对端读完请求后回一条损坏的记录 ⇒ `ERR_SSL_CIPHER_OPERATION_FAILED`;对端在 TLS 连接上回明文 ⇒ `ERR_SSL_WRONG_VERSION_NUMBER`),证明不了没送出。新判据眼:这些形写动词与会话后台任务停止口 `unconfirmed: true` + 「connection failed before an answer came back」那一句,plan-review 落「可能已生效」那一句(保守方向,KL-249);证书校验码(如 `CERT_HAS_EXPIRED`)与握手期 `ERR_TLS_*` 照旧键缺席 / could not reach(G-P17 / G-P20 / G-H13 / G-H15)。
9951
+
9952
+ **改读**(判据的意思保留,换读法):
9953
+
9954
+ 1. §5d「没放宽的那一半 … 子代族 8 处(另有 resume 族 3 处)仍装不进」与 §7 P-28「仍未放宽 …」—— 活段已同批改写:子代族八入口与两只行停止门收注入连线(P-1–P-9);§108 包侧缺口 ⑬ 本版销;§108a W-8 行读作「已解(§109)」。§108 包侧缺口里 KL-191 的「本包自己的读」射程延到子代族全部入口(读 / 写各一档,KL-199)。
9955
+ 2. §106a-1 的逐条判据按 109a-4 读(交了名册时多第 7 步,原第 7 步「其余」顺延为第 8 步);不交名册时 §106 各格答案不变。
9956
+ 3. §100a **K-6** 与 §100y 第 2 条「本版包内两名并读,0.84.0 起只认新名」—— 读作「0.83.0–0.84.1 包内两名并读,0.85.0 起只认新名」。
9957
+ 4. §107 107a′ 第 2 条那组四名的 0.85.0 退出预告 —— 前三名按期退出(逐名见 §2z);`surfaceRememberNotApplied` **撤回**这条预告、长期留在公面(终端在飞版在用)。
9958
+ 5. 0.72.0 起「已退役名在接入文档里每处提及都必须带退役注记」—— 只对活段成立;冻结段里的提及以 §2z 名录为准(冻结段不回改)。
9959
+ 6. §102 包侧缺口 ③「`hook` 出身一律必须问,CC 在 bypass 下对 hook ask 是有条件保留」—— 后半句作废:hook 发起的 ask 在常驻姿态下照问是定案,不再候条件集合;`askSurvivesPosture` 对 `hook` 恒答 `must_ask`(判定不变)。
9960
+
9961
+ **新增**:G-T1–G-T7 / G-P1–G-P25 / G-N1–G-N7 / G-D1–G-D9 / G-E1–G-E2 / G-F1–G-F2 / G-L1–G-L17 / G-H1–G-H15 / G-K1–G-K14 / G-M1–G-M9 / G-A1–G-A2 / G-X1。
9962
+
9963
+ **不变**:本段列出而未点名改动的名字,值、序、身份关系、冻结性、型均不变;§100c G-S1(现役路新名在场、旧名零铸、附件行照出)、G-S2 第二格(两名同在只认新名);plan-review 投递口闩(POST 未落地 ⇒ 第二次 `decidePlanReview` 拒;落地后回拉期间的第二次照发)、重开判决形与 `_sema_decisionInFlight` 键、`trigger` / `dismissedByUser` 语义;plan-review 结局的机读位除第 28 条那一形(`effect` 由 `still_parked` 改 `advanced`)外不变,结局文字除第 23 条与第 28 条那两臂外不变;`askSurvivesPosture` 的三态与判法;后台登记读口(§107 B-1 / B-2)与停止口共用 `capabilities.background` 这一键、各读各的子位(`listFace` / `exitFaces`),互不替代 —— 读口的 `no_list_face` 不推出停止口不可用,反之亦然;§107 B-6(登记行 `retained` 不读)不变,行上 `retained` 与停止口的 `includeRetained` 是两件事。
9964
+
9965
+ 已发段(§5d / §7 属活段,已同批改;§93、§94、§100、§101、§102、§104、§106、§107、§108 与 0.84.x 的 CHANGELOG 段)不回改,以本段为准。
9966
+
9967
+ ### 109b. 缺席语义(逐键)
9968
+
9969
+ **引擎事实表与 SDK 词表**
9970
+
9971
+ - 生成物本身不引入新的缺席形:引擎侧任何一张表缺席 / 为空 / 形状认不出,生成器**拒生成**,本包不会发出一张空表或半张表。
9972
+ - 已装 SDK 比本包构建时新、且给出身 / 强制词加了词:新词出现在 `ASK_ORIGIN_WORDS` / `APPROVAL_MANDATE_WORDS` 里;本包对它的判定同 0.84.1 对「表外词」—— 出身走「这个词比这一端新」那一句、常驻姿态判定 `unknown`(宿主出卡,109a-12);强制词读口判缺席、措辞口交中性句。
9973
+
9974
+ **子代族注入连线**
9975
+
9976
+ - `opts` / `opts.wire` 缺席 = 旧路径:经该行 / 该会话槽的已装目标;目标没装 ⇒ 各入口既有的「无连线」出路(不变)。
9977
+ - `wire` 在场而不可用(坏形 / 缺动词 / 读属性抛)= 同上出路,零请求;**不**回落已装目标。
9978
+ - `wire.capsBaseUrl` 缺席:任务句柄读 / 停 ⇒ 能力未知 ⇒ `null` / `unavailable`(零请求);报告 / 尾随 ⇒ 探测不缓存(每次都探);压缩 ⇒ 不预热、fail-open 发;`engineTaskHandlesCapable` 第二参缺席 ⇒ 读槽(旧路径)。
9979
+ - 行台账缺席(该任务无行)= 与 0.84.1 同:报告 / 尾随 / 任务句柄 `null` + 留痕,转向 `no-run`,resume `runId: undefined` —— 注入形不改取址,也不改闸序(先连线、后取址)。
9980
+ - 会话参数来源不变:行登记的会话优先,缺则退该槽的会话端口(resume 指名行却无会话 ⇒ 不带);注入形不改。
9981
+ - 截止到点:读 ⇒ 该入口的「读不到」值;写 ⇒ `error` 臂 + 「no answer …」detail + `unconfirmed: true`;都中止底层请求。调用方 `signal`:调用前已取消 ⇒ 动词不调、零请求、按该入口的失败臂落(**不**标 `unconfirmed`);动词调用之后取消 ⇒ 立即落定(不等截止,也不等 client 的退避 / `Retry-After` 睡眠)、中止底层请求,读 ⇒ 「读不到」值,写 ⇒ `error` + 「wait was cancelled after the request was sent」detail + `unconfirmed: true`。
9982
+ - `unconfirmed` 缺席 = 不是「没答复」:引擎真答了(4xx / 5xx / 409 各格),或可证没送出(调用前就已取消、注入动词同步抛、成因链上带连接阶段 / 构造期(含参数校验)/ 证书校验与客户端握手配置的码;OpenSSL 原因码 `ERR_SSL_*` 不算);在场恒 `true`(截止 / 时限到点、说不出没送出的传输失败、动词调用之后调用方取消 —— 传输失败那一形也可能其实没送出,如 fetch 的坏端口拦截,KL-249)。
9983
+
9984
+ **会话规则名册**
9985
+
9986
+ - `opts` 缺席 / `undefined` / `null` / `{}`,或 `roster` 缺席 / `undefined` / `null` = **没交名册**:与 0.84.1 逐字节同答(今天的判定,包括 KL-157 / KL-158 那两条射程限定)。**不是**「名册为空」。
9987
+ - 读得懂的空名册(`entries: []`)= 这一跑一只工具都没挂,是正面事实,**不是**缺席:今天能写的名字全部 `not_in_roster`。
9988
+ - 交了读不成的东西(第三参不是对象、读 `roster` 就抛、名册不是对象 / `entries` 不是数组 / 任一行坏)= 整批读不懂:`{ deliverable: {}, withheld: [], unreadable: true }`,不论 behavior;**不**退回「没交名册」—— 宿主交了名册就是要这道收紧,读不懂时闭合失败。
9989
+ - `withheld` 里没有 `not_in_roster` ≠ 名字一定在这一部署的每一跑都挂着:名册是交来的那一跑、那一条腿的(KL-204)。
9990
+ - `not_in_roster` 条目只有 `rule` / `why` 两键(不带 `currentName`:名册里差一个大小写的那只工具不是引擎说的「现名」;要不要提示「你是不是想写 X」由宿主定)。
9991
+
9992
+ **附带文件旧名与退役登记**
9993
+
9994
+ - `compact_boundary` 上 `_sema_attached_files` 缺席 ⇒ 零附件行(与 0.83.0 起一致)。旧名 `attachedFiles` 在场**不带任何语义**:包不读,行过境时原样保留。
9995
+ - 退役登记门、同名影子对账门、导出存活门:无新键、无新导出、无新类型。门侧的缺席:读不到的端单列 `SKIPPED-SECTION`,不当作「该端零消费」「该端没有影子」。
9996
+
9997
+ **plan-review 决断台账**
9998
+
9999
+ - 宿主不登记(不调 `notePlanReviewDecisionHandedOver`)= 本包只看自己看得见的交出:投递口从 POST 到投出结局的整段。作答经 `respondToQuestion` **同步**送进本包 responder 的宿主(不推迟 respond)零登记也够;把 respond 排在一次异步读之后、或自带投递路径的宿主必须登记,否则那一段本包看不见。
10000
+ - 登记后不调 `settle()` / `revoke()`:被本包投递口认领的笔由本包结算(正常形);从未被认领又没结算 / 撤销的笔一直算在飞 —— 只有 `notePlanReviewGateLeft` 的离门证据或进程结束能结它(无 TTL,KL-222)。
10001
+ - `pendingReadStartedAt` 缺席 = 只问此刻在飞;非数 / `NaN` 按缺席。
10002
+ - 不调 `notePlanReviewDecisionNotApplied`:本包仍自证 `not_sent` 与证得出同一道门实例的 `still_parked`(109a-11);证不出的 `still_parked`、`not_applied` / `unconfirmed` 的那一笔对早于它结算的读起点照旧算陈旧,下一次读(刻度晚于结算)照开。
10003
+ - 不调 `notePlanReviewGateLeft`:本包投递口的笔照常在投出结局时结算;宿主登记且未认领的笔靠宿主自己 `settle()` / `revoke()`。
10004
+ - 台账每进程至多 32 笔,超出先挤掉最旧的已结算且本包调用已返回的笔、再挤最旧的宿主登记且未认领的笔(被挤掉那一笔从此不算在飞、也不让快照陈旧;KL-226);本包投递口自己在飞的笔(离门证据先写了结算刻度的也算)不挤,挤不下就暂时超出上限。
10005
+ - `decisionHandedOver` 谓词缺席 = 只看台账;在场 = 台账没说话时再问它(并联,严格 `true` 才拒)。
10006
+
10007
+ **会话后台任务停止口**
10008
+
10009
+ - `opts` 缺席 / `null` = 不给:读默认槽的已装目标;`opts.sessionKey` 缺席 = 默认槽;给了连线时 `sessionKey` 不读。
10010
+ - `opts.wire` 缺席 = 已装目标形;在场而不可用 = `no_wire`、零请求,**不**回落已装目标。
10011
+ - `wire.capsBaseUrl` 缺席 = 能力未知 ⇒ `capability_unknown`、零请求(不猜、不读已装目标的证据)。
10012
+ - 能力读数缺席(没探 / 在飞 / 探测失败)= `capability_unknown`;`background` 键缺席 = 老服务端 ⇒ `no_exit_face`;`exitFaces` 缺席 ⇒ `no_exit_face`。
10013
+ - `stopped.receipts` 缺席 = 200 体读不出(不知道),**不是**「零条」;`receipts: []` = 零条 shell 行受据(后台代理 / 工作流本来就不出受据);`unreadableReceipts` 缺席 = 每一行都读出来了(不是 0 条读不出的「0」)。
10014
+ - `refused.status` / `errorCode` 缺席 = 错误对象上读不到(不编);`retryAfterMs` 缺席 = 引擎没给等待量(不是「可以立刻重试」,也不折 0)。
10015
+ - `error.unconfirmed` 缺席 = 不是「没答复」:引擎真答了,或可证没送出(调用前就已取消 —— 零请求;注入动词同步抛;成因链上带连接阶段 / 构造期(含参数校验)/ 证书校验与客户端握手配置的码;OpenSSL 原因码 `ERR_SSL_*` 不算);在场恒 `true`(含请求送达后连接断了等说不出没送出的传输失败、停止请求发出之后调用方取消)。
10016
+ - 归类口 `unrecognizedOutcome` 缺席 = 入参是四词之一,或入参根本不是串;在场 = 入参是串但不是四词之一(原样,含空串)。
10017
+ - `receipts[].outcome` 不在四词之内 ≠ 读不出:那是一条 `id` 读得出、词原样保留的行(上游新词等),端交归类口,按「可能仍在跑」说。
10018
+
10019
+ **服务端 7.104.0 会话侧**
10020
+
10021
+ - `sessionUnreadable` 缺席 = 这次拒绝的码不是 `corrupt_session`(或读不出码),**不是**「存档读得出」;只铸 `true`。
10022
+ - `isCorruptSessionRunRow`:行上 `result` 读得出终局而码不是本码 ⇒ `false`,**即使行列 `errorCode` 写着本码**(行列是同一份结果投影出来的,结果优先);`result` 缺席才看行列。
10023
+ - `session.records_skipped` 的 `dropped` / `entriesKept` = `'unknown'`:那一格读不出(缺席 / 负数 / 小数 / 非数 / 数字串 / `null` / 只在原型链上),**不是 0**;读不出不让整条通告缺席(「有记录被跳过」这件事本身仍是真的)。`entriesKept === 0` = 会话头在、条目一条没剩(真读数,上下文为空但这一轮照跑)。
10024
+ - `readSessionRecordsSkipped` 答 `undefined` = 不是这个码 / `detail` 不是对象 / `sessionId` 读不出 —— **不是**「没有跳过」。
10025
+ - 🔴 服务端接入契约第 17.4 节:非流式同步提交口(`POST /v1/tasks`)与续跑 verify 腿**没有通告投递口**,那两条腿上这条通告只进服务端运维日志 ⇒ 在这两条腿上「没收到 `session.records_skipped`」**不等于**「没有跳过记录」;本包的读器与派发口只对**收到的**帧说话,不推断缺席。另:服务端会话缓存命中的轮次不重新打开存档 ⇒ 那一轮也没有这一帧(去重单位 = 每次打开)(KL-238)。
10026
+ - `sessionRecordsSkippedNote` 答 `undefined` = 留下的条目不是恰好 0(正数,或读不出);`'unknown'` 不给那一句。
10027
+ - `SessionDeleteConflictDetail.remaining` 缺席 = 体上一项都读不出(键缺席 / 不是数组 / 全是坏项 / 空表),**不是**「没有活着的子代」(这个码本身就说明有);在场 = 逐项非空串、体上的次序原样、读数冻结。`activeTaskId` 缺席 = 体上读不到(不编);`code` 缺席 = 这条 409 没带机器码。
10028
+ - `DecideParkMovedDetail.taskId` 缺席 = 拒体上读不到那张卡的行句柄(不编)。
10029
+ - `sessionDeleteConflictFromError` 答 `null` = 不是 409(或不是对象);`decideParkMovedFromError` 答 `null` = 不是这三码之一。
10030
+
10031
+ **服务端 7.104.0 能力 / 同步体侧**
10032
+
10033
+ - 同步 park 体上 `terminal` 缺席 = 老服务端(7.64.0–7.103.x)的三键体,**不是**「没有终局」—— 扁平臂 `paused`。
10034
+ - `RunTerminalPausedRead.flatStatus` 缺席 = 载体上没有顶层 park 词(活流 `done.result` / run 行 `result` 恒如此),不是「不是复核」—— 复核判据另读门种。`gate` 缺席 = 这一形没报门(老三键体;或因由不是 `paused` 的打架形),不编门。
10035
+ - park 行 `result` 缺席 = 老服务端,或续跑腿那一拍没有结果在手 —— 行仍是 park,不是终局;重连腿照旧重试。
10036
+ - `fileHistoryCapture` 键缺席 ⇒ `not_reported`(7.96 及更老的服务端)≠ `off`;片段口给 `{}`。
10037
+ - 🔴 `fileHistoryCapture` 读数还没到(`unobserved`)⇒ 片段口给 `{}`,那一次运行照常捕获 —— 这不是「引擎不支持关」,是「还不知道」。用户关了文件历史的宿主,第一次提交前先等能力探测落地再拼请求(宿主义务,109a-18;KL-244)。
10038
+ - `sealedKey` 键缺席 ⇒ `not_reported` = 不要封(老服务端 / 没建成保管店);段在场而畸形 ⇒ 这一格删掉(`unobserved`),不是「有钥匙」。读数 `present` 里**没有** `createdAt` / 私钥位:那是设计(只出公钥三键),不是「读漏了」。
10039
+ - 折叠体 `blockedBy` 缺席 = 老服务端(7.95.0–7.103.x)上不带码的折叠;7.104.0 起恒在。
10040
+ - 接线回执 `fileHistory` 段:本版不投 ⇒ 端读不到 ≠ 那条腿在捕获(KL-245)。
10041
+
10042
+ **常驻姿态谓词**
10043
+
10044
+ - `facts` 缺席 / `null` / `settingsAskRuleMatched` 非布尔 = 宿主没报(同 §102b):除七个必问出身词外一律 `unknown`。报了读数仍 `unknown` = 本包不认识的出身词 ⇒ 出卡(109a-12)。
10045
+
10046
+ ### 109c. 黑盒判据骨架
10047
+
10048
+ > 🔴 标「本版证明」的格在**上一发布版**(0.84.1)产物上必须 FAIL、在 0.85.0 上必须 PASS;标「回归约束」的格两版都 PASS;标「端侧验收」「射程延伸」的格验的是真部署或端换读之后的行为;标「门」的格在装好开发依赖的本包源码目录里跑(只改门)。请记下两次跑的产物标识(版本 + tarball shasum)。前缀:G-T = 引擎事实表与 SDK 词表、G-P = 子代族注入连线、G-N = 会话规则名册、G-D = 退役登记与三名退出、G-E = 同名影子对账门、G-F = 导出存活门、G-L = plan-review 决断台账、G-H = 会话后台任务停止口、G-K = 服务端 7.104.0 会话侧、G-M = 服务端 7.104.0 能力 / 同步体侧、G-A = 常驻姿态谓词的 `unknown`。
10049
+
10050
+ **引擎事实表与 SDK 词表**
10051
+
10052
+ - **G-T1**(回归约束,纯包层):`ENGINE_NOTICE_CODES`、`Object.entries(ENGINE_NOTICE_AUDIENCE)`(含键序)、`MCP_INJECTION_DROP_REASONS` 与 0.84.1 逐元素逐序相同;三者 `Object.isFrozen === true`。
10053
+ - **G-T2**(本版证明,纯包层):`ASK_ORIGIN_WORDS === (await import('@sema-agent/sdk')).ASK_ORIGINS`、`APPROVAL_MANDATE_WORDS === sdk.PERSISTED_RULE_MANDATES`;SDK 12.0.1 下内容与 0.84.1 逐词逐序相同。判别点:0.84.1 上两个 `===` 为 `false`。
10054
+ - **G-T3**(本版证明;改口格):`Object.isFrozen(ASK_ORIGIN_WORDS) === false`、`Object.isFrozen(APPROVAL_MANDATE_WORDS) === false`(0.84.1 为 `true`)。
10055
+ - **G-T4**(回归约束):往 `sdk.PERSISTED_RULE_MANDATES` 就地 `push('zz_probe')` 后:`isApprovalMandateWord('zz_probe') === false`、`readApprovalMandate({ mandate: 'zz_probe' }) === undefined`;六个原词的三只口读数与 push 前逐格相同(测完复原)。
10056
+ - **G-T5**(回归约束):`SEAT_REASONING_EFFORTS` / `PERMISSION_MODE_INTENTS` / `HEADLESS_PERMISSION_WIRE_MODES` 值与序同 0.84.1;`PERMISSION_MODE_INTENTS !== HEADLESS_PERMISSION_WIRE_MODES`;三者 `Object.isFrozen === false`(与 0.84.1 同)。
10057
+ - **G-T6**(本版证明):`HITL_REJECT_MESSAGE === REJECT_MESSAGE`,字节同 0.84.1;已装包 `dist/adapt/wireShapes.js` 含该句一处、`dist/hitl/frameRouter.js` 零处(0.84.1 上 `dist/hitl/frameRouter.js` 一处)。
10058
+ - **G-T7**(回归约束):`noticeAudienceOf('instructions.source_changed') === 'user'`、`noticeAudienceOf('memory.consolidation_withheld') === 'operator'`、`engineNoticeInCatalog('memory.layer_locked_legacy') === true`、`noticeAudienceOf('brand.new_code') === 'operator'`(组合规则不变)。
10059
+
10060
+ **子代族注入连线**(驱动形:真 sdk `new AgentClient({ baseUrl, authToken: { mode: 'same-origin-relay' }, fetch })` + node:http 假引擎 A;已装目标(默认槽与 keyed 槽)另指一只只答 404 的假引擎 B;行台账经 `recordBgParentRun(taskId, runId, sessionId, sessionKey?)` 喂)
10061
+
10062
+ - **G-P1**(本版证明):八入口各带 `{ wire: { client } }`(任务句柄两口另带 `capsBaseUrl`)⇒ 请求打到 A、B 零命中、每一发无 `authorization` 头、`?session=` 是行登记的会话;旧签名(不带 `wire`,目标指 A)⇒ 结果逐字节同。0.84.1 产物:注入形请求打到 B(B 命中 ≥ 1)、结果按 B 的 404 落失败臂。
10063
+ - **G-P2**(本版证明):`fetchEngineTaskOutput(h, { wire: { client } })`(不带 `capsBaseUrl`,B 上有 `taskHandles` 证据)⇒ `null`、A / B 都零请求、一行 debug 含 `capabilit`;`stopEngineTask` 同形 ⇒ `{ ok: false, reason: 'unavailable', detail: /capabilit/ }`。
10064
+ - **G-P3**(本版证明):`engineTaskHandlesCapable(undefined, K)`(K 上有证据、槽指 B 无证据)⇒ `true`;`engineTaskHandlesCapable()` ⇒ `false`;`engineRowNeedsStopConfirm(id, undefined, K)` 同形。
10065
+ - **G-P4**(本版证明):`fetchEngineSubagentReport` 两次带 `{ wire: { client } }` ⇒ `GET /v1/capabilities` 两次;两次带 `{ wire: { client, capsBaseUrl: K } }` ⇒ 恰一次。
10066
+ - **G-P5**(本版证明):永不落定、只在 abort 时拒绝的替身 client ⇒ 报告 / 任务输出 / 委托提示在 60 s 截止处落 `null` / `unreadable`,转向 / 停止 / resume 落 `{ ok: false, reason: 'error', detail: /no answer/, unconfirmed: true }`,交给动词的 `signal.aborted === true`;同一入口真 409 / 真 500 ⇒ `unconfirmed` 键缺席;调用方交已 abort 的信号 ⇒ `error` 且键缺席;真 sdk client(缺省读重试)撞 429 + `Retry-After: 60` ⇒ 报告仍在截止处落定,底层请求的 signal 已 aborted。
10067
+ - **G-P6**(本版证明):`requestEngineCompact(undefined, { wire: { client, capsBaseUrl: K } })` 在飞 run ⇒ `'fired'` 且 A 收到 `POST /v1/runs/<run>/compact`;idle ⇒ `'armed'`,`onEngineTaskBound(run, undefined, { wire })` ⇒ 延迟发射到 A、arm 划掉;A 首发 404 ⇒ 单次重试仍到 A;K 上预热读到 `manualCompact:false` ⇒ 第二次 `'unsupported'`;不带 `capsBaseUrl` ⇒ 零 `GET /v1/capabilities`、照发。
10068
+ - **G-P7**(回归约束):八入口不带 `wire` ⇒ 体 / 头 / 会话参数 / 结局形状同 0.84.1(时限 / 传输失败 / 发出后取消三臂除外,见 P-13 与 CHANGELOG Changed 第 6 条;这三臂的判据在 G-P10 / G-P15 / G-P17 / G-P18 / G-P20)。
10069
+ - **G-P8**(回归约束):plan-review 三口经共用构造点后,`decidePlanReview` 三条「发不出」句子逐字同 0.84.1;注入形 / 目标形的 plan-review 场景矩阵两版同答。
10070
+ - **G-P9**(端侧验收;射程:网页端,中继部署):后台子代详情面「插话」/「继续」经本包入口带 `wire: { client, capsBaseUrl }` ⇒ 引擎收到体 `{ content }` 与行会话参数;停止经 `stopEngineTask` ⇒ 只有 200 才翻行。
10071
+ - **G-P10**(本版证明;已装目标形):目标指向假引擎、把全局 `fetch` 换成抛 `DOMException('…', 'TimeoutError')` 的 ⇒ `steerEngineSubagent` / `stopEngineTask` / `resumeSettledSubagent`(经 `resolveSubagentResumeContext` 的 facade)各答 `{ ok: false, reason: 'error', detail: /within the time limit this client allows/, unconfirmed: true }`;0.84.1 产物:`reason: 'error'` 但无 `unconfirmed`、`detail` 是 `TimeoutError` 原句。
10072
+ - **G-P11**(本版证明;分类器单源):`classifySubagentResumeFailure(new DOMException('…', 'TimeoutError'))` ⇒ `{ reason: 'error', detail: /within the time limit this client allows/, unconfirmed: true }`;`{ status: 409, errorCode: 'steering.still_running' }` ⇒ `still-running` 无键;`{ status: 500 }` / `AbortError` / `{ name: 'TimeoutError', status: 504, errorCode: … }` / `new Error('x')` ⇒ `error` 无键。0.84.1 产物:`TimeoutError` 入参 ⇒ `{ reason: 'error', detail: <原句> }` 无键。
10073
+ - **G-P12**(回归约束;已装目标按值快照):宿主装一只 getter 目标(`baseUrl` / `token` 读当下值);没有活跑时 `requestEngineCompact()` ⇒ `'armed'`,`onEngineTaskBound('run-old')` 之后、延迟发射之前把 getter 改到引擎 B(另一把 token)⇒ `POST /v1/runs/run-old/compact` 只到 A、带 A 的 token,B 零命中;有活跑时首发到 A 答 404、重试之前改到 B ⇒ 两发都到 A、都带 A 的 token。0.84.1 同答;判别点:共用点改成「调用那一刻才读目标字段」⇒ 两形都打到 B、带 B 的 token。
10074
+ - **G-P13**(回归约束;函数型命名空间):注入 client `{ assistant: <挂着 planReview 的函数>, runs: <挂着 get 的函数> }` ⇒ `decidePlanReview` 发出恰 1 次、回拉 1 次、`took_effect`;`armPlanReviewApproval(<plan park 结果>, undefined, { wire: { client } })` ⇒ `true`、恰一帧 question。0.84.1 同答;判别点:动词路径中间段只收对象的判定 ⇒ 零请求、`not_sent`、不出卡。
10075
+ - **G-P14**(本版证明;同步抛):注入的 `runs.resumeSubagent` 同步抛 `Object.assign(new Error('evicted'), { status: 409, errorCode: 'resume.evicted' })` ⇒ `resumeSettledSubagent` 答 `retention-lapsed`,与同一对象经 `Promise.reject` 同答;注入的 `runs.taskStop` 同步抛 409 `stop.not_landed` ⇒ `stopEngineTask` 答 `not_landed`,与拒绝形同答。判别点:同步抛的错误对象被拍平成串 ⇒ 两者都落 `error`。
10076
+ - **G-P15**(本版证明;连接中途断):真 http 服务端读完整个请求体后掐掉连接 ⇒ `steerEngineSubagent` / `resumeSettledSubagent` / `stopEngineTask`(注入形)与 `steerEngineSubagent`(已装目标形)各答 `{ ok: false, reason: 'error', detail: /connection failed before an answer came back/, unconfirmed: true }`,服务端实收完整请求;真拒连(监听后关掉的端口,`ECONNREFUSED`)⇒ 三只写腿 `error`、无 `unconfirmed`;分类器对 `new TypeError('fetch failed', { cause: <code: 'UND_ERR_SOCKET'> })` 与 `new TypeError('Failed to fetch')` ⇒ `unconfirmed: true`,成因链上带 `ECONNREFUSED` / `ENOTFOUND` / `EAI_AGAIN` / `UND_ERR_CONNECT_TIMEOUT`(含 `AggregateError` 形)⇒ 无键。0.84.1:这一形 `detail` 是原句、无键。
10077
+ - **G-P16**(本版证明;决断腿同一判据):决断体已送达、答复前连接被断 ⇒ `effect: 'unconfirmed'`,结局正文含「the connection failed before an answer came back」与「may have taken effect」、不含「could not reach the engine」;真拒连 ⇒ 仍「could not reach the engine」(可证没送出的其余形见 G-P17)。0.84.1:前一形是「The plan_review decision could not reach the engine: TypeError: fetch failed」。
10078
+ - **G-P17**(本版证明;可证没送出):`classifySubagentResumeFailure(new TypeError('fetch failed', { cause: <带码的 Error> }))` 对 `CERT_HAS_EXPIRED` / `DEPTH_ZERO_SELF_SIGNED_CERT` / `UNABLE_TO_VERIFY_LEAF_SIGNATURE` / `ERR_TLS_CERT_ALTNAME_INVALID` / `syscall: 'connect'` 的 `EHOSTUNREACH` · `ENETUNREACH` · `ETIMEDOUT` / 每条尝试都是 `syscall: 'connect'` 的 `AggregateError`,以及 `ERR_INVALID_URL` 成因链 / `ERR_INVALID_CHAR` / `ERR_HTTP_INVALID_HEADER_VALUE`,与顶层带 `ERR_INVALID_ARG_TYPE` 的 `TypeError` ⇒ 无 `unconfirmed` 键;对 `syscall: 'read'` 的 `ETIMEDOUT`、不带 `syscall` 的 `EHOSTUNREACH`、`ERR_TLS_RENEGOTIATION_DISABLED`、`ERR_SSL_WRONG_VERSION_NUMBER`、`ERR_SSL_CIPHER_OPERATION_FAILED`、undici 不带码的非法头值、`bad port`、`ECONNRESET` ⇒ `unconfirmed: true`。注入动词同步抛 `TypeError` ⇒ `steerEngineSubagent` / `stopEngineTask` / `resumeSettledSubagent` 都 `error` 且无键。`decidePlanReview` 注入形同步抛 / 证书校验 `CERT_HAS_EXPIRED` / 连接阶段 `EHOSTUNREACH` / 非法 URL,与已装目标形真非法 URL(`baseUrl` 带空格)⇒ 正文恰以「The plan_review decision could not reach the engine: 」起、`effect: 'unconfirmed'`、引擎零实收;已装目标形 `https` 指向明文引擎(真 `ERR_SSL_WRONG_VERSION_NUMBER`,引擎零实收)⇒ 正文含「the connection failed before an answer came back」与「may have taken effect」、不含「could not reach the engine」(保守方向,KL-249)。判别点:「连接阶段四码之外的 `TypeError` 一律标」的判据把可证没送出的那几形也标 / 落「连接断了」那一句;按 `ERR_SSL_` 前缀判没送出的判据把明文端口那一形判成 could not reach。0.84.1:决断腿这些形同是「could not reach the engine」;写动词无此键。
10079
+ - **G-P18**(本版证明;发出之后取消):永不落定、只在取消时拒绝的替身 client 注入,动词已调用之后调用方 abort ⇒ `stopEngineTask` / `resumeSettledSubagent` 各答 `{ ok: false, reason: 'error', detail: /cancelled after the request was sent/, unconfirmed: true }`;已装目标形(目标指向收下请求体、一直不答的 http 服务端,实收两次)同答;调用前已取消 ⇒ 零请求(spy 一发都没有)、无键。0.84.1:发出之后取消 ⇒ `detail` 是取消原句、无键。
10080
+ - **G-P19**(本版证明;取消独立落定):注入真 `AgentClient`(sdk 缺省读重试),能力读答 429 + `Retry-After: 60`,30 ms 时调用方取消 ⇒ `fetchEngineSubagentReport` 在 1 s 内落定 `null`;正常落定与截止落定之后,调用方信号上的 `abort` 监听零只(`getEventListeners`)。判别点:只把信号交给动词、外层不竞速的实现被退避睡眠拖到截止。
10081
+ - **G-P20**(本版证明;TLS 码证明不了没送出):驱动 = 真 `AgentClient` + fetch 形的宿主传输(http 请求跑在免证书的 TLS 1.2 PSK 连接上;TLS 层失败按 fetch 的形拒绝 `new TypeError('fetch failed', { cause: <原 TLS 错误> })`)。对端**读完整个请求**之后回一条内容损坏的应用数据记录(客户端得 `ERR_SSL_CIPHER_OPERATION_FAILED`)/ 在 TLS 连接上回明文 HTTP(`ERR_SSL_WRONG_VERSION_NUMBER`)⇒ `steerEngineSubagent` / `resumeSettledSubagent` / `stopEngineTask`(注入形)各答 `{ ok: false, reason: 'error', detail: /connection failed before an answer came back/, unconfirmed: true }`,对端实收每一发;`decidePlanReview` 同驱动 ⇒ `effect: 'unconfirmed'`,正文含「the connection failed before an answer came back」与「may have taken effect」、不含「could not reach the engine」。判别点:按 `ERR_SSL_` 前缀判没送出 ⇒ 写动词无键、决断说 could not reach。0.84.1:写动词无此键;决断腿说「could not reach the engine」。
10082
+ - **G-P21**(本版证明;调用前已取消,原因不是 `AbortError`):目标指向假引擎,调用前交一只已到点的 `AbortSignal.timeout(1)` / 以 `new TypeError('the host closed this session')` 为原因取消的信号 ⇒ `stopEngineTask` / `resumeSettledSubagent`(已装目标形)各答 `{ ok: false, reason: 'error', detail: <原取消句> }`(`The operation was aborted due to timeout` / `the host closed this session`)、无 `unconfirmed`、引擎零实收。判别点:按错误名判阶段 ⇒ 前者落「time limit」那一句、后者落「connection failed」那一句,都带键。0.84.1 同答。
10083
+ - **G-P22**(本版证明;没有 `AbortSignal.any` 的运行时):临时置空 `AbortSignal.any`,同一只长寿的调用方信号上连发(报告正常落定 ×5 / 任务停止撞 500 ×5 / 挂住的 client 到本包截止 / 发出之后取消)⇒ 每一路之后 `getEventListeners(signal, 'abort').length === 0`;发出之后取消那一发照答 `unconfirmed: true` + 「只取消了等待」那一句。判别点:并联口挂在调用方信号上的监听不摘 ⇒ 本包经注入 client 的每一发留一只(报告五次 = 能力读与终报读各五发 ⇒ 10 只)。
10084
+ - **G-P23**(本版证明;「没送出」只对那一次同步抛成立):同一只 `TypeError` 对象,第一次由动词同步抛 ⇒ `resumeSettledSubagent` 无键;第二次动词先返回 promise、再以它异步拒绝(已投递一次)⇒ `unconfirmed: true` + 「connection failed before an answer came back」(经注入 facade / 宿主自给的 facade 两形)。`decidePlanReview` 同驱动 ⇒ 第一次「could not reach the engine」、第二次「可能已生效」那一句。判别点:「没送出」的证据留在错误对象上 ⇒ 第二次也无键 / could not reach。
10085
+ - **G-P24**(本版证明;外来信号与 `null`):调用方信号是别的 realm / polyfill 的对象(继承 `EventTarget`、有 `aborted`,不是本 realm 的 `AbortSignal`)⇒ `stopEngineTask` / `resumeSettledSubagent` 已装目标形与注入形都答 `{ ok: false, reason: 'error', detail: <参数校验原句 The "signals[0]" argument must be an instance of AbortSignal…> }`、无键、零请求,两形逐字节同(已装目标形与 0.84.1 逐字节同);注入形 `signal: null` ⇒ 报告 / 任务停止 / resume 照发,结局与不给信号逐字节同。判别点:把参数校验 `TypeError` 当连接断 ⇒ 已装目标形带键;`null` 交给并联口 ⇒ 注入形动词不调、零请求。
10086
+ - **G-P25**(本版证明;两份包实例):把 `dist` 复制到另一目录再加载一份(两份各自的错误类),A 份注入 facade 动词调用之后被取消 / 本包截止先到所抛的错误交 B 份的 `classifySubagentResumeFailure` ⇒ 与 A 份判决逐字节同(`unconfirmed: true`、同一句)。判别点:只按 `instanceof` 认 ⇒ B 份落普通 `error`、无键。
10087
+
10088
+ **会话规则名册**
10089
+
10090
+ - **G-N1**(本版证明,纯包层):名册 `R = { entries: [{ name: 'Read' }, { name: 'ListAgents', aliases: ['ListPeers'] }, { name: 'mcp__srv__tool' }] }`。`sessionPolicyDeliverable('deny', ['Write'], { roster: R })` ⇒ `{ deliverable: {}, withheld: [{ rule: 'Write', why: 'not_in_roster' }] }`;`['read']` / `['READ']` / `['mcp__srv__other']` / `['mcp__SRV__tool']` 同(各恰一条 `not_in_roster`);`['ListPeers']` ⇒ `{ deliverable: { toolDeny: ['ListPeers'] }, withheld: [] }`;`['Read', 'Write']` ⇒ `deliverable` 为 `{}`、`withheld` 只列 `Write`;`['mcp__srv__tool', 'ListAgents', 'Read']` ⇒ 整批能写、序不变。判别点:0.84.1 不认第三参,`['Write']` 答能写。
10091
+ - **G-N2**(本版证明,纯包层):`SESSION_POLICY_WITHHELD_WHY` 恰七词、最后一个是 `not_in_roster`、前六个与 0.84.1 同序;`sessionPolicyWithheldNotice('not_in_roster')` 逐字等于 109a-5 那一句;旧六词的句子与 0.84.1 逐字节同。
10092
+ - **G-N3**(回归约束,纯包层):§106c 的 P11 / P12 两格与 §101c 的 P1 格的每一形,在两参、`undefined`、`null`、`{}`、`{ roster: undefined }`、`{ roster: null }` 六种写法下答案与 0.84.1 逐字节同。
10093
+ - **G-N4**(本版证明 —— 只收紧,纯包层):把 `Task` / `KillShell` / `bash` / `foo__bar` / ` Read` / `Bash*` / `mcp__srv` / `Bash(x)` 各自放进名册(作名:`{ entries: [{ name: X }] }`;作别名:`{ entries: [{ name: 'DeployTool', aliases: [X] }] }`),`sessionPolicyDeliverable('deny', [X], { roster })` 与不交名册逐字节同(`Task` 仍带 `currentName: 'Agent'`)。判别点:一个「在册即写」的实现会把它们判能写。
10094
+ - **G-N5**(本版证明,纯包层):`{ roster: 'Read' }` / `{ roster: [] }` / `{ roster: {} }` / `{ roster: { entries: [{ name: 7 }] } }` / `{ roster: { entries: [{ name: 'Read' }, { name: '' }] } }` / 第三参为 `'x'` ⇒ deny 与 ask 都答 `{ deliverable: {}, withheld: [], unreadable: true }`、不抛;`{ roster: { entries: [] } }` ⇒ `['Read']` 答 `not_in_roster`、不带 `unreadable`。判别点:0.84.1 忽略第三参,答能写。
10095
+ - **G-N6**(本版证明;引擎层 —— 端到端):包 + 引擎包(不需要服务端):挂一只带别名的自定义工具跑一次,从这一跑的 `wiring_manifest` 经 `projectToolRoster` 取名册;带这份名册判能写的每一个名字(名与别名)写进内存会话规则店后同一会话再跑一次 ⇒ 准备阶段通过,且引擎的名字审计告警(`config.toolpolicy.unmatched_names`)里没有它;以 `not_in_roster` 扣下的名字(大小写变体、拼写错、名册外的名)写进去 ⇒ 审计告警点名它「匹配不到这一跑挂着的任何工具」(说明扣下的理由属实)。射程延伸(真部署,宿主换调并交名册之后):一跑进行中经「本会话规则」加 deny `Raed`(拼错)⇒ 会话规则记录**不写**,出现 109a-5 那一句,回落告知照常;加 deny `Read` ⇒ 照写。判别点:用 0.84.1 的判定(或宿主不交名册)同一操作 ⇒ `Raed` 写成功、出现写成功那一句,而这一跑里它一只工具都拦不住。
10096
+ - **G-N7**(条件格,宿主侧仍有自己的名册闸时):同一份名册下,本包与宿主那道闸的答案只在两类上不同 —— 别名(本包写、宿主那道闸不写)与名册里恰有的引擎拒启名(本包不写、宿主那道闸写);名册没报过时宿主那道闸一条不写,本包按今天行为判。其余逐例同答。
10097
+
10098
+ **附带文件旧名读法、退役登记、三名退出**
10099
+
10100
+ - **G-D1**(本版证明,纯包层;D-1):把只带旧名的 `system/compact_boundary` 行(`attachedFiles:[{path:'/old/b.ts', chars:1, truncated:false}]`,无 `_sema_attached_files`)直接喂 `createWireToCcAdapter().adapt()` ⇒ chrome 面零条 `attachment.type === 'compact_file_reference'`;转录面恰一行 `system/compact_boundary`,其 `attachedFiles` 与输入逐项同。判别点:0.84.1 上产出一条 `filename === '/old/b.ts'` 的附件行。
10101
+ - **G-D2**(回归约束,纯包层):同一行再加 `_sema_attached_files:[{path:'/new/c.ts'}]` ⇒ 附件行恰一条、`filename === '/new/c.ts'`(新名优先、不重复出行)。
10102
+ - **G-D3**(回归约束;现役路):构造 wire `compacted` 帧带 `attachedFiles:[{path:'/w/a.ts', chars:3, truncated:false}, {path:''}]` 经本包投影进 `adapt()` ⇒ `compact_boundary` 带 `_sema_attached_files`(两项原样)、不带 `attachedFiles`;附件行恰一条 `/w/a.ts`(空路径不产)—— 与 0.84.1 逐字同。
10103
+ - **G-D4**(门,源码目录自跑;D-2):`node scripts/run-retirement-ledger-test.mjs` ⇒ 绿,打出在册每行一条 `ROW` 读数;把在册任一行的 `retireBy` 改成当前 `package.json` 版本 ⇒ 红且含「到期未退役」;在附带文件那一处读点加回旧名读法 ⇒ 红且点名已退役行复活;改动某行登记的条件原句在源码里的措辞 ⇒ 红且点名漂移;删掉某行锚所在的代码 ⇒ 红且点名死行。
10104
+ - **G-D5**(门,三态):不设参照树环境变量且同级无参照树 ⇒ exit 0,打 `SKIPPED-SECTION` 点名按端侧事件的那一行未判;参照树环境变量指向一个不是终端源码树的目录 ⇒ exit 2,不给读数。
10105
+ - **G-D6**(门):差分门在参照树装的本包 ≥ 0.75.1 时绿,hook 探针行两侧原词逐字比(不再有参照侧版本时差归一);B4 正向对照 hook 下限照旧。
10106
+ - **G-D7**(本版证明,纯包层;D-3):`import * as m from '@sema-agent/client-core'`,对三个 0.85.0 退出公面的名字逐名判 `name in m` ⇒ 皆 `false`;`@sema-agent/sdk` 根入口的拒绝上限词表(本包侧 🔧 0.85.0 已退出公面)仍是两词数组。判别点:0.84.1 上三者皆 `true`,且本包再导出的那一份与 sdk 的是同一个数组对象。
10107
+ - **G-D8**(回归约束,纯包层;D-4):`installHitlHostSurface({ showNotice: (n) => got.push(n), clearNoticeIfCurrent() {}, surfaceClassifierDeny() {} })` 后调 `surfaceRememberNotApplied()` ⇒ `got` 恰一条,`text === REMEMBER_NOT_APPLIED_WARN_TEXT`、`color === 'warning'`、`priority === 'immediate'`;`installHitlHostSurface(null)` 后再调 ⇒ 不抛。
10108
+ - **G-D9**(门,源码目录自跑;D-5):`node scripts/run-integration-doc-freshness-test.mjs` ⇒ 绿;在 §2z 删掉任一名录行 / 把某行退出版本改错 / 删掉那句话 / 往任一冻结段里写一个名录外的已退役名 ⇒ 各自红且点名;在活段写一个不带注记的已退役名 ⇒ 红(原规则照旧)。
10109
+
10110
+ **同名影子对账门 / 导出存活门**(只改门)
10111
+
10112
+ - **G-E1**(门,源码目录自跑;E-1):四端克隆在盘(`SEMA_CLI_ROOT` / `SEMA_WEB_CLIENT_ROOT` / `SEMA_WEB_ADMIN_ROOT` / `SEMA_DESKTOP_ROOT` 指向各端克隆,或按同级目录找)⇒ `node scripts/run-layering-shadow-export-test.mjs` 绿;每读一个端打一行 `SOURCE`(ref / 8 位提交 / 日期),机器证明行打 `PROOF … 成立`,语义差分行打 `DIFF … 类外分歧 0`;缺席的端打 `SKIPPED-SECTION`、总结行记 PARTIAL(不当绿)。
10113
+ - **G-E2**(门,负控):负控常驻套里这道门的三枚真篡改(差分行登记清空 / 薄包装行改判「函数对象别名」/ 核对记录哈希换掉)⇒ 各自红,分别点名语义差分、机器证明、核对过期(三枚都要终端克隆在场)。
10114
+ - **G-F1**(门,源码目录自跑;F-1):四端克隆在盘 ⇒ `node scripts/run-export-liveness-test.mjs` 绿;每读一个 ref 打一行 `SOURCE`;尺子自证 E0 在真 git 临时仓里只抓到「近期分支上的 import」那一条并归因到它的 ref 与文件:行,悬空 ref 与坏 ref 两形 exit 2。
10115
+ - **G-F2**(门,负控):负控常驻套里这道门的第二枚(按条件挑一只自报消费端非空、端树在场的 contract 行改登 retire)⇒ E 段 retire 格红且点名挑中的名字;挑不到行 ⇒ 负控套 exit 9。
10116
+
10117
+ **plan-review 决断台账**(夹具:`installNotificationQueuePort` 收结局;`onQuestionFrame` 收帧口对 `question` 帧即 `registerArmedGateFromQuestionId`;决断走注入的最小 client(`{ assistant: { planReview }, runs: { get } }`,POST 与回拉各一只可挂起的口),零网络)
10118
+
10119
+ - **G-L1**(本版证明,纯包层):根入口六只口为函数、声明面有 `PlanReviewDecisionHandle`(`settle(): void` / `revoke(): void`)与 `ReopenPlanReviewOpts.pendingReadStartedAt?: number`。判别点:0.84.1 为 `undefined`。
10120
+ - **G-L2**(本版证明;L-1):`notePlanReviewDecisionHandedOver('T')` 之后 `reopenPlanReviewCard('T', { deliverDecision })`(同步形 / 回执形 / `trigger: 'automatic'`)⇒ 恰 `{ reopened: false, _sema_decisionInFlight: true }`,零新卡;`settle()` ⇒ `reopened: true`。同任务第二次登记 ⇒ `null`;`revoke()` ⇒ 不再拒。
10121
+ - **G-L3**(本版证明;L-2 / L-3):登记 → `m = planReviewPendingReadMark()` → `settle()`:`reopenPlanReviewCard('T', { pendingReadStartedAt: m })` ⇒ 拒;不带读起点 ⇒ 开;晚于结算的刻度 ⇒ 开;`pendingReadStartedAt: 'x'` ⇒ 开、不抛。`planReviewDecisionInFlight('T', m) === true` 且 `planReviewDecisionInFlight('T') === false`。
10122
+ - **G-L4**(本版证明;L-4):同上陈旧读起点先拒;`notePlanReviewDecisionNotApplied('T')` 之后同一读起点 ⇒ 开。另一笔在飞时调它 ⇒ 仍拒。
10123
+ - **G-L5**(本版证明,判别格;L-7):注入 client 的 POST 答 200、`runs.get` 挂住:回拉挂住期间 `reopenPlanReviewCard('T')` ⇒ 拒;放开回拉、`decidePlanReview` 落定 ⇒ 开;在放开之前取的读起点 ⇒ 拒。判别点:0.84.1 在回拉期间答 `reopened: true`。
10124
+ - **G-L6**(本版证明):队列口 `enqueueMetaPrompt` 里同步取 `planReviewPendingReadMark()`,决断生效形(回拉 `completed`)⇒ 对这一笔 `planReviewDecisionInFlight('T', 那枚刻度) === false`、带它重开 ⇒ 开(结算发生在投出结局之前)。
10125
+ - **G-L7**(本版证明;失败分类):读起点先取,再 `decidePlanReview`:坏 client(`{ client: {} }`,`not_sent`)⇒ 陈旧读起点也开;回拉 `needs_review`(`still_parked`;公开口直调,没有决断前的门身份)⇒ 拒(证不出同一道门;证得出的形见 G-L15);回拉 `completed`(`took_effect`)⇒ 拒;POST 抛 404 `not_found.plan_review`(`not_applied`)⇒ 拒,`notePlanReviewDecisionNotApplied` 之后 ⇒ 开。
10126
+ - **G-L8**(本版证明;L-1 认领):登记 → `decidePlanReview`(POST 挂住)⇒ 拒;宿主 `settle()` ⇒ 仍拒(认领后结算权归本包);第二次 `decidePlanReview` ⇒ 零第二次 POST、零第二条结局;再登记 ⇒ `null`;放开 POST、结局投出 ⇒ 开、结局恰一条。登记 → `decidePlanReview`(快 client)落定、宿主**不**调 `settle()` ⇒ 开(判别点:不认领的实现留一笔永不结算的登记 ⇒ 永远拒)。登记 → `revoke()` → `decidePlanReview` ⇒ 自铸一笔并结算,开。
10127
+ - **G-L9**(本版证明;并发 / L-5):第一笔回拉挂住时第二笔 `decidePlanReview`(POST 挂住)照发(闩只盖 POST);任一未结算 ⇒ 拒;第一笔结局投出后仍拒;两笔都投出 ⇒ 开;夹在两次结算之间取的读起点 ⇒ 拒;两条结局 `decision` 各归其主、`dispatchNo` 递增。从未被认领的登记 ⇒ 拒,`notePlanReviewGateLeft('T')` ⇒ 开;POST 在飞时调它 ⇒ 第二次 `decidePlanReview` 仍零 POST、结局照常恰一条。
10128
+ - **G-L10**(本版证明;读后复核):用户卡关掉(记号 `{g1}`)、门换成 `{g2}`、自动触发(异步形)的门实例读挂住:读期间登记 ⇒ `{ reopened: false, _sema_decisionInFlight: true }`、零新卡;读期间登记**并** `settle()` ⇒ 仍拒(按判定前刻度判陈旧);登记又 `revoke()` ⇒ 新门照开;什么都没发生 ⇒ 开。
10129
+ - **G-L11**(回归约束):投递口闩四格(同任务 POST 在飞第二次拒 / 落地后第二次照发 / 去键重发期间拒 / 旧调用的收口不放新调用的闩)两版同答;`trigger` 缺席 / `'user'` / `'automatic'` 撞记号的判决与 0.84.1 同;判决键集恰 `reopened` + `_sema_decisionInFlight`。
10130
+ - **G-L12**(端侧验收;射程:终端,换读 L-1 / L-2 / L-4 / L-8 并删自带台账之后):plan 卡按 Yes ⇒ 决断在飞与回拉期间对账 / 补捞读到的同 run plan_review 行**不**铸再批卡、随后出生的工具审批卡上屏;决断失败(引擎仍锁同门)⇒ 下一拍补捞把卡放回;拒掉计划后同 run 第二道 plan 门 ⇒ 卡照开。
10131
+ - **G-L13**(门;与终端台账对拍):终端现行台账模块整模块转译运行,22 条向量程序(交出 / 结算 / 读起点早晚 / 没生效例外 / 撤销 / 离门 / 去重 / 有界 / 幂等 / 坏入参 / 刻度单调 / 先后两笔)两边逐检查点同答(终端那一份退役后如实 SKIP)。
10132
+ - **G-L14**(本版证明;容量不丢闩):33 笔不同任务的 `decidePlanReview` 同时 POST 在飞,再对第一笔重复批准 ⇒ 第一笔 POST 恰一次、仍在飞,全部落定后每笔结局恰一条、不留在飞;本包 32 笔在飞占满后宿主再登记 5 笔 ⇒ 第一笔重复批准仍零第二次 POST,宿主登记里最旧的被挤、最新一笔在账。0.84.1(在飞表无界)同输入只发一次;判别点:到顶按插入序挤最旧的实现 ⇒ 第一笔发两次。
10133
+ - **G-L15**(本版证明;同一道门实例):`armPlanReviewApproval({ taskId, terminal: { kind: 'paused', gate: { kind: 'plan_review' }, checkpointId: 'cp_A' } }, undefined, { wire })` → 取读起点 → 卡上批准,回拉答 `needs_review` 且行 `result.terminal.checkpointId` 为 `'cp_B'`(推进到新 plan 门)⇒ `advanced`(见 G-L17)、旧读起点拒开;为 `'cp_A'` ⇒ `still_parked`、旧读起点照开;立卡结果没带 / 回拉行 paused 因由没带 / 回拉行没有 `result` ⇒ 拒开;`approve` + `acceptEdits` 撞 400 `request.field_conflict` ⇒ `still_parked`、照开。判别点:按「回拉 `needs_review` 即自证」的实现在 `'cp_B'` 那一形照开(旧快照顶掉当前卡)。
10134
+ - **G-L16**(本版证明;离门不放容量闩):注入 client 的 POST 挂住 → `notePlanReviewGateLeft('G0')` → 他任务 32 笔 `notePlanReviewDecisionHandedOver`(登记后结算 / 不结算两形)→ 对 `G0` 重复批准 ⇒ POST 恰一次、结局恰一条;本包 32 笔决断都落定后再登记一笔 ⇒ 最旧那笔出账(它对早于结算的读起点从判陈旧变成不判)。判别点:容量淘汰「先挤已结算」而离门证据给在飞笔写了结算刻度 ⇒ 在飞笔被挤、第二次 POST 发出。
10135
+ - **G-L17**(本版证明;门身份变了):`armPlanReviewApproval` 立卡于 `cp_A` → 取读起点 → 卡上批准,回拉答 `needs_review` 且 paused 因由 `cp_B` ⇒ 结局 `effect: 'advanced'`,正文含「advanced to a NEW approval gate (post-decide status: needs_review)」、不含「did NOT take effect」「STILL locked」;旧读起点仍拒开(不自证未生效)。0.84.1:`still_parked` 与「STILL locked … did NOT take effect」。
10136
+
10137
+ **会话后台任务停止口**(驱动形:真 sdk `new AgentClient({ baseUrl, authToken: { mode: 'same-origin-relay' }, fetch })` + node:http 假引擎 A(实现 `POST /v1/sessions/:id/background/stop`,计数并记下实收体);已装目标(默认槽与 keyed 槽)另指一只只答 404 的假引擎 B;能力证据经 `kickEngineCapsProbe(key, async () => caps)` + `await engineCapsSettled(key)` 种入;「本版证明」格在 0.84.1 上 FAIL 的判别点是根入口没有 `stopEngineSessionBackground`)
10138
+
10139
+ - **G-H1**(本版证明):`stopEngineSessionBackground('sess 1/α', { includeRetained: true }, { wire: { client, capsBaseUrl: K } })`(K 上 `background.exitFaces: true`)⇒ `{ kind: 'stopped', receipts: [四条原样] }`;A 恰收一发,路径段是 `encodeURIComponent('sess 1/α')`,实收体逐字节 `{"includeRetained":true}`;B 零命中;出站零 `authorization`。`{ includeRetained: false }` ⇒ 实收体 `{"includeRetained":false}`;调用方交 `{ includeRetained: true, extra: 1 }` ⇒ 实收体仍恰好一键。已装目标形(不带 `wire`,目标指 A、A 的 `baseUrl` 上有证据)⇒ 结局逐字节同注入形。
10140
+ - **G-H2**(本版证明):以下每一形 A 与 B 都零请求 —— 注入形不带 `capsBaseUrl` ⇒ `capability_unknown`(A、B 上都有证据也一样);K 没探过 ⇒ `capability_unknown`;K 上无 `background` 键 / `exitFaces: false` / 缺 `exitFaces` / `exitFaces: 'true'` / `background: false` / `exitFaces` 只在原型链上 ⇒ `no_exit_face`;已装目标形目标 `baseUrl` 上 `exitFaces: false` ⇒ `no_exit_face`、没探过 ⇒ `capability_unknown`。
10141
+ - **G-H3**(本版证明):A 答 200 `{ receipts: [{id:'b1',outcome:'killed'}, {id:'x',outcome:'terminated'}, {outcome:'killed'}, 'b9', {id:'y',outcome:''}, {id:'z',outcome:7}, {id:'b5',outcome:'no_pgid'}] }` ⇒ `receipts` 恰三条(b1 / x〔`outcome: 'terminated'` 原样〕/ b5,原序)、`unreadableReceipts: 4`;x 那一条交 `engineSessionBackgroundReceiptReadingOf` ⇒ `may_be_running` + `unrecognizedOutcome: 'terminated'`(不是 `stopped`);A 答 200 `{}` / `null` / 空体 / `{ receipts: 'x' }` ⇒ `{ kind: 'stopped' }` 且**没有** `receipts` 键;A 答 `{ receipts: [] }` ⇒ `receipts: []` 在场、无 `unreadableReceipts`。
10142
+ - **G-H4**(本版证明):A 答 503 `auth.service_token_required` ⇒ `refused` / `credentials_required`(`status: 503`);404 `not_found.session` ⇒ `session_not_found`,404 `not_found.route` ⇒ `route_absent`(同状态不同码);501 `capability.session_ownership_required` ⇒ `ownership_required`;400 `request.body_shape` ⇒ `bad_request`;无码 403 ⇒ `not_permitted` 且无 `errorCode` 键;429 `limit.rate_exceeded` + `Retry-After: 7` ⇒ `rate_limited` + `retryAfterMs: 7000`,无头 ⇒ 无 `retryAfterMs` 键;500 `internal.error` ⇒ `error`。以上各格都无 `unconfirmed` 键,A 各恰一发。
10143
+ - **G-H5**(本版证明):永不落定、只在取消时拒绝的替身 client(注入形)⇒ 60 s 截止处 `{ kind: 'error', detail: /no answer from the engine within/, unconfirmed: true }`,交给动词的信号已 abort;已装目标形把全局 `fetch` 换成抛 `DOMException('…', 'TimeoutError')` ⇒ 同一位、`detail` 说「within the time limit this client allows」且不带毫秒数;调用方交已取消的信号 / 目标指向真拒连的端口(监听后关掉,`ECONNREFUSED`)/ 替身抛 `{ name: 'TimeoutError', status: 504, errorCode: 'gateway.timeout' }` ⇒ `error` 且无 `unconfirmed` 键。
10144
+ - **G-H6**(本版证明):用 sdk 缺省重试配置的中继 client 注入,A 答 500 / 429 / 503 ⇒ A 各恰收一发 POST;连调两次 ⇒ A 收两发(不合并、不缓存结局)。
10145
+ - **G-H7**(本版证明):`sessionId` 为 `''` / `7` / 缺席,`body` 为缺席 / `null` / `{}` / `{ includeRetained: 'true' }` / 原型链上的 `includeRetained` / 取值器抛,`opts` 为串 / 取值器抛,`opts.sessionKey` 为 `''`,`opts.signal` 为串 ⇒ `kind: 'unavailable'`、`why: 'bad_input'`(另带一句 `detail` 点名哪一项不合形);连线 `null` / 串 / 读 `client` 就抛、client `{}` / `{ sessions: {} }` / 只有 `sessions.background` ⇒ `no_wire`(已装目标指 A 且 A 上有证据,A 仍零命中)。全部不抛、零未处理拒绝、零请求。
10146
+ - **G-H8**(回归约束):`readEngineAgentRegistry` 与 §107 B-1 – B-6 各格照旧(本口不改读口、归类口、补行谓词)。
10147
+ - **G-H9**(端侧验收;射程:终端,共用活引擎):会话里起一条后台命令后执行「停 / 杀会话」命令 ⇒ 该命令报已停之前停止口被调(`includeRetained: false`)、受据逐条落屏:`killed` / `already_gone` 的那一条进程确实已不在;`no_pgid` 的说「可能还在跑」;服务端没有停止口(能力位缺席)⇒ 屏上说后台命令可能仍在跑并列出,不报已停。
10148
+ - **G-H10**(端侧验收;射程:终端,退出时引擎留着):能力位为真时退出对话框出「Exit and stop tasks」臂,选它 ⇒ 停止口被调(`includeRetained: true`)、按受据如实列出没停下的行;能力位缺席 / `capability_unknown` ⇒ 不出这一臂(与今天「Exit and leave tasks running」同句)。
10149
+ - **G-H11**(本版证明):`engineSessionBackgroundReceiptReadingOf` 对 `killed` / `already_gone` ⇒ `{ state: 'stopped', text: 'Stopped.' }`,`retained_skipped` ⇒ `still_running`,`no_pgid` ⇒ `may_be_running`(三者无 `unrecognizedOutcome` 键);`'terminated'` / `'KILLED'` / `' killed'` / `'stopped'` / `''` / `'__proto__'` ⇒ `may_be_running` 且 `unrecognizedOutcome` 逐字节等于入参;`undefined` / `7` / `new String('killed')` / `['killed']` / `{ toString: () => 'killed' }` ⇒ `may_be_running`、无该键、不抛;三句互异,`still_running` 与 `may_be_running` 两句不含 stop;`ENGINE_SESSION_BACKGROUND_RECEIPT_STATES` 恰 `['stopped', 'still_running', 'may_be_running']` 且冻结。
10150
+ - **G-H12**(本版证明;连接中途断):真 http 服务端读完停止请求体后掐掉连接 ⇒ 已装目标形与注入形各答 `{ kind: 'error', detail: /connection failed before an answer came back/, unconfirmed: true }`,服务端实收完整停止请求两次;目标是 fetch 的坏端口(`127.0.0.1:9`,没有连接阶段的码)⇒ 同标 `unconfirmed`(KL-249)。0.84.1 无此口。
10151
+ - **G-H13**(本版证明;可证没送出与发出后取消):注入动词同步抛 `TypeError` / 注入 `CERT_HAS_EXPIRED` / 注入 `syscall: 'connect'` 的 `EHOSTUNREACH` / 已装目标 `baseUrl` 非法(真 `ERR_INVALID_URL`)⇒ `{ kind: 'error' }`、无 `unconfirmed`;已装目标 `https` 指向明文引擎(真 `ERR_SSL_WRONG_VERSION_NUMBER`,引擎零实收)⇒ `{ kind: 'error', detail: /connection failed before an answer came back/, unconfirmed: true }`(保守方向,KL-249);调用前已取消 ⇒ 零请求(spy 一发都没有)、无键;注入形动词调用之后取消 ⇒ 立即落定 `{ kind: 'error', detail: /cancelled after the request was sent/, unconfirmed: true }`;已装目标形停止请求体送达后取消 ⇒ 同答。0.84.1 无此口。
10152
+ - **G-H14**(本版证明;粗码按状态兜底):A 答 409 / 413 / 422 / 400 / 404 且 `errorCode` 是按状态派生的粗码(`request.rejected` / `request.payload_too_large` / `request.unprocessable` / `request.rejected` / `not_found.resource`)⇒ `why` 与同状态无码逐格相同(409 / 413 / 422 / 404 ⇒ `other`,400 ⇒ `bad_request`),`errorCode` 原样带出;具体码 `request.body_shape` / `request.path_malformed` ⇒ `bad_request`(G-H4)。判别点:按 `request.` 前缀判的实现把 409 `request.rejected` 判成 `bad_request`。0.84.1 无此口。
10153
+ - **G-H15**(本版证明;送没送出的其余四形):① 真 TLS(同 G-P20 驱动)对端读完停止请求后回损坏的记录 / 回明文 ⇒ 两形都 `{ kind: 'error', detail: /connection failed before an answer came back/, unconfirmed: true }`,对端各实收一发;② 已装目标形调用前交已到点的 `AbortSignal.timeout(1)` / 以自定义 `TypeError` 为原因取消的信号 ⇒ `{ kind: 'error', detail: <原取消句> }`、无键、A 零实收;③ 外来信号(同 G-P24)⇒ 已装目标形与注入形都 `{ kind: 'error', detail: <参数校验原句> }`、无键、零请求、两形逐字节同;④ 同一只错误对象先由注入动词同步抛(无键)、再在已投递之后异步拒绝 ⇒ 第二次 `unconfirmed: true` + 连接断那一句。0.84.1 无此口。
10154
+
10155
+ **服务端 7.104.0 会话侧**(驱动形:真 sdk 中继 client + 真服务端 7.104.0(文件后端;停服后把存档按行改坏:会话头整行改成非 JSON / 叶子的后代整行改坏 / SQL 后端一行 payload 改成 JSON 字符串标量);或直驱服务端发布包真铸点再过 sdk `toApiError`)
10156
+
10157
+ - **G-K1**(本版证明):会话头改坏、重启、同步 `POST /v1/tasks` ⇒ 500 `corrupt_session`;该错误交 `classifyTurnWireError` ⇒ `http` 臂 `sessionUnreadable: true`;交 `isCorruptSessionError` ⇒ `true`;`corruptSessionContent()` 不含「is unreadable」「meta header」、不含机器码。0.84.1:判决无该键、读口不在公面。
10158
+ - **G-K2**(本版证明):同一坏档流式提交冷态(应答头之前 500)⇒ 同 G-K1;SQL 后端一行坏 payload ⇒ 同 G-K1(错误原句只有坐标,判定不看原句)。负控:7.103.2 冷态的 500 `internal.error` + 同样的原句 ⇒ `sessionUnreadable` 缺席、读口 `false`。
10159
+ - **G-K3**(本版证明):暖态流式(同一进程先跑一轮再改坏,缓存 TTL 0)⇒ `done.result.terminal = {kind:'failed', code:'corrupt_session'}`;包的终局错误行 = `API Error: <原句>\n<那一句>`,结果帧 `errors[0]` = `<原句>\n<那一句>`,`_sema_error_code: 'corrupt_session'`;`isCorruptSessionResult(done.result)` ⇒ `true`。0.84.1:两处只有原句。做过工作的同步提交(verify 末轮在准备期被拒)⇒ 200 + failed 体,`isCorruptSessionResult(body)` ⇒ `true`。
10160
+ - **G-K4**(本版证明):后台 run(`POST /v1/runs`)撞同一坏档 ⇒ `GET /v1/runs/:id` 的行 `isCorruptSessionRunRow(row)` ⇒ `true`;把行交包的续收合成 ⇒ 同 G-K3 的两处呈现。负控:行上结果的终局码是别的码、行列却写本码 ⇒ `false`。
10161
+ - **G-K5**(本版证明):会话头 + 1 条留下 + 2 条整行毁(毁的是叶子的后代),流式提交 ⇒ 流里恰一帧 `engine_notice` `session.records_skipped`;交 `readEngineNoticeFacts` ⇒ `{ code, audience: 'user', facts: { dropped: 2, entriesKept: 1, sessionId } }`;`sessionRecordsSkippedNote(facts)` ⇒ `undefined`。条目全毁 ⇒ `entriesKept: 0`、补句在(含「empty context」)。0.84.1:`engineNoticeInCatalog` `false` / `noticeAudienceOf` `'operator'` / 派发口 `undefined`。
10162
+ - **G-K6**(本版证明,包内构造):`detail` 缺 `dropped` / `entriesKept` 为 `-1` / `1.5` / `'2'` / `null` ⇒ 那一格 `'unknown'`,另一格原值,整条照读;`sessionId` 缺 ⇒ `undefined`;`entriesKept: 'unknown'` ⇒ 无补句。
10163
+ - **G-K7**(本版证明):会话 R 的一只后台子代跑在另一副本上,`DELETE /v1/sessions/R` ⇒ 409 `conflict.session_children_alive` + `remaining: [<handle>]`;交 `sessionDeleteConflictFromError` ⇒ `{ kind: 'children_alive', remaining: [<handle>] }`(与 `GET /v1/agents/roster` 同串);`sessionDeleteConflictContent` 含「not deleted」「Nothing was deleted」且点名那只 id。有活跑的会话 ⇒ `{ kind: 'active_run', activeTaskId }`。0.84.1:无读口。
10164
+ - **G-K8**(本版证明,包内构造):`remaining: ['a1', '', 3, null, 'a2']` ⇒ `['a1', 'a2']`;`remaining: []` / `'a1'` / 全坏 ⇒ `children_alive` 且无 `remaining` 键;`conflict.brand_new`(原句与本码一字不差)⇒ `unrecognized`;500 `corrupt_session` ⇒ `null`。
10165
+ - **G-K9**(本版证明):会话 R 派出一只后台子代并停在审批上,删 R(200 `{deleted:true}`),再对那张旧卡决断 ⇒ 409 `decide.not_parked`(会话被删那一句);`decideParkMovedFromError` ⇒ `{ code: 'decide.not_parked', taskId }`;经包的审批卡腿批准 ⇒ `failed.reason` = `decide(approve) failed: <String(e)> — <那一句>`,那一句含「This decision was not applied」「fetch the pending approvals again」。0.84.1:reason 只有原句。
10166
+ - **G-K10**(本版证明):同一形经包的停泊腿(审批卡 / 提问卡两条腿)⇒ 续读流(宿主日志「gate already resolved … re-attaching」),不出「gate not decided」那一行。0.84.1:真失败收场。负控:同一原句、不带码 / 带 `decide.row_unrevivable` ⇒ 仍真失败。
10167
+ - **G-K11**(回归约束):`gate_moved` / `claim_lost` / 被抢形 `not_parked` 经停泊腿 ⇒ 续读流(与 0.84.1 同走法);`isCodeClassifiedGateFailure` 对三码 `false`。
10168
+ - **G-K12**(端侧验收;射程:终端 REPL,共用活引擎):坏档会话里发一条消息 ⇒ 屏上错误行在引擎原句之后有那一句,不出「稍后重试」类建议;`-p --output-format json` 的 `errors[0]` 同。
10169
+ - **G-K13**(端侧验收;射程:网页端):坏档会话提交 ⇒ 卡片不给「再试」出路(`retryable` 不为真),正文是那一句;删一个子代跑在另一副本的会话 ⇒ 不出「有活跑」那一句,出「后台代理仍在跑」那一句并列 id。
10170
+ - **G-K14**(本版证明,包内构造;出句口按不可信读):`sessionDeleteConflictContent` 对 `null` / `undefined` / 串 / 数 / `{}` / `{ kind: 'x' }` / 取值器全抛的对象 ⇒ 兜底那一句(与 `{ kind: 'unrecognized' }` 同句);`{ kind: 'children_alive', remaining: 'abc' }` / `remaining` 是对象 ⇒ 与缺席同句;`remaining: [1, null, 'a1', '', {…}]` ⇒ 只点名 `a1`;`{ kind: 'active_run', activeTaskId: 7 }` ⇒ 不点名。`decideParkMovedContent` 对 `null` / `undefined` / 串 / 数 / `{}` / `{ code: 7 }` / 取值器抛 ⇒ 三码共用的那一句。`sessionRecordsSkippedNote` 对 `null` / `undefined` / 串 / `0` / `[]` / 取值器抛 ⇒ `undefined`。全程不抛、声明回串的恒回串。0.84.1 无这三口。
10171
+
10172
+ **服务端 7.104.0 能力 / 同步体侧**(驱动形:服务端 7.104.0 真部署(或其发布包里的铸点函数)+ 本包根入口)
10173
+
10174
+ - **G-M1**(本版证明):7.104.0 部署、审批门 park 的同步 `POST /v1/tasks` 回体交 `readRunTerminal` ⇒ `kind:'paused'`、`plane:'cause'`、`flatStatus:'suspended'`、`gate.kind` / `gate.toolName` 与体上 `terminal.gate` 逐字同;计划复核 park ⇒ `flatStatus:'needs_review'`、`isReviewPark` 为真;两者交 `doneToSdkResult` ⇒ `is_error:true`,复核那一只的错误句含「a plan review」。0.84.1:`flatStatus` 缺席 ⇒ FAIL。
10175
+ - **G-M2**(回归约束):7.103.x 部署同一场景的三键体 ⇒ `plane:'flat'`、`flatStatus` 带词、`isReviewPark` 与 G-M1 同答;正常完成的同步体无顶层 `status`、读 `completed`。
10176
+ - **G-M3**(回归约束 + 行为变化成文):7.104.0 部署、无头 `-p` 断线重连场景,run 停在审批门上 ⇒ 重连腿第一轮查行即交出 park 终帧(屏上是「在等一次作答」那一句、退出码与活流 park 同),不等重连预算耗尽;7.103.x 部署同场景 ⇒ 预算耗尽后走既有判死文案。审批过期收割后查行 ⇒ `failed`(`approval.expired`)。
10177
+ - **G-M4**(本版证明):7.104.0 缺省部署 `GET /v1/capabilities` 交 `projectFileHistoryCaptureCapability` ⇒ `fileHistoryCaptureMode` 答 `'on-optional'`、`fileHistoryCaptureDoctorDetail` 含「opt out」且不含「cannot be turned off」;以 `FILE_HISTORY_CAPTURE=false` 重启 ⇒ `'off'`,同一回体交回退读器 ⇒ 代码回退两档 `available`。7.103.x 部署 ⇒ `'on-always'`。0.84.1:7.104.0 上答 `'unknown'` ⇒ FAIL。
10178
+ - **G-M5**(本版证明):`buildTaskRequest({ objective, sessionId, live: true, ...fileHistoryDeclarationField(<7.104.0 读数>, true) }, 'interactive')` 发到 7.104.0 ⇒ 2xx,该 run 的接线回执帧 `fileHistory:"disabled"`;同一调用在 7.103.x 读数(`on-always`)上 ⇒ 片段为空、请求体无该键、提交 2xx;`fileHistory: 'off'` ⇒ 构造期 `TypeError`、零请求;utility 车道 ⇒ 不带该键、回执 `off_lane`。0.84.1:入参带 `fileHistory` ⇒ 「不认识的键」`TypeError` ⇒ FAIL。
10179
+ - **G-M6**(本版证明):7.104.0 数据根可写 ⇒ `projectSealedKeyCapability(caps)` 为 `present`、三键与回体逐字同、读数上零 `createdAt`;保管目录预置成普通文件后重启 ⇒ `not_reported`;7.103.x ⇒ `not_reported`。0.84.1:根入口无此口 ⇒ FAIL。
10180
+ - **G-M7**(本版证明):k8s 沙箱部署上带 `sandboxImageProfile` 提交并停在审批门,换非 k8s 车道重启后决断 ⇒ 409 `blockedBy:"request.rejected"`;决断失败补句含「did not name a more specific check」与 `request.rejected`,不含「The check that refused it」。构造成本高时:换任一不带码的准入拒绝。0.84.1 说「The check that refused it: request.rejected」⇒ FAIL。
10181
+ - **G-M8**(回归约束):带码的折叠(如 `request.host_posture_refused`)⇒ 补句照旧「The check that refused it: request.host_posture_refused」。
10182
+ - **G-M9**(本版证明;坏读数):`fileHistoryCaptureMode` 与 `fileHistoryCaptureDoctorDetail` 对同一组坏读数(`undefined` / `null` / 串 / 数 / `{}` / `{ kind: 'present' }` / 读属性就抛的代理 / 认不出的 `kind` / 非串词 / 空串词)都不抛:前者答 `'unknown'`,后者恰答 `{ kind: 'unobserved' }` 那一句(不说 off、不编词)。0.84.1:`null` / `undefined` 两口都抛,`{ kind: 'present' }` doctor 口抛,认不出的 `kind` doctor 口答 `undefined`。
10183
+
10184
+ **沙箱降级提示**
10185
+
10186
+ - **G-X1**(本版证明):`sandboxDegradeHint({ status: 400, message: 'x ' + SANDBOX_NO_IMAGE_INDEX_400_ANCHOR + ' y' })` 含 `sema-web-admin`、不含配置中心旧名;四臂判别(三只 400 锚、一只 404 锚、非沙箱形 `undefined`)不变。0.84.1 的括注用旧名 ⇒ FAIL。
10187
+
10188
+ **常驻姿态谓词的 `unknown`**
10189
+
10190
+ - **G-A1**(回归约束,纯包层;A-1):`askSurvivesPosture({ origin: 'zz_new_origin' }, { settingsAskRuleMatched: false })` ⇒ `{ kind: 'unknown' }`;`({ origin: 'policy' }, { settingsAskRuleMatched: false })` ⇒ `{ kind: 'posture_may_answer' }`;`({ origin: 'zz_new_origin' }, { settingsAskRuleMatched: true })` ⇒ `{ kind: 'must_ask', by: 'settings_ask_rule' }` —— 报了读数仍 `unknown` 只在本包不认识的出身词上出现。两版同答(判定不变)。
10191
+ - **G-A2**(端侧验收;射程:终端,换读本包口之后,常驻姿态):卡上出身词是本包不认识的词、宿主报了 settings 没命中 ⇒ 出卡,不被姿态答掉;同会话出身 `policy`、settings 没命中 ⇒ 零卡;出身 `hook` ⇒ 出卡。
10192
+
10193
+ ### 109d. 端上要动的读点
10194
+
10195
+ 坐标来自本机克隆的只读检索,读的提交:终端 `origin/main` 6b6025f7(09-28)· 网页端 `origin/main` d83eabdc(09-27)· 管理台 `origin/main` 6ea58dcb(09-27)· 桌面端 `origin/main` 5c996117(08-13,冻结)。终端 / 管理台 / 桌面端的产品源码坐标省去开头的 src 目录,网页端坐标从仓根起(`ui/` / `tests/`),管理台测试从仓根起(`test/`);行号会漂,以各端现状为准。
10196
+
10197
+ **终端**(6b6025f7)
10198
+
10199
+ - 🔴 **必改一行门登记**(T-8):终端仓 scripts 目录下的 `wire-anchor-registry.mjs:1320-1323`(登记 reject 句的那一条)的 `mintProbeAt` 第二行 `{ file: 'hitl/frameRouter.js', probe: REJECT_SENTENCE }` 删掉(第一行 `adapt/wireShapes.js` 保留)—— 0.85.0 的 `dist/hitl/frameRouter.js` 不再含这句字面,不改 ⇒ 升级当拍那道锚契约门的「同址铸点」探针判红。运行期零影响。
10200
+ - 引擎事实表与 SDK 词表(T-1–T-7):`sema/engineNoticeCodes.ts:69,90`(`ENGINE_NOTICE_CODES.filter(…)` 派生可见闭集)、`sema/liveHitlAskWire.ts:63`(转出 `HITL_REJECT_MESSAGE`)、`sema/seamQuery.ts:78`(`type ReasoningEffort`)、`sema/config/tierCore.ts:28`(`TIER_ORDER`):值与型在 SDK 12.0.1 下不变,零改动。测试 `sema/engineGateSyncAllow.test.ts:1835`、`sema/liveToolApprovalWire.test.ts:979-1015`(`ASK_ORIGIN_WORDS` 按值 `includes` / 遍历)、`sema/headlessPermissionModeWire.test.ts:42`:零改动。
10201
+ - 子代族注入连线(P-1–P-13):Node 宿主装目标,零改动即得 —— `commands/compact/compact.ts:137` `requestEngineCompact()` · `components/tasks/BackgroundTasksDialog.tsx:417 / :453` `stopEngineTask(id)`、`:648` `tailEngineSubagent(id)`、`:451 / :713` `engineTaskHandlesCapable()` · `screens/REPL.tsx:4410` `steerEngineSubagent(target, input, task.id)` · `components/tasks/SubagentContinueRow.tsx:51-52` `resolveSubagentResumeContext(rowId)` + `resumeSettledSubagent(…)` · `sema/engineAgentView.ts:509 / :667 / :753` `fetchEngineSubagentReport` / `tailEngineSubagent` · `sema/engineDelegatedPrompt.ts:96` `fetchDelegatedPrompt(taskId)` · `sema/engineShellRowSettle.ts:77` `fetchEngineTaskOutput(taskId, { signal })` · `sema/liveClient.ts:1709` `onEngineTaskBound(early)` —— 全是旧签名,逐字节同答;可选:三只写动词的失败回执按 `unconfirmed` 分句。
10202
+ - 会话规则名册(N-1–N-5):判定 `sema/sessionPolicyWire.ts:128`(`sessionPolicyDeliverableRules`)仍是自己那一份 —— `:136`(`rules.every(isExactToolNameRule)`,函数体 `:155`)是翻译那一半,`:140`(`rules.every(engineRosterHasTool)`,来自 `sema/engineRosterToolGate.ts:51`)是名册那一半;调用点 `:247`(在 `tryTightenSessionPolicyForRules` 里)。名册来自 `sema/engineToolChromeStores.ts:247`(`getEngineToolRoster()`,从没收到过 ⇒ `undefined`)。建议(非必改,但 §106 的 P-11 仍 pending —— 自己那一份判定不受 §101 / §106 / 本版保护):两半一起换调 `sessionPolicyDeliverable(behavior, rules, { roster: getEngineToolRoster() })`,`deliverable` 非空才走写口;删 `isExactToolNameRule`,名册闸同删(`engineRosterToolGate.ts` 里提示词那一只与此无关,留着)。换调后与今天那道名册闸的差别(门里逐例对拍,只有这三处):① **别名**:本包按名 ∪ 别名认(与引擎准备期审计同一张集合),终端那道闸只认名;换调后别名开始能写。② **名册里恰有的引擎拒启名**(部署自己挂了一只叫 `Task` 的工具):终端那道闸在册即写,本包照扣;换调后这一形改为不写(更严)。③ **名册没报过**(第一轮之前、老引擎):终端那道闸一条不写,本包不交名册 = 今天的判定;要保持「名册没报过就不走会话规则写口」,在调用前留一行宿主姿态判断(`getEngineToolRoster() === undefined` ⇒ 不接管,规则照走下一 turn 那条路);两种都安全,取舍归终端。要对用户说原因的,对 `withheld` 逐条取 `sessionPolicyWithheldNotice(w.why)`。
10203
+ - 附带文件旧名(D-1):零改动。`attachedFiles` / `_sema_attached_files` 全树零命中;附件行只在渲染面读(`components/messages/AttachmentMessage.tsx:151` 的 `compact_file_reference` 臂,读的是本包交出的附件事件,不读键);附件行不进壳转录落盘(`sema/upstreamBridge.ts:2109-2110` 头注),重放存量转录不经 `adapt()`。
10204
+ - 三名退出 / 一名撤回(D-3 / D-4):三名零命中,零改动;`sema/askParkExpiry.ts:81` 具名 import、`:774` 直调 `surfaceRememberNotApplied()`(自己读回体的停泊腿)—— 本版起它不退役,零改动。
10205
+ - 同名影子(E-1;到期版本以登记物为准):`components/tasks/taskStatusUtils.tsx:11` `isTerminalStatus`、`sema/engineAgentAbsence.ts:165` `readEngineAgentRegistry`(同名不同物 ⇒ 改名 / 换读本包口);`utils/messages.ts:232 / :234` `CANCEL_MESSAGE` / `REJECT_MESSAGE`、`sema/displayUntrusted.ts:89` `displayUntrusted`、`sema/engineAgentAbsence.ts:95 / :107 / :296 / :347` 缺席行常量与两句、`sema/engineGateSyncAllow.ts:311` `askSurvivesPosture`(第二份实现 ⇒ 换读本包口);`sema/planReviewReopen.ts:164` `reopenPlanReviewCard`(包装带判定;它的判定半场由本版的决断台账接走,见下);`seam/adapter/runStream.ts:573` `runStream`、`sema/activeRunSelfHeal.ts:149` `attemptActiveRunSelfHeal`、`sema/seamQuery.ts:365` `drainingRetryDelayMs`(多出来的逻辑经端确认属宿主,按核对期限到期;改动声明要重新核对)。改名不能免于跟踪:门按新名继续钉哈希。
10206
+ - plan-review 决断台账(L-1–L-8):
10207
+ - L-1:`hooks/useLiveQuestionOverlay.ts:204`(交互作答)与 `:320`(hook 自动应答)的 `notePlanReviewDecisionDispatchingIfDecisive(…)` ⇒ 其实现 `sema/planReviewModeExit.ts:142-160` 改调本包 `notePlanReviewDecisionHandedOver(id.taskId)`(respond 被拒 ⇒ `handle.revoke()`;门控与标签表不变)。`sema/planReviewReopen.ts:66-100` `deliverPlanReviewDecision` 里的 `notePlanReviewDecisionHandedOver(taskId)`(`:80`)/ `notePlanReviewDecisionOpSettled(decisionOp)`(`:99`)两处删(本包投递口自己认领、自己结算);`deliveriesInFlight`(`:64`)可删(本包闩盖同一形)。`sema/planReviewModeExit.ts:124` 的 `notePlanReviewDecisionHandedOver(id.taskId, opts)` 只保留开回声窗那半场。
10208
+ - L-2:`sema/resumePendingReconcile.ts:621` 的 `planReviewPendingReadMark` 改从本包导入;`:653` 取刻度不变;`:668` `reopenPlan` 把 `{ pendingReadStartedAt }` 直接交给本包 `reopenPlanReviewCard`(连同回执窗 / 投递口 / 读口)。`sema/planReviewReopen.ts:164-190` 包装里的两道 `planReviewDecisionInFlight(…)` 守卫(`:168` / `:185`)与 `guardStartedAt`(`:175`)整段删 —— 本包入口守卫与读后复核就是这两道;`reopenPlanReviewCardForSelfHeal`(`:223`)的 `shouldSuppressPlanReviewReopen`(`:227`)留(409 证据类守卫,壳侧注入件抢交的窗)。
10209
+ - L-3 / L-4 / L-6:`sema/planReviewDecisionNotice.ts:66-69` 的四只 import(`latestPlanReviewDecisionMark` / `notePlanReviewDecisionNotApplied` / `planReviewDecisionInFlight` / `planReviewPendingReadMark`)改从本包;`:376` `notePlanReviewDecisionNotApplied(taskId)` 之后另调本地的回声窗关闭(原函数 `sema/planReviewDecisionWindow.ts:341` 那一行留成壳侧半场)。
10210
+ - L-5:`sema/seamQuery.ts:2670` `clearPlanReviewDecisionWindow(…)` 保留关回声窗半场,同一拍调本包 `notePlanReviewGateLeft(taskId)`(原函数 `sema/planReviewDecisionWindow.ts:353` 结算那一行删)。
10211
+ - L-8:`sema/engineTaskNotification.ts:113` `notePlanReviewDecisionOutcomeQueued(cmd._sema_planReviewOutcome)` 删;`:115` `lastPlanReviewOutcomeClaim()` ⇒ `typeof cmd._sema_planReviewOutcome?.taskId === 'string' ? [cmd._sema_planReviewOutcome.taskId] : []`。
10212
+ - 可整段删:`sema/planReviewDecisionWindow.ts:110-343`(台账、刻度、结局计数、按数对账与七只口);留:`:40-44` 回声窗集合、`:356-474`(回声判定 / 离门判定 / 退避梯 / `shouldSuppressPlanReviewReopen`)。同名影子豁免表已登记这五只同名口,换读同批删本地声明。
10213
+ - 常驻姿态谓词(A-1):`sema/engineGateSyncAllow.ts:311` 自持的 `askSurvivesPosture` 只认 `ask_rule` / `hook` 两个出身词,其余出身(含本包不认识的词)一律不拦;调用点 `:1336`。换读本包口时按 109a-12 接:把 settings 读数报进来(键名 `settingsAskRuleMatched`),`must_ask` 与 `unknown` 都出卡,只有 `posture_may_answer` 放行;治理 / 安全出身 / 强制三臂照旧排在前面。
10214
+ - 会话后台任务停止口(S-1 / S-7):
10215
+ - 「停 / 杀会话」命令 `cli/bg.ts:495` `stopHandler`(`stop` / `kill` 共用,`:514` `killHandler = stopHandler`)→ `:517` 常驻作业腿 `daemonStop` 在 `:531` 打 `stopped <id>` 之前调本口(`includeRetained: false`),按结局分句(`stopped` 的受据逐条交 `engineSessionBackgroundReceiptReadingOf` 归类、用它的句子列出;`unavailable` / `refused` / `error` ⇒ 说后台命令可能仍在跑,不报全停;`unconfirmed` ⇒ 说可能已停);`:555` 旧式直杀腿 `legacyKill`(`:571` / `:604` 两处打 `stopped <id>`)同形。
10216
+ - 退出对话框(终端下一版的提交 4bcbb2d3,尚未进主干):`sema/backgroundWorkExit.ts:40-42`(换读点头注)· `:151-157` `keepReasonFor` 的「引擎留着」两臂 · `:234` / `:239` 两句退出臂 · `components/BackgroundWorkExitDialog.tsx:106` `onExit()` · `components/ExitFlow.tsx:61`:引擎留着且能力位为真 ⇒ 恢复「Exit and stop tasks」臂,选它时调本口(`includeRetained: true`)并按受据如实列出没停下的行;能力位不真 ⇒ 维持今天的「Exit and leave tasks running」形。
10217
+ - 两处都经 Node 宿主的已装目标(不带 `wire`);能力证据键 = 目标 `baseUrl`(宿主既有的能力探测已按它缓存)。
10218
+
10219
+ - 服务端 7.104.0 会话侧(K-1–K-8):
10220
+ - turn 错误补充链 `sema/apiErrorSupplement.ts:302-306`(CC-156 坏行那一臂之后):判决在手读 `turnVerdict.sessionUnreadable === true`,没判决的车道调 `isCorruptSessionError(err)`,命中 ⇒ `lines.push(corruptSessionContent())`。`utils/transcriptUnreadable.ts:48-50` 的注说「引擎侧 `corrupt_session` 到货后复用 `damagedConversationMessage`」—— 那一句要路径与行数,引擎这一形只给码与原句,**不要**复用,用包的那一句。流上终局行与 `-p` 结果帧零改动(换钉即得)。
10221
+ - 通告行 `sema/upstreamBridge.ts:910` `engineNoticeLine`:`session.records_skipped` 0.85.0 起是在册码。要补「上下文为空」那一句,加一臂:`readEngineNoticeFacts(e)` → `sessionRecordsSkippedNote(facts)` 在 `entriesKept === 0` 时接在引擎 `message` 之后;计数是 `number | 'unknown'`,不许当数渲 `unknown`。
10222
+ - 「门已决」判据链 `sema/decideAlreadyResolved.ts:315-321`:在 `isGateStandingErrorCode` 那一格之前(或旁边)加 `isDecideParkMovedCode(failure.errorCode) ⇒ true`(与包内停泊腿同判;修前会话被删那一形扫词不中);壳里不抄三码。
10223
+ - 删会话:终端今天无删会话动作(`server/sessionManager.ts:182 / :230` 是本地映射表的删除),n/a。
10224
+ - 服务端 7.104.0 能力 / 同步体侧(M-1–M-8):
10225
+ - 🔴 **文件历史请求词片段必须接进拼请求处,否则关闭开关不生效**:`sema/fileHistoryCaptureCapability.ts:57-59` `fileHistoryCaptureToggleAvailable` 按原词 `reading.word === 'on-optional'` 自判,7.104.0 起这一形真出现、开关会渲出来(可改读 `fileHistoryCaptureMode(reading) === 'on-optional'`,同答、判据单源在包);交互 / 无人值守两条车道拼请求处(`sema/seamQuery.ts`、`sema/seamQueryEngine.ts` 经 `buildTaskRequest`)加 `...fileHistoryDeclarationField(observedFileHistoryCapture(), !fileCheckpointingEnabled)` —— 不接这一行,7.104.0 上是「开关渲了、关掉没用」(引擎照捕获)。🔴 宿主义务:开关关着时,第一次提交前先等能力探测落地再拼请求(109a-18)。`components/Settings/Config.tsx:251-253`、`sema/overrides/cmd-config-shorthand.ts:166-168` 两处显隐闸读上面那只判据,零改动或随之改。
10226
+ - 🔴 **旁路一次性问答判成功改读因由**:`sema/engineSideChannel.ts:640` 只读 `data.result` 文本;7.104.0 起同步体停在门上时带引擎结果文本,可能被当答案 ⇒ 判「成功」改读 `readRunTerminal(data)?.kind === 'completed'`(停在门上时 `kind:'paused'`)。旁路车道零工具面、`interactiveTools:false`,触发面窄,但读法该改。
10227
+ - 公钥读口(今天零读点;要做「封模型 key」这一面时):`sema/liveClient.ts:1194` 能力探测回调里的能力位 tee 串加 `noteEngineCapsForSealedKey(config.baseUrl, caps, { generation })`;`sema/engineCapsArm.ts:213` 温切失效处加 `forgetSealedKeyReading(baseUrl)`。
10228
+ - park 行立刻合成终帧的射程(已核,零改动):无头 `-p` 断线重连腿经本包 `withHeadlessR1Reconnect` 直接受益;交互两条重连腿(`sema/seamQuery.ts:2446` / `:4560` 经 `:4318` `readRunRowTerminal` 绑同一只 `terminalEventFromRunRow`)在 `sema/interactiveReattach.ts:1659` 先过壳的判活闸 —— 只有判活答 `done` / `died` 且尾零帧才合成,`parked` 不进 ⇒ 这两条腿行为不变。
10229
+
10230
+ **网页端**(d83eabdc)
10231
+
10232
+ - 引擎事实表与 SDK 词表:`ui/lib/composer-surfaces.ts:6,357`、`ui/lib/engine/engine-approval-evidence.ts:87,264`(`ApprovalMandateWord` 型,不变)、`ui/lib/engine/turn-request-ledger.ts:48,595`(`PermissionModeIntent`,SDK 12.0.1 下同成员);测试 `tests/run-approval-evidence-test.mjs:313-314,480-481,822-825`(按值遍历 / 成员判定):零改动。未见按引用比较、未见冻结断言、未见就地改写。
10233
+ - 子代族注入连线:**零读点** —— 不消费本包子代族任何入口(尾随 / 报告 / 任务输出 / 委托提示 / 压缩 / 行停止门今天都没接);三条动词是自家 transport 直发 sdk:① `ui/lib/engine/engine-session-transport.ts:599-603` `steerSubagent`;② `:613-617` `resumeSubagent`;③ `:650` 后台子代停止 `client.runs.taskStop(…)`。分类器 `ui/lib/engine/subagent-resume-wire.ts` 已转调本包 `classifySubagentResumeFailure`;能力键 `engine-session-transport.ts:131` `kickEngineCapsProbe(approvalDecisionNoteBaseUrl, …)`。
10234
+ - **接(直发路径也得这一位)**:`ui/lib/engine/subagent-resume-wire.ts:102-107` 把包判决转成自家形时只透传 `retryAfterSec` / `code` 两位 —— 补透传 `unconfirmed`(同形一行 `...(verdict.unconfirmed === true ? { unconfirmed: true } : {})`),失败措辞对它渲「可能已送到、没有答复,可能已生效」而不是失败句;steer 与 resume 两只直发动词撞 client 时限时经同一分类器即同判。非必改,但不接 = 直发路径把「没答复」渲成失败。
10235
+ - **可用、非必改**:三处直发换调本包入口(`steerEngineSubagent(target, content, rowId, { wire: { client } })` / `resolveSubagentResumeContext(rowId, { wire: { client } })` + `resumeSettledSubagent` / `stopEngineTask(handle, { wire: { client, capsBaseUrl: approvalDecisionNoteBaseUrl } })`)的收益 = 取址三态、会话二态 / 三态、能力门、截止与分类同源;前提是本包行台账有这一行(fleet 行帧经本包投影即有)。接后台子代终报 / 尾随 / 委托提示 / 压缩面时,一律走本包入口带 `wire`;client 的 `timeoutMs` 不必为子代族拉长(本包给截止),plan-review 那只 6 h client 可以复用。
10236
+ - 会话规则名册 / 附带文件旧名 / 三名退出:零读点(`ui/lib/engine/engine-turn-legs.ts:579` 只对现役流调 `adapt(runStream(…))`),零改动。
10237
+ - 同名影子(E-1;到期版本以登记物为准):`ui/lib/engine/engine-decision-verbs.ts:629` `respondToQuestion`(同名不同物 ⇒ 改名);`ui/lib/engine/engine-approval-evidence.ts:335` `readDenialLimitFallback`(第二份实现:它收容器,本包收值本身)、`ui/lib/engine/subagent-resume-wire.ts:193` `subagentResumeAvailable`(第二份实现;换读本包口前先确认本包的能力位读账有没有喂进去);`ui/lib/engine/engine-turn-legs.ts:678` `buildTaskRequest`(包装带入参映射 ⇒ 改名,或改成直接转口本包)。
10238
+ - plan-review 决断台账:尚无 plan 重开链。接入时:作答经 `respondToQuestion` 同步送进本包 responder 的形零登记;把 respond 排在异步读之后或自带投递路径时,respond / POST 之前 `notePlanReviewDecisionHandedOver`,被拒 `revoke()`,自带路径落定 `settle()`;对账 / 补捞读队列前 `planReviewPendingReadMark()` 并交给重开口。
10239
+ - 会话后台任务停止口:**零读点** —— 没有「退出时停后台任务」这一面;后台任务窗格的逐行停止走任务句柄停止(`ui/lib/engine/engine-session-transport.ts:650` `client.runs.taskStop(…)`,不是本口)。将来要做「停掉这条会话的全部后台工作」时,走本口带 `wire: { client, capsBaseUrl }`,不直调 sdk。
10240
+ - 🔴 **两处错话**(服务端 7.104.0 会话侧):① turn 错误分类 `ui/lib/turn-error-classify.ts:484-491`(`status >= 500` 臂)对所有 5xx 说「That's usually temporary — try again」且 `retryable: true` —— 对 `corrupt_session` 是**错的出路**;在这一臂之前先问包的判决(`:538` 已调 `classifyTurnWireErrorBase`,读它的 `sessionUnreadable`)或 `isCorruptSessionError(error)`:命中 ⇒ `retryable: false`,正文用 `corruptSessionContent()`。② 删会话 `ui/lib/engine/engine-session-ops.ts:25-30` 把**任何** 409 说成「Session has an active run — stop it before deleting.」—— 对 `conflict.session_children_alive` 是错话(没有活跑,是另一副本上的后台子代);改调 `sessionDeleteConflictFromError(error)` + `sessionDeleteConflictContent(detail)`(`unrecognized` 那一句是族兜底)。
10241
+ - 通告:`ui/lib/engine/chrome-arm-ledger.ts:126-129` 登记 `engine_notice` 为 `absent`(无通告面)⇒ `session.records_skipped` 在网页端看不见;接通告面那天按派发口接,服务端接入契约第 17.4 节的缺席语义照样适用。
10242
+ - 决断:`ui/lib/engine/engine-decision-verbs.ts:390 / :606 / :672` 自己调 `approvals.decide`;失败时的分类 / 文案若要区分停驻挪动,调 `decideParkMovedFromError` + `decideParkMovedContent`(出路 = 重取待决列表再决)。
10243
+ - 能力 / 同步体侧:零改动 —— 不走同步提交、不读 `fileHistoryCapture` / `sealedKey`;复核判据已调 `isReviewPark`(`ui/lib/engine/engine-turn-legs.ts:231-233`)。
10244
+
10245
+ **桌面端**(5c996117,冻结)
10246
+
10247
+ - `main/session-host.ts:285-287 / :301-307`(`PERMISSION_MODE_INTENTS` / `SEAT_REASONING_EFFORTS` 的 `includes` 入站门)、`shared/localSessions.ts:28-52`:值 / 对象独立性不变,零改动。
10248
+ - `main/session-host.ts:1492` 是现役流的 `adapt()`;三名零命中。冻结期其余各件不在射程;解冻换钉时,若要把存量 CC 形行喂回 `adapt()`,按 109a-6 自己先改名;接 plan 重开链时同网页端。
10249
+
10250
+ **管理台**(6ea58dcb)
10251
+
10252
+ - 🔴 **测试夹具换名**(D-3):`test/cc083-client-core-083-pickup.test.ts:332` 把一个本版退出公面的名字(子代卡短标签口,🔧 0.85.0 退出公面)列作「一定在公面上的名字」、`:352` 的影子判据夹具也用这个名字 —— 产品源码零读点,这是测试夹具。换钉 0.85.x 之前把这两处换成一个仍在公面上的名字,否则那两格在升级当天红。
10253
+ - 引擎事实表与 SDK 词表:`lib/web/approval-facts.ts:24,48,58` 用 `ASK_ORIGIN_WORDS.includes(raw)` 判「出身已知 / 未知」—— 0.85.0 起这张表跟随管理台自己装的 SDK:若管理台先于本包升到加了出身词的 SDK,新词在那里判「已知」(不再标出身未知),本包的措辞口对它仍交「这个词比这一端新」那一句。SDK 12.0.1 下零差别。`components/chat/run-settings.tsx:37-45`(`SEAT_REASONING_EFFORTS`)、`lib/chat/transport/session-transport.ts:25,34`(型)、`lib/config/tier-words.ts:29`(`TIER_ORDER`);测试 `test/ccsdk-mandate-origin.test.tsx:81-96`、`test/cc0834-client-core-0834-pickup.test.ts:435-442`、`test/w38n-residue.test.tsx:223`(按值遍历 / 成员判定):零改动。
10254
+ - 会话规则名册:测试 `test/pickup0836-dependency-pickup.test.ts:179-180` 的两参调用与断言不受影响;将来加「本会话规则」写口时,有名册就交,没有就不交。
10255
+ - 附带文件旧名:`lib/chat/transport/engine-transport.ts:854` 只对现役流调 `adapt()`,零改动。
10256
+ - 同名影子(E-1):`lib/chat/transport/engine-transport.ts:767` `isDetachDurableOff400`(第二份实现)—— 本包同名同义口 0.84.1 起已在公面,差别只在两处边界(函数形错误对象、读属性抛错);升到 ≥ 0.84.1 即可换 import。
10257
+ - 会话后台任务停止口:零读点 —— 聊天引擎反代按前缀放行,这条路由今天已可达,管理台没有 UI 入口(管理台自己的接入文档 `INTEGRATION.md:2050` 同述)。
10258
+ - 🔴 **本地码表抄件**:决断失败分类 `lib/chat/transport/engine-transport.ts:1132` 本地写着 `/decide` 三码字面(`decide.claim_lost` / `gate_moved` / `not_parked` ⇒ `reopened`)—— 处置对(重读队列 + 重新呈现),但码表是端上第二份;换成 `isDecideParkMovedCode(code)`,文案可用 `decideParkMovedContent`。
10259
+ - 通告臂 `lib/chat/transport/turn-mapping.ts:724-757`:今天码开集、`detail` JSON 原样拼进一行。可改为先问 `readEngineNoticeFacts(event)`:`session.records_skipped` ⇒ 用 typed 事实 + `sessionRecordsSkippedNote`;受众 `user` ⇒ 用户面。
10260
+ - 删会话中继 `app/api/v1/chat/w/[worker]/sessions/[id]/route.ts:8 / :75-83`:原样中继上游错误(体键 `remaining` 随体过境);路由头注「409 `{activeTaskId}` = 有活跑」已不是 409 的全部 —— 渲拒因的前端调 `sessionDeleteConflictFromError`。
10261
+ - 复核判据(既有差分,顺带提示):`lib/chat/transport/engine-transport.ts:450-452` `parkKindOf` 自判「复核 / 交互作答」:先读 `flatStatus`,再只认 `gate.kind === "plan_review"` —— 漏掉另一种复核门(`needs_review` 那一形),与本包 `isReviewPark` 两份判据;建议改调 `isReviewPark(read) ? "needs_review" : "suspended"`(读的是流式 `done`,与本版形变无关)。
10262
+ - 配置面若要让用户粘贴模型 key 后在浏览器侧封:读 `projectSealedKeyCapability(caps)`,只在 `present` 时封;其余一律走环境变量里的钥匙名。
10263
+
10264
+ **验收方**
10265
+
10266
+ - 按 109a′ 改锚(冻结性 / 七词 / 附带文件旧名那一格 / 重开口「POST 落地后照开」/ 时限那一臂的 `detail` / 常驻姿态 `unknown` 的宿主动作 / §107 B-7「端直调」/ 服务端自铸码表行数与派发表码数 / `corrupt_session` 的终局行与 `errors[0]` / 决断失败文字 / `fileHistoryCaptureMode` 三词 / 同步 park 体的 `plane` 与 `flatStatus` / 折叠粗码那一句);按 109c 新增各格。
10267
+
10268
+ ### 109y. 🔴 三端升级必读(固定段式)
10269
+
10270
+ 1. **换钉 `^0.85.0` 之前**:① 三个运行期名字退出根入口(型面 BREAKING;四端产品源码零具名 import;要数拒绝上限词表的端从 `@sema-agent/sdk` 根入口取同名值;逐名见 §2z)—— 🔴 管理台先把测试里拿其中一名当「在公面上的名字」的两处夹具换名;② 对 `SessionPolicyWithheldWhy` 做穷尽 `switch` / 按词建表的端编译期会红(今天各端没有这类读点;加 `not_in_roster` 一臂,取句用 `sessionPolicyWithheldNotice`);③ 四个型改为 SDK 型的别名(peer 地板下零差别);④ 🔴 终端锚登记删 `hitl/frameRouter.js` 那一行(109d);⑤ 按 `FileHistoryCaptureMode` 或 `EngineNoticeFactsCode` 穷举的 `switch` 编译红(各 +1 员;终端今天没有这样的 `switch`);⑥ 对 turn 错误判决 `http` 臂做键集恒等断言的要放宽(+`sessionUnreadable`)。⑦ 端上若有逐字对账本包键表 / 公面名单的门(例:请求键台账、导出清单),本包删键、退名、改名会让那道门在**运行期**红而编译不红 —— 本版三名退出根入口、`adapt()` 不再认 `attachedFiles` 同理,换钉当批同改台账(0.84.0 删 `rewindFiles` 时漏写这一类,此处补上)。peer sdk 地板 `>=12.0.1` 不动。可观察变化(按旧行为断言过的测试改锚,见 109a′):`ASK_ORIGIN_WORDS` / `APPROVAL_MANDATE_WORDS` 就是 SDK 的数组、不再冻结;`adapt()` 对只带旧名 `attachedFiles` 的存量行不再出附件行(现役流不变);子代写动词撞 client 时限那一臂、请求送达后连接断了等说不出没送出的传输失败那一臂、以及 `stopEngineTask` / `resumeSettledSubagent` 请求发出之后才取消那一臂,`detail` 换句并带 `unconfirmed: true`(plan-review 决断腿送达后断连那一形换成「可能已生效」那一句;可证没送出的各形照旧「could not reach the engine」;OpenSSL 原因码 `ERR_SSL_*` —— 含 `https` 指向明文端口 —— 不算可证没送出);plan-review 已装目标形的决后回拉与决断同用解析那一刻的目标快照(回拉不再读温切后的新凭据);决后回拉证出门身份变了 ⇒ `advanced`(修前说没生效);`fileHistoryCaptureMode` / `fileHistoryCaptureDoctorDetail` 对坏读数不再抛;`sandboxDegradeHint` 镜像索引缺席那一句换成配置中心现名;`reopenPlanReviewCard` 在本包投递口的决后回拉期间(至多 15 s)也拒开、宿主登记的交出在结算前拒开(判决形不变);`__resetPlanReviewDecisionLatchForTests` 清整本账;`session.records_skipped` 在册、受众 user;`corrupt_session` 的终局行与结果帧 `errors[0]` 在原句之后补一句;决断出口在 `/decide` 停驻挪动三码上补一句,停泊腿对会话被删那一形改为续读流;服务端 7.104.0 上同步 park 体读成 `plane:'cause'` 且 `flatStatus` 带词、无头断线重连在 park 上立刻收场、`fileHistoryCapture` 读成 `on-optional`、折叠粗码补句换成「did not name a more specific check (…)」。其余纯增(三十五个运行期导出、一个测试钩、三十四个具名型与若干可选位)。
10271
+ 2. **逐面**:
10272
+ - **终端**:🔴 锚登记删一行;plan-review —— 两处作答口登记、对账 / 补捞读队列前取刻度并交给重开口、「没生效」与「离门」两处说一声,同批删自带台账、结局认领与重开包装里的守卫层(109d L-1–L-8);常驻姿态谓词换读本包口时按 109a-12 接 `unknown`(出卡);会话规则判定建议换调本包并交名册(差别三处见 109d);同名影子按登记物逐行退或改名;子代族零改动(失败回执可按 `unconfirmed` 分句);「停 / 杀会话」在报已停之前调会话后台任务停止口(`includeRetained: false`)、退出对话框「Exit and stop tasks」臂按能力位恢复(`includeRetained: true`),受据一律交 `engineSessionBackgroundReceiptReadingOf` 归类并用它给的句子(109d、109a-14);`unconfirmed` 渲「可能已停」、`receipts` 缺席说「读不出受据」而不是「没有后台任务」、`unreadableReceipts` 在场说「还有 N 条读不出」;🔴 文件历史请求词片段接进拼请求处(不接 ⇒ 关闭开关不生效),开关关着时首次提交前先等能力探测落地;旁路一次性问答判成功改读因由;存档读不出补那一句、「门已决」链在扫词前问 `isDecideParkMovedCode`、跳过记录通告行在 `entriesKept === 0` 时补一句(109d)。
10273
+ - **网页端**:子代族直发路径建议透传 `unconfirmed` 并按它分句(非必改);接后台子代终报 / 尾随 / 委托提示 / 压缩面时走本包入口带 `wire`;两只同名影子改名、两只第二份实现换读本包口(109d);将来要停整条会话的后台工作时走会话后台任务停止口带 `wire`;🔴 5xx 臂对 `corrupt_session` 不给重试出路、删会话 409 按码分句(109d 两处错话);其余零改动。
10274
+ - **桌面端**:冻结期零改动。
10275
+ - **管理台**:🔴 两处测试夹具换名;本地同名的 detach 判定改从本包导入;本地 `/decide` 三码字面表换成 `isDecideParkMovedCode`;`parkKindOf` 建议改调 `isReviewPark`(既有差分);其余零改动(判「出身已知」的读点随自己装的 SDK 走,见 109d)。
10276
+ 3. **成文改口**:见 109a′(作废 / 改读 / 新增 / 不变;含 §107a B-7「declined · 本包零读点 · 端直调」→ consumed,端经 `stopEngineSessionBackground` 调;服务端 7.104.0 提货的十一条改锚);已发段(§93、§94、§100、§101、§102、§104、§106、§107、§108 与 0.84.x 的 CHANGELOG 段)不回改,以本段为准;活段 §0a / §2 / §5d / §7 已同批改,§2 末尾新增退役名录 §2z。
10277
+
10278
+ **包侧缺口:** 引擎事实表与 SDK 词表 —— ① 两张 SDK 词表未冻结:端上就地改写,所有读者(含 SDK 自己)都看到改后的表;本包判定不受影响(KL-194)· ② 两张词表的运行期成员跟随已装 SDK,本包的句子与闭集判定停在构建时那一代 SDK(KL-195)· ③ 思考档 / 权限模式四个型跟随已装 SDK,运行期词表停在构建时那一代 —— SDK 从包根出这两组词的值之前,本包只能钉构建时那一代(KL-196)· ④ 档位的字面联合型 `Tier` 与 `TIER_ORDER` 仍各写一份,完整派生在后续批次(KL-198);子代族注入连线 —— ⑤ 注入 client 的读重试在本包截止落定之后仍可能再睡一轮(至多 60 s)才收手(sdk 的重试睡眠不看取消信号;KL-199)· ⑥ 写动词的外包重发本包察觉不到、不去重(sdk 非提交类 POST 不自动铸幂等键;steer 的显式 `idempotencyKey` 位本包不铸 —— 铸了就是行为变更;KL-200)· ⑦ 压缩 arm-then-fire 两口各用各的 `wire`,bind 不交且目标槽空 ⇒ 那一记 arm 留着(KL-201)· ⑧ `capsBaseUrl` 缺席时报告 / 尾随每次都探、压缩不预热(KL-202)· ⑨ 压缩腿没有返回形,「没答复」只留 debug 行(fire-and-forget 语义不变)· ⑩ 调用方自带的 `AbortSignal.timeout` 在动词调用之后到点按「发出后取消」照标(调用前已到点的零请求、不标);直发 sdk 的宿主把它交给分类器时与 client 时限分不开、照标(KL-203)· ⑪ `EngineWireTarget.token` 仍是串形(有意不放宽:注入形是中继宿主的正位入口,目标槽是 Node 宿主的隐式装配,两者不混);会话规则名册 —— ⑫ 名册按腿、按跑铸:只在子代腿 / 后来某一跑才挂的工具与装配时注入、不列在名册里的那一只工具检索器会被扣下(更严,方向安全;KL-204)· ⑬ 本包不提供「没有名册就一条不写」的姿态位:宿主要这一姿态,在调用前自己判名册在不在(109d 终端 ③)· ⑭ 命名空间覆盖形照旧不写;日后按能力位放开时,放开的那几形须绕开名册这一步(覆盖形不是工具名,名册里永远没有);退役登记与三名退出 —— ⑮ 本包不提供旧转录迁移口:要在 0.82.x 存量行上继续出附件行的宿主自己先改名(109a-6)· ⑯ 退役登记只执法已登记的行,注释式退役条件的新增靠同批登记,没有常驻普查(KL-207)· ⑰ 终端首帧工具自报三张估计词表的退役条件量不出,按复核期执法(KL-206)· ⑱ 两名退出公面后没有公开替代:确需其一的端请提需求(不按名恢复)· ⑲ 冻结段识别靠标题里第一个 `0.x.y` 版本号,本包出 1.0 那天要改(KL-213);只改门的两道 —— ⑳ 同名影子语义差分格的语料是有限枚举,不是证明(KL-214)· ㉑ 展示层出口那一格只比字符面,不比凭据面(KL-215)· ㉒ 核对记录的哈希只钉声明本身,不钉它调用的端侧助手(KL-216)· ㉓ 导出存活门只读已提交的 ref:工作区未提交的 import、只挂在游离检出上的提交、`origin/main` 以外的远端跟踪分支都不读(KL-219)· ㉔ 近期分支窗 14 天,判决随本机分支新旧变化(检出的 `HEAD` 不受窗限制;KL-220)· ㉕ 退役判据含词级与「整面转口后可见」两项上界,端上同名的本地声明、注释里出现的名字也会挡退役(KL-221);plan-review 决断台账 —— ㉖ 宿主登记且从未被认领、也没结算 / 撤销的笔无 TTL,直到离门证据或进程结束一直拒开(KL-222)· ㉗ 自带投递路径的宿主在前一笔回拉期间交出同 run 第二笔 ⇒ 登记答 `null`、并入前一笔(KL-223)· ㉘ `not_applied` / `unconfirmed` 不自证没生效(KL-224)· ㉙ 决断 200 之后的回声窗(壳侧注入件抢交)不收进包(KL-225)· ㉚ 台账每进程 32 笔上限(KL-226);常驻姿态谓词 —— ㉛ 判决不带「哪一形 `unknown`」:宿主靠「报没报读数」自己分(109a-12);会话后台任务停止口 —— ㉜ 受据只含 shell 行,后台代理 / 工作流停了哪些要靠停前停后两次登记读数对比(KL-227)· ㉝ 能力位不含凭据就绪:位为真仍可能答 503 `auth.service_token_required`,只能落 `refused` / `credentials_required`,做不到零请求(KL-228)· ㉞ 不幂等且无去重键:`unconfirmed` 之后重发会连同两次之间新起的后台工作一起停(KL-229)· ㉟ `id` 读不出、或受据词不是非空串的行只计数、不列(认不出的词本身不在此列:行保留、交归类口;KL-230)· ㊱ 能力证据要宿主先探,本口不自探(KL-231)· ㊲ 进程内射程:只停本副本上的后台行(KL-232)· ㊳ 受据词的认词只在归类口一处:停止口的窄读不认词(非空串即保留),所以上游加第五个受据词的当天,端照样能列出那一条、并如实说「可能仍在跑」,直到本包跟上新词的归类;展示层出口与凭据读法 —— ㊴ 本版不变(与 0.84.1 逐字节同):引号值里空白之后的尾巴一形照旧(KL-193)· ㊵ 标签后的引号值是 `scheme://` 地址、地址后隔着空白还有文字时那段文字原样(KL-233)· ㊶ 无标签、单引号包着的无 scheme userinfo 口令原样(KL-234)· ㊷ 用户名整个是一枚记号时认不出 userinfo(KL-235)· ㊸ 值首紧贴不可见单字的标签引号值,键左边紧贴的无标签文字原样(KL-236);服务端 7.104.0 会话侧 —— ㊹ 直接读会话的各面(会话策略读写、记忆状态、记忆动词、MCP 重拨 / 探测)的专属失败分类器对 `corrupt_session` 仍落各自的通用失败臂,端在那一臂上用 `isCorruptSessionError(error)` 补那一句(KL-237)· ㊺ 非流式同步提交口与续跑 verify 腿收不到跳过记录的通告,没收到不等于没跳过(KL-238)· ㊻ 存档读不出的终局行身份仍是 `API Error:`(KL-239)· ㊼ 停泊腿续读流在「根会话恰是当前流所属会话」的并发形上多一轮(KL-240)· ㊽ `/decide` 撞根会话存档读不出时决断出口不补那一句(KL-241)· ㊾ 删会话那一句至多点名三只子代,`unrecognized` 那一句不说删没删(KL-242);服务端 7.104.0 能力 / 同步体侧 —— ㊿ 请求词与还原键同交的冲突不预判,由服务端 400 拒(KL-243)· 〔51〕能力读数没到之前片段口不给请求词,宿主须先等探测落地(KL-244)· 〔52〕接线回执 `fileHistory` 段不投(KL-245)· 〔53〕粗码表是按服务端分发器铸点镜像的,上游成节闭集未出(KL-246)· 〔54〕公钥读口不校 `publicKey` 的编码与长度、不判 `alg` 能不能用(KL-247)· 〔55〕同步 park 体因由座坏而 park 词在场时读 `unknown` 不读 `paused`(KL-248);「没答复」判据 —— 〔56〕只在读得到可证「没送出」的证据时才不标(调用前已取消 / 注入动词同步抛 / 成因链上带连接阶段、构造期(含参数校验)、证书校验与客户端握手配置的码);fetch 的坏端口拦截、undici 不带码的非法头值、不带 `syscall` 的不可达、OpenSSL 原因码 `ERR_SSL_*`(含 `https` 指向明文端口那一形)等真没送出却读不到证据的形同标 `unconfirmed`(保守方向,KL-249)· 〔57〕证书校验码与握手期 `ERR_TLS_*` 仍按「没送出」判,依据是客户端在发出应用数据之前判定(KL-252)· 〔58〕直发 sdk 的宿主交给分类器的取消错误分不出发前 / 发后,键缺席(KL-253)· 〔58′〕注入形里引擎已答的拒绝与调用方取消落在同一轮微任务时,结局按「发出后取消」标 `unconfirmed`、不报那条答复(KL-255)· 〔58″〕引擎写口若答 3xx、重定向目标连不上或 `Location` 非法,发出前失败码不再证明没送出 —— 引擎写口不答 3xx,本包不看这一形(KL-256)· 〔58‴〕宿主绕过本包直调、再拿同一只错误对象问分类器时,读到的「没送出」标记可能是上一次同步抛留下的(KL-257)· 〔58⁗〕调用前已取消而取消原因是冻结 / 不可扩展的对象时打不上标记,按形判照标(保守方向,KL-258);plan-review 决断台账 —— 〔59〕`still_parked` 只在证得出同一道门实例时自证:公开口直调、重开卡上的决断、老服务端 park 行没有 `result` 的一律不自证,陈旧读起点下一次读才放(KL-250);会话后台任务停止口 —— 〔60〕只带粗码、不带状态的错误对象照旧按码读(KL-254)。
10279
+
10280
+ ## §108 🆕 0.84.1(2026-09-28)`<system-reminder>` 开标签定位口 + detach durable-off 400 纯判定 + 服务端自铸通告码进册与按码派发的通告事实口 + 停泊审批决断 422 的读口 / 一句话 / 码优先 + 拒启会话的撤销动词与出路句 + plan-review 编排收注入 client + CC 形拒绝清单收仅被脱敏的拒绝 + 凭据读法两处放行收口 + 门夹具第二批(patch;根公面运行期导出 1260 → 1275〔+15〕;公面类型 +18;`SemaPermissionDenial` +1 可选成员 `_sema_tool_input_redacted`〔超集键 +1〕;`CONFIG_REFUSAL_CODES` 七员 → 八员;`readReadRootGrantNotice` 入参型放宽为 `unknown`;`detachDurableOffHint` 对读属性会抛的错误对象改回 `null`;凭据两网输出字节变;§66 G2 / G3 作废;零新投影臂;peer sdk 地板 `>=12.0.1` 不动)
10281
+
10282
+ > **patch**,九件同发,零 BREAKING、零编译期前置改动(本节按 0.84.1 的读法写;若与本版发布帖不一致,以发布帖为准):
10283
+ > ① **开标签定位口**(CC-210):§104 起本包只公开「剥离 / 解包」两个动作,开标签文法不上公面(§104 包侧缺口 ⑦)。要按开标签把消息切成块的端因此只能自持文法,或拿剥离口派生判定。本版公开定位口 `findSystemReminderOpenTag(text, from?)`,与剥离 / 解包两口同一个判定;端拿到的是位置,文法常量本身仍不上公面。
10284
+ > ② **detach durable-off 400 纯判定**(CC-219):`detachDurableOffHint` 被进程级的 `isDetachArmed()` 门住(只有终端 `-p` 车道真拼上头时才 arm),浏览器 / 桌面拿不到这个判定。本版把判定抽成不带进程门的 `isDetachDurableOff400(err)` 上公面,`detachDurableOffHint` 改为包它。纯判定一律不抛,包装层因此也不再因「读属性会抛错」的错误对象而抛(此前抛;其余输入逐字不变)。
10285
+ > ③ **服务端自铸通告码 + 按码派发口**(CC-213 / CC-214):服务端经同一条通告通道投它自己铸的码(服务端 7.101.0 起两枚)。修前本包只认引擎码册 ⇒ `instructions.source_changed` 被判「册外 / `operator`」。本版加一张服务端自铸码表,在册判据与受众读口同认,并给这枚码的事实读器;七只事实读器(八个码;0.84.0 的读目录授权结论读口一只挂两码)另有一个按码派发的总口,按码判别的联合,只有受众 `user` 的码属用户面。
10286
+ > ④ **停泊审批决断 422**(CC-225):读口 + 按成因分说的一句话 + 「同一个决定不重发、deny 照开」判定,四个决断出口补句;这枚码不再被「门已决」扫词臂误判(码优先)。
10287
+ > ⑤ **拒启会话的出路**(CC-229):引擎在每一跑的**准备阶段**对这一跑的每一层规则名字做一次审计 —— 调用方策略、会话规则记录、父会话的规则记录、冻结约束、技能范围。名字不在这一跑的工具名单里时,两类名字硬失败,码 `config.legacy_tool_name`:引擎退役名;含 `__` 而不以协议前缀(今天是 `mcp__` / `a2a__`,区分大小写)开头的名字。会话规则记录里交给这道审计的是 `toolDeny` 与 `toolAllow` 两只桶。0.83.6(§106)在写之前扣下这两类;本版是**已经写进去**那一侧:窄撤销动词(必交这台部署一跑的工具名册 —— 名册里有的名字引擎照认,不撤)+ 八臂措辞 + 启动失败出路句 + 判据本体。
10288
+ > ⑥ **plan-review 编排收注入 client**(CC-209;§7 P-28 的 plan-review 半场):公面只增(全部可选位),旧签名逐字节同答;行为面的新分支是「给了注入连线」那一形,另有一处两条路共改:决断撞上请求时限那一臂的结局正文(「已送出、时限内没有答复」)。两只能力探针同样收注入 client;本包经注入 client 的读都有独立落定的截止。
10289
+ > ⑦ **拒绝清单少列**(CC-235):入参被传输层脱敏过的拒绝此前只在超集载体上,只读 CC 形清单的消费方少数一条;本版照列、带脱敏标记。真没有入参对象的几类不变。**读法变化**:§66 G2 / G3 作废(108a′)。
10290
+ > ⑧ **凭据读法两处放行收口**(CC-234):值左邻是不可见单字时地址形的值不再按地址豁免(`scheme://` 留、主机与路径换记号);`@` 右边主机位被可剥单元占住、没有主机时照算 userinfo(候选挂在凭据标签 / 方案词上时让给标签那一遍整只遮,与 0.84.0 同答)。输出字节与 0.83.4 不完全相同 —— 判据请按「不含值」写。
10291
+ > ⑨ **门夹具第二批 + 扁平终帧棘轮 + 权威信封标签对账**(CC-233 / CC-230;只改门):出包面零变化,三端与管理台零动作。
10292
+ > **表态现势**:patch,全速模式,不设表态窗;到货点名两处 —— 网页端删端侧重建的 plan-review 编排(⑥,108d);管理台删本地同名的 detach 判定改从本包导入(②,本包同名影子对账门的过渡登记到 0.85.0 为止)。
10293
+
10294
+ ### 108a. 处置表
10295
+
10296
+ 包处置列:`added` = 本包自有面本版新增;`changed` = 本版改(括注改的是什么);`consumed` = 本版读上游的 wire 事实;`不变` = 回归约束;`pending` = 候上游 / 候包侧另批;`gates` = 只改门。各端列:`pending` = 有读点待改(格内注明必改与否);`n/a` = 该端零读点或零改动即得(按本机克隆的只读检索,见 108d 的日期)。
10297
+
10298
+ | # | 面 | 包处置 | 旧 → 新 | 终端 | 网页端 | 桌面端 | 管理台 | 验收方 | 本节 |
10299
+ |---|---|---|---|---|---|---|---|---|---|
10300
+ | O-1 | `findSystemReminderOpenTag(text, from?)`;型 `SystemReminderOpenTagSpan` | added | — → 下一枚引擎形开标签的 `{ start, end }` 或 `null`(108a-1) | pending(建议:转录搜索那一处「找开标签 → 删到闭标签 → 从头再找」的循环换读 `stripSystemReminderBlocks`(那一处要的就是整块剥);确需自己切块的读者换读本口,删自持的宽属性文法 —— 换读前按 104a-1 核负样本) | n/a(只调剥离口) | n/a(零读点) | pending(建议:回放拆分删「候选 + 闭标签问剥离口」那一步派生判定,换读本口;截断块归块的处置照旧在端) | pending | 108a-1 · G-O1–G-O6 |
10301
+ | O-2 | `stripSystemReminderBlocks` / `unwrapSystemReminder` | 不变 | 开标签识别改走与 O-1 同一个判定;**行为不变** | n/a | n/a | n/a | n/a | 回归约束 | 108a-1 · G-O6 |
10302
+ | DT-1 | `isDetachDurableOff400(err)` | added | — → 不带进程门的纯判定(108a-2) | n/a(`-p` 车道继续用 `detachDurableOffHint`;要在别处判同一枚错误时用本口) | pending(建议:提交恒带 detach 头而未见对这一枚 400 的处置 —— 连到没有耐久账本的执行体时整轮失败;要退让时用本口判,不按码) | n/a(自带引擎恒有耐久账本;连外部引擎时同网页端) | pending(🔴 必改:删本地同名判定改从本包导入 —— 同名同义,换 import 即可;本包同名影子对账门的过渡登记到 0.85.0 为止) | pending | 108a-2 · G-DT1–G-DT6 |
10303
+ | DT-2 | `detachDurableOffHint(err)` | changed(行为:不再抛) | 改为「`isDetachArmed()` ∧ DT-1」。读属性会抛错的错误对象(getter / Proxy 陷阱抛错、已撤销的 Proxy):已 arm 时原样抛出 → **回 `null`**;其余输入返回值逐字不变;`message` 读两次 → 至多一次 | n/a(`-p` 车道的错误来自 SDK,不是这类对象) | n/a | n/a | n/a | pending(按「会抛」写的判据眼改锚,见 108a′) | 108a-2 · G-DT4 / G-DT6 |
10304
+ | N-1 | `SERVER_NOTICE_AUDIENCE: Readonly<Record<string, NoticeAudience>>`(冻结) | added | 无 → 服务端自铸码 → 受众两行 `instructions.source_changed: 'user'` / `memory.layer_locked_legacy: 'operator'` | n/a(读受众一律经 `noticeAudienceOf`,不直读本表) | n/a(同左) | n/a | n/a | pending | G-N1 |
10305
+ | N-2 | `engineNoticeInCatalog(code)` / `noticeAudienceOf(code)` | changed(多认两码) | 只认引擎码册 → 引擎码册 ∪ 服务端自铸码表;查表序引擎先;两表之外仍保守 `operator` | 零改动即得(册外兜底分流那一格:`instructions.source_changed` 从「只落调试」变「册内通用行」,受众从 `operator` 变 `user`) | 零改动即得(今天零读点;接通知面时按受众分发就读这一口) | 零改动即得(同左) | 零改动即得(同左) | pending | G-N2 / G-N3 |
10306
+ | N-3 | `readInstructionsSourceChanged(notice)`;型 `InstructionsSourceChangedFactsView` | consumed | 无 → 事实读器(三格必填,`previous` / `current` 可为 `null`) | pending(机读车道与交互车道的专属行经 D-1 读;单独调本口亦可) | pending(用户通知面) | n/a | n/a | pending | G-N4 / G-N5 |
10307
+ | D-1 | `readEngineNoticeFacts(notice)`;型 `EngineNoticeFacts` / `EngineNoticeFactsOf<K>` / `EngineNoticeFactsCode` | added | 无 → 按码派发口 | pending(见 108d:壳里逐码分派整段换读本口;机读车道按 `_sema_` 前缀键上帧用它的读数) | pending(用户通知面:`audience === 'user'` 的读数才渲) | n/a | pending(运维面:`audience === 'operator'` 的读数) | pending | G-D1–G-D5 |
10308
+ | D-2 | `ENGINE_NOTICE_FACT_READERS`(冻结,码 → 读器) | added | 无 → 派发表(八行;七只读器,读目录授权结论读口挂两行) | n/a(判「这个码有没有 typed 读数」用 `Object.hasOwn(ENGINE_NOTICE_FACT_READERS, code)`;不要抄一份码名单) | 同左 | n/a | 同左 | pending | G-D1 |
10309
+ | D-3 | `readReadRootGrantNotice(notice)` 入参型 | changed(型放宽) | `{ code?, detail? } \| null \| undefined` → `unknown`(非破坏;读法与返回值不变) | 零改动即得 | 零改动即得 | n/a | 零改动即得 | n/a | G-D6 |
10310
+ | P-1 | `PARKED_RESUME_STARTUP_FAILED`;`parkedResumeStartupFromError(err, decision?)`;型 `ParkedResumeStartupDetail` / `ParkedResumeStartupCause` / `ParkedResumeStartupDecision` | consumed | 无 → 读口(只认 `errorCode` 串) | pending(决断出站代理上与既有几只 `say*` 同闸口,按这一发的方向传 `decision`) | pending(自己的决断失败面) | pending(同左,冻结期内零改动) | n/a | pending | 108a-3 · G-P1–G-P3 |
10311
+ | P-2 | `parkedResumeStartupContent(detail)` | added | 无 → 措辞单源(两句) | pending(说这一句,不自铸) | pending | pending | n/a | pending | 108a-3 · G-P4 |
10312
+ | P-3 | 读数上 `resendable: false` / `denyStaysOpen: true` | added | 无 → 判定(恒值) | pending(决断重试那一处:本码不自动重发;卡上 deny 保留) | pending(同左) | pending | n/a | pending | G-P5 |
10313
+ | P-4 | 包内四个决断出口的失败文字 | changed(补句) | `…failed: <原句>` → 本码时 `…failed: <原句> — <那一句>`;别的码逐字节不变 | 零改动即得(审批卡两条腿 / 提问卡腿 / 中断撤卡上屏行) | n/a(不走包内决断出口) | n/a | n/a | pending | G-P6 / G-P7 |
10314
+ | P-5 | `isCodeClassifiedGateFailure(code)`;包内停泊审批腿的「门已决」判定 | changed(码优先) | 扫词前只问 `isGateStandingErrorCode`(两码)→ 扫词前问本判定(两码 ∪ 本码);本码时不再按失败文字判「门已决」、不重连 | pending(自有「门已决」判据链:扫词之前问本判定;失败文字被拍平、读不到机读码的那条路,按 SDK 错误类名 `ParkedResumeStartupError` 兜底) | n/a(不走包内停泊腿;自有判据链时同左) | n/a | n/a | pending | 108a-3 · G-P8 / G-P9 |
10315
+ | E-1 | `removeRefusedSessionRules(facade, sessionId, roster, opts?)`;型 `SessionPolicyRemovalOutcome` / `SessionPolicyRemovedEntry` / `SessionPolicyRosterRequiredWhy` | added | — → 窄撤销动词(108a-4;`roster` 必交,缺席 / 读不了 ⇒ `roster_required`、零请求) | pending(「本会话规则」删除动作与可见段接它,名册取最近一份装配清单;非必改,见 108d) | n/a(未见会话规则写口) | n/a | n/a | pending | 108a-4 · G-E1–G-E5 · G-E9 / G-E10 |
10316
+ | E-2 | `sessionPolicyRemovalNotice(outcome)` | added | — → 八臂措辞(108a-5;撤成那句按桶分说) | pending(随 E-1) | n/a | n/a | n/a | pending | 108a-5 · G-E6 |
10317
+ | E-3 | `legacyToolNameFailureNoteOf(code)` | added | — → 启动失败出路句(108a-6) | pending(🔴 建议改:今天壳侧自己那一句按结果帧的旧键读码,换钉 ≥0.83.0 后会静默不再命中,见 108d) | n/a(未见终局失败按码补句的读点) | n/a | pending(建议:失败卡按码补这一句,见 108d;非必改) | pending | 108a-6 · G-E7 / G-E8 |
10318
+ | E-4 | `isEngineRefusedToolName(name)` | added | — → 引擎准备期按名字拒启的判据本体 | pending(可见段标坏行用它,不要自己判) | n/a | n/a | n/a | n/a | 108a-4 |
10319
+ | E-5 | `CONFIG_LEGACY_TOOL_NAME` | added | — → 码常量 `'config.legacy_tool_name'` | pending(换掉壳侧同值常量) | n/a | n/a | n/a | n/a | 108a-6 |
10320
+ | E-6 | `CONFIG_REFUSAL_CODES` | changed(+1 员) | 七员 → **八员**(+`config.legacy_tool_name`,排在最后) | n/a(按 `.has` / 前缀判即得) | n/a | n/a | n/a | pending(按「恰七员」或逐员逐序断言的改锚) | 108a′ |
10321
+ | W-1 | `decidePlanReview` 第四参 `DecidePlanReviewOptions.wire: { client, capsBaseUrl? }` | added | 无 → 注入连线:给了就只用它(POST + 回拉),已装目标一个字不读;client 不可用或连线本身坏形 ⇒ `not_sent` 专句、零请求、不抛;回拉是 15 s 独立落定的截止;`client` 的 `timeoutMs` 要求见 108a-9 | 零改动(继续装目标) | 🔴 接:`respondToPlan` 改调 `decidePlanReview(taskId, decisionWord, mode, { wire: { client: ctx.client, capsBaseUrl: ctx.approvalDecisionNoteBaseUrl }, reason, onOutcome })`,删本地编排(108d 网页端 ①) | 零改动(自有 client 直发,本包零读点) | n/a | pending | G-W1–G-W3 · G-W11 / G-W12 |
10322
+ | W-2 | `DecidePlanReviewOptions.reason` | added | 无 → 随决断上送 `PlanReviewRequest.reason`;trim / 空白与非串不落 / 超 4096 截断;去键重发保留;任一决断都可带 | 零改动(卡上无理由位) | 接:reject ⇒ `"rejected by user"`、revise ⇒ 反馈原文(与今天 `bodyOf` 同) | — | n/a | pending | G-W4 |
10323
+ | W-3 | `PlanReviewDeliveryOptions.onOutcome(outcome)`;型 `PlanReviewDecisionOutcome` | added | 无 → 结局交回宿主(与队列口并行;八键;`prompt` === 队列项 `value`;`status` 读到才落键);被闩拒不回调;队列口缺席 + 有回调 ⇒ 不打 error 级 MISSED | 可选(队列口在,零改动) | 🔴 接:按 `effect` 渲今天的人话回执(`took_effect` 静默、其余四句),删本地 `classifyPlanReviewEffect` 与回拉(108d 网页端 ①) | — | n/a | pending | G-W5 |
10324
+ | W-4 | `armPlanReviewApproval` 的 `opts.wire` / `opts.onOutcome`(命名形 `ArmPlanReviewOptions`) | added | 无 → 在场判看注入 client;CC-46 三选卡的证据键 = `wire.capsBaseUrl`(不给 ⇒ 老两选,不回落已装目标);responder 递交时原样带 | 零改动 | 候(网页端首呈卡今天走自家 `buildParkSurface`,不经 arm;换到包内首呈另立票) | — | n/a | pending | G-W2 |
10325
+ | W-5 | `ReopenPlanReviewOpts.wire` / `.onOutcome` | added | 无 → 缺省投递经注入 client;非默认槽 + `wire` 放行(此前必须自带 `deliverDecision`);canonical 复用臂沿用首呈的连线(成文例外) | 零改动(终端自带 `deliverDecision`) | 🔴 接:自愈 `reopenPlanReview` 供给改 `reopenPlanReviewCard(taskId, { trigger, wire: { client }, sessionKey: uiSessionId, onOutcome, presentationReceiptMs })`,并订阅 `onQuestionFrameFor(uiSessionId)` 渲卡(108d 网页端 ②) | — | n/a | pending | G-W6 |
10326
+ | W-6 | `EngineProbeOpts.client`(型 `EngineProbeClient`) | added | 无 → 两只探针直接用注入 client,`timeoutMs` 是独立落定的截止(到点答「不知道」并中止底层请求);凭证位不读 | 零改动 | 接(有调这两只探针时);今天零读点 | — | n/a | pending | G-W7 |
10327
+ | W-7 | 已装目标那条路(`EngineWireTarget` / `makeEngineWireClient` / 三口不带新位) | 不变 | 逐字节同 0.84.0(决断撞上请求时限那一臂除外,见 W-9) | 回归约束 | — | — | — | 回归约束 | G-W8 |
10328
+ | W-9 | `decidePlanReview` 决断 POST 撞上请求时限(sdk `TimeoutError`)那一臂的结局正文(两条路) | changed(结局正文) | 「could not reach the engine: <错误串>」→「was sent, but no answer came back from the engine within the time limit this host allows for it — it may have taken effect (…)」;`effect` 仍 `unconfirmed`;连不上照旧 | 零改动即得(6 h 时限罕见撞上) | 零改动即得(给中继 client 设 `timeoutMs` 后罕见撞上;见 108a-9) | n/a | n/a | pending(按旧句断言的格改锚,见 108a′) | 108a-9 · G-W10 |
10329
+ | W-8 | 子代族动词(tail / steer / output / compact ×2 / task handle ×2 / delegated prompt / resume)在中继部署下 | **pending**(包侧缺口) | 仍只吃已装目标;候「共用构造点收编 + 注入」 | — | 不接(今天零读点) | — | — | — | §7 P-28 · 包侧缺口 |
10330
+ | PD-1 | 终帧 CC 形 `permission_denials`(三键必填) | changed(读法) | 入参只被传输层脱敏过的拒绝:只在 `_sema_permission_denials` + `_absent: true` → 照进 CC 数组,`tool_input` = 帧上同一只对象(= 转录 `tool_use.input`) | 零改动即得(走 `runStream`;`-p` 结果帧整帧过境,新条目与新位原样到 stdout) | n/a(今天零读点) | n/a(今天零读点) | n/a | pending | 108a-7 · G-PD1 / G-PD3 / G-PD4 |
10331
+ | PD-2 | `_sema_permission_denials[]._sema_tool_input_redacted`(CC 数组同一条目同值) | added(超集位) | 无 → present-iff 严格 `true` | 可不读;凡拿 `tool_input` 做重跑 / 比对 / 生成放行规则的读点必读(今天终端没有这类读点) | n/a | n/a | n/a | pending | G-PD1 / G-PD2 |
10332
+ | PD-3 | `_sema_permission_denials_absent` | changed(落下条件) | 语义不变(= CC 那条清单不可声称完整);这一类不再让它落下 | 零改动即得(两键合读的读法不变:`[]` + 缺席 = 零拒绝) | n/a | n/a | n/a | pending | G-PD1 / G-PD5 |
10333
+ | PD-4 | `_sema_tool_input_source` | changed(在场条件) | 语义不变(只说来源);在场条件放宽到被脱敏过的入参 | 零改动即得 | n/a | n/a | n/a | pending | G-PD1 |
10334
+ | K-1 | 标签 / 方案词后、紧贴值夹不可见单字的地址形值 | changed(输出字节) | 按地址豁免(主机 / 路径原样)→ `scheme://` 留、主机与路径换 `«redacted:secret»`、query / 片段照旧换记号 | 经本包的合成终局行 / 结果帧 `errors[]` 升级即净;终端自带的呈现出口不在本版射程 | 零直接读点;经适配层的机读口升级即净 | 不在射程(钉的版本早于呈前出口) | 三种载体(正文 / 单行 / 字段)零改动即净;钉现状的提货格按预期翻红 → 翻面 | pending | 108a-8 · G-K1 / G-K2 |
10335
+ | K-2 | `user:<口令>@` 后主机位被可剥单元占住、没有主机 | changed(输出字节) | 不算 userinfo(口令原样)→ `«redacted:userinfo»@…`;候选挂在凭据标签 / 方案词上(是它的值或吞了它一截;标签被单元拆开也算)⇒ 让给标签那一遍整只遮(与 0.84.0 同字节) | 同上 | 同上 | 同上 | 同上 | pending | 108a-8 · G-K3 / G-K6 / G-K7 |
10336
+ | F-1 | 门夹具的 `done` 终帧形(六套:权限拒绝投影 / 流式计时 / 终态身份文案 / 终答补差 / 停泊决断 422 / 纯函数总套余下部分) | gates | 退役平面形 → 现役因由形 `result.terminal`;前后检查数逐一相同 | n/a | n/a | n/a | n/a | n/a(门内自证) | G-F1 |
10337
+ | F-2 | 合法扁平帧(409 拒绝信封 / 回放面)29 处 | gates | 无注 → 逐格注 `// 409:` / `// 回放面:` | n/a | n/a | n/a | n/a | n/a | G-F2 |
10338
+ | F-3 | 新门:扁平终帧未注位点棘轮 | gates | 无 → 上限 23,只降 | n/a | n/a | n/a | n/a | pending(可按 G-F3 自跑) | G-F3 |
10339
+ | F-4 | 新门:权威信封标签镜像 ⇄ 引擎表双向对账 + 三车道拆火消费面 | gates | 无门 → 常驻门(过渡读法) | n/a | n/a | n/a | n/a | pending(可按 G-F4 自跑) | G-F4 |
10340
+
10341
+ F-1 – F-4 只改门:那一件的 `src/` 零改动,dist、根公面、措辞都不因它变;同事正文的拆火行为(转录行里权威标签 `<` 后插零宽空格)逐字节不变,本版只是给那张表补了对账门,按 §17 接同事三车道的端零改动。
10342
+
10343
+ #### 108a-1 · 开标签定位口
10344
+
10345
+ - 文法与 104a-1 同(两形 + 七种不认的形),与剥离 / 解包两口是**同一个判定函数** —— 三口对「哪一处是开标签」永远同答。
10346
+ - `findSystemReminderOpenTag(text, from = 0)`:回 `start ≥ from` 的第一枚开标签的 `{ start, end }`(UTF-16 下标;`end` = 开标签后一位,`text.slice(start, end)` 恰是那枚开标签);没有回 `null`。`from` 落在一枚开标签内部时,那一枚不认。
10347
+ - 截断:开标签要整枚在场才认 —— 串尾的 `<system-reminder`、`<system-reminder mark="AbCd`、`<system-reminder mark="<22 位>"`(少 `>`)都不认;截断形后面紧跟一枚完整开标签时认后面那枚。
10348
+ - **与块上下文无关**:块正文里的字面开标签(引擎铸块时不转义正文)、没闭合的开标签、嵌套的内层开标签都认。本口只答「开标签在哪」,不答「它是不是一块的开头」。要与剥离口同块语义地切块,按下面的循环(从闭标签尾接着找,块里的字面开标签自然被跳过):
10349
+
10350
+ ```ts
10351
+ const CLOSE = '</system-reminder>'
10352
+ let i = 0
10353
+ for (let open = findSystemReminderOpenTag(text, 0); open !== null; ) {
10354
+ const close = text.indexOf(CLOSE, open.end)
10355
+ if (close === -1) { /* 截断块:归块还是归正文由端定(剥离口原样留作正文) */ break }
10356
+ // 正文:text.slice(i, open.start);块体:text.slice(open.end, close)
10357
+ i = close + CLOSE.length
10358
+ open = findSystemReminderOpenTag(text, i)
10359
+ }
10360
+ // 余下正文:text.slice(i)
10361
+ ```
10362
+
10363
+ 这个循环与剥离口逐字节同答(门 F3 格)。「删掉一块后从串头重找」的写法两处与它不同:每删一块都重扫一遍(块多时平方),而且删块后两侧的字节拼在一起可能拼出一枚新的开标签;按上面的循环从原串的闭标签尾接着找,两处都没有。
10364
+ - 线性:单次调用一趟扫到命中或串尾;按上面的循环逐枚找完整串,总开销线性。
10365
+ - 入参:`text` 非串 ⇒ `null`(不强转;`String` 包装对象、带 `toString` 的对象同);`from` 的合法域 = 0 ≤ `from` ≤ `text.length` 的整数(缺席 = 0),域外(负数、小数、`NaN`、`±Infinity`、非数)⇒ `null`。都不抛。
10366
+
10367
+ #### 108a-2 · detach durable-off 400 纯判定
10368
+
10369
+ - `isDetachDurableOff400(err)` ⇒ `true` ⟺ `err.status === 400`(数字)∧ `err.message` 是串且含 `DETACH_DURABLE_OFF_400_ANCHOR`(`'x-detach-on-disconnect requires a durable run'`;这条拒绝的原文以它起头)。SDK 把错误体的 `error` 原文放进 `message`,所以对 SDK 抛出的错误直接调即可。
10370
+ - 🔴 **不认码**:这条拒绝带 `errorCode: 'request.precondition_unmet'`,但那是通用前置条件码 —— 同一条 `POST /v1/tasks/stream` 上与 detach 头无关的拒绝也用它(device 部署首轮没有会话、带 `deviceId` 而部署不在用户设备上执行、cascade 没配梯子)。按码判 = 对那些拒绝静默去头重发一次、说一句「没有耐久 run」的假话。
10371
+ - 不读进程台账:与 `isDetachArmed()` 无关,任何宿主都能调。`detachDurableOffHint(err)` = `isDetachArmed() ∧ isDetachDurableOff400(err)` ⇒ 提示行;两者在 armed 时同答。
10372
+ - 读法:`status`、`message` 按普通属性读 —— 原型链上的属性也认,函数对象带这两位也认。每个属性至多读一次,先读 `status`,不是 400 就不读 `message`。
10373
+ - **一律不抛**:非对象 / `null` / 缺字段 / `message` 非串 ⇒ `false`;读属性时 getter 抛错、Proxy 陷阱抛错、已撤销的 Proxy ⇒ `false`(不外抛、不重试读)。宿主通常在 `catch` 里调它,判定自己再抛会把原本那一枚错误遮掉。`detachDurableOffHint` 随之对这类对象回 `null`(此前已 arm 时原样抛出)。
10374
+
10375
+ #### 108a-3 · 422 `parked_resume.startup_failed` 的两种成因与读口怎么选句
10376
+
10377
+ - 成因 ①:续跑没起来 —— 被停泊的代理会话没了(这一形里那一行已不可再决),或引擎拒了这次决断本身(例如答案挂错了问题);成因 ②:停在一只「代理从发起它的任务继承来的工具」上的**批准**,这台服务端交不出那只工具 —— 同一个批准永远不会成,卡留在待决列表,deny 照样能结掉它(服务端对一层代理已能交出,更深层的代理与发起会话已删除或换了主人的行仍落这一形)。
10378
+ - 回体只有 `error`(引擎正文)/ `errorCode` / `taskId` / `rollback`,**没有**成因位;本包不按正文分臂。
10379
+ - `decision: 'deny'` ⇒ `cause: 'resume_rejected'`(成因 ② 只对批准出)⇒ 句子只说成因 ①:「重取待决列表,卡还在就从新列表再决」。
10380
+ - `decision: 'approve'`、未声明、或表外值 ⇒ `cause: 'undetermined'` ⇒ 句子摆两条出路:「引擎拒了这次决断本身 ⇒ 改正后再决;批准的是继承来的工具 ⇒ 再批在这台服务端上不会成,拒掉或等服务端升级」。
10381
+ - 两句的第二段相同:这次拒绝**不说**卡是否还在 —— 先重取待决列表。
10382
+ - **码优先**:本码的失败文字里是引擎原句;会话没了那一形恰含「Session not found」,会命中「门已决」扫词表(`no pending checkpoint` / `resolved` / `already` / `not found`)。本码不走那张词表:它既不是「门还在」(不进 `isGateStandingErrorCode`),也不是「门已决」,是「启动期失败、先重取待决列表」。
10383
+
10384
+ #### 108a-4 · 撤销动词
10385
+
10386
+ - **名册必交**:`removeRefusedSessionRules(facade, sessionId, roster, opts?)` 的 `roster` 是这台部署上一跑的工具名册(`wiring_manifest` 经 `projectToolRoster` 读出的 `ToolRosterView`)。引擎准备期那道审计先问「名字在不在这一跑的名册里」—— 集合 = 每行的 `name` ∪ 该行的 `aliases`,**原样比、分大小写**(`task` 不豁免 `Task`)—— 在就放行,两类硬失败都不走。部署自己挂了一只恰叫退役名的工具(如一只叫 `Task` 的自定义工具,或别名恰是 `KillShell` 的工具)时,记录里那一条是**生效的**限制;本动词因此只撤「判据本体说会拒 ∧ 名字不在名册里」的条目。
10387
+ - 名册缺席(`undefined` / `null`)⇒ `roster_required` / `absent`;交了但读不成名册(不是对象、`entries` 不是数组、任一行没有非空串名字、`aliases` 在场却不是串数组、读属性就抛)⇒ `roster_required` / `unreadable`。两形都**一个请求都不发**(读都不读)。绝不半张名册:少读一行 = 把那只工具当没挂 = 多撤一条生效的限制。读得懂的空名册(一只工具都没挂)是名册,照常判。
10388
+ - 名册从哪来:因 `config.legacy_tool_name` 启动失败的那一跑在交出装配清单**之前**就停了(引擎先审计、后铸清单),交不出名册;取这条会话 / 这台部署上最近一次过了准备阶段的一跑的清单。两跑挂的工具不同时按交来的那一份判(KL-182)。
10389
+ - **做什么**:`GET` 当前记录(窄读同 `readSessionPolicy`)→ 在 `toolDeny` / `toolAllow` 里拿掉 `isEngineRefusedToolName` 判「会拒」且名字不在名册里的条目(同一桶里重复的同名条目全拿掉、结局里只记一次)→ 带读到的版本号 `PUT` 整份记录 → 回执对账(版本号推进、留着的条目都在、撤掉的条目**不在**)。
10390
+ - **不做什么**:不删别的条目(通用删除在属主身份上是放宽,引擎照拒);不碰命令桶 / 目录桶(不进那道审计);不改写成现名(往白名单里加名字是放宽;往禁止名单里加现名交给用户自己决定);不读能力位、不按引擎版本猜。
10391
+ - **判据用本体,不用 `legacy_tool_name` 判词**:判词排在逐条判据最后,` foo__bar` / `foo__*` 先被判成 `not_a_tool_name` / `wildcard`;这些形照样让引擎拒启,按判词撤会漏掉它们、会话照样起不来,还会答一句「没有要撤的」。
10392
+ - **两代引擎**:
10393
+ - 老引擎:普通调用方从 `toolDeny` 里删任何一条都算放宽 ⇒ `loosen_forbidden`,**记录不变**(恰写一次、不重试)。只有 `toolAllow` 里有坏行时,删它是收紧方向 ⇒ 撤得成。运营方身份两种都撤得成。
10394
+ - 较新的引擎(宣布「删一条引擎会拒启的名字不算放宽」之后):普通调用方也撤得成。
10395
+ - **结局**:
10396
+
10397
+ | `kind` | 什么时候 | 记录 | 附带 |
10398
+ |---|---|---|---|
10399
+ | `roster_required` | 名册缺席(`why: 'absent'`)或读不了(`why: 'unreadable'`) | 没读、没写 | `why` |
10400
+ | `removed` | 回执读得懂且对得上 | 撤掉的条目已不在,版本号 +1 | `rev`(新版本号)、`removed`(撤掉的条目,按桶名全集的序、桶内按记录序,非空) |
10401
+ | `nothing_to_remove` | 两只桶里没有「会拒且名册里没有」的条目 | 没写 | `rev`(读到的版本号) |
10402
+ | `loosen_forbidden` | 引擎把这次删除判成放宽 | 不变 | `message`(引擎原文)、`refused`(本想撤的条目) |
10403
+ | `conflict` | 重读重写一次之后仍被并发键挡住 | 没写 | `rev`(第二趟依据的版本号) |
10404
+ | `read_failed` | 当前记录读不到 / 读不懂 | 没写 | `why`、可选 `message` |
10405
+ | `write_refused` | 引擎带码拒了这次写(客户端侧拒绝都在落盘之前) | 没写 | `why`、可选 `message` |
10406
+ | `write_unconfirmed` | 裁决没到手(裸抛 / 断连 / 5xx / 不带码的 4xx)或回执读不懂 / 对不上 | **可能已经生效** | `why`、可选 `message`;再调一次即核对 |
10407
+
10408
+ `why` 取自 `SessionPolicyTightenUnknownWhy` 的子集:`read_failed` ∈ {`face_unavailable`, `session_not_found`, `session_ownerless`, `unauthorized`, `request_rejected`, `store_corrupt`, `read_unreadable`, `read_failed`};`write_refused` ∈ {`face_unavailable`, `session_not_found`, `session_ownerless`, `unauthorized`, `request_rejected`, `store_corrupt`, `write_refused`};`write_unconfirmed` ∈ {`write_indeterminate`, `write_receipt_unreadable`, `write_receipt_mismatch`}。
10409
+
10410
+ #### 108a-5 · 撤销措辞
10411
+
10412
+ `sessionPolicyRemovalNotice(outcome)` 八臂各一句(失败臂与名册臂按 `why` 再分几句):
10413
+ - `roster_required`:什么都没改;没有名册(或读不了),看起来会拒的名字可能是这台部署自己挂的工具,撤了会放宽一条生效的限制;`absent` 那句指路「交这条会话在这台部署上一跑的名册(启动失败的那一跑不交名册)」,`unreadable` 那句指路「按装配清单读出的原样交」;
10414
+ - `removed`:`Removed N entr(y|ies) from this session’s rule record (now at version V): (it|each) names a tool the engine refuses, and no tool in the supplied roster answers to (it|those names); this record no longer stops the session’s runs from starting.`,后面**按撤掉的桶**接一半或两半:撤了 deny ⇒「从 deny 列表拿掉名字不解开任何挂着的工具;要按现名拦就新加一条 deny」;撤了 allow ⇒「从 allow 列表拿掉名字不放行任何新东西:那些名字原想放行的工具仍在列表外,列表拿空即一个工具都不放行;要按现名放行就把现名加回 allow 列表」;
10415
+ - `nothing_to_remove`:什么都没改;若仍启动失败,那一条在这条记录管不到的地方(随跑设置 / 父会话规则记录 / 部署自己的工具规则),或是本版还不认得的新拒启名,或失败那一跑没挂交来的名册里同名的那只工具;
10416
+ - `loosen_forbidden`:这台引擎上只有运营方能从会话规则记录里删条目,记录没变;找运营方,或换一个新会话继续;
10417
+ - `write_unconfirmed`:可能已经生效,再跑一次撤销(它会重读,生效了就答没有要撤的);
10418
+ - 其余:什么都没改(规则店故障那句另说需要运营方看一眼规则店)。
10419
+
10420
+ 纪律:零用户字节(条目原串与引擎原文都不进句子;要摆哪几条由宿主对 `removed` / `refused` 取);表外值回通用句,不抛。
10421
+
10422
+ #### 108a-6 · 启动失败出路句
10423
+
10424
+ `legacyToolNameFailureNoteOf(code)`:`code === 'config.legacy_tool_name'` ⇒ 下面这一句,否则 `undefined`(别的 `config.*` 码不在这里答)。
10425
+
10426
+ `This run did not start: a tool rule applied to it names a tool the engine refuses — a retired tool name, or a name that contains "__" but does not start with "mcp__" or "a2a__" (the engine's own error text names the entry). Every later run fails the same way until that entry is removed from wherever it is set: this session’s rule record, the settings sent with the run, a parent session’s rule record, or the deployment’s own tool rules.`
10427
+
10428
+ - 码从哪取由宿主定:结果帧的超集键 `_sema_error_code`(0.83.0 起;此前骑 `errorCode`)、`readRunTerminal` 读数 `failed` 臂的 `code`、子代工具结果的 `errorCode` 都行。
10429
+ - 句子不断言「一定在会话规则记录里」:同一枚码也从调用方策略那一层来(G-E8 实跑);会话规则记录排第一是因为它是撤销动词管得到的那一处。
10430
+ - 不点名谁能删:会话规则记录里那一条,老引擎上只有运营方能删、较新的引擎上属主可删;撤销动词的结局会说出这一台的答案。
10431
+ - 不回显名字、不读引擎原文(那一行已在失败文字里,且点了名)。
10432
+
10433
+ #### 108a-7 · 哪几类拒绝在 CC 形清单上、哪几类不在
10434
+
10435
+ - **在**(三键齐):入参来自账本(今天没有)或同一条流的 `tool_start`,且是普通对象、扫描在预算内(节点 ≤ 20000、深度 ≤ 80)。其中被传输层动过的(字符串叶含 `«redacted` 前缀的记号,或叶值恰为 `[circular]` / `[depth-limit]`)**本版起也在**,条目带 `_sema_tool_input_redacted: true`。
10436
+ - **不在**(只在 `_sema_permission_denials`,`tool_input` 缺席,`_absent: true`):行无 `toolCallId` · 本流没见过那只 `tool_start` · 同一个 id 两份不同入参 · 入参不是普通对象 · 超扫描预算(含「被动过 ∧ 超预算」)· 本流快照溢出 · 流内补行工具名读不出。这几类手里**没有**一只可交出的入参对象;本包不编。
10437
+ - 为什么收「被动过」那一类而不收「没有对象」那几类:前者本包手里有对象,而且同一条输出流里已经把它当 `tool_use.input` 交出;在拒绝清单里再拒收同一只对象,换来的只是条数错。后者手里什么都没有,填 `{}` 是编造一个「入参为空」的事实。
10438
+ - 严格的消费方:CC 数组元素上多出的超集位(`_sema_tool_input_source` / `_sema_tool_input_redacted` / `_sema_tool_arg` / `deniedBy` / `toolDenialKind`)在缺省的对象校验下被剔掉;对元素做「禁止未知键」形校验的消费方会判非法 —— 这一风险自 0.73.4 起就在(不是本版新引入)。
10439
+
10440
+ #### 108a-8 · 凭据读法两处收口的判据(逐条)
10441
+
10442
+ 1. **不可见单字** = 判别视图里的可剥单元中,完整转义序列(CSI / nF / Fp / Fe、已结尾的控制串、被下一枚单元截断的序列前缀)以外的那些:格式类字符(`\p{Cf}`)、孤代理项、非空白控制符(C0 除 `\t` `\n` `\v` `\f` `\r`、DEL、C1)、没接成序列的 ESC / C1。原字与本出口画出的可见转义形(`\uXXXX` / `\u{…}`)同判;空白码位的转义形(`\u000A`、`
` 等)与原字同判,算空白。
10443
+ 2. **地址形** = 值以 `scheme://`(scheme 2–16 位)打头,或以 `«redacted:userinfo»@` 打头。
10444
+ 3. **紧贴** = 值起点左边连着的那一串可剥单元里至少有一枚不可见单字(串里可混着序列)。左邻是真空白 / 分隔符 / 引号 ⇒ 不算(值是独立的一只地址);只有序列 ⇒ 不算。
10445
+ 4. **遮盖**:`scheme://` 留;其后到 `?` / `#`(或外延末)换 `«redacted:secret»`;`?` / `#` 之后照豁免时换 `«redacted:query»` / `«redacted:fragment»`。外延取「豁免时的外延(到下一个引号外空白)」与「值本身(到停字符)」较长的一段;段末跨着下一枚标签时与豁免同样停在标签前,那枚标签照常遮它自己的值。
10446
+ 5. **空主机**:`@` 之后一串可剥单元(任一种),之后是右界(串尾 / 空白 / `` / ? # " < > ` | \ ^ { } ``)、`:<数字>` 再右界、或下一枚 `@` ⇒ 前面的 `<名>:<串>` 按 userinfo 遮;这一形里用户名一段跨过可剥单元。单元之后直接是主机的形不走这一条(并联读法本来就认得出)。
10447
+ 6. **候选挂在标签上**(第 5 条的让位):窗口 = 上一枚 `@` 之后到这一枚 `@`,在两种读法上各找凭据标签(带分隔)与方案词(带分隔)—— 原样读法(可剥单元照算空白)与剥掉可剥单元的读法(`to` + 软连字符 + `ken=`、`"pass` + 孤代理项 + `word":`、`Bea` + 零宽空格 + `rer `、`tok` + 着色序列 + `en=` 这种被拆开的词)。有一枚匹配的**末端落在候选起点或其右**(候选就是它的值:分隔一直吃到候选起点,含引号值的开引号;或候选吞了它一截)⇒ 不认,留给标签那一遍整只遮(与 0.84.0 同答)。末端在候选起点左边、中间隔着别的字(`token=abc user:<口令>@…`)⇒ 照认。只在空主机形上判;主机在场的形照旧(KL-193)。
10448
+
10449
+ #### 108a-9 · 注入 client 路径的决断时限与读口截止
10450
+
10451
+ - 🔴 **注入 client 的 `timeoutMs` 不低于 6 小时**(`21600000`,与已装目标那条路的决断预算同一档),**建议 `maxRetries: 0`**(本包自构造的 client 同此)。例(浏览器同源中继宿主):`new AgentClient({ baseUrl: '', authToken: { mode: 'same-origin-relay' }, timeoutMs: 6 * 60 * 60 * 1000, maxRetries: 0 })`,专给 plan-review 连线用。
10452
+ - 为什么:批准会让引擎把续跑**同步**驱动到终态才答复,常常是分钟级;sdk 的逐请求选项只有取消信号(没有逐请求时限 / 重试开关),本包改不了宿主 client 的时限。沿用 sdk 缺省 60 s 的 client,续跑超过一分钟的批准会落时限那一臂。
10453
+ - 时限那一臂(两条路同一句):sdk 每请求时限到点(`TimeoutError`)⇒ `effect: 'unconfirmed'`,结局正文「The plan_review <决断> was sent, but no answer came back from the engine within the time limit this host allows for it — it may have taken effect (…)」—— 这一发已经送出、引擎多半正在驱动续跑,**不是**连不上;连接被拒 / 断网照旧「could not reach the engine: <错误串>」。
10454
+ - 本包经注入 client 的读都有**独立落定**的截止,与 client 的时限长短无关:决后回拉 15 s、`engineSupportsTaskAgents` 3 s、`probeScenarioTools` 2 s(后两者可经 `timeoutMs` 改)。截止到点即落定(回拉当失败、回落 200 体的状态;探针答「不知道」),同时中止底层请求。注入 client 的读重试在退避 / `Retry-After` 睡眠期间不看取消信号 —— 截止照样按时落定,但那只 client 可能再睡一轮(至多 60 s)才收手;`maxRetries: 0` 即无此形(KL-191)。
10455
+ - 已装目标那条路不变:决断用独立的 6 h client、回拉用独立的 15 s client,两只都 `maxRetries: 0`。
10456
+
10457
+ ### 108a′. 成文改口(旧判据眼作废 → 新判据眼)
10458
+
10459
+ **作废**(旧判据眼装 0.84.1 后判红是预期行为,不是回归):
10460
+
10461
+ 1. §104 包侧缺口 ⑦「开标签文法本身不上公面,要按开标签切块的端仍自持文法」的后半句 —— 切块的端换读 O-1 即可,不必自持文法。前半句(文法常量不上公面)照旧成立。
10462
+ 2. §104 处置表 R-1 管理台格与 104d「回放面按开标签切块的那一处仍需文法(见包侧缺口 ⑦)」—— 那一处换读 O-1。
10463
+ 3. 「浏览器 / 桌面拿不到 detach 400 的判定,只能本地自写」—— 用 DT-1。
10464
+ 4. 「已 arm 时 `detachDurableOffHint` 对读属性会抛错的错误对象原样抛出」—— 本版起回 `null`(G-DT6)。
10465
+ 5. 「`noticeAudienceOf('instructions.source_changed') === 'operator'`(属运维面)」—— 本版起受众 `user`;`memory.layer_locked_legacy` 受众仍 `operator`(服务端只在启动期把它记进运维日志,不上用户流),此前是回落、本版起表上写明。按「受众为 `operator`」写的判据在 0.84.1 上必须判红(G-N2)。
10466
+ 6. 「`engineNoticeInCatalog('instructions.source_changed')` / `engineNoticeInCatalog('memory.layer_locked_legacy')` 答 `false`(册外、只落调试)」—— 本版起两枚都答 `true`(在册、册内通用行)。按「这两枚码册外 / 只落调试」写的判据在 0.84.1 上必须判红(G-N2)。
10467
+ 7. 「422 `parked_resume.startup_failed` + 正文含 `not found` ⇒ 包内停泊腿走重连一轮」—— 0.84.0 及以前的误判,本版起判红;按旧行为写的判据(「这一形会重连一轮」)作废(G-P8)。
10468
+ 8. 「`CONFIG_REFUSAL_CODES` 恰七员」—— 改八员,新员 `config.legacy_tool_name` 排在最后。
10469
+ 9. §66 **G2**(join 负半):「入参里带一段会被传输层替换的凭据形串 ⇒ `permission_denials` 空、`_sema_permission_denials` 一条(带 `tool_use_id`,无 `tool_input`)、`_absent: true`」—— 本版起该形 `permission_denials` 恰一条、`tool_input` 与转录 `tool_use.input` 同一只对象、两载体同一条目 `_sema_tool_input_redacted: true`、`_absent` 不在场(G-PD1)。
10470
+ 10. §66 **G3**(混合,一正一负且负的是 G2 那一形):「CC 数组一条、sema 载体两条、`_absent: true`」—— 本版起 CC 数组两条(脱敏那条带标记)、`_absent` 不在场(G-PD3)。负的一条若是「没有对象」那几类(例:行无 `toolCallId`),旧判据照旧成立。
10471
+ 11. 按「CC 形数组里的条目都没被传输层动过 / `tool_input` 字符串叶里不会出现 `«redacted…»`」写的判据眼 —— 本版起有标记的条目恰是这一形。
10472
+ 12. 按「`Authorization: Bearer` + 孤代理项 + `https://…` 在正文 / 单行 / 字段载体上原样露出值」钉现状的格,以及「同一位置换成零宽空格同样露出」的对照格([8562])—— 本版三种载体都不含值、都含 `«redacted:`(G-K1)。
10473
+ 13. 按「`user:<口令>@` + 不可见单元、没有主机 ⇒ 机读口 / 转义形原样」钉现状的格(G-K3)。
10474
+ 14. 按「`decidePlanReview` 决断撞上请求时限 ⇒ 结局正文「The plan_review decision could not reach the engine: …」」钉现状的格 —— 本版起这一臂说「was sent, but no answer came back from the engine within the time limit …」(G-W10);连接被拒 / 断网那一形照旧。
10475
+
10476
+ **改读**(判据的意思保留,换读法):
10477
+
10478
+ 1. §66a **S-1**「三道闸(普通对象 / 没被传输层动过 / 扫描预算内)」→ **两道闸**(普通对象 / 扫描预算内)+ **一个标记判定**(被传输层动过 ⇒ 照交出,盖 `_sema_tool_input_redacted`)。
10479
+ 2. §66b 第一条「`tool_input` 缺席 = 拿不出可信的入参对象,五种原因之一」→ **四种**:行无 `toolCallId` · 本流没见过那只 `tool_start` · 入参不是普通对象 · 超扫描预算;「入参被传输层动过」一因移出(那一类现在 `tool_input` 在场并带标记)。「绝不等于入参为空」不变。
10480
+ 3. §66z **#3**「传输层替换记号 / 环与深度占位串:consumed(只作『被动过』判据,不反解)」→ consumed(只作**标记**判据,不反解、**不拦**)。
10481
+ 4. 0.73.4 发布说明「被拒的调用没有改写,所以拒绝清单上的 `tool_input` 就是模型发出的入参」→ 射程限定:`tool_input` 是调用开始时 `tool_start` 帧上的入参(= 模型发出的那份,审批人改写过的是改写后那份);**不是**「被拒的那份」—— hook / 策略在判定前改写过入参的调用,被判并拒绝的是改写后的最终入参(KL-175)。本版新收的脱敏条目另有一层:它还是脱敏视图(标记在场)。
10482
+ 5. §66 包侧缺口 ②「被传输层动过的入参无机读判别位(今按字面记号认)」→ 仍成立,改读为「标记按字面记号盖」(KL-11 改写)。
10483
+ 6. 按 0.83.4 原样凭据字节(`Authorization: «redacted:secret»`、`Bearer «redacted:secret»`)写的判据,改锚为「输出不含值的字面 ∧ 含 `«redacted:`」(本版字节见 G-K1 / G-K2)。
10484
+ 7. §106y 第 2 条「已中招的会话要把那一条从会话规则记录里删掉(今天的引擎上只有运营方能删)」与 §106 包侧缺口 ③「已经写进会话规则记录、每跑启动失败的会话本包救不回,也还没有专门出路句」—— 本版起有撤销动词(E-1)与出路句(E-3);老引擎上属主撤 `toolDeny` 仍会被判放宽而拒(撤销动词如实答 `loosen_forbidden`),较新的引擎上属主可撤。
10485
+ 8. §5d 与 §7 **P-28**「正位解 = 放宽 `EngineWireTarget.token` + 10 处透传」—— 改为:plan-review 三口与两只探针以注入 client 解(本版,§5d 入参面表末两行);子代族候「共用构造点收编 + 注入」。§5d 末表 A 档「用户看不看得见取决于通知队列口装没装」补:宿主接了 `onOutcome` 也算可见通道(本版起两条通道并行)。活段 §5d / §7 P-28 已随本版改写。
10486
+ 9. 注入 client 路径的决断时限:宿主交进来的 client 的 `timeoutMs` 不低于 6 h、建议 `maxRetries: 0`(108a-9);决断撞上时限那一臂按 G-W10 的句子判「已送出、结果未确认」,不按「连不上」判。
10487
+
10488
+ **新增**:G-O1–G-O6 / G-DT1–G-DT6 / G-N1–G-N5 / G-D1–G-D6 / G-P1–G-P9 / G-E1–G-E10 / G-W1–G-W12 / G-PD1–G-PD6 / G-K1–G-K7 / G-F1–G-F4。
10489
+
10490
+ **不变**:
10491
+
10492
+ - 剥离 / 解包两口的块语义与答案(§104 G-R2 / G-R4 / G-R6 照旧成立)。
10493
+ - `detachDurableOffHint` 对其余输入的答案(未 arm 恒 `null`;armed 时对 durable-off 400 出那一行、其余 `null`)。
10494
+ - 引擎码册镜像 `ENGINE_NOTICE_CODES` / `ENGINE_NOTICE_AUDIENCE` 的成员与顺序;六只既有事实读器(含 0.84.0 的读目录授权结论读口)的读法;两表之外的码受众仍保守 `operator`。
10495
+ - 决断出口在别的码 / 无码上的失败文字逐字节同 0.84.0;没有机读码 / 别的码的失败,包内停泊腿「门早已决」扫词臂照旧。
10496
+ - `sessionPolicyDeliverable` 的判决与话(`legacy_tool_name` 臂改调判据本体,同表同序)。
10497
+ - plan-review 三口不带新位时(请求体 / 出站头 / 结局文字〔决断撞上请求时限那一臂除外〕/ 队列项键集 / 投递闩 / 投递序号 / 重开判决)逐字节同 0.84.0;`EngineWireTarget` 型与 `makeEngineWireClient` 不动。
10498
+ - 拒绝清单「没有对象」几类的处置(§66b 其余四因、§66 G4、0.82.1 对账的缺字段行);账本自带入参恒优先;`_sema_tool_input_source` 的值与「只说来源」的语义;`_sema_permission_denials_absent` 的语义(CC 那条清单不可声称完整)与两键合读法;`_sema_zero_output_denied` 的三条合取(读的是 sema 载体,不受本件影响);流内快照的 per-stream / 上限 / 单向闩 / 两份不同入参出表。
10499
+ - 凭据读法:孤代理项与零宽空格同位同答(§105 的同处置不变量)照旧成立;干净文本逐字节不变照旧成立;标签 / 方案词的值是空主机 userinfo 形时与 0.84.0 逐字节同(G-K6)。
10500
+ - 同事正文的权威标签拆火逐字节不变。
10501
+
10502
+ 已发段(§66、§104、§106 与 0.73.4 的 CHANGELOG 段)不回改,以本段为准。
10503
+
10504
+ ### 108b. 缺席语义(逐键)
10505
+
10506
+ **开标签定位口 / detach 判定**
10507
+
10508
+ - `findSystemReminderOpenTag` 回 `null` = 从 `from` 起没有(完整的)引擎形开标签 —— 串里只有截断形 / 非引擎形也是 `null`;`text` 非串、`from` 域外同样是 `null`。它**不是**「不知道」:在切块循环里读作「余下都是正文」(方向与剥离口对截断信封的处置一致:宁可多渲,不吞正文),调用方把位置算错时循环也照样收尾、不会从头重扫。
10509
+ - 回 `{ start, end }` 不代表这一块闭合了:有没有闭标签要调用方自己找(108a-1 的循环)。
10510
+ - `isDetachDurableOff400` 回 `false` = 这一枚错误不是(或认不出是)detach durable-off 400:非 400、没有锚句、非对象、读属性就抛错的对象都落这里。那条拒绝的原文改了时也落这里 —— 方向:不退让、不出提示行,原 400 照常交给宿主(不会静默重发)。
10511
+ - 回 `true` 只看两位的值,不看载体的形:函数对象、原型链上带 `status: 400` 与含锚句 `message` 的对象同样回 `true`。常见的本地实现先判 `typeof err === 'object'`,对函数对象回 `false` —— 换读本口时这是唯一的答案差别(SDK 抛出的错误都是对象,真部署上碰不到)。
10512
+
10513
+ **服务端自铸码 / 派发口 / 停泊决断 422**
10514
+
10515
+ - `readInstructionsSourceChanged`:`previous` / `current` 的 `null` 是真读数(「那一次运行没有项目指令文件」);键缺席、空串、非串非 `null`、只在原型链上 ⇒ 整只 `undefined`(不是 `null`)。`sessionId` 缺席 / 空串 ⇒ 整只 `undefined`。视图里没有运行 id(服务端铸点不带;运行归属由投递它的那条流承载)。
10516
+ - `readEngineNoticeFacts`:`undefined` 不是「没发生」—— 在册码走册内通用行渲引擎 / 服务端给的 `message`,册外码只落调试(端的分流,不在本口)。表里有这个码但读器判不成形 ⇒ `undefined`(不交半只读数)。
10517
+ - 读目录授权两码经派发口(派发口不做类型断言,`facts` 按码收窄到那只读口的视图型):`facts` 是 `readReadRootGrantNotice` 的两臂联合视图(型面上两码都是这只联合),按 `facts.outcome` 判别 —— 读口按码出臂,granted 码恒出 granted 臂、rejected 码恒出 rejected 臂;granted 形坏(缺 `dir` / `root`、`covers` 在场而不是 `"exact"`)⇒ 派发口与直接调读口同判 `undefined`(不折成目录义)。
10518
+ - `parkedResumeStartupFromError`:`null` = 不是这枚码(别码、无码、非对象、取值器抛)⇒ 端走原有失败面。`taskId` 读不出 ⇒ 键缺席(不编)。`decision` 缺席 ⇒ `undetermined`。
10519
+ - 老服务端(不发这枚码)/ 缺席:读口恒 `null`,决断出口失败文字与 0.84.0 逐字节同。
10520
+
10521
+ **拒启会话的撤销动词 / 出路句**
10522
+
10523
+ - `roster` 缺席 ≠「这台部署没挂工具」:缺席 / 读不了 ⇒ `roster_required`,一条不撤、零请求;读得懂的空名册才是「一只都没挂」。结局里不回显名册。
10524
+ - `removed` 恒非空(空就是 `nothing_to_remove`);`refused` 恒非空。
10525
+ - `message` 缺席 = 引擎没给文字,不是「没有原因」;它是引擎原文,展示前按不可信文本处理。
10526
+ - `nothing_to_remove` ≠「这条会话不会再启动失败」:只说这条记录里没有「本版认得的拒启名 ∧ 交来的名册里没有」的条目(见包侧缺口 ⑧ ⑨ ⑫)。
10527
+ - `legacyToolNameFailureNoteOf` 返回 `undefined` = 不是这一枚码,不是「没有出路」。
10528
+ - `write_unconfirmed` 上**没有** `rev`(不知道新版本号;也绝不借读到的那个)。
10529
+
10530
+ **plan-review 注入 client**
10531
+
10532
+ - `opts` / `opts.wire` 缺席 = 旧路径:经 `engineWireTarget()` 自构造;目标没装 ⇒ `not_sent`「no engine connection is configured」(不变)。
10533
+ - `wire` 在场而 `wire.client` 不是对象 / 缺 `assistant.planReview` / 缺 `runs.get`,或 `wire` 本身是 `null` / 非对象 / 读 `client` 就抛 = 不可用 ⇒ `not_sent`,专句「the engine client supplied by the host cannot send it」,`onOutcome` 照回、不抛;**不**回落已装目标。`armPlanReviewApproval` 同形 ⇒ `false`、零帧。
10534
+ - `wire.capsBaseUrl` 缺席 = 版本证据 `unknown` ⇒ 老两选卡(即使已装目标的 baseUrl 上有 ≥7.86.0 证据也不读它)。
10535
+ - `reason` 缺席 / 非串 / 纯空白 = 键不落(体逐字节同旧);超 4096 = 截到 4096(边界不切代理对)。
10536
+ - `onOutcome` 缺席 = 只投队列口;队列口也缺席 ⇒ 照旧 error 级 MISSED。在场 ⇒ 每次放行恰一次;被闩拒 = 不回调。载荷 `status` 缺席 = 回拉与 200 体都没读到状态(此时 `effect` 必是 `unconfirmed` / `not_sent` / `not_applied` 之一)。
10537
+ - `ReopenPlanReviewOpts.wire` 缺席 ∧ `deliverDecision` 缺席 ∧ 非默认槽 = 照旧拒开(error 留痕);canonical 复用臂上 `wire` / `onOutcome` = 不生效(debug 留痕)。
10538
+ - `EngineProbeOpts.client` 缺席 = 旧路径(自构造);在场而缺动词 = 「不知道」(`undefined` / `null`),零请求;`timeoutMs` 缺席 = 3 s / 2 s 缺省(独立落定的截止)。截止到点的「不知道」与失败的「不知道」同形 —— 不是「不支持」。
10539
+ - 注入 client 的每请求时限 = 宿主构造时的 `timeoutMs`(sdk 缺省 60 s),本包改不了(108a-9 要求不低于 6 h);回拉腿另有 15 s 独立落定的截止,到点 ⇒ 状态按决断 200 体自带的措辞(载荷 `status` 取那一份;都没有 ⇒ 键不落、`unconfirmed`)。
10540
+ - 决断撞上请求时限 ⇒ `effect: 'unconfirmed'`、结局正文「was sent, but no answer came back …」:**不是**「没送出」,也不是「没生效」—— 先读任务状态。
10541
+
10542
+ **拒绝清单**
10543
+
10544
+ - `_sema_tool_input_redacted` 缺席 = 这条 `tool_input` 上没扫到替换记号 / 占位串,**或** `tool_input` 不来自流内帧(来自账本),**或**根本没有 `tool_input`。它**不**等于「这就是原值」:判据是字面记号,上游没有机读位;也不说「这就是被拒的那份入参」(KL-175)。
10545
+ - `_sema_tool_input_redacted` 在场而 `_sema_tool_input_source` 缺席 —— 不会出现(在场时来源位恒为 `'tool_start'`)。
10546
+ - `permission_denials` 里某条带标记 ⇒ 那条的 `tool_input` 是脱敏视图:渲染照常(记号本身就是给人看的),**不要**拿它重跑、比对原值或生成放行规则。
10547
+ - `_absent` 缺席 + CC 数组里有带标记的条目 = 清单**条数完整**;入参保真度逐条看标记。
10548
+
10549
+ **凭据读法 / 门**:无新键、无新导出、无新类型 —— 凭据那一件只改两网的输出字节;门那一件不读、不铸任何 wire 键。
10550
+
10551
+ ### 108c. 黑盒判据骨架
10552
+
10553
+ > 🔴 标「本版证明」的格在**上一发布版**(0.84.0)产物上必须 FAIL、在 0.84.1 上必须 PASS;标「回归约束」的格两版都 PASS;标「端侧验收」「射程延伸」的格验的是真部署或端换读之后的行为;G-F 各格在装好开发依赖的本包源码目录里跑(只改门)。请记下两次跑的产物标识(版本 + tarball shasum)。前缀:G-O = 开标签定位口、G-DT = detach 400 判定、G-N = 服务端自铸码、G-D = 派发口、G-P = 停泊审批 422、G-E = 拒启会话的出路、G-W = plan-review 注入 client、G-PD = 拒绝清单、G-K = 凭据读法、G-F = 门夹具与对账门。
10554
+
10555
+ **开标签定位口**(下文 `MARK` = `AbCdEfGhIjKlMnOpQrStUv`(22 位),`OPEN_MARK` = `<system-reminder mark="${MARK}">`(47 字符),`OPEN_BARE` = `<system-reminder>`(17 字符),`CLOSE` = `</system-reminder>`;`find` = `findSystemReminderOpenTag`)
10556
+
10557
+ - **G-O1**(本版证明,纯包层):`findSystemReminderOpenTag(OPEN_BARE)` ⇒ `{ start: 0, end: 17 }`;`findSystemReminderOpenTag('hello ' + OPEN_MARK + '\nbody\n' + CLOSE)` ⇒ `{ start: 6, end: 53 }`;`findSystemReminderOpenTag('😀中文' + OPEN_BARE).start === 4`(UTF-16 计位);无开标签 / 空串 ⇒ `null`。
10558
+ - **G-O2**(本版证明):104a-1 七种不认的形(外加 `<system-reminder >`、`<system-reminderx>`、21 位 `mark`、`mark` 值带字母表外字符)夹在正文里 ⇒ `null`;串尾截断 `'partial <system-reminder'` / `'partial <system-reminder mark="AbCdEfGhIj'` / `'partial <system-reminder mark="' + MARK + '"'` ⇒ `null`;`'<system-reminder mark="AbCdE' + OPEN_BARE` ⇒ `{ start: 28, end: 45 }`。
10559
+ - **G-O3**(本版证明):`t = OPEN_BARE + 'ab' + OPEN_MARK + 'cd'`:`find(t, 1).start === 19`、`find(t, 20) === null`、`find(t, t.length) === null`;`find(t, -1)` / `find(t, 1.5)` / `find(t, NaN)` / `find(t, t.length + 1)` / `find(t, '0')` ⇒ `null`;`find(42)` / `find(new String(OPEN_BARE))` / `find({ toString: () => OPEN_BARE })` ⇒ `null`;都不抛。
10560
+ - **G-O4**(本版证明,对拍):定种子随机串(开标签两形、截断形、非引擎近亲、闭标签、嵌套、杂字混排)上,按 108a-1 循环逐枚找出的开标签集合 ≡ 「在每个 `<` 处取到首个 `>` 的候选,`stripSystemReminderBlocks(候选 + CLOSE) === ''`」反推的集合 ≡ 换成 `unwrapSystemReminder(候选 + CLOSE) === ''` 反推的集合;108a-1 的循环拼出的正文与 `stripSystemReminderBlocks` 逐字节同。
10561
+ - **G-O5**(本版证明,线性):`find(('<system-reminder mark="' + MARK.slice(1) + '">x').repeat(n))`(不命中的近似形)与 108a-1 循环走完 `(OPEN_MARK + 'ab' + OPEN_BARE + '<c').repeat(n)` 各在 n 与 4n 两个尺寸上量三次取最快,4n 那次 250 ms 内直接算过,否则放大倍数 < 10。
10562
+ - **G-O6**(回归约束):§104 G-R2 / G-R4 / G-R6 两版同答(剥离 / 解包两口改走同一判定后行为不变)。
10563
+
10564
+ **detach 400 判定**
10565
+
10566
+ - **G-DT1**(本版证明,纯包层):`isDetachDurableOff400({ status: 400, message: 'x-detach-on-disconnect requires a durable run (a run store + sessionId) — without one the detached result would be unqueryable' }) === true`;带不带 `errorCode`、前后夹字同答。SDK 路径:假 `fetch` 对 `tasks.stream`(带 detach 头)回 400 `{ error: <上句>, errorCode: 'request.precondition_unmet' }`,抛出的那一枚 ⇒ `true`。
10567
+ - **G-DT2**(本版证明):同码另三句原文(`cascade requested but no ladder configured — …`、`deviceId is only accepted on a deployment that executes on the user's own device (REMOTE_EXEC=device) — …`、`device execution binds a device to a ROOT SESSION, so this submit needs a session — …`)各带 `status: 400, errorCode: 'request.precondition_unmet'` ⇒ `false`(经 SDK 路径同);`status` 为 500 / `'400'` / 缺席 ⇒ `false`;`undefined` / `null` / 锚句字符串本身 / `{}` / `{ status: 400 }` / `{ status: 400, message: 123 }` ⇒ `false`,不抛。
10568
+ - **G-DT3**(本版证明):未 arm 的进程(浏览器即是)里 G-DT1 的错误 ⇒ `isDetachDurableOff400` 为 `true`,`detachDurableOffHint` 仍为 `null`。
10569
+ - **G-DT4**(回归约束):`detachDurableOffHint` 在 armed / 未 arm 下对 G-DT1 / G-DT2 全部输入两版同答(出行的文字逐字节同)。
10570
+ - **G-DT5**(射程延伸,真部署):对没有 run store 的执行体提交(带 detach 头)⇒ 400,换读本口的端判 `true`(按端自己的退让策略处理);device 部署首轮没有会话的提交 ⇒ 400 同码另一句,本口判 `false`,原样上抛、不去头重发。
10571
+ - **G-DT6**(本版证明):`{ get status() { throw new Error('x') } }`、`{ status: 400, get message() { throw new Error('x') } }`、`new Proxy({}, { get() { throw new Error('x') } })`、已撤销的 Proxy ⇒ `isDetachDurableOff400` 回 `false`、不抛;已 arm 的进程里 `detachDurableOffHint` 对同四形回 `null`、不抛。判别点:0.84.0 上 `detachDurableOffHint`(已 arm)对这四形抛出(纯判定在 0.84.0 不存在)。另:计数 Proxy 包 `{ status: 400, message: <锚句原文> }` ⇒ 读序恰 `status → message`;包 `{ status: 500, message: … }` ⇒ 只读 `status`。
10572
+
10573
+ **服务端自铸码 / 派发口**
10574
+
10575
+ - **G-N1**(本版证明,纯包层;N-1):根入口 `SERVER_NOTICE_AUDIENCE` 冻结、键集恰 `instructions.source_changed` / `memory.layer_locked_legacy`、值 `user` / `operator`。判别点:0.84.0 为 `undefined`。
10576
+ - **G-N2**(本版证明;N-2):`noticeAudienceOf('instructions.source_changed') === 'user'`、`engineNoticeInCatalog('instructions.source_changed') === true`;`memory.layer_locked_legacy` 在册且 `operator`。判别点:0.84.0 答 `operator` / `false`。
10577
+ - **G-N3**(回归约束;N-2):`ENGINE_NOTICE_CODES` 与 `ENGINE_NOTICE_AUDIENCE` 不含这两枚码;`constructor` / `__proto__` / 带换行或大写变体的码 ⇒ 册外、`operator`;任一既有引擎码的受众两版同答。
10578
+ - **G-N4**(本版证明;N-3):`readInstructionsSourceChanged({ code: 'instructions.source_changed', detail: { previous: 'CLAUDE.md', current: null, sessionId: 's1' } })` ⇒ `{ previous: 'CLAUDE.md', current: null, sessionId: 's1' }`(键集恰三键)。
10579
+ - **G-N5**(本版证明;N-3 缺席):`previous` 缺席 / 空串 / 数 / 只在原型链上、`sessionId` 空串、`detail` 为数组 ⇒ `undefined`,不抛;别的码 ⇒ `undefined`。
10580
+ - **G-D1**(本版证明;D-1 / D-2):`ENGINE_NOTICE_FACT_READERS` 冻结、八个码;根入口从本模块导出的七只 `read*` 事实读器各是表里的同一只函数(`===`;`readReadRootGrantNotice` 挂 `approval.read_root_granted` / `approval.read_root_grant_rejected` 两行);每只读器只读得出它挂的那几个码的合法通告。
10581
+ - **G-D2**(本版证明;D-1):八个码各一条合法通告 ⇒ `readEngineNoticeFacts` 答 `{ code, audience, facts }`,`facts` 与直接调那只读器逐键同值,`audience === noticeAudienceOf(code)`。
10582
+ - **G-D3**(本版证明;用户面):表里受众 `user` 的码恰六个(`approval.read_root_grant_rejected` / `approval.read_root_granted` / `config.durable_gate_unavailable` / `delegation.ask_unresolvable` / `instructions.source_changed` / `mcp.injection_dropped`),`operator` 两个(`mcp.server_redialed` / `skills.listing_truncated`)。有服务端发布包时另核:六个 `user` 码都在服务端用户流白名单(`ENGINE_NOTICE_WIRE_CODES`)里、两个 `operator` 码都不在。
10583
+ - **G-D4**(回归约束形的新口格;D-1):在册无读器的码(`memory.session_polluted`)、册外码、`constructor` 作码、`null` / 串 / 数组入参、`code` 或 `detail` 取值器抛 ⇒ `undefined`,不抛。
10584
+ - **G-D5**(本版证明;读一次):`code` 取值器第一次答 `mcp.injection_dropped`、第二次答别的码 ⇒ 派发口交出的是 `mcp.injection_dropped` 的读数,`code` / `detail` 各只被读一次。
10585
+ - **G-D6**(本版证明;读目录授权两码经派发口):`readEngineNoticeFacts({ code: 'approval.read_root_granted', detail: { toolCallId: 'c1', dir: '/w/data/', root: '/w/data', sessionId: 's1' } })` ⇒ `{ code, audience: 'user', facts: { outcome: 'granted', toolCallId: 'c1', dir: '/w/data/', root: '/w/data', sessionId: 's1' } }`;`approval.read_root_grant_rejected`(`reason: 'mismatch'`)⇒ `facts.outcome === 'rejected'`、无 `dir`;granted 带 `covers: 'dir'` ⇒ `undefined`。判别点:0.84.0 无派发口。
10586
+
10587
+ **停泊审批 422**
10588
+
10589
+ - **G-P1**(本版证明,纯包层;P-1):`parkedResumeStartupFromError({ errorCode: 'parked_resume.startup_failed', taskId: 'bg-1' }, 'deny')` ⇒ `{ code, cause: 'resume_rejected', taskId: 'bg-1', resendable: false, denyStaysOpen: true }`。判别点:0.84.0 为 `undefined` 函数。
10590
+ - **G-P2**(本版证明;不猜):同码、`message` 里写着「inherits from its spawning run」的批准 ⇒ `cause: 'undetermined'`;写着「session not found」的批准同样 `undetermined`;未声明方向 ⇒ `undetermined`。
10591
+ - **G-P3**(本版证明;真 SDK 形):用 SDK 的 `toApiError(422, { error, errorCode: 'parked_resume.startup_failed', taskId })` 造出的 `ParkedResumeStartupError` 实例照读;同形的无原型普通对象照读;`errorCode` 是 `decide.revive_rejected` / `revive.startup_failed` / 大写变体 / 缺席 ⇒ `null`。
10592
+ - **G-P4**(本版证明;措辞):两句三段、互异;都含「re-fetch the pending approvals」且都说这次拒绝不说卡是否还在;`undetermined` 那一句含改正后再决、继承工具、deny、server upgrade 两条出路;`resume_rejected` 那一句不含 server upgrade;两句对 `isAlreadyResolvedGateReason` 都答 `false`。
10593
+ - **G-P5**(本版证明;判定):三种方向下 `resendable` 严格 `false`、`denyStaysOpen` 严格 `true`。
10594
+ - **G-P6**(本版证明;P-4):审批卡腿(`surfaceFsApprovalAndDecide`,假客户端的 `approvals.decide` 抛 422 本码)批准 ⇒ `failed.reason === 'decide(approve) failed: ' + String(e) + ' — ' + <undetermined 那一句>`;拒绝 ⇒ 同形带 `resume_rejected` 那一句;中断撤卡(`observeCancelByDeny`)上屏那一行 = 固定警告 + ` — ` + `resume_rejected` 那一句。判别点:0.84.0 恰为 `…failed: ` + `String(e)`。
10595
+ - **G-P7**(回归约束;P-4 缺席):别的码(`approval_stale` / `decide.revive_rejected`)与无码 422 在上述出口上失败文字逐字节同 0.84.0。
10596
+ - **G-P8**(本版证明;码优先,P-5):`bridgeAskUserQuestionGates` 驱动一只停泊提问卡,假客户端的 `approvals.decide` 抛 `{ status: 422, errorCode: 'parked_resume.startup_failed', message: 'Parked resume did not complete: parked resume failed — the approval is no longer redeemable: Session not found: <id>' }`(先自证这句对 `isAlreadyResolvedGateReason` 答 `true`);作答(批准)与空作答(拒绝)两形 ⇒ 宿主日志**没有**「gate already resolved / re-attaching」那一行,「gate not decided」那一行带对应那一句。审批卡腿同判:同一驱动口喂 `checkpointGate: { kind: 'tool_approval', toolName: 'Write' }` 的停泊、`installApprovalCardPort` 装卡口答批准 / 拒绝,决断口抛同一个 422 ⇒ 同样不重连、失败行带对应那一句。判别点:0.84.0 四形都走重连、失败行不出现(0.84.0 上实跑:四形都重连、失败行为空)。
10597
+ - **G-P9**(回归约束;P-5 射程):同一正文无码、或码为 `decide.revive_rejected` ⇒ 照旧走重连(两版同答;提问卡腿与审批卡腿同判);`isCodeClassifiedGateFailure` 对本码 / `resume_blocked_by_policy` / `corrupt` 答 `true`,对别码与缺席答 `false`;`isGateStandingErrorCode('parked_resume.startup_failed') === false`。
10598
+
10599
+ **拒启会话的出路**
10600
+
10601
+ - **G-E1**(本版证明,包 + 引擎包,不需要服务端):引擎包的内存会话规则店写 `{ toolDeny: ['Read','bash','mcp__srv__x',' foo__bar','Task(x)','foo__*','mcp__srv ','bash','Write'], toolAllow: ['Grep','grep','Read'], commandDeny: ['rm','bash','foo__bar'], allowDirs: ['/w'] }`,同一会话跑一次 ⇒ `config.legacy_tool_name`、模型零调用;以运营方身份调 `removeRefusedSessionRules(facade, sid, roster)`(`roster` = 同一台引擎一跑的 `wiring_manifest` 经 `projectToolRoster` 读出的名册)⇒ `removed`,`removed` 恰 `[toolAllow grep, toolDeny bash, toolDeny " foo__bar", toolDeny foo__*]`,记录变成 `toolDeny ['Read','mcp__srv__x','Task(x)','mcp__srv ','Write']` / `toolAllow ['Grep','Read']`,命令桶与目录桶不变,版本号 +1,恰一读一写;再跑一次 ⇒ 准备阶段通过、模型被调到。
10602
+ - **G-E2**(本版证明,老引擎形):同一店、普通调用方、记录 `{ toolDeny: ['Read','MultiEdit'], toolAllow: ['Read','grep'] }` ⇒ `loosen_forbidden`,`refused` 两条,恰一次写,记录逐字节不变,下一跑仍 `config.legacy_tool_name`;只有 `toolAllow: ['Read','bash_readonly']` ⇒ `removed`、下一跑通过。
10603
+ - **G-E3**(端侧验收,真部署;两代引擎各一次):宿主经「本会话规则」写口(或直接写会话规则记录)放进 `MultiEdit` / `foo__bar`,确认下一跑以 `config.legacy_tool_name` 失败;属主身份调撤销动词 —— 老引擎 ⇒ `loosen_forbidden`,出现「只有运营方能删」那一句,`GET` 回来的记录不变,下一跑仍失败;较新的引擎 ⇒ `removed`,下一跑正常开始。别用 `Task` / `KillShell` 造这一格(会把旧名先改写成现名的宿主上它们不中招)。
10604
+ - **G-E4**(回归约束):记录里没有会拒名(`{ toolDeny: ['Read','mcp__srv'], commandDeny: ['bash'] }` 或还没写过策略的会话)⇒ `nothing_to_remove`、零写。
10605
+ - **G-E5**(本版证明,并发与失败分类):读与写之间别人推进一次记录并加进一条 `KillShell` ⇒ 恰重读重写一次,两条会拒的都撤、对方加的别的条目留着;连撞两次 ⇒ `conflict`、恰两读两写;写后才断连 / 回执读不懂 / 回执版本号没推进 / 回执里还留着撤掉的那条 ⇒ `write_unconfirmed`,再调一次 ⇒ `nothing_to_remove`。
10606
+ - **G-E6**(本版证明,措辞):八臂句子两两互异(`roster_required` 两句互异、都含 `tool roster` 与 `in effect`);撤成那句按桶分说 —— 只撤 deny ⇒ 含 `deny list`、不含 `allow list`,只撤 allow ⇒ 含 `allow list` 与 `allows no tool`、不含 `deny rule`;`removed` 单复数(`1 entry` / `3 entries`)带版本号;`loosen_forbidden` 句含 `only an operator` 与 `unchanged`;`write_unconfirmed` 句含 `may already be in effect`;其余失败句(含名册两句)含 `nothing was changed`;任何句子都不含结局里的条目原串与 `message`。
10607
+ - **G-E7**(本版证明,启动失败出路句):`legacyToolNameFailureNoteOf('config.legacy_tool_name')` 等于 108a-6 那一句;`'config.limit_invalid'` / `'config.legacy_tool_name '` / `'CONFIG.LEGACY_TOOL_NAME'` / `undefined` ⇒ `undefined`;句子含四处位置、`"mcp__" or "a2a__"`,不含 `operator` / `administrator` / `owner`。
10608
+ - **G-E8**(回归约束,层位):会话规则记录为空、调用方策略 deny `MultiEdit` 跑一次 ⇒ 同样 `config.legacy_tool_name`;对这条会话调撤销动词 ⇒ `nothing_to_remove`(出路句因此列出四处)。
10609
+ - **G-E9**(本版证明,包 + 引擎包;名册):记录 `{ toolDeny: ['Task', 'Read', 'bash'] }`;同一台引擎挂一只叫 `Task` 的自定义工具(`spec.tools`)跑一次 ⇒ 过准备阶段(引擎认 `toolDeny: Task`),从这一跑的 `wiring_manifest` 读名册;运营方身份调撤销动词 ⇒ `removed` 恰 `[toolDeny bash]`,记录 `toolDeny` 留 `Task` / `Read`,下一跑(同样挂 `Task`)照过准备阶段。别名同判:自定义工具 `aliases: ['KillShell']` ⇒ 记录里的 `KillShell` 不撤。名册里只有小写 `task` ⇒ 记录里的 `Task` 照撤(引擎原样比)。判别点:0.84.0 无撤销动词;按静态退役名表撤的实现会把 `Task` 撤掉(deny 变 allow)。
10610
+ - **G-E10**(本版证明;名册缺席):`removeRefusedSessionRules(facade, sid, undefined)` / `null` ⇒ `roster_required` / `absent`;`'Task'` / `['Task']` / `{ count: 0 }` / `{ entries: [{ name: 'Task' }, { source: 'caller' }] }` / `{ entries: [{ name: 'X', aliases: ['KillShell', 7] }] }` / 读 `entries` 就抛 ⇒ `roster_required` / `unreadable`;全部零请求(读写计数都是 0)、不抛;`{ entries: [] }`(读得懂的空名册)⇒ 照常撤。
10611
+
10612
+ **plan-review 注入 client**(驱动形:真 sdk `new AgentClient({ baseUrl, authToken: { mode: 'same-origin-relay' }, fetch })` + node:http 假引擎;已装目标另指一只只答 404 的假引擎 B)
10613
+
10614
+ - **G-W1**(本版证明):`decidePlanReview('t', 'approve', undefined, { wire: { client } })` ⇒ POST 打到 client 那台引擎、B 零命中、结局与目标形逐字节同(仍锁 / 推进 / 离开 / 回拉 500 / 404 `not_found.plan_review` / 409 折叠码 / 500 corrupt+where / `default` 撞 conflict 去键重发 / `acceptEdits` 撞 conflict 不重发 / 本地拒发)。旧版:第四参被忽略 ⇒ 决断打到 B(404)。
10615
+ - **G-W2**(本版证明):`armPlanReviewApproval(park, undefined, { submittedInPlanMode: true, wire: { client, capsBaseUrl: K } })` 且 `K` 上版本 7.86.0 ⇒ 三选卡;答 auto ⇒ client 收到 `{ decision: 'approve', permissionModeAfter: 'acceptEdits' }`;不给 `capsBaseUrl`(B 上有 7.86.0)⇒ 老两选。
10616
+ - **G-W3**(本版证明):中继形 client 的每一发(POST + 回拉 GET)无 `authorization` 头;`{ wire: { client: {} } }` ⇒ 零请求、结局含「could NOT be sent」与「client supplied by the host」。
10617
+ - **G-W4**(本版证明):`{ reason: 'needs more tests' }` ⇒ 体 `{"decision":"reject","reason":"needs more tests"}`;`' '` / `42` ⇒ `{"decision":"reject"}`;4097 字 ⇒ 4096。
10618
+ - **G-W5**(本版证明):`{ onOutcome }` ⇒ 恰一次,键集 `decision,detail,dispatchNo,effect,prompt,status,tail,taskId`(状态读不到时无 `status`),`prompt` === 队列项 `value`;卸掉队列口 ⇒ 仍回调、无 error 级 MISSED;同任务并发第二次 ⇒ 不回调。
10619
+ - **G-W6**(本版证明):`reopenPlanReviewCard('t', { sessionKey: 'K9', wire: { client } })`(K9 有 overlay)⇒ `reopened: true`;作答 ⇒ POST 经注入 client。旧版:`reopened: false` + error 留痕。
10620
+ - **G-W7**(本版证明):`engineSupportsTaskAgents('http://ignored.invalid', { client })` ⇒ 打到 client 那台引擎、无 `authorization`;永不落定的 client + `timeoutMs: 60` ⇒ 约 60 ms 内 `undefined`;读口答 429 + `Retry-After: 60` 的真 sdk 中继 client(缺省读重试)+ `timeoutMs: 150` ⇒ 约 150 ms 内 `undefined`,那一发请求的取消信号已触发;`probeScenarioTools` 同两形 ⇒ `null`。
10621
+ - **G-W8**(回归约束):三口不带新位 ⇒ 体 / 结局(决断撞上请求时限那一臂除外,见 G-W10)/ 队列项键集 / 闩 / 序号 / 重开判决同 0.84.0(`run-plan-review-decide-verify-test.mjs` / `run-plan-review-dismissal-test.mjs` 全绿)。
10622
+ - **G-W9**(端侧验收;射程:网页端,中继部署,服务端 ≥7.86.0):中继 client 按 108a-9 构造(`timeoutMs` ≥ 6 h、`maxRetries: 0`);plan 模式提交 → 卡上批准(auto)→ 引擎收到带 `permissionModeAfter` 的体 → 续跑超过一分钟的批准回执仍按 `took_effect` 渲;拒绝 + 反馈 ⇒ 引擎收到 `reason`;同一卡双击 ⇒ 恰一条 POST。
10623
+ - **G-W10**(本版证明,真 sdk + 缩放计时器):假引擎对决断 POST 延迟 400 ms 答 200、回拉答 `completed`。① 已装目标形与注入形(中继 client `timeoutMs: 5000`,缩放的 6 h)⇒ 都 `took_effect`、结局逐字节同;② 注入 client `timeoutMs: 80`(缩放的 60 s)⇒ `unconfirmed`,结局正文含「was sent, but no answer came back from the engine within the time limit」与「may have taken effect」、不含「could not reach the engine」;③ 已装目标形的出站 `fetch` 以 `DOMException('…', 'TimeoutError')` 落定(sdk 每请求时限到点的同形)⇒ 结局与 ② 逐字节同;④ 连接被拒(中继 client 指向无人监听的端口)⇒ 仍「could not reach the engine」。判别点:0.84.0 上 ②③ 都是「could not reach the engine: TimeoutError: …」。
10624
+ - **G-W11**(本版证明,真 sdk):假引擎决断答 200 `{ status: 'completed' }`、回拉答 429 + `Retry-After: 60`;注入中继 client(缺省读重试)⇒ 回拉在本包截止处落定(门里把 15 s 截止缩放到 120 ms,sdk 的 60 s 退避不缩放),结局 `took_effect`、`status: 'completed'`(取 200 体)、`decidePlanReview` 在截止附近落定。判别点:0.84.0 无注入形;只中止不落定的实现会被拖到 sdk 睡醒(约 60 s)。
10625
+ - **G-W12**(本版证明):`decidePlanReview('t', 'approve', undefined, { wire: null, onOutcome })`、`wire` 为串 / 数、`wire` 读 `client` 就抛 ⇒ 不抛、`onOutcome` 恰一次且 `effect: 'not_sent'`、结局含「could NOT be sent」、零请求;`void decidePlanReview('t', 'reject', undefined, { wire: null })` 不留未处理的拒绝。
10626
+
10627
+ **拒绝清单**
10628
+
10629
+ - **G-PD1**(本版证明,纯包层;PD-1 / PD-2 / PD-3 / PD-4):`terminalToSdkResult({ type: 'done', result: { status: 'completed', result: 'ok', stats: { humanReview: { count: 1, totalWaitMs: 0, gates: [{ kind: 'human', waitMs: 0, decision: 'deny', toolName: 'Bash', toolArg: 'curl …', toolCallId: 'c1' }] } } } }, ctx, { toolInputByCallId: new Map([['c1', input]]) })`,`input = { command: 'curl -H «redacted:key» x' }` ⇒ `permission_denials.length === 1`,`permission_denials[0].tool_input === input`(同一个引用),`permission_denials[0]._sema_tool_input_redacted === true`、`_sema_tool_input_source === 'tool_start'`,`_sema_permission_denials[0]` 同值,`_sema_permission_denials_absent` 不在场。五形各一格:顶层记号 / 嵌套残片记号 `«redacted:key:partial»` / 裸记号 `«redacted»` / 叶值恰为 `[circular]` / 叶值恰为 `[depth-limit]`。判别点:0.84.0 上 `permission_denials` 为 `[]`、`_absent: true`、sema 条目无 `tool_input`。
10630
+ - **G-PD2**(回归约束;present-iff):同上但入参 `{ command: 'rm -rf /tmp/x' }` ⇒ 进 CC 数组、两载体都**没有** `_sema_tool_input_redacted` 键;入参 `{ note: 'see [circular] refs' }`(占位串只在正文里)⇒ 同样无标记。
10631
+ - **G-PD3**(本版证明;混合):两条拒绝,一条入参干净、一条带记号 ⇒ CC 数组两条(只有带记号那条有标记)、sema 载体两条、`_absent` 不在场。判别点:0.84.0 为 CC 一条、`_absent: true`。
10632
+ - **G-PD4**(本版证明,端到端;公开入口):`runStream` 喂 `tool_start{ toolCallId: 'c1', args: X }`(X 带记号)→ `tool_end{ isError: true }` → `done`(账本一条 deny,`toolCallId: 'c1'`)⇒ 结果帧 `permission_denials[0].tool_input` 与同一条输出流里 assistant 消息 `tool_use`(`id === 'c1'`)块的 `input` **是同一个对象**、带标记、`_absent` 不在场。另一形:账本为空数组、同一条流里那次调用的 `tool_end` 带门记录 `{ disposition: { kind: 'denied', deniedBy: 'policy' } }`(流内补行)⇒ 同答。真部署形(可选,射程:终端 `-p`、服务端对凭据形 URL 做转发前脱敏):让模型执行一条入参含 `https://user:token@host/…` 的命令并被拒 ⇒ `-p --output-format json` 的结果帧 `permission_denials` 含这一条且带标记;0.84.0 上这一条缺、`_sema_permission_denials_absent: true`。
10633
+ - **G-PD5**(回归约束;没有对象的几类):行无 `toolCallId`、`toolInputByCallId` 里只有别的 id、入参为串 / 数组 / `null`、入参 `{ xs: <30000 个数>, command: '«redacted» x' }`(被动过 ∧ 超节点预算,两种键序)、`{ deep: <101 层嵌套>, self: '[circular]' }`(被动过 ∧ 超深度)⇒ CC 数组空、sema 条目无 `tool_input` 且无标记、`_absent: true`。流内补行没见过 `tool_start` ⇒ 同答。
10634
+ - **G-PD6**(回归约束;账本优先):账本行自带 `toolInput`、流内那份带记号 ⇒ `tool_input` 是账本那份、无来源位、无标记。
10635
+
10636
+ **凭据读法**
10637
+
10638
+ - **G-K1**(本版证明,纯包层;K-1):输入 `Authorization: Bearer` + U+D800 + `https://secret.example/x`。机读口、`displayUntrusted` 默认形、`{ foldLines: false, keepLayout: true, mark: 'dot' }`、`{ foldLines: false, mark: 'dot' }`、`{ foldLines: false, mark: 'escape' }` 五种输出都不含 `secret.example`、都含 `«redacted:`。同一位置换成 U+200B 同答。判别点:0.84.0 上默认形与转义形露出 `secret.example`。
10639
+ - **G-K2**(本版证明;K-1 字节):`Bearer ` + U+D800 + `https://secret.example/x` 经 `{ foldLines: false, mark: 'escape' }` = `Bearer \uD800https://«redacted:secret»`(`\uD800` 是六个可见字符);机读口 = `Bearer ` + U+D800 + `https://«redacted:secret»`。
10640
+ - **G-K3**(本版证明;K-2):`user:<口令>@` + ESC + U+D800 —— 默认形 = `«redacted:userinfo»@\u001B\uD800`;机读口 = `«redacted:userinfo»@` + ESC + U+D800;`user:<口令>@` + U+200B + `:5432` 与 `db user:<口令>@` + U+D800 + ` is down` 同样遮住口令。判别点:0.84.0 默认形原样露出口令。
10641
+ - **G-K4**(回归约束):`Bearer https://docs.example.com/x`、`api_key: ` + ESC `[33m` + `https://console.example.com/keys` + ESC `[0m`、`mail a.b@` + U+200B + `example.com` 机读口逐字节不变。
10642
+ - **G-K5**(回归约束):`token=u:<口令>@` + ESC `[0m` + `/<值>` 整只值换记号(`token=«redacted:secret»` 一类),`<值>` 不露。
10643
+ - **G-K6**(回归约束,对 0.84.0 逐字节;K-2 让位):机读口 —— `password: "user:<口令>@` + U+200B + `/ <尾>"` ⇒ `password: "«redacted:secret»"`;`to` + U+00AD + `ken=u:<口令>@` + U+200B + `/<尾>` ⇒ `to` + U+00AD + `ken=«redacted:secret»`;`Bea` + U+200B + `rer u:<口令>@` + U+200B + `/<尾>` ⇒ `Bea` + U+200B + `rer «redacted:secret»`。十二种出口(机读口、`displayUntrusted` 默认 / 正文 / 单行 / 字段 / 空格 / 字符面全关 / 反斜杠成对 / blanks 三形、标记读口)都不含 `<口令>` 与 `<尾>`。
10644
+ - **G-K7**(本版证明;K-2 射程):`token=abc user:<口令>@` + U+200B + ` is down` 机读口 ⇒ `token=«redacted:secret» «redacted:userinfo»@` + U+200B + ` is down`(标签的值是 `abc`,候选不挂在标签上 ⇒ 照认 userinfo)。判别点:0.84.0 上 `<口令>` 原样。
10645
+
10646
+ **门夹具与对账门**(源码目录自跑)
10647
+
10648
+ - **G-F1**:在装好开发依赖的本包源码目录里跑六套被换形的门,各自全绿且检查数与本版发布帖所列一致;对任一套把换进来的终态词改成表外词(`failed` → `failedX` 一类),套必须红或 exit 9(权限拒绝投影那一套例外,理由见 CHANGELOG Gates 段:改做「被挡 → 成功」换词)。
10649
+ - **G-F2**:对 `scripts/` 逐文件 grep 扁平帧(`status:` 与 `type: 'done'` 同帧、无 `terminal`),每一处要么带 `// 409:` / `// 回放面:` 注,要么落在 CHANGELOG Known limits 所列的九套里。
10650
+ - **G-F3**:跑 `node scripts/run-fixture-flat-done-ratchet-test.mjs` ⇒ 绿、未注位点 = 上限;在任一门里新写一只扁平 `done` 帧(字面量,或经 `const X = {status:…}` 再喂)不加注 ⇒ 红且点名文件与行;加一行 `// 回放面: <理由>` ⇒ 回绿;把 `scripts/registry.json` 的 `ratchets.fixtureFlatDone.unmarkedCeiling` 改小 1 ⇒ 红。
10651
+ - **G-F4**:跑 `node scripts/run-authority-envelope-mirror-test.mjs` ⇒ 绿;在开发依赖引擎包的信封登记表里把任一 `framing` 行改判 `authority` ⇒ 红且点名那个标签;在本包镜像里删一个标签 ⇒ 红(且 `run-peer-frame-projection-test.mjs` 对同一删改保持绿 —— 那一套只钉两只代表标签,这正是本门补的缺口)。
10652
+
10653
+ - 包层行为钉在门 `run-system-reminder-open-tag-test.mjs`、`run-detach-durable-off-verdict-test.mjs`、`run-engine-notice-catalog-test.mjs`(I / IX / J 段)、`run-parked-resume-startup-test.mjs`(U0–U7)、`run-session-policy-refused-removal-test.mjs`、`run-plan-review-injected-wire-test.mjs`(W1–W14)、`run-permission-denial-projection-test.mjs`(F1e / F5 / F5a–F5a3 / F5b / F5g–F5j / F6b / F10b / L4 / L4b)、`run-display-untrusted-projection-test.mjs`(X41–X49)、`run-fixture-flat-done-ratchet-test.mjs`、`run-authority-envelope-mirror-test.mjs`。
10654
+
10655
+ ### 108d. 端上要动的读点
10656
+
10657
+ 坐标与普查来自本机克隆的只读检索(终端 09-25 / 09-27、网页端 09-27、桌面端 08-13、管理台 09-27;行号会漂),以各端现状为准。终端与管理台的坐标省去开头的 `src/`;网页端坐标从仓根起(`ui/`)。
10658
+
10659
+ **终端**
10660
+
10661
+ - O-1(建议):`utils/transcriptSearch.ts:136-141` 的循环(找开标签 → 删到闭标签 → 从串头重找)在块多时平方,删块后两侧字节可能拼出新开标签 —— 那一处要的是整块剥,换读 `stripSystemReminderBlocks`;`utils/systemReminderTag.ts` 的 `findSystemReminderOpen`(宽属性文法)随之可删。同文件的整块形(`utils/queryHelpers.ts` 消费)与整条去标(`components/messages/UserToolResultMessage/UserToolErrorMessage.tsx:39`)见 §104 R-1(`stripSystemReminderBlocks` / `unwrapSystemReminder`)。换读前按 104a-1 核负样本:本包只认引擎两形,带任意属性的开标签不再当信封剥。
10662
+ - DT-1:`-p` 车道(`sema/seamQueryEngine.ts:2007`)继续用 `detachDurableOffHint`,零改动。
10663
+ - D-1:通告转录面里逐码分派那一段(`mcp.injection_dropped` / `mcp.server_redialed` / `skills.listing_truncated` 各自调读器的几处)整段换读 `readEngineNoticeFacts`,按 `f.code` 分支(读目录授权两码也在派发表里,换读后同一口即得它们的 typed 读数,`facts.outcome` 再判);删壳里逐码调读器的分派。册外兜底分流保留在壳(在册无读数 ⇒ 册内通用行渲 `message`;册外 ⇒ 只落调试)——判「在册」继续读 `engineNoticeInCatalog`,它这一版多认两枚码。
10664
+ - D-1(机读车道):通告帧的 `detail` 仍不上帧;有 typed 读数的码按 `_sema_` 前缀键把 `readEngineNoticeFacts` 的读数上帧(只在 `audience === 'user'` 的读数上帧即与用户流同口径;运维面读数要不要上机读车道由壳定)。
10665
+ - N-2:按受众分发的那一处零改动;`instructions.source_changed` 从这一版起走用户面。若壳为它写过运维面专属行,那一行跟着挪。
10666
+ - P-1 – P-3:决断出站代理上与既有 `say*` 同闸口,加一只:`parkedResumeStartupFromError(e, verb)`(`verb` 就是那一发的批准 / 拒绝)→ 命中说 `parkedResumeStartupContent(detail)`;决断重试那一处对本码不自动重发(读 `resendable`);卡上 deny 保留(读 `denyStaysOpen`)。壳侧处置表里这一格由 declined 改读包口。
10667
+ - P-5:自有「门已决」判据链(按失败文字扫词的那一只)在扫词之前问 `isCodeClassifiedGateFailure(errorCode)`,命中即不判「门已决」;失败文字被拍平、读不到机读码的那条路,SDK 错误类名 `ParkedResumeStartupError` 在拍平串里,可按类名兜底。
10668
+ - 🔴 E-3 / E-5:`sema/legacyToolNameFailureCopy.ts:18` 自带码常量、`:21-25` 终帧谓词按结果帧的 **`errorCode`** 键读码;本包 0.83.0 起结果帧上这一位叫 **`_sema_error_code`**(旧键不再铸)⇒ 换钉 `^0.83.x` 之后这只谓词静默不再命中,出路句不再出现。换成 `legacyToolNameFailureNoteOf(frame._sema_error_code)`(句子也换成本包那一句,壳那一句「`/clear`」的建议可以接在后面作为宿主自己的回落路),常量换成 `CONFIG_LEGACY_TOOL_NAME`。接线点 `sema/upstreamBridge.ts:3314` / `:3329` / `:3527` / `:3633` 不变。
10669
+ - E-1 / E-2 / E-4:「本会话规则」删除动作(删一条 deny 时,若这条名字在本会话的会话规则记录里,同一拍经本包撤掉)与会话规则可见段(坏行旁「从本会话移除」)接 `removeRefusedSessionRules` + `sessionPolicyRemovalNotice`;🔴 `roster` 取这条会话最近一次收到的装配清单(`wiring_manifest` 帧)经 `projectToolRoster` 读出的名册 —— 启动失败的那一跑不发这一帧;手里没有就照传 `undefined`,动词答 `roster_required`,说那一句即可;标坏行用 `isEngineRefusedToolName`,不要自己判;读记录用 `readSessionPolicy`。🔴 撤销动词撤的是**这条会话里所有**会拒的条目,不是「用户点的那一条」:可见段上一键撤全部即可,单条入口的话要把这件事说清。出路句按结局改口,不按能力位、不按版本猜:老引擎上撤销动词自己会答 `loosen_forbidden`。
10670
+ - W-1 – W-7:零改动 —— `runStream.ts:469` arm 三参、`planReviewReopen.ts:82` 两参 decide、`:157-160` reopen 带 `deliverDecision` 全部旧签名,逐字节同答;`onOutcome` 可选不接(队列口在)。
10671
+ - PD-1 / PD-3:`-p` 车道「这条 run 真的拒过」的判定(print 车道审批通道告知那一处:CC 数组非空 ⇒ 拒了,否则判别位在场时读超集载体)零改动,结论不变 —— 这一类此前经超集载体判「拒了」,现在经 CC 数组判「拒了」。
10672
+ - PD-1:`-p` 结果帧的整帧过境(结果帧投影那一处 `{ ...msg }`)零改动即把新条目与新位原样交给 stdout;本版不要改成逐键挑。
10673
+ - PD-2:终端今天没有拿 `tool_input` 重跑 / 生成放行规则的读点;将来有 ⇒ 先读标记。壳侧结果帧的对象校验(三键 `z.object`,缺省剔未知键)不受影响。壳侧自合成终帧(会话归档 / 开机窗尾帧 / headless 尾帧 / producer 异常帧 / 载入失败帧)的 `permission_denials: []` + `_absent: true` 与本件无关(壳手里没有拒绝账本),照旧。壳侧消费清单:新键 `_sema_permission_denials[]._sema_tool_input_redacted` 登一行(consumed / declined 由壳定)。
10674
+ - K-1 / K-2:呈现走自带的出口(未读本包 `displayUntrusted`),本版射程外;经本包适配层的合成终局行 / 结果帧 `errors[]` 升级即净,零改动。
10675
+
10676
+ **网页端**
10677
+
10678
+ - 🔴 W-1 – W-6(到货删端侧重建的 plan-review 编排;对表网页端自列的五件清单):
10679
+ 1. `ui/lib/engine/engine-decision-verbs.ts` —— `respondToPlan`(:694-840)整段本地编排删:投递闩 `planReviewDecideInFlight`(:105-109)、CC-46 双闸(:721-731)、`bodyOf` 与 `field_conflict` 去键重发(:733-760)、`preCheckpointPromise` / 回拉 / `classifyPlanReviewEffect`(:157 起,:790-812)、人话回执(:820-840)。改为一调:`decidePlanReview(taskId, decisionWord, permissionModeAfter, { wire: { client: ctx.client, capsBaseUrl: ctx.approvalDecisionNoteBaseUrl }, reason, onOutcome })` —— `reason` 取今天 `bodyOf` 的同一值(reject ⇒ `"rejected by user"`、revise ⇒ `decision.feedback`),`onOutcome` 里按 `outcome.effect` 渲今天 `humanTitle` 那四句(`took_effect` 静默),`registration.release()` 挪到 `onOutcome` 或 `await decidePlanReview` 之后。⚠️ 两处语义差:① 包的闩把在飞中的重复决断**丢弃**(error 级留痕,不回调),不再「共享首发 promise」—— `useHitlDecisions.ts:50-70` 的 `decidePlan` 靠 `respondToPlan` 落定撤重试卡,改靠首发那一次的落定即可;② `submittedInPlanMode` 的供给仍是 `ctx.planModeTaskIds`,但**摘除**改在 `onOutcome` 里按 `effect === 'took_effect'` 做(今天 :801-803 的判据不变)。头注(:58-103)「为什么不直接调包」三条理由本版全部消失,同批删;`tests/run-plan-review-wire-test.mjs` 五臂改成真包驱动(①②③④ 由本包门 W1–W7 覆盖,⑤「POST 抛错原样上抛」在包内是 `not_applied` / `unconfirmed` 结局而不是 throw —— 判据改口)。
10680
+ 2. `ui/lib/engine/engine-self-heal.ts` —— `reopenViaParkSurface("needs_review", …)`(:148-200)与 `reopenPlanReview:` 供给(:230)改接包 `reopenPlanReviewCard(taskId, { trigger, wire: { client: deps.client }, sessionKey: deps.uiSessionId, onOutcome, presentationReceiptMs })`,并用 `onQuestionFrameFor(deps.uiSessionId, …)` 收卡帧 → 渲成今天的 `composer/surface` 卡 → 作答经 `respondToQuestion(questionId, { answers: [{ selected: [label] }] })` 回包(标签取 `planReviewCardOptions` / `PLAN_REVIEW_*_LABEL` 单源);呈现回执经 `registerArmedGateFromQuestionId`。头注(:27-58)「trigger 结构性传不到 / dismissedByUser 永不产出」三条同批撤;`clearPlanReviewUserDismissals(uiSessionId)` 挂 invalidateSession / dispose。
10681
+ 3. `SessionTurnRequest` 补「提交出身」位喂 `trigger`(用户 / 注入)—— 网页端自列第 ③ 件,包侧无改动。
10682
+ 4. `tests/run-self-heal-disposition-test.mjs` 改真包驱动 —— 网页端自列第 ④ 件。
10683
+ 5. 🔴 中继 client 的 `timeoutMs`:决断 POST 同步驱动到终态可能分钟级 —— 给 plan-review 连线一只专用中继 client,`timeoutMs` ≥ 6 h、`maxRetries: 0`(108a-9);`relay-client.ts` 那只若沿用 sdk 缺省 60 s,续跑超过一分钟的批准会落 `unconfirmed`「已送出、时限内没有答复」(回执「submitted, but we couldn't confirm」)。
10684
+ - DT-1(建议):`ui/lib/engine/engine-session-transport.ts:325` 的提交恒带 detach 头,未见对这一枚 400 的处置 —— 连到没有耐久账本的执行体时整轮失败。要退让(去头重发一次并告知「断连会中止本轮」)时用本口判,不按码。
10685
+ - O-1:只调剥离口,零改动。
10686
+ - N-2 / D-1:今天零通告读点(本版普查:主干全树 `engine_notice` / `noticeAudienceOf` 零命中)。接用户通知面时:在册判据读 `engineNoticeInCatalog`,受众读 `noticeAudienceOf`,typed 读数读 `readEngineNoticeFacts` 且只渲 `audience === 'user'` 的。
10687
+ - P-1 – P-3:审批决断失败面(若自己调决断口)按同一只读口与措辞,不自铸。
10688
+ - E-*:未见会话规则写口,也未见按终局码补句的读点;零改动。将来接时直接用这几只口。
10689
+ - PD-*:今天零读点(`permission_denials` / `_sema_permission_denials` 主干全树零命中)。接结果帧拒绝面时:两键合读,条目按 `_sema_tool_input_redacted` 标「入参已脱敏」。
10690
+ - K-*:零直接读点;经适配层的机读口升级即净。
10691
+
10692
+ **桌面端**
10693
+
10694
+ - DT-1:`main/session-host.ts:1469` 恒带 detach 头;自带引擎恒有耐久账本,零改动。连外部引擎时同网页端。
10695
+ - W-*:零读点(`session-host.ts` 自有 client 直发 `{decision}` / `{decision, reason}`)。
10696
+ - N / D / P / PD:冻结期内零改动(零读点);解冻配对时同网页端。E / O:零改动。K:钉的版本早于呈前出口,不在射程。
10697
+
10698
+ **管理台**
10699
+
10700
+ - 🔴 DT-1(必改):`lib/chat/transport/engine-transport.ts:767` 的本地 `isDetachDurableOff400` 与本口同名同义(只认锚句、不认码)—— 删掉,改从本包导入(调用点 `:1675` 不动)。本包同名影子对账门对这一处登记了过渡豁免,到 0.85.0 为止。
10701
+ - O-1(建议):`components/chat/stream-core.ts:466` 的 `openTagOf` 里 `system-reminder` 一臂(「候选 + 闭标签问剥离口删不删净」的派生判定)换读 `findSystemReminderOpenTag`;`splitHarnessBlocks` 的截断块处置(余下全文归块)是端的呈现决定,照旧。
10702
+ - K-1 / K-2:三种载体经公面出口,零改动即净。提货测试里钉现状的三载体断言与零宽空格对照一条会按预期变红 → 翻面为「不含值、含记号」([8562])。
10703
+ - E-3(可选,非必改):`components/chat/chat-page.tsx:1691` 失败卡按 `errorCodeWording(stream.state.errorCode)` 取词,码为 `config.legacy_tool_name` 时可再补 `legacyToolNameFailureNoteOf(stream.state.errorCode)` 那一句(管理台自己不写会话规则,但会碰到被别的端写坏的会话)。
10704
+ - N-2 / D-1:运维面(若接通告)按受众分发读 `noticeAudienceOf`;`memory.layer_locked_legacy` 只出现在服务端运维日志,不上会话流。
10705
+ - W-* / PD-*:零读点;零改动。
10706
+
10707
+ **验收方**
10708
+
10709
+ - 按 108c 各格;按 108a′ 作废 / 改读换锚(已 arm 时 `detachDurableOffHint` 对抛错对象会抛 / `instructions.source_changed` 是运维面或册外 / 422 本码会重连一轮 / `CONFIG_REFUSAL_CODES` 恰七员 / §66 G2 / G3 / 按 0.83.4 原样凭据字节写的格)。§104 G-R 系照旧。`run-plan-review-injected-wire-test.mjs` 的 W1 矩阵可作对拍夹具。
10710
+
10711
+ ### 108y. 🔴 三端升级必读(固定段式)
10712
+
10713
+ 1. **换钉 `^0.84.1` 之前**:零前置编译改动(纯增:十五个运行期导出、十八个具名型与若干可选位;`readReadRootGrantNotice` 入参型放宽为 `unknown`、`SemaPermissionDenial` 多一个可选成员,对调用方都非破坏)。peer sdk 地板 `>=12.0.1` 不动。可观察变化(按旧行为断言过的测试改锚,见 108a′):① `detachDurableOffHint` 对读属性会抛错的错误对象改回 `null`(此前已 arm 时抛);② `noticeAudienceOf('instructions.source_changed')` 从 `operator` 变 `user`、`engineNoticeInCatalog` 对两枚服务端自铸码从 `false` 变 `true` —— 按受众 / 在册分发的端不改代码即跟着走;③ 包内四个决断出口在 422 `parked_resume.startup_failed` 上的失败文字多一句(别的码逐字节不变),包内停泊审批腿撞这枚码时不再重连一轮;④ `CONFIG_REFUSAL_CODES` 七员 → 八员(按 `.has` 判的零改动);⑤ 入参被传输层脱敏过的拒绝从此出现在 CC 形 `permission_denials` 里(带 `_sema_tool_input_redacted: true`,`tool_input` 字符串里可见 `«redacted…»` 记号),清单里只有这一类不完整时 `_sema_permission_denials_absent` 不再落下;⑥ 凭据两网在「值左邻是不可见单字」与「空主机 userinfo」两形上的输出字节变(值不露、含 `«redacted:`;`scheme://` 与那枚单字留在记号外)—— 断言按「不含值 ∧ 含 `«redacted:`」写,不按 0.83.4 原样字节写。⑦ `decidePlanReview` 决断撞上请求时限那一臂的结局正文从「could not reach the engine」改为「was sent, but no answer came back … within the time limit」(两条路同一句,`effect` 仍 `unconfirmed`);注入 client 要 `timeoutMs` ≥ 6 h、建议 `maxRetries: 0`(108a-9)。管理台:本地同名的 detach 判定与本包新导出同名 —— 换钉后删掉本地那份、改从本包导入(本包侧对这一处的过渡登记到 0.85.0 为止)。
10714
+ 2. **逐面**:
10715
+ - **终端**:通告逐码分派换读派发口;决断代理加一只 422 读口,按判定不重发同一决定;自有「门已决」判据链扫词前问 `isCodeClassifiedGateFailure`;🔴 终帧出路句的码要从 `_sema_error_code` 读(换钉 ≥0.83.0 即生效),建议换调 `legacyToolNameFailureNoteOf`;「本会话规则」删除动作 / 可见段接撤销动词(非必改;要交最近一份装配清单读出的名册);转录搜索那一处换读 `stripSystemReminderBlocks`;凡把拒绝清单 `tool_input` 当原值用的读点先读标记(今天没有);plan-review / detach / 凭据零改动。
10716
+ - **网页端**:🔴 删端侧重建的 plan-review 编排,改一调 `decidePlanReview(…, { wire, reason, onOutcome })` 与 `reopenPlanReviewCard(…, { trigger, wire, sessionKey, onOutcome })`(108d),连线用的中继 client `timeoutMs` ≥ 6 h、`maxRetries: 0`;提交恒带 detach 头而未处置 durable-off 400,要退让时用 `isDetachDurableOff400`;接通知面时按受众读包口;其余零改动。
10717
+ - **桌面端**:冻结期零改动(连外部引擎时 detach 同网页端)。
10718
+ - **管理台**:🔴 删本地 detach 判定改导入;回放拆分换读 `findSystemReminderOpenTag`、删派生判定;凭据提货格翻面为「不含值、含记号」;失败卡可选补出路句;接通告时按受众读包口。
10719
+ 3. **成文改口**:见 108a′(作废 / 改读 / 新增 / 不变);已发段(§66、§104、§106 与 0.73.4 的 CHANGELOG 段)不回改,以本段为准。
10720
+
10721
+ **包侧缺口:** 开标签定位口 —— ① 文法常量本身仍不上公面:定位口回位置,不回正则源码 · ② 定位口与块上下文无关:截断块归块还是归正文、块内字面开标签怎么跳过,由端的切块循环决定(108a-1 给了与剥离口同答的写法);detach —— ③ `isDetachDurableOff400` 只认锚句:那条拒绝的原文改了,本口答 `false`(不退让、原 400 照常交给宿主),在这条拒绝配上专码之前没有更稳的判据(KL-176)· ④ 本包没有能力面 `sessionBackgroundable` 的读口,不提供「提交前预检这台执行体有没有耐久账本」的谓词(那一位为假时带头必然 400;为真时仍可能因为没有会话而 400);通告与决断 —— ⑤ 422 两种成因回体上分不开:批准一侧只能说「分不出」那一句,候服务端带出机读成因位(KL-177)· ⑥ 端侧「门已决」判据链读不到机读码(失败文字被拍平)的路径上,码优先落不下去,只能按 SDK 错误类名兜底(KL-178)· ⑦ 服务端自铸码表的对账腿要指向服务端发布包才跑,日常跑只有定值判据(KL-179);拒启会话 —— ⑧ 撤销动词按宿主交来的**一份**工具名册判:启动失败的那一跑交不出名册,名册取自同一部署上的另一跑;两跑挂的工具不同(子代腿、按场景卸载)时按交来的那一份判;判据本体 `isEngineRefusedToolName` 本身仍不看名册(KL-182)· ⑨ 退役名表是本包构建时对过账的一份:引擎扩表后新加的名字在本包跟进前撤不掉(撤销动词答 `nothing_to_remove`,句子已带这一射程)(KL-183)· ⑩ 老引擎上一份记录同时在 `toolDeny` 与 `toolAllow` 里有坏行时,整份写被判放宽而拒,白名单那几条也一起没撤(一份写只会一起成或一起败;单撤白名单也救不回这条会话)(KL-184)· ⑪ 写口直接拒收这两类名字(服务端 400 `rules.legacy_tool_name`)的写失败分类未做:服务端尚未铸这枚码;到货前这类 400 落在收紧结局的 `request_rejected`(「改了条目再发」)(KL-185)· ⑫ 出路句说不出是哪一层、也不点名:引擎的拒因只有码与散文,本包不读散文(KL-186);plan-review 注入 client —— ⑬ 子代族动词(tail / steer / output / compact ×2 / task handle ×2 / delegated prompt / resume)在中继部署下仍只吃已装目标(§7 P-28 余半场;候「共用构造点收编 + 注入」)· ⑭ 注入形的决断腿时限 = 宿主 client 的 `timeoutMs`(sdk 缺省 60 s),本包改不了(sdk 无逐请求时限 / 重试开关);短于 6 h ⇒ 分钟级续跑落 `unconfirmed`「已送出、时限内没有答复」;注入 client 的读重试在截止落定之后仍可能再睡一轮(至多 60 s)才收手 —— `timeoutMs` ≥ 6 h、`maxRetries: 0` 即无这两形(KL-191)· ⑮ `armPlanReviewApproval` 非默认槽仍拒(卡台账默认槽单会话形,既有)· ⑯ 注入形下宿主 client 抛出的(非时限)错误文本由本包原样转述进「could not reach the engine」结局(既有行为;那是宿主自己的错误面,本包不洗)· ⑰ 包的投递闩对在飞中的重复决断是丢弃(error 留痕、不回调),不是「共享首发 promise」—— 网页端换调后要靠首发那一次落定;拒绝清单 —— ⑱ 「入参被传输层动过」按字面记号认,上游没有记录级机读「已脱敏」位;入参本来就含记号字面的调用会被多盖标记(KL-11)· ⑲ 拒绝清单上的 `tool_input` 取自 `tool_start`,先于 hook / 策略在判定前的改写,不等于被拒的最终入参;上游在被拒调用的收口帧上带出最终入参之前,本包说不出被拒的是哪一份(KL-175)· ⑳ 没有入参对象的几类(重连后的流、没见过 `tool_start`、超预算等)仍只在超集载体上,只读 CC 形清单的消费方在这几类上仍会少数(KL-12 等,不变);凭据读法 —— ㉑ 地址形的值左邻只有完整转义序列(着色等)、没有不可见单字时照旧按地址豁免,与真空白同答(KL-180)· ㉒ 不可见单字不紧贴值(`Bearer ` + 单字 + 空格 + 地址)时照旧豁免:屏上地址前有真空白,是独立的一只 · ㉓ 空主机形与有主机形用同一张右界表:主机位之后接 `,` / `;` / `)` 这类不认(两版同)· ㉔ 点形单行载体上,空主机 userinfo 前面隔着换行 / 制表符的上一个词不再并进用户名一起遮:上一版这一形第一轮认不出 userinfo,画成点之后第二轮把「上一个词 + 点 + 用户名」整段当 userinfo 遮住;本版第一轮就按换行断开用户名,与有主机形(两版)同答(KL-181)· ㉕ 用户名与 `:` 之间紧贴 C1 引导符 U+009B 时,判别视图按一段控制序列读(冒号进了序列参数),机读口与转义形认不出 userinfo、口令原样;点形遮住(0.83.4 起同形,KL-192)· ㉖ 主机在场的无 scheme userinfo 左界不在 `"` 处断开:JSON 键或引号值的开引号被吞进记号,引号里空白之后的尾巴原样上屏(0.83.4 起同形;本版只在空主机形上让位,KL-193);门 —— ㉗ 九套 23 处终帧夹具仍是扁平形(结论与终态读法无关),由棘轮封顶只许减少(KL-187)· ㉘ 棘轮只管总数不管分布,注是声明不是证明,追不到的形不计(KL-188)· ㉙ 权威信封标签对账读引擎模块内部值,是过渡读法;引擎新增权威标签时本包到抬开发依赖那天才跟(KL-189)· ㉚ 权限拒绝投影与纯函数总套的降级链一组、流式计时 ① 段对「表外终态词」负控不响 —— 这些格只分「成功 / 非成功」或与终态无关,认不出的终态词按设计落错误信封(KL-190)。
10722
+
9617
10723
  ## §107 🆕 0.84.0(2026-09-27)sdk 12.0.1 地板 + 后台代理登记读数(缺席行下半场)+ 读目录授权结论通告读口 + 接线回执 `hands` 段 + 陈旧逻辑清扫(退役键 `rewindFiles` 拒收 · `agentCount` 可选 · 26 个内部件退出根入口 · 九张判定表换只读 Set 子类 · 十五张判定数组冻结 · `resume_at` 文本腿退役)(🔴 minor;peer sdk 地板 `>=11.3.0` → `>=12.0.1`;型面 BREAKING 两处〔`SeamRewindSpec.rewindFiles` 删 / `WorkflowRunState.agentCount` 改可选〕;根公面运行期导出 1278 → 1260〔+8 −26〕;公面类型 +10;`WiringManifestView` / `WiringManifestChromeEvent` 各 +1 可选键 `hands`;超集键 +1 `_sema_hands`;开发依赖引擎 `~7.33.1` 不变)
9618
10724
 
9619
10725
  > **minor**,原因三条:peer 地板跨到 sdk 12(本包按 12.x 才有的声明编译);型面 BREAKING 两处与 26 个内部件退出根入口;一处运行期拒收(`rewind.rewindFiles` 构造期抛)与一处运行期行为面(九张判定表换成只读 Set 子类,严格深比较 / `constructor` 可见)。五件同发(本节按 0.84.0 的读法写;若与本版发布帖不一致,以发布帖为准):