@sema-agent/client-core 0.83.6 → 0.84.1

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 (66) hide show
  1. package/CHANGELOG.md +176 -0
  2. package/README.md +20 -13
  3. package/dist/abortableSleep.d.ts +10 -0
  4. package/dist/abortableSleep.js +37 -0
  5. package/dist/adapt/wireShapes.js +3 -2
  6. package/dist/adapter/activeRunSelfHeal.js +7 -7
  7. package/dist/adapter/downstream/eventToSdkMessage.js +6 -2
  8. package/dist/adapter/downstream/terminalToSdkResult.d.ts +1 -0
  9. package/dist/adapter/downstream/terminalToSdkResult.js +10 -5
  10. package/dist/adapter/downstream/wiringManifestView.d.ts +3 -1
  11. package/dist/adapter/downstream/wiringManifestView.js +1 -0
  12. package/dist/agentSession/engineAgentRegistryRead.d.ts +18 -0
  13. package/dist/agentSession/engineAgentRegistryRead.js +167 -0
  14. package/dist/agentsWireCaps.js +10 -1
  15. package/dist/attachmentsWireCaps.js +2 -2
  16. package/dist/controlRouter.js +1 -1
  17. package/dist/decideFailureNote.d.ts +2 -1
  18. package/dist/decideFailureNote.js +5 -3
  19. package/dist/detachWire.d.ts +1 -0
  20. package/dist/detachWire.js +13 -5
  21. package/dist/displayUntrusted.js +114 -18
  22. package/dist/engineAgentAbsence.d.ts +37 -0
  23. package/dist/engineAgentAbsence.js +142 -0
  24. package/dist/engineErrorCodes.d.ts +2 -0
  25. package/dist/engineErrorCodes.js +9 -5
  26. package/dist/engineNoticeCodes.d.ts +43 -0
  27. package/dist/engineNoticeCodes.js +118 -5
  28. package/dist/engineWireSdk.d.ts +2 -0
  29. package/dist/fleet/fleetProjection.js +3 -2
  30. package/dist/frozenSet.d.ts +1 -0
  31. package/dist/frozenSet.js +20 -0
  32. package/dist/handsSeam.d.ts +3 -0
  33. package/dist/handsSeam.js +19 -0
  34. package/dist/hitl/askGateWire.d.ts +1 -1
  35. package/dist/hitl/askGateWire.js +1 -1
  36. package/dist/hitl/hitlHostSurface.js +1 -1
  37. package/dist/hitl/parkResolver.d.ts +1 -0
  38. package/dist/hitl/parkResolver.js +9 -3
  39. package/dist/hitl/planReviewWire.d.ts +30 -3
  40. package/dist/hitl/planReviewWire.js +139 -32
  41. package/dist/hitl/sessionPolicyDeliverable.d.ts +2 -0
  42. package/dist/hitl/sessionPolicyDeliverable.js +14 -3
  43. package/dist/hitl/sessionPolicyWire.d.ts +40 -0
  44. package/dist/hitl/sessionPolicyWire.js +210 -0
  45. package/dist/hitl/toolApprovalWire.js +2 -2
  46. package/dist/index.d.ts +24 -13
  47. package/dist/index.js +13 -13
  48. package/dist/liveInitToolFace.js +28 -10
  49. package/dist/model/catalogLoader.js +3 -3
  50. package/dist/model/tierVocabulary.js +1 -1
  51. package/dist/request/taskRequest.js +15 -5
  52. package/dist/resumeRefusalCopy.d.ts +11 -0
  53. package/dist/resumeRefusalCopy.js +39 -1
  54. package/dist/rewindWireCaps.d.ts +0 -1
  55. package/dist/seam.d.ts +2 -1
  56. package/dist/seatContract.js +2 -2
  57. package/dist/systemReminderTag.d.ts +5 -0
  58. package/dist/systemReminderTag.js +20 -9
  59. package/dist/toolResult.js +2 -6
  60. package/dist/toolRoster.d.ts +16 -0
  61. package/dist/toolRoster.js +46 -5
  62. package/dist/wireErrorTriage.js +1 -11
  63. package/dist/workflowClient.js +4 -3
  64. package/dist/workflowMonitor.d.ts +1 -1
  65. package/docs/INTEGRATION-CLIENTS.md +701 -37
  66. package/package.json +3 -3
@@ -19,11 +19,11 @@
19
19
 
20
20
  | 项 | 值 | 真源 |
21
21
  |---|---|---|
22
- | 本包 | `@sema-agent/client-core` **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` **>=11.3.0**(value-level,非 type-only;**0.80.0 抬版**:11.3.0 在两条回决口体上声明 `settledBy?: "policy"`、`Settlement.kind` 第十三词 `policy_refused` 与三错误码;0.83.0 / 0.83.1 / 0.83.2 / 0.83.3 / 0.83.4 / 0.83.5 / 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.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.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
- | 公开导出面 | **1278** 个运行期符号(+ **59 个测试钩,两种拼法**:35 个 `__*ForTests` + 24 个单下划线开头(22 个 `_*ForTest` + `_resetLiveQuestionStore` / `_resetUltracodePreset`) —— 两种都在 `public-export-baseline.json` 的 `testHookNames` 里、各自受棘轮管,**不在** `names` 的 1278 里。运行期 `Object.keys(dist/index.js)` 的全量 = 1278 + 59 = **1337**;只剔双下划线那 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
+ | 公开导出面 | **1275** 个运行期符号(+ **59 个测试钩,两种拼法**:35 个 `__*ForTests` + 24 个单下划线开头(22 个 `_*ForTest` + `_resetLiveQuestionStore` / `_resetUltracodePreset`) —— 两种都在 `public-export-baseline.json` 的 `testHookNames` 里、各自受棘轮管,**不在** `names` 的 1275 里。运行期 `Object.keys(dist/index.js)` 的全量 = 1275 + 59 = **1334**;只剔双下划线那 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` —— **别手抄进别处,以该文件为准** |
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
 
@@ -42,7 +42,7 @@
42
42
  additive 导出成立(`engineCapState` + `EngineCapState`、`resolveEntryVision` /
43
43
  `computeDeleteBlockers` / `computeDeleteWarnings`、`CONFIG_DELEGATION_ENTRY_CAPS` /
44
44
  `DELEGATION_CONCURRENCY_CAP` / `DELEGATION_SESSION_CAP` / `DELEGATION_CAP_CODES` /
45
- `isDelegationCapCode`、`wireCycleSeq`)。旧版对表以 `CHANGELOG.md` 对应版本段为准。
45
+ `isDelegationCapCode`、`wireCycleSeq` 🔧 0.84.0 退出公面)。旧版对表以 `CHANGELOG.md` 对应版本段为准。
46
46
 
47
47
  🔴 **本表里仍然手抄的数字都有门看着**(#252,2026-08-14;2026-09-20 改口 —— 此处**只点名被看着的量,不再抄当日读数**:
48
48
  抄读数的那一版每次公面变动都要手改五处数字,漏一处就自己变成失真源,而这句话正是用来保证本表不失真的):
@@ -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`(**1278** 项;该基线只覆盖**根**入口,子路径入口 `./registry` 的名单在 §86 与 `scripts/run-sdk-registry-transit-test.mjs` A / C 段)。
128
+ > 全集真源 = `scripts/public-export-baseline.json` 的 `names`(**1275** 项;该基线只覆盖**根**入口,子路径入口 `./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,31 +149,31 @@ SDK 核对「本包 import 的每个值级符号仍然导出」「`TaskStats.cos
149
149
  `WorkflowsGateUnknownDenial` 四形**不在**基线里,`src/selfOrchestrationDenial.ts` 对基线贡献
150
150
  **4** 项运行期导出(三个函数 + `SELF_ORCHESTRATION_RETRY_WITHOUT`)。
151
151
 
152
- 1278 项的内部构成(帮助端估读表大小;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):**351** 项是 `SCREAMING_SNAKE` 常量数据表/词汇表
152
+ 1275 项的内部构成(帮助端估读表大小;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):**348** 项是 `SCREAMING_SNAKE` 常量数据表/词汇表
153
153
  (矩阵、键集、env 名、锚串)而非可调用物;**7** 项是 PascalCase 运行期值
154
154
  (`ControlRouter` / `ControlSafetyError` / `HitlBridge` / `HitlSafetyError` / `DecideTransportRetryExhaustedError` / `APIError`);
155
- **37** 项是 `*For(sessionKey, …)` 的 per-session 变体(0.72.0 −4:`clearArmedGateFor` / `onGateArmedFor` / `registerArmedGateFromQuestionIdFor` / `notePlanReviewAnsweredIfDecisiveFor` 退出公面)(§6;其中 `engineNamespaceKeyFor` 是命名巧合 —— 参数是 baseUrl 不是 sessionKey,见域 14)。
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 域,逐域计数之和 = 1278)
157
+ ### 2b. 域图(16 域,逐域计数之和 = 1275)
158
158
 
159
159
  | # | 域 | 名数 | 承重导出 | 用途 | 实现锚 |
160
160
  |---|---|---|---|---|---|
161
- | 1 | **适配内核(下行主链)** | 67 | `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 | **适配内核(下行主链)** | 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` |
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 主战场) | 219 | `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(For)`/`onGateArmed`/`gateArmedWaitMs`(#244 F1 呈现回执事件源) · `planReviewArmedKey(For)`/`notePlanReviewAnswered(For)`/`notePlanReviewAnsweredIfDecisive`(A-024.4 plan 呈现分代) · `toolEndOutputText` · `isAskTool` · `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}`)· `surfaceRuleArmNotSent` / `RULE_NOT_SENT_WARN_TEXT` + `surfaceRuleArmRejected` / `RULE_NOT_SENT_REJECTED_WARN_TEXT`(#334,0.43.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`/`isAskTool`/`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 | `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` —— 端有行上下文时**应当**传,传了就走「台账优先 / 缺席即诚实缺席 + `noteBgOwnerAbsence` 留痕」的 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()` 推断)· `noteBgOwnerAbsence`(#242 批 3 [4000] Q3=B:tail/taskOutput·taskStop/subagentOutput 三腿台账缺席即诚实缺席**绝不回落在飞 run**,缺席 warn 留痕每 (腿,taskId) 一条)· `clearBgTerminalFacts`(#242 批 3 扫码修:复活=新周期,旧周期终态事实作废——fleetLedger 复活两腿按尾段清账,factsAccepted 方向核不再拿上周期终态当先例)· `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/engineInlineTaskStats.ts`、`src/engineToolLabelStore.ts`、`src/liveQuestionStore.ts` |
165
- | 5 | **fleet 投影** | 40 | `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⑦)· `wireCycleSeq`(0.38.0 提货补投的 #261 §2 两位之一,另一位 `wireRetiredBy` 🔧 0.72.0 退出公面:代际号 = SendMessage 复活即 +1,**缺席 ≠ 第一代**;`retiredBy` 在场 = 这条终态是对账腿从 durable run 行投影出来的、**不是**发布方亲报 —— 幽灵行与正常收尾唯一的 wire 判据。两位都只在场才落键) | 老 `fleetClient` 那一刀的成品:**帧体归库、连接归端** —— 端持 SSE 连接,库做行投影 + 保留台账 | `src/fleet/fleetProjection.ts`、`src/fleet/fleetLedger.ts`、`src/fleetAgentPanelProjection.ts`、`src/fleetTaskDesc.ts`、`src/displayUntrusted.ts`(0.83.1 CC-112:展示层安全出口单源,本域三只旧口的字符面引擎) |
163
+ | 3 | **HITL 决断卡链**(§4/§5 主战场) | 214 | `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.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` |
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
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` |
167
- | 7 | **通知与 outstanding 台账** | 52 | `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` |
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 | **工具结果卡** | 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
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` |
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 | **控制面与传输** | 195 | `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 | **引擎词汇表与包自检** | 114 | `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 | **控制面与传输** | 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 | **引擎词汇表与包自检** | 119 | `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`**,
@@ -309,7 +309,7 @@ removal after the last running beat」。**按开集透传**(空串 / 非串 /
309
309
  **仍然被本层剥掉的四键**(`seq` / `taskType` / `parentTaskId` / `eventId`;0.65.0 起 `status` 已离开本表):
310
310
  - `taskType` / `parentTaskId` —— 在册的 §7 缺口 **P-1**;lane 归属今天改用 id 形状 /
311
311
  `workflowRunId` 启发式判(`src/adapt/arms.ts`)。
312
- - `seq` —— core #258 的 stop-cycle 代际号(复活即 +1)。fleet 面已有同轴的 `wireCycleSeq`(0.38.0),
312
+ - `seq` —— core #258 的 stop-cycle 代际号(复活即 +1)。fleet 面已有同轴的 `wireCycleSeq`(🔧 0.84.0 退出公面 —— 包内件;0.38.0),
313
313
  **tick 这条腿今天没有消费方** ⇒ 照旧剥。
314
314
  ⚠️ **就地订正(0.48.0)**:本条 0.47.0 的原文还写着「SDK 7.3.0 连声明都没有」—— sdk **7.4.0 已
315
315
  声明** `seq?: number`(与 `model` 同批)。**剥它的理由换了一条,但仍然剥**:准入条件从来是
@@ -614,7 +614,7 @@ pure 门 062⑥/⑦):
614
614
  | `delivery`(必填,恒 `"applied"`) | 非该值 ⇒ **整份 ack 不合形** | 同上 |
615
615
  | `decision`(必填,三词闭集) | 不在闭集 ⇒ **整份 ack 不合形** | 同上;端不得放宽成「是串就行」 |
616
616
  | `rememberApplied?: boolean` | **缺席 = 未知**(旧 server / void 注入面),**绝不当 false** | `=== false` 且本次是 `allow_session` ⇒ **必须响亮告知**:三选卡第 2 项在用户心里签的是「本会话这个工具不再问我」,server 说没记住而界面照渲「全放行」= 把没发生的授权渲成发生了。包内已发通知 `surfaceRememberNotApplied()`;端的义务 = **装 `HitlHostSurface` 口**(§5)+ **不要**在 `rememberApplied` 非 true 时渲「全放行」徽标 |
617
- | `updatedInputForwarded?: boolean` | **缺席 = 未知**,绝不当 false | `=== false` 且卡带了 `updatedInput` ⇒ **[high] 必须响亮告知**:用户把 `rm -rf /tmp/x` 改成 `rm -rf /tmp/x/build` 然后批准,而真正执行的是**改之前那条**。allow 已送达、事后**无 fail-closed 余地** ⇒ 唯一诚实处置是立刻响亮说出来(不是 debug 日志)。包内 `surfaceEditNotForwarded()` |
617
+ | `updatedInputForwarded?: boolean` | **缺席 = 未知**,绝不当 false | `=== false` 且卡带了 `updatedInput` ⇒ **[high] 必须响亮告知**:用户把 `rm -rf /tmp/x` 改成 `rm -rf /tmp/x/build` 然后批准,而真正执行的是**改之前那条**。allow 已送达、事后**无 fail-closed 余地** ⇒ 唯一诚实处置是立刻响亮说出来(不是 debug 日志)。包内 `surfaceEditNotForwarded()`(🔧 0.84.0 退出公面) |
618
618
  | `rulePersisted?: boolean`(sdk 6.14.0,#225) | **缺席 ≠ false**(未带 `persistRule` 的回决 / 旧 server 省略);非布尔降缺席 | 决定「规则存没存上」的诚实告知;透传坏形会说反话 |
619
619
  | `ruleRefusal?: string`(sdk 6.14.0) | 非串/空串 ⇒ 降缺席 | 规则被拒的归因(如 `rule_not_offered`)原样呈现,不改写 |
620
620
  | `noteRecorded?: boolean`(sdk 6.16.0,#229) | **缺席 ≠ false**(未带 `note` 的回决 / 老 server 省略);非布尔降缺席 | 发了 `note` 而 `!== true` ⇒ **debug 留痕即可,不惊动用户**:决断没丢,丢的只是理由的持久档(纯活卡无行可落 / 店抖但裁决照常生效 / 并发同决议先落行) |
@@ -623,7 +623,7 @@ pure 门 062⑥/⑦):
623
623
 
624
624
  **实现锚**:`src/hitl/toolApprovalWire.ts`(`readToolApprovalRespondAck` / `ToolApprovalFrameOutcome` /
625
625
  `surfaceToolApprovalFrameAndRespond` 的相关性门与三处 ack 消费分支)、
626
- `src/hitl/hitlHostSurface.ts`(`surfaceRememberNotApplied` / `surfaceEditNotForwarded` +
626
+ `src/hitl/hitlHostSurface.ts`(`surfaceRememberNotApplied` / `surfaceEditNotForwarded`〔后者 🔧 0.84.0 退出公面〕+
627
627
  两条测试锁字面 `REMEMBER_NOT_APPLIED_WARN_TEXT` / `EDIT_NOT_FORWARDED_WARN_TEXT`)。
628
628
 
629
629
  ### 4b. `note`(回决备注)的**发送**前置门 —— 与 ack 成对
@@ -840,8 +840,8 @@ persistRuleBatchOfferIndex !== undefined
840
840
  - 🔴 **只闸兑付,不闸展示**:batch offer 照旧上卡(`ApprovalCardRequest.ruleOffers` 字节不变),
841
841
  端可以渲、可以走**本地落规则**那条路(与 `ruleOffersReadOnly` 同姿势),只是这条 wire 兑付通道不开;
842
842
  - 🆕 🔴 **被丢掉的用户意图会经 `HitlHostSurface` 如实上屏** —— **两条,按原因分**:
843
- `surfaceRuleArmNotSent()` / `RULE_NOT_SENT_WARN_TEXT`(**能力位未确认**)与
844
- `surfaceRuleArmRejected()` / `RULE_NOT_SENT_REJECTED_WARN_TEXT`(这次选择**没过包内表核/互斥核**:
843
+ `surfaceRuleArmNotSent()`(🔧 0.84.0 退出公面)/ `RULE_NOT_SENT_WARN_TEXT`(**能力位未确认**)与
844
+ `surfaceRuleArmRejected()`(🔧 0.84.0 退出公面)/ `RULE_NOT_SENT_REJECTED_WARN_TEXT`(这次选择**没过包内表核/互斥核**:
845
845
  表外文本 / 坏下标 / 两臂同场 —— 成因通常是卡口实现的 bug,`hostLog('error')` 那条留痕照旧保留,
846
846
  两个受众两条通道)。🔴 **刻意不折成一条**:对用户的下一步建议不同(换台引擎/等探测 vs 换引擎
847
847
  也不会变)。以下纪律两条共用。前一条—— 与 `surfaceRememberNotApplied` 同族:人按下的是一个明确
@@ -860,9 +860,9 @@ persistRuleBatchOfferIndex !== undefined
860
860
 
861
861
  | 顺序 | 通知 | 说的是 |
862
862
  |---|---|---|
863
- | 1(先) | `surfaceRuleArmNotSent` / `surfaceRuleArmRejected` | 这次「不再询问」没存上 —— 下次还会问,**不影响这次跑的是什么** |
863
+ | 1(先) | `surfaceRuleArmNotSent` / `surfaceRuleArmRejected`(🔧 0.84.0 退出公面) | 这次「不再询问」没存上 —— 下次还会问,**不影响这次跑的是什么** |
864
864
  | 2 | `surfaceRememberNotApplied` | `allow_session` 没记住 —— 同族,范围大一点 |
865
- | 3(压轴) | `surfaceEditNotForwarded` | **工具正在用原始入参跑**(批的那份 ≠ 跑的那份)—— 唯一一条 [high] |
865
+ | 3(压轴) | `surfaceEditNotForwarded`(🔧 0.84.0 退出公面) | **工具正在用原始入参跑**(批的那份 ≠ 跑的那份)—— 唯一一条 [high] |
866
866
 
867
867
  ⚠️ 端若自己重排/合并这些通知,**必须保住这条不变量**:别用一条「规则没保存」把「你批的和正在跑的
868
868
  不是同一个东西」顶掉。端要是实现成**队列**(不顶替),三条都能看见,那更好。
@@ -938,15 +938,15 @@ durable park 腿走 `HitlBridge.decideTool(outcome, toolUseID, opts, preResolved
938
938
  | 事实 | 契约 |
939
939
  |---|---|
940
940
  | **D-1 两元组 verbatim 回显** | `boundCallId` + `boundInputHash` 逐字回显进 `decide`,**绝不本地重算 hash**(`bindingOf`)。409 ⇒ `HitlSafetyError('binding_mismatch')`,调用方**重新呈现,绝不自动重试**(一次 decide 绝不双act)。pure 门 B7 段对这两段做**字节级**断言,改一个字符就红 |
941
- | `reason` 上限 | 4096 字(包内常量,🔧 0.72.0 起不再导出);超限 server **413 `reason_too_large`**,丢的不是归因而是**整次决断**(413 ⇒ 决断没送达 ⇒ run 留 suspended)。包内 `denyReasonForWire(reason, tag)` 截断 + 留痕 |
942
- | 缺省拒因 | `DEFAULT_DENY_REASON = 'The user rejected this tool use'`(不带归因时逐字不变) |
941
+ | `reason` 上限 | 4096 字(包内常量,🔧 0.72.0 起不再导出);超限 server **413 `reason_too_large`**,丢的不是归因而是**整次决断**(413 ⇒ 决断没送达 ⇒ run 留 suspended)。包内 `denyReasonForWire`(🔧 0.84.0 退出公面)截断 + 留痕 |
942
+ | 缺省拒因 | `'The user rejected this tool use'`(包内常量,🔧 0.84.0 起不再导出;不带归因时逐字不变) |
943
943
  | **cancel vs deny(两动词,按意图选)** | 🔴 **按「你要停的是哪一样」选,不是按 run 的状态选**。`deny`(本节两条决断腿)= 否掉**这一道门**:决断送达后 run **继续**,模型拿到一条拒绝继续跑 —— 这是「不许它做这件事」。`runs.cancel` = 终结**整条 run**:server [868] 起对 `suspended` / `needs_review` 的 run **就地取消**(把待决 checkpoint 结清 + 行终态化,ack 带 `errorCode:"cancelled"`),这是「别跑了」。⚠️ **本行 0.36.0 前的原文是失真的**(SDK 7.1.0 已标 stale):它写的是「取消 suspended run 必须用 deny,绝不 `runs.cancel`(对 suspended run 会 409)」—— 照那句做会把「停」实现成「放它接着跑」(deny 只关掉一道门,run 照跑)。`cancel` 的 409 **今天只剩 lost CAS race**(待决门被并发决掉/过期 ⇒ 重读再试),**不再**是「suspended 一律 409」。判据锚 = 装机 SDK `dist/resources/runs.d.ts` 的 `cancel` JSDoc(常驻门 ⑦ 段对账,上游改说法当天红) |
944
944
  | 空作答 fail-loud | `answerQuestion` 三形一律抛 `HitlSafetyError('empty_answer')`、**一次 decide 都不发**:空 `answers[]` / 任一条 `selected[]` 为空 / 任一条 `header` 为空串。理由:`{answers:[]}` 在 wire 上另有确切含义(question 域 deny 的 NO_HUMAN 形),当 approve 发出去 = **拿 deny 的载荷冒充 approve** |
945
945
  | **回执** | ⚠️ `decideTool` / `answerQuestion` 的返回型是 **`Promise<unknown>`** —— 本包**不结构化读** durable `/decide` 的响应体,**没有** 4a 那样的 ack 消费层。见 §7b 缺口 **P-7**(不是 P-6:P-6 是 `compaction_outcome`) |
946
946
  | TOCTOU | 调用方若已经用 `findPendingForTask` 取过 pending 行(呈卡用的那一行),**必须**经 `preResolvedPending` 传进来 —— 否则本方法自己再 `approvals.list()` 一次,两次独立取数可能落在**不同的行**上(「人看到的行」≠「decide 解析的行」) |
947
947
 
948
948
  **实现锚**:`src/hitl/hitlBridge.ts`(`HitlBridge.decideTool` / `.answerQuestion` / `bindingOf` /
949
- `denyReasonForWire` / `HitlSafetyError` / `findPendingForTask`)。
949
+ `denyReasonForWire`(🔧 0.84.0 退出公面)/ `HitlSafetyError` / `findPendingForTask`)。
950
950
 
951
951
  ### 4e. `HitlSafetyError` 的判型契约(跨 realm / 双实例安全)
952
952
 
@@ -1160,7 +1160,7 @@ durable 审批行 `PendingCheckpoint.hasBidiControls` 随卡透传到 `ApprovalC
1160
1160
  | 位 | 缺席 / `false` 的后果 | 用户看得见什么 |
1161
1161
  |---|---|---|
1162
1162
  | `approvalDecisionNoteCapable` | 回决 `note` **整条不发** | 审计面没有拒因;屏上无变化 |
1163
- | `respondFreeFormRulesCapable` | **编辑臂** `persistRule` 整条不发(候选臂不受影响) | 人手改的规则没存上 ⇒ 包发 `surfaceRuleArmNotSent()` 通知 |
1163
+ | `respondFreeFormRulesCapable` | **编辑臂** `persistRule` 整条不发(候选臂不受影响) | 人手改的规则没存上 ⇒ 包发 `surfaceRuleArmNotSent()`(🔧 0.84.0 退出公面)那一条通知 |
1164
1164
  | `respondBatchRuleOffersCapable` | **批臂** `persistRuleBatchOfferIndex` 整条不发(offer 仍上卡) | 勾的合取批没存上 ⇒ 同一条通知 |
1165
1165
  | `windowIsCurrent` | 窗三键**不过境**到卡 | 卡上**没有倒计时**([4845]「卡挂着像活的」) |
1166
1166
 
@@ -1220,18 +1220,20 @@ respawn/restart 后调 `invalidateEngineCaps(baseUrl, probe?)`(**推荐两参形
1220
1220
  - 🔴 **唯一构造点纪律不破**:relay 形也走 `makeEngineWireClient()`(`src/engineWireSdk.ts`),
1221
1221
  没有第二个铸口。
1222
1222
 
1223
- **今天放宽了的入参面只有两个**(⚠️ 这一条决定端能不能真用上):
1223
+ **今天放宽了的入参面只有两个**(⚠️ 这一条决定端能不能真用上;0.84.1 起另有两处注入口,见表末两行):
1224
1224
 
1225
1225
  | 入参面 | 类型 | 实现锚 | 端怎么用 |
1226
1226
  |---|---|---|---|
1227
1227
  | `EngineWireClientConfig.token` | `string \| { mode: 'same-origin-relay' }` | `src/engineWireSdk.ts` | 自己直调 `makeEngineWireClient({ baseUrl, token: { mode:'same-origin-relay' } })` 的路径可用 |
1228
1228
  | `LiveWorkflowConfig.authToken` | `string \| { mode: 'same-origin-relay' }` | `src/workflowClient.ts`(`createLiveWorkflowSource`) | workflow 活体读面可用 |
1229
+ | `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) |
1230
+ | `EngineProbeOpts.client` | `EngineProbeClient` | `src/engineWireSdk.ts` | 🆕 0.84.1 注入口:两只探针直接用它,`timeoutMs` 是 独立落定的截止(到点答「不知道」并中止底层请求;§108) |
1229
1231
 
1230
1232
  🔴 **没放宽的那一半(端接之前必须知道)**:`EngineWireTarget.token` 仍是 `string`
1231
1233
  (`src/engineWireTarget.ts`),而 `installEngineWireTarget()` 是**非 Node 宿主唯一的装配入口** ——
1232
1234
  包内经 `engineWireTarget()` 取址再构造 client 的那 **10 处**(plan review ×2 / 子代 tail / steer /
1233
- output / compact ×2 / taskHandle ×2 / delegated prompt)因此**装不进** relay 形。详见缺口 **P-28**。
1234
- 浏览器宿主今天能走通的只有上表那两条自带入参面的路径;走 `engineWireTarget()` 的动词
1235
+ output / compact ×2 / taskHandle ×2 / delegated prompt)因此**装不进** relay 形 —— 🆕 0.84.1 起 plan review 那 2 处有注入形(上表末两行之一),子代族 8 处(另有 resume 族 3 处)仍装不进。详见缺口 **P-28**。
1236
+ 浏览器宿主今天能走通的只有上表那几条自带入参面 / 注入口的路径;走 `engineWireTarget()` 的子代族动词
1235
1237
  在同源反代部署下**没有合法凭证形**可传。
1236
1238
 
1237
1239
  🔴 **没放宽的还有第二个入参面**(0.30.0 发包扫描补记 —— 此前本节与 P-28 只点了上面那 10 处,
@@ -1241,7 +1243,7 @@ output / compact ×2 / taskHandle ×2 / delegated prompt)因此**装不进** rel
1241
1243
  它们在浏览器 relay 部署下同样构造不出 client,失效形属下表 **C 档(零日志零信号)**:
1242
1244
  前者 `return undefined`(= 「不知道有没有这个能力」,不是 `false`),后者 `return null`。
1243
1245
  ⚠️ 端**不要**把这两个 `undefined`/`null` 读成「引擎不支持」——它们在 relay 部署下**恒**如此,
1244
- 与引擎能力无关;正位解同 P-28(放宽入参面 + 透传),**不许端侧侧路补救**。
1246
+ 与引擎能力无关;正位解同 P-28(放宽入参面 + 透传),**不许端侧侧路补救**。🆕 0.84.1:`EngineProbeOpts.client`(`EngineProbeClient`,`AgentClient` 直接满足)是中继宿主的正位入口 —— 交了注入 client 的宿主上两只探针照常读(`timeoutMs` 是独立落定的截止),上面的「恒 `undefined` / `null`」只对不交的宿主成立(§108)。
1245
1247
 
1246
1248
  ⚠️ **失效形:构造失败一律吞成 `null`,但「之后怎么办」逐点不同 —— 别当成一律静默**。
1247
1249
  `makeEngineWireClient()` 的构造被 SDK 守卫拒时走 `catch { return null }`(`src/engineWireSdk.ts`),
@@ -1256,7 +1258,7 @@ output / compact ×2 / taskHandle ×2 / delegated prompt)因此**装不进** rel
1256
1258
  🔴 **A 档的用户可见性是有前提的,别当成保证**(#252 复审 R2 命中):`enqueuePlanReviewOutcome()`
1257
1259
  (`src/notifications.ts`)在**队列口没装**时直接 `return false`;装了但**没有 `enqueueMetaPrompt`** 时
1258
1260
  `queuePortMisses++` 后 `return false`。`decidePlanReview` 对 `false` 只再补一行
1259
- `hostLog('error', 'planReviewWire: outcome enqueue MISSED …')`,投递口抛错则只落一行 `debug`。所以:
1261
+ `hostLog('error', 'planReviewWire: outcome enqueue MISSED …')`,投递口抛错则只落一行 `debug`。🆕 0.84.1:`decidePlanReview` 的 `onOutcome` 回调(§108)是与队列口**并行**的第二条可见通道 —— 宿主接了回调时,队列口缺席不再打 error 级 MISSED(改一行 debug),结局照样交到宿主手里;两条都没有才照旧 error 级。所以(不接回调时):
1260
1262
 
1261
1263
  | 结局 | 用户看不看得见 |
1262
1264
  |---|---|
@@ -1521,7 +1523,7 @@ CHANGELOG 0.29.0「已知局限」段与相应 JSDoc 都有成文。**别在读
1521
1523
  | **P-35** | low | **`WIRE_NETWORK_ERROR_PATTERN` 与 web 的 `NETWORK_PATTERNS` 存在真实的**大小写敏感度分叉**(0.42.0 [C195] 行为对拍腿实测):本包整条基表带 `i` flag,而 web 的 errno 类 token(`ECONNREFUSED` / `ECONNRESET` / `ETIMEDOUT` / `EAI_AGAIN` / `ENOTFOUND` / `EHOSTUNREACH` / `ENETUNREACH` / `EPIPE` / `UND_ERR`)**逐条无 `i`** ⇒ 同一条小写 errno 文本,本包判 `transport`、web 判 `unknown` | `src/wireErrorTriage.ts`(`WIRE_NETWORK_ERROR_PATTERN`);对拍腿 = `scripts/run-client-core-pure-test.mjs` 的 `F3E-C195-web-parity` 条件腿 | 分叉**已登记并被门钉住**(登记表在对拍腿里,分叉消失即红、未登记的新分歧也红)。端今天照现状读即可;要收敛得两侧同批改 flags —— 这属跨仓一批,已按表态制上 C 板 |
1522
1524
  | **P-40** | med(能力位模型;**系统性、非本批引入**——`approvalDecisionNote`/`respondFreeFormRules` 自 0.29.0/0.42.0 起同形) @cli @web @desktop | 🆕 **能力位是 per-baseUrl 的布尔缓存,不与「出这条帧的副本」或「收 respond 的副本」绑定**(异源对抗复审六轮 [medium] 登记)。`engineCapTrue(baseUrl, key)` 答的是「这个地址上次探到什么」——引擎温切 / 滚动升级 / 多副本代理下,一个 `true` 可以来自 7.46 实例而 respond 落到 ≤7.45 实例。后果按位不同:`note` 被静默忽略(无害);**编辑臂/批臂**会被老解析器**响亮 400 且连决断一起拒** ⇒ 人按下的 allow 落不了地,退化成 `unresolved`/TTL 自决。⚠️ ⇒ 「能力位闸让老引擎**零受迫**」这句话的正确形是「**在能力读数与实际 responder 一致的前提下**零受迫」,本档 §4b-2/§4b-3 的措辞已按此订正 | `src/engineCapsCache.ts`(per-baseUrl 缓存 + `invalidateEngineCaps(baseUrl, probe?)`)· `src/hitl/toolApprovalWire.ts`(`ToolApprovalFrameLaneOpts` 三个能力位的闸) | 端的现有缓解:①引擎 respawn/restart 后**必须**调 `invalidateEngineCaps(baseUrl, probe?)`(推荐两参形:推进代际 + 注册新探测在同一同步块内完成);②滚动升级窗口内宁可把两个规则能力位按 `false` 供给(丢持久臂 + 一条诚实通知,远好于把决断打掉)。🔴 正位解需要**上游给出 per-responder 的能力证明**(回执/帧上带副本代际或集群最低能力),或让 server 保证这类 400 对决断**零副作用**(那样客户端可以去掉批臂重送原决断)—— 按接入文档宪法向 server 点名,属跨仓设计件 |
1523
1525
  | **P-39** | ✅ **已解**(server 7.48.0 到货,client-core 本批消费) @cli @web @desktop | **上游已补 additive 归属锚 `persistedRuleAnchors`** —— 兑付回执(respond 200 体,**非帧**)上每条落地规则带 `{offerIndex, memberIndex, rule}`(直证:engine 7.48.0 fixture `@sema-agent/server/dist/tool-approval.js:1360` park 迟到腿 / `:1461` live 腿两处铸点)。本包据它把批臂相关性从**基数**升级到**身份**:锚的 `offerIndex` 必须等于这一次真发出去的 `persistRuleBatchOfferIndex`、`memberIndex` 必须落在所选 offer 的成员范围内 ⇒ 原登记里「条数对但内容是另一批规则」那一形**从此抓得到**。🔴 **三态不是两态**(本批对抗复审 [high] 采纳):「键真缺席」(≤7.47 老引擎)才让位基数门;**「键在场但坏形」绝不让位** —— 否则一份「另一只 offer + 条数恰好相同 + 故意发坏锚」的回执可精确绕过身份门。判据取 **wire 上键在不在**,不取窄化产物在不在 | `src/hitl/toolApprovalWire.ts`(`ToolApprovalRespondAckView.persistedRuleAnchors` + `readPersistedRuleAnchors` 整只判形 + `surfaceToolApprovalFrameAndRespond` 臂相关性门的 absent/valid/invalid 三态)· 行为钉:`run-hitl-gate-honesty-test.mjs` F14 件1(正控/另一只 offer 负控/memberIndex 越界负控/老引擎兼容/**坏形绕过反测**)、`run-rules-side-test.mjs` G8(读口整只判形十格) | 端**可以**渲「你选的那批里的 N 条」了 —— 但**只在锚到位且核得住时**;锚缺席(老引擎)仍须回落原口径「**引擎报告**落盘的规则」,绝不声称「就是你选的那批」。cli 半场参照实现 = `persistedRulesWire.ts` `persistedNoticeText`(三合取:注入面交了 `batchOfferIndex` ∧ 锚过判形 ∧ `offerIndex` 对得上,任一不满足即退回保守句) |
1524
- | **P-38** | med(集成面;**存量、非本批引入** —— 0.42.0 基线 `4c364c1` 上逐字相同) @cli @web @desktop | 🆕 **标准帧路由丢弃 `ToolApprovalFrameOutcome` 的诊断/回显面**:`routeToolApprovalFrame`(`src/hitl/frameRouter.ts`)对 `surfaceToolApprovalFrameAndRespond` 的产物**只解构 `decision`**,`ack` 与 `respondRefusal` 整段丢掉;`AskGateWireDeps` 上也没有 outcome sink。⇒ 走**标准集成面**(`runStream` → frameRouter)的端读不到:① 0.42.0 #225 件5 的 `respondRefusal`(server 响亮 400 / `edit-rejected` 拒句)② 0.43.0 #334 的 `persistedRule` / `persistedRules` 规范文本回显。⚠️ 两个**更重**的安全位不在此列 —— `rememberApplied:false` / `updatedInputForwarded:false` 由 `toolApprovalWire` 就地经 `HitlHostSurface` 投递(`surfaceRememberNotApplied` / `surfaceEditNotForwarded`),**不经**本路由,所以那两条告知照常到达。⚠️ 端若**自己直调** `surfaceToolApprovalFrameAndRespond`(cli 的 `approvalStreamWire` 卡腿即是)则拿得到完整 outcome,本条只约束走 frameRouter 那条路 | `src/hitl/frameRouter.ts`(`const { decision } = await surfaceToolApprovalFrameAndRespond(...)`)· `src/hitl/toolApprovalWire.ts`(`ToolApprovalFrameOutcome` 的三位产物) | 端**不要**假定「包返回了这一位 ⇒ 标准路由上就能读到」:走 frameRouter 的端今天拿不到规则回显与拒句,渲「你的规则已存为 X」/「引擎说:…」必须先确认自己走的是哪条调用点。🔴 正位解在包侧(给 frameRouter / `AskGateWireDeps` 补一个 outcome 回执端口,或把规则回显与拒句经 `HitlHostSurface` 就地投递,与 `rememberApplied` 同姿势),属**行为面 + 三端接线**的独立设计件,按 [C162] 令④ 回 C 板提 |
1526
+ | **P-38** | med(集成面;**存量、非本批引入** —— 0.42.0 基线 `4c364c1` 上逐字相同) @cli @web @desktop | 🆕 **标准帧路由丢弃 `ToolApprovalFrameOutcome` 的诊断/回显面**:`routeToolApprovalFrame`(`src/hitl/frameRouter.ts`)对 `surfaceToolApprovalFrameAndRespond` 的产物**只解构 `decision`**,`ack` 与 `respondRefusal` 整段丢掉;`AskGateWireDeps` 上也没有 outcome sink。⇒ 走**标准集成面**(`runStream` → frameRouter)的端读不到:① 0.42.0 #225 件5 的 `respondRefusal`(server 响亮 400 / `edit-rejected` 拒句)② 0.43.0 #334 的 `persistedRule` / `persistedRules` 规范文本回显。⚠️ 两个**更重**的安全位不在此列 —— `rememberApplied:false` / `updatedInputForwarded:false` 由 `toolApprovalWire` 就地经 `HitlHostSurface` 投递(`surfaceRememberNotApplied` / `surfaceEditNotForwarded`〔后者 🔧 0.84.0 退出公面〕),**不经**本路由,所以那两条告知照常到达。⚠️ 端若**自己直调** `surfaceToolApprovalFrameAndRespond`(cli 的 `approvalStreamWire` 卡腿即是)则拿得到完整 outcome,本条只约束走 frameRouter 那条路 | `src/hitl/frameRouter.ts`(`const { decision } = await surfaceToolApprovalFrameAndRespond(...)`)· `src/hitl/toolApprovalWire.ts`(`ToolApprovalFrameOutcome` 的三位产物) | 端**不要**假定「包返回了这一位 ⇒ 标准路由上就能读到」:走 frameRouter 的端今天拿不到规则回显与拒句,渲「你的规则已存为 X」/「引擎说:…」必须先确认自己走的是哪条调用点。🔴 正位解在包侧(给 frameRouter / `AskGateWireDeps` 补一个 outcome 回执端口,或把规则回显与拒句经 `HitlHostSurface` 就地投递,与 `rememberApplied` 同姿势),属**行为面 + 三端接线**的独立设计件,按 [C162] 令④ 回 C 板提 |
1525
1527
  | **P-37** | low(镜像面) @cli @web @desktop | 🆕 **`tool_approval_complete.parked` 已进键镜像,但本包零消费**(0.43.0 同形族扫的产物,#329 server 7.44.0 及更早就在场)。它是 `outcome:"expired"` 一词三义(park / 当场 deny / 无设施 deny)里 **park 那一义的显式判别位**:在场 ⇔ 这条 ask 按 park 路由收尾且墓碑已落(同一把 `approvalId` 仍可走迟到受理)。本包今天只把它镜像进 `TOOL_APPROVAL_FRAME_KEYS_MIRROR` + 类型,**没有**任何消费面 —— 因为它只长在 `tool_approval_complete` 上,而那种帧根本不进卡口(`surfaceToolApprovalFrameAndRespond` 消费的是 `tool_approval`) | `src/hitl/toolApprovalWire.ts`(`ToolApprovalFrame.parked` 声明 + 镜像项,两处 JSDoc 写明理由)· `scripts/run-approval-frame-keys-test.mjs` 的 `AHEAD_OF_ANCHOR` 登记 | 端今天**不要**指望包把「卡失效」改渲成「已转后台候批」——那条投影还没有。🔴 **缺席禁读作「真 deny」**:无店部署 / deny 政策 / 被连坐 VOID 的兄弟都发不出这个键,缺席只是「无 park 证据」。要把它变成一条真投影是**行为面**改动(消费者 = 端的完成帧处理面),按 [C162] 令④ 回 C 板提 |
1526
1528
  | **P-36** | low | **中断文案归一只覆盖 `Operation aborted` 这一串**(#323 症状②,0.43.0;clay 裁定的**明确边界**,不是漏做):同一次用户中断里,**执行前被连坐**的旁观者拿的是 core 的另一串 `operation aborted before execution`,`interrupted_never_started` 族又是第三种;这两族**刻意不并入**中断改写臂 —— core 显式拒绝合并两串向([4973]),两串各承真语义(`Operation aborted` = 执行中被中止 / 该串 = 从未执行),而且它们**各有自己的文案与折叠腿**(端侧的 interrupted-batch 折叠 + 包内 tool_end 中止码词表,🔧 0.72.0 起该词表不再导出)。⇒ 纯取消批里,那两族的 tool_end 今天仍按各自原文呈现 | `src/hitl/frameRouter.ts`(`isUserInterruptRewritable` 的判据①头注 + `isEngineAbortToolEnd` 的两串族说明)· 负控 = `scripts/run-hitl-gate-honesty-test.mjs` F13-d | 端**不要**假定「用户中断 ⇒ 这一批 tool_end 文案全是 CC 中断串」;两族按各自既有腿归因(机读码优先,文案兜底)。要不要并成一形是**语义裁定**不是实现细节,需 clay 先裁 |
1527
1529
  | **P-34** | low | **编辑臂预检判官在浏览器 lane 结构上装不了**(#225 / [5076],0.42.0):`precheckEditedRuleText` 的唯一合法实参是 core 5.57.0 那只纯函数,而 `@sema-agent/core` 的 barrel 值级拉 `node:crypto`/`node:fs`/`node:path` —— 本包**不能**做 value 级 re-export(portability 门 `EXPECTED_PACKAGES_INDEX` 等值门 + esbuild 浏览器腿双重否决,施工时实打验证) | `src/hitl/editedRuleTextPrecheck.ts`(模块头注的「为什么是端口注入」段) | Node 宿主(TUI / desktop 主进程)装上即得内联即时校验;**浏览器 lane 留缺席走「提交后才知道」的往返形**,这是设计不是漏装。🔴 缺席**不可**据以判断部署形态 |
@@ -1541,7 +1543,7 @@ CHANGELOG 0.29.0「已知局限」段与相应 JSDoc 都有成文。**别在读
1541
1543
  | **P-12** | low | canonical 重呈短路臂**沿用 arm responder** ⇒ `ReopenPlanReviewOpts.deliverDecision` 注入口**不生效**(成文例外 + debug 留痕) | `src/hitl/planReviewWire.ts`(`mintFreshQuestionId:false` 分支) | 任何**包装决断投递**的端(重试/退避/上屏定序,cli 的 `decideRetry` 是参照)必须走默认 `mintFreshQuestionId` 臂 —— 否则你的包装被静默旁路,跑的是裸 `decidePlanReview` 的 fire-and-forget |
1542
1544
  | **P-13** | 成文局限(不改行为) | 默认键下的 own-run 归属缺省腿是**进程级**证据,**不区分同一宿主进程内的会话代际** —— `/clear` 前登记的 run 在新会话语境下**仍判 owned**。最坏后果逐字:`用户看到自己旧会话的审批卡` | `src/hitl/parkOwnership.ts`(`ParkOwnershipDeps.isOwnRun` JSDoc);`docs/REFACTOR-LEDGER.md` 记为**驳为成文局限** | 多会话端必须**自注入**会话粒度的 `isOwnRun`;或传非默认 `sessionKey` 并接受缺省腿被整条跳过(代价 = 多一次诚实的 reopen-failed) |
1543
1545
  | **P-14** | high(打包面) | `activeReopenResponders` 的**单活纪律是 module 单例**:两份实例 ⇒ 各退各的,跨份的旧卡退役不掉 —— **退化回修复前的重复活卡形** | `src/hitl/planReviewWire.ts`(`activeReopenResponders`,singleton-manifest 在册) | 见 §8-G:必须保证 bundle 里只有**一份** `@sema-agent/client-core` |
1544
- | **P-31** | 🟡 **部分已解**(0.45.0 / design/285 批 0+1+2+3 落地;残余**一族三格**如实留册) @cli @web @desktop | **已解的半场:fleet 面的会话锚整条换 per-key,而且从写入一直贯到读侧出站。**①开流参数:keyed 宿主的唯一正身 = `createFleetLedger(hooks,{sessionKey}).issueStream()` 发的 **ingress** —— 它在开流那一刻**一次性捕获** `{sessionKey, session, epoch}`,且**帧只能经它进入 ledger**(module 级 `fleetStreamOptions()` / `fleetSnapshotOptions()` 原样保留、语义不动,供单会话默认槽宿主继续用;**刻意不加 `*For` 兄弟**——module 级 keyed helper 与 ledger 的绑定状态互不可见,它测的是「你调了哪个 helper」而不是「流按哪个 key 开」)。重连 = 新 ingress + epoch+1,旧 ingress 的迟到帧丢弃并计 `droppedStaleIngress`;一次性快照走 `issueSnapshot()` + `applySnapshot(await client.fleet.snapshot(...))`(SDK 那只 verb 回的是 `{tasks, workflows}` **不是帧**,帧形在库内合成一处)。**单锚不变量**:一本 ledger 任一时刻只有一个会话锚、且账里的内容属于那个锚 —— stream 模式下 snapshot **继承** stream 的捕获、`issueStream()` **作废**在飞的 snapshot、**换会话必清内容**(stream 与 snapshot-only 两条车道同一套;同会话重连内容一行不清,R7 保住)、**换连接必清连接级 meta**(那四位是 fail-open 方向的连接信任位,沿用 = 重连落到降级节点时广播行被投影、foreign 通知绕过归属门)、`close()` 真的退出流模式;另有**快照顺序令牌**:快照发放后流又落过帧即判过期丢弃,绝不把更新的行 REPLACE 回旧值。②`ownByRoot` 的比对锚换成**本 ledger 的会话锚**(经 ingress ⇒ 该 ingress 的不可变捕获;兼容入口 ⇒ `engineSessionParamFor(sessionKey)` 现读)。⇒ keyed 宿主**自己的**通知不再被判 foreign 丢掉,且带**别人会话**锚的通知按方向判 foreign。③**owner 台账三值原子写**(批 2):两条 fleet 登记腿(行帧 / bg 通知)把 `{runId, sessionId, sessionKey}` **同条**写进 `SubagentOwnerRecord` —— 值取**本 ingress 开流那一刻的不可变捕获**,不是每帧现读某个可变槽(逐帧现读会把重连后旧流的迟到帧写成「旧 runId + 新会话」,那正是 `recordSubagentOwnerFromProgress` 头注明令禁止的错组合;ingress 的 epoch 闸让旧代际的帧根本进不来)。兼容入口 `ledger.applyFrame` 归属不可知 ⇒ 两个新位一个都不写(与 0.44.0 逐字同);同 `runId` 上**缺席不覆盖在场**、`runId` 真变了两位一起丢;同 `runId` 上换会话**不静默** —— 计数与四元组走读口 `subagentOwnerSessionConflicts()`(恒应为 0)。④**读侧全路径按槽取**(批 3):`resolveOwnerContext(childTaskId)` 一次读给出 `{record, runId, key}`,五个取址点(tail / subagentOutput / taskOutput / taskStop / delegatedPrompt)的 **baseUrl / token / principal 一律取 `engineWireTargetFor(owner.sessionKey ?? DEFAULT_SESSION_KEY)`**,不再是零参默认槽;caps 门(`engineTaskHandlesCapable(sessionKey)`)与 `?session=` 同槽。🔴 **BEHAVIOR CHANGE(默认槽也变)**:tail / subagentOutput / taskOutput / taskStop 四条读面的 `?session=` 改为**会话二态** —— 行登记时捕到了会话就用**行的**会话,缺才退本槽现势会话(与 steer 腿既有口径统一)。tick 腿**今天就在默认槽写 `sessionId`**,所以「会话轮换后读旧行」此前是拿现势会话打一条 session-bound 的旧 run = 确定性 404,现在自洽。⑤plan 决策链两处(`armPlanReviewApproval` / `decidePlanReview`)**显式豁免本批**:整条 plan_review HITL 链(卡注册 / 退役 / responder 台账)今天是默认槽单会话形,只换 wire target 会造出「按默认槽立卡、按 keyed 槽发决断」的半 keyed 形,比现状更坏 —— 整条链同批转 keyed 是 additive 公开面改动,归后续工单;现状由常驻钉 `B3-P31/G18b` 两向钉住。🔴 **豁免不等于没有后果,后果如实登记(异源对抗复审 [high] 采纳的半场)**:①**keyed-only 宿主**(只装了 `installEngineWireTargetFor(key, …)`、默认槽为空)上 `armPlanReviewApproval()` 恒返 `false` ⇒ 一条 park 在 `plan_review` 的 run **没有审批入口**,只能等窗口到期/走别的路;②**keyed + 默认槽都装**的宿主上,卡与决断都走**默认槽**的 baseUrl/token/principal —— 与那条 park 住的 run 所属的槽可能不是同一台。⇒ 多会话宿主在 plan-mode 上**今天不可用**,不是「有一点瑕疵」;要用就等整条链转 keyed 的那一批。<br>🔴 **残余(不许读成已闭合)—— 一族三格,同根因同根治**:根因 = **连接级的零内容自校信任位**。宿主把 A 流喂进 B 的 ingress 时,ingress **证明不了帧的来源连接**,而这两位只读 meta、不比对任何会话值:①**通知臂** `server_fail_closed`(meta `bgNotifyFailClosed` ∧ `sessionScoped`)⇒ 在 keyed ledger 上**恒封顶为** `session_anchor_untrusted`;②**行帧车道**的 `sessionScoped` 让位(`ownTaskRow`/`ownWorkflowRow` 命中即整条放行,[1510] 既有裁定)⇒ 同样会让一条被误接的流的行在本键 ledger 上无条件投影。③**`hook_notice` 分发**:`FleetLedgerHooks.onHookNotice(frame, sessionScoped)` 的第二参交出去的就是那一位,回调**既不带锚也不带 evidence** ⇒ 一条被误接的 A 流报 `sessionScoped=true` 时,A 的「本轮守卫未能评估」会带着「已按会话过滤」这句话进 B 的宿主面,端无从自裁(纯 observe 帧,不改状态)。本批**刻意不封顶行帧车道、也不改 `onHookNotice` 签名**(①都非本批引入;②根治与通知臂同一个;③擅自封顶会让已正确接线的 keyed 宿主的行凭空消失,而 additive 第三参是另一批的公开面决定),现状由常驻钉 `B3-P31/R4a`(行帧)与 `B3-P31/R9a`(hook_notice)钉住。唯一真根治 = **上游在 fleet `meta` 帧上 additive 回显本连接的 session id**、本端校验相等 —— **一次修好三条通道**(按 Wire 能力显式表态制单独立项 @server @sdk;本包**不阻塞**) | `src/engineSessionParam.ts`(`engineSessionParamFor`)· `src/fleet/fleetLedger.ts`(`FleetIngress` / `issueStream` / `issueSnapshot` / `ownByRoot` 换锚 / 按臂拆分的可信谓词 / `FleetLedgerStatus` 的 `sessionAnchor`·`sessionAnchorEpoch`·`droppedStaleIngress` / 两条登记腿的三值原子写)· `src/subagentContentStore.ts`(`SubagentOwnerRecord.sessionKey` / `recordBgParentRun` 第四参 / `subagentOwnerSessionConflicts`)· `src/subagent/engineSubagentResume.ts`(`resolveOwnerContext`)· `src/subagent/{engineSubagentTail,engineSubagentOutput,engineSubagentSteer,engineTaskHandleWire,engineDelegatedPrompt,engineRowStopGate,engineCompactWire}.ts` · `docs/INTEGRATION-CLIENTS.md` §6d | 单会话宿主(cli 及今天的三端)**逐字节零受迫** —— 默认槽两条会话级臂与开流参数都与 0.32.0 同,兼容入口 `ledger.applyFrame` 语义不动。**keyed 多会话宿主**:①每键装齐 `installHostFor(key,{session})`(漏装 ⇒ 锚为空,两臂都不解封,`hostPortMissesFor(key)` 会点名);②`issueStream()` 开流、**帧只经 `ingress.applyFrame`**,重连即重开 ingress;③明白 `server_fail_closed` 在 keyed 上**仍封顶**,拿它做有副作用的事(落库/翻卡/跨会话搬运)前按非证据档自裁 |
1546
+ | **P-31** | 🟡 **部分已解**(0.45.0 / design/285 批 0+1+2+3 落地;残余**一族三格**如实留册) @cli @web @desktop | **已解的半场:fleet 面的会话锚整条换 per-key,而且从写入一直贯到读侧出站。**①开流参数:keyed 宿主的唯一正身 = `createFleetLedger(hooks,{sessionKey}).issueStream()` 发的 **ingress** —— 它在开流那一刻**一次性捕获** `{sessionKey, session, epoch}`,且**帧只能经它进入 ledger**(module 级 `fleetStreamOptions()` / `fleetSnapshotOptions()` 原样保留、语义不动,供单会话默认槽宿主继续用;**刻意不加 `*For` 兄弟**——module 级 keyed helper 与 ledger 的绑定状态互不可见,它测的是「你调了哪个 helper」而不是「流按哪个 key 开」)。重连 = 新 ingress + epoch+1,旧 ingress 的迟到帧丢弃并计 `droppedStaleIngress`;一次性快照走 `issueSnapshot()` + `applySnapshot(await client.fleet.snapshot(...))`(SDK 那只 verb 回的是 `{tasks, workflows}` **不是帧**,帧形在库内合成一处)。**单锚不变量**:一本 ledger 任一时刻只有一个会话锚、且账里的内容属于那个锚 —— stream 模式下 snapshot **继承** stream 的捕获、`issueStream()` **作废**在飞的 snapshot、**换会话必清内容**(stream 与 snapshot-only 两条车道同一套;同会话重连内容一行不清,R7 保住)、**换连接必清连接级 meta**(那四位是 fail-open 方向的连接信任位,沿用 = 重连落到降级节点时广播行被投影、foreign 通知绕过归属门)、`close()` 真的退出流模式;另有**快照顺序令牌**:快照发放后流又落过帧即判过期丢弃,绝不把更新的行 REPLACE 回旧值。②`ownByRoot` 的比对锚换成**本 ledger 的会话锚**(经 ingress ⇒ 该 ingress 的不可变捕获;兼容入口 ⇒ `engineSessionParamFor(sessionKey)` 现读)。⇒ keyed 宿主**自己的**通知不再被判 foreign 丢掉,且带**别人会话**锚的通知按方向判 foreign。③**owner 台账三值原子写**(批 2):两条 fleet 登记腿(行帧 / bg 通知)把 `{runId, sessionId, sessionKey}` **同条**写进 `SubagentOwnerRecord` —— 值取**本 ingress 开流那一刻的不可变捕获**,不是每帧现读某个可变槽(逐帧现读会把重连后旧流的迟到帧写成「旧 runId + 新会话」,那正是 `recordSubagentOwnerFromProgress` 头注明令禁止的错组合;ingress 的 epoch 闸让旧代际的帧根本进不来)。兼容入口 `ledger.applyFrame` 归属不可知 ⇒ 两个新位一个都不写(与 0.44.0 逐字同);同 `runId` 上**缺席不覆盖在场**、`runId` 真变了两位一起丢;同 `runId` 上换会话**不静默** —— 计数与四元组走读口 `subagentOwnerSessionConflicts()`(恒应为 0)。④**读侧全路径按槽取**(批 3):`resolveOwnerContext(childTaskId)`(🔧 0.84.0 退出公面)一次读给出 `{record, runId, key}`,五个取址点(tail / subagentOutput / taskOutput / taskStop / delegatedPrompt)的 **baseUrl / token / principal 一律取 `engineWireTargetFor(owner.sessionKey ?? DEFAULT_SESSION_KEY)`**,不再是零参默认槽;caps 门(`engineTaskHandlesCapable(sessionKey)`)与 `?session=` 同槽。🔴 **BEHAVIOR CHANGE(默认槽也变)**:tail / subagentOutput / taskOutput / taskStop 四条读面的 `?session=` 改为**会话二态** —— 行登记时捕到了会话就用**行的**会话,缺才退本槽现势会话(与 steer 腿既有口径统一)。tick 腿**今天就在默认槽写 `sessionId`**,所以「会话轮换后读旧行」此前是拿现势会话打一条 session-bound 的旧 run = 确定性 404,现在自洽。⑤plan 决策链两处(`armPlanReviewApproval` / `decidePlanReview`)**显式豁免本批**:整条 plan_review HITL 链(卡注册 / 退役 / responder 台账)今天是默认槽单会话形,只换 wire target 会造出「按默认槽立卡、按 keyed 槽发决断」的半 keyed 形,比现状更坏 —— 整条链同批转 keyed 是 additive 公开面改动,归后续工单;现状由常驻钉 `B3-P31/G18b` 两向钉住。🔴 **豁免不等于没有后果,后果如实登记(异源对抗复审 [high] 采纳的半场)**:①**keyed-only 宿主**(只装了 `installEngineWireTargetFor(key, …)`、默认槽为空)上 `armPlanReviewApproval()` 恒返 `false` ⇒ 一条 park 在 `plan_review` 的 run **没有审批入口**,只能等窗口到期/走别的路;②**keyed + 默认槽都装**的宿主上,卡与决断都走**默认槽**的 baseUrl/token/principal —— 与那条 park 住的 run 所属的槽可能不是同一台。⇒ 多会话宿主在 plan-mode 上**今天不可用**,不是「有一点瑕疵」;要用就等整条链转 keyed 的那一批。<br>🔴 **残余(不许读成已闭合)—— 一族三格,同根因同根治**:根因 = **连接级的零内容自校信任位**。宿主把 A 流喂进 B 的 ingress 时,ingress **证明不了帧的来源连接**,而这两位只读 meta、不比对任何会话值:①**通知臂** `server_fail_closed`(meta `bgNotifyFailClosed` ∧ `sessionScoped`)⇒ 在 keyed ledger 上**恒封顶为** `session_anchor_untrusted`;②**行帧车道**的 `sessionScoped` 让位(`ownTaskRow`/`ownWorkflowRow` 命中即整条放行,[1510] 既有裁定)⇒ 同样会让一条被误接的流的行在本键 ledger 上无条件投影。③**`hook_notice` 分发**:`FleetLedgerHooks.onHookNotice(frame, sessionScoped)` 的第二参交出去的就是那一位,回调**既不带锚也不带 evidence** ⇒ 一条被误接的 A 流报 `sessionScoped=true` 时,A 的「本轮守卫未能评估」会带着「已按会话过滤」这句话进 B 的宿主面,端无从自裁(纯 observe 帧,不改状态)。本批**刻意不封顶行帧车道、也不改 `onHookNotice` 签名**(①都非本批引入;②根治与通知臂同一个;③擅自封顶会让已正确接线的 keyed 宿主的行凭空消失,而 additive 第三参是另一批的公开面决定),现状由常驻钉 `B3-P31/R4a`(行帧)与 `B3-P31/R9a`(hook_notice)钉住。唯一真根治 = **上游在 fleet `meta` 帧上 additive 回显本连接的 session id**、本端校验相等 —— **一次修好三条通道**(按 Wire 能力显式表态制单独立项 @server @sdk;本包**不阻塞**) | `src/engineSessionParam.ts`(`engineSessionParamFor`)· `src/fleet/fleetLedger.ts`(`FleetIngress` / `issueStream` / `issueSnapshot` / `ownByRoot` 换锚 / 按臂拆分的可信谓词 / `FleetLedgerStatus` 的 `sessionAnchor`·`sessionAnchorEpoch`·`droppedStaleIngress` / 两条登记腿的三值原子写)· `src/subagentContentStore.ts`(`SubagentOwnerRecord.sessionKey` / `recordBgParentRun` 第四参 / `subagentOwnerSessionConflicts`)· `src/subagent/engineSubagentResume.ts`(`resolveOwnerContext` 🔧 0.84.0 退出公面)· `src/subagent/{engineSubagentTail,engineSubagentOutput,engineSubagentSteer,engineTaskHandleWire,engineDelegatedPrompt,engineRowStopGate,engineCompactWire}.ts` · `docs/INTEGRATION-CLIENTS.md` §6d | 单会话宿主(cli 及今天的三端)**逐字节零受迫** —— 默认槽两条会话级臂与开流参数都与 0.32.0 同,兼容入口 `ledger.applyFrame` 语义不动。**keyed 多会话宿主**:①每键装齐 `installHostFor(key,{session})`(漏装 ⇒ 锚为空,两臂都不解封,`hostPortMissesFor(key)` 会点名);②`issueStream()` 开流、**帧只经 `ingress.applyFrame`**,重连即重开 ingress;③明白 `server_fail_closed` 在 keyed 上**仍封顶**,拿它做有副作用的事(落库/翻卡/跨会话搬运)前按非证据档自裁 |
1545
1547
 
1546
1548
  ### 7d. 请求面与其它在册件
1547
1549
 
@@ -1563,7 +1565,7 @@ CHANGELOG 0.29.0「已知局限」段与相应 JSDoc 都有成文。**别在读
1563
1565
  | **P-25** | 结构 | 类型小环 1 条:`seam → turnUsageToModelUsage → adapter/types → seam` | `docs/REFACTOR-LEDGER.md` 在册 | 纯类型环,无运行时影响;端无动作 |
1564
1566
  | **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
1567
  | **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 板 |
1568
+ | **P-28** | 🟡 med → **plan-review 半场已解(0.84.1)**,子代族半场 pending | `same-origin-relay` 只放宽了 `EngineWireClientConfig.token` 与 `LiveWorkflowConfig.authToken` 两个入参面,`EngineWireTarget.token` 仍是 `string`(`installEngineWireTarget()` 是非 Node 宿主唯一的装配入口)。**0.84.1 起**:plan-review 三口(`decidePlanReview` / `armPlanReviewApproval` / `reopenPlanReviewCard`)与两只探针(`engineSupportsTaskAgents` / `probeScenarioTools`)收注入 client(§5d 入参面表末两行;§108),浏览器同源中继宿主把自己的中继 `AgentClient` 交进来即可,包内不接触任何凭证。**仍未放宽**:经 `engineWireTarget()` 取址的子代族 8 处 + resume 族 3 处(`engineSubagentTail.ts` / `engineSubagentSteer.ts` / `engineSubagentOutput.ts` / `engineCompactWire.ts` ×2 / `engineTaskHandleWire.ts` ×2 / `engineDelegatedPrompt.ts` / `engineSubagentResume.ts` ×3)在同源反代部署下没有合法凭证形可传,失效形按 §5d 末两表 B / C 档(构造失败吞成 `null`、不抛) | `src/hitl/planReviewWire.ts`(注入形)· `src/engineWireSdk.ts`(`EngineProbeOpts.client`)· `src/engineWireTarget.ts`(`EngineWireTarget.token`,未动)· §5d 的两表 | 浏览器同源宿主:plan-review 与两只探针走注入 client(§108d);子代族动词**别指望在 relay 部署下发得出去**,也**不要**把「动词没反应」读成「引擎没这个能力」。🔴 子代族的正位解仍在包侧(共用构造点收编 + 注入,候票),**不许端侧侧路补救** |
1567
1569
  | **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
1570
  | **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
1571
 
@@ -1688,7 +1690,7 @@ reason 里写明「枚举器盲区形」。已知两形:
1688
1690
 
1689
1691
  **E. 上行与回执(§4,最容易漏)**
1690
1692
  - [ ] 请求一律经 `buildTaskRequest(input, lane)`,**不自拼字面量**;上 wire 前过 `unregisteredRequestKeys(req, lane)`
1691
- - [ ] 接审批帧腿时**填 `AskGateWireDeps.approvalLane` 的四位**(0.43.0 起不再是 note-only):`approvalDecisionNoteCapable`(缺席 = `note` 恒不发)· `respondFreeFormRulesCapable`(缺席 = **编辑臂**整条不发)· `respondBatchRuleOffersCapable`(缺席 = **批臂**整条不发)· `windowIsCurrent`(缺席 = 卡上**无倒计时**)。**全部 fail-closed 且不报错**;两条规则臂被丢时包会发 `surfaceRuleArmNotSent()`(要看得见得先装 `HitlHostSurface` 口)。逐位后果表见 §5b 的供给链段,新鲜度纪律见 §7 **P-40**
1693
+ - [ ] 接审批帧腿时**填 `AskGateWireDeps.approvalLane` 的四位**(0.43.0 起不再是 note-only):`approvalDecisionNoteCapable`(缺席 = `note` 恒不发)· `respondFreeFormRulesCapable`(缺席 = **编辑臂**整条不发)· `respondBatchRuleOffersCapable`(缺席 = **批臂**整条不发)· `windowIsCurrent`(缺席 = 卡上**无倒计时**)。**全部 fail-closed 且不报错**;两条规则臂被丢时包会发 `surfaceRuleArmNotSent()`(🔧 0.84.0 退出公面)那一条通知(要看得见得先装 `HitlHostSurface` 口)。逐位后果表见 §5b 的供给链段,新鲜度纪律见 §7 **P-40**
1692
1694
  - [ ] ack 五位按 §4a 三列表消费:**缺席一律当未知**,`rememberApplied === false` 与 `updatedInputForwarded === false` 必须响亮告知
1693
1695
  - [ ] durable 腿:`decideTool` 前把**呈卡用的那一行** pending 经 `preResolvedPending` 传进去(TOCTOU)
1694
1696
  - [ ] durable 腿:**按意图**选动词 —— 否掉这一道门用 **deny**(run 继续),终结整条 run 用 **`runs.cancel`**(server [868] 起对 suspended/needs_review 就地取消;409 只剩 CAS race)。⚠️ 0.36.0 修:原行写的「取消 suspended 必须用 deny、绝不 cancel」已被 SDK 7.1.0 标 stale,详见 §4 「cancel vs deny」行
@@ -9614,6 +9616,668 @@ installCoreValuePorts({ resolveAutonomousLoopPrompt, loosenReasons, combinePolic
9614
9616
 
9615
9617
  **包侧缺口:** ① 出包面注释存量(别仓名 / 票号 / 帖号 / 过程词)与卫生门判据太窄(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
9618
 
9619
+ ## §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` 不动)
9620
+
9621
+ > **patch**,九件同发,零 BREAKING、零编译期前置改动(本节按 0.84.1 的读法写;若与本版发布帖不一致,以发布帖为准):
9622
+ > ① **开标签定位口**(CC-210):§104 起本包只公开「剥离 / 解包」两个动作,开标签文法不上公面(§104 包侧缺口 ⑦)。要按开标签把消息切成块的端因此只能自持文法,或拿剥离口派生判定。本版公开定位口 `findSystemReminderOpenTag(text, from?)`,与剥离 / 解包两口同一个判定;端拿到的是位置,文法常量本身仍不上公面。
9623
+ > ② **detach durable-off 400 纯判定**(CC-219):`detachDurableOffHint` 被进程级的 `isDetachArmed()` 门住(只有终端 `-p` 车道真拼上头时才 arm),浏览器 / 桌面拿不到这个判定。本版把判定抽成不带进程门的 `isDetachDurableOff400(err)` 上公面,`detachDurableOffHint` 改为包它。纯判定一律不抛,包装层因此也不再因「读属性会抛错」的错误对象而抛(此前抛;其余输入逐字不变)。
9624
+ > ③ **服务端自铸通告码 + 按码派发口**(CC-213 / CC-214):服务端经同一条通告通道投它自己铸的码(服务端 7.101.0 起两枚)。修前本包只认引擎码册 ⇒ `instructions.source_changed` 被判「册外 / `operator`」。本版加一张服务端自铸码表,在册判据与受众读口同认,并给这枚码的事实读器;七只事实读器(八个码;0.84.0 的读目录授权结论读口一只挂两码)另有一个按码派发的总口,按码判别的联合,只有受众 `user` 的码属用户面。
9625
+ > ④ **停泊审批决断 422**(CC-225):读口 + 按成因分说的一句话 + 「同一个决定不重发、deny 照开」判定,四个决断出口补句;这枚码不再被「门已决」扫词臂误判(码优先)。
9626
+ > ⑤ **拒启会话的出路**(CC-229):引擎在每一跑的**准备阶段**对这一跑的每一层规则名字做一次审计 —— 调用方策略、会话规则记录、父会话的规则记录、冻结约束、技能范围。名字不在这一跑的工具名单里时,两类名字硬失败,码 `config.legacy_tool_name`:引擎退役名;含 `__` 而不以协议前缀(今天是 `mcp__` / `a2a__`,区分大小写)开头的名字。会话规则记录里交给这道审计的是 `toolDeny` 与 `toolAllow` 两只桶。0.83.6(§106)在写之前扣下这两类;本版是**已经写进去**那一侧:窄撤销动词(必交这台部署一跑的工具名册 —— 名册里有的名字引擎照认,不撤)+ 八臂措辞 + 启动失败出路句 + 判据本体。
9627
+ > ⑥ **plan-review 编排收注入 client**(CC-209;§7 P-28 的 plan-review 半场):公面只增(全部可选位),旧签名逐字节同答;行为面的新分支是「给了注入连线」那一形,另有一处两条路共改:决断撞上请求时限那一臂的结局正文(「已送出、时限内没有答复」)。两只能力探针同样收注入 client;本包经注入 client 的读都有独立落定的截止。
9628
+ > ⑦ **拒绝清单少列**(CC-235):入参被传输层脱敏过的拒绝此前只在超集载体上,只读 CC 形清单的消费方少数一条;本版照列、带脱敏标记。真没有入参对象的几类不变。**读法变化**:§66 G2 / G3 作废(108a′)。
9629
+ > ⑧ **凭据读法两处放行收口**(CC-234):值左邻是不可见单字时地址形的值不再按地址豁免(`scheme://` 留、主机与路径换记号);`@` 右边主机位被可剥单元占住、没有主机时照算 userinfo(候选挂在凭据标签 / 方案词上时让给标签那一遍整只遮,与 0.84.0 同答)。输出字节与 0.83.4 不完全相同 —— 判据请按「不含值」写。
9630
+ > ⑨ **门夹具第二批 + 扁平终帧棘轮 + 权威信封标签对账**(CC-233 / CC-230;只改门):出包面零变化,三端与管理台零动作。
9631
+ > **表态现势**:patch,全速模式,不设表态窗;到货点名两处 —— 网页端删端侧重建的 plan-review 编排(⑥,108d);管理台删本地同名的 detach 判定改从本包导入(②,本包同名影子对账门的过渡登记到 0.85.0 为止)。
9632
+
9633
+ ### 108a. 处置表
9634
+
9635
+ 包处置列:`added` = 本包自有面本版新增;`changed` = 本版改(括注改的是什么);`consumed` = 本版读上游的 wire 事实;`不变` = 回归约束;`pending` = 候上游 / 候包侧另批;`gates` = 只改门。各端列:`pending` = 有读点待改(格内注明必改与否);`n/a` = 该端零读点或零改动即得(按本机克隆的只读检索,见 108d 的日期)。
9636
+
9637
+ | # | 面 | 包处置 | 旧 → 新 | 终端 | 网页端 | 桌面端 | 管理台 | 验收方 | 本节 |
9638
+ |---|---|---|---|---|---|---|---|---|---|
9639
+ | 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 |
9640
+ | O-2 | `stripSystemReminderBlocks` / `unwrapSystemReminder` | 不变 | 开标签识别改走与 O-1 同一个判定;**行为不变** | n/a | n/a | n/a | n/a | 回归约束 | 108a-1 · G-O6 |
9641
+ | 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 |
9642
+ | 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 |
9643
+ | 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 |
9644
+ | N-2 | `engineNoticeInCatalog(code)` / `noticeAudienceOf(code)` | changed(多认两码) | 只认引擎码册 → 引擎码册 ∪ 服务端自铸码表;查表序引擎先;两表之外仍保守 `operator` | 零改动即得(册外兜底分流那一格:`instructions.source_changed` 从「只落调试」变「册内通用行」,受众从 `operator` 变 `user`) | 零改动即得(今天零读点;接通知面时按受众分发就读这一口) | 零改动即得(同左) | 零改动即得(同左) | pending | G-N2 / G-N3 |
9645
+ | N-3 | `readInstructionsSourceChanged(notice)`;型 `InstructionsSourceChangedFactsView` | consumed | 无 → 事实读器(三格必填,`previous` / `current` 可为 `null`) | pending(机读车道与交互车道的专属行经 D-1 读;单独调本口亦可) | pending(用户通知面) | n/a | n/a | pending | G-N4 / G-N5 |
9646
+ | 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 |
9647
+ | D-2 | `ENGINE_NOTICE_FACT_READERS`(冻结,码 → 读器) | added | 无 → 派发表(八行;七只读器,读目录授权结论读口挂两行) | n/a(判「这个码有没有 typed 读数」用 `Object.hasOwn(ENGINE_NOTICE_FACT_READERS, code)`;不要抄一份码名单) | 同左 | n/a | 同左 | pending | G-D1 |
9648
+ | D-3 | `readReadRootGrantNotice(notice)` 入参型 | changed(型放宽) | `{ code?, detail? } \| null \| undefined` → `unknown`(非破坏;读法与返回值不变) | 零改动即得 | 零改动即得 | n/a | 零改动即得 | n/a | G-D6 |
9649
+ | 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 |
9650
+ | P-2 | `parkedResumeStartupContent(detail)` | added | 无 → 措辞单源(两句) | pending(说这一句,不自铸) | pending | pending | n/a | pending | 108a-3 · G-P4 |
9651
+ | P-3 | 读数上 `resendable: false` / `denyStaysOpen: true` | added | 无 → 判定(恒值) | pending(决断重试那一处:本码不自动重发;卡上 deny 保留) | pending(同左) | pending | n/a | pending | G-P5 |
9652
+ | P-4 | 包内四个决断出口的失败文字 | changed(补句) | `…failed: <原句>` → 本码时 `…failed: <原句> — <那一句>`;别的码逐字节不变 | 零改动即得(审批卡两条腿 / 提问卡腿 / 中断撤卡上屏行) | n/a(不走包内决断出口) | n/a | n/a | pending | G-P6 / G-P7 |
9653
+ | P-5 | `isCodeClassifiedGateFailure(code)`;包内停泊审批腿的「门已决」判定 | changed(码优先) | 扫词前只问 `isGateStandingErrorCode`(两码)→ 扫词前问本判定(两码 ∪ 本码);本码时不再按失败文字判「门已决」、不重连 | pending(自有「门已决」判据链:扫词之前问本判定;失败文字被拍平、读不到机读码的那条路,按 SDK 错误类名 `ParkedResumeStartupError` 兜底) | n/a(不走包内停泊腿;自有判据链时同左) | n/a | n/a | pending | 108a-3 · G-P8 / G-P9 |
9654
+ | 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 |
9655
+ | E-2 | `sessionPolicyRemovalNotice(outcome)` | added | — → 八臂措辞(108a-5;撤成那句按桶分说) | pending(随 E-1) | n/a | n/a | n/a | pending | 108a-5 · G-E6 |
9656
+ | 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 |
9657
+ | E-4 | `isEngineRefusedToolName(name)` | added | — → 引擎准备期按名字拒启的判据本体 | pending(可见段标坏行用它,不要自己判) | n/a | n/a | n/a | n/a | 108a-4 |
9658
+ | E-5 | `CONFIG_LEGACY_TOOL_NAME` | added | — → 码常量 `'config.legacy_tool_name'` | pending(换掉壳侧同值常量) | n/a | n/a | n/a | n/a | 108a-6 |
9659
+ | E-6 | `CONFIG_REFUSAL_CODES` | changed(+1 员) | 七员 → **八员**(+`config.legacy_tool_name`,排在最后) | n/a(按 `.has` / 前缀判即得) | n/a | n/a | n/a | pending(按「恰七员」或逐员逐序断言的改锚) | 108a′ |
9660
+ | 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 |
9661
+ | W-2 | `DecidePlanReviewOptions.reason` | added | 无 → 随决断上送 `PlanReviewRequest.reason`;trim / 空白与非串不落 / 超 4096 截断;去键重发保留;任一决断都可带 | 零改动(卡上无理由位) | 接:reject ⇒ `"rejected by user"`、revise ⇒ 反馈原文(与今天 `bodyOf` 同) | — | n/a | pending | G-W4 |
9662
+ | W-3 | `PlanReviewDeliveryOptions.onOutcome(outcome)`;型 `PlanReviewDecisionOutcome` | added | 无 → 结局交回宿主(与队列口并行;八键;`prompt` === 队列项 `value`;`status` 读到才落键);被闩拒不回调;队列口缺席 + 有回调 ⇒ 不打 error 级 MISSED | 可选(队列口在,零改动) | 🔴 接:按 `effect` 渲今天的人话回执(`took_effect` 静默、其余四句),删本地 `classifyPlanReviewEffect` 与回拉(108d 网页端 ①) | — | n/a | pending | G-W5 |
9663
+ | W-4 | `armPlanReviewApproval` 的 `opts.wire` / `opts.onOutcome`(命名形 `ArmPlanReviewOptions`) | added | 无 → 在场判看注入 client;CC-46 三选卡的证据键 = `wire.capsBaseUrl`(不给 ⇒ 老两选,不回落已装目标);responder 递交时原样带 | 零改动 | 候(网页端首呈卡今天走自家 `buildParkSurface`,不经 arm;换到包内首呈另立票) | — | n/a | pending | G-W2 |
9664
+ | 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 |
9665
+ | W-6 | `EngineProbeOpts.client`(型 `EngineProbeClient`) | added | 无 → 两只探针直接用注入 client,`timeoutMs` 是独立落定的截止(到点答「不知道」并中止底层请求);凭证位不读 | 零改动 | 接(有调这两只探针时);今天零读点 | — | n/a | pending | G-W7 |
9666
+ | W-7 | 已装目标那条路(`EngineWireTarget` / `makeEngineWireClient` / 三口不带新位) | 不变 | 逐字节同 0.84.0(决断撞上请求时限那一臂除外,见 W-9) | 回归约束 | — | — | — | 回归约束 | G-W8 |
9667
+ | 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 |
9668
+ | W-8 | 子代族动词(tail / steer / output / compact ×2 / task handle ×2 / delegated prompt / resume)在中继部署下 | **pending**(包侧缺口) | 仍只吃已装目标;候「共用构造点收编 + 注入」 | — | 不接(今天零读点) | — | — | — | §7 P-28 · 包侧缺口 |
9669
+ | 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 |
9670
+ | 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 |
9671
+ | PD-3 | `_sema_permission_denials_absent` | changed(落下条件) | 语义不变(= CC 那条清单不可声称完整);这一类不再让它落下 | 零改动即得(两键合读的读法不变:`[]` + 缺席 = 零拒绝) | n/a | n/a | n/a | pending | G-PD1 / G-PD5 |
9672
+ | PD-4 | `_sema_tool_input_source` | changed(在场条件) | 语义不变(只说来源);在场条件放宽到被脱敏过的入参 | 零改动即得 | n/a | n/a | n/a | pending | G-PD1 |
9673
+ | K-1 | 标签 / 方案词后、紧贴值夹不可见单字的地址形值 | changed(输出字节) | 按地址豁免(主机 / 路径原样)→ `scheme://` 留、主机与路径换 `«redacted:secret»`、query / 片段照旧换记号 | 经本包的合成终局行 / 结果帧 `errors[]` 升级即净;终端自带的呈现出口不在本版射程 | 零直接读点;经适配层的机读口升级即净 | 不在射程(钉的版本早于呈前出口) | 三种载体(正文 / 单行 / 字段)零改动即净;钉现状的提货格按预期翻红 → 翻面 | pending | 108a-8 · G-K1 / G-K2 |
9674
+ | K-2 | `user:<口令>@` 后主机位被可剥单元占住、没有主机 | changed(输出字节) | 不算 userinfo(口令原样)→ `«redacted:userinfo»@…`;候选挂在凭据标签 / 方案词上(是它的值或吞了它一截;标签被单元拆开也算)⇒ 让给标签那一遍整只遮(与 0.84.0 同字节) | 同上 | 同上 | 同上 | 同上 | pending | 108a-8 · G-K3 / G-K6 / G-K7 |
9675
+ | F-1 | 门夹具的 `done` 终帧形(六套:权限拒绝投影 / 流式计时 / 终态身份文案 / 终答补差 / 停泊决断 422 / 纯函数总套余下部分) | gates | 退役平面形 → 现役因由形 `result.terminal`;前后检查数逐一相同 | n/a | n/a | n/a | n/a | n/a(门内自证) | G-F1 |
9676
+ | F-2 | 合法扁平帧(409 拒绝信封 / 回放面)29 处 | gates | 无注 → 逐格注 `// 409:` / `// 回放面:` | n/a | n/a | n/a | n/a | n/a | G-F2 |
9677
+ | F-3 | 新门:扁平终帧未注位点棘轮 | gates | 无 → 上限 23,只降 | n/a | n/a | n/a | n/a | pending(可按 G-F3 自跑) | G-F3 |
9678
+ | F-4 | 新门:权威信封标签镜像 ⇄ 引擎表双向对账 + 三车道拆火消费面 | gates | 无门 → 常驻门(过渡读法) | n/a | n/a | n/a | n/a | pending(可按 G-F4 自跑) | G-F4 |
9679
+
9680
+ F-1 – F-4 只改门:那一件的 `src/` 零改动,dist、根公面、措辞都不因它变;同事正文的拆火行为(转录行里权威标签 `<` 后插零宽空格)逐字节不变,本版只是给那张表补了对账门,按 §17 接同事三车道的端零改动。
9681
+
9682
+ #### 108a-1 · 开标签定位口
9683
+
9684
+ - 文法与 104a-1 同(两形 + 七种不认的形),与剥离 / 解包两口是**同一个判定函数** —— 三口对「哪一处是开标签」永远同答。
9685
+ - `findSystemReminderOpenTag(text, from = 0)`:回 `start ≥ from` 的第一枚开标签的 `{ start, end }`(UTF-16 下标;`end` = 开标签后一位,`text.slice(start, end)` 恰是那枚开标签);没有回 `null`。`from` 落在一枚开标签内部时,那一枚不认。
9686
+ - 截断:开标签要整枚在场才认 —— 串尾的 `<system-reminder`、`<system-reminder mark="AbCd`、`<system-reminder mark="<22 位>"`(少 `>`)都不认;截断形后面紧跟一枚完整开标签时认后面那枚。
9687
+ - **与块上下文无关**:块正文里的字面开标签(引擎铸块时不转义正文)、没闭合的开标签、嵌套的内层开标签都认。本口只答「开标签在哪」,不答「它是不是一块的开头」。要与剥离口同块语义地切块,按下面的循环(从闭标签尾接着找,块里的字面开标签自然被跳过):
9688
+
9689
+ ```ts
9690
+ const CLOSE = '</system-reminder>'
9691
+ let i = 0
9692
+ for (let open = findSystemReminderOpenTag(text, 0); open !== null; ) {
9693
+ const close = text.indexOf(CLOSE, open.end)
9694
+ if (close === -1) { /* 截断块:归块还是归正文由端定(剥离口原样留作正文) */ break }
9695
+ // 正文:text.slice(i, open.start);块体:text.slice(open.end, close)
9696
+ i = close + CLOSE.length
9697
+ open = findSystemReminderOpenTag(text, i)
9698
+ }
9699
+ // 余下正文:text.slice(i)
9700
+ ```
9701
+
9702
+ 这个循环与剥离口逐字节同答(门 F3 格)。「删掉一块后从串头重找」的写法两处与它不同:每删一块都重扫一遍(块多时平方),而且删块后两侧的字节拼在一起可能拼出一枚新的开标签;按上面的循环从原串的闭标签尾接着找,两处都没有。
9703
+ - 线性:单次调用一趟扫到命中或串尾;按上面的循环逐枚找完整串,总开销线性。
9704
+ - 入参:`text` 非串 ⇒ `null`(不强转;`String` 包装对象、带 `toString` 的对象同);`from` 的合法域 = 0 ≤ `from` ≤ `text.length` 的整数(缺席 = 0),域外(负数、小数、`NaN`、`±Infinity`、非数)⇒ `null`。都不抛。
9705
+
9706
+ #### 108a-2 · detach durable-off 400 纯判定
9707
+
9708
+ - `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 抛出的错误直接调即可。
9709
+ - 🔴 **不认码**:这条拒绝带 `errorCode: 'request.precondition_unmet'`,但那是通用前置条件码 —— 同一条 `POST /v1/tasks/stream` 上与 detach 头无关的拒绝也用它(device 部署首轮没有会话、带 `deviceId` 而部署不在用户设备上执行、cascade 没配梯子)。按码判 = 对那些拒绝静默去头重发一次、说一句「没有耐久 run」的假话。
9710
+ - 不读进程台账:与 `isDetachArmed()` 无关,任何宿主都能调。`detachDurableOffHint(err)` = `isDetachArmed() ∧ isDetachDurableOff400(err)` ⇒ 提示行;两者在 armed 时同答。
9711
+ - 读法:`status`、`message` 按普通属性读 —— 原型链上的属性也认,函数对象带这两位也认。每个属性至多读一次,先读 `status`,不是 400 就不读 `message`。
9712
+ - **一律不抛**:非对象 / `null` / 缺字段 / `message` 非串 ⇒ `false`;读属性时 getter 抛错、Proxy 陷阱抛错、已撤销的 Proxy ⇒ `false`(不外抛、不重试读)。宿主通常在 `catch` 里调它,判定自己再抛会把原本那一枚错误遮掉。`detachDurableOffHint` 随之对这类对象回 `null`(此前已 arm 时原样抛出)。
9713
+
9714
+ #### 108a-3 · 422 `parked_resume.startup_failed` 的两种成因与读口怎么选句
9715
+
9716
+ - 成因 ①:续跑没起来 —— 被停泊的代理会话没了(这一形里那一行已不可再决),或引擎拒了这次决断本身(例如答案挂错了问题);成因 ②:停在一只「代理从发起它的任务继承来的工具」上的**批准**,这台服务端交不出那只工具 —— 同一个批准永远不会成,卡留在待决列表,deny 照样能结掉它(服务端对一层代理已能交出,更深层的代理与发起会话已删除或换了主人的行仍落这一形)。
9717
+ - 回体只有 `error`(引擎正文)/ `errorCode` / `taskId` / `rollback`,**没有**成因位;本包不按正文分臂。
9718
+ - `decision: 'deny'` ⇒ `cause: 'resume_rejected'`(成因 ② 只对批准出)⇒ 句子只说成因 ①:「重取待决列表,卡还在就从新列表再决」。
9719
+ - `decision: 'approve'`、未声明、或表外值 ⇒ `cause: 'undetermined'` ⇒ 句子摆两条出路:「引擎拒了这次决断本身 ⇒ 改正后再决;批准的是继承来的工具 ⇒ 再批在这台服务端上不会成,拒掉或等服务端升级」。
9720
+ - 两句的第二段相同:这次拒绝**不说**卡是否还在 —— 先重取待决列表。
9721
+ - **码优先**:本码的失败文字里是引擎原句;会话没了那一形恰含「Session not found」,会命中「门已决」扫词表(`no pending checkpoint` / `resolved` / `already` / `not found`)。本码不走那张词表:它既不是「门还在」(不进 `isGateStandingErrorCode`),也不是「门已决」,是「启动期失败、先重取待决列表」。
9722
+
9723
+ #### 108a-4 · 撤销动词
9724
+
9725
+ - **名册必交**:`removeRefusedSessionRules(facade, sessionId, roster, opts?)` 的 `roster` 是这台部署上一跑的工具名册(`wiring_manifest` 经 `projectToolRoster` 读出的 `ToolRosterView`)。引擎准备期那道审计先问「名字在不在这一跑的名册里」—— 集合 = 每行的 `name` ∪ 该行的 `aliases`,**原样比、分大小写**(`task` 不豁免 `Task`)—— 在就放行,两类硬失败都不走。部署自己挂了一只恰叫退役名的工具(如一只叫 `Task` 的自定义工具,或别名恰是 `KillShell` 的工具)时,记录里那一条是**生效的**限制;本动词因此只撤「判据本体说会拒 ∧ 名字不在名册里」的条目。
9726
+ - 名册缺席(`undefined` / `null`)⇒ `roster_required` / `absent`;交了但读不成名册(不是对象、`entries` 不是数组、任一行没有非空串名字、`aliases` 在场却不是串数组、读属性就抛)⇒ `roster_required` / `unreadable`。两形都**一个请求都不发**(读都不读)。绝不半张名册:少读一行 = 把那只工具当没挂 = 多撤一条生效的限制。读得懂的空名册(一只工具都没挂)是名册,照常判。
9727
+ - 名册从哪来:因 `config.legacy_tool_name` 启动失败的那一跑在交出装配清单**之前**就停了(引擎先审计、后铸清单),交不出名册;取这条会话 / 这台部署上最近一次过了准备阶段的一跑的清单。两跑挂的工具不同时按交来的那一份判(KL-182)。
9728
+ - **做什么**:`GET` 当前记录(窄读同 `readSessionPolicy`)→ 在 `toolDeny` / `toolAllow` 里拿掉 `isEngineRefusedToolName` 判「会拒」且名字不在名册里的条目(同一桶里重复的同名条目全拿掉、结局里只记一次)→ 带读到的版本号 `PUT` 整份记录 → 回执对账(版本号推进、留着的条目都在、撤掉的条目**不在**)。
9729
+ - **不做什么**:不删别的条目(通用删除在属主身份上是放宽,引擎照拒);不碰命令桶 / 目录桶(不进那道审计);不改写成现名(往白名单里加名字是放宽;往禁止名单里加现名交给用户自己决定);不读能力位、不按引擎版本猜。
9730
+ - **判据用本体,不用 `legacy_tool_name` 判词**:判词排在逐条判据最后,` foo__bar` / `foo__*` 先被判成 `not_a_tool_name` / `wildcard`;这些形照样让引擎拒启,按判词撤会漏掉它们、会话照样起不来,还会答一句「没有要撤的」。
9731
+ - **两代引擎**:
9732
+ - 老引擎:普通调用方从 `toolDeny` 里删任何一条都算放宽 ⇒ `loosen_forbidden`,**记录不变**(恰写一次、不重试)。只有 `toolAllow` 里有坏行时,删它是收紧方向 ⇒ 撤得成。运营方身份两种都撤得成。
9733
+ - 较新的引擎(宣布「删一条引擎会拒启的名字不算放宽」之后):普通调用方也撤得成。
9734
+ - **结局**:
9735
+
9736
+ | `kind` | 什么时候 | 记录 | 附带 |
9737
+ |---|---|---|---|
9738
+ | `roster_required` | 名册缺席(`why: 'absent'`)或读不了(`why: 'unreadable'`) | 没读、没写 | `why` |
9739
+ | `removed` | 回执读得懂且对得上 | 撤掉的条目已不在,版本号 +1 | `rev`(新版本号)、`removed`(撤掉的条目,按桶名全集的序、桶内按记录序,非空) |
9740
+ | `nothing_to_remove` | 两只桶里没有「会拒且名册里没有」的条目 | 没写 | `rev`(读到的版本号) |
9741
+ | `loosen_forbidden` | 引擎把这次删除判成放宽 | 不变 | `message`(引擎原文)、`refused`(本想撤的条目) |
9742
+ | `conflict` | 重读重写一次之后仍被并发键挡住 | 没写 | `rev`(第二趟依据的版本号) |
9743
+ | `read_failed` | 当前记录读不到 / 读不懂 | 没写 | `why`、可选 `message` |
9744
+ | `write_refused` | 引擎带码拒了这次写(客户端侧拒绝都在落盘之前) | 没写 | `why`、可选 `message` |
9745
+ | `write_unconfirmed` | 裁决没到手(裸抛 / 断连 / 5xx / 不带码的 4xx)或回执读不懂 / 对不上 | **可能已经生效** | `why`、可选 `message`;再调一次即核对 |
9746
+
9747
+ `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`}。
9748
+
9749
+ #### 108a-5 · 撤销措辞
9750
+
9751
+ `sessionPolicyRemovalNotice(outcome)` 八臂各一句(失败臂与名册臂按 `why` 再分几句):
9752
+ - `roster_required`:什么都没改;没有名册(或读不了),看起来会拒的名字可能是这台部署自己挂的工具,撤了会放宽一条生效的限制;`absent` 那句指路「交这条会话在这台部署上一跑的名册(启动失败的那一跑不交名册)」,`unreadable` 那句指路「按装配清单读出的原样交」;
9753
+ - `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 列表」;
9754
+ - `nothing_to_remove`:什么都没改;若仍启动失败,那一条在这条记录管不到的地方(随跑设置 / 父会话规则记录 / 部署自己的工具规则),或是本版还不认得的新拒启名,或失败那一跑没挂交来的名册里同名的那只工具;
9755
+ - `loosen_forbidden`:这台引擎上只有运营方能从会话规则记录里删条目,记录没变;找运营方,或换一个新会话继续;
9756
+ - `write_unconfirmed`:可能已经生效,再跑一次撤销(它会重读,生效了就答没有要撤的);
9757
+ - 其余:什么都没改(规则店故障那句另说需要运营方看一眼规则店)。
9758
+
9759
+ 纪律:零用户字节(条目原串与引擎原文都不进句子;要摆哪几条由宿主对 `removed` / `refused` 取);表外值回通用句,不抛。
9760
+
9761
+ #### 108a-6 · 启动失败出路句
9762
+
9763
+ `legacyToolNameFailureNoteOf(code)`:`code === 'config.legacy_tool_name'` ⇒ 下面这一句,否则 `undefined`(别的 `config.*` 码不在这里答)。
9764
+
9765
+ `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.`
9766
+
9767
+ - 码从哪取由宿主定:结果帧的超集键 `_sema_error_code`(0.83.0 起;此前骑 `errorCode`)、`readRunTerminal` 读数 `failed` 臂的 `code`、子代工具结果的 `errorCode` 都行。
9768
+ - 句子不断言「一定在会话规则记录里」:同一枚码也从调用方策略那一层来(G-E8 实跑);会话规则记录排第一是因为它是撤销动词管得到的那一处。
9769
+ - 不点名谁能删:会话规则记录里那一条,老引擎上只有运营方能删、较新的引擎上属主可删;撤销动词的结局会说出这一台的答案。
9770
+ - 不回显名字、不读引擎原文(那一行已在失败文字里,且点了名)。
9771
+
9772
+ #### 108a-7 · 哪几类拒绝在 CC 形清单上、哪几类不在
9773
+
9774
+ - **在**(三键齐):入参来自账本(今天没有)或同一条流的 `tool_start`,且是普通对象、扫描在预算内(节点 ≤ 20000、深度 ≤ 80)。其中被传输层动过的(字符串叶含 `«redacted` 前缀的记号,或叶值恰为 `[circular]` / `[depth-limit]`)**本版起也在**,条目带 `_sema_tool_input_redacted: true`。
9775
+ - **不在**(只在 `_sema_permission_denials`,`tool_input` 缺席,`_absent: true`):行无 `toolCallId` · 本流没见过那只 `tool_start` · 同一个 id 两份不同入参 · 入参不是普通对象 · 超扫描预算(含「被动过 ∧ 超预算」)· 本流快照溢出 · 流内补行工具名读不出。这几类手里**没有**一只可交出的入参对象;本包不编。
9776
+ - 为什么收「被动过」那一类而不收「没有对象」那几类:前者本包手里有对象,而且同一条输出流里已经把它当 `tool_use.input` 交出;在拒绝清单里再拒收同一只对象,换来的只是条数错。后者手里什么都没有,填 `{}` 是编造一个「入参为空」的事实。
9777
+ - 严格的消费方:CC 数组元素上多出的超集位(`_sema_tool_input_source` / `_sema_tool_input_redacted` / `_sema_tool_arg` / `deniedBy` / `toolDenialKind`)在缺省的对象校验下被剔掉;对元素做「禁止未知键」形校验的消费方会判非法 —— 这一风险自 0.73.4 起就在(不是本版新引入)。
9778
+
9779
+ #### 108a-8 · 凭据读法两处收口的判据(逐条)
9780
+
9781
+ 1. **不可见单字** = 判别视图里的可剥单元中,完整转义序列(CSI / nF / Fp / Fe、已结尾的控制串、被下一枚单元截断的序列前缀)以外的那些:格式类字符(`\p{Cf}`)、孤代理项、非空白控制符(C0 除 `\t` `\n` `\v` `\f` `\r`、DEL、C1)、没接成序列的 ESC / C1。原字与本出口画出的可见转义形(`\uXXXX` / `\u{…}`)同判;空白码位的转义形(`\u000A`、`
` 等)与原字同判,算空白。
9782
+ 2. **地址形** = 值以 `scheme://`(scheme 2–16 位)打头,或以 `«redacted:userinfo»@` 打头。
9783
+ 3. **紧贴** = 值起点左边连着的那一串可剥单元里至少有一枚不可见单字(串里可混着序列)。左邻是真空白 / 分隔符 / 引号 ⇒ 不算(值是独立的一只地址);只有序列 ⇒ 不算。
9784
+ 4. **遮盖**:`scheme://` 留;其后到 `?` / `#`(或外延末)换 `«redacted:secret»`;`?` / `#` 之后照豁免时换 `«redacted:query»` / `«redacted:fragment»`。外延取「豁免时的外延(到下一个引号外空白)」与「值本身(到停字符)」较长的一段;段末跨着下一枚标签时与豁免同样停在标签前,那枚标签照常遮它自己的值。
9785
+ 5. **空主机**:`@` 之后一串可剥单元(任一种),之后是右界(串尾 / 空白 / `` / ? # " < > ` | \ ^ { } ``)、`:<数字>` 再右界、或下一枚 `@` ⇒ 前面的 `<名>:<串>` 按 userinfo 遮;这一形里用户名一段跨过可剥单元。单元之后直接是主机的形不走这一条(并联读法本来就认得出)。
9786
+ 6. **候选挂在标签上**(第 5 条的让位):窗口 = 上一枚 `@` 之后到这一枚 `@`,在两种读法上各找凭据标签(带分隔)与方案词(带分隔)—— 原样读法(可剥单元照算空白)与剥掉可剥单元的读法(`to` + 软连字符 + `ken=`、`"pass` + 孤代理项 + `word":`、`Bea` + 零宽空格 + `rer `、`tok` + 着色序列 + `en=` 这种被拆开的词)。有一枚匹配的**末端落在候选起点或其右**(候选就是它的值:分隔一直吃到候选起点,含引号值的开引号;或候选吞了它一截)⇒ 不认,留给标签那一遍整只遮(与 0.84.0 同答)。末端在候选起点左边、中间隔着别的字(`token=abc user:<口令>@…`)⇒ 照认。只在空主机形上判;主机在场的形照旧(KL-193)。
9787
+
9788
+ #### 108a-9 · 注入 client 路径的决断时限与读口截止
9789
+
9790
+ - 🔴 **注入 client 的 `timeoutMs` 不低于 6 小时**(`21600000`,与已装目标那条路的决断预算同一档),**建议 `maxRetries: 0`**(本包自构造的 client 同此)。例(浏览器同源中继宿主):`new AgentClient({ baseUrl: '', authToken: { mode: 'same-origin-relay' }, timeoutMs: 6 * 60 * 60 * 1000, maxRetries: 0 })`,专给 plan-review 连线用。
9791
+ - 为什么:批准会让引擎把续跑**同步**驱动到终态才答复,常常是分钟级;sdk 的逐请求选项只有取消信号(没有逐请求时限 / 重试开关),本包改不了宿主 client 的时限。沿用 sdk 缺省 60 s 的 client,续跑超过一分钟的批准会落时限那一臂。
9792
+ - 时限那一臂(两条路同一句):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: <错误串>」。
9793
+ - 本包经注入 client 的读都有**独立落定**的截止,与 client 的时限长短无关:决后回拉 15 s、`engineSupportsTaskAgents` 3 s、`probeScenarioTools` 2 s(后两者可经 `timeoutMs` 改)。截止到点即落定(回拉当失败、回落 200 体的状态;探针答「不知道」),同时中止底层请求。注入 client 的读重试在退避 / `Retry-After` 睡眠期间不看取消信号 —— 截止照样按时落定,但那只 client 可能再睡一轮(至多 60 s)才收手;`maxRetries: 0` 即无此形(KL-191)。
9794
+ - 已装目标那条路不变:决断用独立的 6 h client、回拉用独立的 15 s client,两只都 `maxRetries: 0`。
9795
+
9796
+ ### 108a′. 成文改口(旧判据眼作废 → 新判据眼)
9797
+
9798
+ **作废**(旧判据眼装 0.84.1 后判红是预期行为,不是回归):
9799
+
9800
+ 1. §104 包侧缺口 ⑦「开标签文法本身不上公面,要按开标签切块的端仍自持文法」的后半句 —— 切块的端换读 O-1 即可,不必自持文法。前半句(文法常量不上公面)照旧成立。
9801
+ 2. §104 处置表 R-1 管理台格与 104d「回放面按开标签切块的那一处仍需文法(见包侧缺口 ⑦)」—— 那一处换读 O-1。
9802
+ 3. 「浏览器 / 桌面拿不到 detach 400 的判定,只能本地自写」—— 用 DT-1。
9803
+ 4. 「已 arm 时 `detachDurableOffHint` 对读属性会抛错的错误对象原样抛出」—— 本版起回 `null`(G-DT6)。
9804
+ 5. 「`noticeAudienceOf('instructions.source_changed') === 'operator'`(属运维面)」—— 本版起受众 `user`;`memory.layer_locked_legacy` 受众仍 `operator`(服务端只在启动期把它记进运维日志,不上用户流),此前是回落、本版起表上写明。按「受众为 `operator`」写的判据在 0.84.1 上必须判红(G-N2)。
9805
+ 6. 「`engineNoticeInCatalog('instructions.source_changed')` / `engineNoticeInCatalog('memory.layer_locked_legacy')` 答 `false`(册外、只落调试)」—— 本版起两枚都答 `true`(在册、册内通用行)。按「这两枚码册外 / 只落调试」写的判据在 0.84.1 上必须判红(G-N2)。
9806
+ 7. 「422 `parked_resume.startup_failed` + 正文含 `not found` ⇒ 包内停泊腿走重连一轮」—— 0.84.0 及以前的误判,本版起判红;按旧行为写的判据(「这一形会重连一轮」)作废(G-P8)。
9807
+ 8. 「`CONFIG_REFUSAL_CODES` 恰七员」—— 改八员,新员 `config.legacy_tool_name` 排在最后。
9808
+ 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)。
9809
+ 10. §66 **G3**(混合,一正一负且负的是 G2 那一形):「CC 数组一条、sema 载体两条、`_absent: true`」—— 本版起 CC 数组两条(脱敏那条带标记)、`_absent` 不在场(G-PD3)。负的一条若是「没有对象」那几类(例:行无 `toolCallId`),旧判据照旧成立。
9810
+ 11. 按「CC 形数组里的条目都没被传输层动过 / `tool_input` 字符串叶里不会出现 `«redacted…»`」写的判据眼 —— 本版起有标记的条目恰是这一形。
9811
+ 12. 按「`Authorization: Bearer` + 孤代理项 + `https://…` 在正文 / 单行 / 字段载体上原样露出值」钉现状的格,以及「同一位置换成零宽空格同样露出」的对照格([8562])—— 本版三种载体都不含值、都含 `«redacted:`(G-K1)。
9812
+ 13. 按「`user:<口令>@` + 不可见单元、没有主机 ⇒ 机读口 / 转义形原样」钉现状的格(G-K3)。
9813
+ 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);连接被拒 / 断网那一形照旧。
9814
+
9815
+ **改读**(判据的意思保留,换读法):
9816
+
9817
+ 1. §66a **S-1**「三道闸(普通对象 / 没被传输层动过 / 扫描预算内)」→ **两道闸**(普通对象 / 扫描预算内)+ **一个标记判定**(被传输层动过 ⇒ 照交出,盖 `_sema_tool_input_redacted`)。
9818
+ 2. §66b 第一条「`tool_input` 缺席 = 拿不出可信的入参对象,五种原因之一」→ **四种**:行无 `toolCallId` · 本流没见过那只 `tool_start` · 入参不是普通对象 · 超扫描预算;「入参被传输层动过」一因移出(那一类现在 `tool_input` 在场并带标记)。「绝不等于入参为空」不变。
9819
+ 3. §66z **#3**「传输层替换记号 / 环与深度占位串:consumed(只作『被动过』判据,不反解)」→ consumed(只作**标记**判据,不反解、**不拦**)。
9820
+ 4. 0.73.4 发布说明「被拒的调用没有改写,所以拒绝清单上的 `tool_input` 就是模型发出的入参」→ 射程限定:`tool_input` 是调用开始时 `tool_start` 帧上的入参(= 模型发出的那份,审批人改写过的是改写后那份);**不是**「被拒的那份」—— hook / 策略在判定前改写过入参的调用,被判并拒绝的是改写后的最终入参(KL-175)。本版新收的脱敏条目另有一层:它还是脱敏视图(标记在场)。
9821
+ 5. §66 包侧缺口 ②「被传输层动过的入参无机读判别位(今按字面记号认)」→ 仍成立,改读为「标记按字面记号盖」(KL-11 改写)。
9822
+ 6. 按 0.83.4 原样凭据字节(`Authorization: «redacted:secret»`、`Bearer «redacted:secret»`)写的判据,改锚为「输出不含值的字面 ∧ 含 `«redacted:`」(本版字节见 G-K1 / G-K2)。
9823
+ 7. §106y 第 2 条「已中招的会话要把那一条从会话规则记录里删掉(今天的引擎上只有运营方能删)」与 §106 包侧缺口 ③「已经写进会话规则记录、每跑启动失败的会话本包救不回,也还没有专门出路句」—— 本版起有撤销动词(E-1)与出路句(E-3);老引擎上属主撤 `toolDeny` 仍会被判放宽而拒(撤销动词如实答 `loosen_forbidden`),较新的引擎上属主可撤。
9824
+ 8. §5d 与 §7 **P-28**「正位解 = 放宽 `EngineWireTarget.token` + 10 处透传」—— 改为:plan-review 三口与两只探针以注入 client 解(本版,§5d 入参面表末两行);子代族候「共用构造点收编 + 注入」。§5d 末表 A 档「用户看不看得见取决于通知队列口装没装」补:宿主接了 `onOutcome` 也算可见通道(本版起两条通道并行)。活段 §5d / §7 P-28 已随本版改写。
9825
+ 9. 注入 client 路径的决断时限:宿主交进来的 client 的 `timeoutMs` 不低于 6 h、建议 `maxRetries: 0`(108a-9);决断撞上时限那一臂按 G-W10 的句子判「已送出、结果未确认」,不按「连不上」判。
9826
+
9827
+ **新增**: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。
9828
+
9829
+ **不变**:
9830
+
9831
+ - 剥离 / 解包两口的块语义与答案(§104 G-R2 / G-R4 / G-R6 照旧成立)。
9832
+ - `detachDurableOffHint` 对其余输入的答案(未 arm 恒 `null`;armed 时对 durable-off 400 出那一行、其余 `null`)。
9833
+ - 引擎码册镜像 `ENGINE_NOTICE_CODES` / `ENGINE_NOTICE_AUDIENCE` 的成员与顺序;六只既有事实读器(含 0.84.0 的读目录授权结论读口)的读法;两表之外的码受众仍保守 `operator`。
9834
+ - 决断出口在别的码 / 无码上的失败文字逐字节同 0.84.0;没有机读码 / 别的码的失败,包内停泊腿「门早已决」扫词臂照旧。
9835
+ - `sessionPolicyDeliverable` 的判决与话(`legacy_tool_name` 臂改调判据本体,同表同序)。
9836
+ - plan-review 三口不带新位时(请求体 / 出站头 / 结局文字〔决断撞上请求时限那一臂除外〕/ 队列项键集 / 投递闩 / 投递序号 / 重开判决)逐字节同 0.84.0;`EngineWireTarget` 型与 `makeEngineWireClient` 不动。
9837
+ - 拒绝清单「没有对象」几类的处置(§66b 其余四因、§66 G4、0.82.1 对账的缺字段行);账本自带入参恒优先;`_sema_tool_input_source` 的值与「只说来源」的语义;`_sema_permission_denials_absent` 的语义(CC 那条清单不可声称完整)与两键合读法;`_sema_zero_output_denied` 的三条合取(读的是 sema 载体,不受本件影响);流内快照的 per-stream / 上限 / 单向闩 / 两份不同入参出表。
9838
+ - 凭据读法:孤代理项与零宽空格同位同答(§105 的同处置不变量)照旧成立;干净文本逐字节不变照旧成立;标签 / 方案词的值是空主机 userinfo 形时与 0.84.0 逐字节同(G-K6)。
9839
+ - 同事正文的权威标签拆火逐字节不变。
9840
+
9841
+ 已发段(§66、§104、§106 与 0.73.4 的 CHANGELOG 段)不回改,以本段为准。
9842
+
9843
+ ### 108b. 缺席语义(逐键)
9844
+
9845
+ **开标签定位口 / detach 判定**
9846
+
9847
+ - `findSystemReminderOpenTag` 回 `null` = 从 `from` 起没有(完整的)引擎形开标签 —— 串里只有截断形 / 非引擎形也是 `null`;`text` 非串、`from` 域外同样是 `null`。它**不是**「不知道」:在切块循环里读作「余下都是正文」(方向与剥离口对截断信封的处置一致:宁可多渲,不吞正文),调用方把位置算错时循环也照样收尾、不会从头重扫。
9848
+ - 回 `{ start, end }` 不代表这一块闭合了:有没有闭标签要调用方自己找(108a-1 的循环)。
9849
+ - `isDetachDurableOff400` 回 `false` = 这一枚错误不是(或认不出是)detach durable-off 400:非 400、没有锚句、非对象、读属性就抛错的对象都落这里。那条拒绝的原文改了时也落这里 —— 方向:不退让、不出提示行,原 400 照常交给宿主(不会静默重发)。
9850
+ - 回 `true` 只看两位的值,不看载体的形:函数对象、原型链上带 `status: 400` 与含锚句 `message` 的对象同样回 `true`。常见的本地实现先判 `typeof err === 'object'`,对函数对象回 `false` —— 换读本口时这是唯一的答案差别(SDK 抛出的错误都是对象,真部署上碰不到)。
9851
+
9852
+ **服务端自铸码 / 派发口 / 停泊决断 422**
9853
+
9854
+ - `readInstructionsSourceChanged`:`previous` / `current` 的 `null` 是真读数(「那一次运行没有项目指令文件」);键缺席、空串、非串非 `null`、只在原型链上 ⇒ 整只 `undefined`(不是 `null`)。`sessionId` 缺席 / 空串 ⇒ 整只 `undefined`。视图里没有运行 id(服务端铸点不带;运行归属由投递它的那条流承载)。
9855
+ - `readEngineNoticeFacts`:`undefined` 不是「没发生」—— 在册码走册内通用行渲引擎 / 服务端给的 `message`,册外码只落调试(端的分流,不在本口)。表里有这个码但读器判不成形 ⇒ `undefined`(不交半只读数)。
9856
+ - 读目录授权两码经派发口(派发口不做类型断言,`facts` 按码收窄到那只读口的视图型):`facts` 是 `readReadRootGrantNotice` 的两臂联合视图(型面上两码都是这只联合),按 `facts.outcome` 判别 —— 读口按码出臂,granted 码恒出 granted 臂、rejected 码恒出 rejected 臂;granted 形坏(缺 `dir` / `root`、`covers` 在场而不是 `"exact"`)⇒ 派发口与直接调读口同判 `undefined`(不折成目录义)。
9857
+ - `parkedResumeStartupFromError`:`null` = 不是这枚码(别码、无码、非对象、取值器抛)⇒ 端走原有失败面。`taskId` 读不出 ⇒ 键缺席(不编)。`decision` 缺席 ⇒ `undetermined`。
9858
+ - 老服务端(不发这枚码)/ 缺席:读口恒 `null`,决断出口失败文字与 0.84.0 逐字节同。
9859
+
9860
+ **拒启会话的撤销动词 / 出路句**
9861
+
9862
+ - `roster` 缺席 ≠「这台部署没挂工具」:缺席 / 读不了 ⇒ `roster_required`,一条不撤、零请求;读得懂的空名册才是「一只都没挂」。结局里不回显名册。
9863
+ - `removed` 恒非空(空就是 `nothing_to_remove`);`refused` 恒非空。
9864
+ - `message` 缺席 = 引擎没给文字,不是「没有原因」;它是引擎原文,展示前按不可信文本处理。
9865
+ - `nothing_to_remove` ≠「这条会话不会再启动失败」:只说这条记录里没有「本版认得的拒启名 ∧ 交来的名册里没有」的条目(见包侧缺口 ⑧ ⑨ ⑫)。
9866
+ - `legacyToolNameFailureNoteOf` 返回 `undefined` = 不是这一枚码,不是「没有出路」。
9867
+ - `write_unconfirmed` 上**没有** `rev`(不知道新版本号;也绝不借读到的那个)。
9868
+
9869
+ **plan-review 注入 client**
9870
+
9871
+ - `opts` / `opts.wire` 缺席 = 旧路径:经 `engineWireTarget()` 自构造;目标没装 ⇒ `not_sent`「no engine connection is configured」(不变)。
9872
+ - `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`、零帧。
9873
+ - `wire.capsBaseUrl` 缺席 = 版本证据 `unknown` ⇒ 老两选卡(即使已装目标的 baseUrl 上有 ≥7.86.0 证据也不读它)。
9874
+ - `reason` 缺席 / 非串 / 纯空白 = 键不落(体逐字节同旧);超 4096 = 截到 4096(边界不切代理对)。
9875
+ - `onOutcome` 缺席 = 只投队列口;队列口也缺席 ⇒ 照旧 error 级 MISSED。在场 ⇒ 每次放行恰一次;被闩拒 = 不回调。载荷 `status` 缺席 = 回拉与 200 体都没读到状态(此时 `effect` 必是 `unconfirmed` / `not_sent` / `not_applied` 之一)。
9876
+ - `ReopenPlanReviewOpts.wire` 缺席 ∧ `deliverDecision` 缺席 ∧ 非默认槽 = 照旧拒开(error 留痕);canonical 复用臂上 `wire` / `onOutcome` = 不生效(debug 留痕)。
9877
+ - `EngineProbeOpts.client` 缺席 = 旧路径(自构造);在场而缺动词 = 「不知道」(`undefined` / `null`),零请求;`timeoutMs` 缺席 = 3 s / 2 s 缺省(独立落定的截止)。截止到点的「不知道」与失败的「不知道」同形 —— 不是「不支持」。
9878
+ - 注入 client 的每请求时限 = 宿主构造时的 `timeoutMs`(sdk 缺省 60 s),本包改不了(108a-9 要求不低于 6 h);回拉腿另有 15 s 独立落定的截止,到点 ⇒ 状态按决断 200 体自带的措辞(载荷 `status` 取那一份;都没有 ⇒ 键不落、`unconfirmed`)。
9879
+ - 决断撞上请求时限 ⇒ `effect: 'unconfirmed'`、结局正文「was sent, but no answer came back …」:**不是**「没送出」,也不是「没生效」—— 先读任务状态。
9880
+
9881
+ **拒绝清单**
9882
+
9883
+ - `_sema_tool_input_redacted` 缺席 = 这条 `tool_input` 上没扫到替换记号 / 占位串,**或** `tool_input` 不来自流内帧(来自账本),**或**根本没有 `tool_input`。它**不**等于「这就是原值」:判据是字面记号,上游没有机读位;也不说「这就是被拒的那份入参」(KL-175)。
9884
+ - `_sema_tool_input_redacted` 在场而 `_sema_tool_input_source` 缺席 —— 不会出现(在场时来源位恒为 `'tool_start'`)。
9885
+ - `permission_denials` 里某条带标记 ⇒ 那条的 `tool_input` 是脱敏视图:渲染照常(记号本身就是给人看的),**不要**拿它重跑、比对原值或生成放行规则。
9886
+ - `_absent` 缺席 + CC 数组里有带标记的条目 = 清单**条数完整**;入参保真度逐条看标记。
9887
+
9888
+ **凭据读法 / 门**:无新键、无新导出、无新类型 —— 凭据那一件只改两网的输出字节;门那一件不读、不铸任何 wire 键。
9889
+
9890
+ ### 108c. 黑盒判据骨架
9891
+
9892
+ > 🔴 标「本版证明」的格在**上一发布版**(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 = 门夹具与对账门。
9893
+
9894
+ **开标签定位口**(下文 `MARK` = `AbCdEfGhIjKlMnOpQrStUv`(22 位),`OPEN_MARK` = `<system-reminder mark="${MARK}">`(47 字符),`OPEN_BARE` = `<system-reminder>`(17 字符),`CLOSE` = `</system-reminder>`;`find` = `findSystemReminderOpenTag`)
9895
+
9896
+ - **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`。
9897
+ - **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 }`。
9898
+ - **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`;都不抛。
9899
+ - **G-O4**(本版证明,对拍):定种子随机串(开标签两形、截断形、非引擎近亲、闭标签、嵌套、杂字混排)上,按 108a-1 循环逐枚找出的开标签集合 ≡ 「在每个 `<` 处取到首个 `>` 的候选,`stripSystemReminderBlocks(候选 + CLOSE) === ''`」反推的集合 ≡ 换成 `unwrapSystemReminder(候选 + CLOSE) === ''` 反推的集合;108a-1 的循环拼出的正文与 `stripSystemReminderBlocks` 逐字节同。
9900
+ - **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。
9901
+ - **G-O6**(回归约束):§104 G-R2 / G-R4 / G-R6 两版同答(剥离 / 解包两口改走同一判定后行为不变)。
9902
+
9903
+ **detach 400 判定**
9904
+
9905
+ - **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`。
9906
+ - **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`,不抛。
9907
+ - **G-DT3**(本版证明):未 arm 的进程(浏览器即是)里 G-DT1 的错误 ⇒ `isDetachDurableOff400` 为 `true`,`detachDurableOffHint` 仍为 `null`。
9908
+ - **G-DT4**(回归约束):`detachDurableOffHint` 在 armed / 未 arm 下对 G-DT1 / G-DT2 全部输入两版同答(出行的文字逐字节同)。
9909
+ - **G-DT5**(射程延伸,真部署):对没有 run store 的执行体提交(带 detach 头)⇒ 400,换读本口的端判 `true`(按端自己的退让策略处理);device 部署首轮没有会话的提交 ⇒ 400 同码另一句,本口判 `false`,原样上抛、不去头重发。
9910
+ - **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`。
9911
+
9912
+ **服务端自铸码 / 派发口**
9913
+
9914
+ - **G-N1**(本版证明,纯包层;N-1):根入口 `SERVER_NOTICE_AUDIENCE` 冻结、键集恰 `instructions.source_changed` / `memory.layer_locked_legacy`、值 `user` / `operator`。判别点:0.84.0 为 `undefined`。
9915
+ - **G-N2**(本版证明;N-2):`noticeAudienceOf('instructions.source_changed') === 'user'`、`engineNoticeInCatalog('instructions.source_changed') === true`;`memory.layer_locked_legacy` 在册且 `operator`。判别点:0.84.0 答 `operator` / `false`。
9916
+ - **G-N3**(回归约束;N-2):`ENGINE_NOTICE_CODES` 与 `ENGINE_NOTICE_AUDIENCE` 不含这两枚码;`constructor` / `__proto__` / 带换行或大写变体的码 ⇒ 册外、`operator`;任一既有引擎码的受众两版同答。
9917
+ - **G-N4**(本版证明;N-3):`readInstructionsSourceChanged({ code: 'instructions.source_changed', detail: { previous: 'CLAUDE.md', current: null, sessionId: 's1' } })` ⇒ `{ previous: 'CLAUDE.md', current: null, sessionId: 's1' }`(键集恰三键)。
9918
+ - **G-N5**(本版证明;N-3 缺席):`previous` 缺席 / 空串 / 数 / 只在原型链上、`sessionId` 空串、`detail` 为数组 ⇒ `undefined`,不抛;别的码 ⇒ `undefined`。
9919
+ - **G-D1**(本版证明;D-1 / D-2):`ENGINE_NOTICE_FACT_READERS` 冻结、八个码;根入口从本模块导出的七只 `read*` 事实读器各是表里的同一只函数(`===`;`readReadRootGrantNotice` 挂 `approval.read_root_granted` / `approval.read_root_grant_rejected` 两行);每只读器只读得出它挂的那几个码的合法通告。
9920
+ - **G-D2**(本版证明;D-1):八个码各一条合法通告 ⇒ `readEngineNoticeFacts` 答 `{ code, audience, facts }`,`facts` 与直接调那只读器逐键同值,`audience === noticeAudienceOf(code)`。
9921
+ - **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` 码都不在。
9922
+ - **G-D4**(回归约束形的新口格;D-1):在册无读器的码(`memory.session_polluted`)、册外码、`constructor` 作码、`null` / 串 / 数组入参、`code` 或 `detail` 取值器抛 ⇒ `undefined`,不抛。
9923
+ - **G-D5**(本版证明;读一次):`code` 取值器第一次答 `mcp.injection_dropped`、第二次答别的码 ⇒ 派发口交出的是 `mcp.injection_dropped` 的读数,`code` / `detail` 各只被读一次。
9924
+ - **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 无派发口。
9925
+
9926
+ **停泊审批 422**
9927
+
9928
+ - **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` 函数。
9929
+ - **G-P2**(本版证明;不猜):同码、`message` 里写着「inherits from its spawning run」的批准 ⇒ `cause: 'undetermined'`;写着「session not found」的批准同样 `undetermined`;未声明方向 ⇒ `undetermined`。
9930
+ - **G-P3**(本版证明;真 SDK 形):用 SDK 的 `toApiError(422, { error, errorCode: 'parked_resume.startup_failed', taskId })` 造出的 `ParkedResumeStartupError` 实例照读;同形的无原型普通对象照读;`errorCode` 是 `decide.revive_rejected` / `revive.startup_failed` / 大写变体 / 缺席 ⇒ `null`。
9931
+ - **G-P4**(本版证明;措辞):两句三段、互异;都含「re-fetch the pending approvals」且都说这次拒绝不说卡是否还在;`undetermined` 那一句含改正后再决、继承工具、deny、server upgrade 两条出路;`resume_rejected` 那一句不含 server upgrade;两句对 `isAlreadyResolvedGateReason` 都答 `false`。
9932
+ - **G-P5**(本版证明;判定):三种方向下 `resendable` 严格 `false`、`denyStaysOpen` 严格 `true`。
9933
+ - **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)`。
9934
+ - **G-P7**(回归约束;P-4 缺席):别的码(`approval_stale` / `decide.revive_rejected`)与无码 422 在上述出口上失败文字逐字节同 0.84.0。
9935
+ - **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 上实跑:四形都重连、失败行为空)。
9936
+ - **G-P9**(回归约束;P-5 射程):同一正文无码、或码为 `decide.revive_rejected` ⇒ 照旧走重连(两版同答;提问卡腿与审批卡腿同判);`isCodeClassifiedGateFailure` 对本码 / `resume_blocked_by_policy` / `corrupt` 答 `true`,对别码与缺席答 `false`;`isGateStandingErrorCode('parked_resume.startup_failed') === false`。
9937
+
9938
+ **拒启会话的出路**
9939
+
9940
+ - **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,恰一读一写;再跑一次 ⇒ 准备阶段通过、模型被调到。
9941
+ - **G-E2**(本版证明,老引擎形):同一店、普通调用方、记录 `{ toolDeny: ['Read','MultiEdit'], toolAllow: ['Read','grep'] }` ⇒ `loosen_forbidden`,`refused` 两条,恰一次写,记录逐字节不变,下一跑仍 `config.legacy_tool_name`;只有 `toolAllow: ['Read','bash_readonly']` ⇒ `removed`、下一跑通过。
9942
+ - **G-E3**(端侧验收,真部署;两代引擎各一次):宿主经「本会话规则」写口(或直接写会话规则记录)放进 `MultiEdit` / `foo__bar`,确认下一跑以 `config.legacy_tool_name` 失败;属主身份调撤销动词 —— 老引擎 ⇒ `loosen_forbidden`,出现「只有运营方能删」那一句,`GET` 回来的记录不变,下一跑仍失败;较新的引擎 ⇒ `removed`,下一跑正常开始。别用 `Task` / `KillShell` 造这一格(会把旧名先改写成现名的宿主上它们不中招)。
9943
+ - **G-E4**(回归约束):记录里没有会拒名(`{ toolDeny: ['Read','mcp__srv'], commandDeny: ['bash'] }` 或还没写过策略的会话)⇒ `nothing_to_remove`、零写。
9944
+ - **G-E5**(本版证明,并发与失败分类):读与写之间别人推进一次记录并加进一条 `KillShell` ⇒ 恰重读重写一次,两条会拒的都撤、对方加的别的条目留着;连撞两次 ⇒ `conflict`、恰两读两写;写后才断连 / 回执读不懂 / 回执版本号没推进 / 回执里还留着撤掉的那条 ⇒ `write_unconfirmed`,再调一次 ⇒ `nothing_to_remove`。
9945
+ - **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`。
9946
+ - **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`。
9947
+ - **G-E8**(回归约束,层位):会话规则记录为空、调用方策略 deny `MultiEdit` 跑一次 ⇒ 同样 `config.legacy_tool_name`;对这条会话调撤销动词 ⇒ `nothing_to_remove`(出路句因此列出四处)。
9948
+ - **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)。
9949
+ - **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: [] }`(读得懂的空名册)⇒ 照常撤。
9950
+
9951
+ **plan-review 注入 client**(驱动形:真 sdk `new AgentClient({ baseUrl, authToken: { mode: 'same-origin-relay' }, fetch })` + node:http 假引擎;已装目标另指一只只答 404 的假引擎 B)
9952
+
9953
+ - **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)。
9954
+ - **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)⇒ 老两选。
9955
+ - **G-W3**(本版证明):中继形 client 的每一发(POST + 回拉 GET)无 `authorization` 头;`{ wire: { client: {} } }` ⇒ 零请求、结局含「could NOT be sent」与「client supplied by the host」。
9956
+ - **G-W4**(本版证明):`{ reason: 'needs more tests' }` ⇒ 体 `{"decision":"reject","reason":"needs more tests"}`;`' '` / `42` ⇒ `{"decision":"reject"}`;4097 字 ⇒ 4096。
9957
+ - **G-W5**(本版证明):`{ onOutcome }` ⇒ 恰一次,键集 `decision,detail,dispatchNo,effect,prompt,status,tail,taskId`(状态读不到时无 `status`),`prompt` === 队列项 `value`;卸掉队列口 ⇒ 仍回调、无 error 级 MISSED;同任务并发第二次 ⇒ 不回调。
9958
+ - **G-W6**(本版证明):`reopenPlanReviewCard('t', { sessionKey: 'K9', wire: { client } })`(K9 有 overlay)⇒ `reopened: true`;作答 ⇒ POST 经注入 client。旧版:`reopened: false` + error 留痕。
9959
+ - **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`。
9960
+ - **G-W8**(回归约束):三口不带新位 ⇒ 体 / 结局(决断撞上请求时限那一臂除外,见 G-W10)/ 队列项键集 / 闩 / 序号 / 重开判决同 0.84.0(`run-plan-review-decide-verify-test.mjs` / `run-plan-review-dismissal-test.mjs` 全绿)。
9961
+ - **G-W9**(端侧验收;射程:网页端,中继部署,服务端 ≥7.86.0):中继 client 按 108a-9 构造(`timeoutMs` ≥ 6 h、`maxRetries: 0`);plan 模式提交 → 卡上批准(auto)→ 引擎收到带 `permissionModeAfter` 的体 → 续跑超过一分钟的批准回执仍按 `took_effect` 渲;拒绝 + 反馈 ⇒ 引擎收到 `reason`;同一卡双击 ⇒ 恰一条 POST。
9962
+ - **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: …」。
9963
+ - **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)。
9964
+ - **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 })` 不留未处理的拒绝。
9965
+
9966
+ **拒绝清单**
9967
+
9968
+ - **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`。
9969
+ - **G-PD2**(回归约束;present-iff):同上但入参 `{ command: 'rm -rf /tmp/x' }` ⇒ 进 CC 数组、两载体都**没有** `_sema_tool_input_redacted` 键;入参 `{ note: 'see [circular] refs' }`(占位串只在正文里)⇒ 同样无标记。
9970
+ - **G-PD3**(本版证明;混合):两条拒绝,一条入参干净、一条带记号 ⇒ CC 数组两条(只有带记号那条有标记)、sema 载体两条、`_absent` 不在场。判别点:0.84.0 为 CC 一条、`_absent: true`。
9971
+ - **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`。
9972
+ - **G-PD5**(回归约束;没有对象的几类):行无 `toolCallId`、`toolInputByCallId` 里只有别的 id、入参为串 / 数组 / `null`、入参 `{ xs: <30000 个数>, command: '«redacted» x' }`(被动过 ∧ 超节点预算,两种键序)、`{ deep: <101 层嵌套>, self: '[circular]' }`(被动过 ∧ 超深度)⇒ CC 数组空、sema 条目无 `tool_input` 且无标记、`_absent: true`。流内补行没见过 `tool_start` ⇒ 同答。
9973
+ - **G-PD6**(回归约束;账本优先):账本行自带 `toolInput`、流内那份带记号 ⇒ `tool_input` 是账本那份、无来源位、无标记。
9974
+
9975
+ **凭据读法**
9976
+
9977
+ - **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`。
9978
+ - **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»`。
9979
+ - **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 默认形原样露出口令。
9980
+ - **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` 机读口逐字节不变。
9981
+ - **G-K5**(回归约束):`token=u:<口令>@` + ESC `[0m` + `/<值>` 整只值换记号(`token=«redacted:secret»` 一类),`<值>` 不露。
9982
+ - **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 三形、标记读口)都不含 `<口令>` 与 `<尾>`。
9983
+ - **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 上 `<口令>` 原样。
9984
+
9985
+ **门夹具与对账门**(源码目录自跑)
9986
+
9987
+ - **G-F1**:在装好开发依赖的本包源码目录里跑六套被换形的门,各自全绿且检查数与本版发布帖所列一致;对任一套把换进来的终态词改成表外词(`failed` → `failedX` 一类),套必须红或 exit 9(权限拒绝投影那一套例外,理由见 CHANGELOG Gates 段:改做「被挡 → 成功」换词)。
9988
+ - **G-F2**:对 `scripts/` 逐文件 grep 扁平帧(`status:` 与 `type: 'done'` 同帧、无 `terminal`),每一处要么带 `// 409:` / `// 回放面:` 注,要么落在 CHANGELOG Known limits 所列的九套里。
9989
+ - **G-F3**:跑 `node scripts/run-fixture-flat-done-ratchet-test.mjs` ⇒ 绿、未注位点 = 上限;在任一门里新写一只扁平 `done` 帧(字面量,或经 `const X = {status:…}` 再喂)不加注 ⇒ 红且点名文件与行;加一行 `// 回放面: <理由>` ⇒ 回绿;把 `scripts/registry.json` 的 `ratchets.fixtureFlatDone.unmarkedCeiling` 改小 1 ⇒ 红。
9990
+ - **G-F4**:跑 `node scripts/run-authority-envelope-mirror-test.mjs` ⇒ 绿;在开发依赖引擎包的信封登记表里把任一 `framing` 行改判 `authority` ⇒ 红且点名那个标签;在本包镜像里删一个标签 ⇒ 红(且 `run-peer-frame-projection-test.mjs` 对同一删改保持绿 —— 那一套只钉两只代表标签,这正是本门补的缺口)。
9991
+
9992
+ - 包层行为钉在门 `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`。
9993
+
9994
+ ### 108d. 端上要动的读点
9995
+
9996
+ 坐标与普查来自本机克隆的只读检索(终端 09-25 / 09-27、网页端 09-27、桌面端 08-13、管理台 09-27;行号会漂),以各端现状为准。终端与管理台的坐标省去开头的 `src/`;网页端坐标从仓根起(`ui/`)。
9997
+
9998
+ **终端**
9999
+
10000
+ - 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 核负样本:本包只认引擎两形,带任意属性的开标签不再当信封剥。
10001
+ - DT-1:`-p` 车道(`sema/seamQueryEngine.ts:2007`)继续用 `detachDurableOffHint`,零改动。
10002
+ - D-1:通告转录面里逐码分派那一段(`mcp.injection_dropped` / `mcp.server_redialed` / `skills.listing_truncated` 各自调读器的几处)整段换读 `readEngineNoticeFacts`,按 `f.code` 分支(读目录授权两码也在派发表里,换读后同一口即得它们的 typed 读数,`facts.outcome` 再判);删壳里逐码调读器的分派。册外兜底分流保留在壳(在册无读数 ⇒ 册内通用行渲 `message`;册外 ⇒ 只落调试)——判「在册」继续读 `engineNoticeInCatalog`,它这一版多认两枚码。
10003
+ - D-1(机读车道):通告帧的 `detail` 仍不上帧;有 typed 读数的码按 `_sema_` 前缀键把 `readEngineNoticeFacts` 的读数上帧(只在 `audience === 'user'` 的读数上帧即与用户流同口径;运维面读数要不要上机读车道由壳定)。
10004
+ - N-2:按受众分发的那一处零改动;`instructions.source_changed` 从这一版起走用户面。若壳为它写过运维面专属行,那一行跟着挪。
10005
+ - P-1 – P-3:决断出站代理上与既有 `say*` 同闸口,加一只:`parkedResumeStartupFromError(e, verb)`(`verb` 就是那一发的批准 / 拒绝)→ 命中说 `parkedResumeStartupContent(detail)`;决断重试那一处对本码不自动重发(读 `resendable`);卡上 deny 保留(读 `denyStaysOpen`)。壳侧处置表里这一格由 declined 改读包口。
10006
+ - P-5:自有「门已决」判据链(按失败文字扫词的那一只)在扫词之前问 `isCodeClassifiedGateFailure(errorCode)`,命中即不判「门已决」;失败文字被拍平、读不到机读码的那条路,SDK 错误类名 `ParkedResumeStartupError` 在拍平串里,可按类名兜底。
10007
+ - 🔴 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` 不变。
10008
+ - E-1 / E-2 / E-4:「本会话规则」删除动作(删一条 deny 时,若这条名字在本会话的会话规则记录里,同一拍经本包撤掉)与会话规则可见段(坏行旁「从本会话移除」)接 `removeRefusedSessionRules` + `sessionPolicyRemovalNotice`;🔴 `roster` 取这条会话最近一次收到的装配清单(`wiring_manifest` 帧)经 `projectToolRoster` 读出的名册 —— 启动失败的那一跑不发这一帧;手里没有就照传 `undefined`,动词答 `roster_required`,说那一句即可;标坏行用 `isEngineRefusedToolName`,不要自己判;读记录用 `readSessionPolicy`。🔴 撤销动词撤的是**这条会话里所有**会拒的条目,不是「用户点的那一条」:可见段上一键撤全部即可,单条入口的话要把这件事说清。出路句按结局改口,不按能力位、不按版本猜:老引擎上撤销动词自己会答 `loosen_forbidden`。
10009
+ - W-1 – W-7:零改动 —— `runStream.ts:469` arm 三参、`planReviewReopen.ts:82` 两参 decide、`:157-160` reopen 带 `deliverDecision` 全部旧签名,逐字节同答;`onOutcome` 可选不接(队列口在)。
10010
+ - PD-1 / PD-3:`-p` 车道「这条 run 真的拒过」的判定(print 车道审批通道告知那一处:CC 数组非空 ⇒ 拒了,否则判别位在场时读超集载体)零改动,结论不变 —— 这一类此前经超集载体判「拒了」,现在经 CC 数组判「拒了」。
10011
+ - PD-1:`-p` 结果帧的整帧过境(结果帧投影那一处 `{ ...msg }`)零改动即把新条目与新位原样交给 stdout;本版不要改成逐键挑。
10012
+ - PD-2:终端今天没有拿 `tool_input` 重跑 / 生成放行规则的读点;将来有 ⇒ 先读标记。壳侧结果帧的对象校验(三键 `z.object`,缺省剔未知键)不受影响。壳侧自合成终帧(会话归档 / 开机窗尾帧 / headless 尾帧 / producer 异常帧 / 载入失败帧)的 `permission_denials: []` + `_absent: true` 与本件无关(壳手里没有拒绝账本),照旧。壳侧消费清单:新键 `_sema_permission_denials[]._sema_tool_input_redacted` 登一行(consumed / declined 由壳定)。
10013
+ - K-1 / K-2:呈现走自带的出口(未读本包 `displayUntrusted`),本版射程外;经本包适配层的合成终局行 / 结果帧 `errors[]` 升级即净,零改动。
10014
+
10015
+ **网页端**
10016
+
10017
+ - 🔴 W-1 – W-6(到货删端侧重建的 plan-review 编排;对表网页端自列的五件清单):
10018
+ 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 —— 判据改口)。
10019
+ 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。
10020
+ 3. `SessionTurnRequest` 补「提交出身」位喂 `trigger`(用户 / 注入)—— 网页端自列第 ③ 件,包侧无改动。
10021
+ 4. `tests/run-self-heal-disposition-test.mjs` 改真包驱动 —— 网页端自列第 ④ 件。
10022
+ 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」)。
10023
+ - DT-1(建议):`ui/lib/engine/engine-session-transport.ts:325` 的提交恒带 detach 头,未见对这一枚 400 的处置 —— 连到没有耐久账本的执行体时整轮失败。要退让(去头重发一次并告知「断连会中止本轮」)时用本口判,不按码。
10024
+ - O-1:只调剥离口,零改动。
10025
+ - N-2 / D-1:今天零通告读点(本版普查:主干全树 `engine_notice` / `noticeAudienceOf` 零命中)。接用户通知面时:在册判据读 `engineNoticeInCatalog`,受众读 `noticeAudienceOf`,typed 读数读 `readEngineNoticeFacts` 且只渲 `audience === 'user'` 的。
10026
+ - P-1 – P-3:审批决断失败面(若自己调决断口)按同一只读口与措辞,不自铸。
10027
+ - E-*:未见会话规则写口,也未见按终局码补句的读点;零改动。将来接时直接用这几只口。
10028
+ - PD-*:今天零读点(`permission_denials` / `_sema_permission_denials` 主干全树零命中)。接结果帧拒绝面时:两键合读,条目按 `_sema_tool_input_redacted` 标「入参已脱敏」。
10029
+ - K-*:零直接读点;经适配层的机读口升级即净。
10030
+
10031
+ **桌面端**
10032
+
10033
+ - DT-1:`main/session-host.ts:1469` 恒带 detach 头;自带引擎恒有耐久账本,零改动。连外部引擎时同网页端。
10034
+ - W-*:零读点(`session-host.ts` 自有 client 直发 `{decision}` / `{decision, reason}`)。
10035
+ - N / D / P / PD:冻结期内零改动(零读点);解冻配对时同网页端。E / O:零改动。K:钉的版本早于呈前出口,不在射程。
10036
+
10037
+ **管理台**
10038
+
10039
+ - 🔴 DT-1(必改):`lib/chat/transport/engine-transport.ts:767` 的本地 `isDetachDurableOff400` 与本口同名同义(只认锚句、不认码)—— 删掉,改从本包导入(调用点 `:1675` 不动)。本包同名影子对账门对这一处登记了过渡豁免,到 0.85.0 为止。
10040
+ - O-1(建议):`components/chat/stream-core.ts:466` 的 `openTagOf` 里 `system-reminder` 一臂(「候选 + 闭标签问剥离口删不删净」的派生判定)换读 `findSystemReminderOpenTag`;`splitHarnessBlocks` 的截断块处置(余下全文归块)是端的呈现决定,照旧。
10041
+ - K-1 / K-2:三种载体经公面出口,零改动即净。提货测试里钉现状的三载体断言与零宽空格对照一条会按预期变红 → 翻面为「不含值、含记号」([8562])。
10042
+ - E-3(可选,非必改):`components/chat/chat-page.tsx:1691` 失败卡按 `errorCodeWording(stream.state.errorCode)` 取词,码为 `config.legacy_tool_name` 时可再补 `legacyToolNameFailureNoteOf(stream.state.errorCode)` 那一句(管理台自己不写会话规则,但会碰到被别的端写坏的会话)。
10043
+ - N-2 / D-1:运维面(若接通告)按受众分发读 `noticeAudienceOf`;`memory.layer_locked_legacy` 只出现在服务端运维日志,不上会话流。
10044
+ - W-* / PD-*:零读点;零改动。
10045
+
10046
+ **验收方**
10047
+
10048
+ - 按 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 矩阵可作对拍夹具。
10049
+
10050
+ ### 108y. 🔴 三端升级必读(固定段式)
10051
+
10052
+ 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 为止)。
10053
+ 2. **逐面**:
10054
+ - **终端**:通告逐码分派换读派发口;决断代理加一只 422 读口,按判定不重发同一决定;自有「门已决」判据链扫词前问 `isCodeClassifiedGateFailure`;🔴 终帧出路句的码要从 `_sema_error_code` 读(换钉 ≥0.83.0 即生效),建议换调 `legacyToolNameFailureNoteOf`;「本会话规则」删除动作 / 可见段接撤销动词(非必改;要交最近一份装配清单读出的名册);转录搜索那一处换读 `stripSystemReminderBlocks`;凡把拒绝清单 `tool_input` 当原值用的读点先读标记(今天没有);plan-review / detach / 凭据零改动。
10055
+ - **网页端**:🔴 删端侧重建的 plan-review 编排,改一调 `decidePlanReview(…, { wire, reason, onOutcome })` 与 `reopenPlanReviewCard(…, { trigger, wire, sessionKey, onOutcome })`(108d),连线用的中继 client `timeoutMs` ≥ 6 h、`maxRetries: 0`;提交恒带 detach 头而未处置 durable-off 400,要退让时用 `isDetachDurableOff400`;接通知面时按受众读包口;其余零改动。
10056
+ - **桌面端**:冻结期零改动(连外部引擎时 detach 同网页端)。
10057
+ - **管理台**:🔴 删本地 detach 判定改导入;回放拆分换读 `findSystemReminderOpenTag`、删派生判定;凭据提货格翻面为「不含值、含记号」;失败卡可选补出路句;接通告时按受众读包口。
10058
+ 3. **成文改口**:见 108a′(作废 / 改读 / 新增 / 不变);已发段(§66、§104、§106 与 0.73.4 的 CHANGELOG 段)不回改,以本段为准。
10059
+
10060
+ **包侧缺口:** 开标签定位口 —— ① 文法常量本身仍不上公面:定位口回位置,不回正则源码 · ② 定位口与块上下文无关:截断块归块还是归正文、块内字面开标签怎么跳过,由端的切块循环决定(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)。
10061
+
10062
+ ## §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` 不变)
10063
+
10064
+ > **minor**,原因三条:peer 地板跨到 sdk 12(本包按 12.x 才有的声明编译);型面 BREAKING 两处与 26 个内部件退出根入口;一处运行期拒收(`rewind.rewindFiles` 构造期抛)与一处运行期行为面(九张判定表换成只读 Set 子类,严格深比较 / `constructor` 可见)。五件同发(本节按 0.84.0 的读法写;若与本版发布帖不一致,以发布帖为准):
10065
+ > ① **后台代理登记读数**(§102 缺席行的下半场):读口(读数带会话与序号,冻结;读失败带诊断位)+ 取代判定 + 归类口(只认读口原样产出的读数 / 单副本位 + 必带会话 / 列表上限)+ 登记键桥(按句柄形取键)+ 补行谓词(自本地首见起算的稳定窗 / 自读数发出以来已结束的键)。回收判据本身一个字没改,变的是宿主终于有东西可以填进 `registry` 那一位。
10066
+ > ② **读目录授权的结论通告读口**:通告是真 wire(别的客户端发的授权也会回这两枚),本版只接读侧;回答体上的授权(「放行并加目录」这一选项)候服务端「能受理」的能力位,本版不上公面。
10067
+ > ③ **接线回执 `hands` 段**:引擎对「这条腿有没有手」的正面声明(服务端 7.103.0 起透传,老服务端缺席)。
10068
+ > ④ **sdk 12 追平**:审批帧键锚含 `mandate`、停泊行五键进型面、出身词有了运行期值、`./registry` 子路径声明缺口关闭;本包读法零改。
10069
+ > ⑤ **陈旧逻辑清扫**:退役键 `rewind.rewindFiles` 构造期拒收(退役专句点名去处;四端都已不发)、`WorkflowRunState.agentCount` 改可选、26 个内部件退出根入口(0.71.3 预告;`unrefTimer` 留公面)、九张公面判定表换成只读 Set 子类、包内判定用的十五张数组运行期冻结、`resume_at` 文本兼容腿退役、工作流终态词对齐引擎两处上游(含 `cancelled`)、`cancel_lost_race` 消息改句;`timeout`(历史行)在释放表与重连终态表里**不变**。
10070
+ > **表态现势**:minor 的 wire 键 / 导出变化 ⇒ 点名三端(本版新口的消费方)与管理台(内部件收回、`shortTaskLabel` 夹具),48 小时三选一。
10071
+
10072
+ ### 107a. 处置表
10073
+
10074
+ 包处置列:`consumed` = 本版读 / 接;`declined` = 本版刻意不读(理由在行内);`pending` = 候上游;`removed` / `changed` = 本包自有面本版删 / 改。
10075
+
10076
+ | # | 面(sdk 12.0.1 / 服务端 / 包自有) | 包处置 | 旧 → 新 | 终端 | 网页端 | 桌面端 | 管理台 | 验收方 | 本节 |
10077
+ |---|---|---|---|---|---|---|---|---|---|
10078
+ | F-1 | peer `@sema-agent/sdk` | — | `>=11.3.0` → `>=12.0.1` | 换钉 sdk 12.0.1 | 同 | 同 | 同 | 核地板 | 107y |
10079
+ | B-1 | `client.sessions.background(sessionId)` → `{ rows }` | consumed | 无 → 读口 `readEngineAgentRegistry(client, sessionId, caps, opts?)` → `EngineAgentRegistryListing`(`{ kind: 'rows', rows, sessionId, seq }` 或 `{ kind: 'unavailable', why, status?, errorCode? }`,四因 `no_list_face` / `route_absent` / `ownership_required` / `read_failed`;`status` / `errorCode` 只在 `read_failed` 且错误对象上读得到时带,诊断用、不改归类,并留一行 debug);**绝不抛**(能力位 / 体 / 行 / 错误对象上的取值器抛、客户端形坏 ⇒ `read_failed`,promise 不拒);`seq` 按(客户端的 `sessions` 资源 × 会话)在发出时单调递增;读数对象、行表与每一行冻结;不缓存、不轮询 | pending(缺席行到期那一拍调一次,见 107d) | pending(有后台代理面板时) | 同终端 | n/a | pending | 107b · G-B1–G-B4 |
10080
+ | B-2 | `capabilities.background.listFace` | consumed | 无 → 读口的端点门:**自有严格 `true`** 才打;缺席 / `false` / 非布尔 ⇒ `no_list_face`,不发请求 | 把能力回体原样交读口 | 同 | 同 | n/a | pending | G-B1 |
10081
+ | B-3 | 登记行 `status`(七词闭集型) | consumed | 无 → 归类口 `engineAgentRegistryReadingOf(listing, key, opts?)`:`pending` / `running` / `parked` ⇒ `running`;`completed` / `failed` / `killed` / `cancelled` ⇒ `ended`;认不出的词 ⇒ `unknown`;行不在 ⇒ **只有登记句柄形的键 ∧ `opts.singleReplica === true` ∧ `opts.sessionId` 给了且对得上 ∧ 读到时不满 500 行(列表上限)** 读 `not_listed`,别的一律 `unknown`;🔴 读数不是读口原样产出的那一个对象(展开复制 / `structuredClone` / 过滤或重组 / 手搭)⇒ `unknown`;读数已被取代 / `opts.sessionId` 与读数会话不等 ⇒ `unknown`;取值器抛 ⇒ `unknown`(身份见 107a-1,射程见 107a-3) | pending | pending | 同终端 | n/a | pending | 107a-1 · 107a-3 · G-B5–G-B8 |
10082
+ | B-3′ | —(包自有) | — | 无 → 归类口选项 `EngineAgentRegistryReadingOptions`:`singleReplica?: true`(宿主**确知**引擎是单进程时才给;自有键严格 `true`;`'true'` / `1` / 原型链上的同名键不认)· `sessionId?: string`(这一行所属会话;给了而读数不是那条会话 / 给成空串或非串 ⇒ `unknown`;行在时不给 = 不核;🔴 `not_listed` 臂必须给,不给 ⇒ `unknown`) | pending(自己拉起的本机引擎给;连远程不给) | 不给(远程) | 本机引擎给、远程不给 | n/a | pending | 107a-3 · G-B6′ |
10083
+ | B-4 | —(包自有) | — | 无 → 登记键桥 `engineAgentRegistryKeyOf(ev)`:`wireTaskId` / `taskId` 里**是登记句柄形**的那一位(两位都是 ⇒ `wireTaskId`);两位都不是 ⇒ `wireTaskId ?? taskId`。缺席 / 行帧 / 进度 / 终态事件与宿主按事件合并的行都吃 | pending | pending | 同终端 | n/a | pending | G-B6 |
10084
+ | B-5 | —(包自有) | — | 无 → 补行谓词 `engineAgentRegistryRowsMissingFromHost(listing, hostKeys, opts?)`:登记读数 `running` 的 `background_agent` 行而宿主登记域键里没有 ⇒ 补行事实 `{ id, status, description?, createdAt }`;逐行不补:本客户端首见不到 30 s(缺席侧同一稳定窗;首见账上没有 ⇒ 不补)/ 登记时刻读不出 / 在 `opts.goneSinceRead` 里;整张空:读不到 / 读数不是读口原样产出的对象 / 读数已被取代 / 会话对不上 / 宿主键集或 `goneSinceRead` 读不了(非数组、非本 realm 的 Set)/ `opts.nowMs` 给了却不是有限数 / 取值器抛;不受单副本位与列表上限影响(它只用「行在且非终态」) | pending | pending | 同终端 | n/a | pending | G-B9 · G-B14 · G-B15 |
10085
+ | B-5′ | —(包自有) | — | 无 → 补行选项 `EngineAgentRegistryFillOptions`:`nowMs?`(与读口记首见同一只钟:本包单调钟,epoch 锚定的单调毫秒、量纲同 `Date.now()`;缺席 = 调用那一刻的这只钟,谓词因此不是严格纯函数;要可复现就显式传)· `goneSinceRead?`(宿主自这次读数**发出**以来见到结束 / 撤掉的登记域键,数组或 Set;不给 = 不核)· `sessionId?`(同 B-3′) | pending | pending | 同终端 | n/a | pending | 107a-5 · G-B13 · G-B14 |
10086
+ | B-8 | —(包自有) | — | 无 → 取代判定 `isEngineAgentRegistryListingSuperseded(listing)`:同一客户端 × 同一会话上发出更晚的一次读已带着行表到货 ⇒ `true`;读口没经手的读数(拷贝 / 自建)/ 读不到的读数 ⇒ `false`(判不出取代;这类读数归类口读 `unknown`、补行谓词空表) | pending | pending | 同终端 | n/a | pending | 107a-5 · G-B13 |
10087
+ | B-6 | 登记行 `retained?: true` | declined | 不读、不带出(它说的是「这只 shell 服务被显式保留」,与「有人正看着」无关;本包 `viewing` 不许拿它填) | — | — | — | — | 反向格 | G-B10 |
10088
+ | B-7 | `client.sessions.backgroundStop` / `capabilities.background.exitFaces` | declined | 宿主动作(退出时停后台任务),不属判定;本包零读点 | 端直调 | — | — | — | — | — |
10089
+ | G-1 | 通告 `approval.read_root_granted` / `approval.read_root_grant_rejected` | consumed | 码册早在册(§102);本版加事实读口 `readReadRootGrantNotice(notice)` → `{ outcome: 'granted', toolCallId, dir, root, covers?, sessionId? }` / `{ outcome: 'rejected', toolCallId, reason?, sessionId? }`;granted 形上 `dir` / `root` 必须是非空串、`covers` 在场就必须是 `exact`,否则整只 `undefined`(读不了,不折成目录义);绝不抛 | pending(要按卡说「目录加上了 / 没加」时换读) | pending | pending | n/a | pending | G-G1 |
10090
+ | G-2 | `toolApprovals.respond` 体 `readRootGrant?: string`(「放行并加目录」这一选项) | **pending** | 本版不发:服务端还没有宣告「能受理」的能力位(sdk 12.0.1 `Capabilities` 无、服务端 7.102.0 无);老服务端(< 7.102.0)对未知键静默忽略并照回 200,按版本号开闸 = 人以为加了目录、其实只得一次普通放行。能力位到货后同一版接 | 不接 | 不接 | 不接 | n/a | — | KL-162 |
10091
+ | H-1 | `wiring_manifest.hands { mounted, reason? }`(服务端 ≥7.103.0 透传) | consumed | 九段 → 十段:`_sema_hands` → 视图 / chrome 臂 `hands`(`mounted` 自有严格布尔;`reason` 开集原字节;缺席 = 没报) | 零改动即得(键在视图上) | 同 | 同 | n/a | pending | G-H1–G-H3 |
10092
+ | H-2 | —(包自有) | — | 无 → 读口 `handsSeamReadingOf(view)`(`not_reported` / `mounted` / `not_mounted{reason?}`)+ 措辞 `handsSeamDetail(reading)` | pending(要渲「这条腿没有手」时换读) | 同 | 同 | n/a | pending | G-H4 |
10093
+ | H-3 | 名册派生读口 `handsMountedFromManifest` / `handsMountedDetail` | 不变(认得的形)/ 行为面改(坏入参) | 三态与认得的六句措辞逐字节不变(与 H-2 **不是同一个事实**,见 107a-4);🆕 `handsMountedDetail` 认不出的入参(`undefined` / `null` / 非对象 / 交叉喂 `hands` 段读数 / `mounted` 无正整数行数 / 认不出的 `why`)此前抛 TypeError 或回 `undefined`,现在回「没报」那一句(与 `handsSeamDetail` 的 `not_reported` 同一铸点) | — | — | — | — | 回归格 | G-H5 · G-H6 |
10094
+ | A-1 | 审批帧键锚 `TOOL_APPROVAL_FRAME_KEYS` 含 `mandate` | consumed(读法不变) | 镜像早含(§102);sdk 锚追平,本包零改 | — | — | — | — | — | — |
10095
+ | A-2 | 停泊行 `PendingCheckpoint` 五键 `requiresRealApproval` / `mandated` / `mandate` / `origin` / `ruleOffersAbsence` 进型面 | consumed(读法不变) | 此前按结构读(裸键),本版读法零改 | — | — | — | — | — | — |
10096
+ | A-3 | 运行期 `ASK_ORIGINS` / `PERSISTED_RULE_MANDATES` | declined(运行期) | 本包词表 `ASK_ORIGIN_WORDS` / `APPROVAL_MANDATE_WORDS` 照旧(与上游逐词对账的判据改锚上游运行期值);本包源码不 import 这两只值 | — | — | — | — | — | KL-167 |
10097
+ | X-1 | 能力位 `taskApproverPosture` / `taskWriteFaceOpen` | declined | 本包零读点(端直读) | — | — | — | — | — | — |
10098
+ | X-2 | `probeReady` / 健康回体 `centerCredential` / `reasons` | declined | 本包无健康读口;端直读 | — | — | — | — | — | — |
10099
+ | X-3 | `DeviceCodeResponse.verification_uri_complete` 必填 → 可选(sdk 12.0.0 唯一 BREAKING) | 兼容 | 本包早按可选读(在场 ⇒ 一键 / 二维码,缺席 ⇒ 展示地址 + 用户码) | — | — | — | — | — | — |
10100
+ | X-4 | `./registry` 子路径声明不再引用上游开发依赖里的声明包 | 缺口关闭 | `skipLibCheck: false` 的下游用子路径入口也不再见到「找不到模块」(§86 R-G6 那条缺口关闭:子路径入口的下游恰两条 ⇒ 零条;守卫照留,上游回潜当天红) | — | — | — | — | 改锚 | 107a′ |
10101
+ | T-R1 | 请求装配 `rewind` 组 / `SeamRewindSpec.rewindFiles` | **removed**(BREAKING,型面 + 运行期) | 五键(含退役 `rewindFiles`,原样透传)→ 恰四键(`resumeAt` / `resumeAtMode` / `restoreFiles` / `rewindFilesTo`);`rewind: { rewindFiles: … }` 构造期抛 `TypeError`,消息是退役专句(点名 `rewind.rewindFiles` 退役于引擎 core 6.0.0、要删掉、代之以 `rewind.restoreFiles: true` 配 `rewind.resumeAt` 或 `rewind.rewindFilesTo`);`true` / `false` 同拒;型位删 | 零改动(已不发) | 零改动(已不发) | 零改动 | 零改动(已不发) | pending | 107b · G-S1 · G-S2 · G-S9 |
10102
+ | T-R2 | 26 个内部件(0.71.3 预告的 `export *` 放大件) | **removed**(BREAKING,型面 + 运行期) | 根入口导出 → 不导出(包内照用,行为不变);另 8 名暂留(含 `unrefTimer`;107a′ 兑现 ②) | 零改动(普查零具名 import) | 零改动 | 零改动 | 零改动;测试里拿 `shortTaskLabel` 当「在公面上的名字」夹具的那一格,0.85.0 前换一个名字 | pending | 107a′ · G-S7 |
10103
+ | T-R3 | `isResumeAtRejection` | **changed**(行为收窄) | 机读码 ∪ 文本兜底(≤7.50 服务端的包装形 404 / 422)→ 只认机读码(含折叠码携带的原码) | 去锚自动重发只在 ≥7.51 的服务端上触发(支持窗内全部是) | 同左(若调用) | — | — | pending | 107b · G-S5 |
10104
+ | T-C1 | `WorkflowRunState.agentCount` | **changed**(BREAKING,型面) | 必有数(无腿数组时补 `0`)→ 可选(缺席 = 不知道;`agents: []` ⇒ 真 `0`);`agents` 非数组不再抛 | 🔴 详情面「N agents」那一段按 `agentCount !== undefined` 判;在场才渲数(与 `totalTokens` 同律) | 🔴 详情面 `{snapshot.agentCount} agent(s)` 缺席时会渲成空数字 ⇒ 缺席不渲这一段 | — | — | pending | 107b · G-S6 |
10105
+ | T-C2 | `CLAIM_RELEASED_STATES` / 无头重连终态表 | **不变** | 四词(`completed` / `failed` / `blocked` + 历史落库行读兼容的 `timeout`)照旧:`timeout` 不是现役写词,是 core 5.8.0 之前落库的行上的词,服务端读 run 行状态列原样返回 ⇒ 读回照旧当已释放、照旧合成终帧;表运行期冻结(T-C6) | 零改动 | — | — | — | 回归约束 | G-S3 |
10106
+ | T-C3 | 九张公面判定表(Set) | **changed**(运行期行为面 BREAKING;型面不变) | 普通 Set(`.add` 改得到包的判定)→ 只读 Set 子类(`add` / `delete` / `clear` 抛 `TypeError`,表不变;成员与次序不变;`constructor` 不再是 `Set`、原型不是 `Set.prototype` ⇒ 与普通 Set 严格深比较判不等) | 零改动(普查零 `.add` / `.delete` / `.clear`);测试里若拿它与 `new Set([...])` 严格深比较,改比成员 | 同 | 同 | 同 | pending | G-S4 |
10107
+ | T-C4 | `cancel_lost_race` 消息 | **changed**(文案) | 「…re-read the run state and retry cancel if it is still active」→「…check what that decision did to the run before retrying the cancel」;码不变 | 零改动(端按码渲自己的下一步) | — | — | — | pending | G-S8 |
10108
+ | T-C5 | 工作流终态词集(判一条轮询中的工作流是否已报过) | **changed** | 八词 → 引擎两处上游的终态词三词(`completed` / `failed` 来自工作流运行记录,`cancelled` 来自进程内任务登记的工作流句柄;从不发的 `done` / `stopped` / `interrupted` / `error` / `canceled` 删) | — | — | — | — | 回归约束 | G-S11 |
10109
+ | T-C6 | 十五张判定数组(`REWIND_ERROR_CODE_PREFIXES` / `STOP_CONFLICT_CODES` / `CLAIM_RELEASED_STATES` / `CLAIM_HELD_STATES` / `RUNNING_STATES` / `ASK_PARK_GATE_KINDS` / `ASK_PARK_STATES` / `PLAN_REVIEW_GATE_KINDS` / `PLAN_REVIEW_STATES` / `TOOL_PERMISSION_REQUEST_ID_DOMAINS` / `ATTACHMENTS_SPEC_KEYS` / `LIVE_DEFAULT_FIELDS` / `TIER_ORDER` / `DEFAULT_CATALOG_SOURCES` / `CATALOG_DEFAULT_HOSTS`) | **changed**(非 BREAKING) | 可就地改写(包内调用期查的是同一个数组)→ 运行期冻结(`push` / `splice` 抛,下标写 / 截断在严格模式下抛;读、迭代、复制与深比较不变;型面不变) | 零改动(普查零处就地改写) | 零改动 | 零改动 | 零改动 | pending | G-S10 |
10110
+
10111
+ #### 107a-1 · 登记读数的身份:哪些键与登记行是同一身份
10112
+
10113
+ - 登记行的 `id` = 服务端 `GET /v1/sessions/:id/background` 行上的 `id` = 引擎后台任务登记的句柄(后台代理那一行的句柄形是 `a` + 6..32 位小写十六进制)。
10114
+ - 缺席事件的 `taskId` 取自 fleet 行 id 的尾段,且可能被改写成先发布的那把 id(原尾段在 `wireTaskId`)。fleet 行 id 有两个来路:后台代理本身的行,id **就是**登记句柄;委派子代的行,id 是 `<runId> <子代会话 id>`,尾段是**会话 id**,不是句柄;工作流子代(`wa…`)不在后台登记上。
10115
+ - ⇒ 只有「fleet 尾段是登记句柄形」这一格与登记行是同一身份。归类口据此:行**在**(同值 id 的 `background_agent` 行)⇒ 按状态归类;行**不在** ⇒ 只有句柄形的键才**可能**读 `not_listed`(还要单副本位,见 107a-3),别的键一律 `unknown`。键桥 `engineAgentRegistryKeyOf` 取两位 id 里是登记句柄形的那一位(行帧先到时,归一后的进度帧把句柄放在 `taskId`、把会话 id 放在 `wireTaskId`;先发布的 id 为准时则反过来 —— 按位挑必有一形取错),判域在归类口里 —— 宿主自己拼的键也过这一道。
10116
+
10117
+ #### 107a-2 · `handsSeamDetail` 四句(逐字)
10118
+
10119
+ | 读数 | 文案 |
10120
+ |---|---|
10121
+ | `not_reported` | `whether this leg has built-in file-and-shell tools is not stated here — the engine did not report its hands seam (older engines and servers, and the static half of a manifest, never do); the tool roster may still answer it` |
10122
+ | `mounted` | `this leg of the run was assembled with its built-in file tools mounted — the engine says so; whether a shell is reachable is answered by the tool roster, not by this statement` |
10123
+ | `not_mounted`,`reason: 'no_execution_env'` | `this leg of the run was assembled with NO built-in file-and-shell tools — the engine states it mounted no hands on this leg because no execution environment was supplied, so on this leg the model had no tool of the engine's own for editing files or running commands (tools mounted by other conditions, such as external servers, and sub-runs delegated to other legs are not covered by this reading)` |
10124
+ | `not_mounted`,原因缺席 / 表外词 | 同上句首句尾,中段换成 `the engine states it mounted no hands on this leg (it gave no reason)` / `the engine states it mounted no hands on this leg (reason: <原因词,呈前消毒封长 64>, a word this build does not know)` |
10125
+
10126
+ #### 107a-3 · 射程:「没列」不等于「离场」—— 谁该给单副本位
10127
+
10128
+ - 登记是**服务端进程内**的:列表只含答这次请求的那个进程上的行(能力位 `listFace` 只保证端点在场,不保证本进程有这个会话的行)。多副本部署里请求落到别的副本时,本会话正在跑的后台代理一行都不在。
10129
+ - ⇒ **缺省**:句柄形的键行不在也读 `unknown`。代价:到期缺席行**不回收**,行上照旧那一句 `… it may still be running`,面板多留一行 —— 不会删错。
10130
+ - **该给** `{ singleReplica: true }` 的:宿主确知引擎是单进程 —— 典型是宿主自己拉起、只连这一台的本机引擎(终端 / 桌面端的本机模式)。给了之后(连同这一行所属会话 `sessionId`),句柄形的键行不在读 `not_listed`,到期回收并留痕(§102 回收判据)。
10131
+ - **不该给**的:连远程 / 云端服务端、经负载均衡的部署、不知道对面是几个进程。给错的代价:列表落到别的副本时把一只还在跑的子代按 TTL 删掉(行上留回收句,不静默,但行没了)。
10132
+ - 位只认自有键上的严格 `true`;行**在**时的归类(`running` / `ended`)与补行谓词都不看这一位。
10133
+ - 升级路径:服务端在列表应答里给出「这份清单覆盖本会话的全部副本」一类的覆盖信号后,本包改读那一位,单副本位退居兜底(KL-159)。
10134
+ - **列表上限**:服务端这条列表最多 500 行,按登记时刻新 → 旧截取 —— 一个会话登记里超过 500 行(后台 shell 的终态行一小时内不回收,不难攒满)时,**最早登记、跑得最久**的代理最先被挤出清单。⇒ 行数到了 500,「行不在」一律读 `unknown`,单副本位也换不回 `not_listed`(KL-166)。行**在**的归类与补行谓词不受影响。
10135
+ - **会话核对**:读数带着它读的是哪条会话。归类口 / 补行谓词给了 `sessionId` 而读数不是那条会话 ⇒ `unknown` / 一行不补。🔴 `not_listed` 臂**必须**给会话:不给 ⇒ 行不在也读 `unknown`(拿错了会话的读数本包分不出来,而「没列」是唯一能删一只可能还在跑的代理的臂)。行在时的归类与补行谓词不给 = 不核。
10136
+ - **读数出身**:能授权删行(`ended` / `not_listed`)或补行的,只有读口产出的那一个读数对象(包内按对象身份认)。展开复制、`structuredClone`、JSON 往返、Proxy、过滤或重组过的读数、手搭的读数一律读 `unknown`、补行空表 —— 截断判据按读到时的原始行数记在包内,把 500 行的清单过滤成短表骗不过它。读数、行表与每一行都冻结(就地改写抛 `TypeError`)。宿主要过滤,就在归类 / 补行的**结果**上过滤。
10137
+
10138
+ #### 107a-4 · `hands` 段与名册派生读口不是同一个事实
10139
+
10140
+ - `hands.mounted` 是**装配事实**:执行环境给没给 ⇒ 手带挂没挂(引擎把它算进装配指纹,同一装配的各腿相等)。`mounted: true` 包含桩环境,**不等于** shell 可达。
10141
+ - `handsMountedFromManifest` 是**逐腿名册事实**:这条腿最终名册里有没有由手带挂上的行 —— 名册是裁剪之后模型真看到的那一套,`excludeAllTools` / 按名排除之后可以一行不剩,而 `hands` 仍说 `mounted: true`。
10142
+ - 只有一个方向成立:`mounted: false` ⇒ 名册里零条手带行;反向不成立。⇒ 本版**不**改写名册派生读口的三态(那是判据改动),只另出读口;两处「没有手」的句子同句首句尾(同一个说话人),中段各说各的依据。
10143
+
10144
+ #### 107a-5 · 迟到 / 乱序的读数与稳定窗
10145
+
10146
+ - 两次读在飞、更新的那次先到、旧的那次后到:旧读数被**取代**(`isEngineAgentRegistryListingSuperseded` 为真)⇒ 归类口读 `unknown`、补行谓词空表。取代以「同一客户端 × 同一会话上**发出**更晚的一次读已带着行表**到货**」为准;更新的那次读不到(`read_failed` 等)不取代旧读数。读数原样传:拷贝 / 自建的读数判不出取代,而且在归类口与补行谓词里一律不作数(`unknown` / 空表)—— 被取代的读数复制一份也补不回已结束的行。
10147
+ - 同一次读数在路上时,那一行结束、宿主已撤行 —— 序号判不出这一形。宿主在发出读之前开始记「见到结束 / 撤掉的登记域键」,读数到货后作 `goneSinceRead` 交给补行谓词,命中的不补;不给 ⇒ 这一形会把刚撤的行补回来,直到下一次读数到货把它取代(KL-165)。
10148
+ - 稳定窗:进度帧可能先于行帧到达(漏斗「缓一拍」有界),那时宿主手上只有会话 id 那一行,本包无从把它桥到登记句柄。本客户端的读口**首次读到**这一 id 不到 30 秒(缺席侧同一常量 `ABSENT_SETTLE_MS`)的代理先不补,等行帧到来把两把键桥上;窗按包内单调钟自本地首见起算,与服务端的 `createdAt` 无关 —— 本机钟与服务端钟有偏、宿主重连(新客户端)后首读一只早已在跑的代理,都跳不过这个窗。首见按客户端 × 会话 × id 记,同一客户端后续的读数沿用;某一份最新读数里没有它、之后又出现 ⇒ 重新起算。登记时刻读不出的不补(补行事实要带它)。行帧晚于窗才到 ⇒ 照补,宿主会多一行,直到行帧到来 —— 宿主按 `engineAgentRegistryKeyOf(行帧)` 找到补过的那一行并入(KL-164)。🔴 复用同一只客户端:每次读都新包一层 `sessions` 就是每次一本新账,窗永远起不来(不补行,安全向)。
10149
+
10150
+ ### 107a′. 成文改口(旧判据眼作废 → 新判据眼)
10151
+
10152
+ **作废**(旧判据眼装 0.84.0 后判红是预期行为,不是回归):
10153
+
10154
+ 1. 按「`rewind: { rewindFiles: true }` 原样上请求体」断言的判据眼 —— 本版构造期抛 `TypeError`(G-S1)。
10155
+ 2. 按「`projectWorkflowRun` 无腿数组时 `agentCount: 0`」断言的判据眼(G-S6)。
10156
+ 3. 按「包装形 404 / 422(人话里带 `resume_at.*` 子码)判 `resume_at` 拒绝」断言的判据眼(G-S5)。
10157
+ 4. 按「`cancel_lost_race` 消息含 `retry cancel`」断言的判据眼(G-S8)。
10158
+ 5. 按「九张判定表的 `.add` 能改到包的判定」「九张判定表与 `new Set([...])` 严格深比较相等 / `constructor === Set`」断言的格(G-S4);按「判定数组能就地 `push`」断言的格(G-S10)。
10159
+ 6. 按「`handsMountedDetail(undefined)` / `(null)` 抛 TypeError」「认不出的入参回 `undefined`」「无行数的 `mounted` 渲 `undefined of them`」断言的判据眼 —— 本版起一律回「没报」那一句(`handsSeamDetail({ kind: 'not_reported' })` 同字节;G-H6)。按「会抛」写的端侧 try/catch 从此不再触发;按「回 `undefined` 就不渲」写的判空分支从此拿到一句串。认得的六形读数不受影响。
10160
+
10161
+ **改读**(判据的意思保留,换读法):
10162
+
10163
+ 1. 「缺席行回收入参的 `registry` 宿主今天只能给 `unknown`」(§102)—— 本版起宿主可以给真读数:缺席行到期那一拍调 `readEngineAgentRegistry` → `engineAgentRegistryReadingOf(listing, engineAgentRegistryKeyOf(缺席事件), { sessionId: 行所属会话, 单副本时 singleReplica: true })`(读数原样传,别展开 / 过滤 / 重组;`not_listed` 要带会话)。§102 的回收判据不变(`ended` / `not_listed` 才回收)。🔴 按 §102 计划写的「行不在 ⇒ `not_listed`」判据眼**改读**:没有单副本位时行不在读 `unknown`、不回收。
10164
+ 2. (验收方,换锚)按「sdk 帧键锚 31 项、`mandate` 领先登记」「停泊行五键不在 sdk 型面」「子路径入口下游恰两条找不到模块」断言的判据换锚:锚 32 项、领先登记表空;五键在型面;下游零条。
10165
+ 3. (承 §105a′)§105a′ 改读的「`sessionPolicyDeliverable` 比终端旧判官更严的三类」自 0.83.6 起是四类 —— 第四类是引擎退役名与含 `__` 而不以协议前缀开头的名字(§106);以 §106 为准。
10166
+ 4. (承 §105a′ 撤回 0.56.0 改名预告)新律「`wiring_manifest` 内部臂上的段键一律 `_sema_*`,不随上游声明改名」对本版新段同样成立:`hands` 段的超集键是 `_sema_hands`(今天十段),上游已声明 `WiringManifest.hands` 也不改名;端读 chrome 臂与视图上的去前缀名 `hands`。
10167
+
10168
+ **兑现**(此前成文的预告,本版执行):
10169
+
10170
+ 1. 0.57.0「公面判定表换形另立一批」—— 九张表换成只读 Set 子类(型面不变;严格深比较 / `constructor` 可见,按运行期行为面 BREAKING 写进 CHANGELOG)。改为冻结数组的那条路没走(那是型面 BREAKING,且 `.has` 读法全要换)。同一病形的数组面一并处置:包内调用期拿来判定的十五张数组冻结(T-C6)。
10171
+ 2. 0.71.3 Deprecated「34 个 `export *` 放大件候下一 minor 收回」—— 部分兑现:本版收回 26 名;8 名留下 —— `hostTimersFor` / `engineSessionParamFor` 不是放大件(§5a / §6b / §8 的多会话宿主契约,与 `hostSettingsFor` / `hostFsFor` / `hostSessionFor` 同族),撤回收回预告、长期留在公面;`unrefTimer` 不是放大件(跨宿主可移植的定时器原语,三端宿主自建保活定时器共用),长期留在公面;`shortTaskLabel` / `DENIAL_LIMIT_KINDS` / `engineCapNestedTrue` / `surfaceRememberNotApplied` 定 0.85.0 退出公面;`RULE_OFFERS_ABSENCE_REASONS` 留在公面(与 `@sema-agent/sdk` 根入口导出的是同一个数组对象)。
10172
+ 3. 0.46.0「`resume_at` 族文本兼容腿在最低服务端版本推过 7.51 之后退役」—— 本版退役。
10173
+
10174
+ **新增**:G-B1–G-B17(含 G-B6′)/ G-G1 / G-H1–G-H6 / G-S1–G-S11。
10175
+
10176
+ **不变**:缺席行四处配对判定与三句措辞(§102);`handsMountedFromManifest` 与 `handsMountedDetail` 认得的六形(字节不变);`askSurvivesPosture` 的判定(出身表只多一道「表里每个词都是上游已知词」的对账);审批卡上 `readRootCandidate` 的形与在场条件;审批回答体(本版不带读目录授权);`ASK_ORIGIN_WORDS` / `APPROVAL_MANDATE_WORDS` 的内容与次序;`rewind` 其余四键逐字展平;九张判定表的成员与次序;`blocked` 照旧算已释放 / 终态;`CLAIM_RELEASED_STATES` 四词与无头重连 run 行终态表(历史行上的 `timeout` 照旧算已释放、照旧合成终帧)。
10177
+
10178
+ 已发段(§23、§85、§86、§98、§101、§102、§105 与 0.46.0 / 0.56.0 / 0.57.0 / 0.71.3 的 CHANGELOG 段)不回改,以本段为准。
10179
+
10180
+ ### 107b. 缺席语义(逐键)
10181
+
10182
+ - `capabilities.background` 缺席 / `listFace` 非严格 `true` = 这台服务端没有登记读口(老服务端或没接会话属主面)⇒ `no_list_face`,**不打**端点;归类口读 `unknown`,补行谓词空。
10183
+ - `route_absent`(404 `not_found.route`)= 服务端比这条路由老;`ownership_required`(501 `capability.session_ownership_required`)= 部署没接会话属主面;`read_failed` = 其余一切(含 404 `not_found.session`、传输层失败、200 体读不出、**任一行**读不出)。四者都读 `unknown`:不删、不补行。
10184
+ - 登记行上 `description` 缺席 / 空串 = 不带;`createdAt` 非有限数 = 不带;`retained` 一律不带(见 B-6)。
10185
+ - 行不在登记里 ∧ 键不是登记句柄形 = `unknown`(不同域,不是「不在」)。
10186
+ - 行不在登记里 ∧ 键是登记句柄形 ∧ 单副本位缺席 = `unknown`(多副本下「没列」≠「离场」;不回收,多留一行)。
10187
+ - `singleReplica` 缺席 / 非自有键 / 不是严格 `true` = 没声明单副本。
10188
+ - 行不在登记里 ∧ 行数 ≥ 500(列表上限)= `unknown`(清单可能被截断;单副本位在也一样)。
10189
+ - 归类口 / 补行谓词的 `sessionId` 缺席 = 行在时不核会话;🔴 行不在时缺席 = 不许读 `not_listed`(读 `unknown`)。
10190
+ - 读数上的 `seq` / `sessionId` 只是展示量;取代判定与会话核对不读它们(读口私有的读数档案)。读口没经手的读数(拷贝 / 过滤 / 重组 / 手搭)= 认不出 = 归类 `unknown`、补行空表(取代判定对它答 `false`)。
10191
+ - `read_failed` 读数上的 `status` / `errorCode` 缺席 = 错误对象上没有(传输层失败 / 体读不出 / 值形不对:`status` 须是整数、`errorCode` 须是非空串),不编;其余三种原因从不带这两位。
10192
+ - 补行谓词 `nowMs` 缺席 = 调用那一刻的本包单调钟(与读口记首见同一只钟,epoch 锚定、量纲同 `Date.now()`;本谓词因此不是严格纯函数,同一入参不同时刻可答不同 —— 要可复现就显式传 `nowMs`);给了却不是有限数 = 坏钟,一行不补。本地首见缺席(首见账上没有这一 id)= 不补。`goneSinceRead` 缺席 = 不核(今天行为);给了却读不了 = 一行不补。登记行 `createdAt` 缺席 / 非有限数 = 不补(补行事实要带它;它不进稳定窗)。
10193
+ - 宿主键集 `hostRegistryKeys` 不是数组、也不是本 realm 的 Set(`undefined` / `Map` / 迭代器 / 跨 realm 的 Set / 对象 / 串)= 读不了,一行不补。
10194
+ - 通告读口:码不是那两只 / `toolCallId` 缺席或空串 / `detail` 非对象 ⇒ `undefined`(不认领);`reason` 缺席 = 引擎没给;granted 形上 `root` / `dir` 缺席或空串 = 读不了(整只 `undefined`;上游 granted 臂恒铸这两位);`covers` 缺席 = 目录,在场只认字面 `exact`,在场而别的值(含 `null`)= 读不了(不折成缺席)。**没有 granted 通告 = 什么都没加**。
10195
+ - `handsSeamDetail` 的入参认不出(非对象 / 别的 `kind`,含名册派生读数的 `not-mounted` / `unknown`)= 与 `not_reported` 同一句;名册派生的 `mounted` 读数与本读数同名,走 `mounted` 那一句(`rows` 不读 —— 两套读数各有措辞口,别交叉喂)。`handsMountedDetail` 的入参认不出(非对象 / 别的 `kind` 或 `why`,含 `hands` 段读数;`mounted` 却没有正整数 `rows`)= 同一句(两只措辞口共用一个铸点)。
10196
+ - `hands` 段缺席 = 没报(老服务端 < 7.103.0 / 老引擎 / 静态半场 / 外部推导)⇒ `not_reported`,不折「有手」也不折「没手」;`reason` 缺席 = 引擎没给原因(`not_mounted` 不补 `no_execution_env`);`mounted: true` 旁的 `reason` = 矛盾形,视图原样、读口按 `mounted` 判。
10197
+ - `WorkflowRunState.agentCount` 缺席 = run 记录上没有可读的腿数组(不知道);`0` = 腿数组在、而且是空的。不要把缺席渲成 `0 agents`。
10198
+ - `rewind` 合写项里任何表外子键在场 = 构造期 `TypeError`;退役的 `rewindFiles` 在场(`true` / `false` 同判,严格闭集:在场即拒)= 构造期 `TypeError`,消息是退役专句(点名去处);值为 `undefined` / `null` = 没给(不拒)。
10199
+ - `isResumeAtRejection`:错误对象上没有 `resume_at.*` 机读码(折叠码则看它带的原码)= `false`,不论人话里写了什么。
10200
+
10201
+ ### 107c. 黑盒判据骨架
10202
+
10203
+ > 🔴 标「本版证明」的格在**上一发布版**(0.83.6)产物上必须 FAIL、在 0.84.0 上必须 PASS;标「回归约束」的格两版都 PASS;标「端侧验收」的格验的是端换读之后的行为。请记下两次跑的产物标识(版本 + tarball shasum)。前缀:G-B = 登记读数、G-G = 读目录授权结论通告、G-H = hands 段、G-S = 陈旧逻辑清扫。
10204
+
10205
+ - **G-B1**(本版证明,纯包层;B-1 / B-2):假客户端 `{ sessions: { background: async () => ({ rows: [...] }) } }`,`caps = { background: { listFace: true } }` ⇒ 恰一次调用,`{ kind: 'rows' }`;`caps` 缺 `background` / `listFace: false` / `'true'` ⇒ `{ kind: 'unavailable', why: 'no_list_face' }` 且零调用。判别点:旧版没有这只读口。
10206
+ - **G-B2**(本版证明,纯包层):假客户端抛 `{ status: 404, errorCode: 'not_found.route' }` ⇒ `route_absent`;`{ status: 501, errorCode: 'capability.session_ownership_required' }` ⇒ `ownership_required`;`{ status: 404, errorCode: 'not_found.session' }` ⇒ `{ kind: 'unavailable', why: 'read_failed', status: 404, errorCode: 'not_found.session' }`;普通 `Error` / `{ status: '404', errorCode: 7 }` ⇒ `read_failed` 且没有 `status` / `errorCode` 两键。
10207
+ - **G-B3**(本版证明,纯包层):200 体 `{ rows: [好行, { id, type, status: 5 }] }` ⇒ 整只 `read_failed`(不给半张表)。
10208
+ - **G-B4**(端侧验收;射程:终端,本机引擎单进程,服务端 ≥7.102.0,宿主给单副本位):起一只后台代理,让它停在一张审批卡上(登记 `parked`),把它的 fleet 行弄消失 30 分钟以上 ⇒ 行不删、行上那句 `… it may still be running`;代理结束后下一拍 ⇒ 行回收并上一行回收句。同一场景不给单副本位 ⇒ 代理结束后行仍不回收(`unknown`),直到真终态帧到达。
10209
+ - **G-B5**(本版证明,纯包层;B-3):假客户端交一行 `{ id: 'a0123456789abcdef', type: 'background_agent', status: s, createdAt }`,读口读到的读数**原样**交给 `engineAgentRegistryReadingOf(listing, 'a0123456789abcdef')`:`pending` / `running` / `parked` ⇒ `running`;`completed` / `failed` / `killed` / `cancelled` ⇒ `ended`;`settled` / `RUNNING` ⇒ `unknown`(带不带单副本位同答)。同一行表手搭成 `{ kind: 'rows', rows: [...], sessionId, seq }` ⇒ 一律 `unknown`。
10210
+ - **G-B6**(本版证明,纯包层;身份):读口读到的空行表,键为会话 id 形(`0199a7c2-7f2e-7b61-9a3d-2f5d1c3b4a55`)/ `wa0123456789abcdef` / `e2e1` ⇒ `unknown`(带单副本位也 `unknown`)。`engineAgentRegistryKeyOf({ taskId: '<uuid>', wireTaskId: 'a0123456789abcdef' })` 与 `engineAgentRegistryKeyOf({ taskId: 'a0123456789abcdef', wireTaskId: '<uuid>' })` 都 ⇒ `a0123456789abcdef`;两位都不是句柄形 ⇒ `wireTaskId`。
10211
+ - **G-B6′**(本版证明,纯包层;射程):读口对会话 `S` 读到的空行表、键 `a0123456789abcdef`:不给选项 / `{}` / `{ sessionId: S }` ⇒ `unknown`;`{ singleReplica: true, sessionId: S }` ⇒ `not_listed`;`{ singleReplica: true }`(不给会话)⇒ `unknown`;`{ singleReplica: 'true', sessionId: S }` / `{ singleReplica: 1, sessionId: S }` / 原型链上的 `singleReplica: true` ⇒ `unknown`。
10212
+ - **G-B7**(本版证明,纯包层;读数经读口):同 id 两行读数不一 ⇒ `unknown`;同 id 但 `type: 'background_bash'` ⇒ `unknown`;读不到(四因)⇒ `unknown`。
10213
+ - **G-B8**(回归约束,纯包层;§102 回收判据不变):回收入参某行 `registry` 取 G-B5 / G-B6′ 的读数 ⇒ `running` 到期不删、`ended` / `not_listed` 到期回收且留痕读数原样、`unknown` 不删。
10214
+ - **G-B9**(本版证明,纯包层;B-5):读口读到登记 `parked` 一行、宿主键表为空,`nowMs` = 读到那一刻的本包单调钟(`performance.timeOrigin + performance.now()`)+ 30001 ⇒ 补行事实恰一条 `{ id, status: 'parked', createdAt, … }`;宿主键表含该 id ⇒ 空;登记 `completed` / 读不到 ⇒ 空。
10215
+ - **G-B10**(本版证明,纯包层;B-6):登记行带 `retained: true` ⇒ 读口行视图与补行事实上都没有这一位。
10216
+ - **G-B11**(本版证明,纯包层;列表上限):读口读到 500 行都不是该键的行表、键 `a0123456789abcdef`、`{ singleReplica: true, sessionId: <读的会话> }` ⇒ `unknown`;同样的 499 行 ⇒ `not_listed`;500 行里有它 ⇒ 照读 `running` / `ended`。
10217
+ - **G-B12**(本版证明,纯包层;会话核对):读口对 `'sess-A'` 读到的读数带 `sessionId: 'sess-A'` 与整数 `seq`;归类口给 `{ sessionId: 'sess-B' }` ⇒ `unknown`、给 `'sess-A'` ⇒ 照读;补行谓词给 `{ sessionId: 'sess-B' }` ⇒ 空;空行表 + `{ singleReplica: true }` 不给会话 ⇒ `unknown`、给 `'sess-A'` ⇒ `not_listed`。
10218
+ - **G-B13**(本版证明,纯包层;取代):假客户端让两次读挂起、先放行后发出的那次(登记 `completed`)、再放行先发出的那次(`running`)⇒ 先发出的读数 `seq` 更小、`isEngineAgentRegistryListingSuperseded` 为真,对它补行 ⇒ 空、归类 ⇒ `unknown`;后发出的那次为假、归类 ⇒ `ended`。后发出的那次读失败 ⇒ 先前那份不算被取代。对被取代的那份读数展开复制(`{ ...listing }`)/ `structuredClone` ⇒ 补行空、归类 `unknown`。`goneSinceRead: ['a0123456789abcdef']` ⇒ 那一行不补。
10219
+ - **G-B14**(本版证明,纯包层;稳定窗):把本包单调钟钉在 `C`(`performance.now = () => C − performance.timeOrigin`)时读到一行(`createdAt` 任意,含十小时前):`nowMs = C + 5000` ⇒ 不补;`C + 30001` ⇒ 补;`C + 30000` ⇒ 不补;`nowMs: NaN` ⇒ 空;`createdAt` 缺席 ⇒ 不补。
10220
+ - **G-B15**(本版证明,纯包层;坏入参):宿主键表给 `Map` / `undefined` / 串 ⇒ 空;能力位取值器抛、体上 `rows` 取值器抛、`sessions` 取值器抛 ⇒ 读口 resolve 为 `{ kind: 'unavailable', why: 'read_failed' }`(不 reject)。
10221
+ - **G-B16**(本版证明,纯包层;读数出身):读口读到的读数 `Object.isFrozen` 为真,`rows` 与每一行同;`listing.rows.push(…)` / `listing.seq = 999`(严格模式)⇒ `TypeError`;读到 500 行截断清单后过滤成新对象 `{ ...listing, rows: listing.rows.filter(…) }`,给 `{ singleReplica: true, sessionId }` ⇒ `unknown`;没被取代的读数的展开复制 / `structuredClone` / JSON 往返 ⇒ 归类 `unknown`、补行空,原对象照读(正控)。
10222
+ - **G-B17**(本版证明,纯包层;窗的钟):新客户端首读一只 `createdAt` 为十分钟前的代理、`nowMs` 缺席 ⇒ 补行空;`createdAt = Date.now() − 65000`(本机钟比服务端快 60 秒、代理实际才登记 5 秒)⇒ 同样空;首见过窗之后照补。
10223
+ - **G-G1**(本版证明,纯包层;G-1):`readReadRootGrantNotice({ code: 'approval.read_root_grant_rejected', detail: { reason: 'mismatch', toolCallId: 'c' } })` ⇒ `{ outcome: 'rejected', toolCallId: 'c', reason: 'mismatch' }`;表外原因词原样;`toolCallId` 缺席 / 空串 / 别的码 ⇒ `undefined`;granted 码带 `dir` / `root` ⇒ `outcome: 'granted'`;缺 `dir` 或 `root`(或空串)⇒ `undefined`;`covers: 'exact'` ⇒ 带 `covers`;`covers` 缺席 ⇒ 不带;`covers: null` / `'dir'` ⇒ `undefined`。
10224
+ - **G-H1**(本版证明,纯包层;H-1):`eventToSdkMessage({ type: 'wiring_manifest', hands: { mounted: false, reason: 'no_execution_env' } }, ctx)` ⇒ `message._sema_hands` 逐字等于入参段(旧版:`none/not_in_slice`);chrome 臂 `hands` 同值;`readSubmitWiringManifest({ wiringManifest: { hands: … } })` 同值。
10225
+ - **G-H2**(本版证明,纯包层):`mounted` 为 `'false'` / `0` / `null` / 缺席、段为 `null` / 数组 / 串 ⇒ 段缺席、其余段照投;`reason` 为 `''` / `5` / `null` ⇒ 只丢 `reason`;表外原因词原样;原型链上的 `hands` 不算。
10226
+ - **G-H3**(端侧验收;射程:服务端 ≥7.103.0,一台没配执行环境的部署):跑一次任务 ⇒ 接线回执视图 `hands: { mounted: false, reason: 'no_execution_env' }`;同一部署在服务端 7.102.0 上 ⇒ `hands` 缺席。
10227
+ - **G-H4**(本版证明,纯包层;H-2):`handsSeamReadingOf` 三态;`handsSeamDetail` 四句逐字(107a-2);`not_mounted` 句与 `handsMountedDetail({ kind: 'not-mounted' })` 句首(` — ` 之前)与句尾(`, so on this leg` 起)逐字相同;`handsSeamDetail(undefined)` / `handsSeamDetail({ kind: 'not-mounted' })` ⇒ 与 `not_reported` 同一句,不抛。
10228
+ - **G-H5**(回归约束,纯包层;H-3):`handsMountedDetail({ kind: 'not-mounted' })` 与 0.83.6 逐字节同;`handsMountedFromManifest` 对同一帧两版同答(帧上加了 `hands` 也不改它的答案)。
10229
+ - **G-H6**(本版证明,纯包层;H-3 行为面):`handsMountedDetail(undefined)` / `handsMountedDetail(null)` / `handsMountedDetail({ kind: 'not_mounted', reason: 'no_execution_env' })` / `handsMountedDetail({ kind: 'mounted' })` ⇒ 都等于 `handsSeamDetail({ kind: 'not_reported' })`,不抛(0.83.6:前两形抛 TypeError,第三形回 `undefined`,第四形渲 `… (undefined of them)`);`handsMountedDetail({ kind: 'mounted', rows: 2 })` 与 0.83.6 逐字节同。
10230
+ - **G-S1**(本版证明,纯包层;T-R1):`buildTaskRequest({ objective: 'x', sessionId: 's', live: true, rewind: { rewindFiles: true } }, 'interactive')` ⇒ 抛 `TypeError`,消息含 `rewind.rewindFiles`、「退役」、`6.0.0`、「删掉」、`rewind.restoreFiles`、`rewind.resumeAt`、`rewind.rewindFilesTo`;`rewind: { rewindFiles: false }` 同样抛同一句;`rewind: { rewindFiles: undefined, restoreFiles: true, resumeAt: 'u1' }` 不抛;`REQUEST_FIELD_MATRIX` 里含 `resumeAt` 的那一行 `field` 恰四段、无 `rewindFiles`。
10231
+ - **G-S2**(回归约束,纯包层):`rewind: { resumeAt: 'u1', resumeAtMode: 'before', restoreFiles: true, rewindFilesTo: 'u0' }` ⇒ 四键逐字展平,`unregisteredRequestKeys(req, 'interactive')` 为空。
10232
+ - **G-S3**(回归约束,纯包层;T-C2):`CLAIM_RELEASED_STATES` = `['completed', 'failed', 'blocked', 'timeout']`;`waitForClaimRelease('t', { get: async () => ({ status: 'timeout' }), budgetMs: 900, sleep: async () => {} })` ⇒ `released: true`;`terminalEventFromRunRow({ status: 'timeout', result: { status: 'timeout' } })` ⇒ `type: 'done'`;表外词同形 ⇒ `null`。
10233
+ - **G-S4**(本版证明,纯包层;T-C3):九张表逐一 `.add('x')` / `.delete(<首员>)` / `.clear()` ⇒ 抛 `TypeError`,表不变;`Object.isFrozen(table)` 为真;`table.constructor !== Set`、`assert.deepStrictEqual(table, new Set([...table]))` 抛(判不等)、`assert.deepEqual` 不抛;成员与次序与 0.83.6 逐字相同(回归约束)。
10234
+ - **G-S5**(本版证明,纯包层;T-R3):`isResumeAtRejection({ status: 404, errorCode: 'not_found.resource', message: 'resumeAt: no such message in this session (resume_at.unknown_event)' })` ⇒ `false`;422 × `(resume_at.no_session)` 同 `false`;`{ status: 404, errorCode: 'resume_at.unknown_event' }` ⇒ `true`(回归约束)。
10235
+ - **G-S6**(本版证明,纯包层;T-C1):`projectWorkflowRun({ id: 'x', status: 'running' })` 上没有 `agentCount` 键;`agents: 'bogus'` ⇒ 不抛、没有 `agentCount`;`agents: []` ⇒ `agentCount: 0`(回归约束)。
10236
+ - **G-S7**(本版证明,纯包层;T-R2):26 名逐一 `!('<name>' in await import('@sema-agent/client-core'))`;保留的 8 名(含 `unrefTimer`)仍在(回归约束)。
10237
+ - **G-S8**(本版证明,纯包层;T-C4):`new ControlRouter({ runs: { cancel: async () => { throw Object.assign(new Error('x'), { status: 409 }) }, submit: async () => ({ taskId: 't' }) } })` 取消撞 409 ⇒ `code === 'cancel_lost_race'`,消息含 `check what that decision did to the run before retrying the cancel`。
10238
+ - **G-S10**(本版证明,纯包层;T-C6):`REWIND_ERROR_CODE_PREFIXES.push('foo.')` ⇒ 抛 `TypeError`,之后 `isRewindFamilyCode('foo.bar')` 仍 `false`(0.83.6:`push` 成功、判定翻真);十五张数组逐一 `Object.isFrozen` 为真。
10239
+ - **G-S11**(回归约束,纯包层;T-C5):装着的引擎 7.33.1 真 `TaskRegistry` 注册一条没有持久存储的工作流 → 引擎的 TaskStop 工具停它 → TaskOutput 工具读回终态卡(`details.status === 'cancelled'`)→ `structuredToToolUseResult(details, 正文, true)` 之后 `isEngineWorkflowNotified(runId)` 为真、`outstandingWorkflowCount()` 回 0;同一张卡的模型面 JSON 经 `wireOutputToBody('TaskOutput', …)` 同样。
10240
+ - **G-S9**(端侧验收;射程:网页端):升级到 0.84.0 并删掉普通发送里的 `rewind` 位后,连发三轮 ⇒ 请求体上零 `rewindFiles`、引擎零弃用披露;不删那一位 ⇒ 第一轮就在构造期抛(证明不是静默丢)。
10241
+ - 包层行为钉在门 `run-engine-agent-absence-projection-test.mjs`(B / EB / BF 段)、`run-engine-notice-catalog-test.mjs`(H 段)、`run-wiring-manifest-projection-test.mjs`(N 段)、`run-sdk-floor-test.mjs`(②e 段)、`run-tool-roster-projection-test.mjs`(H12 段)、`run-task-request-omission-receipt-test.mjs`(F16b – F16e)、`run-selfheal-reopen-test.mjs`(G8④a / G8④a′)、`run-terminal-table-provenance-test.mjs`(C / E / E7 / F 段)、`run-wire-refusal-copy-test.mjs`(S3c)、`run-client-core-pure-test.mjs`(㉚ / ㉚′ / ㉚″ / TIMER④ / B5 / B6 / F3E 段)、`run-export-liveness-test.mjs`(G 段 removed 账)。
10242
+
10243
+ ### 107d. 端上要动的读点
10244
+
10245
+ 清扫各项来自本机克隆的只读检索(终端 09-25、网页端 09-27、桌面端 08-13、管理台 09-27 —— 克隆陈旧的只代表那一刻),以各端现状为准。
10246
+
10247
+ **终端**
10248
+
10249
+ - B-1 – B-5:缺席行到期闹钟响的那一拍 —— `readEngineAgentRegistry(client, sessionId, caps)` 一次(复用同一只客户端:补行窗按客户端记首见)→ 每只缺席行 `registry = engineAgentRegistryReadingOf(listing, engineAgentRegistryKeyOf(缺席事件), { sessionId: 行所属会话, 本机单进程引擎时再加 singleReplica: true })` → `reapEngineAgentAbsentRows`(判据不变)。🔴 `listing` 原样传:别展开 / 过滤 / 重组 / 缓存成别的对象 —— 认不出的读数一律 `unknown` / 空表;要过滤就过滤结果。🔴 行上要记缺席事件的**登记键**(`engineAgentRegistryKeyOf` 取):改写成先发布 id 的那一行,面板键与登记键不同。🔴 单副本位只在终端自己拉起、只连这一台的本机引擎时给;连远程服务端不给。补行:发出读之前开始记「见到结束 / 撤掉的登记域键」,读数到货后调 `engineAgentRegistryRowsMissingFromHost(listing, 宿主各行登记键, { sessionId, goneSinceRead })`,对返回的每条补一行(行键 = 登记 id;渲染与状态归端)。宿主各行登记键一律用 `engineAgentRegistryKeyOf` 取(对行上最近的事件或合并行);之后到来的主通道事件若 `engineAgentRegistryKeyOf(ev)` 等于某条补过的行的登记 id 而 `taskId` 不同(先发布 id 改写形),并入那一行。换读后删掉端侧恒答 `unknown` 的那个占位接缝。
10250
+ - G-1:要按卡说「目录加上了 / 没加」时换读 `readReadRootGrantNotice`(按 `toolCallId` 对卡;没有 granted = 没加)。
10251
+ - H-1 – H-2:要渲「这条腿没有手」时换读 `handsSeamReadingOf(view)` + `handsSeamDetail`;名册派生那一句照旧可用(两者不是同一个事实,107a-4)。
10252
+ - T-C1:工作流详情 / 列表降级行上 `run.agentCount > 0` 这类读法在型面改可选后编译不过 —— 按在场判;为了「不知道」补的那一枚壳侧超集位可以退役。
10253
+
10254
+ **网页端**
10255
+
10256
+ - T-R1:已不发 `rewind.rewindFiles`,零改动。
10257
+ - T-C1:工作流详情面的腿数那一段按 `agentCount !== undefined` 判。
10258
+ - B-1 – B-5:有后台代理面板时同终端,但**不给**单副本位(对面是服务端部署)⇒ 行不在读 `unknown`、不回收,只等真终态;补行谓词照用(读数原样传、复用同一只客户端)。
10259
+ - G-1 / H-1 – H-2:同终端(`hands` 零改动即得,视图多一键)。
10260
+
10261
+ **桌面端**
10262
+
10263
+ - 连本机引擎同终端(给单副本位);连远程引擎同网页端(不给)。清扫各项零读点(锁的版本远早于这些面)。
10264
+
10265
+ **管理台**
10266
+
10267
+ - 登记读数 / 通告 / `hands` 零读点;测试里把 `shortTaskLabel` 当「一定在公面上的名字」用的那一格,0.85.0 前换一个名字。
10268
+
10269
+ **验收方**
10270
+
10271
+ - 按 107c 各格;按 107a′ 作废 / 改读换锚。
10272
+
10273
+ ### 107y. 🔴 三端升级必读(固定段式)
10274
+
10275
+ 1. **换钉 `^0.84.0` 之前**:先把 `@sema-agent/sdk` 换钉到 `>=12.0.1`(peer 地板;装着 11.x 会见 peer 警告,本包的声明面引用了 12.x 才有的型)。sdk 12 的唯一 BREAKING(设备码回体 `verification_uri_complete` 改可选)若端上有把它当恒在串读的代码,同批改(在场 ⇒ 一键 / 二维码;缺席 ⇒ 展示地址 + 用户码)。`rewind.rewindFiles` 四端都已不发;仍在交它的宿主升级前删掉(不删 = 每一轮构造期抛)。**编译期会红的只有三类**:① 写 `SeamRewindSpec` 字面量带 `rewindFiles` 的(删掉那一位);② 把 `WorkflowRunState.agentCount` 当必有数字读的(按可选读,缺席不渲 0);③ 从包根 import 这 26 个内部件之一的(普查四端零处)。运行期会变的:`rewind.rewindFiles` 构造期抛(退役专句点名去处;`true` / `false` 同拒);九张判定表的 `add` / `delete` / `clear` 抛(普查零处),且它们是只读 Set 子类 —— 与普通 `new Set([...])` 严格深比较判不等、`constructor` 不是 `Set`(测试断言若这么比,改比成员);十五张判定数组就地改写抛(普查零处);`handsMountedDetail` 坏入参不再抛而回「没报」那一句;登记读数只认读口原样产出的对象、`not_listed` 要带会话。其余纯 additive。
10276
+ 2. **逐面**:终端 / 桌面端 —— 缺席行到期那一拍接登记读口与归类口(行上记登记键;读数原样传;带行所属会话;只有本机单进程引擎给单副本位),补行谓词按需(复用同一只客户端);要渲「没有手」时换读 `handsSeamReadingOf`;工作流详情的腿数按在场判。网页端 —— 删 `rewind` 那一位;腿数按在场判;有后台代理面板时同终端但不给单副本位;`hands` 零改动即得。管理台 —— 零读点;`shortTaskLabel` 夹具 0.85.0 前换名。审批卡「放行并加目录」本版**不接**(候服务端能力位)。
10277
+ 3. **成文改口**:见 107a′(作废 / 改读 / 兑现 / 新增 / 不变);已发段不回改,以本段为准。
10278
+
10279
+ **包侧缺口:** 登记读数 —— ① 登记只列答请求的那个服务端进程上的行;没有上游覆盖信号之前,「行不在 ⇒ 可回收」只靠宿主的单副本位,不给位时到期缺席行不回收(多留一行)、给错位时多副本部署会删掉还在跑的子代(KL-159)· ② 补行谓词按宿主给的**登记域**键判「有没有这一行」,宿主只记了面板键(改写后的先发布 id)时会多补一行(KL-160)· ③ 列表 500 行上限:行数到上限时行不在一律 `unknown`,这类会话里缺席行只等真终态(KL-166)· ④ 读数取代按发出序近似;同一次读数在路上时结束的行,只有宿主给了 `goneSinceRead` 才不补回;读数只认读口产出的那一个对象,宿主要过滤只能过滤结果(KL-165)· ⑤ 补行稳定窗 30 秒,自本客户端首见起算:行帧晚于窗才到 ⇒ 宿主多一行直到并行;每次读都新包一层 `sessions` ⇒ 每次新账、永不补行(KL-164)· ⑥ 登记状态词的终态划分没有上游运行期值可取,本包按 sdk 七词型面编译期穷举(上游加词当天编译红;运行期新词读 `unknown`)(KL-161);读目录授权 —— ⑦ 回答体上的授权(「放行并加目录」)候服务端「能受理」的能力位,本版不发;结论通告读口已在(KL-162);`hands` —— ⑧ 服务端 7.103.0 发布前真部署上恒缺席;`reason` 与 `mounted` 在引擎运行期耦合、在型上独立,矛盾形原样透传、读口按 `mounted` 判(KL-163);审批词表 —— ⑨ 出身词 / 强制位词两张词表仍是本包的一份,对 sdk 运行期值逐词对账,sdk 在两次提货之间加词时本包到下次提货才跟(KL-167);清扫 —— ⑩ 冻结判定表挡不住 `Set.prototype.add.call(table, x)` 这种刻意绕开实例方法的写法(JS 的 Set 没有真冻结;换冻结数组是型面 BREAKING,本版不取)(KL-168)· ⑪ 九张 Set 与十五张判定数组之外,公面上其余数组形导出(展示 / 拼装用,或每行是对象)运行期没冻结(KL-169)· ⑫ 收回的内部件对从包内部路径深 import 的用法不设防(包的 `exports` 只开根入口与 `./registry`,绕过它属不受支持的用法)· ⑬ `mcpReconnect` 的注入面与 sdk 12 的 `sessions.mcpReconnect(sessionId, server, opts?)` 第二参形不同,宿主不能直接传 sdk 客户端(KL-171)· ⑭ 对 ≤7.50 的服务端,不带码的 `resume_at` 拒绝不再触发去锚重发(支持窗外;KL-172)· ⑮ 读目录授权 granted 通告形坏时读口答 `undefined`,宿主会按「没加」说,今天不可达(KL-173)· ⑯ 补偿登记里一条「待上游确认后退役」的说明串仍是未兑现形(KL-174)。
10280
+
9617
10281
  ## §106 🆕 0.83.6(2026-09-27)会话规则记录的无损判定补判定缺口:引擎会拒启的两类名字改判「不写」+ 成因词 `legacy_tool_name` + 现名出路位 `currentName`(patch;根公面运行期导出不变;公面类型不变;`SessionPolicyWithheldWhy` +1 员 `legacy_tool_name`〔穷尽分支的端编译期红〕;`SESSION_POLICY_WITHHELD_WHY` 5 → 6;`SessionPolicyWithheldRule` +1 可选位 `currentName`;`peer_wide` 那句改措辞〔判决不变〕;零投影臂;peer sdk 地板 `>=11.3.0` 不动)
9618
10282
 
9619
10283
  > **patch**,修 0.83.1 起的一个判定缺口(CC-226;本节按 0.83.6 的读法写,若与本版发布帖不一致,以发布帖为准):