@sema-agent/client-core 0.82.7 → 0.83.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 (58) hide show
  1. package/CHANGELOG.md +97 -0
  2. package/README.md +15 -7
  3. package/dist/adapt/arms.d.ts +3 -2
  4. package/dist/adapt/arms.js +17 -11
  5. package/dist/adapt/ids.js +12 -8
  6. package/dist/adapt/textStream.d.ts +3 -2
  7. package/dist/adapt/toolCards.d.ts +2 -3
  8. package/dist/adapt/toolCards.js +1 -1
  9. package/dist/adapt.d.ts +1 -1
  10. package/dist/adapt.js +13 -6
  11. package/dist/adapter/activeRunSelfHeal.js +34 -17
  12. package/dist/adapter/downstream/eventToSdkMessage.js +1 -1
  13. package/dist/adapter/downstream/terminalToSdkResult.d.ts +2 -4
  14. package/dist/adapter/downstream/terminalToSdkResult.js +46 -8
  15. package/dist/adapter/runStream.js +25 -8
  16. package/dist/clientSlice.d.ts +0 -5
  17. package/dist/displayUntrusted.d.ts +24 -0
  18. package/dist/displayUntrusted.js +1437 -0
  19. package/dist/engineNoticeCodes.js +4 -0
  20. package/dist/fleet/fleetRowAgentType.d.ts +0 -1
  21. package/dist/fleet/fleetRowAgentType.js +0 -3
  22. package/dist/fleetTaskDesc.js +3 -3
  23. package/dist/gateVocabulary.js +1 -1
  24. package/dist/hitl/approvalDecisionNoteAudit.js +4 -2
  25. package/dist/hitl/approvalResolution.js +2 -0
  26. package/dist/hitl/frameRouter.d.ts +3 -2
  27. package/dist/hitl/sessionPolicyDeliverable.d.ts +14 -0
  28. package/dist/hitl/sessionPolicyDeliverable.js +80 -0
  29. package/dist/hitl/toolApprovalWire.d.ts +1 -0
  30. package/dist/hitl/toolApprovalWire.js +56 -10
  31. package/dist/hooksWireCaps.d.ts +6 -1
  32. package/dist/hooksWireCaps.js +220 -13
  33. package/dist/host.d.ts +25 -0
  34. package/dist/index.d.ts +4 -0
  35. package/dist/index.js +3 -0
  36. package/dist/liveInitToolFace.d.ts +4 -2
  37. package/dist/liveInitToolFace.js +2 -2
  38. package/dist/model/catalogLoader.d.ts +1 -6
  39. package/dist/panelRunningHistory.d.ts +3 -2
  40. package/dist/peerFrames.d.ts +0 -1
  41. package/dist/peerFrames.js +2 -1
  42. package/dist/pluginHooksWire.d.ts +92 -0
  43. package/dist/pluginHooksWire.js +429 -0
  44. package/dist/printInitToolFace.js +1 -1
  45. package/dist/request/printNotification.js +26 -26
  46. package/dist/seam.d.ts +8 -2
  47. package/dist/seam.js +18 -7
  48. package/dist/subagent/engineSubagentResume.js +2 -1
  49. package/dist/systemReminderTag.d.ts +0 -1
  50. package/dist/systemReminderTag.js +0 -3
  51. package/dist/toolResult.js +1 -0
  52. package/dist/uuidV5.d.ts +3 -0
  53. package/dist/uuidV5.js +178 -0
  54. package/dist/webSearchWireCaps.d.ts +0 -3
  55. package/dist/webSearchWireCaps.js +21 -51
  56. package/dist/wireFailureShape.d.ts +2 -1
  57. package/docs/INTEGRATION-CLIENTS.md +794 -13
  58. package/package.json +2 -2
@@ -19,11 +19,11 @@
19
19
 
20
20
  | 项 | 值 | 真源 |
21
21
  |---|---|---|
22
- | 本包 | `@sema-agent/client-core` **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.2.1**(value-level,非 type-only;**0.79.0 抬版**: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.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.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
- | 公开导出面 | **1240** 个运行期符号(+ **59 个测试钩,两种拼法**:35 个 `__*ForTests` + 24 个 `_*ForTest` —— 两种都在 `public-export-baseline.json` 的 `testHookNames` 里、各自受棘轮管,**不在** `names` 的 1240 里。运行期 `Object.keys(dist/index.js)` 的全量 = 1240 + 59 = **1299**;只剔双下划线那 34 个会多数出 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
+ | 公开导出面 | **1254** 个运行期符号(+ **59 个测试钩,两种拼法**:35 个 `__*ForTests` + 24 个单下划线开头(22 个 `_*ForTest` + `_resetLiveQuestionStore` / `_resetUltracodePreset`) —— 两种都在 `public-export-baseline.json` 的 `testHookNames` 里、各自受棘轮管,**不在** `names` 的 1254 里。运行期 `Object.keys(dist/index.js)` 的全量 = 1254 + 59 = **1313**;只剔双下划线那 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
 
@@ -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`(**1240** 项;该基线只覆盖**根**入口,子路径入口 `./registry` 的名单在 §86 与 `scripts/run-sdk-registry-transit-test.mjs` A / C 段)。
128
+ > 全集真源 = `scripts/public-export-baseline.json` 的 `names`(**1254** 项;该基线只覆盖**根**入口,子路径入口 `./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
- 1240 项的内部构成(帮助端估读表大小;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):**341** 项是 `SCREAMING_SNAKE` 常量数据表/词汇表
152
+ 1254 项的内部构成(帮助端估读表大小;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):**347** 项是 `SCREAMING_SNAKE` 常量数据表/词汇表
153
153
  (矩阵、键集、env 名、锚串)而非可调用物;**7** 项是 PascalCase 运行期值
154
154
  (`ControlRouter` / `ControlSafetyError` / `HitlBridge` / `HitlSafetyError` / `DecideTransportRetryExhaustedError` / `APIError`);
155
155
  **37** 项是 `*For(sessionKey, …)` 的 per-session 变体(0.72.0 −4:`clearArmedGateFor` / `onGateArmedFor` / `registerArmedGateFromQuestionIdFor` / `notePlanReviewAnsweredIfDecisiveFor` 退出公面)(§6;其中 `engineNamespaceKeyFor` 是命名巧合 —— 参数是 baseUrl 不是 sessionKey,见域 14)。
156
156
 
157
- ### 2b. 域图(16 域,逐域计数之和 = 1240)
157
+ ### 2b. 域图(16 域,逐域计数之和 = 1254)
158
158
 
159
159
  | # | 域 | 名数 | 承重导出 | 用途 | 实现锚 |
160
160
  |---|---|---|---|---|---|
161
- | 1 | **适配内核(下行主链)** | 66 | `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 | **适配内核(下行主链)** | 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` |
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 主战场) | 212 | `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 崩溃收敛读面)、`src/gateOutcome.ts` |
163
+ | 3 | **HITL 决断卡链**(§4/§5 主战场) | 215 | `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 会话规则无损判定)、`src/gateOutcome.ts` |
164
164
  | 4 | **子代 wire + 面板侧信道台账** | 93 | `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/engineInlineTaskStats.ts`、`src/engineToolLabelStore.ts`、`src/liveQuestionStore.ts` |
165
- | 5 | **fleet 投影** | 38 | `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` |
165
+ | 5 | **fleet 投影** | 39 | `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:展示层安全出口单源,本域三只旧口的字符面引擎) |
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
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
168
  | 8 | **工具结果卡** | 25 | `displayBody`(0.78.1 CC-113:工具结果正文的人类面读口,剥本包铸的不可信围栏,三形互不折叠;§83)· `structuredToToolUseResult` · `readAsyncLaunchedAgentReceipt` · `wireOutputToBody` · `parseModelFacingBash` · `getPatchFromContents` · `toolEndResultToUserFrame` · `flattenToolOutput` | 铸端要渲的 `tool_result` 卡体,含客户端 diff hunk(唯一 runtime dep 的用处) | `src/toolResult.ts`、`src/printToolResultFrame.ts`、`src/diff/patch.ts` |
169
- | 9 | **能力/旋钮 wire 门族** | 170 | `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` · `resolveWebSearch` + `buildWebSearchEnv` · `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 拒绝判定层) |
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
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` |
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
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 | **引擎词汇表与包自检** | 111 | `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` 67(0.72.11 CC-49: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`)|
176
+ | 16 | **引擎词汇表与包自检** | 111 | `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`**,
@@ -1553,7 +1553,7 @@ CHANGELOG 0.29.0「已知局限」段与相应 JSDoc 都有成文。**别在读
1553
1553
 
1554
1554
  | **P-42** | low @cli @web @desktop | 🆕 **Esc halt 只上收了判定,发射面仍在各端**(0.47.0 件③,刻意的分工不是半成品):`planInteractiveHalt` 给判据与升级码闭集,`POST /v1/runs/:id/interrupt` 的**发射**(以及 `?session=` 供给、超时窗、台账、留痕)仍归端。cli 侧那条「裸 fetch 直拨 interrupt」的网络面豁免,**退役条件就是端接上这个口子**(壳换装不在 0.47.0 批内) | `src/interactiveHalt.ts`;§10 | 按 §10b 的分支表接:判定用本包,发射用端自己的传输腿;🔴 halt 必须排在撕 SSE **之前**(§10c 第 1 条) |
1555
1555
 
1556
- | **P-43** | med(治理面)@cli @web @desktop | 🆕 **`hooksForWire()` 只守住了本地执行器四条治理腿里的三条**(0.52.0 L-67④ 补了第三条,第四条**在册未修**):cli 仓那份本地执行器(`utils/hooks/hooksConfigSnapshot.ts` 的 `getHooksFromAllowedSources`,**cli 仓坐标不是本仓坐标**)的第四条腿 = `disableAllHooks` 出现在**非** managed 来源(user/project/local)时按 CC 语义降级成「只跑 managed hooks」。本包今天**只读** `policySettings.disableAllHooks` ⇒ 该形在引擎腿上**不成立**(用户把自己的 hooks 关了,引擎照投照跑)。**为什么不做单边近似**:cli 那条腿读的是**合并后**的标量(四源按 policy→user→project→local 后写覆盖前写),而本包 `SettingsPort` 只有 per-source 读口 —— 拿「任一来源为 true」去近似会在「user 写 `true`、local 写 `false`」这一形上**判反**(cli 那边是**不**限制)。忠实复刻要给 `SettingsPort` 加一个合并读口 = **公面改动**(端要跟车实现),属另一批 | `src/hooksWireCaps.ts`(头注「在册缺口」段);§15b/§15d | 端**不要**假定「用户 settings 里的 `disableAllHooks` 会挡住引擎腿的 hooks」——今天只有 **managed(policySettings)** 那一份挡得住。要它落地按 [C162] 令④ 回 C 板提(正位解在包侧:`SettingsPort` 补合并读口 + 本函数补第四条腿) |
1556
+ | **P-43** | ✅ **已收(对实现了读口的宿主)**(0.83.0,CC-162) | 🔧 **`hooksForWire()` 第四条治理规则 0.83.0 已补**:非 managed 来源(user / project / local / flag)的 `disableAllHooks` 按**合并值**判 —— `SettingsPort.mergedDisableAllHooks?()` 为 `true` ⇒ 只发 managed 的 hooks(非 managed 设置关不掉组织下发的),会话目标的 Stop 钩子一并不发;宿主没实现这个可选读口 ⇒ 仍是旧行为(只认 managed 那一份),每个已装端口告警一次;读口抛错 ⇒ 按合并值为真处置(managed 的照发)。**合并顺序订正**:本行旧文「四源按 policy→user→project→local 后写覆盖前写」是错的 —— 真序 user → project → local → flag → policy,policy 最后写、优先级最高;policy → user → project → local 是本包发往引擎的 hooks 数组的**拼接**顺序,不是合并标量的顺序。不做逐源近似的理由不变(「任一来源为 true」在 user=`true` ∧ local=`false` 上判反)。余项:CC 云会话路径的逐来源语义本版不跟、宿主的安全模式本包没有读口(§100 包侧缺口 ⑤;0.83.1 起插件 hook 有安全·bare 位 `suppressedByStartupMode`(§101),设置来源仍没有) | `src/hooksWireCaps.ts`(头注「第四条腿」段)· `src/host.ts` `SettingsPort.mergedDisableAllHooks`;§15b/§15d;§100a-5 | 装 `SettingsPort` 的宿主实现 `mergedDisableAllHooks()`,返回本机 hooks 执行器读的同一个合并值;**未实现**的宿主仍**不要**假定用户 settings 里的 `disableAllHooks` 会挡住引擎腿的 hooks |
1557
1557
 
1558
1558
  | **P-44** | ✅ **已收**(0.58.0,sdk 8.2.0 提货)@cli @web @desktop | ✅ **上游已补齐,本条转已收** —— sdk **8.2.0**(S-134 五锚)把这一族型面缺口一次补完:①`respond` 体 `persistRule` 由单臂 `{rule}` 换成具名**两臂互斥**联合 `PersistRuleSelection`(`{rule, edited?}` ∣ `{batchOfferIndex}`,互斥用 `?: never` 钉在编译期 ⇒ server 那句 `PERSIST_RULE_BATCH_EXCLUSIVE_ERROR` 400 永远打不到线上);②`ToolApprovalFrame` / `ApprovalCard` / `PendingCheckpoint` 三腿同一个 `RuleOffer` 判别联合(含 `match` 四员闭词表、成员 `command`/`directoryRead` 两臂、additive `uncoveredDetail`);③`ToolApprovalRespondAck` 补 `persistedRule` / `persistedRules` / `persistedRuleAnchors` 三位。🔴 **本包侧本来就零 cast、也不需要 cast**(0.57.0 原文,逐字仍成立):本包**不铸 respond 的 wire 体** —— `RespondToolApprovalFn` 是**宿主注入**的函数型,包只把扁平兄弟位(`persistRule: string` / `persistRuleEdited?: true` / `persistRuleBatchOfferIndex?: number`)交给注入面。⇒ 吃这个缺口的一直是**三端的注入面**。本包 0.58.0 这一侧的动作是:归一形 `RuleOffer` 一族改由 sdk 派生、`ToolApprovalRespondAckView` 与 `PersistedRuleAnchor` 两个包内自铸形按各自写下的退役条款回收成 sdk 形的别名、`AHEAD_OF_ANCHOR` 里那条 `ruleOffers` 领先登记到期自红删除(详见 **§22a**)。🔴 **三端还要做的那一半(本条转已收之后的剩余动作)**:注入面那处宽 `cast`(或自铸的 respond 包装形)现在可以删掉,改直接用 sdk 8.2.0 的 `PersistRuleSelection` —— 两臂互斥由编译期钉,`{rule, batchOfferIndex}` 同场会**编译红**(这正是要的);`batchOfferIndex: 0` 逐字进 body(`0` 不被 falsy 吞)。同样别再在端侧自铸同名 `RuleOffer` 形:归一形与它的伴生类型自 0.57.0 起在本包公面上,三张闭词表自 0.58.0 起也在(§22b) | `src/hitl/toolApprovalWire.ts`(两处「候 sdk 补锚」头注已随本批锚到 8.2.0 / 回收)· `scripts/run-approval-frame-keys-test.mjs`(该条 `AHEAD_OF_ANCHOR` 登记已删)· `scripts/run-sdk-floor-test.mjs`(地板 8.2.0) | 端按上一栏「剩余动作」删自己的宽 cast;peer 地板随本包抬到 `>=8.2.0`,提货前先抬依赖 |
1559
1559
 
@@ -4637,7 +4637,7 @@ an argument」。audience 答另一问:这条事实**说给谁听**。
4637
4637
  **签名**
4638
4638
 
4639
4639
  ```ts
4640
- ENGINE_NOTICE_CODES: readonly string[] // 69 码,顺序同源(core 7.29.0 +1 route.response_model_mismatch;0.82.1)
4640
+ ENGINE_NOTICE_CODES: readonly string[] // 71 码,顺序同源(core 7.31.0 +2:config.context_settings_swapped〔7.30.0〕/ config.secret_env_scrubbed;0.83.0。此前 core 7.29.0 +1 route.response_model_mismatch;0.82.1)
4641
4641
  ENGINE_NOTICE_AUDIENCE: Readonly<Record<string, 'user' | 'operator'>>
4642
4642
  noticeAudienceOf(code: unknown): 'user' | 'operator'
4643
4643
  engineNoticeInCatalog(code: unknown): boolean
@@ -9599,6 +9599,787 @@ installCoreValuePorts({ resolveAutonomousLoopPrompt, loosenReasons, combinePolic
9599
9599
 
9600
9600
  **包侧缺口:** ① 出包面注释存量(别仓名 / 票号 / 帖号 / 过程词)与卫生门判据太窄(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)。
9601
9601
 
9602
+ ## §101 🆕 0.83.1(2026-09-26)展示层安全出口三端单源 `displayUntrusted` 与合成终局行 / `errors[]` 铸点洗凭据(CC-112 / CC-187)+ 会话规则记录的无损判定归包(CC-117)+ 插件 hook 执行方逐条判定与「不会执行」清单(CC-174)(patch;根公面 +16 名,1238 → 1254〔`displayUntrusted` +1;CC-117 +2 函数 +1 常量;CC-174 +7 函数 +5 常量〕;公面类型 +26;`SettingsPort` +1 可选成员;`hooksForWire` +1 可选参;结果帧 `errors[]` 与合成终局行正文的凭据位换成记号〔wire 可见,方向只会更安全〕;设置来源的 `mcp_tool` / exec 形 hook 条目不再上请求体;peer sdk 地板 `>=11.3.0` 不动)
9603
+
9604
+ > **patch**,三件同发(本节按 0.83.1 的读法写;若与本版发布帖不一致,以发布帖为准):
9605
+ > ① **展示层安全出口归包**(CC-112 / CC-187):新公面口 `displayUntrusted` —— wire 派生文本上屏前的合成出口(凭据两网 ∘ 字符三网),三端一只;本包合成的终局行与结果帧 `errors[]` 在铸点洗掉凭据,三端拿到的就是净的;交互车道重建的合成行带上行类旗;回决备注与子代续跑收据两处读口改经同一只字符面引擎,多收几族危险字符。
9606
+ > ② **会话规则记录的无损判定归包**(CC-117):`sessionPolicyDeliverable` 答「这一批规则能不能原样写进这条会话的规则记录」,整批可送才送;五词成因与每词一句用户面话单源。宿主换调后删掉自己那一份。
9607
+ > ③ **插件 hook 执行方逐条判定**(CC-174 本包这一半;设计帖 [8199],裁定 C-R108):每轮一份计划,逐条判「投给引擎 / 本客户端执行 / 如实不跑」;开机一次性「不会执行」清单与 `/hooks` 执行方标注的措辞单源。投给引擎那一臂候引擎能力位 `taskSettings.pluginHooks`,截至本版恒不触发;判定、清单、标注与本地跳过今天就生效。同批从请求里拿掉设置来源两类引擎接不住的条目。
9608
+ > **表态现势**:终端已在 [8202] 认领插件 hook 那一半;其余各件本版不设表态窗,各端列写 09-25 读点普查的结论。
9609
+
9610
+ ### 101a. 处置表
9611
+
9612
+ 各端列的词:`pending·认领` = 已表态认领、尚待改(附帖号);`pending` = 有读点待改或建议改(格内注明是不是必改);`n/a` = 该端零读点,或零改动即得(按 09-25 对各端主干的只读检索);`consumed` / `declined` 本版暂无。具体坐标见 101d。
9613
+
9614
+ **展示层(D-*)**
9615
+
9616
+ | # | 面 | 旧 → 新 | 终端 | 网页端 | 桌面端 | 管理台 | 验收方 | 本节 |
9617
+ |---|---|---|---|---|---|---|---|---|
9618
+ | D-1 | `displayUntrusted(text, opts?)`;型 `DisplayUntrustedOptions` / `DisplayMark`(CC-112) | 公面上没有呈前合成出口(字符面三只旧口各管一族,凭据面本包没有)→ **新增**:wire 派生文本上屏前的合成出口。五张网默认全开 —— 凭据 URL 结构面、凭据词级面、控制符、双向与格式字符、行折平;顺序为凭据 → 字符 →(字符面改动过字节时)凭据 → 字符 … 到不动点 → 封长(截断截出新形时在截断串上再跑一遍)。凭据两网在剥掉着色序列 / 格式字符 / 控制符 / 本出口转义记号的判别视图上匹配、映回原文遮盖。幂等(含封长);干净文本原样返回(默认形开着行折平:换行、连续空白与首尾空白仍会折平);只管呈现,不参与任何判定。网与选项见 101a-1 | pending(必改:自带同名叶子换装,同名影子豁免到期 0.85.0) | pending(建议,非必改) | pending(建议,非必改) | pending(建议,非必改) | pending | 101a-1 · 101b · G-D4 / G-D5 / G-D8–G-D15 |
9619
+ | D-2 | 合成终局行正文(`failed` 帧上不是字符串的 `errorMessage` / `errorCode` 按缺席处理,不再抛):终态错误行(`API Error:` / `Run stopped:` / `Run blocked…` / `Model output error:` 各形与「会话被占」那一句)与 `Outcome unknown:` 行;行上 `_sema_api_error_message: true`、`message.model === '<synthetic>'`(CC-187) | 引擎错误原话原样进正文(本包不洗;洗消只在终端自己的出口做,且只认 0.83.0 已改名的旧行类旗)→ 本包在**铸点**过凭据两网(不做字符面 —— 这是转录 / 机读字节,字符面归呈现边界)。行首身份与其余字节逐字节不动,只换凭据位;身份判定(治理 / 模型输出 / 会话被占)仍按引擎原话判完再洗。print 车道与交互车道是同一份产物 | pending(自己那一处洗消退役或降为兜底) | n/a(零改动即净) | n/a(零改动即净) | n/a(零改动即净) | pending | 101a-2 · G-D1 / G-D2 |
9620
+ | D-3 | 结果帧错误信封 `errors[]`(CC-187) | 引擎错误原话原样 → 🔴 逐条过同一对凭据网,凭据位换记号;条数、顺序与其余字节不变(**wire 可见的行为变化,方向只会更安全**)。射程按载体:被挡原因(不论引擎、模型或 hook 反馈写的)进了 `errors[]` 就照洗;成功臂 `result`、错误信封的 `_sema_salvaged_result` 与 assistant 正文行一个字节不碰。非字符串元素原样放回。记号两侧原有的控制符 / 格式字符留着(机读面只换值、不改形,字符面归呈现边界)。`Outcome unknown:` 行与 `errors[0]` 洗后仍是同一句 | n/a(`-p` 投影层自带的凭据洗法从此多余,幂等) | n/a(按 `errors[0]` 取失败详情的读点零改动即净) | n/a | n/a | pending(按原样断言凭据字节的判据改锚) | 101a-2 · G-D1 / G-D3 |
9621
+ | D-4 | 交互车道(`adapt()` 转录平面)上的合成终局行 | 重建行丢掉行类旗(只剩 `model: '<synthetic>'` 可认)→ 上游帧带 `_sema_api_error_message: true` 时重建行同样带上;模型行零新增键;正文不洗第二遍(铸点已洗) | n/a(按 §100d K-10 起别名的,别名点在 `adapt()` 之后也读得到) | n/a | n/a | n/a(`adapt()` 之前已让位吞行) | pending | 101b · G-D2 |
9622
+ | D-5 | `escapeDisplayControlChars` / `collapseLabel` / `capForDisplay`;同伴消息署名规范化;hook 故障横幅 | 各写一份字符类 → 改由同一只字符面引擎实现,**输出逐字节不变**。字符集保持各自旧集:双向族按枚举(U+061C / U+200E / U+200F / U+202A–U+202E / U+2066–U+2069 / 行段分隔符),**不含**零宽 / 软连字符 / 标签字符;署名规范化只折 C0 / DEL / 行段分隔符 | n/a | n/a(`collapseLabel` 读点零改动) | n/a | n/a | n/a | 101a′ · G-D7 |
9623
+ | D-6 | `readDecisionNoteAudit(ack).note`;`decisionNoteAuditLine(...)` 引用的备注 | 只清控制字符 → 双向重排 / 格式字符、行段分隔符与孤代理项也折成空格(此前原样,能把一条拒绝理由在屏上重排成另一句);控制字符照旧折成空格、空格串并一、200 字封长加省略号;不间断 / 全角空格等用户原文照旧保留;凭据位不洗(回显的是服务端行上的正文);清洗后为空的正文与纯空白同处置(不算回显,不渲空引号) | n/a(零改动) | n/a | n/a | n/a | pending | G-D6 |
9624
+ | D-7 | `resumeSettledSubagent(...)` 成功时的 `receipt`;失败时的调试日志行 | 只把 C0 / DEL 换 `.` → C1(如 U+0085)、双向 / 格式字符与孤代理项也换 `.`(收据里拼着模型起的子代名);收据 240 字封长不再截出半个代理对;凭据位不洗(收据是服务端铸的文案) | n/a(零改动) | n/a | n/a | n/a | pending | G-D6 |
9625
+
9626
+ **会话规则(P-*)**
9627
+
9628
+ | # | 面 | 旧 → 新 | 终端 | 网页端 | 桌面端 | 管理台 | 验收方 | 本节 |
9629
+ |---|---|---|---|---|---|---|---|---|
9630
+ | P-1 | `sessionPolicyDeliverable(behavior: 'deny' \| 'ask', rules: readonly string[]): SessionPolicyDeliverability`;型 `SessionPolicyDeliverability { deliverable: SessionPermissionRules; withheld: readonly SessionPolicyWithheldRule[]; unreadable?: true }` / `SessionPolicyWithheldRule { rule: string; why: SessionPolicyWithheldWhy }` / `SessionPolicyWithheldWhy`;常量 `SESSION_POLICY_WITHHELD_WHY`(冻结,五词)(CC-117) | 判定在宿主侧各写一份 → **新增**:一批同一 behavior 的规则串能不能无损写进会话规则记录(`PUT /v1/sessions/:id/policy` 那一份)。🔴 整批可送才送:`deliverable` 要么是整批的 `{ toolDeny: [...] }`(逐字、序不变、重复保留),要么是 `{}`;`withheld` 只列**自己**送不了的那几条(按入参序)。逐条判据见 101a-3。与此前宿主侧那一份的三处差(都更严):首尾带空白的名字扣下(`not_a_tool_name`);串里任何位置带 `*` 的一律扣下(`wildcard`,此前只扣 MCP 工具段恰为 `*` 那一形;带括号限定的仍是 `qualified_deny`);引擎认得的每个协议命名空间(`mcp__` / `a2a__`)的整对端形一律扣下(`peer_wide`,此前只认 `mcp__`)。入参整批读不懂时结果带 `unreadable: true`(与空批可分) | pending(换调、删自己那一份) | n/a(今天没有会话规则写入口) | n/a(同左) | n/a(同左) | pending | 101a-3 · 101b · G-P1–G-P9 |
9631
+ | P-2 | `sessionPolicyWithheldNotice(why: SessionPolicyWithheldWhy): string` | — → **新增**:每个成因词一句用户面话(唯一措辞真源)。只收成因词,**结构上回显不了规则串**;对任何入参都不抛(转成字符串会抛错的对象、Symbol、null、数 —— 一律回通用句);五句都以 `Not written to this session’s rule record: ` 起句,只说没写进会话记录与为什么,**不**替宿主承诺它的回落路 | pending(要对用户说原因时取这一句) | n/a | n/a | n/a | n/a | 101a-3 · 101b · G-P1 |
9632
+
9633
+ **插件 hook(H-*)**
9634
+
9635
+ | # | 面 | 旧 → 新 | 终端 | 网页端 | 桌面端 | 管理台 | 验收方 | 本节 |
9636
+ |---|---|---|---|---|---|---|---|---|
9637
+ | H-1 | `SettingsPort.enabledPluginHooks?(): PluginHooksReading`(新增可选成员);型 `PluginHooksReading` / `PluginHookSource` / `PluginHookOption` / `PluginHookSensitiveOption` / `PluginHookPlainOption` / `PluginHookOptionValue` | 插件 hook 本包无读口(一条不投、也不告知)→ 宿主交已启用插件的 hooks(`hooks/hooks.json` 与 manifest `hooks` 按宿主加载后的形)、插件 id / 名 / 根目录 / 数据目录 / 是否由 managed 设置启用 / 声明的选项(敏感选项**只报声明,型面上没有值位**),加安全·bare 模式位 | pending·认领 [8202] | n/a(不装 `SettingsPort`) | n/a(同左) | n/a(同左) | pending | 101a-5 · 101b · G-L1 / G-L11 |
9638
+ | H-2 | `hooksWirePlan(opts?)` + `hooksForWire({ plan })`(`hooksForWire` +1 可选参);型 `HooksWirePlan` / `HooksWirePlanOptions` / `HooksWireEngineFacts` / `PluginHookReaderState` / `HooksForWireOptions` | 每轮一只 `hooksForWire()` → 每轮一份计划:设置来源投影 + 每只插件 hook 的判定 + 请求体 `settings.hooks` 的确切内容(`plan.wire`);传 `{ plan }` 时 `hooksForWire` 原样返回 `plan.wire`(同一个对象);不传计划的 `hooksForWire()` 不读插件口、不投插件条目;`hooksWirePlan(null)` / `hooksForWire(null)` / `hooksForWire({ plan: null })` 与不传同处置;`{ plan: <不是计划的值> }` 按不传处置(设置来源照发),计划直接作第一个参数传入(`hooksForWire(plan)`)按 `{ plan }` 处置 —— 判「是不是计划」看计划对象上的六个自有键 `engine` / `pluginReader` / `verdicts` / `excluded` / `settingsDropped` / `wire`(`wire` 在没有 hook 时值为 `undefined`,键仍在),计划克隆或跨包实例传递后照样认得。`plan.engine` 的两位三态:`true` / `false` = 读到了,`null` = 没读到(宿主没报本机自起 / 引擎能力没探到) | pending·认领 [8202] | n/a(不调 `hooksForWire()`) | n/a(同左) | n/a(同左) | pending | 101a-4 · 101a-5 · G-L1–G-L6 · G-L13 · G-L15 |
9639
+ | H-3 | 本地跳过同一只:`pluginHookVerdictOf(plan, pluginId, event, groupIndex, hookIndex)`;型 `PluginHookVerdict` / `PluginHookKey` / `PluginHookExclusion` | — → 本地也跑某个引擎事件的宿主(例:交互车道本地先跑的 `UserPromptSubmit` / `PreCompact` / `PostCompact`),判为 `engine` 的那一只本地跳过 —— 同一只 hook 只在一处跑 | pending·认领 [8202] | n/a | n/a | n/a | pending | 101a-4 · G-L2 / G-L12 |
9640
+ | H-4 | 措辞单源:`hooksNotRunNotice(plan)` / `pluginHookExecutorLabel(verdict)` / `pluginHookReasonText(reason)` / `settingsHookDropText(reason)` | — → 开机一次性「不会执行」清单与 `/hooks` 执行方标注的唯一措辞 | pending·认领 [8202] | n/a | n/a | n/a | pending | 101a-7 · G-L2 / G-L7 |
9641
+ | H-5 | `hooksForWire()` / `plan.wire` 上设置来源的 `mcp_tool` 条目 | 原样发出(引擎的 hooks 契约不认这一型 ⇒ 整份 hooks 解析失败、整个请求被拒)→ **按计划组请求体时不发**,逐条记 `plan.settingsDropped`(`mcp_tool_unsupported`),因此哪都不跑的进开机清单;**不传计划的 `hooksForWire()` 在引擎点亮的事件上照旧发出**(整个请求被拒是这类宿主唯一看得见的信号,有意保留);引擎不点亮的事件上一律不发 | pending(今天不传计划 ⇒ 引擎事件上的 `mcp_tool` 仍让请求被拒;按 101a-5 改按计划组请求体后改读开机清单) | n/a | n/a | n/a | pending | 101b · G-L7 |
9642
+ | H-6 | 同上,设置来源带参数的 command 条目 | 原样发出(引擎静默丢掉 `args`、把 `command` 交给 shell 跑)→ 带参数的 command 条目(`type` 为 `command` ∧ `args` 是非空数组(exec 形),或串 / 对象 / 数这些上游不认的非数组值 —— 照发同样被剥,一并算;空数组 `args: []` 只在命令串含空白、引号或 shell 特殊字符时才算 —— 命令串只由字母、数字与 `_ . / : + -` 组成时,引擎按 shell 形跑的就是同一个可执行文件,照 0.83.0 发出)在引擎报 `taskSettings.pluginHooks === true` 之前**不发**(`exec_form_unsupported`),之后原样发;不传计划时按「未报」判,且拿掉后引擎就不跑的(引擎点亮的事件)经日志口 `warn`,每个 settings 端口 × 事件 × 原因恰一次。prompt / http 等条目上的 `args`、`args: null` 不算,原样发出 | 零编译改动(不传计划时各告警一次) | n/a | n/a | n/a | pending | 101b · G-L8 · G-L14 |
9643
+ | H-7 | 同上,设置来源条目上手写的 `plugin` 键 | 原样发出(能力位到货后会被当成插件上下文)→ **一律剥掉**(值为 `undefined` 也剥;条目其余部分照发;宿主交来的设置文档不改;记一行 debug)。请求体上的 `plugin` 位只由本包按插件读口交来的身份铸 | n/a(写了的会被剥) | n/a | n/a | n/a | pending | 101a-6 · G-L9 |
9644
+ | H-8 | 闭集与判定口:`ENGINE_FIRED_HOOK_EVENTS`(九个)/ `PLUGIN_HOOK_DISPOSITIONS` / `PLUGIN_HOOK_REASONS` / `PLUGIN_HOOK_EXCLUSION_REASONS` / `SETTINGS_HOOK_DROP_REASONS` / `isEngineFiredHookEvent(event)`(`PLUGIN_HOOK_REASONS` 13 词,含两个「不知道」词 `engine_locality_unknown` / `engine_capability_unknown`);型 `EngineFiredHookEvent` / `PluginHookDisposition` / `PluginHookReason` / `PluginHookExclusionReason` / `SettingsHookDropReason` / `HookSettingsSource` / `SettingsHookDrop` | — → 新增 | n/a(按需取用) | n/a | n/a | n/a | n/a | 101a-4 |
9645
+ | G-1 | `mandatedApprovalDetail()` 的返回句 | 「…so it is asked every time — answering it here settles this one call」→「no saved allow rule and no remembered answer can retire this question; each call is settled on its own — by you here, by a hook, or by an automatic check the deployment runs — and an answer covers only that call」:对齐引擎契约(存下的 allow 规则与记住的回答都清不掉;这一次调用的回答者可以是人、hook,或部署运行的自动裁决),删掉「每次都问」;零参数、不指人去写规则不变 | 零编译改动(按旧句逐字断言的测试改锚) | 同左 | 同左 | 同左 | pending | 101a′ · G-G1 |
9646
+
9647
+ #### 101a-1 · `displayUntrusted` 的网、选项与常见载体(D-1)
9648
+
9649
+ 五张网(关掉的那一面逐字节不动):
9650
+
9651
+ - **凭据 URL 结构面**(`credentialUrls`):文本里每个 `scheme://…` 片段,以及无 scheme 的 `user:pass@host` 形 —— userinfo 整段 ⇒ `«redacted:userinfo»`;query 的**每个**值(不按键名挑;没有 `=` 的裸参数整段)⇒ `«redacted:query»`;fragment 整段 ⇒ `«redacted:fragment»`;路径段参数 `;name=value` 的值 ⇒ `«redacted:query»`;以已知凭据前缀打头的**整个路径段** ⇒ `«redacted:secret»`(`file:` 地址不做这一判)。主机、端口、路径、query 键名与片段外的文字逐字节不动;邮箱与 `git@host:repo` 形不命中。无 scheme 的 `user:pass@host` 一网以 `@` 为锚线性扫描:userinfo 向左走到上一枚 `@` / 空白 / `/ ? #` 为止,用户名 / 口令 / 主机名 / 端口都不设长度上限;起点左邻不能是字母数字或 `+ . - @ :`,分隔冒号落在闭形记号里不算。
9652
+ - **凭据词级面**(`credentialWords`):`bearer` / `basic` 之后的值,以及 `token` / `key` / `secret` / `password` / `authorization` / `credential`(可带 access / refresh / id / client / api / x-api / session / auth 前缀、可复数)标签加 `:` 或 `=`(含全角)之后的值 ⇒ `«redacted:secret»`,标签、分隔与引号不动;分隔符两侧的空白不设上限(对齐形 `api_key: <值>`、换几行才是值的形都认)。覆盖 `Authorization: Bearer <值>`、`api_key=<值>`、JSON 引号形 `"password":"<值>"` 与全大写下划线名(`OPENAI_API_KEY=<值>`)。`Authorization` / `Proxy-Authorization` 的值是「方案词 + 凭据」时方案词留、凭据段换记号(bearer / basic / token / Bot / SSWS / Api-Key 等闭集;首段不是方案词时首段本身就是凭据、照遮)。参数表形方案(Digest、`AWS4-HMAC-SHA256` 这类签名算法形、OAuth 1.0:方案词后是 `名=值` 列表)首段不当凭据段,参数名全留,`response` / `signature` / `oauth_signature` 与凭据标签的值换记号,其余参数原样。散文里不带标签的已知凭据字面形(`sk-…` / `ghp_…` / `github_pat_…` / `xox?-…` / `AKIA…` / `AIza…` 打头、且含 16 位以上连续字母数字的整词,JWT 三段形,PEM 私钥块的主体)整词换记号;路径段 / 主机名的一节(紧跟 `/` `\` `.`)不算,`sk-video` 这类名字不算。值是诊断词 / 功能词(`expired` / `missing` / `invalid` …)不洗;`max_tokens=7` 一族计量单位不洗;方案词后跟一张窄词表里的常见英文词(`Invalid bearer token`;表外的词照遮)、反引号里点名的凭据变量名、裸复数 `tokens:` 后的纯整数、裸复数 `keys:` 后的键名清单不洗;值本身是地址形时按地址结构洗(主机端口留,路径上凭据标签之后与 `?` / `#` 之后整段换记号);一只值在紧跟其后的另一枚标签前停下,紧挨那枚标签的 `&` / `|` / `.` 留在记号外(标签与分隔符之间隔着空白、又紧贴在上一只值后面的那一枚认不出:`abc&password : <值>`,见包侧缺口);以记号起头、紧跟 `&<键>=` 或 `#<片段记号>` 的值就是那枚记号(URL 结构面铸在 query / fragment 位上的记号不跨过分隔去吞下一个键)。PEM 私钥块归单独一遍(先于标签):主体一枚记号、两侧换行留着,没有 END 行时遮到块尾。参数表文法:`名 BWS = BWS 值`(RFC 7235 的可选空白),方案词后与参数之间允许换行(折行续写);首段判「参数表还是凭据」分两档 —— `名=值`(等号两侧无空白)任何方案都当参数,等号旁带空白只在参数表形方案上当参数,且「等号紧贴名字、等号后才有空白、值不带引号」这一形要后接逗号才算。凭据标签与引号之间的转义反斜杠不设上限。
9653
+ - **判别视图**(凭据两网共用):两张凭据网不直接看原文。可剥单元 = ECMA-48 转义序列(CSI、nF、Fp / Fe 单字、已结尾的 OSC / DCS / SOS / PM / APC 控制串;原字、C1 八位形与本出口的 `\u001B…` 转义形同判;`ESC :` / `ESC =` 与 ESC 后紧跟小写字母时只算 ESC 一枚)、格式字符、非空白控制符、本出口自己铸的 `\uXXXX` 转义记号。先当词界(标签 / 方案词照认、值不在这里断)跑一遍,再当不存在(被切成两半的词照认)跑一遍;遮盖映回原文,记号两侧的序列原样保留、交给字符面去标。已结尾控制串整段是一枚单元,内容另作一段文本洗;没有结尾的控制串只剥引导符(内容本出口照样渲在屏上,不许藏起来不洗)。序列的最后一个字符恰是一枚凭据标签 / 方案词的首字母时,另建一张「这个字符留在视图里」的分隔视图先跑一遍(两种读法取并)。值在内层标签前的截断与控制串结尾的查找都按位置单调推进,整段文本线性处理。
9654
+ - **控制符**(`controls`):C0 / DEL / C1 与孤代理项。
9655
+ - **双向与格式字符**(`bidi`):格式类整类(零宽、软连字符、标签字符、双向控制 …;ZWNJ / ZWJ 除外,emoji 序列与连字不受影响)与行 / 段分隔符 U+2028 / U+2029。RGI 地区旗(黑旗 U+1F3F4 + 标签字符拼的英格兰 / 苏格兰 / 威尔士子区域码 + 取消标签)整串原样;其余标签字符照标。
9656
+ - **行折平**(`foldLines`):空白串折成一个空格并去首尾。
9657
+
9658
+ 选项与载体:
9659
+
9660
+ - 默认(不传选项)= **单行载体**:五网全开、空白折平、危险字符渲成可见转义。
9661
+ - 多行正文(错误正文、`-p` 的结果文本):`{ foldLines: false, keepLayout: true, mark: 'dot' }` —— 保 `\t` `\n`,其余危险字符(含 `\r`)换 `.`。
9662
+ - 单行字段(名字、路径、描述 —— 要让不同输入在屏上可分):`{ foldLines: false, mark: 'escape' }`。
9663
+ - 单行句子(通告一句话、卡面一句 prose):`{ foldLines: false, mark: 'dot' }`,或默认形。
9664
+ - 只要凭据面(落盘 / 机读字节、日志):`{ controls: false, bidi: false, foldLines: false }`。
9665
+ - 控制符并成空格(提示 chip 一类):`{ mark: 'space' }`(标出的空格随行折平并串)。
9666
+ - `mark`:`escape` = 可见转义 `\uXXXX`(astral 码位为 `\u{…}`)/ `dot` = `.` / `space` = 空格;默认 `escape`。
9667
+ - `keepLayout`:只在 `foldLines: false` 时生效。
9668
+ - `max`:按**输出**长度封(UTF-16 单元);截点落进一枚转义记号或一对代理中间就往前退,结果可能短于 `max`;`<= 0` ⇒ 空串;不传或不是有限数(`null` / `NaN` / 字符串 / 无穷)不封;不加省略号;截断截出新形时在截断串上再跑一遍,带 `max` 同样幂等。
9669
+ - 记号:本包铸 `«redacted:userinfo»` / `«redacted:query»` / `«redacted:fragment»` / `«redacted:secret»` 四枚,闭形 `«redacted(:<词>){0,2}»`,与服务端传输层的替换记号同族(同一前缀 `«redacted`)—— 判「这一位被动过」按这一前缀,不要按具体词列举。
9670
+ - 与终端此前自带的那一只相比,呈现差两处:astral 格式字符(如标签字符 U+E0041)渲成 `\u{E0041}`,不是 `\uE0041`(后者与「4 位转义 + 一个字符」不可分);封长时截点落在代理对中间是**退一位**,不在原位补 `.`。凭据面上本包几乎只在更严一侧有差(更松的个例见 101d,其余见包侧缺口):控制符 / 格式字符 / 着色序列夹带、分隔符后长空白、`Authorization` 非 bearer / basic 方案、散文里的已知凭据字面形,终端那一只原样留、本包换记号。
9671
+
9672
+ #### 101a-2 · 哪些出口本包已洗、哪些仍归端(D-2 / D-3)
9673
+
9674
+ | 出口 | 凭据面 | 字符面(呈现时) |
9675
+ |---|---|---|
9676
+ | 合成终局行正文(D-2) | 本包铸点已洗 | 端(D-1,多行载体) |
9677
+ | 结果帧 `errors[]`(D-3) | 本包已洗 | 端 |
9678
+ | assistant 正文行、成功臂 `result`、`_sema_salvaged_result`、完成通知里的代理正文 | **不洗**(这几处载体整段是模型 / 代理的回答,洗掉会改坏回答;被挡原因不在这里 —— 它进合成终局行与 `errors[]`,照洗) | 端;要消毒时用 D-1 并关掉两张凭据网 |
9679
+ | 引擎通告 `message` / `detail`(含 `readMcpServerRedialed` 的 `reason`) | 服务端投出前已脱敏,本包原样透传、不洗第二遍 | 端(D-1) |
9680
+ | 审批卡正文 / 入参 | 服务端脱敏 + 字节帽,本包原样透传 | 端(D-1) |
9681
+ | 审批回决备注(D-6)、子代续跑收据(D-7) | 服务端铸 / 回显,本包不洗第二遍 | 本包读口已做 |
9682
+ | MCP 面板 / 重连的 `error` / `reason` | 服务端脱敏 + 截断 | 本包已做(`capForDisplay`) |
9683
+ | hook 故障横幅的 hook 名 / stderr 摘要 | 服务端脱敏 + 截断 | 本包已做(`collapseLabel`) |
9684
+ | 插件 hook 开机清单 / `/hooks` 标注(H-4) | 不含命令串与任何选项值 | 本包已做(开机清单的插件名与事件名过 `displayUntrusted` 字符面,零宽 / 标签字符 / 软连字符渲成可见转义;名字里的引号转义成 `\"`、超过 120 字符截断加省略号;`/hooks` 标注不含名字) |
9685
+ | 端自己配置的地址 / 命令行(基址、MCP 配置、启动参数) | 不在本包射程 —— 那是端的配置面 | 端 |
9686
+
9687
+ #### 101a-3 · 会话规则记录:逐条判据(P-1)
9688
+
9689
+ behavior 这一道先于逐条判据:
9690
+
9691
+ - `behavior === 'ask'` ⇒ 每一条都是 `ask_no_bucket`(会话规则记录里没有 ask 档;把 ask 当 deny 写 = 「每次先问」改成「永不运行」)。
9692
+ - `behavior === 'deny'` ⇒ 逐条,依序取第一条命中的:
9693
+ 1. 空串 / 非字符串条目 / 稀疏洞 ⇒ `not_a_tool_name`(非字符串条目与洞记作 `rule: ''`,不强转、不回显);
9694
+ 2. 串里有**未转义**的 `(`(前一个字符不是 `\`)⇒ `qualified_deny` —— `Bash(git push:*)` / `Write(//tmp/**)`;`Bash(*)` 与 `Bash()` 也落这一臂(本包不改写字节);
9695
+ 3. 串里**任何位置**有 `*`(`*` / `Bash*` / `Web*` / `*Edit` / `mcp__*__get_user` / `mcp__srv__*` / `mcp__srv__get_*` / `mcp__*`)⇒ `wildcard` —— 带 `*` 的规则在 CC 的规则语义里是通配(终端现行的匹配器只认 MCP 工具段恰为 `*` 那一形),而会话规则记录按精确名比、一条都拦不住;没有哪只工具的名字带 `*`,扣下的代价只是晚一拍生效。本步排在第 2 步之后(`Bash(git push:*)` 括号里的 `*` 是参数样式,仍是 `qualified_deny`),先于整服与首尾空白两步(` Bash*` / `mcp__*` 都报 `wildcard`);
9696
+ 4. 以引擎认得的协议命名空间前缀开头(今天是 `mcp__` 与 `a2a__`),前缀之后按 `__` 切分:首段(服务器或对端)非空、其余(工具段)为空(`mcp__srv`、`mcp__srv__`、`a2a__payroll`、`a2a__payroll__`)⇒ `peer_wide` —— 引擎把这一形读成「这个服务器 / 对端的所有工具」;对端段为空(`a2a____x`)或前缀大小写不符(`A2A__payroll`)的不是命名空间规则,按普通名走;
9697
+ 5. 首尾带空白(`trim()` 会改变这个串:空格、制表符、换行、不换行空格等)⇒ `not_a_tool_name` —— 会话规则记录按原字节比,` Read` 写进去一条都拦不住;这一步排在最后,已被 2 / 3 / 4 扣下的串保留原成因(` Bash(x)` 仍是 `qualified_deny`);串中间的空格不算;
9698
+ 6. 其余 ⇒ 恰好一个工具名,能无损写进 `toolDeny`(`Read`、`mcp__srv__tool`、`mcp__`、`mcp____x` 都走这一臂)。
9699
+
9700
+ 用法:`deliverable` 非空 ⇒ 原样作 `tightenSessionPolicy` 的 `add`;为 `{}` ⇒ 这一批不走会话规则记录(宿主走自己原有的回落路),要说原因就对 `withheld` 逐条取 `sessionPolicyWithheldNotice(w.why)`。规则串要不要摆在那句话旁边由宿主定(规则是用户写的,可能带路径或凭据形参数,这句话会进转录与日志)。入参整批读不懂时结果是 `{ deliverable: {}, withheld: [], unreadable: true }`;空批是 `{ deliverable: {}, withheld: [] }`(不带该键)。
9701
+
9702
+ #### 101a-4 · 插件 hook:判定次序与原因闭集(H-2 / H-3 / H-8)
9703
+
9704
+ 治理先判且恒赢;被治理筛掉的进 `plan.excluded`,**不进任何执行方,也不进「不会执行」清单**(那是策略的结果,不是能力缺口)。
9705
+
9706
+ | 治理 | 插件 hook |
9707
+ |---|---|
9708
+ | 工作区未受信 / 信任查询抛错 / managed 设置读取抛错 | 全筛(`workspace_untrusted` / `governance_unreadable`);请求体上一条 hooks 都没有 |
9709
+ | managed 设置 `disableAllHooks` | 全筛(`policy_disable_all`);请求体上一条 hooks 都没有 |
9710
+ | 安全模式 / bare 模式(读口报 `suppressedByStartupMode: true`) | 全筛(`startup_mode`);设置来源的 hooks 不受这一位影响 |
9711
+ | managed `allowManagedHooksOnly`,或非 managed 来源合并后的 `disableAllHooks`(合并读口抛错按真) | 只留 `managed: true` 的插件,其余 `managed_plugins_only` |
9712
+ | managed `strictPluginOnlyCustomization`(`true` 或含 `'hooks'`) | **不削**插件 hook(只削设置来源) |
9713
+
9714
+ 过了治理的每一只按下表判,取**第一条**命中的原因:
9715
+
9716
+ | 次序 | 条件 | 判定 |
9717
+ |---|---|---|
9718
+ | 1 | 条目形坏(非对象 / 缺 `type` / command 非串或空串 / `args` 不是字符串数组),或插件来源缺 id / 名 / 根目录 / 数据目录 | `not_run` · `malformed_entry` |
9719
+ | 2 | shell 形(无 `args`)命令里出现 `${user_config.…}`(上游拒跑) | `not_run` · `shell_form_user_config` |
9720
+ | 3 | exec 形引用了既没存值、也没声明为敏感的选项(上游未存即抛) | `not_run` · `user_config_unset` |
9721
+ | 4 | 事件不是引擎点亮的九个之一(`ENGINE_FIRED_HOOK_EVENTS`) | 宿主报本地跑这个事件 ⇒ `shell` · `shell_event`;否则 `not_run` · `no_executor` |
9722
+ | 5 | 宿主**明确报**引擎不是本机由本客户端自起的(`engineOwnedByThisShell: false`) | 宿主报本地跑 ⇒ `shell`;否则 `not_run`;原因 `engine_not_local` |
9723
+ | 5′ | 宿主**没报**(`engineOwnedByThisShell` 缺席或不是布尔) | 同上;原因 `engine_locality_unknown` |
9724
+ | 6 | 引擎能力**已探到**而 `taskSettings.pluginHooks` 不为 `true`(缺键 / `false` / 非布尔 / `taskSettings` 整组 `false`) | 同上;原因 `engine_capability_absent` |
9725
+ | 6′ | 引擎能力**还没探到**(没 kick / 在飞 / 探测失败 / 没给 `baseUrl`) | 同上;原因 `engine_capability_unknown` |
9726
+ | 7 | 条目不是 command 类型 | 同上;原因 `not_command` |
9727
+ | 8 | 插件**声明了**任一敏感选项(按声明判,不按已存值;声明形读不懂按敏感判) | 同上;原因 `sensitive_options` |
9728
+ | 9 | 并进去超引擎每事件上限(组 16 / 条目 32;设置来源与会话级 `/goal` 钩子计入占用 —— 超了该事件的插件条目**整批**不投),或单条命令超 8192 字符(只该条不投) | 同上;原因 `engine_limit` |
9729
+ | — | 以上都不命中 | `engine` · `projected` |
9730
+
9731
+ - 5′ / 6′ 是「不知道」,不是「不是」「不支持」—— 开机清单与 `/hooks` 标注据此说「不知道」,不替宿主下事实断言。
9732
+ - 「宿主报本地跑」= `opts.shellHookEvents` 里有这个事件 —— 本客户端**自己的本地执行器**会触发这个事件。它同时管两件事:插件 hook 的「壳执行」,与设置来源被拿掉条目的 `notRun`(报了 ⇒ 视为本地会跑,不进清单)。🔴 射程:报一个事件 = 承诺本地执行器会跑这个事件上**所有类型**的条目(插件与设置来源同一执行器);执行器认不得的类型(例:没有 `mcp_tool` 执行臂)在这个事件上被从请求体拿掉时不会进清单 —— 宿主报事件前请自核。引擎事件也可以报:没投给引擎 ⇒ `shell`;投了 ⇒ `engine`,宿主本地**必须跳过**这一只。宿主没报的引擎事件不做事后补跑 —— 工具已在引擎执行,拦不住也续不了。
9733
+ - 同一事件上的请求体顺序:设置来源(managed → user → project → local 拼接)→ 会话级 `/goal` 钩子 → 插件条目(按插件 × 组的原序)。
9734
+ - `ENGINE_FIRED_HOOK_EVENTS` = `PreToolUse` / `PostToolUse` / `PostToolUseFailure` / `PostToolBatch` / `PreCompact` / `PostCompact` / `Stop` / `StopFailure` / `UserPromptSubmit`。
9735
+
9736
+ #### 101a-5 · 宿主装配(H-1–H-4)
9737
+
9738
+ ```ts
9739
+ import { installHost, engineCapsSettled, hooksWirePlan, hooksForWire, hooksNotRunNotice, pluginHookVerdictOf, pluginHookExecutorLabel } from '@sema-agent/client-core'
9740
+
9741
+ installHost({ settings: {
9742
+ getSettingsForSource, shouldSkipHookDueToTrust, mergedDisableAllHooks,
9743
+ enabledPluginHooks: () => ({
9744
+ suppressedByStartupMode: isSafeMode() || isBareMode(),
9745
+ plugins: enabledPlugins().map((p) => ({
9746
+ id: p.id, name: p.name, root: p.root, dataDir: p.dataDir,
9747
+ managed: managedEnabledPlugins[p.id] === true,
9748
+ options: declaredOptions(p), // 敏感:{ sensitive: true };非敏感:{ sensitive: false, value? }(只填已存值,不填默认值)
9749
+ hooks: p.hooksConfig, // hooks.json + manifest.hooks,按你加载后的形原样
9750
+ })),
9751
+ }),
9752
+ } })
9753
+
9754
+ // 每一轮:先算计划,本地按它跳过,再用同一份组请求体
9755
+ const plan = hooksWirePlan({ baseUrl, engineOwnedByThisShell, shellHookEvents: LOCAL_PLUGIN_HOOK_EVENTS })
9756
+ const skipLocally = (id, event, gi, hi) => pluginHookVerdictOf(plan, id, event, gi, hi)?.disposition === 'engine'
9757
+ const wireHooks = hooksForWire({ plan }) // === plan.wire
9758
+
9759
+ // 开机一次:等引擎能力落地再算(见 101b),否则「还没探到」会被说成不跑
9760
+ await engineCapsSettled(baseUrl)
9761
+ for (const line of hooksNotRunNotice(hooksWirePlan({ baseUrl, engineOwnedByThisShell, shellHookEvents: LOCAL_PLUGIN_HOOK_EVENTS }))) showStartupNotice(line)
9762
+
9763
+ // /hooks 面:插件条目的执行方标注
9764
+ const label = (v) => pluginHookExecutorLabel(v)
9765
+ ```
9766
+
9767
+ - 🔴 每轮算一次、同一份用到底:本地跳过与请求体各算一次的话,中间引擎能力位落地,同一只 hook 会在两处各跑一次。
9768
+ - `engineOwnedByThisShell` 请明确报 `true` / `false`:不报 ⇒ 判定原因是 `engine_locality_unknown`(插件 hook 不投,清单说「不知道引擎是不是本客户端起的」)。
9769
+ - 下标 `groupIndex` / `hookIndex` 指向**你交来的那份**配置:`hooks[event][groupIndex].hooks[hookIndex]`。
9770
+ - `managed` 按 managed 设置的 `enabledPlugins` 里值为 `true` 的插件 id 判;已禁用的插件不交(上游不注册)。
9771
+ - 非敏感选项的 `value` 只填已存值 —— 上游 hook 路径不回填清单默认值。
9772
+
9773
+ #### 101a-6 · 投影形(H-2 / H-7;候引擎契约到货)
9774
+
9775
+ 判为 `engine` 的条目在请求体上 = 原条目 + `plugin`:
9776
+
9777
+ | 位 | 形 | 说明 |
9778
+ |---|---|---|
9779
+ | `plugin.name` / `plugin.root` / `plugin.dataDir` | 串 | 宿主交来的值;插件条目自带的 `plugin` 键被这一份盖掉(根目录不许由插件自报)。设置来源条目上手写的 `plugin` 键一律剥掉 —— 请求体上的 `plugin` 位只出现在插件读口来源、判为 `engine` 的条目上 |
9780
+ | `plugin.options` | `Record<string, string>` | 只带**已存的非敏感值**;值 `String()` 转串;键按环境变量名规则归一(非 `[A-Za-z0-9_]` 换 `_` 再大写);一个都没有 ⇒ 键缺席 |
9781
+ | `command` / `args`(exec 形) | 串 / 串数组 | 逐元素原样,只把 `${user_config.KEY}` 换成已存的非敏感值;`${CLAUDE_PLUGIN_ROOT}` / `${CLAUDE_PLUGIN_DATA}` / `${CLAUDE_PROJECT_DIR}` 原样留给执行方 |
9782
+
9783
+ #### 101a-7 · 用户面措辞(H-4)
9784
+
9785
+ - 开机清单(`hooksNotRunNotice(plan)`):只列 `not_run` 的插件 hook(按插件 × 原因一行)与「拿掉之后哪都不跑」的设置来源条目(按来源 × 原因一行)。形如 `Plugin "guard": PreToolUse, Stop hooks will not run — the connected engine does not support plugin hooks.` / `User settings: PreToolUse hook will not run — MCP tool hooks are not supported by the engine.` / `Plugin "guard": PreToolUse hook will not run — it is not known yet whether the connected engine supports plugin hooks, so they are not sent to it.` / `Plugin "guard": PreToolUse hook will not run — it is not known whether the engine was started by this client on this machine, so plugin hooks are not sent to it.` / `User settings: Stop hooks will not run — exec-form hooks (with "args") are sent to the engine only once it reports support for them.`。只含插件名、事件名与固定短句 —— 不含命令串、不含任何选项值;插件名与事件名过 `displayUntrusted` 的字符面(折成一行、控制符 / 双向 / 格式类可见化;凭据两网关);插件名为空渲 `(unnamed)`。空数组 = 没有要说的。
9786
+ - `/hooks` 标注(`pluginHookExecutorLabel(verdict)`):`runs in the engine` / `runs in this client` / `does not run: <短句>`。
9787
+ - 每个原因的短句见 `pluginHookReasonText(reason)` / `settingsHookDropText(reason)`,闭集每员都有。
9788
+
9789
+ ### 101a′. 成文改口(旧判据眼作废 → 新判据眼)
9790
+
9791
+ 已发段不回改,以本段为准。分三向:
9792
+
9793
+ **作废**(旧判据眼装 0.83.1 后判红是预期行为,不是回归):
9794
+
9795
+ 1. 凡断言合成终局行正文或结果帧 `errors[]` **原样**带着引擎原话里凭据字节(URL userinfo、query 值、fragment、`api_key=` / `Bearer` 之后的值)的判据 —— 作废;这些位自本版起是记号(D-2 / D-3)。
9796
+ 2. §100a K-10 与 §100d 终端 K-10「端上凭旧旗做的合成行凭据洗消,不改读就整段跳过、凭据原样上屏」:对 0.83.1 起的本包作废 —— 本包在铸点已洗,端上那一处降为兜底;行类旗改名的其余读点改法(可见性过滤等)不变。
9797
+ 3. 「交互车道上的合成终局行不带行类旗,只能按 `model: '<synthetic>'` 认」—— 作废(D-4)。
9798
+ 4. 以此前宿主侧会话规则判定写成的验收眼「带首尾空白的 deny(` Read`)也会写进会话规则记录、出现写成功那一句」—— 作废,新判据眼见 G-P7。
9799
+ 5. 「带参数的 command hook 条目(exec 形)原样上请求体」「设置来源条目上的 `plugin` 键原样上请求体」两条判据眼 —— 作废(H-6 / H-7);「带 `mcp_tool` hook 的设置让整个请求被拒」—— 对按计划组请求体的宿主与引擎不点亮的事件作废(H-5),对不传计划、且 `mcp_tool` 在引擎点亮事件上的宿主**仍成立**。
9800
+ 6. §100a-5 射程句与 §100 包侧缺口 ⑤「宿主的『安全模式』本包没有读口」:对**插件 hook** 作废 —— `enabledPluginHooks()` 的 `suppressedByStartupMode` 就是这一读口;对设置来源的 hooks 仍成立(见包侧缺口)。§100 及更早段「插件 hook 不投」对 0.83.1 起的宿主改为「逐条判定,能力位到货前不投」。
9801
+ 7. §83 包侧缺口 ①「`displayBody` 不做消毒与封长(统一清洗口 CC-112,0.79.0)」里的版本号:统一清洗口以 `displayUntrusted` 在 0.83.1 出公面;`displayBody` 本身仍不做消毒与封长,端对它的结果调 `displayUntrusted`(多行载体)。
9802
+
9803
+ 8. 断言 `mandatedApprovalDetail()` 逐字等于旧句(含 `asked every time`)的判据眼 —— 作废(G-1);新判据眼见 G-G1。
9804
+ 9. 断言 `sessionPolicyDeliverable` 对 `a2a__<peer>` 答「能写」、或成因词为 `mcp_server_wide` 的判据眼 —— 作废(P-1:成因词改名 `peer_wide`,A2A 整对端扣下)。
9805
+ 10. 断言「`args: []` 的设置来源 command 条目不上请求体」的判据眼 —— 对命令串只由字母、数字与 `_ . / : + -` 组成的条目作废(H-6),对其余条目仍成立。
9806
+
9807
+ **改读**(判据的意思保留,换读法):
9808
+
9809
+ 1. 判「这一位被洗过」按记号前缀 `«redacted` 认(闭形 `«redacted(:<词>){0,2}»`),不按具体词列举;要在错误文本里抠 URL / 键值的端,凭据位是记号,主机 / 端口 / 路径 / query 键名仍在。
9810
+ 2. `escapeDisplayControlChars` / `collapseLabel` / `capForDisplay` 的字符集**窄于** `displayUntrusted` 默认(D-5:双向族按枚举,不含零宽 / 软连字符 / 标签字符)—— 别把两者当成同集;要宽集用新口。
9811
+ 3. 宿主侧会话规则判定的读法:原来答 `undefined` ⇔ 现在 `deliverable` 为 `{}`;原来的 `{ toolDeny }` ⇔ 现在的 `deliverable`。其余形逐例不变。
9812
+ 4. 「插件 hook 在引擎腿上不跑」对实现了 H-1 读口的宿主改读为「逐条判定,且如实告知」:不跑的在开机清单里,投给引擎的本地跳过。
9813
+ 5. `isHumanSettledGate(g)` 为真 = 结算词是 `human_allowed` / `human_refused`,即**审批通道**给了回答;它**不等于**有人看过这一次调用 —— 宿主审批口的自动允许、会话授权的短路也经同一条通道记成 `human_allowed`。端不要单凭它渲「你批准了」这类第一人称的话;要这么说,宿主须自己知道这一次真的弹过卡、有人点过。读口本身不变。
9814
+
9815
+ **新增**(新判据眼):
9816
+
9817
+ 1. 合成终局行在两条车道上都带 `_sema_api_error_message: true`,正文里的凭据位是四枚记号之一,行首身份与其余字节与引擎原话同;`Outcome unknown:` 行 = `Outcome unknown: ` + `errors[0]`。
9818
+ 2. 回决备注与续跑收据里不再出现双向 / 格式字符与孤代理项(续跑收据另含 C1)。
9819
+ 3. 会话规则:一批里只要有一条送不了,`deliverable` 就是 `{}`,没有「一部分已立即生效」这一形。
9820
+ 4. 请求体上带 `plugin` 位的 hook 条目恰是插件读口来源、判为 `engine` 的那几只;设置来源条目上永不出现。
9821
+
9822
+ ### 101b. 缺席语义(逐键)
9823
+
9824
+ **展示层**
9825
+
9826
+ - `displayUntrusted` 选项缺席 = 该网开(五网)/ 不封长(`max`,`NaN` 同)/ 可见转义(`mark`);`keepLayout` 只在 `foldLines: false` 时生效。选项整体传 `null` 同默认。
9827
+ - 非串的 `text` 按 `String(v ?? '')` 归一(`null` / `undefined` ⇒ 空串),不抛。
9828
+ - 文本里没有凭据位、也没有危险字符 ⇒ 原样返回(默认形的行折平照做);已含记号的文本再洗逐字节相同(转录重放会再喂一次)。
9829
+ - 合成行上 `_sema_api_error_message` 只在 `true` 时在场;缺席 = 这不是本包合成的终局行(模型行),**不是**「不知道」。
9830
+ - D-6 / D-7 的缺席语义:备注三态、收据兜底句照旧;回决备注清洗后为空(只剩格式字符 / 控制符 / 空白)与纯空白同处置 —— 不算回显正文:`noteRecorded` 在场时照它定状态、不带 `note`;不在场时是 `unknown`(整行不渲),不渲一对空引号。
9831
+ - `displayUntrusted` 的 `max` 不是有限数(`null` / `NaN` / 字符串 / 无穷)= 不封;`errors[]` 里的非字符串元素原样放回、不强转。
9832
+
9833
+ **会话规则**
9834
+
9835
+ - `deliverable` 为 `{}` 有三种来源:① 批空;② 批里有任一条送不了;③ 入参读不懂(behavior 不是 `'deny'` / `'ask'`、`rules` 不是数组、`length` 不可用或超过 10000、读的时候抛了)。③ 的 `withheld` 也是空 —— 本包不为读不懂的入参编成因,也不抛;③ 带 `unreadable: true`,①② 不带这个键(`'unreadable' in r` 为假)—— 宿主据此区分「用户什么都没选」与「这一批没读懂」。
9836
+ - `deliverable` 非空时只有 `toolDeny` 一只桶,绝不铸别的桶,绝不铸空桶(空桶在这条 wire 上的意思是「设了但什么都不放行」)。
9837
+ - `withheld` 缺某一条 ≠ 那一条已写:混批里本身能送的那几条既不在 `withheld` 也不在 `deliverable`。
9838
+ - `sessionPolicyWithheldNotice` 收到表外的值 ⇒ 一句不带成因的通用话 `Not written to this session’s rule record.`,不抛 —— 不是字符串的入参(包括转成字符串时会抛错的对象、Symbol、null、数、`toString` 返回某个成因词的对象)一律按表外处置。
9839
+ - 这一步**不读能力位、不动网络**:「这台部署有没有会话规则店」仍由 `sessionPolicyFaceAvailable` / `tightenSessionPolicy` 回答。
9840
+
9841
+ **插件 hook**
9842
+
9843
+ - 没装 `SettingsPort` ⇒ 整份 hooks 投影 fail-closed(`plan.wire === undefined`、`pluginReader: 'absent'`),与 `hooksForWire()` 同。
9844
+ - `enabledPluginHooks` 方法缺席 = 宿主没接插件读口 ⇒ `plan.pluginReader === 'absent'`,零判定、零插件条目,请求体里只有设置来源的条目(能力位未报时与不传计划的 `hooksForWire()` 逐字相同);每个已装的 `SettingsPort` 经日志口告警**恰一次**。治理已整体关掉(未受信 / 信任或 managed 读取抛错 / managed 关停)时只为列 `plan.excluded` 读它,缺席不告警。
9845
+ - 读口抛错 / 返回非对象 / `plugins` 不是数组,或读口交来的插件数据在读的时候抛错(会抛的 getter、已撤销的代理、`plugins` 的 `length` 抛)⇒ `pluginReader === 'failed'`,这一轮零插件判定与插件条目、设置来源照发,记 `debug`,不出缺席告警,不外抛。治理已整体关掉那一路(只为列 `plan.excluded` 读插件口)同样不外抛:读到会抛的位 ⇒ `failed`、`excluded` 为空。
9846
+ - `suppressedByStartupMode` 缺席 = 不是安全模式也不是 bare 模式。
9847
+ - `PluginHookSource.options` 缺席 = 插件没声明选项;`PluginHookPlainOption.value` 缺席 = 声明了但没保存(**不回填默认值**)。
9848
+ - `plan.verdicts` 里查不到某一只(`pluginHookVerdictOf` 返回 `undefined`)= 它被治理筛掉了(看 `plan.excluded`)、宿主没交它,或它所在的插件来源 / 组形坏到无法逐条列举(只记 `debug`)—— **不是**「会在引擎跑」。
9849
+ - `plan.wire === undefined` = 这一轮没有任何 hook 要发(不铸空对象)。
9850
+ - 引擎能力还没探到 ⇒ `engine_capability_unknown`(`plan.engine.pluginHooksCapable === null`),已探到而不为真 ⇒ `engine_capability_absent`(`false`)。开机清单仍请在引擎能力落地之后再算(`await engineCapsSettled(baseUrl)`),否则清单里是一句「不知道」而不是那一轮的真实答案。每轮的计划照常按当时读数判(能力未落地的那一轮确实不投)。
9851
+ - `engineOwnedByThisShell` 缺席或不是布尔 = 宿主没报 ⇒ `engine_locality_unknown`(`plan.engine.ownedByThisShell === null`),**不是**「不是本机起的」;只有明确报 `false` 才是 `engine_not_local`。
9852
+ - `hooksWirePlan(null)` / `hooksForWire(null)` / `hooksForWire({ plan: null })` = 不传,不抛。
9853
+ - 不传计划的 `hooksForWire()`:设置来源条目被拿掉(今天只有带参数的 command 条目)且那个事件由引擎点亮 ⇒ 日志口 `warn` 一条,点名事件与原因、不含命令串;每个已装的 settings 端口 × 事件 × 原因**恰一次**(重装同一端口不再响);引擎不点亮的事件上拿掉不告警(执行面不变)。每轮另有一行 `debug` 记条数与原因。
9854
+ - `SettingsHookDrop.notRun === false` = 拿掉不改变执行面(非引擎事件,或宿主在 `shellHookEvents` 里报了这个事件 —— 按 101a-4 的射程视为本地执行器会跑),不进清单。
9855
+ - 设置来源 command 条目上 `args: []`:命令串只由字母、数字与 `_ . / : + -` 组成 ⇒ 照发(与 0.83.0 同)、零告警、不进 `settingsDropped`;否则按带参数拿掉(同 H-6 的缺席语义与告警)。
9856
+ - `hooksForWire({ plan: x })` 里 `x` 不是计划(不带六个计划键)⇒ 按不传处置并记一行 `debug`;`hooksForWire(x)` 里 `x` 本身是计划 ⇒ 按 `{ plan: x }` 处置。
9857
+ - `plugin.options` 缺席 = 没有已存的非敏感值(不铸空对象)。
9858
+
9859
+ ### 101c. 黑盒判据骨架
9860
+
9861
+ > 🔴 标「本版证明」的格在 **0.83.0** 产物上必须 FAIL、在 0.83.1 上必须 PASS;标「回归约束」的格两版都 PASS。请记下两次跑的产物标识(版本 + tarball shasum)。射程写在每格括号里;「纯包层」= 只装本包即可跑,不需要引擎。前缀:G-D = 展示层(D-*)、G-P = 会话规则(P-*)、G-L = 插件 hook(H-*;不用 G-H,那是 §100 的 hooks 判据)。
9862
+
9863
+ **展示层(D-*)**
9864
+
9865
+ - **G-D1**(本版证明,纯包层;D-2 / D-3):`runStream` 喂 `[{type:'failed', errorCode:'network', errorMessage:'connect failed http://alice:hunter2@host:9/v1?api_key=KEYONE Authorization: Bearer KEYTWO'}]` ⇒ 合成 assistant 行(`_sema_api_error_message === true`、`message.model === '<synthetic>'`)正文逐字等于 `API Error: connect failed http://«redacted:userinfo»@host:9/v1?api_key=«redacted:query» Authorization: Bearer «redacted:secret»`;结果帧 `errors` 恰一条,逐字等于该行去掉 `API Error: ` 之后的部分;两处都不含 `alice` / `hunter2` / `KEYONE` / `KEYTWO`。判别点:0.83.0 上两处原样。射程延伸(真部署,`-p --output-format stream-json`):让一次 run 以带同形原话的引擎错误收尾 ⇒ stdout 上的合成 assistant 帧、结果帧 `errors[0]` 与落盘转录里的那一行同样不含这四个占位。
9866
+ - **G-D2**(本版证明,纯包层;D-2 / D-4):同一串帧经 `createWireToCcAdapter().adapt(runStream(…), ctx)` ⇒ 转录平面那条合成行正文同 G-D1,且带 `_sema_api_error_message: true`。判别点:0.83.0 上正文原样且没有这一旗。射程延伸(真部署,交互会话):屏上的错误行与转录行都不含四个占位。
9867
+ - **G-D3**(回归约束,纯包层;D-2 / D-3 的反向对照):done 帧成功 run,结果记录 `result:'see http://alice:hunter2@h/x?k=v'` ⇒ 结果帧 `result` 逐字节原样;截断臂(`terminal:{kind:'failed', code:'limits.max_tokens_exceeded', message:'cut http://alice:hunter2@h/x'}`,结果记录 `result:'PARTIAL http://alice:hunter2@h/y?k=v'`)⇒ `_sema_salvaged_result` 逐字节原样,`errors[0]` 里的 userinfo 换成 `«redacted:userinfo»`(后一半在 0.83.0 上 FAIL,前两半两版都 PASS)。
9868
+ - **G-D4**(本版证明,纯包层;D-1):`displayUntrusted('a\u001b[31m b\u202Ec\u200Bd\n e')` ⇒ `a\u001B[31m b\u202Ec\u200Bd e`(反斜杠是字面);`displayUntrusted('token: \u001bSECRETVALUE')` 不含 `SECRETVALUE`;`displayUntrusted('x\u{E0041}y')` ⇒ `x\u{E0041}y`;`displayUntrusted('ab😀cd', { max: 3 })` ⇒ `ab`;`displayUntrusted('a\u0001 b http://u:p@h/', { controls: false, bidi: false, foldLines: false })` ⇒ 控制符原样、userinfo 换记号;对任一输入 `displayUntrusted(displayUntrusted(x)) === displayUntrusted(x)`。判别点:0.83.0 上无此导出。
9869
+ - **G-D5**(本版证明;射程:真部署,宿主已把呈现出口改经 D-1):一条同时含 ESC、U+202E、带 userinfo 的 URL 与 `Authorization: Bearer <值>` 的引擎原话上屏 ⇒ 屏上四类都不在,主机与端口仍在。
9870
+ - **G-D6**(本版证明,纯包层;D-6 / D-7):`readDecisionNoteAudit({ decisionNote: 'no\u202Ereason' }).note === 'no reason'`;`resumeSettledSubagent` 的 facade 回 `{ note: 'agent-\u0085x\u202Ey' }` ⇒ `receipt === 'agent-.x.y'`。判别点:0.83.0 上两处都原样带着 U+202E(收据另带 U+0085)。
9871
+ - **G-D7**(回归约束,纯包层;D-5):`escapeDisplayControlChars` / `collapseLabel` / `capForDisplay` 对全部 BMP 码元与 0.83.0 逐字节相同;`escapeDisplayControlChars('a\u200Bb')` 仍原样(旧集不含零宽)。
9872
+ - **G-D8**(本版证明,纯包层;D-1):`displayUntrusted('token=\u001b[33mSECRETVALUE\u001b[0m', { controls: false, bidi: false, foldLines: false })` ⇒ `token=\u001b[33m«redacted:secret»\u001b[0m`(着色序列留在记号两侧);默认形 ⇒ `token=\u001B[33m«redacted:secret»\u001B[0m`(反斜杠是字面,后面不是记号);`displayUntrusted('Authorization: token ghp_16C7e42F292c6912E7710c838347Ae178B4a')` ⇒ `Authorization: token «redacted:secret»`;`displayUntrusted('Invalid bearer token')` 逐字节不变。判别点:0.83.0 上无此导出。
9873
+ - **G-D9**(本版证明,纯包层;D-1 幂等):任取一段输入 `s` 与任一组选项 `o`(含 `max`),`displayUntrusted(displayUntrusted(s, o), o) === displayUntrusted(s, o)`;例:`401: invalid credentials for token=abc123,email=jane.doe@example.com` ⇒ `401: invalid credentials for token=«redacted:secret»,email=jane.doe@example.com`,再洗一遍逐字节同、邮箱段仍在。
9874
+ - **G-D10**(本版证明,纯包层;D-1 线性):`displayUntrusted('token=a&'.repeat(12500), { controls: false, bidi: false, foldLines: false })` 与默认形各在 2 秒内返回;`runStream` 喂一帧 `errorMessage` 为 64KB `token=a&…` 的 `failed` 帧,结果帧在 2 秒内出来。判别点:0.83.0 上无此导出(结果帧那一半在 0.83.0 上本就线性 —— 那一版不洗)。
9875
+ - **G-D11**(本版证明,纯包层;D-1):`displayUntrusted('private_key: -----BEGIN PRIVATE KEY-----\nMIIE…\n-----END PRIVATE KEY-----', { controls: false, bidi: false, foldLines: false })` ⇒ `private_key: -----BEGIN PRIVATE KEY-----\n«redacted:secret»\n-----END PRIVATE KEY-----`;`'\u001b[1mOPENAI_API_KEY\u001b(B\u001b[m=<值>'` 同参数 ⇒ 值换记号、三段序列原样;`'Authorization: Digest username="bob", response="<值>"'` ⇒ `username="bob"` 原样、`response="«redacted:secret»"`;`'https://h/v1?api_key=v1&api_key=v2&page=3'` ⇒ 三个键名与两个 `&` 都在。
9876
+ - **G-D12**(本版证明,纯包层;D-1 / D-2):同参数 `displayUntrusted('\u001bBearer <值> tail', …)` ⇒ `'\u001bBearer «redacted:secret» tail'`;`'\u009d'.repeat(100000)` 与 `'\u001bP'.repeat(50000)` 的默认形各在 2 秒内返回;`runStream` 喂 `{ type:'failed', errorMessage: 42 }` ⇒ 不抛,合成终局行正文为 `run failed`(或按 `errorCode` 回落)。判别点:0.83.0 上最后一格抛 TypeError。
9877
+ - **G-D13**(本版证明,纯包层;D-1 / D-2):`runStream` 喂一帧 `errorMessage` 为 `Authorization: Digest username = "bob", response="<值>"` 的 `failed` 帧 ⇒ 合成终局行与 `errors[0]` 都含 `username = "bob"`、不含 `<值>`;同一串经 `displayUntrusted(…)` 默认形与 `{ controls: false, bidi: false, foldLines: false }` 同判;`Authorization: Digest\n username="bob",\n response="<值>"`(多行头)同判;`Authorization: Negotiate <token68>= done` ⇒ `Authorization: Negotiate «redacted:secret» done`。
9878
+ - **G-D14**(本版证明,纯包层;D-1):`displayUntrusted('user:' + 'A'.repeat(257) + '@example.com')` ⇒ `'«redacted:userinfo»@example.com'`;用户名 65 字符、口令 8192 字符同判。
9879
+ - **G-D15**(本版证明,纯包层;D-1):JSON 转义套三层的 `api_key` 键值对(键名两侧与值两侧的引号前各 7 枚反斜杠)经 `displayUntrusted(…)` 与机读面都不含值;每处 15 枚同判。
9880
+
9881
+ **会话规则(P-*)**
9882
+
9883
+ - **G-P1**(本版证明,纯包层):`sessionPolicyDeliverable('deny', ['Read', 'Read', 'mcp__srv__tool'])` ⇒ `{ deliverable: { toolDeny: ['Read', 'Read', 'mcp__srv__tool'] }, withheld: [] }`;`('deny', ['Read', 'Bash(git push:*)'])` ⇒ `deliverable` 为 `{}`,`withheld` 恰 `[{ rule: 'Bash(git push:*)', why: 'qualified_deny' }]`;`('deny', ['mcp__srv', 'mcp__srv__*', ' Read'])` ⇒ 成因依次 `peer_wide` / `wildcard` / `not_a_tool_name`;`('ask', ['Read'])` ⇒ `ask_no_bucket`;`('deny', ['mcp__srv__get_*'])` ⇒ `deliverable` 为 `{}`,`withheld` 恰 `[{ rule: 'mcp__srv__get_*', why: 'wildcard' }]`;`('deny', ['a2a__payroll'])` ⇒ `deliverable` 为 `{}`,`withheld` 恰 `[{ rule: 'a2a__payroll', why: 'peer_wide' }]`;`('deny', ['a2a__payroll__delete_record'])` ⇒ `{ deliverable: { toolDeny: ['a2a__payroll__delete_record'] }, withheld: [] }`;`('deny', ['mcp__*__get'])`、`('deny', ['*'])`、`('deny', ['Bash*'])` ⇒ `deliverable` 为 `{}`,`withheld` 各恰一条 `why: 'wildcard'`;`('deny', ['Bash(git push:*)'])` 仍是 `qualified_deny`;`sessionPolicyWithheldNotice({ toString() { throw new Error('x') } })` 与 `sessionPolicyWithheldNotice({ toString: () => 'wildcard' })` 都返回 `Not written to this session’s rule record.` 且不抛;`('deny', 'Read')` 与 `('nope', ['Read'])` ⇒ `{ deliverable: {}, withheld: [], unreadable: true }` 且不抛;`('deny', [])` ⇒ `{ deliverable: {}, withheld: [] }`(不带 `unreadable` 键);`SESSION_POLICY_WITHHELD_WHY` 恰五词且冻结;`sessionPolicyWithheldNotice` 对五词各给一句、都以 `Not written to this session’s rule record: ` 起句。判别点:0.83.0 上无此导出。
9884
+ - 以下九格的射程:宿主已换调 P-1、部署的 `capabilities.sessionPolicy` 为真、一条 run 正在跑。
9885
+ - **G-P2**:run 进行中用户加 deny `Read` ⇒ 会话规则记录写成功那一句出现;同一 run 里之后的 `Read` 调用被拒。
9886
+ - **G-P3**:加 deny `Bash(git push:*)` ⇒ 会话规则记录**不写**(不出现写成功那一句),宿主原有的回落告知照常出现;本 run 内 `git status` 不因这条规则被拒。
9887
+ - **G-P4**:一次加 `Read` 与 `Bash(git push:*)` 两条 ⇒ 两条都**不写**会话规则记录;不出现「一部分已立即生效」的告知。
9888
+ - **G-P5**:加 deny `mcp__<某服务器>` 或 `mcp__<某服务器>__*` ⇒ 不写会话规则记录,回落告知照常。
9889
+ - **G-P6**:加 ask `Read` ⇒ 不写会话规则记录;`Read` 不被当作 deny 拒绝。
9890
+ - **G-P7**(换调前 FAIL、换调后 PASS;规则经盘上设置文件进来、串首带空格):设置文件里写 deny `" Read"` ⇒ 会话规则记录**不写**(不出现写成功那一句),回落告知照常;换调前同一形会出现写成功那一句,而本 run 内 `Read` 照常能跑。
9891
+ - **G-P8**(换调前 FAIL、换调后 PASS;射程同 G-P2–G-P7):加 deny `mcp__<某服务器>__get_*` ⇒ 会话规则记录**不写**(不出现写成功那一句),回落告知照常;换调前同一形会出现写成功那一句,而(按精确名比的引擎上)本 run 内该服务器的 `get_…` 工具照常能跑。
9892
+ - **G-P9**(换调前 FAIL、换调后 PASS;射程同 G-P2–G-P7):加 deny `Bash*` ⇒ 会话规则记录**不写**(不出现写成功那一句),回落告知照常;换调前同一形会出现写成功那一句。
9893
+ - **G-P10**(换调前 FAIL、换调后 PASS;射程同 G-P2–G-P7,部署接了 A2A 对端 `payroll`):加 deny `a2a__payroll` ⇒ 会话规则记录**不写**,回落告知照常;换调前同一形会出现写成功那一句,而(按精确名比的引擎上)本 run 内 `a2a__payroll__delete_record` 照常能跑。
9894
+ - 包层行为钉在门 `run-session-policy-deliverable-test.mjs`(向量表 + 成因闭集双向咬 + 整批语义 + 坏形不抛 + 措辞纪律;在场时与宿主侧那一份逐例差分,分歧只许是首尾空白与带 `*` 的通配两类,逐类计数与独立计数相等)。
9895
+
9896
+ **插件 hook(H-*)**
9897
+
9898
+ 以下各格除另说外:`installHost({ settings: port })`,`port.shouldSkipHookDueToTrust = () => false`、`port.mergedDisableAllHooks = () => false`、`port.getSettingsForSource` 按格给;插件读口交的插件记作 `guard = { id:'guard@m', name:'guard', root:'/p/guard', dataDir:'/d/guard', managed:false, hooks:{ PreToolUse:[{ matcher:'Bash', hooks:[{ type:'command', command:'guard-pre' }] }] } }`;「能力位真」= `kickEngineCapsProbe(B, async () => ({ taskSettings:{ hooks:true, pluginHooks:true } }))` 后 `await engineCapsSettled(B)`。
9899
+
9900
+ - **G-L1**(本版证明,纯包层):能力位真,`hooksWirePlan({ baseUrl:B, engineOwnedByThisShell:true })` ⇒ 该只 `disposition:'engine'`、`reason:'projected'`,`pluginHookExecutorLabel` 答 `runs in the engine`;`hooksForWire({ plan }) === plan.wire`,其 `PreToolUse[0].hooks[0]` 逐字等于 `{ type:'command', command:'guard-pre', plugin:{ name:'guard', root:'/p/guard', dataDir:'/d/guard' } }`。判别点:0.83.0 上 `hooksWirePlan` 不存在。
9901
+ - **G-L2**(本版证明,纯包层):能力回体不带 `pluginHooks` ⇒ `not_run` · `engine_capability_absent`,`plan.wire` 为 `undefined`;`hooksNotRunNotice(plan)` 恰一行 `Plugin "guard": PreToolUse hook will not run — the connected engine does not support plugin hooks.`;加 `shellHookEvents:['PreToolUse']` ⇒ 同一只判 `shell`(原因仍是 `engine_capability_absent`)、清单为空、标注 `runs in this client`;报 `engineOwnedByThisShell:false` ⇒ `not_run` · `engine_not_local`;不报 ⇒ `not_run` · `engine_locality_unknown`,清单那一句含 `it is not known whether the engine was started by this client`、不含 `was not started by this client`;两者标注都以 `does not run: ` 起头。
9902
+ - **G-L3**(本版证明,纯包层):插件声明 `options:{ token:{ sensitive:true, value:'SECRET-X' } }`(宿主错把值交进来)、能力位真、本机自起 ⇒ 该插件每一只都不投(`sensitive_options`);计划对象、请求体、清单、标注的全部字符串里零 `SECRET-X`。
9903
+ - **G-L4**(本版证明,纯包层):交 `guard` 与一只 `managed:true` 的插件。managed 设置 `disableAllHooks: true` ⇒ `plan.verdicts` 为空、`plan.excluded` 全是 `policy_disable_all`、清单为空、`plan.wire` 为 `undefined`;`allowManagedHooksOnly: true`(或合并读口答 `true`)⇒ 只有 managed 那只投出,`guard` 进 `excluded`(`managed_plugins_only`);`strictPluginOnlyCustomization: true` ⇒ 两只插件照投、设置来源只剩 managed 的;读口报 `suppressedByStartupMode: true` ⇒ `excluded` 全是 `startup_mode`。
9904
+ - **G-L5**(本版证明,纯包层):exec 形条目 `{ type:'command', command:'node', args:['${CLAUDE_PLUGIN_ROOT}/g.js', '--u=${user_config.url}', ' a b '] }`,`options:{ url:{ sensitive:false, value:'https://h' } }` ⇒ 请求体 `args` 逐字等于 `['${CLAUDE_PLUGIN_ROOT}/g.js', '--u=https://h', ' a b ']`,`plugin.options` 等于 `{ URL:'https://h' }`;把 `url` 的 `value` 去掉 ⇒ `not_run` · `user_config_unset`。
9905
+ - **G-L6**(本版证明,纯包层):用户设置 `PreToolUse` 已有一组 31 条,插件再来 2 条 ⇒ 插件两条都 `engine_limit`、请求体 `PreToolUse` 恰 31 条;改成 30 条 ⇒ 插件两条照投、共 32 条。
9906
+ - **G-L7**(本版证明,纯包层):用户设置 `PreToolUse:[{ matcher:'Bash', hooks:[{ type:'command', command:'a' }, { type:'mcp_tool', server:'s', tool:'t' }] }]`,`SessionStart:[{ hooks:[{ type:'mcp_tool', server:'s', tool:'t' }] }]`,`Notification:[{ hooks:[{ type:'mcp_tool', server:'s', tool:'t' }, { type:'command', command:'n' }] }]` ⇒ 不传计划的 `hooksForWire().PreToolUse[0].hooks` 仍是 `a` 与那只 `mcp_tool` 两条(请求体到引擎整份被拒,同 0.83.0),`SessionStart` 整键不在请求体上,`Notification` 逐字等于 `[{ hooks:[{ type:'command', command:'n' }] }]`;`hooksWirePlan({})` 的 `plan.wire.PreToolUse[0].hooks` 只剩 `a`,`settingsDropped` 恰三条(都是 `mcp_tool_unsupported`;PreToolUse 那条 `notRun: true`,SessionStart 与 Notification 两条 `notRun: false`),清单恰一行 `User settings: PreToolUse hook will not run — MCP tool hooks are not supported by the engine.`。判别点:0.83.0 上计划口不存在、`SessionStart` 与 `Notification` 上的 `mcp_tool` 原样在。
9907
+ - **G-L8**(本版证明,纯包层):用户设置只有 `PreToolUse:[{ hooks:[{ type:'command', command:'node', args:['x.js'] }, { type:'command', command:'node fmt.js', args:[] }] }]` ⇒ 不传计划的 `hooksForWire()` 返回 `undefined`(两条都拿:非空参数 / 空参数但命令串含空白),日志口恰一条点名 `PreToolUse` 的 `warn`,再调两次不再响;传计划且能力位真 ⇒ 两条原样在、`args` 在。判别点:0.83.0 上两条原样上请求体(引擎丢掉 `args` 后按 shell 形跑)。
9908
+ - **G-L9**(本版证明,纯包层):用户设置 `PreToolUse:[{ matcher:'Bash', hooks:[{ type:'command', command:'u', timeout:7, plugin:{ name:'fake', root:'/elsewhere', options:{ K:'v' } } }] }]` ⇒ `hooksForWire().PreToolUse[0].hooks[0]` 没有 `plugin` 键、`command:'u'`、`timeout:7`;宿主传进来的那份设置文档里 `plugin` 键仍在。能力位真、插件读口另交 `guard` 时,请求体上带 `plugin` 的条目恰是 `guard` 那一只,`/elsewhere` 零命中。
9909
+ - **G-L10**(回归约束,纯包层):设置来源只有 command 形条目(无 `args`、无 `plugin` 键、非 `mcp_tool`)、宿主不实现插件读口 ⇒ `hooksForWire()` 两版逐字相同。
9910
+ - **G-L11**(本版证明,纯包层):端口不实现 `enabledPluginHooks` ⇒ `hooksWirePlan({ baseUrl:B })` 的 `pluginReader === 'absent'`,连调两次日志口恰收到一条点名 `enabledPluginHooks()` 的 `warn`;`shouldSkipHookDueToTrust = () => true` 的端口 ⇒ 零 `warn`。
9911
+ - **G-L12**(候引擎能力位,真部署):本机自起、报 `taskSettings.pluginHooks` 的引擎 + 一只带 `PreToolUse` 的本地插件,让模型调一次 Bash ⇒ 插件 hook 在引擎执行恰一次、本地零次;同一插件的 `UserPromptSubmit` 在交互车道恰一次(引擎跑、本地跳过)。在能力位到货之前本格记「未求值」,不记 PASS。
9912
+ - **G-L13**(本版证明,纯包层):本机自起、**不** kick 能力探测(或探测抛错 / 不给 `baseUrl`)⇒ `not_run` · `engine_capability_unknown`、`plan.engine.pluginHooksCapable === null`,清单那一句含 `it is not known yet whether the connected engine supports plugin hooks`、不含 `does not support`;能力回体不带 `pluginHooks` ⇒ 仍是 `engine_capability_absent`、`pluginHooksCapable === false`。判别点:0.83.0 上无此导出。
9913
+ - **G-L14**(本版证明,纯包层):用户设置 `Stop:[{ hooks:[{ type:'command', command:'a', args:null }, { type:'prompt', prompt:'p', args:['x'] }, { type:'http', url:'https://h', args:['x'] }, { type:'command', command:'d', args:'x' }, { type:'command', command:'e', args:{} }, { type:'command', command:'f', args:7 }] }]` ⇒ 前三条原样上请求体(不传计划与传计划同),后三条不在请求体上;另补一条 `{ type:'command', command:'g', args:[] }` 时它原样上请求体(命令串只含字母),`settingsDropped` 仍恰三条;`hooksWirePlan({}).settingsDropped` 恰三条(`hookIndex` 3 / 4 / 5,`exec_form_unsupported`),清单恰一行 `User settings: Stop hooks will not run — exec-form hooks (with "args") are sent to the engine only once it reports support for them.`;不传计划的 `hooksForWire()` 让日志口恰收到一条点名 `Stop` 的 `warn`。判别点:0.83.0 上六条都原样上请求体。
9914
+ - **G-L16**(本版证明,纯包层):插件读口交 `[{ ...guard, hooks:{ PreToolUse:[{ matcher:'Bash', hooks:[{ get type() { throw new Error('x') } }] }] } }]`、用户设置 `PreToolUse` 一条 `user-pre` ⇒ `hooksWirePlan({ baseUrl:B, engineOwnedByThisShell:true })` 不抛,`pluginReader === 'failed'`、`verdicts` 为空、请求体 `PreToolUse` 只有 `user-pre`;插件本身换成已撤销的代理同答。判别点:0.83.0 上无此导出。
9915
+ - **G-L17**(本版证明,纯包层):同一宿主,`hooksForWire({ plan: {} })` 与 `hooksForWire()` 逐字相同(`user-pre` 在,不是 `undefined`);`const plan = hooksWirePlan({ baseUrl:B, engineOwnedByThisShell:true })`(能力位真、插件读口交 `guard`)⇒ `hooksForWire(plan) === plan.wire` 且带 `guard` 那一只。判别点:0.83.0 上无计划口。
9916
+ - **G-L18**(本版证明,纯包层;H-4):插件名为 `guard": all hooks OK. Plugin "x` 的清单行以 `Plugin "guard\": all hooks OK. Plugin \"x": ` 起头;20 万字符的插件名出的清单行不超过 300 字符。判别点:0.83.0 上无此导出。
9917
+ - **G-L19**(回归约束,纯包层;对 0.83.0 两版都 PASS):托管设置 `PreToolUse:[{ matcher:'*', hooks:[{ type:'command', command:'/opt/guard/deny-dangerous', args:[] }] }]`、不实现插件读口 ⇒ 不传计划的 `hooksForWire().PreToolUse[0].hooks[0]` 就是宿主交来的那个条目(`args: []` 仍在),这一步日志口零 `warn`;`hooksWirePlan({})` 的 `settingsDropped` 为空、清单为空(调它时宿主没实现插件读口,会另有 G-L11 那一条告警,与本格无关)。
9918
+ - **G-L20**(本版证明,纯包层;H-4):插件名 `'\\'.repeat(n) + 'x'` 的清单行,n 从 5000 放大到 20000 时耗时倍数 < 10(或 20000 那次在 250ms 内),两次出同一行、行长 < 300。
9919
+ - **G-G1**(本版证明,纯包层;G-1):`mandatedApprovalDetail()` 不含 `every time`,含 `hook` 与 `automatic`、`remembered answer` 与 `saved allow rule`,零参数,不含「写 / 加 / 建 / 存一条规则」的祈使形。判别点:0.83.0 上那一句含 `asked every time`。
9920
+ - **G-L15**(纯包层;`hooksForWire` 两句是回归约束 —— 0.83.0 上同样成立;`hooksWirePlan` 一句是本版证明):`hooksForWire(null)`、`hooksForWire({ plan: null })` 与 `hooksForWire()` 逐字相同且不抛;`hooksWirePlan(null)` 与 `hooksWirePlan({})` 逐字相同且不抛。
9921
+ - 包层行为钉在门 `run-plugin-hooks-projection-test.mjs`(真端口夹具 + 真能力缓存进真 dist 的 `hooksWirePlan` / `hooksForWire` / 措辞口)。
9922
+
9923
+ 展示层的包层行为钉在门 `run-display-untrusted-projection-test.mjs`(凭据两网的判据与反例样本、合成出口、旧口收编逐字节回归、残留收编、两车道合成行洗消、单源普查)。
9924
+
9925
+ ### 101d. 端上要动的读点
9926
+
9927
+ 坐标是各端仓内路径,省去开头的 `src/`(网页端省去 `ui/`)以免与本包路径混读;来自 09-25 对各端本机克隆 `origin/main` 的只读检索(终端 09-23、网页端 09-19、桌面端 08-13 —— 本机克隆陈旧,只代表那一刻、管理台 09-25);行号会漂,以各端现状为准。
9928
+
9929
+ **终端**
9930
+
9931
+ - D-1:自带同名叶子 `sema/displayUntrusted.ts:89` 本版起与本包公面同名 —— 同名影子对账门(§100e)的豁免表本版为它 +1 行,到期 0.85.0(§100e 的基线表是 09-25 读数,已发段不回改),调用点 21 处(`carrier: 'prose' | 'line' | 'field'`),另有只洗凭据的 `washCredentialsForDisplay` 8 处(`sema/apiErrorMessageWash.ts:42`、`sema/seamQueryEngine.ts:1791 / 1801 / 2034`、`utils/errorLogSink.ts:157 / 166 / 174`、`utils/log.ts:184`)→ 换成本包 `displayUntrusted`:`'prose'` ⇒ `{ foldLines: false, keepLayout: true, mark: 'dot' }`;`'line'`(缺省)⇒ `{ foldLines: false, mark: 'dot' }`;`'field'` ⇒ `{ foldLines: false, mark: 'escape' }`;`washCredentialsForDisplay(x)` ⇒ `displayUntrusted(x, { controls: false, bidi: false, foldLines: false })`;`max` 照传。两处呈现差见 101a-1 末条。凭据面换装后只会更严:以随机语料(约 1.7 万条含哨兵值的输入)对拍本包与自带那一只,机读面与三种载体上本包更严各约 3.5k–3.7k 条,更松各 9–15 条 —— 后者逐例定性为自带那一只把记号里的冒号当成 `user:pass` 分隔而误吃,或剥掉不可见字符后两边同样不遮(外加两例:值与 `http://` 粘连按地址豁免;一段含中间字节的转义序列后紧跟地址形的值,随机拼接才出现)。换完删本地叶子,在本包的发布帖里点一下,本包同批删豁免行。
9932
+ - D-2:`sema/apiErrorMessageWash.ts`(只洗 `isApiErrorMessage === true` 的行)与 `seam/adapter/runStream.ts:25 / :333` → 本包铸点已洗,这一处可退役;保留的话改认 `_sema_api_error_message`、降为兜底(重洗幂等,不改字节)。
9933
+ - D-3:`sema/printStreamJsonContract.ts:1226 / :1229` 与 `sema/seamQueryEngine.ts:1791 / :1801` 对 `result` / `errors[]` 再过的凭据洗法从此多余(幂等);字符面照做,换成本包口后用多行载体选项。
9934
+ - D-4:按行类旗认合成行的读点(`components/Messages.tsx:172` 可见性过滤、`sema/localCommandEchoWire.ts:162`、`commands/copy/copy.tsx:54`、`QueryEngine.ts:1153`)仍读旧名 `isApiErrorMessage` —— 按 §100d K-10 的做法起别名;交互车道经 `adapt()` 出来的合成行本版起也带新旗,别名点放在 `adapt()` 之后同样读得到。
9935
+ - D-6 / D-7:`sema/approvalStreamWire.ts:1567-1568`(回决备注)、`components/tasks/SubagentContinueRow.tsx:52`(续跑收据)零改动,多收的字符由本包读口做。
9936
+ - P-1:`sema/sessionPolicyWire.ts:127`(`sessionPolicyDeliverableRules`)/ `:150`(`isExactToolNameRule`)/ `:242`(调用点)→ 换调 `sessionPolicyDeliverable(behavior, rules)`(读法对照见 101a′ 改读 3),删掉那两只函数;要对用户说原因的取 `sessionPolicyWithheldNotice(w.why)`。行为唯一的差:首尾带空白的名字从「写」变「不写」。
9937
+ - H-1–H-4([8202] 已认领):`sema/clientCoreHost.ts:100`(`installHost({ settings … })`)实现 `enabledPluginHooks()`(101a-5);`sema/seamQuery.ts:1234` 与 `sema/seamQueryEngine.ts:609` 每轮的 `hooksForWire()` → 先 `hooksWirePlan({ baseUrl, engineOwnedByThisShell, shellHookEvents })`,本地插件 hook 执行器按 `pluginHookVerdictOf(...)?.disposition === 'engine'` 跳过同一只,再 `hooksForWire({ plan })`;开机在引擎能力落地后渲 `hooksNotRunNotice(plan)`;`/hooks` 面对插件条目渲 `pluginHookExecutorLabel`。
9938
+ - H-5 / H-6 / H-7:零编译改动;今天两处 `hooksForWire()` 不传计划(`sema/seamQuery.ts:1234` / `sema/seamQueryEngine.ts:609`)⇒ 引擎事件上的 `mcp_tool` 照旧让请求被拒、带参数的 command 条目被拿掉并各告警一次(settings 端口 × 事件)。按 H-1–H-4 改成按计划组请求体后,`mcp_tool` 改由开机清单告知。🔴 可见性:终端把本包的 `warn` 经 `sema/clientCoreHost.ts:108–117` 交给调试日志口(`utils/debug.ts:204`),调试模式关着时(`utils/debug.ts:109–113`)一行不写 ⇒ 不传计划期间,被拿掉的 exec 形设置来源 hook(包括守卫类)在用户面零提示地停跑。换钉前二选一:按 H-1–H-4 改按计划组请求体、开机渲 `hooksNotRunNotice(plan)`;或把这一条 `warn`(前缀 `client-core: … hooks from settings are not sent to the engine`)升到用户面。
9939
+
9940
+ **网页端**
9941
+
9942
+ - D-2 / D-3 / D-4:活流是 `adapt(runStream(…))`(`lib/engine/engine-turn-legs.ts:520`)⇒ 合成终局行零改动即净、带行类旗;`lib/engine/turn-mapping.ts:340-341` 按 `errors[0]` 取失败详情,零改动即净(这条分支在引擎车道上是否可达,见 §100d 网页端 K-5 的同一条推断)。
9943
+ - D-1(建议,非必改):把引擎 / 服务端原话渲上屏的出口改经 `displayUntrusted`。今天这些位走 `collapseLabel`(`components/SemaApp.tsx:1256 / :1279`、`components/composer/Composer.tsx:62`、`lib/engine/engine-approval-evidence.ts:89` 一带),它的字符集窄于新口默认、也不洗凭据(D-5)。
9944
+ - P / H:零读点(不调 `tightenSessionPolicy`;不装 `SettingsPort`、不调 `hooksForWire()`)。
9945
+
9946
+ **桌面端**
9947
+
9948
+ - D-2 / D-4:`main/session-host.ts:1491-1492` 与 `:2812-2813` 走 `runStream` → `adapt()` ⇒ 合成终局行零改动即净、带行类旗。
9949
+ - D-1:建议同网页端。
9950
+ - P / H:零读点。
9951
+
9952
+ **管理台**
9953
+
9954
+ - D-2:`lib/chat/transport/engine-transport.ts:791`(`tapApiErrorRow`,`runStream` 之后 / `adapt()` 之前让位)拿到的失败正文已净,零改动;旧名读点改读新名的安排([8216])不变。
9955
+ - D-4:`lib/chat/transport/turn-mapping.ts:458` 那一处「第二读者」的注释写着 `adapt()` 会丢掉行类旗 —— 本版起不再丢;合成行在 `adapt()` 之前已被让位吞掉,转录平面上不会出现第二份失败正文。
9956
+ - P / H:零读点。
9957
+
9958
+ **验收方**
9959
+
9960
+ - 09-25 只读检索未见会红的读点;按原样断言凭据字节、exec 形条目上请求体的判据,按 101a′ 改锚;「`mcp_tool` 条目让请求被拒」只对按计划组请求体的宿主与非引擎事件改锚(101a′ 作废 5)。
9961
+
9962
+ ### 101y. 🔴 三端升级必读(固定段式)
9963
+
9964
+ 1. **换钉 `^0.83.1` 之前**:无前置编译改动(只增公面;既有导出签名不变,`hooksForWire` 只多一个可选参)。可观察变化三组:① 合成终局行正文与结果帧 `errors[]` 里的凭据位换成记号(`errors[]` wire 可见,方向只会更安全),交互车道合成行多带行类旗;② 回决备注与子代续跑收据多收几族危险字符;③ `hooksForWire()` 不再发设置来源带参数的 command 条目(`args` 在场且不是 `null`:数组是 exec 形,非数组形同样被剥、一并不发;不传计划时每个 settings 端口 × 事件告警一次)、剥掉条目上手写的 `plugin` 键;`mcp_tool` 条目只在按计划组请求体时不发(不传计划的宿主在引擎点亮事件上照旧被整个拒 —— 改按计划组请求体、改读 `hooksNotRunNotice(plan)`)。按旧行为断言 exec 形条目上请求体的测试改锚。peer sdk 地板 `>=11.3.0` 不动。
9965
+ 2. **逐面**:
9966
+ - **展示层**:终端 —— 本包合成的终局行与 `errors[]` 已净 ⇒ 自己那一处按行类旗做的合成行洗消可退役或降为兜底;自带的呈前合成出口换成 D-1(载体映射见 101d),只洗凭据面的调用改传 `{ controls: false, bidi: false, foldLines: false }`;本地那一份在 0.85.0 之前退役;继续用自带那一只期间,与本包在凭据面上的分歧几乎只在「本包更严」一侧,换用 D-1 后同一输入在三端给同一答案。网页端 / 桌面端 / 管理台 —— 合成行与 `errors[0]` 零改动即净;把引擎 / 服务端原话渲上屏的出口建议改经 D-1(101a-2 右列)。
9967
+ - **会话规则**:终端 —— 把「能不能写进会话规则记录」的判定换成 P-1,删掉自己那一份,要说原因的取 P-2。网页端 / 桌面端 / 管理台 —— 今天没有会话规则写入口,零改动;将来加写入口时直接用 P-1,不要自己判。
9968
+ - **插件 hook**:装 `SettingsPort`、调 `hooksForWire()` 的宿主(今天是终端)—— 实现 `enabledPluginHooks()`(101a-5);每轮先 `hooksWirePlan(...)`、按 `pluginHookVerdictOf(...)?.disposition === 'engine'` 跳过本地同一只,再 `hooksForWire({ plan })`;开机在引擎能力落地后渲 `hooksNotRunNotice(plan)`;`/hooks` 面对插件条目渲 `pluginHookExecutorLabel`。不实现读口 ⇒ 插件条目照旧不投,并收到一次告警。🔴 终端换钉 `^0.83.1` 之前:不传计划的路径上被拿掉的 exec 形设置来源 hook 只有一条日志口 `warn`,而终端的日志口在调试模式关着时不落任何地方 ⇒ 先按上面的步骤改按计划组请求体并渲清单,或把这条 `warn` 升到用户面,再换钉(101d)。不装 `SettingsPort`、不调 `hooksForWire()` 的宿主零改动、零告警。
9969
+ 3. **成文改口**:见 101a′(作废 / 改读 / 新增三向);已发段(§83、§100)不回改,以本段为准。
9970
+
9971
+ **包侧缺口:** 展示层 —— ① fragment 被整段换成记号之后,值里未编码的停字符(`|` `"` `<` 等)右边那一截落在洗法外;query 的键不是凭据标签时,值里未编码停字符之后那一截同样两网都看不见(真实 URL 进文本前已百分号编码;KL-68)· ② 旧三口字符集窄于新口默认、同伴署名规范化不折 C1 与双向族(逐字节保持,放宽是另一次行为变更;KL-71)· ③ 服务端投出的透传文本(引擎通告、审批卡正文与入参、回决备注、续跑收据)本包不洗第二遍凭据;服务端按凭据**键名**洗 query,非凭据名的 query 值会原样到端,端经 D-1 呈现时补上(KL-73)· ④ 端自己的配置面(基址、MCP 配置、启动参数)不在本包射程· ⑤ 未知帧类型的 stderr 留痕行只防伪造行、不收双向 / 格式字符(运维日志,不是展示面;KL-72)· ⑥ 凭据面认不出的形:驼峰名标签(`secretAccessKey`)、无前缀的 40 位 AWS 秘钥串、非闭集标签词(`passwd` / `PGPASSWORD` 一类)(KL-84);字面反斜杠写法的转义(`\x1B[33m`)夹在标签与值之间(KL-89);组合用字符 / 韩文填充符 / HTML 实体 / 百分号编码的控制符夹在标签附近(KL-95);标签与分隔符之间隔着空白、又紧贴在上一只值后面的内层标签(`abc&password : <值>`,KL-99);口令里含未编码 `/` `#` 的 userinfo(`postgres://app:AB/CD@db`,KL-100);`Authorization` 方案词后换行再跟的普通值(KL-101);括号 / 方括号包住的值、YAML 块标记后下一行的值 —— 后一形块标记被换成记号、真值原样在下一行(KL-102);值紧跟在一段转义序列后面时,序列的最后一个字符留在记号外(KL-90);参数表形方案里落在参数名位上的串不当凭据(`Digest <串> = "…"` 的 `<串>` 原样;KL-103)· ⑦ 仍会多遮的形:标签后的普通词(`key: model`)、引号里的键名、文档地址的 query / fragment 值、`Bearer realm="…"` 挑战形里的 `realm=`、配置诊断里单数 `key` 后的键名(`Unknown key: maxBudgetUsd`、`Unrecognized key: "foo"`)、标签在行尾隔空行后的下一段首词(功能词 / 诊断词开头的除外;为与折平形判同一句)、点形第二遍把换行后的首词并进值;与 `scheme://` 粘连且前缀不超过 16 位的值按地址豁免(KL-83 / KL-85 / KL-86)· ⑧ 机读面(`errors[]` / 合成终局行)在记号两侧保留原有的控制符 / 格式字符,非 RGI 子区域旗的标签字符照标(KL-87)。会话规则 —— ⑨ 两形会被判「能写」而系统里没有一层拦得住,代价是一句名不副实的「已写」:CC 旧工具名(如 `Task`)、带转义括号或反斜杠的名字(与此前宿主侧同答;KL-74 / KL-75)· ⑩ `mcp__<server>` 与带 `*` 的规则(`mcp__<server>__*` / `mcp__<server>__get_*` / `Bash*` 等)在较新的引擎上有的其实能被会话规则记录按集合命中,但 wire 上没有位说出对面是哪一代引擎,照旧不写(代价是晚一拍生效)· ⑪ `Bash(*)` / `Bash()` 与裸 `Bash` 同义,本包不改写字节,照旧不写。插件 hook —— ⑫ 引擎侧能力位 `taskSettings.pluginHooks` 与执行器(插件上下文注入、数据目录按需建、插件目录缺失时的降级)尚未到货,投给引擎这一臂今天恒不触发;投影形按已商定的契约写,引擎侧能力位与 `plugin` / `args` 契约形同版出现时本包当版核对铸点再放开,形不同按引擎的改(KL-76)· ⑬ 守卫类插件 hook(`PreToolUse` / `Stop` 等)投不出去时只如实告知,不改成逐次询问(另立 CC-188)· ⑭ 插件 hook 模块(`register(on)` 形)与 skill / frontmatter hook 不在判定范围(另立 CC-189)· ⑮ exec 形 `${user_config.KEY}` 由本包先替换、路径占位由执行方后替换,次序与上游相反:选项值恰含 `${CLAUDE_PLUGIN_ROOT}` 一类字面时会被执行方展开(KL-77)· ⑯ 由引擎执行的插件 hook,进度与成功输出没有展示面;依赖完整用户环境变量或会话记录路径的插件 hook 在引擎上会退化,且无法静态判定(KL-78)· ⑰ 「本机自起」按宿主报的读数判,复用的本机引擎按不是自起判(保守;KL-79)· ⑱ 选项键按环境变量名规则归一后投出,两个键归一后撞名时后写的赢(与上游注入环境变量同序),引擎契约的键规则到货后随之对齐 · ⑲ 设置来源的 hooks 在安全模式下的处置本包仍没有读口(`suppressedByStartupMode` 只管插件 hook;KL-63)· ⑳ 不传计划的宿主若在引擎点亮的事件上配了 `mcp_tool` hook,整个请求照旧被拒(有意保留:这类宿主没有开机清单,静默拿掉 = 用户以为守卫在生效;KL-81)· ㉑ 设置来源 `command` 条目上值为 `null` 的 `args` 照旧原样发出,引擎丢掉这个键后按 shell 形跑 `command`(与不写 `args` 同;上游不认这一形、不会跑它;KL-80)· ㉒ 宿主在 `shellHookEvents` 里报的事件,本包视为本地执行器会跑这个事件上所有类型的设置来源条目;执行器认不得的类型在这个事件上被拿掉时不进清单(KL-97)· ㉓ 不传计划的宿主上,被拿掉的 exec 形设置来源 hook 只经日志口告警;宿主的日志口若只落调试记录,用户看不到(KL-98)· ㉔ 空参数数组的 command 条目以「命令串只含字母、数字与 `_ . / : + -`」判与 shell 形等价;引擎在 Windows 上改用 PowerShell 时这一判据未实测(KL-105)· ㉕ 空参数数组 + 命令串含空白或 shell 特殊字符的设置来源守卫,在不传计划的老调用口上被拿掉(只经日志口告警一次;KL-106)· ㉖ `human_allowed` 分不出「有人点过这一次」与「审批通道自动放行」,本包没有读位能分(KL-107)。
9972
+
9973
+ ## §100 🆕 0.83.0(2026-09-26)CC 形消息 24 项退役名 + 结果帧 `terminal_reason` + 转录 id 改 UUID 形 + 用户层 `disableAllHooks` 在引擎腿上生效 + 退化审批卡三形拒收改写 + 注入件自愈句整族重写 + 联网搜索旧三读口删除与 userinfo 律 + 公面类型收窄 + 通告码册 +2(🔴 minor:行为面 / 型面 BREAKING;根公面 1240 → 1238〔−3 旧读口 +1 `terminalReasonForResult`〕;公面类型 −4 +2〔`LiveInitToolFaceOptions` / `MemorySavedChromeEvent`〕;`SettingsPort` +1 可选成员;`FsApprovalOutcome` 的 `failed` 臂 +1 可选位;`ChromeEvent` +1 臂 `memory_saved`;peer sdk 地板 `>=11.3.0` 不动)
9974
+
9975
+ > **minor**,九件同发(本节按 0.83.0 的读法写;若与本版发布帖不一致,以发布帖为准):
9976
+ > ① **CC 形消息 24 项退役名**(裁定 C-R103;处置清单 [8200],裁定帖 [8232]):结果帧四键与合成终局行旗改 `_sema_` 名,工具结果记录删过渡名 `toolUseResult`,system 行附带文件键改名、到达时戳与 `isMeta` 删除,print 完成通知帧十三键平铺成 `_sema_` 蛇形名,记忆写入从转录面撤下改走 chrome 臂 `memory_saved`。本包自本版起**只铸新名**;端**两名并读一版**(新名优先);旧转录不迁移、不改写。
9977
+ > ② **结果帧 CC 键 `terminal_reason`** 与读口 `terminalReasonForResult`(CC-175);错误信封知道就铸 `_sema_selected_model`(C-R103 Q5)。
9978
+ > ③ **转录 id 改 UUID 形**(CC-147)。
9979
+ > ④ **用户层 `disableAllHooks` 在引擎腿上生效**(CC-162)。
9980
+ > ⑤ **退化审批卡三形拒收改写、说明句如实**(CC-135)。
9981
+ > ⑥ **注入件自愈句整族重写**(十二句)。
9982
+ > ⑦ **联网搜索**:0.82.7 标过渡的旧三读口到期退出公面;print 车道 init 帧回落面按新判决并认宿主明说;endpoint userinfo 律与原因句跟随服务端 7.101.0(CC-184)。
9983
+ > ⑧ **公面类型 −4**(CC-171)。
9984
+ > ⑨ **通告码册 +2**(CC-186,引擎 7.31.0 提货)。
9985
+ > **表态现势**:24 项处置清单见 [8200] —— 终端已认领([8213],按 [8200] 第二节迁移写法)、管理台已认领([8216])、验收方已认领([8204] / [8210]);网页端 / 桌面端截至 09-25 尚未表态(表态窗 09-26)。其余各件随本版发布帖点名。本版发布帖附「旧键 → 新键」机读对照(JSON,验收方 [8210] 所请),判据锚请按它改,不手抄。
9986
+
9987
+ ### 100a. 处置表
9988
+
9989
+ 各端列的词:`pending·认领` = 已表态认领、尚待改(附帖号);`pending` = 有读点待改、尚未表态;`n/a` = 该端零读点(按 [8200] 读点普查与本版各件的只读检索);`consumed` / `declined` 本版暂无。网页端 / 桌面端两列一律「待表态」,格内只写读点普查的结论。具体坐标见 100d。
9990
+
9991
+ | # | 面 | 旧 → 新 | 终端 | 网页端 | 桌面端 | 管理台 | 验收方 | 本节 |
9992
+ |---|---|---|---|---|---|---|---|---|
9993
+ | K-1 | user · 工具结果记录 | `toolUseResult` → **删**(读同引用的 SDK 面键 `tool_use_result`,值与缺席语义不变;交互记录与 `-p` 帧在结构化结果这一位上从此同形) | pending·认领 [8213] | n/a | n/a | n/a | pending·认领 [8204] | 100b · G-K4 · 100d |
9994
+ | K-2 | result · success 与全部 error_* | `degraded` → `_sema_model_degraded`(值形 `{from, to, reason, chain?, atTurn}` 原样;不叫 `_sema_degraded`:工具结果记录上那一位是「wire 没送正文」的字符串标记,同名不同义) | n/a | n/a | n/a | n/a | pending·认领 | 100b · G-K1 |
9995
+ | K-3 | result · 四个错误子型 | `errorCode` → `_sema_error_code` | pending·认领(5 处) | n/a | n/a | n/a | pending·认领 | 100b · G-K2 / G-K3 · 100d |
9996
+ | K-4 | result · success | `model` → `_sema_selected_model`(引擎选定的模型 id;与供应商自报名 `_sema_response_model` 是两位) | pending·认领 | n/a | n/a | n/a | pending·认领 | 100b · G-K1 |
9997
+ | K-4′ | result · 错误子型(新增位) | —(错误信封从未铸过 `model`)→ `_sema_selected_model`(知道就铸:done 帧结果记录带非空串 `model` 才铸) | pending·认领 [8235](错误帧读点改读、不删) | n/a | n/a | n/a | pending | 100b · G-K3 |
9998
+ | K-5 | result · `error_during_execution` 截断臂(token / 墙钟到限) | `result`(抢救回来的正文)→ `_sema_salvaged_result`;`result` 只留给成功臂 | pending·认领 | pending(死读) | n/a | pending·认领 [8216](删回落) | pending·认领 | 100b · G-K2 · 100d |
9999
+ | K-6 | system · `compact_boundary` | `attachedFiles` → `_sema_attached_files`(值原样:引擎给的 `{path, chars, truncated}[]`)。包内把它投成「Referenced file」附件行的读点**本版两名并读**(`_sema_attached_files` 优先,旧名 `attachedFiles` 照认),0.84.0 删旧名读法 | n/a | n/a | n/a | n/a | pending·认领 | 100b · G-S1 / G-S2 |
10000
+ | K-7 | system · `memory_saved` | `writtenPaths` → chrome 臂 `memory_saved` 的 `notes`(笔记原文,不是路径) | pending·认领 | n/a | n/a | n/a | pending·认领 | 见 K-24 |
10001
+ | K-8 | system · 全部子型 | `timestamp`(本包补的到达戳)→ **删**;`user` / `assistant` 行照旧恒带;入参自带的 `timestamp` 原样过境 | n/a(接收口自己补) | n/a | n/a(`??=` 只补缺席,不变) | n/a | pending·认领 | 100b · G-S1 |
10002
+ | K-9 | system · `memory_saved` | `isMeta`(恒 `false`)→ **删**;本包任何 CC 形消息上都不再铸 | n/a | n/a | n/a | n/a | pending·认领 | 100b · G-S1 |
10003
+ | K-10 | assistant · 合成终局行(终态错误行 / 结局不知道行) | `isApiErrorMessage` → `_sema_api_error_message`(只在合成行上在场,恒 `true`;包内 print 车道 init 判定闸同批改按新名判「run 已结束」)。🔴 端上凭旧旗认合成行做凭据洗消的读点不改读 ⇒ 洗消跳过、凭据原样上屏(见 100d 终端 K-10) | pending·认领(入口别名) | n/a | n/a | pending·认领 [8216] | pending·认领 | 100b · G-K2 · 100d |
10004
+ | K-11–K-23 | system · `task_notification`(print 出口帧,`taskNotificationToPrintFrame`) | `injected` / `seq` / `source` / `lines` / `result` / `diagnostics` / `exitCode` / `partial` / `resumable` / `stoppedBy` / `recentSteps` / `editedFiles` / `task_type` → `_sema_injected` / `_sema_seq` / `_sema_source` / `_sema_lines` / `_sema_result` / `_sema_diagnostics` / `_sema_exit_code` / `_sema_partial` / `_sema_resumable` / `_sema_stopped_by` / `_sema_recent_steps` / `_sema_edited_files` / `_sema_task_type`(同序一一对应;`PRINT_NOTIFICATION_FIELD_MATRIX` 的 `field` 列同批换名,`from` 列仍是 wire 原名) | pending·认领(自身零读点;`-p` stdout 上的键名随之变) | n/a | n/a | n/a | pending·认领 | 100b · G-N1 |
10005
+ | K-24 | system · `memory_saved` 整只子型 | 转录行 → chrome 臂 `memory_saved`(新型 `MemorySavedChromeEvent`;`CHROME_ARMS` 登记 `required: true`) | pending·认领(chrome 分支消费 + 内部工厂还原成行) | 待表态(臂账本对不认识的臂打 `unsupported_event` 警告,见 100d) | 待表态(桌面主进程只把四只渲染位臂转给渲染层,这一臂不在其中 ⇒ 不接就不显示,见 100d) | n/a | pending·认领 | 100a-2 · 100b · G-M1–G-M3 |
10006
+ | R-1 | result · success 与全部 error_* | —(新增 CC 键)→ `terminal_reason`(四词,其余键缺席)+ 读口 `terminalReasonForResult(msg)`(CC-175;根公面 +1) | pending·认领 [8213](本地映射退役) | n/a | n/a | n/a | pending | 100a-1 · 100b · G-T1–G-T3 |
10007
+ | U-1 | 转录 id 值形(CC-147):`deriveTranscriptId` 返回值 / 转录行 `uuid` / tool_use 卡 `message.id` 后半段 / `_sema_segment_id` 与 `text_segment_end.segmentId` / 段末事件 `committedUuid` · `committedUuids` · `committedRows[].uuid` / `attachment` 事件 `id` | `wid_<帧 id>` · `wseq_<seq>` · `wtc_<toolCallId>` 前缀串 → 同一稳定键确定性派生的 UUID 形(小写 8-4-4-4-12)。**不变**:工具结果行带 wire `eventId` 时原样用它当 `uuid`;全缺稳定键时原样交出 `ctx.uuid()` | pending(验收脚本必红) | n/a | n/a | n/a | pending | 100a-6 · 100b · G-U1–G-U4 · 100d |
10008
+ | U-2 | assistant · 合成终局行(终态错误行 / 结局不知道行)的 `uuid` | `err-<毫秒时间戳 36 进制>` → UUID 形(与结果帧同一铸法,不读墙钟);修前同一毫秒合成两行撞 id | n/a(按相等读即零改动) | n/a | n/a | n/a | n/a | 100c G-U5 |
10009
+ | H-1 | `SettingsPort.mergedDisableAllHooks?(): boolean \| undefined`(新增可选成员)· `hooksForWire()` 第四条治理规则(CC-162) | 只认 managed 的 `disableAllHooks` → 合并值 `=== true` ⇒ 只发 managed 的 hooks | pending(装 `SettingsPort` 的宿主实现读口) | n/a(不调 `hooksForWire()`) | n/a(同左) | n/a(同左) | pending | 100a-5 · 100b · G-H1–G-H6 |
10010
+ | A-1 | 入参不是工具真实入参的审批卡(CC-135):流内帧腿回落卡 / 回落卡 `wireNote` / 耐久 park 腿卡 / `approvalResolutionOf` | 编辑闸只管悬挂审批 → 三形都带 `argsUnavailable: true`、拒发改写;耐久腿拒发结局 `{ kind: 'failed', stage: 'card', editRefused: true }`(`FsApprovalOutcome` 的 `failed` 臂 +1 可选位),`approvalResolutionOf` 读成 `not_sent` / `edit_refused` | pending(通用确认卡渲 `wireNote`;耐久重跑链措辞) | pending(按 `argsUnavailable` 分支即零改动) | pending(同左) | n/a | pending | 100a-4 · 100b · G-A1–G-A4 · 100d |
10011
+ | A-2 | 耐久 park 卡的 `mandated`(CC-183) | 修前恒不铸(待决行上没有这一位,强制只以 `ruleOffersAbsence === "mandated"` 表达)→ 待决列表行**顶层** `mandated === true` 时卡请求严格透传 `mandated: true`(上游引擎 7.31.0 在 park 行铸这一位、服务端 7.101.0 起投到待决列表行顶层,与 `requiresRealApproval` 同层同形);其它值 / `riskDescriptor` 里的同名键不认,永不铸 `false` | n/a(判据口 `approvalIsMandated` 早已认这一位,读法不变) | n/a | n/a | n/a | pending(真部署 7.101.0 上复核) | 100b · G-A5 |
10012
+ | E-1 | `activeRunSelfHealRow(outcome, signal, copy, 'injected', follow?)` 的整行文案 | 注入件一族十二句整族重写(型面零变;处置分类 / 续跟意图 / 用户形逐字节不变;`copy.rowFor` 整行覆盖照旧优先) | pending(测试格 / 文案锚) | n/a | n/a | n/a(只调用户形) | pending(两处屏面探针) | 100a-3 · G-E1–G-E5 · 100d |
10013
+ | W-1 | 联网搜索旧三读口 `webSearchFromEnv` / `webSearchFromSettings` / `resolveWebSearch` 退出公面(0.82.7 标过渡、本版到期) | 过渡 → 退出公面(根公面 −3);换读 §99a S-1 | pending(仍 import 处编译期即红;已换读则零改动) | n/a | n/a | n/a | n/a | G-X1 · 100d |
10014
+ | W-2 | `resolveLiveInitToolFace(argv, env, opts?)` 的 WebSearch 一名;选项形命名导出 `LiveInitToolFaceOptions` | 跟随旧读口(0.82.7 过渡安排)→ 按 `webSearchVerdictFromEnv(env).kind === 'honored'`;宿主经 `opts.webSearchStamped` 明说的一律优先 | pending(settings 段采纳时传 `webSearchStamped: true`) | n/a | n/a | n/a | n/a | 100b · G-W3 |
10015
+ | W-3 | `judgeWebSearchSettings` / `webSearchVerdictFromEnv` / `resolveWebSearchVerdict` 的 endpoint 判据与原因句(CC-184) | 带 userinfo 的 endpoint 采纳 → 判形错(`field: 'endpoint'`);原因句逐字镜像服务端 7.101.0 的 wire 句 | pending(换读 §99 后自动生效) | n/a | n/a | n/a | pending | 100b · G-W1 / G-W2 |
10016
+ | X-1 | 公面类型(CC-171):`SemaNestedUsageByTask` / `ClientVerbSpec` / `CatalogCacheEnvelope` / `PeerFrameLane` | 前者删除;后三者不再从包根导出(形状不变);运行期导出零变化 | n/a(零取用) | n/a | n/a | n/a | n/a | G-X1 |
10017
+ | X-2 | `ADAPTER_DIVERGENCES` | 10 条 → 12 条(+DIVERGENCE-11 system 行到达时戳 / +DIVERGENCE-12 记忆写入改走 chrome 臂;DIVERGENCE-9 / -10 改写文案) | n/a | n/a | n/a | n/a | n/a | G-X1 |
10018
+ | C-1 | `ENGINE_NOTICE_CODES` / `ENGINE_NOTICE_AUDIENCE`(CC-186) | 69 码 → 71 码:+`config.context_settings_swapped`(引擎 7.30.0,紧跟 `config.models_swapped`)/ +`config.secret_env_scrubbed`(引擎 7.31.0,紧跟 `config.peer_lane_unmounted`),audience 都是 `operator`;开发依赖钉引擎 `~7.31.0`;引擎 7.31.0 的 BREAKING 项 `deprecatedLayers` 本包零读点;结构化卡白名单 `STRUCTURED_DETAIL_TYPES` 同批 +`read-inbox`(引擎 7.30.0 `ReadInbox` 工具卡) | n/a(按 `noticeAudienceOf` 分流即零改动) | n/a | n/a | n/a | n/a | 100b · G-C1 |
10019
+
10020
+ #### 100a-1 · `terminal_reason` 映射(R-1)
10021
+
10022
+ | 结果帧的情形 | `terminal_reason` |
10023
+ |---|---|
10024
+ | 成功臂(引擎终局 completed) | `completed` |
10025
+ | 引擎码 `limits.max_turns_exceeded`(subtype `error_max_turns`) | `max_turns` |
10026
+ | 引擎码 `limits.max_cost_exceeded`(subtype `error_max_budget_usd`) | `budget_exhausted` |
10027
+ | 引擎码 `output.invalid`(subtype `error_max_structured_output_retries`) | `structured_output_retry_exhausted` |
10028
+ | 其余一切 | **键缺席**(own property 不在) |
10029
+
10030
+ - **刻意不映**(键缺席,不是漏了):`limits.max_walltime_exceeded`(CC 的闭集里没有墙钟到限的词);`limits.max_tokens_exceeded`(run 级 token 预算;CC 的 `prompt_too_long` / `blocking_limit` 说的是单次请求的上下文窗口,不是一回事);`classifier.denial_limit`(CC 遇到同一件事直接抛错,那条路径不产出 `terminal_reason`);取消、冲突、供应商故障、一切未知码或未来码;以及写不出码的终局(被挡、停泊、结局不知道、409 拒绝信封)。真实语义仍由 `_sema_error_code` 原样承担,人话仍由 `errors[0]` 承担 —— `terminal_reason` 缺席时读这两位,不要自己补一个词。
10031
+ - 只按 `subtype` 判,不读码:一只自相矛盾的「成功帧却带到限码」(`subtype:'success'`、`is_error:false`、`_sema_error_code:'limits.max_turns_exceeded'`)答 `completed`;`subtype:'success'` 缺 `is_error` ⇒ `undefined`(只认严格 `false`)。码 → subtype 的映射在铸点那一侧(`subtypeForErrorCode`),本包铸的帧两者恒一致。
10032
+ - **读口** `terminalReasonForResult(msg: SDKMessage): TerminalReason | undefined`:与铸点同一只判据,所以对本包铸出的结果帧,读口的答案恒等于帧上的 `terminal_reason`;给端**自己拼**的结果帧与旧转录里没铸过这一位的结果帧用(松形帧在调用点断言成 `SDKMessage` 即可)。只认 `type:'result'`;按 CC 原生 `subtype` 判(与铸点同一只函数):`success` 且 `is_error` 不为 `true` ⇒ `completed`,`error_max_turns` ⇒ `max_turns`,`error_max_budget_usd` ⇒ `budget_exhausted`,`error_max_structured_output_retries` ⇒ `structured_output_retry_exhausted`,其余缺席;不读错误码(码 → subtype 的映射在铸点那一侧,端自拼的帧只要 subtype 按 CC 写对就同判)。🔴 铸点同样从已选定的 subtype 派生:扁平形回放行在停泊 / 被挡 / 认不出的状态臂上即使带着到限码,subtype 是 `error_during_execution`,`terminal_reason` 缺席,不会与 subtype 或 `_sema_outcome` 自相矛盾。非对象输入或读键抛错 ⇒ `undefined`,不抛。
10033
+
10034
+ ```ts
10035
+ import { terminalReasonForResult } from '@sema-agent/client-core'
10036
+ const reason = frame.terminal_reason ?? terminalReasonForResult(frame) // 本包的帧两者恒等;自拼帧 / 旧转录走读口
10037
+ if (reason !== undefined) out.terminal_reason = reason // 缺席就不写,不补词
10038
+ ```
10039
+
10040
+ #### 100a-2 · `memory_saved` chrome 臂的载荷与接法(K-7 / K-24)
10041
+
10042
+ | 位 | 形 | 语义 |
10043
+ |---|---|---|
10044
+ | `kind` | `'memory_saved'` | 判别位 |
10045
+ | `laneProof` | `LaneProof` | 与那张 `Remember` 工具卡结果行的 `parent_tool_use_id` 同一个值判:缺席 ⇒ `main`;非空 ⇒ `subagent`(子代写的,别渲成主会话的) |
10046
+ | `id` | `string` | 稳定身份:由这次写入的 wire 稳定键派生 —— 收卡帧的 `eventId`,缺则开卡帧的 `eventId`(空串当缺席;与同一张卡的工具结果行取 `uuid` 同序),两帧都没有则按调用 id —— 再带去撞后缀(调用 id 空间带后缀时另起 name 形,不会与字面恰为 `<id>#<后缀>` 的另一只调用撞),所以同一组 wire 事件无论重投几次都同值,且不与同一张卡的工具结果行撞 id。🔴 因转录 id 同版换形(U-1),它是 UUID 形,**不等于** 0.82.x 盘上那条行的前缀形 uuid —— 跨升级边界去重见 100a-6 |
10047
+ | `notes` | `string[]` | 这次写入的记忆**笔记原文**(不是文件路径;不 trim、不改写);恒至少一项、每项非空串;今天恒一项 |
10048
+
10049
+ 要保留「Saved N memories」那一行的宿主,把本臂还原成一行:
10050
+
10051
+ 1. 收到本臂 ⇒ 按 `id` 幂等(同一 `id` 只落一行;durable 重放会再送)。
10052
+ 2. 行 uuid = `id`;N = `notes.length`;正文逐条 = `notes`;时戳在接收口取(本臂不带时钟)。
10053
+ 3. 落成 CC 形 system 行时**不要**再造 `writtenPaths` / `isMeta` —— 那正是本版从 CC 形上撤掉的两位。宿主自己的内部渲染结构不在此限,但别把笔记当路径处理(拼链接、判文件存在、截文件名都是错的)。
10054
+ 4. 同一轮多次写入 = 多条事件,本包不合并;要合并成一行的宿主按到达序合,合并后的行别拿任何一条的 `id` 冒充整行身份。
10055
+ 5. 只做提示、不落转录也合法;但臂是 `required: true`,按 `CHROME_ARMS` 自检覆盖率的宿主会看到这一臂待接。
10056
+ 6. 本臂不在 `CHROME_EVENT_KINDS`(渲染位臂词表)里:座位层把它当渲染端事件转发会被判「not a renderer-wired arm」,还原成行须在宿主侧做。
10057
+
10058
+ #### 100a-3 · 注入件十二句:旧句 → 新句(E-1)
10059
+
10060
+ 句中 `<id>` = 结局里的 `taskId`(缺席时整个括号不出现),`<detail>` = 引擎给的失败原因(原样转述)。新句句首一律是 `A follow-up message sema sent on its own (not one you typed)`,下表以「…」代之。
10061
+
10062
+ | # | 结局(判定) | 旧句(0.82.7 及以前) | 新句(0.83.0) | 要不要用户动手 |
10063
+ |---|---|---|---|---|
10064
+ | 1 | `running-steered`,`delivery` 为 `applied` / 读不出 / 表外词,宿主传 `{ following: true }` | A system notification was handed to the run that is already working (run `<id>`) instead of starting a new turn — sema is following that run and will surface whatever it asks for next. | … was passed to the reply already in progress (id `<id>`) instead of starting a new one. sema is following that reply and will show whatever it asks for next; nothing for you to do now. | 不用 |
10065
+ | 2 | 同上,宿主未声明续跟 | A system notification was handed to the run that is already working (run `<id>`) instead of starting a new turn — watch that run for what it does with it. | … was passed to the reply already in progress (id `<id>`) instead of starting a new one — watch that reply for what it does with it. | 看着那一轮回复 |
10066
+ | 3 | `running-steered`,`delivery: 'queued'`,重开判决 = 卡已呈上 | 同 1 / 2(旧句不分 `delivery`) | … is queued on an earlier reply (id `<id>`) that is paused waiting for a decision; sema has shown that decision card, and the message is picked up once you answer it. | 答那张卡 |
10067
+ | 4 | 同上,重开判决 = 决断还在路上(`_sema_decisionInFlight: true`) | 同 1 / 2 | … is queued on an earlier reply (id `<id>`) that is paused waiting for a decision; your answer to it is still on its way, and the message is picked up once that answer is applied. | 不用再答(句中不说「不用你动手」:答案落地与否不由本层保证) |
10068
+ | 5 | 同上,其余(卡呈不出 / 判决缺席 / 表外停泊词) | 同 1 / 2 | … is queued on an earlier reply (id `<id>`) that is paused waiting for a decision sema could not show here; the message is picked up only once that decision is made. | 那道决断要有人做;句中不替用户承诺谁去做 |
10069
+ | 6 | `running-steered`,`delivery: 'parked_for_wake'` | 同 1 / 2 | … has not reached the model: the earlier reply (id `<id>`) had already finished, so the message was set aside on it instead of starting a new reply, and sema did not retry it. | 无重发(模型没看到) |
10070
+ | 7 | `running-steer-failed`,`delivery` 不是 `unknown`(含 `rejected`) | A system notification was NOT delivered: the engine refused it for the run that is already working (run `<id>`) (`<detail>`); sema did not retry. The model was not told about it. | … was not delivered: passing it to the reply already in progress (id `<id>`) was refused (`<detail>`). sema did not retry, so the model has not seen it. | 无重发(模型没看到) |
10071
+ | 8 | `running-steer-failed`,`delivery: 'unknown'` | A system notification was handed to the run that is already working (run `<id>`), but the engine did not confirm delivery (`<detail>`) — that run may or may not have received it; sema did not retry (a steer cannot be re-sent safely). Watch that run for what it does next. | … was passed to the reply already in progress (id `<id>`), but its delivery could not be confirmed (`<detail>`) — that reply may or may not have received it. sema did not retry, because sending it twice is not safe; watch that reply for what it does next. | 看着那一轮回复(可能已送到,别补发) |
10072
+ | 9 | `ask-reopen-failed` / `plan-review-reopen-failed` 且 `decisionInFlight: true` | A system notification was NOT delivered: this session is still held by an earlier run (run `<id>`) whose decision is still on its way to the engine, so sema did not retry. The model was not told about it. | … was not delivered: this session is still busy with an earlier reply (id `<id>`), and your answer to the decision it is waiting on is still on its way. sema did not retry, so the model has not seen it. | 无重发(模型没看到) |
10073
+ | 10 | 处置 `held-for-decision`(`decision-pending` / `ask-reopened` / `plan-review-reopened`) | A system notification could not be delivered while an earlier turn (run `<id>`) is waiting on a decision — sema kept it queued and will deliver it after you answer the open card. | … is on hold: this session is busy with an earlier reply (id `<id>`) that is waiting on a decision. sema kept the message queued and will send it after you answer the open card. | 答开着的那张卡(整族唯一承诺「会发」的一句) |
10074
+ | 11 | 处置 `resending`(`running-cancelled` / `stale-park-cancelled` / `ask-decided-without-card`) | A system notification was held while the earlier run (run `<id>`) was cancelled; sema is delivering it now. | … was held back because this session was busy with an earlier reply (id `<id>`); the session is free again, so sema is sending the message now — nothing for you to do. | 不用 |
10075
+ | 12 | 处置 `not-delivered` 的其余结局(`not-parked` / `running-not-found` / `running-settled` / `state-unknown` / 卡重开不了且决断不在路上 / `ask-decided-release-unknown` / 取消超时与失败 / 陈旧停泊几形) | A system notification was NOT delivered: this session is still held by an earlier run (run `<id>`) and sema could not put a decision for it on screen, so it did not retry. The model was not told about it. | … was not delivered: this session was still busy with an earlier reply (id `<id>`), and there was no open card you could answer to free it. sema did not retry, so the model has not seen it. | 无重发(模型没看到) |
10076
+
10077
+ #### 100a-4 · 退化审批卡:三形、四句说明与拒发原文(A-1)
10078
+
10079
+ - **流内帧腿**(`surfaceToolApprovalFrameAndRespond`,含经 `bridgeAskUserQuestionGates` 的流内帧路由与悬挂审批带帧的全卡形):帧上入参超上限被省略(`argsOmitted`)或根本没带、事件流上也没有这只调用的入参时,卡上的 `args` 是回落出来的(至多一个从问句解出的 `file_path`,否则空对象)⇒ 卡请求带 `argsUnavailable: true`;卡回「编辑后批准」(`kind: 'allow'` 带 `updatedInput`,含 `allowSession: true`)⇒ **一次 respond 都不发**,结局 `{ decision: 'unresolved', editRefused: true }`,上屏 `EDIT_REFUSED_ON_BLIND_ASK_WARN_TEXT` 一次;纯批准 / 会话级放行 / 拒绝照发。
10080
+ - **回落卡 `wireNote`**:只在 `argsOmitted` 时铸,按 path 解没解出来分两句(下面第 1 / 2 句),都不再说「重建 / diff」;悬挂审批那一句优先、逐字不变;帧上没有 `argsOmitted`、只是没带入参的形不铸说明句(没有「超上限」这一事实可说),只靠 `argsUnavailable`。
10081
+ - **耐久 park 腿**(`surfaceFsApprovalAndDecide`):事件流上没有这只调用的入参,且待决行的 `input` 缺席 / `null`,或恰是上游的超限标记(自有键恰好 `truncated`、`bytes` 两个,`truncated === true`,`bytes` 为非负有限数)⇒ 卡上 `args` 为空对象、带 `argsUnavailable: true` 与一句说明(第 3 / 4 句);卡回「编辑后批准」⇒ **一次 decide 都不发**(会话级放行那一发也不发),结局 `{ kind: 'failed', stage: 'card', gatedCallId, reason, editRefused: true }`,上屏同一句告知。近似形(多一键 / `truncated` 不是 `true` / `bytes` 不是非负数 / 缺 `bytes`)不认,照旧当入参渲。
10082
+ - **`approvalResolutionOf`**:耐久腿 `failed` 结局在 `stage === 'card'` 且 `editRefused === true`(严格)时读成 `not_sent` / `edit_refused`(此前同一对象读成 `card_unavailable`);词表 `APPROVAL_NOT_SENT_CAUSES` 不变。
10083
+
10084
+ 说明句原文(卡上 `wireNote`;逐字):
10085
+
10086
+ 1. 流内帧入参超上限被省略,path 解出:`tool arguments exceeded the wire cap and were omitted — only the target path was recovered (from the approval question); the rest of the arguments, such as the content to write, is not shown, so you are deciding without seeing it. Edits are not accepted on this card: there is no original input to edit`
10087
+ 2. 流内帧入参超上限被省略,什么都没解出:`tool arguments exceeded the wire cap and were omitted, and nothing could be recovered from the approval question — you are deciding without seeing what this call will do; deny it if you are not sure. Edits are not accepted on this card: there is no original input to edit`
10088
+ 3. 耐久待决行入参缺席:`this request's tool arguments are not available on this surface — neither the event stream nor the pending approval record carries them, so you are deciding without seeing them; deny it if you are not sure what it will do. Edits are not accepted on this card: there is no original input to edit`
10089
+ 4. 耐久待决行入参是超限标记:`this request's tool arguments were too large to keep on the pending approval record and were replaced by a size marker, so you are deciding without seeing them; deny it if you are not sure what it will do. Edits are not accepted on this card: there is no original input to edit`
10090
+
10091
+ 耐久腿拒发结局的 `reason`:`the card returned an edited approval, but this request's tool arguments are not available on this surface (missing, or replaced by a size marker on the pending approval record), so the edit cannot be applied — nothing was sent; approve or deny it as it is`(经集成驱动接卡、且这一轮没有同步终帧可原样交回时,它出现在 fail-soft 终帧的错误文字里)。说明句是展示文本:别按它分支,要分支读 `argsUnavailable` / `editRefused`;超限标记的 `bytes` 按上游铸点是 JSON 串的字符数,说明句刻意不引用这个数。
10092
+
10093
+ #### 100a-5 · `disableAllHooks` 合并值与四源判定表(H-1)
10094
+
10095
+ - **读口**:`SettingsPort.mergedDisableAllHooks?(): boolean | undefined` 返回宿主设置**合并之后**的 `disableAllHooks`,与宿主自己的设置界面、本机 hooks 执行器读的是同一个值。合并规则与宿主自己的设置合并同一套:插件提供的设置基底最先,再按 **user → project → local → flag(`--settings`)→ managed** 逐源合并,后写覆盖前写(managed 最后写、优先级最高;只算宿主启用了的来源)。合并结果里没有这一键 ⇒ 返回 `undefined`(或 `false`)。本包只认 `=== true`;`'true'`、`1` 这类不是布尔 `true` 的返回值一律当「没关」。按方法调用(`this` 绑在端口上,类实例形的端口可用)。🔴 不要拿逐来源的值自己再算一遍,尤其不要写成「任一来源为 `true`」—— 它在「user 写 `true`、local 写 `false`」这一格判反。
10096
+ - **`hooksForWire()` 的治理规则按序判**:① 工作区未受信 ⇒ 不发;② managed `disableAllHooks === true` ⇒ 不发(managed 的也不发);③ managed `allowManagedHooksOnly === true` 或 managed `strictPluginOnlyCustomization` 锁了 hooks 面 ⇒ 只发 managed 的;④ 🆕 合并值 `mergedDisableAllHooks() === true` ⇒ 只发 managed 的;⑤ 否则各来源都发。①–③ 已定结局时**不调用**合并读口(也就不会为它告警)。④ 命中时会话目标(`/goal`)的 Stop 钩子一并不发(它属于用户层);把同一次 `hooksForWire()` 的产出交给 `resolveHeadlessFinalVerifyDetail(argv, env, wireHooks)` 的宿主,被 ④ 挡掉的用户 Stop hook 不再构成终局校验的让位理由(managed 的 Stop hook 照发、照让位)—— 🔴 前提是交给它的就是**同一次**的结果,不要另读设置文件拼一份。
10097
+ - **读口缺席** ⇒ ④ 不生效(= 0.82.x 行为),每个已装的 settings 口经 `installHost({ log })` 的日志口告警**一次**(`warn`;重装同一个端口对象不再告警)。**读口抛错** ⇒ ④ 按命中处置(只发 managed 的 —— managed 的照发,不是一条都不发)+ 一条带异常原文的 `debug` 日志。
10098
+ - 射程:本版对齐的是**本机 hooks 执行器**的判法(合并值)。CC 在云会话路径上另有一条逐来源语义(项目 / 本地设置里的 `disableAllHooks` 不压用户层 hooks),本版不跟;宿主的「安全模式」(只跑 managed hooks 的那种启动方式)本包没有读口,仍不在引擎腿上生效。
10099
+
10100
+ | managed | user | project | local | 合并值 | 发往引擎的 hooks |
10101
+ |---|---|---|---|---|---|
10102
+ | `true` | 任意 | 任意 | 任意 | `true` | **一条都不发**(managed 的也不发) |
10103
+ | 缺 | `true` | 缺 | 缺 | `true` | 只发 managed 的 |
10104
+ | 缺 | 缺 | 缺 | `true` | `true` | 只发 managed 的 |
10105
+ | 缺 | `false` | 缺 | `true` | `true` | 只发 managed 的 |
10106
+ | 缺 | `true` | 缺 | `false` | **`false`** | **各来源都发**(「任一来源为真」的近似在这一格判反) |
10107
+ | 缺 | 缺 | `true` | `false` | `false` | 各来源都发 |
10108
+ | `false` | `true` | 缺 | 缺 | **`false`** | **各来源都发**(managed 最后写,显式 `false` 盖掉 user 的 `true`) |
10109
+ | 缺 | 缺 | 缺 | 缺 | 缺 | 各来源都发 |
10110
+
10111
+ 表里只列四个来源,flag 来源同理参与合并。🔴 两件事别混:**合并标量**的顺序是 user → project → local → flag → managed(后写覆盖前写);本包**发往引擎的 hooks 数组**按 managed → user → project → local 的顺序**拼接**(拼接不是覆盖)。
10112
+
10113
+ #### 100a-6 · 转录 id 的承诺射程与升级边界(U-1)
10114
+
10115
+ - **承诺**:① UUID 形(小写 8-4-4-4-12);② **同一份适配器输入**(已投影好的帧序列)重放 ⇒ 同一串 id(逐个相等,与此前同一条不变量);③ 确定性 —— 同一稳定键 ⇒ 同一 id,不读时钟、不读随机源。稳定键优先序(帧 id > seq > toolCallId)与判空规则(空串帧 id / 空串 toolCallId 不算稳定键、`seq` 只认数)不变;不同稳定键得到不同 id(帧 id `"7"`、`seq` 7、toolCallId `"7"` 是三个不同的 id)。
10116
+ - 🔴 **跨重投射程**(承诺②的边界,0.82.x 同样如此、不是本版引入):同一组 wire 事件**经投影口重新投影**(`eventToSdkMessage` / `runStream` 各跑一遍)时,投影口给每一帧现铸一枚随机信封 `uuid`,由它派生的行 —— 文本行、工具卡(含 `msg_sema_…`)、压缩分割线、`attachment` 事件等 —— 每投一次换值;跨重投稳定的只有按 wire `eventId` 取键的行(带 `eventId` 的工具结果行、`memory_saved` 臂)。会重投同一段 wire 事件、又按 `uuid` 去重的宿主,请按 wire 的事件身份(`eventId` / 事件序号)去重。
10117
+ - **不承诺**:派生所用的具体参数与算法细节。请把这些 id 当不透明串用 —— 不解析、不自己推算、不从 id 反推 wire 键。派生参数若改,本包会像本版一样作为值形变更成文公布。
10118
+ - **唯一性射程**(与此前相同,换形不改变):派生输入里**没有会话身份** —— 两场会话里同一个 `seq`(或同一个 toolCallId)得到同一个 id。UUID 的外形容易让人以为它全局唯一,它不是;按 `uuid` 跨会话建表 / 去重的宿主,键里要自己带会话维度。
10119
+ - **兜底与原样沿用**:宿主喂进来的 system 行沿用输入帧自带的 `uuid`(不走派生);没有任何稳定键的帧,`uuid` 是宿主 `ctx.uuid()` 交的值(原样),它是不是 UUID 形由宿主决定;想让整份转录都是 UUID 形的宿主,`ctx.uuid` 请交 UUID。工具结果行在 wire 带了 `eventId` 时原样用它当 `uuid`,本包不验形。
10120
+ - **旧转录**:已落盘的前缀形 id(`wid_…` / `wseq_…` / `wtc_…`、`msg_sema_wid_…`、`…#segment<n>` 形段身份)不迁移、不改写,升级后同一份转录里新旧两形共存;父子链由宿主按**整串**把新行接到上一行的 `uuid` 上,混形的链照常可解。
10121
+ - **升级边界**(跨重投射程的一个特例):同一段 wire 事件分别被旧版本与新版本投影,得到的是两套 id —— 即使按 `eventId` 取键的行也一样(旧版本铸前缀形)。宿主在升级前落盘了某段事件、升级后又把同一段事件重新投影并按 `uuid` 与盘上的行去重(例如续跑时游标没推进、重放窗口跨过了升级)时,那一段会各有一行旧形、一行新形。需要跨升级边界去重的宿主按 wire 的事件身份(`eventId` / 事件序号)去重,或不重投已落盘的区间。`memory_saved` 臂的 `id`(100a-2)同理。
10122
+ - 本包没有任何按转录 id 做键的持久状态:`exportLedger` / `importLedger` 的键是任务 / 运行身份,`importLedgerFromTranscript` 读的是转录正文里的通知块;升级前导出的台账升级后照常导入。
10123
+
10124
+ ### 100a′. 成文改口(旧判据眼作废 → 新判据眼)
10125
+
10126
+ 已发段不回改,以本段为准。分三向:
10127
+
10128
+ **作废**(旧判据眼装 0.83.0 后判红是预期行为,不是回归):
10129
+
10130
+ 1. 凡在结果帧上按 `errorCode` / `degraded` / `model` 断言在场、在错误信封上按 `result` 断言、在合成终局行上按 `isApiErrorMessage` 断言、在工具结果记录上按 `toolUseResult` 断言、在 `compact_boundary` 上按 `attachedFiles` 断言、在 print 完成通知帧上按十三个旧名断言、在任何本包产出的消息上按 `isMeta` 断言的判据 —— 一律作废,旧名自本版起断言**缺席**。
10131
+ 2. §90b 第一条「`tool_use_result` 缺席 …(与 `toolUseResult` 缺席同义,两键同缺席)」的括号、§90c U-G1 与 §93c P-G10 里「`msg.tool_use_result === msg.toolUseResult`(同引用)」那一半作废 → 交互记录上 `toolUseResult` 恒缺席。§90 S-2(「0.82.0 删」)与 §92y ㉙(改到 0.83.0)本版兑现,形式是**删除**、不是改名。
10132
+ 3. §93b 第一条「`toolUseResult` 在 `-p` 帧上恒缺(过渡名只在交互转录记录上)」的括号与 §93d 去向表「过渡名 `toolUseResult`」那一行作废 → 两出口都不带。
10133
+ 4. 「本包交出的每条转录行都带 `timestamp`」(0.82.x 及以前的不变式)作废 → 只有 `user` / `assistant` 行恒带;system 行不带(除非入参自带)。
10134
+ 5. 「记忆写入 = 转录面一条 `system/memory_saved` 行,`writtenPaths[0]` 等于笔记」作废 → chrome 面一条 `memory_saved`,`notes[0]` 等于笔记;转录面零 `memory_saved` 行。
10135
+ 6. 「print 出口帧的归因位用 wire 原名(与 SDK `task_notification` 词汇同名)」作废 → CC 形出口帧上一律 `_sema_` 蛇形名,wire 读法不变。
10136
+ 7. 凡断言转录 `uuid` 以 `wid_` / `wseq_` / `wtc_` 开头、`message.id` 形如 `msg_sema_wid_…`、段身份以 `#segment<n>` 结尾的判据 / 测试 / 验收脚本作废;按形认「是不是本包铸的」的判据随之失去判别力(UUID 形的 id 与宿主自铸的随机 UUID 外形相同)。
10137
+ 8. 注入件自愈句:按 `system notification` 认「这是注入件的句子」、按 `(run <id>)` 取回复 id、「交接后叫用户 `watch that run`」「续跟挂上后说 `sema is following that run`」(用户形仍是这两句,未动)、「`delivery: 'queued'` / `'parked_for_wake'` 的交接与 `applied` 同句」、「候决断句 = `could not be delivered while … kept it queued`」、「`resending` 句说 `was cancelled`」、「`not-delivered` 句说 `could not put a decision … on screen`」—— 全部作废,新句见 100a-3。
10138
+ 9. 退化审批卡:「流内帧卡永不带 `argsUnavailable`」「流内帧路由上不会出现 `editRefused`」「超上限卡上的改写会被转发」三条判据眼作废。
10139
+ 10. §99a S-2「包内唯一的调用点(print 车道 init 帧回落面)过渡期刻意仍用旧读口」作废 → 按新判决 + 宿主明说优先(W-2)。§99c P-G2 后半「`SEMA_WEBSEARCH_ENDPOINT=https://user:pw@gw/search` ⇒ 照常发出」作废 → 本包判形错、不发(W-3)。§99 包侧缺口「带 userinfo 的 endpoint 两边判官都采纳」作废 → 本包拒;7.100.x 服务端仍采纳,7.101.0 起两边同判。
10140
+ 11. 按原因句**文字**匹配联网搜索形错的判据(旧句的 `must be one of brave | tavily | searxng (got …)`、`got a value that is not one of them`、`got an array`、`(entry N …)`、`repeats an earlier name` 等)作废 → 按判决里的 `field` 判,不按句子判;句子本版起逐字镜像服务端 7.101.0 的 wire 句。
10141
+ 12. 「码册 69 码」作废 → 71 码(C-1)。
10142
+ 13. §96 包侧缺口「`approvalIsMandated(card)` 对 park 卡今天恒为假」与 §98 包侧缺口「待决行上的 `mandated` 孪生位上游尚未铸」:对服务端 **7.101.0 及以后**作废 —— 待决列表行顶层带 `mandated: true` 时卡请求透传这一位、判据口答 `true`(A-2);对更早的服务端两句仍成立。
10143
+
10144
+ **改读**(判据的意思保留,换读法):
10145
+
10146
+ 1. 结果帧 / 合成行 / system 附带文件 / print 通知帧的在场断言按 100a 改用新名;读旧转录的端两名并读一版(新名优先)。
10147
+ 2. §93c P-G9 末句「成功臂与错误信封都带 `_sema_response_model` 且 `model` 仍为 `pool-id-a`」不能读成「错误信封也带 `model`」—— 错误信封**从来没铸过** `model`。本版起的判据眼:成功臂与错误信封都带 `_sema_response_model:'provider-name-b'` 与 `_sema_selected_model:'pool-id-a'`,`model` 在两臂上都不在。
10148
+ 3. 「错误信封没有 `model`」仍成立(旧名零铸),但同一只信封上可能出现 `_sema_selected_model`;写成「错误信封上没有任何模型位」的判据要改。
10149
+ 4. 「截断臂零抢救 ⇒ 无 `result` 键」→ 改判 `_sema_salvaged_result` 缺席;原断言仍为真,但已失去判别力。
10150
+ 5. §97a S-1 分类判据里「终态前合成的错误行 —— `assistant` 形、带 `isApiErrorMessage`」→ 改读 `_sema_api_error_message`(包内判定闸同批改)。
10151
+ 6. 要证「这个转录 id 是本包铸的」:比相等(盘上行的段身份 === **同一段**的 `text_segment_end.segmentId`;盘上行 `uuid` ∈ 段末事件的 `committedUuids`),不比形。
10152
+ 7. `ApprovalCardRequest.argsUnavailable` 的意思由「悬挂的流内审批(没有客户端连着时发起)」改为「卡上的 `args` 不是工具的真实入参」,悬挂审批只是其中一形 —— 别再据它推断「这只审批是在没有客户端连着时发起的」。`ToolApprovalFrameOutcome.editRefused` 由「只在悬挂审批的卡上」改为「任一回落卡上」。`approvalResolutionOf` 对耐久腿 `failed` / `card` 带 `editRefused` 的对象由 `card_unavailable` 改为 `edit_refused`。
10153
+ 8. 注入件句的新判据眼:句首 `A follow-up message sema sent on its own (not one you typed)`;句柄 `(id <id>)`;`watch that reply` / `sema is following that reply`。不变的判据眼:注入形从不说 `your message` / `send it again`;`rowFor` 整行覆盖优先;处置分类与续跟意图逐字不变;用户形逐字节不变。
10154
+ 9. §7 P-43「端不要假定用户 settings 里的 `disableAllHooks` 会挡住引擎腿的 hooks」对实现了 H-1 读口的宿主不再成立;未实现的宿主仍成立(并会看到一次告警)。
10155
+
10156
+ **新增**(新判据眼):
10157
+
10158
+ 1. 结果帧 `terminal_reason`:四词按 100a-1 在场,其余键缺席(`Object.hasOwn` 为 false);`terminalReasonForResult` 对本包的帧恒等于帧上的值。
10159
+ 2. 错误信封:done 帧结果记录带非空串 `model` ⇒ `_sema_selected_model` 在场;`failed` 事件帧 ⇒ 缺席。
10160
+ 3. 记忆写入:chrome 面恰一条 `{kind, laneProof, id, notes}`,键集恰这四个;`id` 同一串帧重放同值。
10161
+ 4. 转录 id 三向:① 形 —— 小写 8-4-4-4-12;② 确定性 —— 同一段帧喂两遍(宿主的 `ctx.uuid` 每次给不同值)得到同一串 id,且没有一枚等于 `ctx.uuid` 当次交出的值;③ 同源 —— 比相等(见改读 6)。
10162
+ 5. `disableAllHooks`:按 100a-5 四源判定表判合并值与发往引擎的 hooks。
10163
+ 6. 退化审批卡:三形都带 `argsUnavailable: true`,改写零发送;四句说明按 100a-4 逐字。
10164
+ 7. 联网搜索:endpoint 带 userinfo(用户名或口令任一非空)⇒ `malformed` / `field: 'endpoint'`,句子含 `must not carry userinfo`、不回显用户名与口令;`https://@host/s`(空 userinfo)⇒ `honored`、值原样。
10165
+ 8. **合并顺序订正**:§7 P-43 行「四源按 policy→user→project→local 后写覆盖前写」的顺序是错的,§15 与 0.52.0 段里「四源后写覆盖前写」没写顺序、也漏了 flag 来源。真序:**user → project → local → flag → managed(policy)**,managed 最后写、优先级最高;policy → user → project → local 是本包发往引擎的 hooks 数组的**拼接**顺序,不是合并标量的顺序。§15 / 0.52.0 段是已发段、不回改,§7 P-43 随版改。
10166
+
10167
+ ### 100b. 缺席语义(逐键)
10168
+
10169
+ - **耐久 park 卡 `mandated`(A-2)**:待决列表行顶层严格 `true` 才在卡请求上带 `mandated: true`;缺席 / 其它值 ⇒ 键不在(不是「这一问不是强制的」,强制也可能只以缺席词 `ruleOffersAbsence === "mandated"` 表达 —— 端一律调 `approvalIsMandated`)。
10170
+ - **新名一律 present-iff**:`_sema_model_degraded` / `_sema_error_code` / `_sema_selected_model` / `_sema_salvaged_result` / `_sema_api_error_message` / `_sema_attached_files` / 十三个 `_sema_*` 通知位 / `terminal_reason` —— 没有值就不铸键,绝不铸值为 `undefined` 的键;请用 `Object.hasOwn` 或 `in` 判在场。旧名自本版起**恒缺席**:旧名缺席 ≠ 这件事没发生,读新名。
10171
+ - `_sema_model_degraded` 缺席 = 这条 run 没降过级,或引擎没报。
10172
+ - `_sema_error_code` 缺席 = 引擎没给码(被挡 / 停泊这两种终局写不出码;结局不知道;`failed` 事件没带码)—— **不是**「没出错」。
10173
+ - `_sema_selected_model` 缺席 = 结果记录没带非空串 `model`(`failed` 事件帧、409 拒绝信封、结果记录没带 / 空串 / 非串)。它与 `_sema_response_model`(供应商自报名,只在和请求 id 不同时在场)是两位:渲「这一轮是谁答的」时,`_sema_response_model` 在场用它,否则用 `_sema_selected_model`,两者都缺席时如实写「未知」,不要回落到请求参数里的模型名。
10174
+ - `_sema_salvaged_result` 缺席 = 没抢救到正文(同帧 `errors[0]` 带「no output survived the cutoff」尾注),或不是截断臂(其余失败从来不带)。
10175
+ - `_sema_api_error_message` 只在合成行上在场、恒 `true`;模型自己说的话从不带。
10176
+ - `terminal_reason` 缺席 = 不在 100a-1 的四形里,**不是**「run 没结束」;语义读 `_sema_error_code` 与 `errors[0]`。
10177
+ - `tool_use_result`:值与缺席语义同 §92 订正后的读法(两键恒在场的那一条换成这一键恒在场;看值与降级标记,不看键在不在)。
10178
+ - `_sema_attached_files` 缺席 = 引擎没带附带文件(缺席 / 空数组 / 非数组三形同答,**不铸空数组**);在场时原样,空路径的项留在数组里、但不产附件行。
10179
+ - system 行上 `timestamp` 缺席 = 本包不再补(**不是**「时刻未知」的断言);宿主喂进来的 system 帧自带的 `timestamp` 原样过境;`user` / `assistant` 行恒带。
10180
+ - `isMeta` 在本包产出的 CC 形消息上恒缺席;按它过滤的端,缺席按「不是 meta」读即与修前同义。
10181
+ - 十三个 `_sema_*` 通知位逐位:引擎没发 ⇒ 键不铸(不编空值);`_sema_recent_steps` / `_sema_edited_files` 只在非空数组时带;`_sema_seq` 只在数或串时带;`_sema_injected` 只在严格布尔时带;`_sema_partial` 只在 `true` 时带。
10182
+ - `memory_saved` 臂缺席**不等于**「这一轮没写记忆」:写入回执不成形(没有非空笔记 / `ok` 不是严格 `true` / 工具报错 / 回执缺席)时本包不发,那张 `Remember` 工具卡照常在转录面;工具卡的父调用 id 是空串时也不发(没有诚实的车道可挂,不落到主会话)。
10183
+ - 转录 `uuid`:全缺稳定键时是宿主 `ctx.uuid()` 的原值;工具结果行带 wire `eventId` 时是那个值(本包不验形)。
10184
+ - `mergedDisableAllHooks` 方法缺席 = 宿主没接第四条规则 ⇒ 维持 0.82.x 行为并告警一次,**不**拿逐来源读口近似;返回 `undefined` = 合并结果里没有这一键 = 没关(与 `false` 同判),不告警;抛错 ≠ 缺席:按合并值为真处置(managed 的照发),记 `debug` 日志,不出缺席告警。
10185
+ - `ApprovalCardRequest.argsUnavailable` 缺席 = 卡上的 `args` 就是工具的真实入参,**不是**「未知」;在场只有 `true`。`wireNote` 缺席 = 没有可说的降级事实(含「帧上没带入参但也没有 `argsOmitted`」一形:此时只有 `argsUnavailable`)。`ToolApprovalFrameOutcome.editRefused` 缺席 = 没发生拒发,在场只有 `true`,与 `decision: 'unresolved'` 同场。`FsApprovalOutcome` 的 `failed.editRefused` 缺席 = 没发生拒发(卡口本身失败、或别的段失败);在场只有 `true`,只出现在 `stage === 'card'` 上,绝不铸 `false`。
10186
+ - `opts.webSearchStamped` 缺席 = 宿主没明说 ⇒ 按 `webSearchVerdictFromEnv(env).kind === 'honored'` 推;从 settings 段采纳、env 缺席的宿主不传就会少报 WebSearch。
10187
+ - 注入件句里 `taskId` 缺席(`decision-pending` / `state-unknown` 可为 null)⇒ 整个 ` (id …)` 不出现,不铸占位;`<detail>` 原样转述,本包不改写(它来自引擎,可能含引擎自己的词)。
10188
+ - 通告码 `config.context_settings_swapped` 只带键、不带值;`config.secret_env_scrubbed` 的 `detail` 只列被剥掉的变量名、不带值;两码 audience 都是 `operator`,按 audience 分流的端不会把它们推给用户。
10189
+
10190
+ ### 100c. 黑盒判据骨架
10191
+
10192
+ > 🔴 标「本版证明」的格在 **0.82.7** 产物上必须 FAIL、在 0.83.0 上必须 PASS;标「回归约束」的格两版都 PASS。请记下两次跑的产物标识(版本 + tarball shasum)。射程写在每格括号里;「纯包层」= 只装本包即可跑,不需要引擎。
10193
+
10194
+ **结果帧与合成行(K-1–K-5 / K-10)**
10195
+
10196
+ - **G-K1**(本版证明,纯包层):`runStream` 喂 `[{type:'done', result:{taskId:'t', sessionId:'s', terminal:{kind:'completed'}, result:'A', model:'pool-a', degraded:{from:'pool-a', to:'pool-b', reason:'rate_limit', atTurn:1}, stats:{turns:1}}}]` ⇒ 结果帧 `subtype:'success'`、`result:'A'`、`terminal_reason:'completed'`、`_sema_selected_model:'pool-a'`、`_sema_model_degraded.to:'pool-b'`;`Object.hasOwn(frame,'model')` 与 `Object.hasOwn(frame,'degraded')` 都为 false。判别点:0.82.7 上旧名在场、无 `terminal_reason`。
10197
+ - **G-K2**(本版证明,纯包层):`terminal:{kind:'failed', code:'limits.max_tokens_exceeded', message:'m'}`,结果记录另带 `result:'PARTIAL'` 与 `model:'pool-a'` ⇒ 结果帧 `subtype:'error_during_execution'`、`_sema_error_code:'limits.max_tokens_exceeded'`、`_sema_salvaged_result:'PARTIAL'`、`_sema_selected_model:'pool-a'`;`terminal_reason` 键缺席;`errorCode` / `result` / `model` / `degraded` 四个旧名都不在。同一条流里的合成 assistant 行 `_sema_api_error_message === true` 且没有 `isApiErrorMessage`。
10198
+ - **G-K3**(本版证明,纯包层):`[{type:'failed', errorCode:'cancelled', errorMessage:'x'}]` ⇒ 结果帧 `_sema_error_code:'cancelled'`,没有 `_sema_selected_model`、没有 `terminal_reason`;同码换成 done 帧(`terminal:{kind:'failed', code:'cancelled', message:'x'}`)、结果记录带 `model:'pool-a'` ⇒ `_sema_selected_model:'pool-a'`;结果记录带 `model:''` ⇒ 两臂都不铸。判别点:第二格在 0.82.7 上 FAIL(错误信封从不铸模型位)。
10199
+ - **G-K4**(本版证明,纯包层):臂 `{type:'tool_end_result', toolCallId:'c1', toolName:'Read', isError:false, output:'body'}` 喂 `toolEndResultToUserFrame` ⇒ 帧上 `tool_use_result === 'body'`、无 `toolUseResult`;同一只臂经交互适配器(`createWireToCcAdapter().adapt`,先喂同 id 的 `tool_use` 开卡)⇒ user 记录带 `tool_use_result`、**不带** `toolUseResult`,两出口都只带 `tool_use_result` 这一个结构化结果位。判别点:0.82.7 上交互记录带驼峰名。
10200
+
10201
+ **`terminal_reason`(R-1)**
10202
+
10203
+ - **G-T1**(本版证明,纯包层):码分别为 `limits.max_turns_exceeded` / `limits.max_cost_exceeded` / `output.invalid`,done 帧(`terminal:{kind:'failed', code, message:'m'}`)与 `{type:'failed', errorCode, errorMessage:'m'}` 事件各跑一遍 ⇒ `terminal_reason` 依次为 `max_turns` / `budget_exhausted` / `structured_output_retry_exhausted`,两条路径答案相同。
10204
+ - **G-T2**(回归约束,纯包层):码为 `limits.max_walltime_exceeded` / `limits.max_tokens_exceeded` / `classifier.denial_limit` / `cancelled` / `limits.max_bogus_exceeded`;再加 `terminal:{kind:'blocked'}`、`terminal:{kind:'paused', gate:{kind:'plan_review'}}`、没有终局记录(`result:{taskId:'t', stats:{turns:1}}`)⇒ `Object.hasOwn(frame,'terminal_reason') === false`(两版都 PASS:0.82.7 上这一键本来就不铸)。
10205
+ - **G-T3**(本版证明,纯包层):`terminalReasonForResult({type:'result', subtype:'error_max_turns', is_error:true})` ⇒ `'max_turns'`(按 subtype 判);`{type:'result', subtype:'error_during_execution', is_error:true, _sema_error_code:'limits.max_turns_exceeded'}` ⇒ `undefined`(读口不读码);扁平形回放行 `done{result:{status:'suspended', errorCode:'limits.max_turns_exceeded'}}` 投出的结果帧 ⇒ `subtype:'error_during_execution'` 且 `terminal_reason` 缺席;`{type:'result', subtype:'success', is_error:true}` ⇒ `undefined`;`null` / `'x'` / 读键即抛的 Proxy ⇒ `undefined` 且不抛。对 G-K1–G-T2 的每一只结果帧,读口答案 === 帧上的 `terminal_reason`(缺席对应 `undefined`)。判别点:0.82.7 上无此导出。
10206
+
10207
+ **system 行与 print 通知帧(K-6 / K-8 / K-9 / K-11–K-23)**
10208
+
10209
+ - **G-S1**(本版证明;射程:任何经本包 `adapt()` 的交互车道,读本包交出的行、宿主接收口之前):触发一次带附带文件的压缩(真引擎,或构造 wire `compacted` 帧带 `attachedFiles:[{path:'a.ts', chars:10, truncated:false}, {path:'', chars:0, truncated:false}]`)⇒ 本包交出的 `compact_boundary` 行带 `_sema_attached_files`(与引擎给的清单逐项同,空路径项保留)、**不带** `attachedFiles` / `timestamp`;恰一条 `a.ts` 的「Referenced file」附件行(与 0.82.7 逐字同),空路径不产;同一轮的 user / assistant 行恒带 ISO `timestamp`;任何一行都没有 `isMeta`。🔴 宿主自己补过戳的屏面不在射程内。
10210
+ - **G-S2**(本版证明;射程:纯包层,0.83.x;0.84.0 起第一格改判「不产出」):把 0.82.x 形的 `system/compact_boundary` 行(只带 `attachedFiles:[{path:'a.ts', chars:10, truncated:false}]`)直接喂 `adapt()` ⇒ 照旧产出 `a.ts` 的「Referenced file」附件行;同一行同时带 `_sema_attached_files:[{path:'b.ts',…}]` 与 `attachedFiles:[{path:'a.ts',…}]` ⇒ 只产出 `b.ts`(新名优先)。
10211
+ - **G-N1**(本版证明,纯包层):`taskNotificationToPrintFrame({task_id:'t1', status:'killed', summary:'s', stoppedBy:'user', resumable:true, exitCode:137, seq:3, injected:false, task_type:'background_agent'})` ⇒ 帧 `status:'stopped'`、`_sema_stopped_by:'user'`、`_sema_resumable:true`、`_sema_exit_code:137`、`_sema_seq:3`、`_sema_injected:false`、`_sema_task_type:'background_agent'`;帧上十三个旧名一个都不在;`unregisteredPrintNotificationKeys(frame)` ⇒ `[]`;`PRINT_NOTIFICATION_FIELD_MATRIX.map(r => r.field)` 含十三个新名、不含旧名。射程延伸(真部署,`-p --output-format stream-json`,宿主经本函数出帧):一个被用户停掉的后台子代 ⇒ stdout 上的 `system/task_notification` 帧同形。
10212
+
10213
+ **记忆写入(K-7 / K-24)**
10214
+
10215
+ - **G-M1**(本版证明,纯包层):交互适配器依次喂 `Remember` 的开卡 `tool_use` 与收口臂(结构化结果 `{type:'memory-saved', ok:true, note:'N1'}`,`isError:false`)⇒ 转录面零 `memory_saved` 行(与把 `ok` 改成 `false` 的同一串帧产出的转录逐字节同);chrome 面恰一条 `memory_saved`,键集恰 `kind` / `laneProof` / `id` / `notes`,`notes` 深等于 `['N1']`,`laneProof.lane === 'main'`;同一组 wire 事件独立投影两遍(两遍各经投影口)⇒ `id` 同值(按 wire `eventId` 取键,见 100a-2),且是小写 8-4-4-4-12 形。
10216
+ - **G-M2**(本版证明,纯包层):工具报错 / `ok` 不是 `true` / `note` 为空串或非串 / 收口臂没有结构化结果 ⇒ 零 `memory_saved` 事件、零转录行,工具卡照常;开卡带父调用 id `'p1'` ⇒ `laneProof` 为 `{lane:'subagent', parentToolCallId:'p1'}`;父调用 id 为空串 ⇒ 零事件。
10217
+ - **G-M3**(本版证明;射程:真部署、宿主已按 100a-2 接臂):让模型用 `Remember` 记一条笔记 ⇒ 屏上「Saved 1 memory」那一行照常出现、只出现一次(durable 重放后仍一次),落盘行上没有 `writtenPaths` / `isMeta`。🔴 未接臂的宿主上这一行消失 —— 那是 100y 第 1 条要先做的事,不是本包的缺陷。
10218
+
10219
+ **转录 id(U-1)**
10220
+
10221
+ - **G-U1**(本版证明,纯包层):同一份已投影好的帧序列(帧上带 `uuid`)喂两只新适配器 ⇒ 两遍的转录 `uuid` 序列逐个相等,每一枚都是小写 8-4-4-4-12,且不含 `wid_` / `wseq_` / `wtc_`;0.82.7 上两遍同样相等、但是前缀形(形那一半 FAIL)。🔴 把同一组 wire 事件**重新投影**两遍不在承诺内(100a-6 跨重投射程):那样只有带 `eventId` 的工具结果行与 `memory_saved` 的 `id` 两遍同值。
10222
+ - **G-U2**(本版证明;射程同上):一次流式回答被 `text_end` 收口 ⇒ 盘上那条文本行的段身份与**同一段**的 `text_segment_end.segmentId` 相等,且都是 UUID 形;盘上行的 `uuid` ∈ 段末事件的 `committedUuids`。
10223
+ - **G-U3**(回归约束;射程:宿主已换钉本版、盘上有旧版本写的会话):用新版本续跑一场旧版本留下的会话 ⇒ 续跑正常,旧行的前缀形 id 原样保留,新行接在旧行后面(父子链可解、会话列表列得出、消息计数不重复)。
10224
+ - **G-U4**(本版证明,纯包层):`deriveTranscriptId({id:'7'}, ctx)` / `deriveTranscriptId({seq:7}, ctx)` / `deriveTranscriptId({toolCallId:'7'}, ctx)` ⇒ 三个互不相同的 UUID 形串;`ctx.uuid` 每次返回不同值时,三次调用各跑两遍逐个相等,且没有一枚等于 `ctx.uuid` 交出的值;`deriveTranscriptId({}, ctx)` ⇒ 恰是 `ctx.uuid()` 当次的返回值。
10225
+ - **G-U5**(本版证明,纯包层):喂 `runStream` 两条各以「结局不知道」收尾的流,期间把 `Date.now` 钉在同一个值 ⇒ 两条合成终局行的 `uuid` 都是 UUID 形且互不相同,`session_id` 是开流时钉的会话;0.82.7 上两行同为 `err-<同一串>`(红基线)。
10226
+
10227
+ **hooks(H-1;射程:宿主已实现 `mergedDisableAllHooks`、工作区已受信、managed 设置里无 hooks 相关开关,除非格内另说)**
10228
+
10229
+ - **G-H0**(本版证明,纯包层):`installHost({ settings: port, log })`,`port.shouldSkipHookDueToTrust = () => false`,`port.getSettingsForSource` 对 `policySettings` / `userSettings` / `localSettings` 各回一条带 `PreToolUse` 的 `hooks`(命令 M / U / L),`port.mergedDisableAllHooks = () => true` ⇒ `hooksForWire().PreToolUse` 只含 M;改回 `() => false` ⇒ 含 M、U、L;删掉这个方法 ⇒ 含 M、U、L,且 `log` 恰收到一条点名 `mergedDisableAllHooks` 的 `warn`,再调多次不重复;方法抛错 ⇒ 只含 M,零 `warn`,`debug` 日志里有一条带异常原文的记录。
10230
+ - **G-H1**(回归约束;时间射程:0.82.7 上判别格同为「各来源都发」,本条两版都 PASS —— 它钉的是「不许用任一为真近似」):用户设置 `{"disableAllHooks": true, "hooks": {"PreToolUse": [ …命令 A… ]}}`,本地设置 `{"disableAllHooks": false, "hooks": {"PreToolUse": [ …命令 B… ]}}` ⇒ 发出的请求 `settings.hooks.PreToolUse` 含 A 与 B。
10231
+ - **G-H2**(本版证明):只在本地设置写 `"disableAllHooks": true`,managed 设置有 `PreToolUse` 条目 M,用户设置有条目 U ⇒ 请求里 `settings.hooks.PreToolUse` 只有 M、不含 U。
10232
+ - **G-H3**(回归约束):managed 设置写 `"disableAllHooks": true`(不论别的来源写什么)⇒ 请求里没有 `settings.hooks`。
10233
+ - **G-H4**(本版证明):用户设置写 `"disableAllHooks": true`,再设一个会话目标(`/goal …`)⇒ 请求里 `settings.hooks.Stop` 不含会话目标那一条。
10234
+ - **G-H5**(本版证明;射程:非交互车道、显式 `--final-verify`):用户设置写 `"disableAllHooks": true` 且有 Stop hook ⇒ 请求带 `finalVerification`、不出「让位」告知;把 `disableAllHooks` 去掉 ⇒ 不带、出让位告知。
10235
+ - **G-H6**(本版证明,告警那一半;行为那一半两版同;射程:宿主**未**实现读口):用户设置写 `"disableAllHooks": true` ⇒ 行为同 0.82.x(照发),宿主日志里恰出现一条点名 `mergedDisableAllHooks` 的 `warn`,连发多轮不重复。
10236
+
10237
+ **退化审批卡(A-1)**
10238
+
10239
+ - **G-A1**(本版证明;射程:真部署上 Write 的入参超过帧的字节上限、帧先于这只调用的 `tool_start` 到达或流上没有它的入参):卡口收到的请求带 `argsUnavailable: true`;卡口回「编辑后批准」⇒ 服务端观察不到 `POST /v1/tool-approvals/:id/respond`,这只审批仍在待决列表上;宿主拿到的结局 `{ decision: 'unresolved', editRefused: true }`,屏上出现告知句一次。纯批准 ⇒ 照常一次 respond `allow`、体里无 `updatedInput`。纯包层等价形:流内帧 `{ approvalId, toolName: 'Write', argsOmitted: true, message: 'approve write to "/tmp/big.ts"?' }`、事件流无这只调用的入参,卡回 `{ kind: 'allow', updatedInput: { file_path: '/tmp/big.ts', content: '…' } }` ⇒ respond 零次(0.82.7:respond `allow` 一次、体里带那份 `updatedInput`)。
10240
+ - **G-A2**(本版证明):同上一形的 Write 卡 `wireNote` 逐字等于 100a-4 第 1 句;超上限且问句解不出 path 的 Bash 卡逐字等于第 2 句;两者都不含 `reconstructed`。
10241
+ - **G-A3**(本版证明;射程:待决行 `input` 被上游换成超限标记 —— 耐久停泊的 Write 入参 JSON 超过待决行的存储上限 —— 且卡经耐久腿出、流上没有入参,例如重开已停泊的审批):卡口收到 `args` 为 `{}`、`argsUnavailable: true`、`wireNote` 逐字等于第 4 句;卡口回改写 ⇒ 服务端观察不到 `POST /v1/approvals/:sessionId/decide`,待决行仍在,结局 `failed` / `stage:'card'` / `editRefused: true`;纯批准 ⇒ 一次 decide `approve`、体里无 `updatedInput`。`input` 缺席或 `null` 同理,说明句换第 3 句;`input` 为 `{ truncated: true, bytes: 9001, extra: 1 }` 这类近似形 ⇒ 照旧当入参渲、不带 `argsUnavailable`。
10242
+ - **G-A4**(本版证明,纯包层):`approvalResolutionOf({ kind: 'failed', stage: 'card', reason: 'r', editRefused: true })` ⇒ `not_sent` / `edit_refused`(0.82.7:`not_sent` / `card_unavailable`);同一对象 `editRefused: 'true'` 或缺席 ⇒ 仍 `card_unavailable`。
10243
+ - **G-A5**(本版证明,纯包层 + 真部署复核):耐久腿以待决行 `{…, mandated: true}` 出卡 ⇒ 卡请求 `mandated === true` 且 `approvalIsMandated(req) === true`;行上 `mandated: false` / `'true'` / 只在 `riskDescriptor` 里 ⇒ 卡请求无这一位。真部署(服务端 ≥7.101.0):强制卡 park 后 `GET /v1/approvals` 行带 `mandated: true` ⇒ 端上 park 卡判为强制。0.82.7 上第一格 FAIL(卡请求无这一位)。
10244
+
10245
+ **注入件句(E-1)**
10246
+
10247
+ - **G-E1**(本版证明;射程:交互车道、宿主传 `origin: 'injected'` 且挂了续跟;计划批准后跟进消息撞上刚恢复的那一轮):屏上那一行以 `A follow-up message sema sent on its own (not one you typed)` 开头,含 `sema is following that reply` 与 `nothing for you to do now`,**不含** `system notification`,也不含独立的词 `run`。
10248
+ - **G-E2**(本版证明;射程同上,但那一轮随后停在一道决断上、宿主已把卡呈上):出现 100a-3 第 10 句;答卡后跟进消息被送出(宿主回灌),不再出现第 10 句。
10249
+ - **G-E3**(本版证明;射程:会话被一轮占着、屏上没有能答的卡,例如续跑上下文读不出 / 引擎不认得那一轮):出现第 12 句;之后**没有**任何「正在发 / 会发」的后续,也不出现 `send it again`。
10250
+ - **G-E4**(本版证明;射程:任何注入件自愈句,`<detail>` 段除外 —— 那是引擎原话):整行零 `system notification` / 独立词 `run` 或 `runs` / `engine` / `steer` / `park` / `turn` / `claim` / `checkpoint` / `wake` / `inject`。判别点:0.82.7 上旧句都带 `system notification` 与 `run`。
10251
+ - **G-E5**(本版证明,纯包层):对 100a-3 的十二种结局各构造一只 `SelfHealOutcome`(`taskId:'T1'`),`activeRunSelfHealRow(outcome, null, undefined, 'injected', follow)` ⇒ 整行逐字等于新句(`<id>` 代 `T1`);同一只结局不传 `origin` ⇒ 与 0.82.7 逐字节同(用户形不动);`copy.rowFor` 回一个串 ⇒ 原样用它。
10252
+
10253
+ **联网搜索(W-1–W-3)**
10254
+
10255
+ - **G-W1**(本版证明,纯包层):`webSearchVerdictFromEnv({SEMA_WEBSEARCH_PROVIDER:'brave', SEMA_WEBSEARCH_MAX_RESULTS:'0'})` ⇒ `malformed`、`source: 'env'`、`field: 'maxResults'`;同一 env 加 `SEMA_LIVE_BASEURL` 调 `resolveLiveInitToolFace([], env)` ⇒ 回落 init 名单不含 `WebSearch`(0.82.7:回落面跟随旧读口,旧读口丢掉这一键照发 ⇒ 含 `WebSearch`)。
10256
+ - **G-W2**(本版证明,纯包层):`judgeWebSearchSettings({provider:'searxng', endpoint:'https://alice:pw@gw/s'})` ⇒ `malformed`、`field: 'endpoint'`,`webSearchVerdictMessage(verdict)` 含 `must not carry userinfo`、不含 `alice` / `pw`;`https://u@gw/s` 与 `https:u:p@gw/s` 同拒;`https://@gw/s` ⇒ `honored`、`settings.endpoint` 逐字原样;env 车道 `SEMA_WEBSEARCH_ENDPOINT` 同判。provider 缺席 / 非串 / 认不出三形的句子分别含 `(it is missing)` / `(it is not a string)` / `(it is not one of them)`。🔴 射程:对 7.100.x 服务端,本包拒而服务端仍采纳;「本包句子与服务端 wire 句逐字相同」这一半对 7.101.0 已验(用 7.101.0 发布标签源码构建的判官逐字对拍一致);对 7.100.x 不适用。
10257
+ - **G-W3**(本版证明,纯包层):`resolveLiveInitToolFace([], {SEMA_LIVE_BASEURL:'http://x'}, {webSearchStamped:true})` ⇒ 含 `WebSearch`;`resolveLiveInitToolFace([], {SEMA_LIVE_BASEURL:'http://x', SEMA_WEBSEARCH_PROVIDER:'brave'}, {webSearchStamped:false})` ⇒ 不含。
10258
+
10259
+ **公面与码册(W-1 / X-1 / X-2 / C-1)**
10260
+
10261
+ - **G-X1**(本版证明,纯包层):`Object.keys(await import('@sema-agent/client-core'))` 去掉**所有以 `_` 开头的名字**(测试钩:35 个 `__*ForTests`、22 个 `_*ForTest`,另有 `_resetLiveQuestionStore` / `_resetUltracodePreset` 两个不带后缀)后恰 **1238** 名(0.82.7:1240),含 `terminalReasonForResult`,不含三只旧读口;`ADAPTER_DIVERGENCES.length === 12`(0.82.7:10)。型面:一个 `.ts` 文件写 `import type { SemaNestedUsageByTask } from '@sema-agent/client-core'` ⇒ `tsc` 报找不到该导出;`ClientVerbSpec` / `CatalogCacheEnvelope` / `PeerFrameLane` 同;`import type { LiveInitToolFaceOptions, MemorySavedChromeEvent } from '@sema-agent/client-core'` ⇒ 编译通过。
10262
+ - **G-C1**(本版证明,纯包层):`ENGINE_NOTICE_CODES.length === 71`(0.82.7:69);`engineNoticeInCatalog('config.context_settings_swapped')` 与 `engineNoticeInCatalog('config.secret_env_scrubbed')` 为真、`noticeAudienceOf` 都答 `'operator'`;前者紧跟 `config.models_swapped`,后者紧跟 `config.peer_lane_unmounted`。
10263
+
10264
+ 包层行为另钉在各自的门里(结果帧 / 记忆写入 / 合并关停 / 审批卡诚实 / 自愈文案 / 转录 id / 联网搜索判决 / 通告码册,门名见 README Guards)。
10265
+
10266
+ ### 100d. 端上会红的已知读点
10267
+
10268
+ **不改代码、只修掉编译错就升级的端会看到**(逐项的改法见下):「Saved N memories」那一行消失(K-24);凭旧旗 `isApiErrorMessage` 做的合成行凭据洗消整段跳过(K-10);沿用驼峰名 `toolUseResult` 的富卡与分类退化(K-1);`-p` stdout 结果帧键改名、截断 run 的 `result` 从抢救出的正文变成错误句(K-3 / K-5);`-p` 完成通知帧十三个键改名(K-11–K-23);注入件自愈句换措辞(E-1);入参超上限的 Write / Bash 审批卡变成通用卡、改写被拒(A-1);新行的转录 id 变 UUID 形(U-1);print 车道 init 帧在 settings 段采纳 WebSearch 时缺名(W-2)。四端今天的钉版都不会自动升到 0.83.0(minor),以上只在主动换钉时出现。
10269
+
10270
+ 坐标是各端仓内路径,省去开头的 `src/`(验收脚本省去 `scripts/`)以免与本包路径混读;来自 [8200] / [8210] / [8216] 与本版各件在各端主干上的只读检索(终端 09-23、管理台 09-24、验收方 09-25 的读数);行号会漂,以各端现状为准。改法里「两名并读」一律新名优先。
10271
+
10272
+ **终端**
10273
+
10274
+ - K-1 `toolUseResult`(42 处生产读点 / 16 处测试读点,19 个文件,走 CC 渲染链):在 `sema/upstreamBridge.ts` 转录分支 `yield msg` 之前统一起别名一次(`tool_use_result` 在场且 `toolUseResult` 缺席时补上),与既有 `remote/sdkMessageAdapter.ts:205 / 220` 同法;渲染链不用改。
10275
+ - K-3 `errorCode`:`cli/print.ts:375`、`sema/printStreamJsonContract.ts:95`、`sema/terminalOpenSetCode.ts:73`、`sema/checkpointReopenedCopy.ts:48`、`sema/modelSwitchFallbackStore.ts:163` → 改读 `_sema_error_code`(读旧转录处两名并读)。
10276
+ - K-4 / K-4′ `model`:`sema/printStreamJsonContract.ts:1025` → `_sema_selected_model`;`sema/upstreamBridge.ts:3330` 读错误帧的那一处此前是死读,改读 `_sema_selected_model` 后即为活读([8235],改读、不删)。
10277
+ - K-5 `result`:`sema/printStreamJsonContract.ts:1198` / `:1226` 翻面时改为 `out.result = msg._sema_salvaged_result ?? <errors 拼接>`(`-p` stdout 的形不变);`cli/print.ts:398` / `:1193` 与 `sema/seamQueryEngine.ts:1783` 读的是翻面前的帧,先改读新键。
10278
+ - K-7 / K-24:`components/messages/SystemTextMessage.tsx:708`(读 `writtenPaths`;另按子型分派 `:72`、`components/messageActions.tsx:45`)→ chrome 分支消费 `memory_saved` 臂,用内部工厂(`utils/messages.ts:4635`)还原成行,行 uuid 用 `id`。 🔴 `sema/upstreamBridge.ts:3166` 的 chrome 分派兜底臂对未知 kind 返回空 ⇒ 不加这一臂的分支,「Saved N memories」那一行换钉当天静默消失(Remember 工具卡自己又刻意不渲确认)。
10279
+ - 🔴 K-10(安全面):`sema/apiErrorMessageWash.ts:32-33` 只在 `isApiErrorMessage === true` 时对合成行正文做凭据洗消 —— 不改读则升级后洗消整段跳过,报错正文里的 URL 用户名口令与 `api_key=…` 类值原样进 stdout 帧与落盘转录。另两处读点 `seam/adapter/runStream.ts:333`、`sema/printStreamJsonContract.ts:831`。改法:在 `seam/adapter/runStream.ts` 入口把新键别名成内部名一次(下游不动),并补一格「带凭据的报错 ⇒ stdout 与落盘转录都已洗净」的测试。
10280
+ - K-11–K-23:`sema/seamQueryEngine.ts:1722 / 1738` 经 `taskNotificationToPrintFrame` 直写 stdout,自身零读点;但 `-p` 输出上的键名随之变,读这条 stdout 的外部集成方要改读 `_sema_*`。
10281
+ - R-1:`sema/printStreamJsonContract.ts:94` 的本地映射函数与 `:1238` 调用点 → 改读帧上的 `terminal_reason` 或调本包 `terminalReasonForResult`,删本地映射。
10282
+ - U-1:`verify/_committed-segment-correction-live.mjs:348`(`/#segment\d+$/`)与 `:358-359`(`startsWith('wid_')`)换钉后**必红**,且「壳自铸的裸 uuid 造不出这个签名」这条判别力随换形消失 → 改比相等(盘上段身份 === 同一段 `segmentId`;盘上行 `uuid` ∈ `committedUuids`)。`utils/sessionStorage.ts:998-999` 注释里的 `wseq_<seq>` 改口为「由 seq 派生的 UUID」(复合键 `<sessionId>\0<uuid>` 仍然必要);`sema/committedSegmentCorrection.test.ts:2164-2169` 用字面串当 uuid 夹具,不受影响。
10283
+ - E-1:`sema/seamQuerySteerFollow.test.ts:851`(经 `:476` 的 `FOLLOWING_ROW = /sema is following that run/` 断言注入形续跟句)换钉后**必红** → 注入形另立锚 `/sema is following that reply/`,`FOLLOWING_ROW` 留给用户形。`wire-anchor-registry.mjs:3133-3155` 的文案锚不会红(用户形仍逐字铸那两句),但注入形那一半从此无锚 → 补一枚 `sema is following that reply and will show whatever it asks for next`。端自铸的两句同族句(`utils/handlePromptSubmit.ts:727` 回灌用尽、`sema/lostInjectionNotice.ts:78` 计划复核结局丢失)仍用旧主语,建议对齐(不阻塞)。
10284
+ - A-1:`sema/liveToolApprovalWire.ts:635` 按 `argsUnavailable === true` 走通用确认卡,而通用卡不渲 `wireNote` ⇒ 升级后入参超上限的 Write / Bash 卡从专属卡换成通用卡,100a-4 的说明句在终端上看不到 → **请让通用确认卡也渲 `wireNote`**(悬挂审批那一句同样受益)。`sema/askParkReopen.ts:1460-1470` 以 `out.kind !== 'failed'` 判成功 ⇒ 耐久腿拒发会走「失败 ⇒ 重跑整链」一次,第二次失败的上屏句说「not accepted by the engine」,对拒发这一形不准(那不是引擎拒的,包侧什么都没发)→ 见 `editRefused === true` 直接重出卡、换措辞。 通用确认卡只渲 ≤120 字符的入参预览,路径超过约 117 字符会被截,而说明句写的是「只恢复出了目标路径」—— 两者一起看才完整。
10285
+ - W-1:09-23 主干上 `sema/seamQuery.ts:96 / 1212`、`sema/seamQueryEngine.ts:84 / 545`、`sema/webSearchKeySlot.ts:41-42 / 272 / 281` 仍 import 已退出公面的旧三读口 ⇒ 编译期即红 → 按 §99a S-1 换读;已换读则零改动。
10286
+ - W-2:`sema/printStreamJsonContract.ts:1494` 调 `resolveLiveInitToolFace(process.argv.slice(2), process.env)` 未传第三参 → 宿主从 settings 段采纳 WebSearch 时传 `{ webSearchStamped: true }`。
10287
+ - H-1:装 `SettingsPort` 处实现 `mergedDisableAllHooks()`,返回本机 hooks 执行器读的同一个合并值(不实现 ⇒ 行为不变,日志一条 `warn`)。
10288
+
10289
+ **管理台**
10290
+
10291
+ - K-10:`lib/chat/transport/engine-transport.ts:791`(让位臂读 `isApiErrorMessage === true`)→ 改读 `_sema_api_error_message`,休眠读点同批改([8216];这一读点吃的是引擎车道活流,只读新名即可)。不改的症状:让位臂不再拦截,合成的失败正文进普通回复,已有流式文本时可能被截头、并与失败卡重复呈现。
10292
+ - K-5:`lib/chat/transport/turn-mapping.ts:553` 失败行收口的第三顺位回落 `message.result` —— 引擎车道转录面没有结果帧、到不了 → 删([8216])。
10293
+ - E-1:只以用户形调 `activeRunSelfHealRow`(`engine-transport.ts` 里 `activeRunSelfHealRow` 的调用点,不传 `origin`),不受影响。
10294
+
10295
+ **网页端**(未表态,窗 09-26)
10296
+
10297
+ - K-5:`turn-mapping.ts:341` 错误分支读 `message.result` —— 本包转录面上没有结果帧,引擎车道上跑不到(推断,把握高)→ 请核实后删掉,或改读 chrome 结局。
10298
+ - K-24:chrome 臂账本与分派(`chrome-arm-ledger.ts:44`、`turn-mapping.ts:450`)对不认识的臂打 `unsupported_event` 警告 ⇒ 升级后每次记忆写入多一条控制台警告、确认行不显示 → 在臂账本登记 `memory_saved` 并决定显示与否。
10299
+
10300
+ **桌面端**(未表态,窗 09-26)
10301
+
10302
+ - K-8:`main/session-host.ts:2456` 的 `??=` 补到达时戳 —— 保持不变(本来就是缺了才补),system 行从此由它补。
10303
+ - K-24:`main/session-host.ts`(`onChrome` 里按 `CHROME_EVENT_KINDS` 过滤那一处)只把四只渲染位臂(`CHROME_EVENT_KINDS`)转给渲染层,`memory_saved` 不在其中;本包座位层 `checkSeatChromeEnvelope` 也不把它当渲染位臂放行 ⇒ 要显示记忆写入确认,须在主进程侧还原成行(或另议扩座位契约与渲染层,两边同批)。
10304
+
10305
+ **验收脚本**
10306
+
10307
+ - K-3:`gate/gatelib.py:671` 读 `-p` 结果帧的 `errorCode`(0.83.0 后响亮报 MISSING,不会静默)→ 改读 `_sema_error_code`(两名并读)。
10308
+ - 24 项在各围栏里的读点已由验收方分类([8210]):发版当天受影响 1 处(一条默认不开的可选活腿);围栏重钉到内含 0.83.0 的终端时,有 5 个会**静默**失效(判据恒真或只进记录)→ 重钉之前先修这 5 个,判据锚按本版发布帖的机读对照改。
10309
+ - E-1:`repro/c14-plan-review-infinite-yes-loop/lib.mjs:48` 的 `NOTIF_QUEUED_RE`(用于 `probe-infinite-yes-loop.mjs:107,108,138`、`probe-single-press-observe.mjs:76`)在 0.83.0 上恒判「没看到」(假阴)→ 改成 `/is on hold:.*waiting on a decision.*kept the message queued/is`,或按版本二选一;`repro/…-declined-text-and-inflight-retest/probe-inflight-notification.sh:114` 的检出位加 `follow-up message sema sent on its own` 一支。
10310
+ - U-1:任何按 `wid_` / `wseq_` / `wtc_` / `#segment<n>` 认形的判据 → 按 100a′ 改比相等。
10311
+
10312
+ ### 100e. 同名影子导出:本包侧对账(CC-176)
10313
+
10314
+ 本包从 0.83.0 起多一道常驻门,从本包一侧读四个消费本包的端(终端、桌面端、网页端、管理台)的产品源码,专问一件事:**端上有没有自己声明一个与本包公面运行时导出同名的顶层导出**。同名 = 同一件公共逻辑住了两处(本包账面上已经有了,端上那份还在跑),两份各自改、互不知情。
10315
+
10316
+ **读的是哪一刻:** 本机该端克隆的 `origin/main`(没有这个 ref 时退回已提交的 HEAD);只读,不替端 fetch,不看工作区。门对每端打印所读的 ref、提交号和提交日期;所读提交早于 7 天时另打一行陈旧告警(不判红),这一端的结果只代表那一刻,刷新该端的克隆后重跑才是现势。
10317
+
10318
+ **判据(四端都适用):**
10319
+
10320
+ - 算:端产品源码(终端 `src/`、桌面端 `src/`、网页端 `ui/` 与 `bff/`、管理台 `src/`;测试文件与 `.d.ts` 除外)里的 `export const / let / var / function / class / enum / namespace`、`export { local as Name }`,以及指向扫描面外文件的具名转口,只要名字 ∈ 本包公面运行时导出名。
10321
+ - 不算:从本包转口(`export { X } from '@sema-agent/client-core'`,含子路径),这正是推荐形;`export type` / `interface` / `declare`;`export default`;从别的包转口。
10322
+ - 新增一条同名影子 ⇒ 本包门红。端上的正解三选一:**删本地实现,改从本包导入 / 转口**;两边不是一件事 ⇒ **改名**;本包缺一块、端才搬不动 ⇒ 在本包立票补对应的导出。
10323
+ - 豁免行不常驻:到期版本到了即红,端删掉那份而行还在也红 —— 端退役一条后,请在本包的发布帖里点一下,本包同批删行。
10324
+
10325
+ **基线存量(09-25 读数;全部登记,到期 0.85.0):**
10326
+
10327
+ *终端*(16 条;所读 `origin/main` 4e593722,09-23)
10328
+
10329
+ | 名字 | 坐标 | 与本包那份 | 建议 |
10330
+ |---|---|---|---|
10331
+ | `isTerminalStatus` | `components/tasks/taskStatusUtils.tsx:11` | 不是一件事:端判任务面板三词终态,本包判引擎 run 状态闭集(含 `blocked`) | 改名 |
10332
+ | `eventToSdkMessage` / `turnEndUsage` | `seam/adapter/downstream/eventToSdkMessage.ts:28` / `:45` | 同一函数对象,只做类型转写 | 改名,或把类型转写挪到调用点后删掉这层 |
10333
+ | `runStream` | `seam/adapter/runStream.ts:573` | 投影委派本包,外加宿主记账与 chrome 缺省出口 | 改名;其中的记账旁观是否三端公共,另议 |
10334
+ | `makeHitlCanUseTool` / `backendDeny` | `seam/adapter/upstream/hitlBridge.ts:54` / `:63` | 委派本包,只做类型转写 / 类型断言 | 改名 |
10335
+ | `attemptActiveRunSelfHeal` | `sema/activeRunSelfHeal.ts:126` | 委派本包,外加测试窗旋钮 | 改从本包导入,测试窗经 `deps.cancelReleaseWaitMs` 传 |
10336
+ | `observedFileHistoryCapture` / `fileHistoryCaptureDoctorDetail` | `sema/fileHistoryCaptureCapability.ts:56` / `:71` | 本包 0.82.1 出正式版之前的先行版:读数形、签名、措辞都不同 | 依赖抬到 ≥0.82.1 后改从本包导入,判定走 `fileHistoryCaptureMode`;开关显隐谓词本包暂无对应(本包判定今天只认 `off` / `on-always`) |
10337
+ | `parseLocalAllowRule` | `sema/localAllowRuleWrite.ts:172` | 委派本包,注入终端自己的规则匹配器 | 改名 |
10338
+ | `persistedRulesLaneAvailable` / `persistedRulesGovernanceAvailable` | `sema/persistedRulesWire.ts:134` / `:142` | 委派本包,只补缺省 base | 改从本包导入并在调用点传 base,或改名 |
10339
+ | `reopenPlanReviewCard` | `sema/planReviewReopen.ts:139` | 委派本包,注入呈现回执窗与投递口 | 改名 |
10340
+ | `drainingRetryDelayMs` | `sema/seamQuery.ts:338` | 委派本包,只透传测试退避梯 | 改从本包导入,退避梯经 `ladder` 参传;或改名 |
10341
+ | `CANCEL_MESSAGE` / `REJECT_MESSAGE` | `utils/messages.ts:232` / `:234` | 与本包逐字节相同 | 改从本包转口;若要保留本地原件,需在到期前另定处置 |
10342
+
10343
+ *桌面端*:0 条(所读 `origin/main` 5c996117,08-13 —— 本机克隆陈旧,只代表那一刻)。成片导出是对本包的具名转口,属正形。
10344
+
10345
+ *网页端*(6 条;所读 `origin/main` a668336a,09-19)
10346
+
10347
+ | 名字 | 坐标 | 与本包那份 | 建议 |
10348
+ |---|---|---|---|
10349
+ | `readDenialLimitFallback` | `lib/engine/engine-approval-evidence.ts:301` | 判据近乎一致:端入参是容器、按整数判;本包入参是那个值本身、按有限非负数判 | 改从本包导入:`readDenialLimitFallback(container?.denialLimitFallback)` |
10350
+ | `respondToQuestion` | `lib/engine/engine-decision-verbs.ts:510` | 不是一件事:端是会话传输层「答问题」动词(分三路);本包是流内问题的一次性应答口 | 改名;流内问题那一路是否改走本包应答口,另议 |
10351
+ | `buildTaskRequest` | `lib/engine/engine-turn-legs.ts:619` | 一行转调端内构造器(后者内部调本包同名函数),签名不同 | 改名,或删这层、调用点直调端内构造器 |
10352
+ | `classifyRulesFailure` / `listAllPersistedRules` | `lib/engine/rules-wire.ts:91` / `:122` | 同一件事,判据已经分叉:本包那份多出若干失败臂(503 按 `committed` 分可重发与结局不定、405 分两格),「规则店不在」只认机器码、不认 501 状态码;列全时对坏形页体按判不出处理,并剥掉调用方传入的游标 —— 端那份都没有 | 改从本包导入,渲染层接住多出来的失败臂(优先) |
10353
+ | `subagentResumeAvailable` | `lib/engine/subagent-resume-wire.ts:193` | 判据相同,读法不同:端读手上的能力快照对象,本包读进程级能力缓存 | 本包补一个吃快照对象的纯谓词后改从本包导入;或改名 |
10354
+
10355
+ *管理台*(3 条;所读 `origin/main` bc5b5fdd,09-24)
10356
+
10357
+ | 名字 | 坐标 | 与本包那份 | 建议 |
10358
+ |---|---|---|---|
10359
+ | `fmtTokens` | `components/me/humanize.ts:111` | 不是一件事:管理台是用量读数的词面(十进制,带「下界」选项);本包是模型上下文窗的词面(二进制 K 优先) | 改名 |
10360
+ | `TIER_ORDER` | `lib/config/tier-words.ts:120` | 今天逐元素相同(由本包那份转发而来,运行期分叉时补在序尾) | 改为从本包转口;若要保留补尾兜底,改名 |
10361
+ | `readWireErrorCode` | `lib/web/wire-read.ts:79` | 不是一件事:管理台读错误响应体(两种信封);本包读抛出物上的 `errorCode` | 改名 |
10362
+
10363
+ **本门看不见的(写清射程):** 端上换了名字另写一份同义判定;型级同名(`type` / `interface`);CommonJS 形导出。这几形只能靠合并时逐件问「这段逻辑为什么不在包里」。本门只看各端本机克隆的 `origin/main`(或 HEAD)那一刻,不替端 fetch;克隆陈旧时,结果也只代表那一刻。
10364
+
10365
+ ### 100y. 🔴 三端升级必读(固定段式)
10366
+
10367
+ 1. **换钉 `^0.83.0` 之前**:① 按 100d 把自己端上的旧名读点改成两名并读(新名优先):结果帧 `_sema_error_code` / `_sema_selected_model` / `_sema_model_degraded` / `_sema_salvaged_result`、合成终局行 `_sema_api_error_message`、工具结果记录只读 `tool_use_result`、`compact_boundary` 的 `_sema_attached_files`、print 通知帧十三个 `_sema_*`;② 要保留「Saved N memories」那一行的端先接好 `memory_saved` 臂(100a-2),否则那一行换钉当天从转录里消失;③ 还在 import 旧三读口的端先按 §99a S-1 换读(编译期即红);④ 按前缀形认转录 id、按旧句认注入件自愈句、按 `isApiErrorMessage` 认合成终局行的判据与探针先改锚(100a′)。peer sdk 地板 `>=11.3.0` 不动。
10368
+ 2. **逐面**:
10369
+ - **结果帧与合成行**:端自己的 `-p` 投影层若在映射 `terminal_reason`,删掉本地映射表,改读帧上的键或调 `terminalReasonForResult`(两者同判),缺席就不写;渲「这一轮是谁答的」按 100b 的次序取 `_sema_response_model` / `_sema_selected_model`,都缺席写「未知」。
10370
+ - **工具结果记录**:端内部沿用驼峰名 `toolUseResult` 的渲染链,在自己的入口从 `tool_use_result` 同值起别名(包不再铸旧名)。
10371
+ - **system 行**:渲 system 行时刻的端在接收口自己补戳(只补缺席);自建管线直接喂 `adapt()` 的端,压缩分割线上的附带文件键用新名(本版包内两名并读,0.84.0 起只认新名)。
10372
+ - **记忆写入**:按 100a-2 接 `memory_saved` 臂;`notes` 是笔记,不是路径。
10373
+ - **转录 id**:按相等读的路径零改动;按 `uuid` 跨会话建表的,键里带会话维度;需要跨升级边界去重的,按 100a-6 用 wire 事件身份。
10374
+ - **hooks**:装 `SettingsPort` 的宿主(今天是终端)实现 `mergedDisableAllHooks()`;不装 `SettingsPort`、不调 `hooksForWire()` 的宿主零改动、也看不到告警。
10375
+ - **审批卡**:已按 `argsUnavailable` 选「看不到入参」卡形的端零改动,但回落卡从此复用 `argsUnavailable` —— 端上会换成通用确认卡,**请终端让通用确认卡也渲 `wireNote`**,否则 100a-4 的说明句不上屏;直接调 `surfaceFsApprovalAndDecide` 的端在 `failed` 结局 `editRefused === true` 时照原样重出卡,别说成「引擎没收你的答复」;按 `approvalResolutionOf` 分支的端零改动。
10376
+ - **注入件句**:以 `'injected'` 调 `activeRunSelfHealRow` 的端措辞全变(100a-3),按旧句做文本匹配的判据 / 探针同批改锚;只以用户形调用的端零改动。
10377
+ - **联网搜索**:换读 §99 的新判决;带 userinfo 的 endpoint 从此在提交前被判形错(7.100.x 服务端仍会采纳,本包更严);print 车道 init 帧在 settings 段采纳 WebSearch 时传 `webSearchStamped: true`。
10378
+ - **公面类型与码册**:四个类型零取用、零动作;码册 +2 都是 `operator` 码,按 audience 分流的端零动作。
10379
+ 3. **成文改口**:见 100a′(作废 / 改读 / 新增三向);已发段(§15、§90、§92、§93、§97、§99 与 0.52.0 段)不回改,以本段为准;§7 P-43 随版改。
10380
+
10381
+ **包侧缺口:** ① `failed` 事件帧没有终局记录,`_sema_selected_model` 在这一路径上恒缺席,本包补不出来 · ② 转录 id 的唯一性射程不含会话身份:两场会话里同一 `seq` 得到同一 id(换形前后一样),按 `uuid` 跨会话建表的宿主自己带会话维度 · ③ 工具结果行在 wire 带 `eventId` 时原样用它当 `uuid`,本包不验形(引擎今天铸的是 UUID 形);没有稳定键时的兜底值由宿主 `ctx.uuid` 决定 · ④ 同一段事件跨升级边界重投会得到两套 id(100a-6);旧转录不迁移 · ⑤ `disableAllHooks` 合并值的正确性全靠宿主(本包拿不到 flag 来源、也不知道宿主启用了哪些来源,不重算);CC 云会话路径上项目 / 本地设置不压用户层 hooks 的逐来源语义本版不跟;宿主的「安全模式」本包没有读口;工作区里的项目 / 本地设置文件能关掉用户层 hooks 发往引擎(与本机执行器同判,引擎执行的工具若能写这些文件,就能在下一轮关掉用户层 hooks)· ⑥ `memory_saved` 不是渲染位臂,还原成行须在宿主侧做;父调用 id 为空串的写入只剩工具卡 · ⑦ 自建管线把 0.82.x 落盘的旧 `compact_boundary` 行重放进 `adapt()`:本版两名并读,0.84.0 起只认新名,那时旧行的「Referenced file」附件行不再出现(附件行本就不落盘)· ⑧ 流内帧路由上拒发之后,包不替端重出卡(没有跟踪器可 requeue 时这只审批按引擎自己的窗结算);耐久腿不从待决行的风险画像里回落 path;帧上没带入参且没有 `argsOmitted` 的形只有 `argsUnavailable`、没有说明句 · ⑨ 注入件句的 `<detail>` 是引擎原话,可能带引擎自己的词;`queued` 且卡呈不出那一句不给出路(出路仍在用户下一次提交时由用户形那一行给);端自铸的两句同族句仍是旧说法 · ⑩ 对 7.100.x 服务端:带 userinfo 的 endpoint 本包先拒、服务端仍采纳(本包更严);原因句与 7.101.0 已逐字对拍一致 · ⑪ 表态:网页端 / 桌面端截至 09-25 未表态(窗 09-26)。 · 记忆写入还原成行的那一句文案本包不出:要显示的端按 CC 的横幅写法渲「Saved N memory / memories」(按条数分单复数);桌面端与网页端若要一只本包的文案读口,在本版发布帖下说,下一个 patch 以只增方式补
10382
+
9602
10383
  ## §99 🆕 0.82.7(2026-09-24)每请求联网搜索配置的三态判决(CC-182)+ 旧三读口标为过渡期(patch;根公面 +5 函数;`WebSearchSettings` +1 可选位;零 wire 键、零投影臂)
9603
10384
 
9604
10385
  ### 99a. 处置表