@sema-agent/client-core 0.83.4 → 0.83.6

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.
@@ -19,11 +19,11 @@
19
19
 
20
20
  | 项 | 值 | 真源 |
21
21
  |---|---|---|
22
- | 本包 | `@sema-agent/client-core` **0.83.4**(本批发布版 = **patch**:只增 —— plan 审批卡「用户亲手关掉的卡,自动触发不在同一道门上放回屏上」的判定归包(`reopenPlanReviewCard` 加触发者位 `trigger`、拒开位 `dismissedByUser`,409 自愈腿按提交出身替宿主传触发者、结局与整行由包出;CC-201);座位审批请求补强制位 / 强制理由词 / 报价缺席因由 / 出身词四个可选位与过境口 `toolPermissionRequestAskBits`(CC-203);`<system-reminder>` 剥离 / 解包两只口上公面并改线性时间(CC-205);两条展示层接入指引订正;开发依赖引擎 `~7.33.1`;公面类型 +2;peer sdk 地板 `>=11.3.0` 不动;根公面 1277;§104)。上一版 0.83.3 = **patch**:入参 / 来源面 —— hooks 投影加 flag 来源(`--settings` 那一层,排在 local 之后;设置来源 hooks 维持托管在前拼接);规则列举口 `listAllPersistedRules` 入参只要 `list`(`RulesListFacade`,其余四口作可选成员);模型身份认目录缺省(本机读数加宿主报位 `engineAcceptsCatalogDefault`,位 `true` 才算目录可解析);公面类型 +1;peer sdk 地板 `>=11.3.0` 不动;根公面 1273;§103)。上一版 0.83.2 = **patch**:只增 —— 审批卡一族三件(常驻姿态下的放行谓词 `askSurvivesPosture`,三态、「不知道」不折成放行;卡上 `mandate` 六词闭集 + 读口 + 每词一句说明,通告码册 +2,开发依赖引擎 `~7.32.0`;停泊卡带出身词 `origin`;CC-193 / CC-195 / CC-196)与后台子代缺席行的判定、计数、sweep 豁免、回收与措辞单源(回收只在后台代理登记确认离场时;CC-194);公面类型 +13;peer sdk 地板 `>=11.3.0` 不动;根公面 1273;§102)。上一版 0.83.1 = **patch**:只增 + 行为订正 —— 展示层安全出口三端单源 `displayUntrusted`(凭据两网 ∘ 字符三网,选项按载体选;CC-112);本包合成的终局行正文与结果帧 `errors[]` 在铸点洗凭据(`errors[]` wire 可见,方向只会更安全)、交互车道合成行带上行类旗,回决备注与子代续跑收据多收双向 / 格式字符(CC-187 / CC-112);会话规则记录的无损判定 `sessionPolicyDeliverable` + 措辞单源 `sessionPolicyWithheldNotice` + 五词成因 `SESSION_POLICY_WITHHELD_WHY`(整批可送才送,首尾带空白的名字比宿主侧更严;CC-117);插件 hook 每轮计划 `hooksWirePlan` + `SettingsPort` 可选读口 `enabledPluginHooks` + `hooksForWire({ plan })`,逐条判「投给引擎 / 本客户端执行 / 如实不跑」、开机「不会执行」清单与 `/hooks` 标注措辞单源(投给引擎那一臂候引擎能力位 `taskSettings.pluginHooks`),设置来源的 `mcp_tool` 与 exec 形 hook 条目不再上请求体、手写的 `plugin` 键剥掉(CC-174);公面类型 +26;peer sdk 地板 `>=11.3.0` 不动;根公面 1254;§101)。上一版 0.83.0 = **minor**:行为面与型面都有 BREAKING —— CC 形消息 24 项按裁定 C-R103 退役名:结果帧 `degraded` / `errorCode` / `model` 与错误信封 `result` → `_sema_model_degraded` / `_sema_error_code` / `_sema_selected_model` / `_sema_salvaged_result`,合成终局行 `isApiErrorMessage` → `_sema_api_error_message`,工具结果记录删过渡名 `toolUseResult`,system 行 `attachedFiles` → `_sema_attached_files`、到达时戳 `timestamp` 与 `isMeta` 删,print 完成通知帧十三键平铺 `_sema_*`,记忆写入改走 chrome 臂 `memory_saved`(新型 `MemorySavedChromeEvent`,`CHROME_ARMS` required);本包只铸新名、端两名并读一版 + 结果帧 CC 键 `terminal_reason` 与读口 `terminalReasonForResult`(CC-175),错误信封知道就铸 `_sema_selected_model` + 转录 id 改 UUID 形(CC-147)+ `SettingsPort` 可选合并读口 `mergedDisableAllHooks`、用户层 `disableAllHooks` 在引擎腿上生效(CC-162)+ 退化审批卡三形拒收改写、`FsApprovalOutcome` 的 `failed` 臂 +可选位 `editRefused`(CC-135)+ 注入件自愈句整族重写 + 联网搜索旧三读口 `webSearchFromEnv` / `webSearchFromSettings` / `resolveWebSearch` 退出公面,`resolveLiveInitToolFace` 可选 `opts.webSearchStamped`(`LiveInitToolFaceOptions`),endpoint userinfo 律跟服务端 7.101.0(CC-184)+ 公面类型 −4(CC-171)+ 通告码册 69 → 71 与结构化卡白名单 +`read-inbox`(CC-186,开发依赖引擎 `~7.31.0`)+ 合成终局行 `uuid` 改 UUID 形;peer sdk 地板 `>=11.3.0` 不动;根公面 1238;§100)。上一版 0.82.7 = **patch**:只增不改 —— 每请求联网搜索配置的三态判决 `judgeWebSearchSettings` / `webSearchVerdictFromEnv` / `resolveWebSearchVerdict`(与 7.100.0 及以后 server 的受理判官同序同判,认不出的 provider 判形错、不再静默丢段;settings 段凭据注入回调 `apiKeyFor`)+ 措辞单源 `webSearchVerdictMessage`(不回显任何用户配的值)+ 调试日志用 `webSearchEndpointForDisplay`;旧三读口 `webSearchFromEnv` / `webSearchFromSettings` / `resolveWebSearch` 行为不变、标过渡期,0.83.0 删(CC-182);peer sdk 地板 `>=11.3.0` 不动;根公面 1240;§99)。上一版 0.82.6 = **patch**:只增不改 —— 停泊行上选「本会话允许」却没被记住时与活卡腿同句告知(回体 `rememberApplied: false`,或 server 以会话级放行专属拒绝码拒了 remember 后回退普通批准;其余失败一律未知不告知),回执 `DecideReceiptView` +1 可选位 `rememberApplied`(CC-181);决断落定后与桥重试臂的诊断留痕不再因宿主日志口抛错回流进决断;接入文档改口:server ≥7.100.0 上 park 行卡的 `requiresRealApproval` / `approvalIsMandated` 生效(CC-180,零代码改动);peer sdk 地板 `>=11.3.0` 不动;根公面 1235;§98)。上一版 0.82.5 = **patch**:只增不改 —— print 车道 init 帧工具面名册优先:流包装器 `withPrintInitFrame`(首选接法,init 恒为首行、其后按到达序)/ 判定闸 `createPrintInitGate` / 分类口 `printInitRosterSignal` / 判定口 `decidePrintInitToolFace` / 留痕措辞 `printInitToolFaceDebugLine` + 等待上界 `PRINT_INIT_ROSTER_WAIT_MS`(150 000);回落估计表补 `ListAgents`(7.30.0 及以后的引擎上与 `SendMessage` 同条件)(CC-169);peer sdk 地板 `>=11.3.0` 不动;根公面 1235;§97)。上一版 0.82.4 = **patch**:只增不改 —— park 行审批卡新增门类位 `irreversibleParkGate`(待决行门类恰为 irreversible_ask,今天即生效,门类事实不是保证);`requiresRealApproval` 在待决行顶层带时透传(就绪,待决列表带出后才生效,今天零行为变化)(CC-180);`ApprovalCardRequest` +1 可选位;peer sdk 地板 `>=11.3.0` 不动;根公面 1229;§96)。上一版 0.82.3 = **patch**:只增不改的公面 —— 自愈提示的「保住对话」出路槽 `keepSessionWayOut` 与交互面引擎决断入口开关 `engineDecidePath`(CC-177;两位都不给时措辞与 0.82.2 逐字节同);自愈结局两臂 +机读位 `pendingRowGone`(重开链证实待决项已不在);peer sdk 地板 `>=11.3.0` 不动;根公面 1229;§95)。上一版 0.82.2 = **patch**:只增不改的公面 + 若干行为订正 —— 新增措辞单源 `cloudEffectiveNotices`:云控制面有效配置回体的降级告警 / 预算 / 能力上限三读数(CC-164,四态,不读成 0 或「没有预算」);本机引擎 models 文档在宿主注入本机条目判定 `entryAccepted` 时补 `default` / `tierGroups` / `activeTierGroup`,剔掉会让本机整份拒收的目录引用与判定口不收的条目,去掉 registry 注记键 `origin` / `overridesTeam`(CC-165;结果新增 `modelRefIssues`);计划复核结局机读位 `_sema_planReviewOutcome`(CC-160 ①);停泊审批决断操作起止回调 `onDecideOperation` 与操作句柄 `openDecideOperation`(CC-160 ③);新增超集键 `_sema_planReviewOutcome`;peer sdk 地板 `>=11.3.0` 不动;根公面 1229;§94)。上一版 0.82.1 = **patch**:只增不改的公面 + 若干行为订正 —— 新增读口 15 个(续跑折叠码读口与措辞 / 文件历史捕获读口六口 / 模型身份可解析判据五口 / 自定义代理载荷作废重投口 / 决断失败码「门还在」判定)+ 宿主车道声明 `EmitContext.lane`;新增超集键 `_sema_response_model`(终帧 / 每轮用量)与 chrome 用量两臂 `responseModel`、重开判决 `_sema_decisionInFlight`、自愈结局两臂 `decisionInFlight`、内部臂 `_sema_denial_unclassified`、通知码 +1;行为订正:计划复核决断在飞不重开卡且自愈提示不再教人再决一次(CC-160 ②)、决断出口补折叠句且停泊腿不再把折叠 / 坏档误判已决(CC-154)、执行车道 `in-process` 措辞(CC-153)、`-p` 车道 Bash 良性退出与交互同判(CC-168)、`-p` 工具结果帧补结构化结果(CC-149)、被拒分类词两车道同判(CC-172)、非交互车道子代工具帧(CC-158,宿主声明车道才生效)、终帧被拒清单对账流内拒绝(CC-159)、自定义代理载荷作废重投(CC-161);peer sdk 地板 `>=11.3.0` 不动;根公面 1228;§93)。上一版 0.82.0 = **minor**:只增不改 —— 新增只读读口 17 个 + 1 常量、工具名册行一格 `mountedBy`、turn 错误判决 `http` 臂一格 `storedRowWhere`:`/rewind` 代码档与对话档能不能用由引擎能力位回答(CC-146)、云控制面额度读数三分(CC-150)、装配期「这一条腿有没有手」(CC-152)、续跑拒收按原码判(CC-154);两处既有面行为订正:自动模式分类器拒的类别词由 `permission-rule` 改为 `automode-*` 三词(CC-155,订正 0.81.1)、续跑上下文读不出时引擎点名的那一行不再丢(CC-156);0.81.0 预告的 23 键 + 1 子型删改**改到 0.83.0**(§92y ㉙);零 wire 键、零投影臂;peer sdk 地板 `>=11.3.0` 不动;§92。上一版 0.81.1 = **patch**:被拒分类词读器加第③路(CC-148):引擎「没问过就拒」的工具调用(deny 规则 / 权限模式 / hook / 分类器 / 写保护 —— 无 `settlement` 只有 `gate.disposition.deniedBy`)在 user 工具结果记录与终帧 `permission_denials[]` 上此前恒缺 `_sema_denial_kind` / `toolDenialKind`,现按层名落 `permission-rule`(其中「分类器」一项已由 0.82.0 CC-155 订正)(`ask_resolution` 无结算 / 结算段不成形 / 层名表外仍缺席不猜);交互与 `--print` 两条车道同一只读器;另钉终帧两臂 `_sema_effective_*` 键集不变量 —— 成功臂展开单铸函数、错误信封显式重发,覆盖性钉在返回对象自己的类型上(漏键 / 多键编译期即红)+ 门格判两臂键集相等且值逐字节同,给单铸函数加键时错误臂不会再静默少键(本版无键增减);零 wire 键、零投影臂、根公面 1195;§91。上一版 0.81.0 = **minor**:CC 形消息一张脸(C-R85 / CC-131):user 工具结果记录加 SDK 面键 `tool_use_result`(与过渡键 `toolUseResult` 同引用,删驼峰原定 0.82.0、已改到 0.83.0)+ DS-19 普查门升硬门(键集按语法解析、按 type/subtype 分表;23 键 + 1 子型过渡表到期窗原为 0.82.0、已改到 0.83.0,零常驻豁免)+ CC-145 `/rewind` both 臂改发 `restoreFiles:true`、`projectRewind(pending)` 单参;零 wire 键、零投影臂、根公面 1195;§90。上一版 0.80.2 = **patch**:`conflict.resume_context_unavailable` 的 `staleAfterSec` / `runId` 在真 SDK 上读不到(CC-137:sdk 11.1.0 起 `APIError` 把体上非具名键收进 `extra`,这一码映射成 `ConflictError` 无具名位,读口只读顶层 ⇒ 真调用链恒缺席)⇒ 体源结构位改「顶层有效值优先、`extra` 兜底」三只类型化读口单铸,有具名子类位的三处(`retryAfterSec` × 2 / `allowlist`)行为不变只多兜底,头源 `retryAfterMs` 只读具名位;零 wire 键、零投影臂、根公面 1195;§89。上一版 0.80.1 = **patch**:去键重发判据句按「铸」计(CC-143;§87「带键的体恰一次」作废 → 被铸恰一次,POST 几次随传输层)+ 接入文档段落自带射程限定词自 §88 起向前执法 + 模型预设表 deepseek 项改闭集真名 deepseek-flash(CC-144,C-R82 ①)+ 门里 git 兜底自陈探针(CC-142);零 wire 键、零投影臂、根公面 1195;§88。上一版 0.80.0 = **minor**:🔴 peer sdk 地板 >=11.2.1 → >=11.3.0 + 策略拒的归因上 wire(CC-133:发送面 deny+policy 带 settledBy / 读侧 policy_refused 十三词入 CC 规则桶 / 三错误码读口 / 直连门去键重发恰一次)+ 删除规则后果句归包(CC-132)+ /mcp 详情卡两腿分说归包(CC-134:六档读口 + 九句铸点,同批改口八处说满的话)+ 🔴 终帧旧拼法 `structuredOutput` 按 0.79.1 的宣告删除(只剩 CC 形 `structured_output`);根公面 1195;§87。上一版 0.79.1 = **patch**:终帧结构化产出同帧铸 CC 形 `structured_output`(旧拼法 `structuredOutput` 过渡一版,0.80.0 删;CC-130)+ 写审批 `argsOmitted` 退化卡在无受护写入部署形上重新解得出路径(CC-129)+ 云控制面十值二型经本包第二个入口 `@sema-agent/client-core/registry` 原样转口(根入口零变;CC-128 ①);根公面 1184;§86。上一版 0.79.0 = **minor**:server 7.93.0 过境批 —— peer sdk 地板 >=11.2.1 + 写口回执第六臂 unverified 与 503 体 committed 分臂(CC-124)+ 无 run 可读的 MCP 状态面(CC-74)+ 审批卡 mandated 位(CC-110)+ 请求装配第三车道 utility 与 approverPosture / maxTokens / outputRetries 三键 + print 车道 model 座(CC-116 / 118 / 123)+ 拒因两面分铸与四个机读位(CC-125)+ 模型轮边界划消息界(CC-126)+ 委派结果人类面读口按来源声明体内定位(CC-127)+ sdk 转口三件(CC-128)+ 通告码 memory.project_scope_absent(CC-122);公面 1184;§85。上一版 0.78.2 = **patch**:门的棘轮登记数字单真源 —— 五只门十一格棘轮 + 218 条沿革账搬进 scripts/registry.json、门只读不抄、负控改篡改登记物、下调通道 RATCHET-SLACK、新门 run-registry-test(CC-79 第一期)+ 两格存量松量收掉 + submit-wiring-manifest 门补 count===1 边界格;src 零改动,dist 逐字节同 0.78.1;公面 1154;§84。上一版 0.78.1 = **patch**:两辆并行车收货 + 三张跟进票 —— displayBody 人类面读口 + 围栏解析头尾配对收紧(CC-113)/ MCP 两处「没报」措辞分句(CC-115)/ 记忆治理面五动词调用口(CC-97 b)/ 非流式提交回执接线回执读口 readSubmitWiringManifest(CC-121)/ 三份失败判官抛出物读取收口(CC-119);公面 1154;§83。上一版 0.78.0 = **minor**:peer sdk 地板 >=9.8.1 → >=11.0.1(CC-106)+ 单步写口 200 体按 stillLive 判别联合改读、第五臂 revoked、三型取自 sdk、RulesFacade.write 必填、PersistedRuleLiveness 转口(CC-103)+ DeniedBy 第十词 read_boundary 专句(CC-106 ④)+ excludeAllTools 车道行;型面 BREAKING 三处、行为面同 0.77.2;公面 1143;§82。上一版 0.77.2 = **patch**:出包面结构卫生 —— 构建期 removeComments,dist js / d.ts 零注释(新门 run-dist-comments-test.mjs + 卫生门词表 32 条 + 文档向前执法;CC-100)+ gateDeniedByDetail 表外词兜底句改「本版不认识这个层名」(CC-111 ①);行为 / 型面逐字节同 0.77.1;公面 1143;§81。上一版 0.77.1 = **patch**:外部验收三件回填 —— 读器族边界残留 projectMcpReconnectCapability 只认自有键(CC-107)/ rewind 四子键恰读一次(CC-108)/ 子代输出合并按回体 output.type · retrieval_status 定处置(CC-109,server ≥7.92.0 cursorSemantics 缺席面);型面 additive 一处;公面 1143;§80。上一版 0.77.0 = **minor**:请求装配逐键去向回执 + print 车道补座 + 表外键响亮拒(CC-101,四条行为 BREAKING)/ 会话策略写端口(CC-105)/ 持久规则单步写面(CC-103)/ workflow 子代面板行代际三向恢复(CC-104,零改码)/ 能力位读器族口径整族改齐 + 外部验收 F-A / F-B 处置 + 合并树异源复审两轮处置;公面 1143;§79。上一版 0.76.2 = **patch**:制品卫生 —— 清 dist 重 build 去掉两只已撤出源码的编译产物 + dist ⇄ src 对账门;零源码 / 零型面 / 零行为改动;公面 1122;§78。上一版 0.76.1 = **patch**:能力位读器工厂(CC-75)/ MCP 活性观察读口(CC-36)/ `capabilities.peerLane` · `permissionRulesWrite` 四态读口(CC-102)/ 记忆治理面两只读口 + 三只条目面回体读口(CC-97 a)/ 主车道证明逐次新建(CC-99)+ 修 0.76.0 的 F1 / F2(身份四键一次性快照只修了投影口一侧);公面 1122;§77。上一版 0.76.0 = **minor**:六票一批 —— `prompt_assembled` 投影臂 / 审批 feed 三态(**型面 BREAKING**)/ `ApprovalResolution` 单源联合 / 记忆 spec 读口 / 终态词表上游钉 / `tasks_expand` 退役(**型面 BREAKING**),外加身份四键一次性快照(跨全部内部臂);公面 1081;§76。上一版 0.75.1 = **patch**:面板短命子代反序缓行放不出的残洞(外部复验 D1)+ 同代 running 帧三向定形(B4)+ #969 提货 `spawnName` 透传与 `agentType` 改读诚实来源(CC-95);§75。上一版 0.75.0 = **minor**:压缩的非 compacted 结局上 chrome 面 `compaction_outcome`(新内部臂 —— 自建 print 出口的端先表态)+ peer sdk 地板 `>=9.8.1`;型面 additive(ChromeEvent +1 臂)、公面 1065、零 wire 新键;§74。上一版 0.74.5 = **patch**:core 7.24.0 提货 `_sema_freed_tokens?` + 首见即终态的行零事件(幽灵完成行)+ `isNewEngineAgentPanelCycle` / `approvalOutcomeNoteOf` 上公面;型面 additive、公面 1065、peer 不动;§73。上一版 0.74.4 = **patch**:面板键「先发布的键为准」(tick 归不了一的三序不再两行)+ 前代 UUID 迟到 tick 丢弃 + `readRunCancelContext` 下钻收紧;型面 additive、公面 1061、peer 不动;§72。上一版 0.74.3 = **patch**:面板子代身份归一(tick / end 的 UUID 归到 fleet 尾段,宿主零改)+ run 记录 `cancelContext` 读口与成因四词 + workflow 行 `errorCode` + reopen 第二臂两件;型面纯 additive、公面 1061、peer 不动;§71。上一版 0.74.2 = **patch**:`capabilities.deviceExecutor.management` 四态读口(缺席 ≠ false;`deviceExecutor: false` = 车道缺席;管理动词可用性三态归包);公面 1052;§70。上一版 0.74.1 = **patch**:审批卡无决断收口 + 结局回交;§69。上一版 0.74.0 = **minor**:peer sdk 地板 >=9.7.1 + covers 过境 + 面板周期身份 + 离场读口;§68。上一版 0.73.5 = **patch**:workflow 规模告警判定上收进包(`evaluateWorkflowSize` 三态:未知的规模不当作规模正常;分母口径与帽优先级单源;env 读口纯函数);型面纯 additive、公面 1044、peer 不动;§67。上一版 0.73.4 = **patch**:终帧 `permission_denials` 第三键 ⇐ 同一条流 `tool_start` 入参按 `toolCallId` join(三道闸;join 不上留 sema 载体;🔴 更正 0.73.2「自动升级收口」一句)+ 审批 feed push 侧取件失败的欠账退避重试;型面纯 additive、公面 1033、peer 不动;§66。上一版 0.73.3 = **patch**:CC-61 sdk 9.7.1 提货 + `capabilities.approvalsStreamLive` 四态读口(缺席 = 判不出;`livePendingNeedsReconcile` 只在引擎明说会推时才让对账节拍降兜底)+ CC-60 五条模型面文案锚包侧半场(cursorSemantics 机读位 / result 行注记 / bash 首行两变体与良性槽 / 通知 seed 并集 / parked 臂);型面纯 additive、公面 1032、peer 不动;§65。上一版 0.73.2 = **patch**:CC-59 悬挂 ask 全卡 —— `livePending[].frame`(server ≥7.87.0)两道闸窄读进视图,在场即走流内帧腿同一条路(入参可见、改写可转发),缺席保持盲卡;CC-34 收口(引擎半场随 7.87.0 到货,判据交黑盒);型面纯 additive、公面 1026、peer 不动;§64。上一版 0.73.1 = **patch**:CC-57 `decidePlanReview` outcome 尾句按「决断有没有生效」四态选(单铸点 `planReviewOutcomeTail`;此前本地拒发仍让模型汇报已拒绝)+ CC-56 cancel 的 409 按机器码分家(`cancelConflictFromError` 三形 / 新安全码 `cancel_run_not_running`)与提交面 429 用量窗读口 + 人话;型面纯 additive、公面 1026、peer 不动;§63。上一版 0.73.0 = **minor,型面 BREAKING**:fleet 视图八个数值键改可选 —— CC-52 `FleetTaskView.elapsedMs` / `tokens` / `queuedCount` 与 `FleetWorkflowView.doneCount` / `totalCount` / `failedCount` / `tokens` / `elapsedMs` 不再 `?? 0`(有键 = 真值含真 0,缺键 = 不知道;逐键缺席语义见 §62b)+ 台账补偿链无基数不铸;公面导出名零增减 1019、零 wire 变化、peer 不动;§62。上一版 0.72.14 = **patch**:悬挂的流内 ask 拉半场 —— CC-55 `startApprovalsFeed` 快照加 `livePending` 段并进变化摘要(键缺席 = 未报,不铸空)+ 视图 / 去重账 / 与流内帧腿同链的决断口(入参不可见上卡明说、改写不转发)+ 宿主闸对账节拍 + 待决计数读口(不知道 = null);型面纯 additive、公面 1019、peer 不动;§61。上一版 0.72.13 = **patch**:server 7.86.0 提货 —— CC-46 plan_review `permissionModeAfter` 发口(三选卡双闸:宿主声明只读起步 ∧ 引擎 ≥7.86.0;400 field_conflict 两种处置)+ CC-54 `capabilities.executionLane` 四态读面(键缺席 ≠ 不是本机车道;`toolsRunHere` 判据归包)+ CC-53 detach 版本闸三态;型面 additive(另撤回 0.72.12 的主通道 `absent` 臂,改独立缺席订阅口)、公面 1011、peer 不动;§60;**预告 0.73.0 BREAKING**:fleet 视图数值键改可选。上一版 0.72.12 = **patch**:「缺席被折成正向终态」按类清剿 —— CC-50 M1 头条(fleet 行缺席改发 `absent` 不再铸 `end{isError:false}`)+ 六站一次改齐(缺席 ⇒ `unknown`)+ 结果边界 fail-closed 取舍 + `_sema_outcome` + `Outcome unknown:` 行 + CC-51 M6(default 臂不再谎报 running)+ 普查门 + DS-06;型面 additive、公面 993、peer 不动;行为面三处真变化见 CHANGELOG 取舍段;§59。上一版 0.72.11 = **patch**:core 7.23.0 提货 —— CC-49 通告码 66 → 67 `config.write_protection_unresolved`(operator;兄弟码 `target_view_absent` = 没有视图,这枚 = 有视图解析不出)+ `permission_denials` 自动升级腿通电(`gates[].toolCallId` ⇒ `tool_use_id`;CC-34 引擎半场);型面零变化、公面 989、peer 不动、devDep core ~7.23.0;§58。上一版 0.72.10 = **patch**:CC-41 leader run 终局 `needs_human` + `result.conflict` 三形读面(none 缺席不可分 / unreadable 在场读不懂 / conflict;`salvaged[]` 原样给落盘口;措辞单源不提重试);型面纯 additive、公面 989、peer 不动;§57。上一版 0.72.9 = **patch**:server 7.85.0 提货 —— CC-30 会话内 MCP re-dial 消费口(`reconnectMcpServer` 三态 / unsupported 恒五键 / 交易文案单源)+ CC-39② memory-status `autoConsolidationArmed` 三态 + CC-45 resume 补充句渲保留秒数;型面纯 additive、公面 985、peer 不动;§56。上一版 0.72.8 = **patch**:清账三票 —— `memory:"off"` 请求键(CC-39③,server 7.84.0 S-405)+ `runStream` 第二条中性臂 `Model output error:`(CC-43)+ 注入件撞活 run 自动 steer 零卡(CC-44);型面纯 additive、公面 977、peer 不动;§55。上一版 0.72.7 = **patch**:core 7.22.0 提货 —— 通告码 66 `mcp.server_redialed` + 读器 `readMcpServerRedialed` + `wiring_manifest.readDeny` 第九段 `_sema_readDeny`(缺席 = 没有内置行判这条腿);型面纯 additive、公面 971、peer 不动、devDep core ~7.22.0;§54。上一版 0.72.6 = **patch**:cli L-379 包侧半场 —— `steerFollowIntent` steer 后续听意图三态(tail / after-decision / after-wake)+ `activeRunSelfHealRow` 续听声明第五参;型面纯 additive、公面 969、peer 不动;§53。上一版 0.72.5 = **patch**:server 7.82.1 提货 —— `capabilities.webSearch.backend` 部署默认 WebSearch 后端四态读面(键缺席 = 老引擎判不了 ≠ `none`);型面纯 additive、公面 968、peer 不动;§52。上一版 0.72.4 = **patch**:core 7.21.x 三件经 server 7.82.0 提货 —— `wiring_manifest.autoConsolidation` 第八段 `_sema_autoConsolidation`(缺席 = indeterminate 不折 false);型面纯 additive、公面 962、peer 不动;§51。上一版 0.72.3 = **patch**:core #863 记忆单系统半场 ① —— `projectAgentsForWire` 投影 `agents[].memory`(user|project|local 三词同映射引擎平面 agent:<type>);型面纯 additive、公面 962、零 wire 新键、peer 不动;§50。上一版 0.72.2 = **patch**:workflow 视图两票 —— `LiveWorkflowController.resolution()` 六态(snapshot() 的 null 三义拆开)+ `noteOwnWorkflowRun` own 台账同拍登记;型面纯 additive、公面 961、零 wire 键、peer 不动;§49。上一版 0.72.1 = **patch**:server 7.80.1 提货 —— 409 `conflict.resume_context_unavailable` 结构读数(`staleAfterSec` / `runId`;sdk 9.6.0 尚未带键,经 sdk 今天恒缺席)+ `SkillSpec.baseDir`(只在本机车道带);型面纯 additive、公面 960、peer 不动;§48。上一版 0.72.0 = **minor**:型面 BREAKING —— 39 个零消费导出退出公面(CC-32 退役批,[7419] §45 预告 / cli [7422] 同意 / web-client·desktop 过节拍沉默 = 同意;名单见 §47a S-1);运行期零 BREAKING、公面 956、peer 不动、devDep core ~7.20.1;随批:已退役名账 `removed` + export-liveness 门 G 段 + 冻结账门 ⑧c;§47。上一版 0.71.4 = **patch**:core 7.20.1 提货 —— `ENGINE_NOTICE_CODES` 65 + `wiring_manifest.writeProtection` 第七段 `_sema_writeProtection`;型面纯 additive、公面 995、peer 不动、devDep core `~7.20.1`;§46。上一版 0.71.3 = **patch**:门体系清账批 —— CC-24 export-liveness 门 + 39 个导出退役预告(0.72.0 删,表态制)/ CC-26 `as unknown as` 铸链棘轮 / CC-25 冻结账门 ⑧ 段 / CC-06 B-081 包侧半场(终帧 `_sema_effective_reasoning` / `_sema_effective_memory_scopes` + resume reopen 族 + `routePairingVerdict`);型面纯 additive、公面 986 → 995、peer 不动;§45。上一版 0.71.2 = **patch**:接入方验收两票归包 —— CC-28 B-132 decide 拒体三句去内部车道词 / CC-29 B-133 committedUuids 唯一性(重复 ⇒ 形 f);零型面变化、公面 986、peer 不动;§44。上一版 0.71.1 = **patch**:接入档打回修正 —— CC-27 `ApprovalCardRequest.readRootCandidate?` 帧→卡透传位 + 新导出型 `ReadRootCandidateView`;型面纯 additive、公面 986 不变、peer 不动;§43。上一版 0.71.0 = **minor**:型面 BREAKING 六件 —— peer sdk 地板 >=9.6.0 + agent-types >=0.3.0 / `SkillsListingTruncatedFactsView` 删 `requestedBudgetBytes?`·`laneClamped?` / `WiringManifestMcpEntry` → `WiringManifestMcpEntryView` / `MAX_AGENT_SKILLS` 删 / `decide.workflow_host_not_parked` 退役;运行期零 BREAKING。内容:core 7.20.0 提货(闭集 +5 六十四码)/ 🔴 CC-16 `text_segment_end.committedUuids[]` / CC-08 全五件(tool_disclosure / tool_progress 两 chrome 臂、wiring_manifest tools·hooks·lsp 进切片、tool_roster_delta 接上、context_usage 进切片、`readRootCandidate` 镜像)/ CC-19 `mcpEngineLegPresence` 归包 / CC-20 not_parked clean-cut;公面 986;§42 / 42y 八条)|
23
- | peer:wire 契约 | `@sema-agent/sdk` **>=11.3.0**(value-level,非 type-only;**0.80.0 抬版**:11.3.0 在两条回决口体上声明 `settledBy?: "policy"`、`Settlement.kind` 第十三词 `policy_refused` 与三错误码;0.83.0 / 0.83.1 / 0.83.2 / 0.83.3 / 0.83.4 不动。此前 **0.79.0 曾抬到 >=11.2.1**:11.2.x 声明 `capabilities.mcpProbe`、`mcpCapabilities` / `probeMcp` + `McpProbeFace`、写回执第三支 `stillLive: "unknown"`,11.2.1 再补 `TaskRequest.approverPosture` 与审批帧键 `mandated`(型面 + 运行期键锚),本包按 11.2.1 编译,11.0.1 失去物料见证;**0.78.0 曾抬到 >=11.0.1**:11.x 声明 `DeniedBy` 第十词 `read_boundary`、`rules.write` 200 体按 `stillLive` 判别联合、`RemovalLiveness` / `RuleWriteRequest` / `RuleWriteResult` / `RuleWriteBehavior` 包根导出、`TaskRequest.excludeAllTools`,本包按 11.0.1 编译,9.8.1 失去物料见证;**0.75.0 曾抬到 >=9.8.1**:9.8.x 声明 `Capabilities.deviceExecutor.management?`,9.7.1 失去物料见证;**0.74.0 曾抬到 >=9.7.1**:9.7.x 追平的六处型面是本包 0.73.3 起的编译基线,且 9.6.0 失去物料见证;**0.71.0 曾抬到 >=9.6.0**:`tool_disclosure` / `tool_progress` 两帧型与 `ToolApprovalFrame.readRootCandidate` 自 9.6.0 起;0.69.0 曾抬到 >=9.4.0(`reasoning_end` / `lastLegMcp`),0.60.0 抬到 >=8.4.0;地板由 `scripts/run-sdk-floor-test.mjs` 的 `FLOOR` 与 public-surface 门 C-CC-3「不低于见证到的最低实装版」双钉)| `package.json` `peerDependencies` |
22
+ | 本包 | `@sema-agent/client-core` **0.83.6**(本批发布版 = **patch**:会话规则记录的无损判定 `sessionPolicyDeliverable` 把引擎会在准备阶段拒启的两类名字(引擎退役名、含 `__` 而不以协议前缀开头的名字)改判「不写」,成因词 `legacy_tool_name`(闭集 5 → 6),引擎说「改名为 X」的退役名带 `currentName` 出路位;`peer_wide` 那句改措辞(判决不变)(CC-226);根公面 1278 不变;peer sdk 地板 `>=11.3.0` 不动;§106)。上一版 0.83.5 = **patch**:展示层出口 `displayUntrusted` 的连接符 ZWJ / ZWNJ 按语境判(🔴 默认形输出字节变)、两只可选开关 `escapeBackslashes` / `blanks` 与标记位置读口 `displayUntrustedMarks`(CC-204);凭据两网的判别视图认孤代理项,机读字节 `errors[]` / 合成终局行同批(CC-207);转义记号在凭据再扫里原子与四处凭据读法存量修复(相对 0.83.4 零新增外泄);hooks 启动模式可选词读口 `SettingsPort.hooksStartupMode()`,安全 / bare 模式下设置来源只发 managed(CC-200),设置来源里同一条 hook 只发一份(CC-208);自愈三条重发结局 +1 可选位 `releaseConfirmedByEngine`、行句按释放证据分说(CC-212);活段接入指引订正;公面类型 +3;peer sdk 地板 `>=11.3.0` 不动;根公面 1278;§105)。上一版 0.83.4 = **patch**:只增 —— plan 审批卡「用户亲手关掉的卡,自动触发不在同一道门上放回屏上」的判定归包(`reopenPlanReviewCard` 加触发者位 `trigger`、拒开位 `dismissedByUser`,409 自愈腿按提交出身替宿主传触发者、结局与整行由包出;CC-201);座位审批请求补强制位 / 强制理由词 / 报价缺席因由 / 出身词四个可选位与过境口 `toolPermissionRequestAskBits`(CC-203);`<system-reminder>` 剥离 / 解包两只口上公面并改线性时间(CC-205);两条展示层接入指引订正;开发依赖引擎 `~7.33.1`;公面类型 +2;peer sdk 地板 `>=11.3.0` 不动;根公面 1277;§104)。上一版 0.83.3 = **patch**:入参 / 来源面 —— hooks 投影加 flag 来源(`--settings` 那一层,排在 local 之后;设置来源 hooks 维持托管在前拼接);规则列举口 `listAllPersistedRules` 入参只要 `list`(`RulesListFacade`,其余四口作可选成员);模型身份认目录缺省(本机读数加宿主报位 `engineAcceptsCatalogDefault`,位 `true` 才算目录可解析);公面类型 +1;peer sdk 地板 `>=11.3.0` 不动;根公面 1273;§103)。上一版 0.83.2 = **patch**:只增 —— 审批卡一族三件(常驻姿态下的放行谓词 `askSurvivesPosture`,三态、「不知道」不折成放行;卡上 `mandate` 六词闭集 + 读口 + 每词一句说明,通告码册 +2,开发依赖引擎 `~7.32.0`;停泊卡带出身词 `origin`;CC-193 / CC-195 / CC-196)与后台子代缺席行的判定、计数、sweep 豁免、回收与措辞单源(回收只在后台代理登记确认离场时;CC-194);公面类型 +13;peer sdk 地板 `>=11.3.0` 不动;根公面 1273;§102)。上一版 0.83.1 = **patch**:只增 + 行为订正 —— 展示层安全出口三端单源 `displayUntrusted`(凭据两网 ∘ 字符三网,选项按载体选;CC-112);本包合成的终局行正文与结果帧 `errors[]` 在铸点洗凭据(`errors[]` wire 可见,方向只会更安全)、交互车道合成行带上行类旗,回决备注与子代续跑收据多收双向 / 格式字符(CC-187 / CC-112);会话规则记录的无损判定 `sessionPolicyDeliverable` + 措辞单源 `sessionPolicyWithheldNotice` + 五词成因 `SESSION_POLICY_WITHHELD_WHY`(整批可送才送,首尾带空白的名字比宿主侧更严;CC-117);插件 hook 每轮计划 `hooksWirePlan` + `SettingsPort` 可选读口 `enabledPluginHooks` + `hooksForWire({ plan })`,逐条判「投给引擎 / 本客户端执行 / 如实不跑」、开机「不会执行」清单与 `/hooks` 标注措辞单源(投给引擎那一臂候引擎能力位 `taskSettings.pluginHooks`),设置来源的 `mcp_tool` 与 exec 形 hook 条目不再上请求体、手写的 `plugin` 键剥掉(CC-174);公面类型 +26;peer sdk 地板 `>=11.3.0` 不动;根公面 1254;§101)。上一版 0.83.0 = **minor**:行为面与型面都有 BREAKING —— CC 形消息 24 项按裁定 C-R103 退役名:结果帧 `degraded` / `errorCode` / `model` 与错误信封 `result` → `_sema_model_degraded` / `_sema_error_code` / `_sema_selected_model` / `_sema_salvaged_result`,合成终局行 `isApiErrorMessage` → `_sema_api_error_message`,工具结果记录删过渡名 `toolUseResult`,system 行 `attachedFiles` → `_sema_attached_files`、到达时戳 `timestamp` 与 `isMeta` 删,print 完成通知帧十三键平铺 `_sema_*`,记忆写入改走 chrome 臂 `memory_saved`(新型 `MemorySavedChromeEvent`,`CHROME_ARMS` required);本包只铸新名、端两名并读一版 + 结果帧 CC 键 `terminal_reason` 与读口 `terminalReasonForResult`(CC-175),错误信封知道就铸 `_sema_selected_model` + 转录 id 改 UUID 形(CC-147)+ `SettingsPort` 可选合并读口 `mergedDisableAllHooks`、用户层 `disableAllHooks` 在引擎腿上生效(CC-162)+ 退化审批卡三形拒收改写、`FsApprovalOutcome` 的 `failed` 臂 +可选位 `editRefused`(CC-135)+ 注入件自愈句整族重写 + 联网搜索旧三读口 `webSearchFromEnv` / `webSearchFromSettings` / `resolveWebSearch` 退出公面,`resolveLiveInitToolFace` 可选 `opts.webSearchStamped`(`LiveInitToolFaceOptions`),endpoint userinfo 律跟服务端 7.101.0(CC-184)+ 公面类型 −4(CC-171)+ 通告码册 69 → 71 与结构化卡白名单 +`read-inbox`(CC-186,开发依赖引擎 `~7.31.0`)+ 合成终局行 `uuid` 改 UUID 形;peer sdk 地板 `>=11.3.0` 不动;根公面 1238;§100)。上一版 0.82.7 = **patch**:只增不改 —— 每请求联网搜索配置的三态判决 `judgeWebSearchSettings` / `webSearchVerdictFromEnv` / `resolveWebSearchVerdict`(与 7.100.0 及以后 server 的受理判官同序同判,认不出的 provider 判形错、不再静默丢段;settings 段凭据注入回调 `apiKeyFor`)+ 措辞单源 `webSearchVerdictMessage`(不回显任何用户配的值)+ 调试日志用 `webSearchEndpointForDisplay`;旧三读口 `webSearchFromEnv` / `webSearchFromSettings` / `resolveWebSearch` 行为不变、标过渡期,0.83.0 删(CC-182);peer sdk 地板 `>=11.3.0` 不动;根公面 1240;§99)。上一版 0.82.6 = **patch**:只增不改 —— 停泊行上选「本会话允许」却没被记住时与活卡腿同句告知(回体 `rememberApplied: false`,或 server 以会话级放行专属拒绝码拒了 remember 后回退普通批准;其余失败一律未知不告知),回执 `DecideReceiptView` +1 可选位 `rememberApplied`(CC-181);决断落定后与桥重试臂的诊断留痕不再因宿主日志口抛错回流进决断;接入文档改口:server ≥7.100.0 上 park 行卡的 `requiresRealApproval` / `approvalIsMandated` 生效(CC-180,零代码改动);peer sdk 地板 `>=11.3.0` 不动;根公面 1235;§98)。上一版 0.82.5 = **patch**:只增不改 —— print 车道 init 帧工具面名册优先:流包装器 `withPrintInitFrame`(首选接法,init 恒为首行、其后按到达序)/ 判定闸 `createPrintInitGate` / 分类口 `printInitRosterSignal` / 判定口 `decidePrintInitToolFace` / 留痕措辞 `printInitToolFaceDebugLine` + 等待上界 `PRINT_INIT_ROSTER_WAIT_MS`(150 000);回落估计表补 `ListAgents`(7.30.0 及以后的引擎上与 `SendMessage` 同条件)(CC-169);peer sdk 地板 `>=11.3.0` 不动;根公面 1235;§97)。上一版 0.82.4 = **patch**:只增不改 —— park 行审批卡新增门类位 `irreversibleParkGate`(待决行门类恰为 irreversible_ask,今天即生效,门类事实不是保证);`requiresRealApproval` 在待决行顶层带时透传(就绪,待决列表带出后才生效,今天零行为变化)(CC-180);`ApprovalCardRequest` +1 可选位;peer sdk 地板 `>=11.3.0` 不动;根公面 1229;§96)。上一版 0.82.3 = **patch**:只增不改的公面 —— 自愈提示的「保住对话」出路槽 `keepSessionWayOut` 与交互面引擎决断入口开关 `engineDecidePath`(CC-177;两位都不给时措辞与 0.82.2 逐字节同);自愈结局两臂 +机读位 `pendingRowGone`(重开链证实待决项已不在);peer sdk 地板 `>=11.3.0` 不动;根公面 1229;§95)。上一版 0.82.2 = **patch**:只增不改的公面 + 若干行为订正 —— 新增措辞单源 `cloudEffectiveNotices`:云控制面有效配置回体的降级告警 / 预算 / 能力上限三读数(CC-164,四态,不读成 0 或「没有预算」);本机引擎 models 文档在宿主注入本机条目判定 `entryAccepted` 时补 `default` / `tierGroups` / `activeTierGroup`,剔掉会让本机整份拒收的目录引用与判定口不收的条目,去掉 registry 注记键 `origin` / `overridesTeam`(CC-165;结果新增 `modelRefIssues`);计划复核结局机读位 `_sema_planReviewOutcome`(CC-160 ①);停泊审批决断操作起止回调 `onDecideOperation` 与操作句柄 `openDecideOperation`(CC-160 ③);新增超集键 `_sema_planReviewOutcome`;peer sdk 地板 `>=11.3.0` 不动;根公面 1229;§94)。上一版 0.82.1 = **patch**:只增不改的公面 + 若干行为订正 —— 新增读口 15 个(续跑折叠码读口与措辞 / 文件历史捕获读口六口 / 模型身份可解析判据五口 / 自定义代理载荷作废重投口 / 决断失败码「门还在」判定)+ 宿主车道声明 `EmitContext.lane`;新增超集键 `_sema_response_model`(终帧 / 每轮用量)与 chrome 用量两臂 `responseModel`、重开判决 `_sema_decisionInFlight`、自愈结局两臂 `decisionInFlight`、内部臂 `_sema_denial_unclassified`、通知码 +1;行为订正:计划复核决断在飞不重开卡且自愈提示不再教人再决一次(CC-160 ②)、决断出口补折叠句且停泊腿不再把折叠 / 坏档误判已决(CC-154)、执行车道 `in-process` 措辞(CC-153)、`-p` 车道 Bash 良性退出与交互同判(CC-168)、`-p` 工具结果帧补结构化结果(CC-149)、被拒分类词两车道同判(CC-172)、非交互车道子代工具帧(CC-158,宿主声明车道才生效)、终帧被拒清单对账流内拒绝(CC-159)、自定义代理载荷作废重投(CC-161);peer sdk 地板 `>=11.3.0` 不动;根公面 1228;§93)。上一版 0.82.0 = **minor**:只增不改 —— 新增只读读口 17 个 + 1 常量、工具名册行一格 `mountedBy`、turn 错误判决 `http` 臂一格 `storedRowWhere`:`/rewind` 代码档与对话档能不能用由引擎能力位回答(CC-146)、云控制面额度读数三分(CC-150)、装配期「这一条腿有没有手」(CC-152)、续跑拒收按原码判(CC-154);两处既有面行为订正:自动模式分类器拒的类别词由 `permission-rule` 改为 `automode-*` 三词(CC-155,订正 0.81.1)、续跑上下文读不出时引擎点名的那一行不再丢(CC-156);0.81.0 预告的 23 键 + 1 子型删改**改到 0.83.0**(§92y ㉙);零 wire 键、零投影臂;peer sdk 地板 `>=11.3.0` 不动;§92。上一版 0.81.1 = **patch**:被拒分类词读器加第③路(CC-148):引擎「没问过就拒」的工具调用(deny 规则 / 权限模式 / hook / 分类器 / 写保护 —— 无 `settlement` 只有 `gate.disposition.deniedBy`)在 user 工具结果记录与终帧 `permission_denials[]` 上此前恒缺 `_sema_denial_kind` / `toolDenialKind`,现按层名落 `permission-rule`(其中「分类器」一项已由 0.82.0 CC-155 订正)(`ask_resolution` 无结算 / 结算段不成形 / 层名表外仍缺席不猜);交互与 `--print` 两条车道同一只读器;另钉终帧两臂 `_sema_effective_*` 键集不变量 —— 成功臂展开单铸函数、错误信封显式重发,覆盖性钉在返回对象自己的类型上(漏键 / 多键编译期即红)+ 门格判两臂键集相等且值逐字节同,给单铸函数加键时错误臂不会再静默少键(本版无键增减);零 wire 键、零投影臂、根公面 1195;§91。上一版 0.81.0 = **minor**:CC 形消息一张脸(C-R85 / CC-131):user 工具结果记录加 SDK 面键 `tool_use_result`(与过渡键 `toolUseResult` 同引用,删驼峰原定 0.82.0、已改到 0.83.0)+ DS-19 普查门升硬门(键集按语法解析、按 type/subtype 分表;23 键 + 1 子型过渡表到期窗原为 0.82.0、已改到 0.83.0,零常驻豁免)+ CC-145 `/rewind` both 臂改发 `restoreFiles:true`、`projectRewind(pending)` 单参;零 wire 键、零投影臂、根公面 1195;§90。上一版 0.80.2 = **patch**:`conflict.resume_context_unavailable` 的 `staleAfterSec` / `runId` 在真 SDK 上读不到(CC-137:sdk 11.1.0 起 `APIError` 把体上非具名键收进 `extra`,这一码映射成 `ConflictError` 无具名位,读口只读顶层 ⇒ 真调用链恒缺席)⇒ 体源结构位改「顶层有效值优先、`extra` 兜底」三只类型化读口单铸,有具名子类位的三处(`retryAfterSec` × 2 / `allowlist`)行为不变只多兜底,头源 `retryAfterMs` 只读具名位;零 wire 键、零投影臂、根公面 1195;§89。上一版 0.80.1 = **patch**:去键重发判据句按「铸」计(CC-143;§87「带键的体恰一次」作废 → 被铸恰一次,POST 几次随传输层)+ 接入文档段落自带射程限定词自 §88 起向前执法 + 模型预设表 deepseek 项改闭集真名 deepseek-flash(CC-144,C-R82 ①)+ 门里 git 兜底自陈探针(CC-142);零 wire 键、零投影臂、根公面 1195;§88。上一版 0.80.0 = **minor**:🔴 peer sdk 地板 >=11.2.1 → >=11.3.0 + 策略拒的归因上 wire(CC-133:发送面 deny+policy 带 settledBy / 读侧 policy_refused 十三词入 CC 规则桶 / 三错误码读口 / 直连门去键重发恰一次)+ 删除规则后果句归包(CC-132)+ /mcp 详情卡两腿分说归包(CC-134:六档读口 + 九句铸点,同批改口八处说满的话)+ 🔴 终帧旧拼法 `structuredOutput` 按 0.79.1 的宣告删除(只剩 CC 形 `structured_output`);根公面 1195;§87。上一版 0.79.1 = **patch**:终帧结构化产出同帧铸 CC 形 `structured_output`(旧拼法 `structuredOutput` 过渡一版,0.80.0 删;CC-130)+ 写审批 `argsOmitted` 退化卡在无受护写入部署形上重新解得出路径(CC-129)+ 云控制面十值二型经本包第二个入口 `@sema-agent/client-core/registry` 原样转口(根入口零变;CC-128 ①);根公面 1184;§86。上一版 0.79.0 = **minor**:server 7.93.0 过境批 —— peer sdk 地板 >=11.2.1 + 写口回执第六臂 unverified 与 503 体 committed 分臂(CC-124)+ 无 run 可读的 MCP 状态面(CC-74)+ 审批卡 mandated 位(CC-110)+ 请求装配第三车道 utility 与 approverPosture / maxTokens / outputRetries 三键 + print 车道 model 座(CC-116 / 118 / 123)+ 拒因两面分铸与四个机读位(CC-125)+ 模型轮边界划消息界(CC-126)+ 委派结果人类面读口按来源声明体内定位(CC-127)+ sdk 转口三件(CC-128)+ 通告码 memory.project_scope_absent(CC-122);公面 1184;§85。上一版 0.78.2 = **patch**:门的棘轮登记数字单真源 —— 五只门十一格棘轮 + 218 条沿革账搬进 scripts/registry.json、门只读不抄、负控改篡改登记物、下调通道 RATCHET-SLACK、新门 run-registry-test(CC-79 第一期)+ 两格存量松量收掉 + submit-wiring-manifest 门补 count===1 边界格;src 零改动,dist 逐字节同 0.78.1;公面 1154;§84。上一版 0.78.1 = **patch**:两辆并行车收货 + 三张跟进票 —— displayBody 人类面读口 + 围栏解析头尾配对收紧(CC-113)/ MCP 两处「没报」措辞分句(CC-115)/ 记忆治理面五动词调用口(CC-97 b)/ 非流式提交回执接线回执读口 readSubmitWiringManifest(CC-121)/ 三份失败判官抛出物读取收口(CC-119);公面 1154;§83。上一版 0.78.0 = **minor**:peer sdk 地板 >=9.8.1 → >=11.0.1(CC-106)+ 单步写口 200 体按 stillLive 判别联合改读、第五臂 revoked、三型取自 sdk、RulesFacade.write 必填、PersistedRuleLiveness 转口(CC-103)+ DeniedBy 第十词 read_boundary 专句(CC-106 ④)+ excludeAllTools 车道行;型面 BREAKING 三处、行为面同 0.77.2;公面 1143;§82。上一版 0.77.2 = **patch**:出包面结构卫生 —— 构建期 removeComments,dist js / d.ts 零注释(新门 run-dist-comments-test.mjs + 卫生门词表 32 条 + 文档向前执法;CC-100)+ gateDeniedByDetail 表外词兜底句改「本版不认识这个层名」(CC-111 ①);行为 / 型面逐字节同 0.77.1;公面 1143;§81。上一版 0.77.1 = **patch**:外部验收三件回填 —— 读器族边界残留 projectMcpReconnectCapability 只认自有键(CC-107)/ rewind 四子键恰读一次(CC-108)/ 子代输出合并按回体 output.type · retrieval_status 定处置(CC-109,server ≥7.92.0 cursorSemantics 缺席面);型面 additive 一处;公面 1143;§80。上一版 0.77.0 = **minor**:请求装配逐键去向回执 + print 车道补座 + 表外键响亮拒(CC-101,四条行为 BREAKING)/ 会话策略写端口(CC-105)/ 持久规则单步写面(CC-103)/ workflow 子代面板行代际三向恢复(CC-104,零改码)/ 能力位读器族口径整族改齐 + 外部验收 F-A / F-B 处置 + 合并树异源复审两轮处置;公面 1143;§79。上一版 0.76.2 = **patch**:制品卫生 —— 清 dist 重 build 去掉两只已撤出源码的编译产物 + dist ⇄ src 对账门;零源码 / 零型面 / 零行为改动;公面 1122;§78。上一版 0.76.1 = **patch**:能力位读器工厂(CC-75)/ MCP 活性观察读口(CC-36)/ `capabilities.peerLane` · `permissionRulesWrite` 四态读口(CC-102)/ 记忆治理面两只读口 + 三只条目面回体读口(CC-97 a)/ 主车道证明逐次新建(CC-99)+ 修 0.76.0 的 F1 / F2(身份四键一次性快照只修了投影口一侧);公面 1122;§77。上一版 0.76.0 = **minor**:六票一批 —— `prompt_assembled` 投影臂 / 审批 feed 三态(**型面 BREAKING**)/ `ApprovalResolution` 单源联合 / 记忆 spec 读口 / 终态词表上游钉 / `tasks_expand` 退役(**型面 BREAKING**),外加身份四键一次性快照(跨全部内部臂);公面 1081;§76。上一版 0.75.1 = **patch**:面板短命子代反序缓行放不出的残洞(外部复验 D1)+ 同代 running 帧三向定形(B4)+ #969 提货 `spawnName` 透传与 `agentType` 改读诚实来源(CC-95);§75。上一版 0.75.0 = **minor**:压缩的非 compacted 结局上 chrome 面 `compaction_outcome`(新内部臂 —— 自建 print 出口的端先表态)+ peer sdk 地板 `>=9.8.1`;型面 additive(ChromeEvent +1 臂)、公面 1065、零 wire 新键;§74。上一版 0.74.5 = **patch**:core 7.24.0 提货 `_sema_freed_tokens?` + 首见即终态的行零事件(幽灵完成行)+ `isNewEngineAgentPanelCycle` / `approvalOutcomeNoteOf` 上公面;型面 additive、公面 1065、peer 不动;§73。上一版 0.74.4 = **patch**:面板键「先发布的键为准」(tick 归不了一的三序不再两行)+ 前代 UUID 迟到 tick 丢弃 + `readRunCancelContext` 下钻收紧;型面 additive、公面 1061、peer 不动;§72。上一版 0.74.3 = **patch**:面板子代身份归一(tick / end 的 UUID 归到 fleet 尾段,宿主零改)+ run 记录 `cancelContext` 读口与成因四词 + workflow 行 `errorCode` + reopen 第二臂两件;型面纯 additive、公面 1061、peer 不动;§71。上一版 0.74.2 = **patch**:`capabilities.deviceExecutor.management` 四态读口(缺席 ≠ false;`deviceExecutor: false` = 车道缺席;管理动词可用性三态归包);公面 1052;§70。上一版 0.74.1 = **patch**:审批卡无决断收口 + 结局回交;§69。上一版 0.74.0 = **minor**:peer sdk 地板 >=9.7.1 + covers 过境 + 面板周期身份 + 离场读口;§68。上一版 0.73.5 = **patch**:workflow 规模告警判定上收进包(`evaluateWorkflowSize` 三态:未知的规模不当作规模正常;分母口径与帽优先级单源;env 读口纯函数);型面纯 additive、公面 1044、peer 不动;§67。上一版 0.73.4 = **patch**:终帧 `permission_denials` 第三键 ⇐ 同一条流 `tool_start` 入参按 `toolCallId` join(三道闸;join 不上留 sema 载体;🔴 更正 0.73.2「自动升级收口」一句)+ 审批 feed push 侧取件失败的欠账退避重试;型面纯 additive、公面 1033、peer 不动;§66。上一版 0.73.3 = **patch**:CC-61 sdk 9.7.1 提货 + `capabilities.approvalsStreamLive` 四态读口(缺席 = 判不出;`livePendingNeedsReconcile` 只在引擎明说会推时才让对账节拍降兜底)+ CC-60 五条模型面文案锚包侧半场(cursorSemantics 机读位 / result 行注记 / bash 首行两变体与良性槽 / 通知 seed 并集 / parked 臂);型面纯 additive、公面 1032、peer 不动;§65。上一版 0.73.2 = **patch**:CC-59 悬挂 ask 全卡 —— `livePending[].frame`(server ≥7.87.0)两道闸窄读进视图,在场即走流内帧腿同一条路(入参可见、改写可转发),缺席保持盲卡;CC-34 收口(引擎半场随 7.87.0 到货,判据交黑盒);型面纯 additive、公面 1026、peer 不动;§64。上一版 0.73.1 = **patch**:CC-57 `decidePlanReview` outcome 尾句按「决断有没有生效」四态选(单铸点 `planReviewOutcomeTail`;此前本地拒发仍让模型汇报已拒绝)+ CC-56 cancel 的 409 按机器码分家(`cancelConflictFromError` 三形 / 新安全码 `cancel_run_not_running`)与提交面 429 用量窗读口 + 人话;型面纯 additive、公面 1026、peer 不动;§63。上一版 0.73.0 = **minor,型面 BREAKING**:fleet 视图八个数值键改可选 —— CC-52 `FleetTaskView.elapsedMs` / `tokens` / `queuedCount` 与 `FleetWorkflowView.doneCount` / `totalCount` / `failedCount` / `tokens` / `elapsedMs` 不再 `?? 0`(有键 = 真值含真 0,缺键 = 不知道;逐键缺席语义见 §62b)+ 台账补偿链无基数不铸;公面导出名零增减 1019、零 wire 变化、peer 不动;§62。上一版 0.72.14 = **patch**:悬挂的流内 ask 拉半场 —— CC-55 `startApprovalsFeed` 快照加 `livePending` 段并进变化摘要(键缺席 = 未报,不铸空)+ 视图 / 去重账 / 与流内帧腿同链的决断口(入参不可见上卡明说、改写不转发)+ 宿主闸对账节拍 + 待决计数读口(不知道 = null);型面纯 additive、公面 1019、peer 不动;§61。上一版 0.72.13 = **patch**:server 7.86.0 提货 —— CC-46 plan_review `permissionModeAfter` 发口(三选卡双闸:宿主声明只读起步 ∧ 引擎 ≥7.86.0;400 field_conflict 两种处置)+ CC-54 `capabilities.executionLane` 四态读面(键缺席 ≠ 不是本机车道;`toolsRunHere` 判据归包)+ CC-53 detach 版本闸三态;型面 additive(另撤回 0.72.12 的主通道 `absent` 臂,改独立缺席订阅口)、公面 1011、peer 不动;§60;**预告 0.73.0 BREAKING**:fleet 视图数值键改可选。上一版 0.72.12 = **patch**:「缺席被折成正向终态」按类清剿 —— CC-50 M1 头条(fleet 行缺席改发 `absent` 不再铸 `end{isError:false}`)+ 六站一次改齐(缺席 ⇒ `unknown`)+ 结果边界 fail-closed 取舍 + `_sema_outcome` + `Outcome unknown:` 行 + CC-51 M6(default 臂不再谎报 running)+ 普查门 + DS-06;型面 additive、公面 993、peer 不动;行为面三处真变化见 CHANGELOG 取舍段;§59。上一版 0.72.11 = **patch**:core 7.23.0 提货 —— CC-49 通告码 66 → 67 `config.write_protection_unresolved`(operator;兄弟码 `target_view_absent` = 没有视图,这枚 = 有视图解析不出)+ `permission_denials` 自动升级腿通电(`gates[].toolCallId` ⇒ `tool_use_id`;CC-34 引擎半场);型面零变化、公面 989、peer 不动、devDep core ~7.23.0;§58。上一版 0.72.10 = **patch**:CC-41 leader run 终局 `needs_human` + `result.conflict` 三形读面(none 缺席不可分 / unreadable 在场读不懂 / conflict;`salvaged[]` 原样给落盘口;措辞单源不提重试);型面纯 additive、公面 989、peer 不动;§57。上一版 0.72.9 = **patch**:server 7.85.0 提货 —— CC-30 会话内 MCP re-dial 消费口(`reconnectMcpServer` 三态 / unsupported 恒五键 / 交易文案单源)+ CC-39② memory-status `autoConsolidationArmed` 三态 + CC-45 resume 补充句渲保留秒数;型面纯 additive、公面 985、peer 不动;§56。上一版 0.72.8 = **patch**:清账三票 —— `memory:"off"` 请求键(CC-39③,server 7.84.0 S-405)+ `runStream` 第二条中性臂 `Model output error:`(CC-43)+ 注入件撞活 run 自动 steer 零卡(CC-44);型面纯 additive、公面 977、peer 不动;§55。上一版 0.72.7 = **patch**:core 7.22.0 提货 —— 通告码 66 `mcp.server_redialed` + 读器 `readMcpServerRedialed` + `wiring_manifest.readDeny` 第九段 `_sema_readDeny`(缺席 = 没有内置行判这条腿);型面纯 additive、公面 971、peer 不动、devDep core ~7.22.0;§54。上一版 0.72.6 = **patch**:cli L-379 包侧半场 —— `steerFollowIntent` steer 后续听意图三态(tail / after-decision / after-wake)+ `activeRunSelfHealRow` 续听声明第五参;型面纯 additive、公面 969、peer 不动;§53。上一版 0.72.5 = **patch**:server 7.82.1 提货 —— `capabilities.webSearch.backend` 部署默认 WebSearch 后端四态读面(键缺席 = 老引擎判不了 ≠ `none`);型面纯 additive、公面 968、peer 不动;§52。上一版 0.72.4 = **patch**:core 7.21.x 三件经 server 7.82.0 提货 —— `wiring_manifest.autoConsolidation` 第八段 `_sema_autoConsolidation`(缺席 = indeterminate 不折 false);型面纯 additive、公面 962、peer 不动;§51。上一版 0.72.3 = **patch**:core #863 记忆单系统半场 ① —— `projectAgentsForWire` 投影 `agents[].memory`(user|project|local 三词同映射引擎平面 agent:<type>);型面纯 additive、公面 962、零 wire 新键、peer 不动;§50。上一版 0.72.2 = **patch**:workflow 视图两票 —— `LiveWorkflowController.resolution()` 六态(snapshot() 的 null 三义拆开)+ `noteOwnWorkflowRun` own 台账同拍登记;型面纯 additive、公面 961、零 wire 键、peer 不动;§49。上一版 0.72.1 = **patch**:server 7.80.1 提货 —— 409 `conflict.resume_context_unavailable` 结构读数(`staleAfterSec` / `runId`;sdk 9.6.0 尚未带键,经 sdk 今天恒缺席)+ `SkillSpec.baseDir`(只在本机车道带);型面纯 additive、公面 960、peer 不动;§48。上一版 0.72.0 = **minor**:型面 BREAKING —— 39 个零消费导出退出公面(CC-32 退役批,[7419] §45 预告 / cli [7422] 同意 / web-client·desktop 过节拍沉默 = 同意;名单见 §47a S-1);运行期零 BREAKING、公面 956、peer 不动、devDep core ~7.20.1;随批:已退役名账 `removed` + export-liveness 门 G 段 + 冻结账门 ⑧c;§47。上一版 0.71.4 = **patch**:core 7.20.1 提货 —— `ENGINE_NOTICE_CODES` 65 + `wiring_manifest.writeProtection` 第七段 `_sema_writeProtection`;型面纯 additive、公面 995、peer 不动、devDep core `~7.20.1`;§46。上一版 0.71.3 = **patch**:门体系清账批 —— CC-24 export-liveness 门 + 39 个导出退役预告(0.72.0 删,表态制)/ CC-26 `as unknown as` 铸链棘轮 / CC-25 冻结账门 ⑧ 段 / CC-06 B-081 包侧半场(终帧 `_sema_effective_reasoning` / `_sema_effective_memory_scopes` + resume reopen 族 + `routePairingVerdict`);型面纯 additive、公面 986 → 995、peer 不动;§45。上一版 0.71.2 = **patch**:接入方验收两票归包 —— CC-28 B-132 decide 拒体三句去内部车道词 / CC-29 B-133 committedUuids 唯一性(重复 ⇒ 形 f);零型面变化、公面 986、peer 不动;§44。上一版 0.71.1 = **patch**:接入档打回修正 —— CC-27 `ApprovalCardRequest.readRootCandidate?` 帧→卡透传位 + 新导出型 `ReadRootCandidateView`;型面纯 additive、公面 986 不变、peer 不动;§43。上一版 0.71.0 = **minor**:型面 BREAKING 六件 —— peer sdk 地板 >=9.6.0 + agent-types >=0.3.0 / `SkillsListingTruncatedFactsView` 删 `requestedBudgetBytes?`·`laneClamped?` / `WiringManifestMcpEntry` → `WiringManifestMcpEntryView` / `MAX_AGENT_SKILLS` 删 / `decide.workflow_host_not_parked` 退役;运行期零 BREAKING。内容:core 7.20.0 提货(闭集 +5 六十四码)/ 🔴 CC-16 `text_segment_end.committedUuids[]` / CC-08 全五件(tool_disclosure / tool_progress 两 chrome 臂、wiring_manifest tools·hooks·lsp 进切片、tool_roster_delta 接上、context_usage 进切片、`readRootCandidate` 镜像)/ CC-19 `mcpEngineLegPresence` 归包 / CC-20 not_parked clean-cut;公面 986;§42 / 42y 八条)|
23
+ | peer:wire 契约 | `@sema-agent/sdk` **>=11.3.0**(value-level,非 type-only;**0.80.0 抬版**:11.3.0 在两条回决口体上声明 `settledBy?: "policy"`、`Settlement.kind` 第十三词 `policy_refused` 与三错误码;0.83.0 / 0.83.1 / 0.83.2 / 0.83.3 / 0.83.4 / 0.83.5 / 0.83.6 不动。此前 **0.79.0 曾抬到 >=11.2.1**:11.2.x 声明 `capabilities.mcpProbe`、`mcpCapabilities` / `probeMcp` + `McpProbeFace`、写回执第三支 `stillLive: "unknown"`,11.2.1 再补 `TaskRequest.approverPosture` 与审批帧键 `mandated`(型面 + 运行期键锚),本包按 11.2.1 编译,11.0.1 失去物料见证;**0.78.0 曾抬到 >=11.0.1**:11.x 声明 `DeniedBy` 第十词 `read_boundary`、`rules.write` 200 体按 `stillLive` 判别联合、`RemovalLiveness` / `RuleWriteRequest` / `RuleWriteResult` / `RuleWriteBehavior` 包根导出、`TaskRequest.excludeAllTools`,本包按 11.0.1 编译,9.8.1 失去物料见证;**0.75.0 曾抬到 >=9.8.1**:9.8.x 声明 `Capabilities.deviceExecutor.management?`,9.7.1 失去物料见证;**0.74.0 曾抬到 >=9.7.1**:9.7.x 追平的六处型面是本包 0.73.3 起的编译基线,且 9.6.0 失去物料见证;**0.71.0 曾抬到 >=9.6.0**:`tool_disclosure` / `tool_progress` 两帧型与 `ToolApprovalFrame.readRootCandidate` 自 9.6.0 起;0.69.0 曾抬到 >=9.4.0(`reasoning_end` / `lastLegMcp`),0.60.0 抬到 >=8.4.0;地板由 `scripts/run-sdk-floor-test.mjs` 的 `FLOOR` 与 public-surface 门 C-CC-3「不低于见证到的最低实装版」双钉)| `package.json` `peerDependencies` |
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
- | 公开导出面 | **1277** 个运行期符号(+ **59 个测试钩,两种拼法**:35 个 `__*ForTests` + 24 个单下划线开头(22 个 `_*ForTest` + `_resetLiveQuestionStore` / `_resetUltracodePreset`) —— 两种都在 `public-export-baseline.json` 的 `testHookNames` 里、各自受棘轮管,**不在** `names` 的 1277 里。运行期 `Object.keys(dist/index.js)` 的全量 = 1277 + 59 = **1336**;只剔双下划线那 35 个会多数出 24 个来,那不是棘轮盲区;最简单的剔法是去掉所有以 `_` 开头的名字(公面运行期名没有一个以 `_` 开头);= 下一版(未发布)的值:相对 0.75.1 **+16**,两票合计 —— **CC-77 ①** 审批决断结局单源判别联合 6 件:`approvalResolutionOf` / `isApprovalDecided` / `approvalNotSentCause` / `approvalUnsettledCause` + 两张 cause 词表 `APPROVAL_NOT_SENT_CAUSES` / `APPROVAL_UNSETTLED_CAUSES`(域 3);**CC-96** 记忆 spec 读面 10 件:`readAgentMemorySpec` / `unknownMemorySpecKeys` / `unknownMemorySpecKeysNote` / `memoryConfigRefusalNoteOf` / `KNOWN_AGENT_MEMORY_SPEC_KEYS` / `PENDING_MEMORY_SPEC_KEYS` / `MAX_UNKNOWN_MEMORY_SPEC_KEYS` / `CONFIG_MEMORY_PROJECT_KEY_SPELLING` / `CONFIG_MEMORY_WRITE_SCOPE_MISMATCH` + 判别形型(域 6 / 16)。CC-89 / CC-91 / CC-92 / CC-98 四票**零值导出增减**(新臂走 `ChromeEvent` 联合与内部臂表,`tasks_expand` 退役删的是联合成员不是导出名);1065 = 0.74.5 / 0.75.0 / 0.75.1 的值:相对 0.74.4 +4 —— `isNewEngineAgentPanelCycle`(CC-87,域 4)+ `approvalOutcomeNoteOf` 与两句固定文案常量(CC-88,域 3);1065 = 0.74.5 / 0.75.0 的值:相对 0.74.4 +4 —— `isNewEngineAgentPanelCycle`(CC-87,域 4)+ `approvalOutcomeNoteOf` 与两句固定文案常量(CC-88,域 3);1061 = 0.74.3 / 0.74.4 的值:相对 0.74.2 +9 —— CC-70 / CC-71 / CC-72 / CC-73 八件 + CC-80 `lastFlagValue`,见 §2b 域 3 / 4 / 10 / 15;1052 = 0.74.2 的值:相对 0.74.1 +6 —— CC-69 六件,见 §2b 域 9;1046 = 0.74.1 的值:相对 0.74.0 +1 —— `RETRACTED_CARD_DECISION_KIND`,见 §2b 域 3;1045 = 0.74.0 的值:相对 0.73.5 +1 —— `isStaleEngineAgentPanelEnd`,见 §2b 域 4;1044 = 0.73.5 的值:相对 0.73.4 +11 —— CC-58 规模告警十一件,名单见 §2b 域 12;1033 = 0.73.4 的值:相对 0.73.3 +1 —— `TOOL_INPUT_JOIN_MAX_CALLS`,见 §2b 域 1;1032 = 0.73.3 的值:相对 0.73.2 +6 —— CC-61 六件,名单见 §2b 域 9;1026 = 0.73.2 的值(导出名零增减);= 0.73.1 的值:相对 0.73.0 +7 —— CC-56 六件 / CC-57 一件,名单见 §2b 域 3 / 15;1019 = 0.73.0 的值(导出名零增减,BREAKING 在类型面);= 0.72.14 的值:相对 0.72.13 +8 —— CC-55 八件,名单见 §2b 域 3;1011 = 0.72.13 的值:相对 0.72.12 +18 —— CC-46 八件 / CC-54 六件 / CC-53 两件 / CC-50 缺席口两件,名单见 §2b 域 3 / 4 / 9 / 10;993 = 0.72.12 的值(测试钩 45):相对 0.72.11 +4 —— CC-50 `OUTCOME_UNKNOWN_ROW_PREFIX` / `isOutcomeUnknownRowText` / `TASK_NOTIFICATION_TERMINAL_STATUSES` / `isTaskNotificationTerminalStatus`;989 = 0.72.10 的值:相对 0.72.9 +4 —— CC-41 `LEADER_RUN_STATUSES` / `LEADER_REJ_HEAD_DISPLAY_MAX` / `projectLeaderConflict` / `leaderConflictDetail`;985 = 0.72.9 的值:相对 0.72.8 +8 —— CC-30 `MCP_RECONNECT_OUTCOMES` / `MCP_RECONNECT_TRANSACTION_NOTICE` / `projectMcpReconnectResult` / `classifyMcpReconnectFailure` / `reconnectMcpServer` / `projectMcpReconnectCapability` / `mcpReconnectOutcomeDetail`、CC-39② `readAutoConsolidationArmed`;977 = 0.72.8 的值:相对 0.72.7 +6 —— CC-39③ `MEMORY_OFF` / `memoryOffDeclarationField` / `memoryOffDeclared`、CC-43 `MODEL_OUTPUT_ERROR_PREFIX` / `isModelOutputErrorText` / `isModelOutputErrorRowText`;971 = 0.72.7 的值:相对 0.72.6 +2 —— CC-42 core 7.22.0 提货 `MCP_REDIAL_OUTCOMES` / `readMcpServerRedialed`;969 = 0.72.6 的值:相对 0.72.5 +1 —— CC-40 `steerFollowIntent`;968 = 0.72.5 的值:相对 0.72.4 +6 —— CC-31 server 7.82.1 提货 `capabilities.webSearch.backend` 四态读面:`WEB_SEARCH_BACKEND_NONE` / `projectWebSearchBackendCapability` / `observedWebSearchBackend` / `noteEngineCapsForWebSearchBackend` / `forgetWebSearchBackendReading` / `webSearchBackendDoctorDetail`;962 = 0.72.3 的值:相对 0.72.2 +1 —— CC-39① `AGENT_MEMORY_WORDS`;0.72.2 相对 0.72.1 +1 —— CC-37 `noteOwnWorkflowRun`;0.72.1 相对 0.72.0 +4 —— CC-33 server 7.80.1 提货:`RESUME_CONTEXT_UNAVAILABLE` / `resumeContextUnavailableFromError` / `resumeContextUnavailableContent` / `skillBaseDirOf`;0.72.0 相对 0.71.4 −39 —— CC-32 退役批删 export-liveness 登记 retire 的 39 个零消费导出(23 常量 + 16 函数,名单见 §47);995 = 0.71.3 的值:相对 0.71.2 +9 —— CC-06 `readEffectiveReasoning` / `readEffectiveMemoryScopes` / `resumeReopenFromError` / `resumeReopenContent` / `routePairingVerdict` 五函数 + `RESUME_REOPEN_CODES` / `RESUME_ENV_FAILED` / `RESUME_TOOL_UNAVAILABLE` / `RESUME_TOOL_CONTRACT_MISMATCH` 四常量;986 = 0.71.0 的值:相对 0.70.2 −`MAX_AGENT_SKILLS` −`DECIDE_WORKFLOW_HOST_NOT_PARKED` +`projectToolRosterDelta` +`mcpEngineLegPresence`;986 = 0.70.0 的值:相对 0.69.2 **一件 additive(`readSkillsListingTruncated`,§39)、零删除**;985 = 0.69.2 的值:相对 0.69.1 **三件 additive、零删除**(CC-13 `isSubFlowSegmentEnd` / `SEGMENT_END_IDENTITY_KEYS` / `droppedWhySentence`,§38);982 = 0.69.0 未发布版的值(原排 0.68.3,因 peer 地板抬升改 minor)= 相对 0.68.2 **十七件 additive、零删除**:`fetchMcpPanel`(CC-03 补件,§36e)+ `readWorkflowResumeAdmissionIncomplete`(CC-05 core 7.18.0 #755)+ `installCoreValuePorts`/`hasCoreValuePorts`/`hasCoreValuePort`/`coreValuePortMisses`/`CORE_VALUE_PORT_NAMES` + 十读口(CC-07 core 值级端口,§36d);0.68.2 相对 0.68.1 十三件 additive:`SEMA_SEGMENT_ID_KEY`(CC-01 段身份键,§35f)/ `projectMcpPanel`+`mcpPanelLastLegDetail`+`projectMcpSection`(CC-03 `/mcp` 面板读视图,§35g)/ `resolveTextSegmentAuthority`/`createTextSegmentLedger`(L-318 `text_end` 权威段替换的判决单源 + print 形段账,详见 §35b/§35c)/ `memoryCaptureDeclarationField`/`MEMORY_CAPTURE_OFF`(L-316 会话级隐私声明的字面唯一铸点,§35d)/ `engineUrl`/`probeHealth`(L-61 件④ SDK 纯工具面原样转口,§35d)/ `AgentClient`/`isApprovalRequestFrameV1`/`isApprovalRevokeFrameV1`(L-61 存量清零:SDK **wire 面**原样转口,§35e)。`0.68.1`/`0.68.0` 是 **952**,那批是相对 0.67.2 **二十件 additive、🔴 两件删除(BREAKING)**:additive = `TERMINAL_CAUSE_KINDS`/`isTerminalCauseKind`/`RUN_TERMINAL_NOT_SUCCESS_STATUSES`/`RUN_TERMINAL_STATUSES`(L-247 终态词两表分源,详见 §33b)/ `SEMA_SUBAGENT_USAGE_PARTIAL_KEY`/`subagentUsageIsPartial`(L-244 子代下界位自有名,§33g)/ `ASK_UNRESOLVABLE_CAUSES`/`readAskUnresolvable`/`DURABLE_MANDATE_SOURCES`/`readDurableGateUnavailable`(core 7.17.0 #709 ①② 两只通告事实窄读器,§33c)/ `WORKFLOW_PARK_TRUTH_UNREADABLE`/`WORKFLOW_PARK_NOT_PENDING`/`WORKFLOW_PARK_BINDING_BROKEN`/`WORKFLOW_PARK_REQUIRES_RUN_STORE`(四个单码常量 🔧 0.72.0 退役)/`WORKFLOW_PARK_REFUSAL_CODES`/`isWorkflowParkRefusalCode`/`readWorkflowParks`(core 7.17.0 #652 park 真相四码 + parks 三键读器,§33d)/ `ENGINE_STOP_REASONS`/`engineStopReasonToCc`(L-246 A13 停止原词映射下沉,§33g)/ `readCancelRequested`(L-230 读面,§33f);🔴 **删除两件** `TERMINAL_NOT_SUCCESS_STATUSES`/`TERMINAL_STATUSES`(随 L-247 两表分源更名成 `RUN_TERMINAL_*`,clean-cut **不留别名** —— 留一个别名等于让端可以继续按合起来的那张表读,分源就白做了,详见 §33b)。`0.67.0` 是 **934**,那批是相对 0.66.0 **七件 additive、🔴 两件删除**:additive = `CLASSIFIER_DENY_CAUSES`/`isClassifierDenyCause`/`classifierDenyCauseOf`/`classifierDenyCauseDetail`(core 7.14.0 退役 `classifierUnavailable` 之后的**拒绝面**继任读器与措辞,详见 §32b)/ `RULE_STORE_UNREADABLE_KINDS`/`isRuleStoreUnreadableKind`/`ruleStoreUnreadableDetail`(core 7.14.0 #688 C3 的规则店机制位三件,详见 §32d);🔴 **删除两件** `classifierUnavailableOf`/`classifierUnavailableDetail`(随 core 7.14.0 的 Retired keys 表整族退役,clean-cut 不留别名,详见 §32b;同批删的还有**型** `ClassifierUnavailableView`、卡位与帧位 `classifierUnavailable`、以及一条恒真的型面钉 `_askOriginWordsPin`)。`0.66.0` 是 **929**,那批是一件 additive、零删除:`readRunCostFacts`(终局成本事实的唯一读器:`costBreakdown` / `nested` 窄读 + 对账三段与两个判别位,终帧超集键与 chrome 对账臂共用它;详见 §31c);已发的 **0.65.x 十一件 additive、两件删除**:additive = `DECIDE_WORKFLOW_HOST_UNKNOWN`/`DECIDE_WORKFLOW_HOST_NOT_PARKED`/`DECIDE_WORKFLOW_REMEMBER_UNSUPPORTED`/`DECIDE_WORKFLOW_LANE_CODES`/`readDecideReceipt`/`decideAcceptedNotResolved`/`decideRefusalFromError`(B-070 `/decide` 回执读面与三码人话,详见 §30h)/ `TERMINAL_NOT_SUCCESS_STATUSES`/`isTerminalNotSuccess`/`TERMINAL_STATUSES`/`isTerminalStatus`(L-215② 终局词汇单铸谓词,详见 §30j);🔴 **删除两件** `AUTO_MODE_BREAKER_CAUSES`/`classifierBreakerOf`(熔断族随 core 7.12.0 的 Removed(BREAKING) 整只退役,clean-cut 不留别名,详见 §30k②;同批删的还有**型** `ClassifierBreakerView` 与 `ClassifierStatusView.breaker` 一位)。`0.64.2` 是 **919**,那批是一件 additive、零删除:`readDenialLimitFallback`(限额回落卡的窄读器上公面,壳侧同判据副本退役,详见 §29③);`0.64.0` 是 **918**,那批是件①+件② 十三件 additive、零删除:`CLASSIFIER_STATUS_STATES`/`classifierBreakerOf`/`classifierStatusOf`/`classifierStatusDetail`(分类器状态面,详见 §28②)/ `THINKING_FORMATS`/`THINKING_FORMAT_WIRE_TWINS`/`THINKING_DISABLE_PROBE_ORDER`/`MODEL_PROBE_VERDICTS`/`PROBE_PROMPT`/`PROBE_MAX_TOKENS`(两个探针常量 🔧 0.72.0 退役)/`probeRequestBody`/`probeModelCapability`/`applyProbeToEntry`(模型思考能力探测,详见 §28①);`0.63.0` 是 **905**,那批是八件 additive、零删除:`projectServerGateKnobs`/`postureKnobSourceOf`/`postureSourceIsOperatorPinned`/`postureKnobDetail`/`POSTURE_SOURCE_WORDS`(S-178 三根 posture 旋钮读数,详见 §27b)/ `PERSISTED_RULE_BEHAVIORS`/`PERSISTED_RULE_BEHAVIOR_UNKNOWN`/`persistedRuleBehaviorOf`/`persistedRuleBehaviorLabel`/`revokeTargetFromPersistedRule`(三态规则身份,§27c)/ `engineIdentityOf`/`engineIdentityVerdict`/`engineIdentityChanged`/`engineIdentityChangedBy`/`ENGINE_IDENTITY_ANCHORS`(S-179 代际锚,§27d)/ `GATE_DENIED_BY_WORDS`/`gateDeniedByDetail`/`ASK_ORIGIN_WORDS`/`askOriginDetail`(门词汇 +2,§27e)/ `PERMISSION_RULE_ISSUE_CODES`/`RETIRED_PERMISSION_RULE_ISSUE_CODES`/`permissionRuleIssueDetail`(规则 lint 码表,§27f)/ `projectToolRoster`/`toolRosterNames`/`toolShimFromRoster`/`applyToolRosterDelta`(L-161 工具名册,§27g)/ `ENGINE_NOTICE_CODES`/`ENGINE_NOTICE_AUDIENCE`/`noticeAudienceOf`/`engineNoticeInCatalog`/`MCP_INJECTION_DROP_REASONS`/`readMcpInjectionDrop`(L-167 通告码册,§27h)/ `AUTO_MODE_UNAVAILABLE_CAUSES`/`AUTO_MODE_BREAKER_CAUSES`/`classifierUnavailableOf`/`classifierUnavailableDetail`(件⑧ 分类器不可用事实,§27h2);`0.62.0` 是 **869**,那批是五件 additive、**零删除**:`capForDisplay`(呈前消毒 + 封长的共用铸点,详见 §26⑦)/ `SEAT_SEND_MESSAGE_KEY_ORIGINS`(座位载荷逐键出身表,详见 §26③)/ `configureSubagentContentStore`+`subagentContentStoreConfig`+`SUBAGENT_CONTENT_STORE_DEFAULTS`(子代内容账本字节预算,测试钩 `__resetSubagentContentStoreConfigForTests` +1,详见 §26②);`0.61.0` 是 **864**,那批是三件 additive、**零删除**:`projectReadFacePosture`/`readFacePostureDetail`/`readFaceDisagreement`(S-167 READ 容纳面 operator 读器,详见 §25);`0.60.0` 是 **861**,那批是二十五件 additive、**零删除**:`readRunTerminal`/`runTerminalCode`/`runTerminalGateKind`/`runTerminalGateToolName`/`isReviewPark`/`REVIEW_PARK_GATE_KINDS` 六件终局因由读器 + `gateOutcomeOf`/`isDeniedGate`/`gateDeniedBy`/`gateApprover`/`isApprovalWindowExpiredGate`/`isDenialLimitAutoDeniedGate`/`isParkSlaExpiredGate`/`isHumanSettledGate` 八件门记录读器 + `projectWriteProtectionCapability`/`noteEngineCapsForWriteProtection`/`observedWriteProtection`/`forgetWriteProtectionReading`/`writeProtectionDoctorDetail`/`projectWriteProtectionPosture`/`writeProtectionPostureDetail` 七件写保护读面(测试钩 `__resetWriteProtectionReadingsForTests` +1)+ `readWireErrorCode` + 真机边界①的两件 `isGateParkedToolEnd`/`GATE_PARKED_ERROR_CODE` + 异源复审逼出的 `engineCapsGeneration`;`0.59.0` 是 **836**,那批是八件 additive:`RULE_OFFERS_ABSENCE_REASONS`/`DENIAL_LIMIT_KINDS` 两张闭词表再导出 + `engineCapValue` 能力位四态通用读口 + `projectSqlEngineCapability`/`observedSqlEngine`/`noteEngineCapsForSqlEngine`/`forgetSqlEngineReading`/`sqlEngineDoctorDetail` 五件 SQL 姿态读面(测试钩 `__resetSqlEngineReadingsForTests` +1);`0.58.0` 是 **828**,那批是三件 additive:`RULE_OFFER_MATCHES`/`RULE_OFFER_BATCH_MEMBER_KINDS`/`RULE_OFFER_UNCOVERED_REASONS` 三张闭词表再导出 + `RESUME_REFUSAL_CODES`/`RESUME_PLACEMENT_MISMATCH`/`resumeRefusalFromError`/`resumeRefusalContent` 四件文案铸点;`0.57.0` 是 **821**;`0.56.0`/`0.55.0` 是 **815**;已发 `0.54.0`(design/385 十件 additive 含 `AUTHORITY_ENVELOPE_TAGS` 🔧 0.72.0 退役);`0.52.0` 是 **805**(L-69⑨ 两件);`0.51.0` 是 **803**;`0.50.0` 是 **800**(S-81 五件);`0.49.0` 是 **795**;`0.48.0` 是 **794**;npm `0.47.0` 是 **790**,`0.46.0` 是 **787**,`0.44.0` 是 **783**,`0.43.1`/`0.43.0` 是 **776**,`0.42.0` 是 **771**,`0.41.0` 是 **767**,`0.39.0` 是 **766**,`0.38.0` 是 **764**;`0.37.0` 是 **753**,见 `CHANGELOG.md`) | `scripts/public-export-baseline.json` 的 `count` / `testHookCount` —— **别手抄进别处,以该文件为准** |
26
+ | 公开导出面 | **1278** 个运行期符号(+ **59 个测试钩,两种拼法**:35 个 `__*ForTests` + 24 个单下划线开头(22 个 `_*ForTest` + `_resetLiveQuestionStore` / `_resetUltracodePreset`) —— 两种都在 `public-export-baseline.json` 的 `testHookNames` 里、各自受棘轮管,**不在** `names` 的 1278 里。运行期 `Object.keys(dist/index.js)` 的全量 = 1278 + 59 = **1337**;只剔双下划线那 35 个会多数出 24 个来,那不是棘轮盲区;最简单的剔法是去掉所有以 `_` 开头的名字(公面运行期名没有一个以 `_` 开头);= 下一版(未发布)的值:相对 0.75.1 **+16**,两票合计 —— **CC-77 ①** 审批决断结局单源判别联合 6 件:`approvalResolutionOf` / `isApprovalDecided` / `approvalNotSentCause` / `approvalUnsettledCause` + 两张 cause 词表 `APPROVAL_NOT_SENT_CAUSES` / `APPROVAL_UNSETTLED_CAUSES`(域 3);**CC-96** 记忆 spec 读面 10 件:`readAgentMemorySpec` / `unknownMemorySpecKeys` / `unknownMemorySpecKeysNote` / `memoryConfigRefusalNoteOf` / `KNOWN_AGENT_MEMORY_SPEC_KEYS` / `PENDING_MEMORY_SPEC_KEYS` / `MAX_UNKNOWN_MEMORY_SPEC_KEYS` / `CONFIG_MEMORY_PROJECT_KEY_SPELLING` / `CONFIG_MEMORY_WRITE_SCOPE_MISMATCH` + 判别形型(域 6 / 16)。CC-89 / CC-91 / CC-92 / CC-98 四票**零值导出增减**(新臂走 `ChromeEvent` 联合与内部臂表,`tasks_expand` 退役删的是联合成员不是导出名);1065 = 0.74.5 / 0.75.0 / 0.75.1 的值:相对 0.74.4 +4 —— `isNewEngineAgentPanelCycle`(CC-87,域 4)+ `approvalOutcomeNoteOf` 与两句固定文案常量(CC-88,域 3);1065 = 0.74.5 / 0.75.0 的值:相对 0.74.4 +4 —— `isNewEngineAgentPanelCycle`(CC-87,域 4)+ `approvalOutcomeNoteOf` 与两句固定文案常量(CC-88,域 3);1061 = 0.74.3 / 0.74.4 的值:相对 0.74.2 +9 —— CC-70 / CC-71 / CC-72 / CC-73 八件 + CC-80 `lastFlagValue`,见 §2b 域 3 / 4 / 10 / 15;1052 = 0.74.2 的值:相对 0.74.1 +6 —— CC-69 六件,见 §2b 域 9;1046 = 0.74.1 的值:相对 0.74.0 +1 —— `RETRACTED_CARD_DECISION_KIND`,见 §2b 域 3;1045 = 0.74.0 的值:相对 0.73.5 +1 —— `isStaleEngineAgentPanelEnd`,见 §2b 域 4;1044 = 0.73.5 的值:相对 0.73.4 +11 —— CC-58 规模告警十一件,名单见 §2b 域 12;1033 = 0.73.4 的值:相对 0.73.3 +1 —— `TOOL_INPUT_JOIN_MAX_CALLS`,见 §2b 域 1;1032 = 0.73.3 的值:相对 0.73.2 +6 —— CC-61 六件,名单见 §2b 域 9;1026 = 0.73.2 的值(导出名零增减);= 0.73.1 的值:相对 0.73.0 +7 —— CC-56 六件 / CC-57 一件,名单见 §2b 域 3 / 15;1019 = 0.73.0 的值(导出名零增减,BREAKING 在类型面);= 0.72.14 的值:相对 0.72.13 +8 —— CC-55 八件,名单见 §2b 域 3;1011 = 0.72.13 的值:相对 0.72.12 +18 —— CC-46 八件 / CC-54 六件 / CC-53 两件 / CC-50 缺席口两件,名单见 §2b 域 3 / 4 / 9 / 10;993 = 0.72.12 的值(测试钩 45):相对 0.72.11 +4 —— CC-50 `OUTCOME_UNKNOWN_ROW_PREFIX` / `isOutcomeUnknownRowText` / `TASK_NOTIFICATION_TERMINAL_STATUSES` / `isTaskNotificationTerminalStatus`;989 = 0.72.10 的值:相对 0.72.9 +4 —— CC-41 `LEADER_RUN_STATUSES` / `LEADER_REJ_HEAD_DISPLAY_MAX` / `projectLeaderConflict` / `leaderConflictDetail`;985 = 0.72.9 的值:相对 0.72.8 +8 —— CC-30 `MCP_RECONNECT_OUTCOMES` / `MCP_RECONNECT_TRANSACTION_NOTICE` / `projectMcpReconnectResult` / `classifyMcpReconnectFailure` / `reconnectMcpServer` / `projectMcpReconnectCapability` / `mcpReconnectOutcomeDetail`、CC-39② `readAutoConsolidationArmed`;977 = 0.72.8 的值:相对 0.72.7 +6 —— CC-39③ `MEMORY_OFF` / `memoryOffDeclarationField` / `memoryOffDeclared`、CC-43 `MODEL_OUTPUT_ERROR_PREFIX` / `isModelOutputErrorText` / `isModelOutputErrorRowText`;971 = 0.72.7 的值:相对 0.72.6 +2 —— CC-42 core 7.22.0 提货 `MCP_REDIAL_OUTCOMES` / `readMcpServerRedialed`;969 = 0.72.6 的值:相对 0.72.5 +1 —— CC-40 `steerFollowIntent`;968 = 0.72.5 的值:相对 0.72.4 +6 —— CC-31 server 7.82.1 提货 `capabilities.webSearch.backend` 四态读面:`WEB_SEARCH_BACKEND_NONE` / `projectWebSearchBackendCapability` / `observedWebSearchBackend` / `noteEngineCapsForWebSearchBackend` / `forgetWebSearchBackendReading` / `webSearchBackendDoctorDetail`;962 = 0.72.3 的值:相对 0.72.2 +1 —— CC-39① `AGENT_MEMORY_WORDS`;0.72.2 相对 0.72.1 +1 —— CC-37 `noteOwnWorkflowRun`;0.72.1 相对 0.72.0 +4 —— CC-33 server 7.80.1 提货:`RESUME_CONTEXT_UNAVAILABLE` / `resumeContextUnavailableFromError` / `resumeContextUnavailableContent` / `skillBaseDirOf`;0.72.0 相对 0.71.4 −39 —— CC-32 退役批删 export-liveness 登记 retire 的 39 个零消费导出(23 常量 + 16 函数,名单见 §47);995 = 0.71.3 的值:相对 0.71.2 +9 —— CC-06 `readEffectiveReasoning` / `readEffectiveMemoryScopes` / `resumeReopenFromError` / `resumeReopenContent` / `routePairingVerdict` 五函数 + `RESUME_REOPEN_CODES` / `RESUME_ENV_FAILED` / `RESUME_TOOL_UNAVAILABLE` / `RESUME_TOOL_CONTRACT_MISMATCH` 四常量;986 = 0.71.0 的值:相对 0.70.2 −`MAX_AGENT_SKILLS` −`DECIDE_WORKFLOW_HOST_NOT_PARKED` +`projectToolRosterDelta` +`mcpEngineLegPresence`;986 = 0.70.0 的值:相对 0.69.2 **一件 additive(`readSkillsListingTruncated`,§39)、零删除**;985 = 0.69.2 的值:相对 0.69.1 **三件 additive、零删除**(CC-13 `isSubFlowSegmentEnd` / `SEGMENT_END_IDENTITY_KEYS` / `droppedWhySentence`,§38);982 = 0.69.0 未发布版的值(原排 0.68.3,因 peer 地板抬升改 minor)= 相对 0.68.2 **十七件 additive、零删除**:`fetchMcpPanel`(CC-03 补件,§36e)+ `readWorkflowResumeAdmissionIncomplete`(CC-05 core 7.18.0 #755)+ `installCoreValuePorts`/`hasCoreValuePorts`/`hasCoreValuePort`/`coreValuePortMisses`/`CORE_VALUE_PORT_NAMES` + 十读口(CC-07 core 值级端口,§36d);0.68.2 相对 0.68.1 十三件 additive:`SEMA_SEGMENT_ID_KEY`(CC-01 段身份键,§35f)/ `projectMcpPanel`+`mcpPanelLastLegDetail`+`projectMcpSection`(CC-03 `/mcp` 面板读视图,§35g)/ `resolveTextSegmentAuthority`/`createTextSegmentLedger`(L-318 `text_end` 权威段替换的判决单源 + print 形段账,详见 §35b/§35c)/ `memoryCaptureDeclarationField`/`MEMORY_CAPTURE_OFF`(L-316 会话级隐私声明的字面唯一铸点,§35d)/ `engineUrl`/`probeHealth`(L-61 件④ SDK 纯工具面原样转口,§35d)/ `AgentClient`/`isApprovalRequestFrameV1`/`isApprovalRevokeFrameV1`(L-61 存量清零:SDK **wire 面**原样转口,§35e)。`0.68.1`/`0.68.0` 是 **952**,那批是相对 0.67.2 **二十件 additive、🔴 两件删除(BREAKING)**:additive = `TERMINAL_CAUSE_KINDS`/`isTerminalCauseKind`/`RUN_TERMINAL_NOT_SUCCESS_STATUSES`/`RUN_TERMINAL_STATUSES`(L-247 终态词两表分源,详见 §33b)/ `SEMA_SUBAGENT_USAGE_PARTIAL_KEY`/`subagentUsageIsPartial`(L-244 子代下界位自有名,§33g)/ `ASK_UNRESOLVABLE_CAUSES`/`readAskUnresolvable`/`DURABLE_MANDATE_SOURCES`/`readDurableGateUnavailable`(core 7.17.0 #709 ①② 两只通告事实窄读器,§33c)/ `WORKFLOW_PARK_TRUTH_UNREADABLE`/`WORKFLOW_PARK_NOT_PENDING`/`WORKFLOW_PARK_BINDING_BROKEN`/`WORKFLOW_PARK_REQUIRES_RUN_STORE`(四个单码常量 🔧 0.72.0 退役)/`WORKFLOW_PARK_REFUSAL_CODES`/`isWorkflowParkRefusalCode`/`readWorkflowParks`(core 7.17.0 #652 park 真相四码 + parks 三键读器,§33d)/ `ENGINE_STOP_REASONS`/`engineStopReasonToCc`(L-246 A13 停止原词映射下沉,§33g)/ `readCancelRequested`(L-230 读面,§33f);🔴 **删除两件** `TERMINAL_NOT_SUCCESS_STATUSES`/`TERMINAL_STATUSES`(随 L-247 两表分源更名成 `RUN_TERMINAL_*`,clean-cut **不留别名** —— 留一个别名等于让端可以继续按合起来的那张表读,分源就白做了,详见 §33b)。`0.67.0` 是 **934**,那批是相对 0.66.0 **七件 additive、🔴 两件删除**:additive = `CLASSIFIER_DENY_CAUSES`/`isClassifierDenyCause`/`classifierDenyCauseOf`/`classifierDenyCauseDetail`(core 7.14.0 退役 `classifierUnavailable` 之后的**拒绝面**继任读器与措辞,详见 §32b)/ `RULE_STORE_UNREADABLE_KINDS`/`isRuleStoreUnreadableKind`/`ruleStoreUnreadableDetail`(core 7.14.0 #688 C3 的规则店机制位三件,详见 §32d);🔴 **删除两件** `classifierUnavailableOf`/`classifierUnavailableDetail`(随 core 7.14.0 的 Retired keys 表整族退役,clean-cut 不留别名,详见 §32b;同批删的还有**型** `ClassifierUnavailableView`、卡位与帧位 `classifierUnavailable`、以及一条恒真的型面钉 `_askOriginWordsPin`)。`0.66.0` 是 **929**,那批是一件 additive、零删除:`readRunCostFacts`(终局成本事实的唯一读器:`costBreakdown` / `nested` 窄读 + 对账三段与两个判别位,终帧超集键与 chrome 对账臂共用它;详见 §31c);已发的 **0.65.x 十一件 additive、两件删除**:additive = `DECIDE_WORKFLOW_HOST_UNKNOWN`/`DECIDE_WORKFLOW_HOST_NOT_PARKED`/`DECIDE_WORKFLOW_REMEMBER_UNSUPPORTED`/`DECIDE_WORKFLOW_LANE_CODES`/`readDecideReceipt`/`decideAcceptedNotResolved`/`decideRefusalFromError`(B-070 `/decide` 回执读面与三码人话,详见 §30h)/ `TERMINAL_NOT_SUCCESS_STATUSES`/`isTerminalNotSuccess`/`TERMINAL_STATUSES`/`isTerminalStatus`(L-215② 终局词汇单铸谓词,详见 §30j);🔴 **删除两件** `AUTO_MODE_BREAKER_CAUSES`/`classifierBreakerOf`(熔断族随 core 7.12.0 的 Removed(BREAKING) 整只退役,clean-cut 不留别名,详见 §30k②;同批删的还有**型** `ClassifierBreakerView` 与 `ClassifierStatusView.breaker` 一位)。`0.64.2` 是 **919**,那批是一件 additive、零删除:`readDenialLimitFallback`(限额回落卡的窄读器上公面,壳侧同判据副本退役,详见 §29③);`0.64.0` 是 **918**,那批是件①+件② 十三件 additive、零删除:`CLASSIFIER_STATUS_STATES`/`classifierBreakerOf`/`classifierStatusOf`/`classifierStatusDetail`(分类器状态面,详见 §28②)/ `THINKING_FORMATS`/`THINKING_FORMAT_WIRE_TWINS`/`THINKING_DISABLE_PROBE_ORDER`/`MODEL_PROBE_VERDICTS`/`PROBE_PROMPT`/`PROBE_MAX_TOKENS`(两个探针常量 🔧 0.72.0 退役)/`probeRequestBody`/`probeModelCapability`/`applyProbeToEntry`(模型思考能力探测,详见 §28①);`0.63.0` 是 **905**,那批是八件 additive、零删除:`projectServerGateKnobs`/`postureKnobSourceOf`/`postureSourceIsOperatorPinned`/`postureKnobDetail`/`POSTURE_SOURCE_WORDS`(S-178 三根 posture 旋钮读数,详见 §27b)/ `PERSISTED_RULE_BEHAVIORS`/`PERSISTED_RULE_BEHAVIOR_UNKNOWN`/`persistedRuleBehaviorOf`/`persistedRuleBehaviorLabel`/`revokeTargetFromPersistedRule`(三态规则身份,§27c)/ `engineIdentityOf`/`engineIdentityVerdict`/`engineIdentityChanged`/`engineIdentityChangedBy`/`ENGINE_IDENTITY_ANCHORS`(S-179 代际锚,§27d)/ `GATE_DENIED_BY_WORDS`/`gateDeniedByDetail`/`ASK_ORIGIN_WORDS`/`askOriginDetail`(门词汇 +2,§27e)/ `PERMISSION_RULE_ISSUE_CODES`/`RETIRED_PERMISSION_RULE_ISSUE_CODES`/`permissionRuleIssueDetail`(规则 lint 码表,§27f)/ `projectToolRoster`/`toolRosterNames`/`toolShimFromRoster`/`applyToolRosterDelta`(L-161 工具名册,§27g)/ `ENGINE_NOTICE_CODES`/`ENGINE_NOTICE_AUDIENCE`/`noticeAudienceOf`/`engineNoticeInCatalog`/`MCP_INJECTION_DROP_REASONS`/`readMcpInjectionDrop`(L-167 通告码册,§27h)/ `AUTO_MODE_UNAVAILABLE_CAUSES`/`AUTO_MODE_BREAKER_CAUSES`/`classifierUnavailableOf`/`classifierUnavailableDetail`(件⑧ 分类器不可用事实,§27h2);`0.62.0` 是 **869**,那批是五件 additive、**零删除**:`capForDisplay`(呈前消毒 + 封长的共用铸点,详见 §26⑦)/ `SEAT_SEND_MESSAGE_KEY_ORIGINS`(座位载荷逐键出身表,详见 §26③)/ `configureSubagentContentStore`+`subagentContentStoreConfig`+`SUBAGENT_CONTENT_STORE_DEFAULTS`(子代内容账本字节预算,测试钩 `__resetSubagentContentStoreConfigForTests` +1,详见 §26②);`0.61.0` 是 **864**,那批是三件 additive、**零删除**:`projectReadFacePosture`/`readFacePostureDetail`/`readFaceDisagreement`(S-167 READ 容纳面 operator 读器,详见 §25);`0.60.0` 是 **861**,那批是二十五件 additive、**零删除**:`readRunTerminal`/`runTerminalCode`/`runTerminalGateKind`/`runTerminalGateToolName`/`isReviewPark`/`REVIEW_PARK_GATE_KINDS` 六件终局因由读器 + `gateOutcomeOf`/`isDeniedGate`/`gateDeniedBy`/`gateApprover`/`isApprovalWindowExpiredGate`/`isDenialLimitAutoDeniedGate`/`isParkSlaExpiredGate`/`isHumanSettledGate` 八件门记录读器 + `projectWriteProtectionCapability`/`noteEngineCapsForWriteProtection`/`observedWriteProtection`/`forgetWriteProtectionReading`/`writeProtectionDoctorDetail`/`projectWriteProtectionPosture`/`writeProtectionPostureDetail` 七件写保护读面(测试钩 `__resetWriteProtectionReadingsForTests` +1)+ `readWireErrorCode` + 真机边界①的两件 `isGateParkedToolEnd`/`GATE_PARKED_ERROR_CODE` + 异源复审逼出的 `engineCapsGeneration`;`0.59.0` 是 **836**,那批是八件 additive:`RULE_OFFERS_ABSENCE_REASONS`/`DENIAL_LIMIT_KINDS` 两张闭词表再导出 + `engineCapValue` 能力位四态通用读口 + `projectSqlEngineCapability`/`observedSqlEngine`/`noteEngineCapsForSqlEngine`/`forgetSqlEngineReading`/`sqlEngineDoctorDetail` 五件 SQL 姿态读面(测试钩 `__resetSqlEngineReadingsForTests` +1);`0.58.0` 是 **828**,那批是三件 additive:`RULE_OFFER_MATCHES`/`RULE_OFFER_BATCH_MEMBER_KINDS`/`RULE_OFFER_UNCOVERED_REASONS` 三张闭词表再导出 + `RESUME_REFUSAL_CODES`/`RESUME_PLACEMENT_MISMATCH`/`resumeRefusalFromError`/`resumeRefusalContent` 四件文案铸点;`0.57.0` 是 **821**;`0.56.0`/`0.55.0` 是 **815**;已发 `0.54.0`(design/385 十件 additive 含 `AUTHORITY_ENVELOPE_TAGS` 🔧 0.72.0 退役);`0.52.0` 是 **805**(L-69⑨ 两件);`0.51.0` 是 **803**;`0.50.0` 是 **800**(S-81 五件);`0.49.0` 是 **795**;`0.48.0` 是 **794**;npm `0.47.0` 是 **790**,`0.46.0` 是 **787**,`0.44.0` 是 **783**,`0.43.1`/`0.43.0` 是 **776**,`0.42.0` 是 **771**,`0.41.0` 是 **767**,`0.39.0` 是 **766**,`0.38.0` 是 **764**;`0.37.0` 是 **753**,见 `CHANGELOG.md`) | `scripts/public-export-baseline.json` 的 `count` / `testHookCount` —— **别手抄进别处,以该文件为准** |
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`(**1277** 项;该基线只覆盖**根**入口,子路径入口 `./registry` 的名单在 §86 与 `scripts/run-sdk-registry-transit-test.mjs` A / C 段)。
128
+ > 全集真源 = `scripts/public-export-baseline.json` 的 `names`(**1278** 项;该基线只覆盖**根**入口,子路径入口 `./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,12 +149,12 @@ SDK 核对「本包 import 的每个值级符号仍然导出」「`TaskStats.cos
149
149
  `WorkflowsGateUnknownDenial` 四形**不在**基线里,`src/selfOrchestrationDenial.ts` 对基线贡献
150
150
  **4** 项运行期导出(三个函数 + `SELF_ORCHESTRATION_RETRY_WITHOUT`)。
151
151
 
152
- 1277 项的内部构成(帮助端估读表大小;0.83.4 +4 函数(CC-205 `<system-reminder>` 剥离 / 解包两口;CC-203 座位过境口;CC-201 清「用户关卡」记号口);0.83.2 +15 函数 +4 常量(CC-193 姿态放行谓词 / CC-195 强制词闭集 + 成员判据 + 读口 + 措辞 / CC-194 缺席行判定 11 函数 + 3 常量);0.83.1 +10 函数 +6 常量(CC-112 展示层安全出口 `displayUntrusted` / CC-117 会话规则记录无损判定 + 措辞单源 + 五词成因闭集 / CC-174 插件 hook 每轮计划 + 查询口 + 事件判定口 + 四只措辞口 + 五张闭集);0.83.0 −3 函数(联网搜索旧三读口 `webSearchFromEnv` / `webSearchFromSettings` / `resolveWebSearch` 🔧 0.83.0 退出公面)+1 函数(CC-175 `terminalReasonForResult`);0.82.7 +5 函数(CC-182 每请求联网搜索配置三态判决:段判决 / env 判决 / 两车道合成 / 措辞单源 / endpoint 显示形);0.82.5 +5 函数 +1 常量(CC-169 print 车道 init 帧工具面:流包装器 / 判定闸 / 名册信号分类口 / 判定口 / 留痕措辞单源 + 等待上界常量);0.82.2 +1 函数(CC-164 云控制面有效配置回体措辞单源 `cloudEffectiveNotices`);0.82.1 +15 函数(CC-154 续跑折叠码读口 + 措辞 / CC-163 文件历史捕获读口六口 / CC-151 模型身份可解析判据五口 / CC-161 自定义代理载荷作废重投口 / 决断失败码「门还在」判定;测试钩 +1);0.82.0 +17 函数 +1 常量(CC-146 `/rewind` 代码档与对话档可用性读口投影 + 三口读账 + 两只判据 + 三句措辞 / CC-150 额度投影三口 / CC-152 装配期无手两口 / CC-154 取码单源 + 折叠码常量 / CC-156 坏档行坐标读口 + 措辞);0.80.0 +1 常量 +10 函数(CC-133 结算词表镜像 `SETTLEMENT_KIND_WORDS` + 五函数 / CC-134 三函数 / CC-132 两函数);0.79.0 +8 常量 +21 函数 +1 类(CC-74 MCP 状态面两张词表 + 九函数 / CC-110 `approvalIsMandated` + `mandatedApprovalDetail` / CC-116 · 118 · 123 `APPROVER_POSTURE_BYPASS` + `REQUEST_LANES` + 三函数 / CC-125 拒因两面四常量 `HITL_POLICY_DENY_MESSAGE` `APPROVAL_DENY_SETTLED_BY_WORDS` `SEMA_DENIAL_KIND_KEY` `CC_TOOL_DENIAL_KINDS` + 四函数 / CC-128 会话 bundle 面转口 `pushSessionBundle` `pullSessionBundle` `importSessionBundle` + 错误类 `APIError`;测试钩 +1);0.78.1 +2 常量 +9 函数(CC-113 displayBody / CC-97 b 五动词 + 判官 + 覆盖面判词 / CC-121 readSubmitWiringManifest);0.77.0 +2 常量 +2 函数(CC-101)+ 5 常量 +12 函数(CC-105 / CC-103;测试钩 +1);0.76.1 +1 常量 +4 函数(CC-36)+ 13 函数(CC-102;测试钩 +2)+ 1 常量 +20 函数(CC-97a;测试钩 +2)+ 2 函数(身份快照助手上公面);0.76.0 +8 常量 +8 函数(CC-77 ① 2+4 / CC-96 6+4);0.74.5 +2 常量 +2 函数(CC-87 / CC-88);0.74.3 +2 常量 +7 函数(CC-70 / CC-71 / CC-72 / CC-73 / CC-80;测试钩 +1);0.74.2 +6 函数(CC-69;测试钩 +1);0.74.1 +1 常量(CC-67);0.74.0 +1 函数(CC-66);0.73.5 +8 常量 +3 函数(CC-58);0.73.4 +1 常量(CC-34);0.73.3 +6 函数(CC-61;测试钩 +1);0.73.1 +2 常量 +5 函数(CC-56 / CC-57;测试钩 +1);0.72.14 +1 常量 +7 函数(CC-55);0.72.13 +4 常量 +14 函数(CC-46 / CC-54 / CC-53 / CC-50 缺席口);0.72.12 +2 常量 +2 函数(CC-50);0.72.10 +2 常量 +2 函数(CC-41);0.72.9 +2 常量 +6 函数(CC-30 / CC-39②);0.72.8 +2 常量 +4 函数(CC-39③ / CC-43);0.72.7 +1 常量 +1 函数(CC-42);0.72.6 +1 函数(CC-40);0.72.5 +1 常量 +5 函数(CC-31);0.72.3 +1 常量(CC-39①);0.72.2 +1 函数(CC-37);0.72.1 +1 常量 +3 函数(CC-33);0.72.0 −23 常量 −16 函数(CC-32 退役批);0.71.3 +4 常量 +5 函数(CC-06);0.71.0 −2 常量 `MAX_AGENT_SKILLS` / `DECIDE_WORKFLOW_HOST_NOT_PARKED` +2 函数 `projectToolRosterDelta` / `mcpEngineLegPresence`;0.70.0 起 +1 函数;0.69.2 起 +3:常量 1 / 函数 2):**351** 项是 `SCREAMING_SNAKE` 常量数据表/词汇表
152
+ 1278 项的内部构成(帮助端估读表大小;0.83.5 +1 函数(CC-204 字符面标记位置读口 `displayUntrustedMarks`);0.83.4 +4 函数(CC-205 `<system-reminder>` 剥离 / 解包两口;CC-203 座位过境口;CC-201 清「用户关卡」记号口);0.83.2 +15 函数 +4 常量(CC-193 姿态放行谓词 / CC-195 强制词闭集 + 成员判据 + 读口 + 措辞 / CC-194 缺席行判定 11 函数 + 3 常量);0.83.1 +10 函数 +6 常量(CC-112 展示层安全出口 `displayUntrusted` / CC-117 会话规则记录无损判定 + 措辞单源 + 五词成因闭集 / CC-174 插件 hook 每轮计划 + 查询口 + 事件判定口 + 四只措辞口 + 五张闭集);0.83.0 −3 函数(联网搜索旧三读口 `webSearchFromEnv` / `webSearchFromSettings` / `resolveWebSearch` 🔧 0.83.0 退出公面)+1 函数(CC-175 `terminalReasonForResult`);0.82.7 +5 函数(CC-182 每请求联网搜索配置三态判决:段判决 / env 判决 / 两车道合成 / 措辞单源 / endpoint 显示形);0.82.5 +5 函数 +1 常量(CC-169 print 车道 init 帧工具面:流包装器 / 判定闸 / 名册信号分类口 / 判定口 / 留痕措辞单源 + 等待上界常量);0.82.2 +1 函数(CC-164 云控制面有效配置回体措辞单源 `cloudEffectiveNotices`);0.82.1 +15 函数(CC-154 续跑折叠码读口 + 措辞 / CC-163 文件历史捕获读口六口 / CC-151 模型身份可解析判据五口 / CC-161 自定义代理载荷作废重投口 / 决断失败码「门还在」判定;测试钩 +1);0.82.0 +17 函数 +1 常量(CC-146 `/rewind` 代码档与对话档可用性读口投影 + 三口读账 + 两只判据 + 三句措辞 / CC-150 额度投影三口 / CC-152 装配期无手两口 / CC-154 取码单源 + 折叠码常量 / CC-156 坏档行坐标读口 + 措辞);0.80.0 +1 常量 +10 函数(CC-133 结算词表镜像 `SETTLEMENT_KIND_WORDS` + 五函数 / CC-134 三函数 / CC-132 两函数);0.79.0 +8 常量 +21 函数 +1 类(CC-74 MCP 状态面两张词表 + 九函数 / CC-110 `approvalIsMandated` + `mandatedApprovalDetail` / CC-116 · 118 · 123 `APPROVER_POSTURE_BYPASS` + `REQUEST_LANES` + 三函数 / CC-125 拒因两面四常量 `HITL_POLICY_DENY_MESSAGE` `APPROVAL_DENY_SETTLED_BY_WORDS` `SEMA_DENIAL_KIND_KEY` `CC_TOOL_DENIAL_KINDS` + 四函数 / CC-128 会话 bundle 面转口 `pushSessionBundle` `pullSessionBundle` `importSessionBundle` + 错误类 `APIError`;测试钩 +1);0.78.1 +2 常量 +9 函数(CC-113 displayBody / CC-97 b 五动词 + 判官 + 覆盖面判词 / CC-121 readSubmitWiringManifest);0.77.0 +2 常量 +2 函数(CC-101)+ 5 常量 +12 函数(CC-105 / CC-103;测试钩 +1);0.76.1 +1 常量 +4 函数(CC-36)+ 13 函数(CC-102;测试钩 +2)+ 1 常量 +20 函数(CC-97a;测试钩 +2)+ 2 函数(身份快照助手上公面);0.76.0 +8 常量 +8 函数(CC-77 ① 2+4 / CC-96 6+4);0.74.5 +2 常量 +2 函数(CC-87 / CC-88);0.74.3 +2 常量 +7 函数(CC-70 / CC-71 / CC-72 / CC-73 / CC-80;测试钩 +1);0.74.2 +6 函数(CC-69;测试钩 +1);0.74.1 +1 常量(CC-67);0.74.0 +1 函数(CC-66);0.73.5 +8 常量 +3 函数(CC-58);0.73.4 +1 常量(CC-34);0.73.3 +6 函数(CC-61;测试钩 +1);0.73.1 +2 常量 +5 函数(CC-56 / CC-57;测试钩 +1);0.72.14 +1 常量 +7 函数(CC-55);0.72.13 +4 常量 +14 函数(CC-46 / CC-54 / CC-53 / CC-50 缺席口);0.72.12 +2 常量 +2 函数(CC-50);0.72.10 +2 常量 +2 函数(CC-41);0.72.9 +2 常量 +6 函数(CC-30 / CC-39②);0.72.8 +2 常量 +4 函数(CC-39③ / CC-43);0.72.7 +1 常量 +1 函数(CC-42);0.72.6 +1 函数(CC-40);0.72.5 +1 常量 +5 函数(CC-31);0.72.3 +1 常量(CC-39①);0.72.2 +1 函数(CC-37);0.72.1 +1 常量 +3 函数(CC-33);0.72.0 −23 常量 −16 函数(CC-32 退役批);0.71.3 +4 常量 +5 函数(CC-06);0.71.0 −2 常量 `MAX_AGENT_SKILLS` / `DECIDE_WORKFLOW_HOST_NOT_PARKED` +2 函数 `projectToolRosterDelta` / `mcpEngineLegPresence`;0.70.0 起 +1 函数;0.69.2 起 +3:常量 1 / 函数 2):**351** 项是 `SCREAMING_SNAKE` 常量数据表/词汇表
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 域,逐域计数之和 = 1277)
157
+ ### 2b. 域图(16 域,逐域计数之和 = 1278)
158
158
 
159
159
  | # | 域 | 名数 | 承重导出 | 用途 | 实现锚 |
160
160
  |---|---|---|---|---|---|
@@ -162,7 +162,7 @@ SDK 核对「本包 import 的每个值级符号仍然导出」「`TaskStats.cos
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
163
  | 3 | **HITL 决断卡链**(§4/§5 主战场) | 219 | `toolPermissionRequestAskBits` / `clearPlanReviewUserDismissals`(0.83.4 CC-203 / CC-201:卡请求 → 座位请求的四位过境口,与卡请求同一把窄读;会话换代时清「用户关卡」记号;§104)· `askSurvivesPosture` / `readApprovalMandate`(0.83.2 CC-193 / CC-195:常驻姿态下「这一张卡能不能由姿态答掉」三态谓词;卡上强制词读口,缺席答缺席;§102)· `sessionPolicyDeliverable` / `sessionPolicyWithheldNotice` / `SESSION_POLICY_WITHHELD_WHY`(0.83.1 CC-117:一批规则串能不能无损写进会话规则记录 —— 整批可送才送、五词成因闭集、每词一句措辞单源;宿主侧那一份的继任;§101)· `isPolicyRefusedGate` / `denyAttributionRefusalFromError` / `denyAttributionRefusalContent` / `removalConsequenceLineForBehavior` / `ruleRemovalBehaviorOf`(0.80.0 CC-133 · CC-132:策略拒谓词 + 归因键三码读口与人话 + 删除规则后果句铸点与闭集读口;§87)· `HITL_POLICY_DENY_MESSAGE` / `APPROVAL_DENY_SETTLED_BY_WORDS` / `readApprovalDenySettledBy` / `SEMA_DENIAL_KIND_KEY`(0.79.0 CC-125:deny 收口帧按 `settledBy` 分两串的冻结句、决断对象归因位的两词可达子集与只认自有数据属性的读器、分类词信封键名;§85)· `approvalIsMandated`(0.79.0 CC-110:审批卡「清不掉」判据口,帧位 ∨ 寄存行缺席词两条腿一个真源;§85)· `readSessionPolicy` / `tightenSessionPolicy` / `tightenedSessionRules` / `classifySessionPolicyFailure` / `sessionPolicyTightenNotice` / `SESSION_POLICY_RULE_FIELDS` / `SESSION_POLICY_TIGHTEN_UNKNOWN_WHY`(0.77.0 CC-105:会话策略窄读 + 收紧编排五臂判别联合)· `writePersistedRule` / `PERSISTED_RULE_WRITE_BEHAVIORS` / `PERSISTED_RULE_WRITE_REFUSAL_CAUSES` / `PERSISTED_RULE_WRITE_UNKNOWN_REASONS`(0.77.0 CC-103:持久规则单步写面,词表派生不手抄;§79)· `persistedRulesWriteAvailable`(0.76.1 CC-102:单步写入口便利口,只派生自写键自己的四态,不与撤销面那只合取;§77)· `approvalResolutionOf` / `isApprovalDecided` / `approvalNotSentCause` / `approvalUnsettledCause` / `APPROVAL_NOT_SENT_CAUSES` / `APPROVAL_UNSETTLED_CAUSES`(CC-77 ①:「一次审批决断最后怎么了」的单源判别联合 `decided` / `not_sent` / `unsettled`,两条腿的结局对象一次判别;既有结局型面一字不动)· `approvalOutcomeNoteOf` / `APPROVAL_NOTE_RETRACTED_DETAIL` / `APPROVAL_NOTE_EDIT_REFUSED_DETAIL`(0.74.5 CC-88:审批结局便签单源;§73)· `decideReceiptReopen` / `suspendedReopenOf`(0.74.3 CC-73:reopen 族第二臂;§71)· `RETRACTED_CARD_DECISION_KIND`(0.74.1 CC-67:卡口无决断收口;§69)· `planReviewOutcomeTail`(0.73.1 CC-57:outcome 尾句六态单铸点;投递口闩;§63)· `readLivePendingRows` / `suspendedSubagentAsks` / `countApprovalsAwaitingDecision` / `createSuspendedAskTracker` / `livePendingRowToApprovalFrame` / `surfaceSuspendedAskAndRespond` / `surfaceEditRefusedOnBlindAsk` + `EDIT_REFUSED_ON_BLIND_ASK_WARN_TEXT`(0.72.14 CC-55:悬挂的流内 ask 读面 / 视图 / 去重账 / 决断口;§61)· `planReviewCardOptions` / `planReviewChoiceFromAnswer` / `versionSupportsPlanReviewModeAfter` / `isPlanReviewModeAfter` + `PLAN_REVIEW_APPROVE_AUTO_LABEL` / `PLAN_REVIEW_APPROVE_MANUAL_LABEL` / `PLAN_REVIEW_MODE_AFTER_WORDS` / `PLAN_REVIEW_MODE_AFTER_MIN_ENGINE`(0.72.13 CC-46:plan_review 批准后模式 `permissionModeAfter` 发口与三选卡双闸;§60)· `makeHitlCanUseTool` · `HitlBridge` · `findPendingForTask` · `readDecideReceipt`/`decideAcceptedNotResolved`/`decideRefusalFromError`(B-070:`/decide` 200 = **投递受理**不是「门已解决」;`executionOutcome` 缺席 = 未知,详见 §30h) · `HitlSafetyError` · `bridgeAskUserQuestionGates` · `surfaceToolApprovalFrameAndRespond` / `surfaceFsApprovalAndDecide` · `readToolApprovalRespondAck` · `installApprovalCardPort(For)` · `installHitlHostSurface(For)` · `armPlanReviewApproval` · `reopenPlanReviewCard` · `decidePlanReview` · `startApprovalsFeed` · `pendingRowIsOwnedByThisSession` · `approvalCallKey`/`liveFrameCallKey`/`planReviewQuestionId` · `registerArmedGateFor`/`wasGateArmedFor` · `waitForGateArmed(For)`/`onGateArmed`/`gateArmedWaitMs`(#244 F1 呈现回执事件源) · `planReviewArmedKey(For)`/`notePlanReviewAnswered(For)`/`notePlanReviewAnsweredIfDecisive`(A-024.4 plan 呈现分代) · `toolEndOutputText` · `isAskTool` · `waitForParkRowBirth` · `classifyAskParkRows` / `askParkRowArm` / `classifyAskParkChainFailure` · `readDecisionNoteAudit` / `decisionNoteAuditLine` · `resumeRunningOptions` / `resumeChoiceFromLabels` · `persistedRulesLaneAvailable`/`persistedRulesGovernanceAvailable` · `classifyRulesFailure` · `listAllPersistedRules` · `classifySkippedReason` · `readRulePersistOutcome`(#244 F2:persist-ack 读口与 `readToolApprovalRespondAck` 合成一处) · `parseLocalAllowRule`(durable 腿本地落规则窄化骨架,谓词经 `LocalAllowRuleDeps` 注入) · `readToolApprovalRespondRefusal`(#225 件5,0.42.0:respond 抛错的结构化原文读口 —— 三位各自防御读、各自缺席不铸、**三位皆缺席时整只返 `undefined`**;原样交还零加工,UNTRUSTED-for-display)· `installEditedRuleTextPrechecker` / `hasEditedRuleTextPrechecker` / `precheckEditedRuleText`([5076] 转出口,0.42.0:core 5.57.0 `precheckEditedRuleText` 的**端口注入形** —— 类型面 + 注入口 + 诚实缺席读口。🔴 **不是** value 级 re-export,理由见 §7 缺口 **P-34**;未装 ⇒ 返 `undefined`,绝不编一个 `{ok:true}`)· `surfaceRuleArmNotSent` / `RULE_NOT_SENT_WARN_TEXT` + `surfaceRuleArmRejected` / `RULE_NOT_SENT_REJECTED_WARN_TEXT`(#334,0.43.0:人在卡上按下的「不再询问」被整条丢弃时的诚实告知——**两条刻意分开**:前者=**引擎能力位未确认**(换台引擎/等探测就好),后者=**这次选择没过包内表核/互斥核**(表外文本/坏下标/两臂同场,换引擎也不会变) —— 编辑臂 `respondFreeFormRules` 与批臂 `respondBatchRuleOffers` 两条同形存量共用一条,与 `surfaceRememberNotApplied` 同族纪律:决断照送、只是规则没存,静默丢掉用户明确意图 = 让人以为功能坏了)· `projectCrashConverged`(L-38,0.49.0:`/v1/approvals` additive 键 `crashConverged` 的分桶投影 —— 崩溃收敛的孤儿审批读面,**缺席 ≠ 空数组**、分桶恰一个合取、坏行丢弃并计数,详见 §12;同批把 `ApprovalsResourceLike.list()` 的返回位 additive 放宽成 `ApprovalsListEnvelope`,老形 `{pending}` 仍可赋值)· `readRuleOffers` / `readRuleOfferSupply`(L-103/[C228],0.57.0 additive 导出:「不再询问」候选两代 wire 键的窄读器**公面化** —— 此前只经卡端口出包,不走卡端口架构的宿主只能自己重铸一把,而它承载的是兑付安全判据(原始下标不前移/逐条丢坏/闭集 kind/两代取舍序),详见 §20)· `RULE_OFFERS_ABSENCE_REASONS` / `DENIAL_LIMIT_KINDS`(0.59.0 / sdk 8.3.0 提货:`ruleOffersAbsence` 三词与 `denialLimitFallback.limit` 二词的**运行期**闭词表再导出 —— 与 0.58.0 那三张同一条纪律:端拿它做判定别再手抄字面量。⚠️ **本包自己不拿这两张表做窄读判定**(两处都按开集透传,词表属主是 core、server 已按闭集拒过),再导出只是给端的 `switch` 一份可数的表,端仍必须带 `default` 臂,详见 §23a)· `DecideTransportRetryExhaustedError`(Inkglow-1085 P0a:decide 出站瞬断重试耗尽的 typed 判别 —— HitlBridge 内建单次退避重试,耗尽走重呈臂不判死 turn;端一般只消费行为,不需要 instanceof) · `gateOutcomeOf` / `isDeniedGate` / `gateDeniedBy` / `gateApprover` / `isApprovalWindowExpiredGate` / `isDenialLimitAutoDeniedGate` / `isParkSlaExpiredGate` / `isHumanSettledGate`(0.60.0 / engine ≥7.64.0:`tool_end.gate` 整条门记录的窄读器 + 判定谓词 —— 取代退役的四个正交词 `settledBy`/`resolution`/`autoDenied`/`approver`。🔴 **判定归包**:「是不是审批窗自己走完的拒绝」旧形上是端各自拼的两键合取,而三条窗词现在分得开、合并读回去等于把刚修好的判别力扔掉;⚠️ 公面型一律带 `View` 后缀 —— 本文件的 `GateOutcome`(决断腿结局)与 sdk 的 `GateOutcome`(引擎门记录)**同名不同义**,详见 §24c)· `isGateParkedToolEnd`(「这次调用没在这里结算」的**第二形**谓词:gate 缺席 + `errorCode:"gate.parked"`;端判这件事必须与 `isApprovalWindowExpiredGate` **两形合读**) · `readWireErrorCode`(B-037 候包件②:decide/取件失败上引擎 wire 机器码的单源读口,结构视图读不 `instanceof`;与本包铸的 `code` 是两个命名空间,详见 §24g)| suspended→decide→resume 环。🔴 **D-1 两元组 verbatim 回显**是字节级断言的安全不变量,端**不许重实现它的任何一段**。🔴 键空间边界(web [C1] d3 拦截):`gateIdentity` 四常量两函数只覆盖 HITL questionId/callKey 空间;seat 的 `TOOL_PERMISSION_REQUEST_ID_DOMAINS`(`plan:` 等)是另一键空间,**两者绝不合并**(合并=座位校验器静默拒全部 plan-review 卡) | `src/hitl/hitlBridge.ts`、`toolApprovalWire.ts`、`askGateWire.ts`、`planReviewWire.ts`、`hitlHostSurface.ts`、`gateIdentity.ts`、`armedGateRegistry.ts`、`parkOwnership.ts`、`parkResolver.ts`、`approvalsFeed.ts`、`frameRouter.ts`(**只挑名导出** `toolEndOutputText`/`ENGINE_ABORT_TOOL_RESULT`/`isAskTool`/`HITL_REJECT_MESSAGE`/`HITL_INTERRUPT_MESSAGE_FOR_TOOL_USE`)、`parkRowBirthWait.ts`、`approvalDecisionNoteAudit.ts`、`askParkRowRouting.ts`、`resumeRunningCard.ts`(#265 上收的判定层)、`persistedRulesWire.ts`、`localAllowRule.ts`(#244 F2 规则侧)、`crashConverged.ts`(L-38 崩溃收敛读面)、`sessionPolicyDeliverable.ts`(0.83.1 CC-117 会话规则无损判定)、`askSurvivesPosture.ts`(0.83.2 CC-193 姿态放行谓词)、`src/gateOutcome.ts` |
164
164
  | 4 | **子代 wire + 面板侧信道台账** | 107 | `isEngineAgentAbsentRow` / `engineAgentAbsenceMarkOf` / `engineAgentAbsenceClockStopMs` / `engineAgentPanelEventClearsAbsence` / `engineAgentRowCountsAsRunning` / `tallyEngineAgentRows` / `engineAgentTurnSweepSettles` / `reapEngineAgentAbsentRows` / `engineAgentAbsenceTtlDueAtMs` / `engineAgentAbsenceDroppedLine` / `engineAgentTerminalAfterDropLine` + `ENGINE_AGENT_ABSENT_ROW_TEXT` / `ENGINE_AGENT_ABSENCE_TTL_MS` / `ENGINE_AGENT_REGISTRY_READINGS`(0.83.2 CC-194:后台子代缺席行的判定 / 计数 / sweep 豁免 / 回收 / 措辞单源,回收只在后台代理登记确认离场时;§102)· `isNewEngineAgentPanelCycle`(0.74.5 CC-87:新周期单源判据;§73)· `resolveEnginePanelTaskId` / `MAX_HELD_WIRE_TICK_BEATS` / `clearEnginePanelTaskResidentByWire`(0.74.3 CC-70:子代身份归一读口、缓一拍节拍上限、按 wire id 清常驻标(前代终态不清当代);§71)· `isStaleEngineAgentPanelEnd`(0.74.0 CC-66:面板 end 的周期身份判据;§68)· `subscribeEngineAgentPanelAbsence` / `publishEngineAgentPanelAbsence`(0.72.13:fleet 行缺席上报的**独立订阅口** —— 不上主通道,老消费者结构上收不到;§60 S-5)· `tailEngineSubagent` · `installSubagentActivitySink` · `installSubagentTailMetaSink`(#280 件2:tail meta 帧发布口,`contentFrames` 判别位载体)· `stopEngineTask` + `classifyTaskStopConflict` · `fetchEngineSubagentReport` · `steerEngineSubagent`(0.32.0 未发布 #280 件A:additive 第三参 `childTaskId` —— 端有行上下文时**应当**传,传了就走「台账优先 / 缺席即诚实缺席 + `noteBgOwnerAbsence` 留痕」的 Q3 口径,与 tail·taskOutput·subagentOutput 三腿同姿势、与孪生 resume 腿共用同一个 `resolveOwnerRunId` 判据;**不传**则逐字维持旧行为=回落在飞 run)· `resumeSettledSubagent` + `resolveSubagentResumeContext` + `resolveOwnerRunId` + `classifySubagentResumeFailure` + `subagentResumeAvailable`(#242 批 2 A-028.7:resume 判定半场上收,与 steer 孪生同居;取址三态 = 台账有行用行值 / 指名了行但台账缺席则**诚实缺席绝不回落在飞 run** / 没指名行才回落。出路文案归端)· `recordSubagentOwnerFromProgress` + `getBgParentRunOwner`(A-028.6:「子代 → 宿主 run」**单表**,宿主 run 必须由持 stream-local 值的调用方显式传入,包内绝不从 `activeEngineRunId()` 推断)· `noteBgOwnerAbsence`(#242 批 3 [4000] Q3=B:tail/taskOutput·taskStop/subagentOutput 三腿台账缺席即诚实缺席**绝不回落在飞 run**,缺席 warn 留痕每 (腿,taskId) 一条)· `clearBgTerminalFacts`(#242 批 3 扫码修:复活=新周期,旧周期终态事实作废——fleetLedger 复活两腿按尾段清账,factsAccepted 方向核不再拿上周期终态当先例)· `auditRetainWithoutWake`([4000] Q5:引擎宣示 `subagentResume` + 本端在付 `retainSubagentSessions` + 端未实现 `wakeSubagent` ⇒ 响亮一条;`CLIENT_VERBS.wakeSubagent` 维持 fail-soft)· `subscribeSubagentContent` · `subscribeEngineAgentPanel` · `publishQuestionFrame` / `respondToQuestion` · `configureSubagentContentStore` / `subagentContentStoreConfig` / `SUBAGENT_CONTENT_STORE_DEFAULTS`(0.62.0:子代内容账本的**字节预算** —— 此前只有条数帽而单条无上限,一条 base64 工具结果就能让一个子代槽吃到十几 MB;越限从最早的内容开始丢并留一条可渲染的 `truncated` 记录,总帽淘汰整条最久未用的账本。配置面 fail-loud,详见 §26②)| 驱动与观测委派子代;经 module 级台账喂活体 agent/task 面板。全部**能力位 gate**(§5b) | `src/subagent/*.ts`、`src/subagentContentStore.ts`、`src/engineAgentPanelStore.ts`、`src/engineAgentAbsence.ts`(0.83.2 CC-194 缺席行判定与措辞)、`src/engineInlineTaskStats.ts`、`src/engineToolLabelStore.ts`、`src/liveQuestionStore.ts` |
165
- | 5 | **fleet 投影** | 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:展示层安全出口单源,本域三只旧口的字符面引擎) |
165
+ | 5 | **fleet 投影** | 40 | `displayUntrustedMarks`(0.83.5 CC-204:同一只出口另报每一枚字符面标记的 UTF-16 区间,`text` 与同选项的出口逐字节同;§105)· `displayUntrusted`(0.83.1 CC-112:wire 派生文本上屏前的合成出口三端单源 —— 凭据两网 ∘ 字符三网,选项按载体选;本域 `escapeDisplayControlChars` / `collapseLabel` / `capForDisplay` 三只旧口改由同一只字符面引擎实现、输出逐字节不变,字符集窄于新口默认;§101)· `createFleetLedger` · `projectTasks` · `projectWorkflows` · `projectFleetAgentRows` · `readEngineActiveBgTasks` · `FLEET_TASK_VIEW_KEYS` · `escapeDisplayControlChars`(不可见字符可见化,行标签/描述消毒的共享底座)· `capForDisplay`(0.62.0:呈前**消毒 + 封长**的共用铸点 —— 先转义、后按转义结果封长,截点避开半截转义 token 与合法代理对;本包该族四处此前各写一份、其中三份顺序是反的,详见 §26⑦)· `wireCycleSeq`(0.38.0 提货补投的 #261 §2 两位之一,另一位 `wireRetiredBy` 🔧 0.72.0 退出公面:代际号 = SendMessage 复活即 +1,**缺席 ≠ 第一代**;`retiredBy` 在场 = 这条终态是对账腿从 durable run 行投影出来的、**不是**发布方亲报 —— 幽灵行与正常收尾唯一的 wire 判据。两位都只在场才落键) | 老 `fleetClient` 那一刀的成品:**帧体归库、连接归端** —— 端持 SSE 连接,库做行投影 + 保留台账 | `src/fleet/fleetProjection.ts`、`src/fleet/fleetLedger.ts`、`src/fleetAgentPanelProjection.ts`、`src/fleetTaskDesc.ts`、`src/displayUntrusted.ts`(0.83.1 CC-112:展示层安全出口单源,本域三只旧口的字符面引擎) |
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 | **工具结果卡** | 27 | `stripSystemReminderBlocks` / `unwrapSystemReminder`(0.83.4 CC-205:引擎 `<system-reminder>` 信封壳的剥离与整条解包,开标签只认引擎铸的两形,线性时间;§104)· `displayBody`(0.78.1 CC-113:工具结果正文的人类面读口,剥本包铸的不可信围栏,三形互不折叠;§83)· `structuredToToolUseResult` · `readAsyncLaunchedAgentReceipt` · `wireOutputToBody` · `parseModelFacingBash` · `getPatchFromContents` · `toolEndResultToUserFrame` · `flattenToolOutput` | 铸端要渲的 `tool_result` 卡体,含客户端 diff hunk(唯一 runtime dep 的用处) | `src/toolResult.ts`、`src/printToolResultFrame.ts`、`src/diff/patch.ts` |
@@ -249,7 +249,7 @@ type EventProjection =
249
249
  `config_assembled`(引擎可观测/审计面,CC transcript 无对位物;context_usage 自 0.71.0 CC-08 ③ 起**进切片**为 chrome 臂,不再在本表,见 §42)·
250
250
  `needs_review`(壳消费的是 `done{status:'needs_review'}` 终帧,事件形重复且更早)·
251
251
  (compaction_outcome 自 0.75.0 CC-89 起**进切片**为 chrome 臂,不再在本表,见 §74)·
252
- (prompt_assembled 自 0.76.0 CC-91 起**进切片**为 chrome 臂,不再在本表,见 §75)·
252
+ (prompt_assembled 自 0.76.0 CC-91 起**进切片**为 chrome 臂,不再在本表,见 §76)·
253
253
  `tool_approval` / `tool_approval_complete`(**不是丢帧**:它们走
254
254
  `hitl/toolApprovalWire.isToolApprovalFrame` + `hitl/frameRouter` 那条审批卡链;在这里投一条 transcript 行
255
255
  只会让同一只 ask 出现两次)· **`error`**(见下,单列)。
@@ -262,11 +262,13 @@ type EventProjection =
262
262
  所以只投那个锚而把本帧丢掉,等于交给端一个解析不出东西的锚。现在它投**中性内部臂 + 可选 chrome
263
263
  记账**,仍然**绝不铸 transcript 行**(本帧不带正文)。
264
264
 
265
- 📌 **`wiring_manifest` 自 0.56.0 起离开本表,但它只被接了两段**(L-70 / L-108②③)——
266
- `modelGate` 与 `autoMode` 投成内部臂 + chrome 臂(§19),整份 manifest 的**其余十一段**
267
- (leg / ask / question / interaction / elicit / parkLane / session / fleet / permissionRules /
268
- governance / configFingerprint)仍然一件没接。两段都不成形的那些帧照旧回 `none/not_in_slice`,
269
- **不铸空臂**。⇒ 别把「wiring_manifest 不在这张表里了」读成「manifest 接上了」。
265
+ 📌 **`wiring_manifest` 自 0.56.0 起离开本表,今天投九段**(内部臂上的段键一律 `_sema_*`):
266
+ `modelGate` / `autoMode`(0.56.0 起,§19)· `mcp` · `tools` · `hooks` · `lsp` · `writeProtection` ·
267
+ `autoConsolidation` · `readDeny`。端读 chrome 臂 `wiring_manifest`;非流式提交回执走 `readSubmitWiringManifest`,
268
+ 两条腿同一张 `WiringManifestView`(§83;九段的在场判据单源在 `src/adapter/downstream/wiringManifestView.ts`)。
269
+ 其余十一段(leg / ask / question / interaction / elicit / parkLane / session / fleet / permissionRules /
270
+ governance / configFingerprint;按 sdk 11.3 `wiring_manifest` 臂声明逐段核过)**仍未投影**;九段都不成形的帧
271
+ 照旧回 `none/not_in_slice`,**不铸空臂**。⇒ 别把「wiring_manifest 不在这张表里了」读成「整份 manifest 接上了」。
270
272
 
271
273
  🔴 **`error` 单列点名**(端最容易据 §3a 的规则推错的一条):它的名字骗人 —— 那是流的 **15 分钟帽帧**
272
274
  (server `sse-log.ts`,已知 `errorCode` = `STREAM_MAX_DURATION`),帧自己就说 **run 仍然活着**;
@@ -326,28 +328,33 @@ removal after the last running beat」。**按开集透传**(空串 / 非串 /
326
328
  `case 'tool_end'` 曾是同一个病形的连续实例 —— 臂是**闭形白名单**,于是一条**已经在 wire 上**的
327
329
  事实到不了宿主,而两边代码看着都对。逐例:`toolCallId`([1947])→ `governanceForced`([2942])→
328
330
  `settledBy` / `approver`(#263,0.30.8)→ `_sema_collateral_abort`(#324,0.40.0)→
329
- **`resolution`(A-D2,0.42.0,本批)**。
330
-
331
- `resolution` = core ≥5.35 的 `AskDenyResolution` 九词闭集(`human_refused` / `window_expired` /
332
- `no_approver` / `blanket_allow_refused` / `approver_unavailable` / `task_aborted` /
333
- `presentation_failed` / `approver_error` / `approver_contract`),**只在这一帧收口的是一次
334
- in-process ask 拒绝时**在场。
335
-
336
- 🔴 **端的读法(与 `settledBy` 合读,不互替)**:`settledBy` 说这次等待是哪一**种**收场;
337
- `resolution` 分类的是**拒绝臂本身**。单锚 `settledBy` 会把「审批方违约」(approver 回了契约外的
338
- 东西,窗口并没有自然走完)误收进「窗口走完了」。
339
-
340
- 🔴 **判据用正面匹配,不用「不等于」**(0.42.0 异源复审 [medium] 采纳,**端必读**):
341
- 判「审批窗口自己走完了」写 `settledBy === 'timeout' && resolution === 'window_expired'`。
342
- **绝不**写 `resolution !== 'approver_contract'` —— 那个不等式对**缺席**(旧引擎不发这一位)与
343
- 对**任何未来新码**都为真,于是「不知道是怎么拒的」会被折成「窗口自然结束」,正是本位存在要防的
344
- 那件事。缺席与未知值一律进 `default` 分支。
345
- 🔴 **开集读**:九词是引擎的词表,端**必须**分支已知值 + 永远带 `default`,表外词原样呈现。
346
- 🔴 **缺席不可反推**:每一次真执行了的调用、每一次 policy/hook 直拒、以及 durable/decide 腿的
347
- 结算(它们带自己的 `settledBy`/reason)都**不带**这一位;缺席 ≠「不是拒绝」也 ≠「人拒的」。
348
-
349
- **实现锚**:`src/adapter/downstream/eventToSdkMessage.ts` 的 `case 'tool_end'`;
350
- 防御性读形 `ToolEndResultArmLike.resolution` 在 `src/printToolResultFrame.ts`。
331
+ **`resolution`(A-D2,0.42.0)**。
332
+
333
+ 🔴 **0.60.0 起(engine ≥7.64.0 / sdk 8.4.0,wire BREAKING)门结算的四个扁平词全删、无 alias**:
334
+ `settledBy` / `resolution` / `autoDenied` / `approver` 换成**一条门记录** `tool_end.gate`,本臂经包内
335
+ 单源窄读器 `gateOutcomeOf` 铸出后原样上臂(读不成形就不铸键,绝不折成空壳)。门记录 =
336
+ `disposition`(放行 / 被哪一**层**拒)+ `settlement?`(这次消费掉的等待怎么结束的;`kind` 按开集读)
337
+ + `origin?`(谁问的),后两位同在同缺。读器签名、形与逐形缺席语义见 §24c。
338
+
339
+ 🔴 **端的读法 = 调包里的谓词,不再自拼**:旧形上端各自拼的两键合取
340
+ (`settledBy === 'timeout' && resolution === 'window_expired'`)作废 —— 那两个键在 wire 上已经不存在。
341
+ - 「审批窗自己走完了,拒了」⇒ `isApprovalWindowExpiredGate(gateOutcomeOf(f))`;
342
+ - 「这次调用没在这里结算」要**两形合读** ⇒ `isApprovalWindowExpiredGate(gateOutcomeOf(f)) || isGateParkedToolEnd(f)`
343
+ (后一形:帧上没有 `gate`、只有 `errorCode: "gate.parked"` —— park 了、还没人决;两形要说的话不同,不许互相顶替);
344
+ - 「引擎的限额回落窗自动拒的」(旧 `autoDenied === true`)⇒ `isDenialLimitAutoDeniedGate(g)`;耐久 park 的 SLA
345
+ 到期 ⇒ `isParkSlaExpiredGate(g)`;人结算的 ⇒ `isHumanSettledGate(g)`;部署策略结算的 ⇒ `isPolicyRefusedGate(g)`;
346
+ 拒没拒、哪一层拒 ⇒ `isDeniedGate(g)` / `gateDeniedBy(g)`;通道自报的身份串 ⇒ `gateApprover(g)`(只供展示,不作鉴权)。
347
+ - 三条窗词(`approval_window_expired` / `denial_limit_window_expired` / `park_sla_expired`)**刻意不合并读**:
348
+ 旧形上它们共用一个 `settledBy: "timeout"`,分不出来正是当年补 `resolution` 这第二个键的原因。
349
+
350
+ 🔴 **判据仍用正面匹配**:谓词内部都是「恰等于某一个词」;端自己分支 `settlement.kind` / `deniedBy` /
351
+ `origin` 时同样逐词正面匹配 + 永远带 `default`,**绝不**写不等式 —— 不等式对缺席与任何未来新词都为真,
352
+ 「不知道是怎么结束的」会被折成某一种结局。三处词表属主都是引擎,表外词原样呈现。
353
+ 🔴 **缺席不可反推**:`gate` 缺席不是关于这次调用的事实(上游列了四种在 wire 上不可分辨的成因)⇒ 一律
354
+ 退回 `isError` + 文案;`settlement` 只在这次通过真的结算了一只 ask 时在场,缺席 ≠「不是拒绝」也 ≠「人拒的」。
355
+
356
+ **实现锚**:`src/adapter/downstream/eventToSdkMessage.ts` 的 `case 'tool_end'`;窄读器与谓词在
357
+ `src/gateOutcome.ts`;臂上的防御性读形 `ToolEndResultArmLike.gate` 在 `src/printToolResultFrame.ts`。
351
358
 
352
359
  ### 3e. 无臂帧(SDK union 里连成员都没有 ⇒ 穷举保护对它失效)
353
360
 
@@ -538,8 +545,8 @@ drain 那条拦的是「判完之后又来一批背后没有 park 的 abort 帧
538
545
  「这是主角」**,更不能据此渲「这条才是你刚决断的那个」。要断言主角身份,端自己按 `toolCallId`
539
546
  与手上的审批卡对账,别拿本键的缺席反推([honest-absence-not-fabricated-zero])。
540
547
 
541
- 🔴 **端怎么读(唯一正道)**:从 **`tool_end_result` 臂**上读(`errorCode` / `settledBy` /
542
- `approver` 同款位置),按 `toolCallId` 归集,自己决定呈现(建议:连坐簇按 repeated-error 族
548
+ 🔴 **端怎么读(唯一正道)**:从 **`tool_end_result` 臂**上读(`errorCode` / `gate` /
549
+ `delivered` 同款位置),按 `toolCallId` 归集,自己决定呈现(建议:连坐簇按 repeated-error 族
543
550
  软化折叠,头卡留 + 计数尾)。**判别取机读位,不猜文案** —— `Operation aborted` 这串是
544
551
  引擎词汇,会随 core 版本变。键常量从本包取:`import { SEMA_COLLATERAL_ABORT_KEY }`
545
552
  (单一真源,三端别各自手抄)。
@@ -611,8 +618,8 @@ pure 门 062⑥/⑦):
611
618
  | `rulePersisted?: boolean`(sdk 6.14.0,#225) | **缺席 ≠ false**(未带 `persistRule` 的回决 / 旧 server 省略);非布尔降缺席 | 决定「规则存没存上」的诚实告知;透传坏形会说反话 |
612
619
  | `ruleRefusal?: string`(sdk 6.14.0) | 非串/空串 ⇒ 降缺席 | 规则被拒的归因(如 `rule_not_offered`)原样呈现,不改写 |
613
620
  | `noteRecorded?: boolean`(sdk 6.16.0,#229) | **缺席 ≠ false**(未带 `note` 的回决 / 老 server 省略);非布尔降缺席 | 发了 `note` 而 `!== true` ⇒ **debug 留痕即可,不惊动用户**:决断没丢,丢的只是理由的持久档(纯活卡无行可落 / 店抖但裁决照常生效 / 并发同决议先落行) |
614
- | 🆕 `persistedRule?: string`(server ≥7.44,#340;**sdk 7.2.0 锚尚无** ⇒ 本包 `ToolApprovalRespondAckView` 超集位) | 非串/空串 ⇒ 降缺席;候选臂/批臂/兑付失败/老 server ⇒ 字段省略。🔴 **三道包内相关性闸**(过不了就降缺席 + 响亮留痕):①与 `persistedRules` **同场**(互斥臂的产物)⇒ 两位一起丢;②`rulePersisted !== true` ⇒ 丢(「没存上」却报「存成了什么」自相矛盾);③**本次不是编辑臂**(`persistRuleEdited !== true`)⇒ 丢 —— server `editedArmEcho` 只在编辑臂铸,候选臂上的这一位是一次没发生过的授权 | **编辑臂**兑付成功时规则店里**真正落盘**的规范文本。🔴 **界面要回显的是这一份,不是输入框里那一份** —— core 会规范化拼写(`Bash(adb *)` → `Bash(adb:*)`),回显输入框那份等于告诉人「你存的是 X」而店里是 Y |
615
- | 🆕 `persistedRules?: readonly string[]`(server ≥7.46.0,#334 design/377;同为超集位) | **整只判形**:非数组 / 空数组 / 含非串或空串成员 ⇒ 整只降缺席(半份清单比没有清单更坏);非批臂/失败/老 server ⇒ 省略。🔴 **同样过三道包内闸**:①与 `persistedRule` 同场 ⇒ 两位一起丢;②`rulePersisted !== true` ⇒ 丢;③**基数相关性** —— 条数必须等于本次所选 batch offer 的成员数(server 契约逐字「全体成员落地 + 展示序 = 成员序」),多报 = 声称存了用户在这只批里**没看见**的规则(授权范围被放大)、少报 = 这份清单不是它自称的「全体」;⚠️ **只核基数不复判文本**(规范化是引擎的活,在这里比对文本就是装第二个判官);⚠️ **在册残余 P-39**:基数抓不到「条数对但内容是另一批规则」—— 端渲成「**引擎报告**落盘的规则」而不是「你刚才选的那批」,正位解候上游补 additive 锚 | **批臂**兑付成功时落地的**全体**成员规范文本,**展示序**(= batch offer 的成员序)。「落地」含 persisted 与 deduped 两种(等价规则已在店 = 同意已生效)。🔴 **复数是契约**:合取批一次授权多条,折成一条或只报第一条会让人以为自己只批了一条 —— 端应逐条回显 |
621
+ | 🆕 `persistedRule?: string`(server ≥7.44;sdk 8.2.0 起在 `ToolApprovalRespondAck` 上声明 —— `ToolApprovalRespondAckView` 自 0.58.0 起就是它的别名,不再是超集;0.43.0–0.57.0 那段是超集位) | 非串/空串 ⇒ 降缺席;候选臂/批臂/兑付失败/老 server ⇒ 字段省略。🔴 **三道包内相关性闸**(过不了就降缺席 + 响亮留痕):①与 `persistedRules` **同场**(互斥臂的产物)⇒ 两位一起丢;②`rulePersisted !== true` ⇒ 丢(「没存上」却报「存成了什么」自相矛盾);③**本次不是编辑臂**(`persistRuleEdited !== true`)⇒ 丢 —— server `editedArmEcho` 只在编辑臂铸,候选臂上的这一位是一次没发生过的授权 | **编辑臂**兑付成功时规则店里**真正落盘**的规范文本。🔴 **界面要回显的是这一份,不是输入框里那一份** —— core 会规范化拼写(`Bash(adb *)` → `Bash(adb:*)`),回显输入框那份等于告诉人「你存的是 X」而店里是 Y |
622
+ | 🆕 `persistedRules?: readonly string[]`(server ≥7.46.0;同上,sdk 8.2.0 起声明) | **整只判形**:非数组 / 空数组 / 含非串或空串成员 ⇒ 整只降缺席(半份清单比没有清单更坏);非批臂/失败/老 server ⇒ 省略。🔴 **同样过三道包内闸**:①与 `persistedRule` 同场 ⇒ 两位一起丢;②`rulePersisted !== true` ⇒ 丢;③**基数相关性** —— 条数必须等于本次所选 batch offer 的成员数(server 契约逐字「全体成员落地 + 展示序 = 成员序」),多报 = 声称存了用户在这只批里**没看见**的规则(授权范围被放大)、少报 = 这份清单不是它自称的「全体」;⚠️ **只核基数不复判文本**(规范化是引擎的活,在这里比对文本就是装第二个判官);⚠️ **在册残余 P-39**:基数抓不到「条数对但内容是另一批规则」—— 端渲成「**引擎报告**落盘的规则」而不是「你刚才选的那批」,正位解候上游补 additive 锚 | **批臂**兑付成功时落地的**全体**成员规范文本,**展示序**(= batch offer 的成员序)。「落地」含 persisted 与 deduped 两种(等价规则已在店 = 同意已生效)。🔴 **复数是契约**:合取批一次授权多条,折成一条或只报第一条会让人以为自己只批了一条 —— 端应逐条回显 |
616
623
 
617
624
  **实现锚**:`src/hitl/toolApprovalWire.ts`(`readToolApprovalRespondAck` / `ToolApprovalFrameOutcome` /
618
625
  `surfaceToolApprovalFrameAndRespond` 的相关性门与三处 ack 消费分支)、
@@ -878,12 +885,15 @@ persistRuleBatchOfferIndex !== undefined
878
885
  **实现锚**:`src/hitl/toolApprovalWire.ts`(`RuleOffer` / `RuleOfferBatchMember` /
879
886
  `ApprovalCardRequest.ruleOffers`·`ruleOffersReadOnly`·`inputHasBidi` /
880
887
  `ApprovalCardAllowDecision.persistRuleBatchOfferIndex` / `RespondToolApprovalOpts.persistRuleBatchOfferIndex` /
881
- `ToolApprovalRespondAckView` / `readRuleOffers`·`readLegacyRuleSuggestions`·`readOfferSupply` /
888
+ `ToolApprovalRespondAckView` / `readRuleOffers`·`readLegacyRuleSuggestions`·`readRuleOfferSupply` /
882
889
  `surfaceToolApprovalFrameAndRespond` 的兑付段 / `surfaceFsApprovalAndDecide` 的行→卡重铸段)。
883
890
  **常驻门**:`scripts/run-client-core-pure-test.mjs`(B7 `ruleOffers` ①-⑩ 与 `inputHasBidi` ①-④)、
884
891
  `scripts/run-durable-card-display-keys-test.mjs`(③/④/④b/⑤ 只读腿)、
885
- `scripts/run-approval-frame-keys-test.mjs`(键镜像 24 项 + `AHEAD_OF_ANCHOR` 三条新登记 +
886
- 🆕 **server fixture 腿**)。
892
+ `scripts/run-approval-frame-keys-test.mjs`(帧键镜像 `TOOL_APPROVAL_FRAME_KEYS_MIRROR` 与 SDK 运行期锚
893
+ `TOOL_APPROVAL_FRAME_KEYS` 逐元素对账,例外只走三张带退出条件的登记表 —— 领先登记 `AHEAD_OF_ANCHOR`
894
+ (server 已发、SDK 锚未跟;今天一条 `mandate`)、`RETIRED_NOT_MIRRORED`(锚有、本包已退役;今天一条
895
+ `classifierUnavailable`)、`RETIRED_BUT_STILL_READ`(锚与镜像都还有、server 已不发、本包只做归一读;今天一条
896
+ `ruleSuggestions`);SDK 卡键 `APPROVAL_CARD_KEYS` 逐键登记;项数以门的总结行为准 + 🆕 **server fixture 腿**)。
887
897
  🔴 **fixture 腿要显式开**:`SEMA_CC_SERVER_FIXTURE=<装了 @sema-agent/server 的目录>`。它直接解析
888
898
  engine fixture 的 `dist/tool-approval.d.ts`,把 server 真发的帧键集与本仓镜像做**机器对表** ——
889
899
  SDK 运行期锚**按构造滞后于 server**,只对 SDK 锚比对的门对「server 已发、SDK 与本仓同时没有」的键
@@ -993,7 +1003,9 @@ decide 今天拿不到这枚 409**。本位是给「注入自有传输层 / 读
993
1003
  `ApprovalStaleError.currentPending`,但本包 peer 地板是 **>=7.2.0**(那一版上两个名字都不存在),
994
1004
  `import type` 会让装 7.2.0 的端**当场编不过**,而抬地板对所有消费方都是提要求、不是 additive。
995
1005
  ⇒ 与 `RuleOffer`(#334)同款处置:**自铸形 + 记账**,名字刻意**不同名**(`GateCurrentPending`)。
996
- **退役条件**:peer 地板抬到 `>=7.3.0` 的那一批换成上游类型别名。
1006
+ ✅ **已兑现**:peer 地板早已高于 7.3.0(今天的地板见 §0a),`GateCurrentPending` 现在就是上游形的别名
1007
+ (`src/hitl/hitlBridge.ts`:`GateCurrentPending` = 上游 `ApprovalStaleError['currentPending']` 的只读形);
1008
+ 名字作为已发布公面保留。上面两句是当时(地板 >=7.2.0)的记账,留作沿革。
997
1009
 
998
1010
  **实现锚**:`src/hitl/hitlBridge.ts`(`GateCurrentPending` / `readDecideCurrentPending`)、
999
1011
  `src/hitl/toolApprovalWire.ts`(`FsApprovalOutcome.currentPending`,allow + deny 两条 decide 失败臂)、
@@ -1481,14 +1493,18 @@ CHANGELOG 0.29.0「已知局限」段与相应 JSDoc 都有成文。**别在读
1481
1493
  > ⚠️ **ID 说明**:`P-n` 是**本档自己的编号**,与 cli 侧 census 的 `G` 号**不是同一套**
1482
1494
  > (本仓 `grep -rn "G5\b" src/ docs/` 零命中 —— 那个 id 住在 cli 的普查台账里)。
1483
1495
 
1496
+ > ⚠️ **P-43 / P-44 各有两行**(历史撞号,不改号):§7b 的 P-43 = accept-session 回退臂(0.47.0)、P-44 = 两选卡
1497
+ > cancel 查了再做(0.53.0);§7d 的 P-43 = hooks 第四条治理规则(0.83.0 已收)、P-44 = sdk 8.2.0 型面缺口
1498
+ > (0.58.0 已收)。已发段里的引用按所引内容对号;新登记从 P-46 起编。
1499
+
1484
1500
  ### 7a. 投影面缺口(上游铸了材料,本包没有接口交给端)
1485
1501
 
1486
1502
  | ID | 级别 | 一句话现状 | 实现锚 | 端**今天**必须怎么办 |
1487
1503
  |---|---|---|---|---|
1488
- | **P-1** | med | `task_progress` 白名单**只 stamp 八键**(`taskId`/`name`/`usage`/`model`/`currentAction`/`workflowRunId`/`workflowAgentLabel`/`parentToolCallId`;`model` 是 0.47.0 补的,#363)。server 投影**发 13 键**,**仍被剥掉五键**:`taskType` / `status` / `parentTaskId`(本条原本的三件)+ `seq`(core #258 stop-cycle 代际号,tick 这条腿今天无消费方;SDK 7.3.0 连声明都没有)+ `eventId`(EventIdentity 的另一半,至今无消费方)。✅ **0.47.0 销掉的那半**:原文说「`taskType` 与 `parentTaskId` 被剥掉,码里没有任何说法」—— 现在该臂头注有**逐条族扫账**(放行 8 / 剥离 5,各带「谁没在读它」),且档与码由常驻门 `scripts/run-additive-key-passthrough-test.mjs` G1 段**双向对账** | `src/adapter/downstream/eventToSdkMessage.ts` 的 `case 'task_progress'`;lane 启发式在 `src/adapt/arms.ts`(`recordWorkflowAgentTaskId` 三级门) | 别指望从一条 progress tick 上拿到委派类别(`taskType`)或嵌套归属(`parentTaskId`)。嵌套要从 `bg_notification.parentTaskId` 经 `src/fleet/fleetLedger.ts` 的 `recordBgParentRun` 恢复;workflow lane 归属走 `src/adapt/arms.ts` 的三级门。🔴 **别在端侧自己从别处补进投影**(那是绕过唯一投影口);要透一位先走 §3d 的前置条件 |
1489
- | **P-2** | med | 包内注释断言「**子代从不发终态 tick**」(`src/adapt/arms.ts` 的 `toolEndResultArm` ② MF-10 段逐字;`src/adapt/panelTasks.ts` 与补偿 T36/T34 复述),而 pin 的 SDK 逐字说 **server ≥1.258 会转发 core 的 SETTLE 终态 tick**(`"completed"`/`"failed"`)。**且这个矛盾自我维持** —— P-1 的白名单删掉了 `status`,所以终态 tick 就算上了 wire,在包内也**观测不到**。源码里**没有任何一处**把它记为假断言 | `src/adapt/arms.ts`(MF-10 段)、`src/adapt/panelTasks.ts`、`src/compensations.ts`(T36 `retireOn: 'W6(引擎为每条子代发终态 tick)后…'` / T34 `retireOn: null`) | 把四处防御 sweep 当成子代行 settle 的**唯一**机制;**不要**在端侧建「等子代终态 tick」的状态机 —— 包永远不会交给你一条 |
1490
- | **P-3** | med | `approval_request`(design/172 流内审批开卡帧)在本包**零消费口** ⇒ `dropped('unsupported_arm')`(有痕、没人接) | `src/adapter/downstream/eventToSdkMessage.ts` 的 `case 'approval_request'` | 存量路径今天仍能决断(legacy `tool_approval` 腿在,同一只 ask 出两帧,顺序钉死「先 legacy、后 `approval_request`」)。🔴 **但降级路径不保证**(逐字):legacy respond 是 **live-only + same-replica**(错副本 404),重连时 pending 卡靠 `approval_request` preamble 对账 —— 「收到 legacy 帧后断线、按 `Last-Event-ID` 重连只再看到 `approval_request`」以及**非粘性多副本部署**这两条路上,今天只能等窗口到期 → park/deny。**多副本 worker 上这是已知缺口不是环境问题** |
1491
- | **P-4** | med | **`approval_revoke` 在 SDK union 里连成员都没有**(SDK 顶注:known asymmetry,`Registering it is an open item for the next batch`)⇒ 本包不可能有 case ⇒ 运行期落 `dropped('unknown_arm')`;审批链也看不见它(`isToolApprovalFrame` 只认两帧)。全仓 `grep -rn "revoke"` = **0** | `src/adapter/downstream/eventToSdkMessage.ts` 的 `default` 臂;`src/hitl/toolApprovalWire.ts` 的 `isToolApprovalFrame` | 🔴 **引擎撤卡时本包不会替你撤那张卡** —— 被撤的 ask 会一直留在屏上,直到它自己的 5 分钟 TTL / deny 路径触发。要 revoke 语义的端只能自己接 raw named-SSE 腿并撤自己的卡(`unknown_arm` 的 drop 至少留了一行痕) |
1504
+ | **P-1** | med | `task_progress` 白名单**只 stamp 九键**(`taskId`/`name`/`usage`/`status`/`model`/`currentAction`/`workflowRunId`/`workflowAgentLabel`/`parentToolCallId`;`model` 是 0.47.0 补的,#363;`status` 0.65.0 起放行,见 §30d)。server 投影**发 13 键**,**仍被剥掉四键**:`taskType` / `parentTaskId`(本条原本三件里剩下的两件;~~`status`~~ ✅ 0.65.0 起进白名单)+ `seq`(core #258 stop-cycle 代际号,tick 这条腿今天无消费方;SDK 7.3.0 连声明都没有)+ `eventId`(EventIdentity 的另一半,至今无消费方)。✅ **0.47.0 销掉的那半**:原文说「`taskType` 与 `parentTaskId` 被剥掉,码里没有任何说法」—— 现在该臂头注有**逐条族扫账**(0.47.0 时放行 8 / 剥离 5;0.65.0 起放行 9 / 剥离 4;各带「谁没在读它」),且档与码由常驻门 `scripts/run-additive-key-passthrough-test.mjs` G1 段**双向对账** | `src/adapter/downstream/eventToSdkMessage.ts` 的 `case 'task_progress'`;lane 启发式在 `src/adapt/arms.ts`(`recordWorkflowAgentTaskId` 三级门) | 别指望从一条 progress tick 上拿到委派类别(`taskType`)或嵌套归属(`parentTaskId`)。嵌套要从 `bg_notification.parentTaskId` 经 `src/fleet/fleetLedger.ts` 的 `recordBgParentRun` 恢复;workflow lane 归属走 `src/adapt/arms.ts` 的三级门。🔴 **别在端侧自己从别处补进投影**(那是绕过唯一投影口);要透一位先走 §3d 的前置条件 |
1505
+ | **P-2** | ~~med~~ ✅ 0.65.0 已收 | ✅ **0.65.0 已收**(§30d):终态 tick 已透传 `status`,包内按 `completed` / `failed` 落终态(`src/adapt/arms.ts` 的终态二词表 `TERMINAL_TICK_STATUSES` → `settleFromTerminalTick`);四处防御 sweep 仍在,但只作终态 tick 缺席时(老服务端 / 丢帧 / 断流)的兜底。~~原文:包内注释断言「子代从不发终态 tick」,且 P-1 的白名单删掉了 `status`,终态 tick 在包内观测不到~~ | `src/adapt/arms.ts`(`TERMINAL_TICK_STATUSES` 分支)、`src/adapt/panelTasks.ts`(`settleFromTerminalTick`)、`src/compensations.ts`(T36) | 端**不要**自建「等子代终态 tick」的状态机 —— 包按终态 tick 落行,缺席时由防御 sweep 兜底,两条都走既有 chrome 臂(§30d:端零改) |
1506
+ | **P-3** | ~~med~~ ✅ 0.65.0 已收 | ✅ **0.65.0 已收**(§30i):`approval_request` 投内部臂 + chrome 臂 `approval_request`(载荷 = 帧信封原样窄读,`required: true`)。~~原文:本包零消费口 ⇒ `dropped('unsupported_arm')`~~ | `src/adapter/downstream/eventToSdkMessage.ts` 的 `case 'approval_request'`;`src/adapt/arms.ts`(`approvalFrameArm`) | 接 chrome 臂 `approval_request`:窄化(`isApprovalRequestFrameV1`)是端的动作,窄不下来 ⇒ 呈通用卡 + 人工决断,**永不 auto-deny**;`approvalId` 去重 / 按 `taskId` 归属 / 卡集对账(基准恒为开流 preamble)归端(§30i)。沿革:legacy `tool_approval` 腿的 respond 是 live-only + same-replica(错副本 404),同一只 ask 出两帧、顺序「先 legacy、后 `approval_request`」—— 这些是上游腿的语义,本包侧没有变 |
1507
+ | **P-4** | ~~med~~ ✅ 0.65.0 已收 | ✅ **0.65.0 已收**(§30i):sdk 已把 `approval_revoke` 收进事件 union(server ≥7.55.0),本包投内部臂 + chrome 臂 `approval_revoke`。~~原文:SDK union 连成员都没有 ⇒ `dropped('unknown_arm')`,全仓 grep revoke = 0~~ | `src/adapter/downstream/eventToSdkMessage.ts` 的 `case 'approval_revoke'`;`src/adapt/arms.ts`(`approvalFrameArm`) | 接 chrome 臂 `approval_revoke` 撤本地卡:窄化(`isApprovalRevokeFrameV1`)与按 `taskId` 归属是端的动作,窄不下来也照清该批本地卡;撤卡帧**可能整帧丢失**(帧是通知,行才是真源),卡集以开流 preamble 为准(§30i) |
1492
1508
  | **P-5** | 真缺口(未定级) | **durable 重放腿上,一条被重放的 `question` 今天不会再打开覆盖层** —— 覆盖层的入口是 `liveQuestionStore` 的 **live demux 写口**,不是投影函数。交互 REPL 无损,「断线后按 `Last-Event-ID` 续读」场景下是真缺口。补它属**行为面**改动(先要答「重放一条已过 5min TTL 的问题该不该弹窗」),按宪法三问单独走 | `src/adapter/downstream/eventToSdkMessage.ts` 的 `question`/`question_complete`/`elicitation`/`elicitation_complete` 臂(缺口逐字记在该处);`src/liveQuestionStore.ts` 头注(`LIVE-ONLY + SAME-REPLICA … No durable resume anchor`) | `respondToQuestion` 当 best-effort 用(404 = 「已经放掉了」,dismiss,**绝不重试**);重连后的恢复走 **409 自愈树 + 自己的 `/v1/approvals` 列举**,**不要**指望重放的 `question` 帧能弹出覆盖层 |
1493
1509
  | **P-6** | ~~low~~ ✅ 0.75.0 已闭 | ~~`compaction_outcome` 在本切片 `not_in_slice`,压缩失败对用户不可见~~ —— 0.75.0(CC-89)起投为内部臂 + chrome 臂 `compaction_outcome`,转录面仍零行(不编 transcript 形),见 §74 | `src/adapter/downstream/eventToSdkMessage.ts` `compactionOutcomeProjection` / `src/adapt/arms.ts` `compactionOutcomeArm` | 端接 chrome 臂后压缩失败可见;不接 = 同旧 |
1494
1510
  | **P-32** | 在册局限(0.36.0 两 wire 键过境后的**辖域**,非缺陷) @cli @web @desktop | **两键各只有一条腿,别按「两面能对上」写码**。① **`requiresRealApproval`**(#283)与 🆕 **`inputHasBidi`**(#341,0.43.0)**同族**:两位最初都只在**活卡帧**腿(`ToolApprovalFrame` → `ApprovalCardRequest`);**耐久腿原先零 stamp**(🆕 0.82.4 订正:`requiresRealApproval` 改为待决行顶层带这一位时透传,见 §96 S-1;🆕 0.82.6 射程订正:server ≥7.100.0 的待决列表带出这一位,durable 卡上会出现,只有更早的 server 上才仍缺席,见 §98 S-2;另见 §96 S-2 的门类位;`inputHasBidi` 那一半不变)—— sdk 7.1.0 / **server 7.46.0 fixture 重验**的`PendingCheckpoint` / `riskDescriptor` 都没有这两位(server 那份在**卡内**:`risk.requiresRealApproval` 是**恒在布尔**、`inputHasBidi` 是卡上的在场位,都不是行上的键),包侧刻意不猜载体名。🔴 **「帧上没有」与「卡上是 false」是两条不同的陈述,别互相推导**(server `ApprovalCardSchema` 顶注逐字)。② **`checkpointId`**(#285 件2):只在 **409 `conflict.session_active_run` 体 + 其 SSE done 帧**的 `pendingGate`;另外三条 park 读面(`/v1/assistant/inbox`、`GET /v1/approvals`、`/v1/approvals/stream`)**都没有**这一格(后两条要给 checkpoint 表反范式一列 = SQL 面双库门,属另一批) | `src/hitl/toolApprovalWire.ts`(帧腿 stamp / durable 腿刻意零 stamp,两处 JSDoc 逐条写明理由)· `src/adapter/runStream.ts`(`ActiveRunPendingGate.checkpointId` + `pendingGateIsProvablyDifferent`)· 行为钉:`run-durable-card-display-keys-test.mjs` ⑨ 段(0.82.4 起:顶层同名键严格 `true` 带,其余最像的载体名不带)· `run-selfheal-reopen-test.mjs` G1/G1b | ① **`requiresRealApproval` 在场 ⇒ 一切自动放行让位**(记住的规则 / `allow_session` / bypass 姿态),**缺席绝不读成 `false`**(缺席 = 不是安全类 ask **或** 老 server,两者同形不猜);durable 卡上在早于 7.100.0 的 server 上**恒缺席**(0.82.6 射程订正:7.100.0 起待决列表带出这一位,见 §98 S-2),别据此认为「durable 门都不是安全类」。② **`checkpointId` 只做两件事**:落日志/排障关联,以及经 `pendingGateIsProvablyDifferent(prev, next)` 做**单向**判断「id 变了 ⇒ 不是刚才那一行」。🔴 **`false` 是「证不出」不是「同一道门」**,🔴 **绝不**当跨调用去重键(server 选行是**无序 `LIMIT 1`**、同 session 可并存多条 pending 行 ⇒ 同一情形连续两次 409 可能报不同 id;也可能 id 不变而 `activeTaskId` 已换),🔴 **绝不**拿它去 join durable 队列行(必然落空,且落空与 legacy 行同形)。缺席是**三成因合流**(legacy 行 / 值没过 server 信任边界校验 / 整只材料读取失败),读作「不知道这道门叫什么」 |
@@ -1497,8 +1513,8 @@ CHANGELOG 0.29.0「已知局限」段与相应 JSDoc 都有成文。**别在读
1497
1513
 
1498
1514
  | ID | 级别 | 一句话现状 | 实现锚 | 端**今天**必须怎么办 |
1499
1515
  |---|---|---|---|---|
1500
- | **P-7** | med | durable `/decide` 腿**无 ack 消费层**:`decideTool` / `answerQuestion` 返回 `Promise<unknown>`,响应体不被结构化读 —— 与 live 帧腿的 `readToolApprovalRespondAck` 五位诚实读**不对等** | `src/hitl/hitlBridge.ts`(`decideTool` / `answerQuestion` / `decideRaw` 的返回型) | durable 腿上「记住了没有 / 编辑转发了没有 / note 落行了没有」**在类型层就读不到**。端**不得**据 durable decide 的返回值渲任何断言性告知 |
1501
- | **P-8** | med | **plan review 没有 edit 态**:判决只有 `'approve' \| 'reject' \| 'dismissed'`,选项字面就两条(`Yes, approve and run the plan` / `No, reject it (keep planning)`);`dismissed` **不是 wire 上的第三种判决** —— 命中它时 park 原样留着,`deliverDecision`/`decidePlanReview` 根本不可达。包内**任何一层都没有**「编辑 plan」的 affordance | `src/hitl/planReviewWire.ts`(`planReviewDecisionFromAnswer` / `PLAN_REVIEW_APPROVE_LABEL` / `PLAN_REVIEW_REJECT_LABEL` / `dismissed` 早退分支);durable 腿的 `editedPlan?` 位见 `src/hitl/hitlBridge.ts` 头注 | 把「编辑」建模成 **reject → 继续 planning → 新 turn**。🔴 内联 plan 编辑器**不许**经 `planReviewWire` 投递,也**不许自造第三个选项标签**(core 围栏 `selected ⊆ options`,表外标签会落 `dismissed`)。要 edit 态走 C 板提需求,由包补位([C163]-2④「plan edit 三态候包位**不开洞**」) |
1516
+ | **P-7** | med(返回型面;回执另有读口) | durable `/decide` 腿的**回执另有读口**:`readDecideReceipt` / `DecideReceiptView`(`src/decideReceipt.ts`,0.65.0 起,§30h;`rememberApplied` 那一位 0.82.6 起,射程见 §98)。`decideTool` / `answerQuestion` 的返回型仍是 `Promise<unknown>`、不被结构化读 —— 与 live 帧腿的 `readToolApprovalRespondAck` 五位诚实读仍**不对等** | `src/hitl/hitlBridge.ts`(`decideTool` / `answerQuestion` / `decideRaw` 的返回型)· `src/decideReceipt.ts` | 端要渲断言性告知,**读回执读口**,不读返回值;读口里在场的位按读口的缺席语义读,读口里没有的位(编辑转发了没有 / note 落行了没有)今天仍读不到,端**不得**据此渲任何断言性告知 |
1517
+ | **P-8** | med | **plan review 没有 edit 态**:判决只有 `'approve' \| 'reject' \| 'dismissed'`,缺省是两选卡(`Yes, approve and run the plan` / `No, reject it (keep planning)`);0.72.13 起两道闸都过时(宿主声明这条任务以 `permissionMode:"plan"` 提交 ∧ 引擎 ≥7.86.0)出三选卡,两个 Yes 为 `Yes, and auto-accept edits` / `Yes, and manually approve edits`(`src/hitl/planReviewWire.ts` 的 `PLAN_REVIEW_APPROVE_AUTO_LABEL` / `PLAN_REVIEW_APPROVE_MANUAL_LABEL`);`dismissed` **不是 wire 上的第三种判决** —— 命中它时 park 原样留着,`deliverDecision`/`decidePlanReview` 根本不可达。包内**任何一层都没有**「编辑 plan」的 affordance | `src/hitl/planReviewWire.ts`(`planReviewDecisionFromAnswer` / `PLAN_REVIEW_APPROVE_LABEL` / `PLAN_REVIEW_REJECT_LABEL` / `dismissed` 早退分支);durable 腿的 `editedPlan?` 位见 `src/hitl/hitlBridge.ts` 头注 | 把「编辑」建模成 **reject → 继续 planning → 新 turn**。🔴 内联 plan 编辑器**不许**经 `planReviewWire` 投递,也**不许自造第三个选项标签**(core 围栏 `selected ⊆ options`,表外标签会落 `dismissed`)。要 edit 态走 C 板提需求,由包补位([C163]-2④「plan edit 三态候包位**不开洞**」) |
1502
1518
  | **P-9** | low | `wakeSubagent` 在 `CLIENT_VERBS` 里是 `required:false` 的**声明位**,包内无实现编排 | `src/clientSlice.ts`(`CLIENT_VERBS` 的 `wakeSubagent` 行) | 端要这条腿得自己接 `runs.resumeSubagent`;取址口径受 P-1 拖累(`parentToolCallId` 不一定在场,合法退路是 `agentName`,同名多员由 server 409 `steering.ambiguous_target` 兜) |
1503
1519
 
1504
1520
  | **P-33** | low | **`CANCEL_DENY_BUDGET_MS` 的论证前提已作废,数值未动**(0.42.0 §2.4 撤稿件的如实残余):那 2s 预算的原理由是「DENY-abort 语义上引擎收到即终结 run」,而 server `ASSISTANT-WIRE-CONTRACT.md` §4a 逐字反对(**DENY 是 TOOL 级应答,永远不是 run kill**)。于是「decide 慢」与「deny 丢了」这两件事在 2s 这个刻度上**不可分**,晚到的成功也不会撤回那行 warn(只有 10s 自清) | `src/hitl/hitlHostSurface.ts`(`CANCEL_DENY_BUDGET_MS` 头注的重审段 + `observeCancelByDeny`) | 端**不要**把 `CANCEL_DENY_WARN_TEXT` 那行当成「会话一定锁死了」的判据——它今天只证明「2s 内没收到 settle」。根治要做成两档(软档只记 debug、硬档才上屏),那是**跨仓一批**(包侧改时序 + 壳侧同批换判据与用例),本批**刻意不做单边改动** |
@@ -1514,7 +1530,7 @@ CHANGELOG 0.29.0「已知局限」段与相应 JSDoc 都有成文。**别在读
1514
1530
 
1515
1531
  | **P-43** | med(**存量、非本批引入** —— 0.42.0 基线上逐字相同) @cli @web @desktop | 🆕 **accept-session 回退臂的错误分类比它自己的注释宽**(#363 异源复审 [high] 的**未收窄那一半**,如实登记):`allowSession` 腿先发 `approve + remember:'session'`,失败时回退一发纯 approve;那条 catch 的注释写的是「**只**兜『老 server 不识别 remember ⇒ 400 未知键』这一形」,而实际形是 **catch-all 减去三条具名再抛**(`HitlSafetyError` / `DecideTransportRetryExhaustedError` / 0.47.0 新加的『拒体带 `currentPending`』)。⇒ 一个 **404 / 5xx / 宿主自抛的无 status 错误**今天仍会被当成「老 server 不识别 remember」并**自动重发**一次纯 approve。收窄成「只认 400」是**行为改动**,不属于 0.47.0 这个 additive 批的射程 | `src/hitl/toolApprovalWire.ts`(`case 'allow'` 的内层 catch) | 端今天不需要做什么(两发都是 approve,不构成跨门的 double-act);**属主批**:下一个愿意改老引擎兼容腿宽度的批把它收窄成精确的 legacy-400,并同批给回退臂补正控/负控 |
1516
1532
  | **P-44** | 已知缺口(0.53.0 登记;正位解在 **server 读写面**:cancel 两臂状态 CAS 契约明写 + 可选版本前置,S-122 车 7.73.0;core 无席 [7006]/[7007])@cli | 🆕 **L-93 两选卡的 cancel 是「查了再做」,不是原子条件取消**(异源对抗复审 R2 [high] 如实登记):卡后那一发 `runs.get` 状态复证 + 开枪前那一发 `listOwnedPendingApprovals` 待决行复证,把窗口从「人看卡的任意长时间」压到「两发复证到一发 cancel」的毫秒级,**但没有关死** —— 待决行若恰在这两步之间恢复(store 恢复 / 会话重新附着),那一枪仍会落在一条**其实还能被决断**的 run 上,而 `runs.cancel` 会把它终态化。**客户端关不死它**:真正的关法是引擎侧的**条件取消**(带审批快照版本 / checkpoint 标识,条件变了回 409 且不取消),那是 wire 能力,不是壳能自造的语义 | `src/adapter/activeRunSelfHeal.ts`(`staleParkArm` 开枪前那一段的头注);§16b 四道防线 | 端照旧只在用户显式选「停掉它」时才走这条路,**卡面必须说清这是放弃这条 run**;要彻底关死,按跨仓宪法向引擎提**条件取消**(`If-Match` 形)。在那之前这条路的剩余风险是**在册**的,不是未知的 |
1517
- | **P-45** | 在册局限(**存量族**,非本批引入)@cli @web @desktop | 🆕 **「run 读到终态」不等于「claim 已经落地释放」**(同上 R2 [medium]):`waitForClaimRelease` 的判据是 `runs.get` 读回 {@link CLAIM_RELEASED_STATES} 里的终态词,而本档 §12 与 `running-settled` 臂自己记着:409 报的 claim 与 poll 口径**可以短暂相左**。⇒ `running-cancelled`(0.37.0 起)与 🆕 `stale-park-cancelled`(0.53.0)两条 `resending` 结局,理论上都可能在 claim 尚未落地释放时重发一次,代价 = **再吃一个 409**(自愈树当拍再分诊)。**为什么不单修新那一条**:两条问的是同一个问题,给它们两把不同的尺 = 同一判据两份实现,必漂;正位解是一条 **session/claim 专用读面**(今天 `DurableRunVerbs` 里没有这个动词) | `src/adapter/activeRunSelfHeal.ts`(`CLAIM_RELEASED_STATES` 头注 / `waitForClaimRelease` / 两条 `resending` 结局) | 端**不要**把 `resending` 读成「会话一定空了」——它的成文含义是「引擎报那条 run 已终结」。重发撞回 409 是**已知可能**,自愈树会当拍再分诊(不是新 bug);要更强的保证,得等引擎给 claim 读面。🔴 **文案面同形存量**:0.53.0 的 `stale-park-cancelled` 行已按这条边界改写(只说「引擎报它已终结」+ 「可能要再发一次」),而 0.37.0 的 `running-cancelled` 行仍写着「The engine confirmed it is no longer holding this session」—— 同一把尺、两种说法。**属主批**:下一个愿意动那条既有产品文案的批同步收紧(本批不动,因为它是三端在跑的现产品串,改它属行为面/文案面变更,要单独走验收与端对表) | 正位解(core [7006]/server [7007]):server 7.73.0 `GET /v1/runs/:id` +`heldBy`(=instanceId,null=无持有)/+`cancelRequested`;契约「`heldBy` 变 null 或 status 终态 = claim 释放」,`waitForClaimRelease` 届时改读 `heldBy`。
1533
+ | **P-45** | 在册局限(**存量族**,非本批引入)@cli @web @desktop | 🆕 **「run 读到终态」不等于「claim 已经落地释放」**(同上 R2 [medium]):`waitForClaimRelease` 的判据是 `runs.get` 读回 {@link CLAIM_RELEASED_STATES} 里的终态词(0.68.0 起新引擎另有 `heldBy` 直证、优先于它,见最后一列;本条说的是只剩终态词推断的那一路),而本档 §12 与 `running-settled` 臂自己记着:409 报的 claim 与 poll 口径**可以短暂相左**。⇒ `running-cancelled`(0.37.0 起)与 🆕 `stale-park-cancelled`(0.53.0)两条 `resending` 结局,理论上都可能在 claim 尚未落地释放时重发一次,代价 = **再吃一个 409**(自愈树当拍再分诊)。**为什么不单修新那一条**:两条问的是同一个问题,给它们两把不同的尺 = 同一判据两份实现,必漂;正位解是一条 **session/claim 专用读面**(今天 `DurableRunVerbs` 里没有这个动词) | `src/adapter/activeRunSelfHeal.ts`(`CLAIM_RELEASED_STATES` 头注 / `waitForClaimRelease` / 两条 `resending` 结局) | 端**不要**把 `resending` 读成「会话一定空了」—— 0.83.5 起看结局上的 `releaseConfirmedByEngine`:在场 = 引擎直说会话已交出(`heldBy: null`);缺席 = 只凭终态词判的释放,成文含义仍是「引擎报那条 run 已终结」,重发撞回 409 是**已知可能**,自愈树会当拍再分诊(不是新 bug)。✅ **文案面同形存量 0.83.5 已收**:`running-cancelled` / `stale-park-cancelled` / `ask-decided-without-card` 三条 `resending` 结局的用户行与注入件行都按这一位分说 —— 位在场才说引擎确认不再占着这个会话 / 会话已空出来;缺席只说那条 run 已结束,并提示可能要再发一次(注入件行:可能再被挡一次)。位在结局对象的键上,宿主复制 / 序列化不丢。释放判据与重发腿不变(两条证据仍取并) | ✅ **0.68.0 已兑现**:server ≥7.73.0 的 `GET /v1/runs/:id` 带 `heldBy`(持有者实例名,`null` = 无持有)与 `cancelRequested`;`waitForClaimRelease` 两条释放证据取并 —— `heldBy: null` 直证优先,引擎不发这一位时回落终态词推断;`cancelRequested` 只说请求已受理,不作释放证据(门 `scripts/run-selfheal-reopen-test.mjs` G8④ 段)。0.83.5 起直证那一路在结局上带 `releaseConfirmedByEngine`。
1518
1534
 
1519
1535
  ### 7c. 多会话(sessionKey)面在册局限 —— 多会话端**接之前必读**
1520
1536
 
@@ -1531,7 +1547,7 @@ CHANGELOG 0.29.0「已知局限」段与相应 JSDoc 都有成文。**别在读
1531
1547
 
1532
1548
  | ID | 级别 | 一句话现状 | 实现锚 | 端**今天**必须怎么办 |
1533
1549
  |---|---|---|---|---|
1534
- | **P-15** | med(6 → **5**,#292 P1 结清一条) | `REQUEST_FIELD_MATRIX` 有 **5 个字段登记为 `gap: true`**(表内 `gap:true` 的定义逐字 = 「这条差异**没有正当理由,是漏的**」),全部是 **print/headless 车道缺席**:`settings.ultracode` · `reasoningEffort` · `model` · `clientContext` · `scratchpadDir`。表内点名的后果:`clientContext` 缺席 ⇒ **引擎误标 (UTC)**;`scratchpadDir` 缺席 ⇒ **`-p` 的工具写不进 exemptDir**。**已结清**:`settings.<resolved>`(0.34.0 / #292 P1 —— 版本号与 CHANGELOG 段**同一个**,对抗复审 [low] 抓的正是两处不一致)—— 它的缺席是**权限方向**的(`-p` 上用户 settings 的 `permissions.deny/ask` 整体不被引擎求值,cli [4208] 实测),现两车道都 stamp | `src/request/taskRequest.ts`(`REQUEST_FIELD_MATRIX` 的 `gap` 列) | headless 车道上这五项**确实不上 wire**。端不要在 print 车道假设它们在场;补齐是**行为改动**,要单独一条测试,不许端侧偷加。`settings.<resolved>` 反过来:print 车道现在**会**摊开 resolver 快照 ⇒ 端必须把值放进 `input.settings.resolved`(端不给值仍是零 stamp,不会凭空出现),且该车道 `settings` 子键走**开放集**口径:`unregisteredRequestKeys` 只放行**表外**动态子键(快照自己的 permissions/env/model/… 不可枚举),**表内但不属于本车道**的子键(今天 = print 的 `settings.ultracode`)仍会被点名 —— 端不许把它白名单化,那条红是真的;另:`settings` 子键值为**函数**(如自有 `toJSON`,能在序列化时整只改写字节)恒被点名且构造器不 stamp。🔴 **0.35.0 起快照通道对具名通道让位**:见 P-15c |
1550
+ | **P-15** | med(6 → 5 → **3**) | `REQUEST_FIELD_MATRIX` 有 **3 个字段登记为 `gap: true`**(表内 `gap:true` 的定义逐字 = 「这条差异**没有正当理由,是漏的**」),全部是 **print/headless 车道缺席**:`settings.ultracode` · `clientContext` · `scratchpadDir`(`reasoningEffort` 0.77.0 起、`model` 0.79.0 起无人值守车道都有座,已出本表)。表内点名的后果:`clientContext` 缺席 ⇒ **引擎误标 (UTC)**;`scratchpadDir` 缺席 ⇒ **`-p` 的工具写不进 exemptDir**。**已结清**:`settings.<resolved>`(0.34.0 / #292 P1 —— 版本号与 CHANGELOG 段**同一个**,对抗复审 [low] 抓的正是两处不一致)—— 它的缺席是**权限方向**的(`-p` 上用户 settings 的 `permissions.deny/ask` 整体不被引擎求值,cli [4208] 实测),现两车道都 stamp | `src/request/taskRequest.ts`(`REQUEST_FIELD_MATRIX` 的 `gap` 列) | headless 车道上这三项**确实不上 wire**。端不要在 print 车道假设它们在场;补齐是**行为改动**,要单独一条测试,不许端侧偷加。`settings.<resolved>` 反过来:print 车道现在**会**摊开 resolver 快照 ⇒ 端必须把值放进 `input.settings.resolved`(端不给值仍是零 stamp,不会凭空出现),且该车道 `settings` 子键走**开放集**口径:`unregisteredRequestKeys` 只放行**表外**动态子键(快照自己的 permissions/env/model/… 不可枚举),**表内但不属于本车道**的子键(今天 = print 的 `settings.ultracode`)仍会被点名 —— 端不许把它白名单化,那条红是真的;另:`settings` 子键值为**函数**(如自有 `toJSON`,能在序列化时整只改写字节)恒被点名且构造器不 stamp。🔴 **0.35.0 起快照通道对具名通道让位**:见 P-15c |
1535
1551
  | **P-15b** | 🔴 权限方向 | `REQUEST_FIELD_MATRIX` 的 stamp 门对**未登记键静默丢弃** —— 表里点名的真实危险形逐字:**「用户显式排除的工具被静默放回」(权限方向回归,类型层不报)**。`excludeTools` 是真 wire 键、早在 seatContract 的 `START_SESSION_OPTION_KEYS` 里,却曾长期在矩阵外;**今天只有 desktop 在发它** | `src/request/taskRequest.ts`(`excludeTools` 行)、`src/seatContract.ts`(`START_SESSION_OPTION_KEYS`) | 端自拼 taskReq 的键**必须**先进矩阵;上 wire 前跑 `unregisteredRequestKeys(req, lane)` 并**当红对待**,别当 lint |
1536
1552
  | **P-15c** | 🔴 治理方向(0.35.0 行为改动) | `settings.<resolved>` 快照是**开放集 spread**(子键即 wire 键)⇒ 它天生是一条**第二通道**。0.34.0 只剥「车道异名」子键,于是**两条车道都登记**的具名子键剥不到 —— 而它们各有治理门:`hooksForWire()` 是 fail-closed(无 `SettingsPort` / 工作区未受信 / 管理侧关停全部 hooks / 检查抛错 ⇒ 返 `undefined`),此时快照里那份**没过门**的 `hooks` 照样上 wire = 关停令等于没下。让位修前靠**合并序**(具名键覆盖快照),而合并序只在具名通道**有值**时管用,门否决时恰恰**没值**。0.35.0 改**结构剥离**:凡表里有 `settings.<sub>` 行的子键(`hooks`/`webSearch`/`ultracode`),快照一概不产;表外子键(`permissions`/`env`/`model`/…)原样摊开 | `src/request/taskRequest.ts`(`namedSettingsSubKeys` / `resolvedSnapshotForWire`) | ① 具名键**必须走具名位**:`input.settings.hooks` / `.webSearch` / `.ultracode` —— 只塞进 `input.settings.resolved` 的宿主从 0.35.0 起那两个键**不再上 wire**(两条车道对称,不是新差异面);② `input.settings.resolved` 只放**表外**的 resolver 产物;③ 该位为 `undefined`/`null` = 合法缺席(照旧降空照发),**合法载体只有对象字面量与 `null` 原型字典**;其余形(数组/原始值/boxed 包装对象/`Map`/**类实例**)抛 `TypeError`。判据锚 **prototype 层数(realm 无关 —— iframe/vm/另一渲染进程的字面量照过)不锚自报标签**:类实例与 `Symbol.toStringTag` 伪造都能自报 `[object Object]`,而摊开走 `Object.entries`(只取自有可枚举键)⇒ 权限面挂在原型 getter 上会摊出空快照、请求照发。这一位摊开的是已解析权限面,降空 = 带着被剥掉的 `deny/ask` 发出去,故 fail-closed;端别 catch 掉它当没事,那是上游产出坏了 —— 把快照**平摊成对象字面量**再传即可;④ `permissions` **子树**也递归校「序列化后还是同一份内容吗」:嵌套 `Map`/`Set`/类实例/boxed/环、**任何一层**上可 call 的 `toJSON`(自有/非枚举/原型链/数组子类)、**非有限数**(`NaN`/`±Infinity`)都 ⇒ `TypeError`,报路径如 `permissions.deny[0]`,不猜 schema;射程刻意只到 `permissions`(整体深净化 = 独立工单)。⚠️ 两条**成文边界**(各有判据钉住现状,不是漏):① 构造之后污染 `Array.prototype`(重建出来的数组必须是真数组);② `getPrototypeOf` 被 Proxy 陷阱撒谎的载体(同 realm 内无可移植的 Proxy 读法)——两者都**不新增丢失面**(发的字节 = 原生序列化那一份),要关得靠「受信 resolver 出口发烙印/已物化记录」那个结构 |
1537
1553
  | **P-15d** | 已知缺口(权限方向;0.35.0 登记,**刻意未在本批闭合**) | 0.35.0 把「序列化后还是同一份内容吗」这条不变量**只**落到 `settings.resolved.permissions` 子树(校 + 就地重建)。**同一条论证对其它带权限含义的位一样成立,而它们今天没有等价强制**:`permissionMode`(字符串位;非串载体的 `toJSON` 能自己决定 wire 上那个词)· `excludeTools`(丢一个元素 = **用户显式排除的工具被放回**,与 P-15b 同一方向)· `additionalDirectories` / `additionalReadDirectories`(读写边界根)· `agents` / `hooks` / `attachments`(对象位,同款 `toJSON` 改写面)。**为什么不在本批一起做**:逐个挑两三个字段补,只会造出下一个同样任意的边界;正解是**一次**把「wire 载荷 JSON-safe 规范化」做成包级闸口(该工单自 0.34.0 起在册),覆盖所有位并同批建判据 | `src/request/taskRequest.ts`(`materializeJsonFaithful` 的射程 = `permissions`;边界本身有一条判据钉着:非权限位的同款畸形**不拦**) | 端**不要**推断「本包会替我把请求体洗干净」——今天只有 `permissions` 子树有这个保证。上 wire 的值请自己保证是 JSON 原生形(字面量 / 数组 / 字符串 / 有限数):别拿类实例、`Map`、带 `toJSON` 的包装对象、访问器对象当载体。尤其 `permissionMode` / `excludeTools`:前者决定整会话的审批姿态,后者丢一个元素就是权限变宽 |
@@ -1553,19 +1569,20 @@ CHANGELOG 0.29.0「已知局限」段与相应 JSDoc 都有成文。**别在读
1553
1569
 
1554
1570
  | **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
1571
 
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 → flag(0.83.3 起含 flag,排在 local 之后)是本包发往引擎的 hooks 数组的**拼接**顺序,不是合并标量的顺序 —— 托管在前的理由(引擎 hook 执行器三种资源先到先得,托管排后会被挤掉)与已知代价(`PreToolUse` 上排在托管之后的 hook 能在托管放行之后改写输入)见 §103a H-9 与 §103 包侧缺口 ⑧。不做逐源近似的理由不变(「任一来源为 true」在 user=`true` ∧ local=`false` 上判反)。余项:CC 云会话路径的逐来源语义本版不跟、宿主的安全模式本包没有读口(§100 包侧缺口 ⑤;0.83.1 起插件 hook 有安全·bare 位 `suppressedByStartupMode`(§101),设置来源 —— 0.83.3 起含 flag 来源 —— 在这一位下仍不收窄,§103 包侧缺口 ③) | `src/hooksWireCaps.ts`(头注「第四条腿」段)· `src/host.ts` `SettingsPort.mergedDisableAllHooks`;§15b/§15d;§100a-5 | 装 `SettingsPort` 的宿主实现 `mergedDisableAllHooks()`,返回本机 hooks 执行器读的同一个合并值;**未实现**的宿主仍**不要**假定用户 settings 里的 `disableAllHooks` 会挡住引擎腿的 hooks |
1572
+ | **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 → flag(0.83.3 起含 flag,排在 local 之后)是本包发往引擎的 hooks 数组的**拼接**顺序,不是合并标量的顺序 —— 托管在前的理由(引擎 hook 执行器三种资源先到先得,托管排后会被挤掉)与已知代价(`PreToolUse` 上排在托管之后的 hook 能在托管放行之后改写输入)见 §103a H-9 与 §103 包侧缺口 ⑧。不做逐源近似的理由不变(「任一来源为 true」在 user=`true` ∧ local=`false` 上判反)。余项:上游云会话路径的逐来源语义本版不跟;宿主报启动模式时设置来源随模式收窄(0.83.5 起,§105 SM-1:安全模式与 bare 模式都只发 managed;读口 `SettingsPort.hooksStartupMode()`,或传了计划时插件读数上的 `suppressedByStartupMode`,后者按安全模式处置) | `src/hooksWireCaps.ts`(头注「第四条腿」段)· `src/host.ts` `SettingsPort.mergedDisableAllHooks`;§15b/§15d;§100a-5 | 装 `SettingsPort` 的宿主实现 `mergedDisableAllHooks()`,返回本机 hooks 执行器读的同一个合并值;**未实现**的宿主仍**不要**假定用户 settings 里的 `disableAllHooks` 会挡住引擎腿的 hooks |
1557
1573
 
1558
1574
  | **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`,提货前先抬依赖 |
1575
+ | **P-46** | 包侧缺口(0.68.2 起成文;KL-156)@cli @web @desktop | 中途关闭记忆采集的动词 `POST /v1/runs/:id/memory/capture-optout`(sdk `runs.memoryCaptureOptOut`,能力位 `runMemoryCaptureOptOut`,server ≥7.70.0)的**结局处置表仍未归包**:200 `created` / `existed`;403 `memory.capture_optout_denied`(终局,别重试);409 `steering.not_running`(四种成因:三种的正解是本会话下一次提交带 `memoryCapture: "off"`,run 活在别的副本上那种是把调用重发到持流副本)/ `memory.capture_optout_sweep_failed`(🔴 **部分成功**:记录已立、残留清扫失败,重发即重试清扫)/ `memory.capture_optout_unavailable`(这条 run 没挂记忆会话,无事可做)/ `config.memory_capture_unsupported`(部署形状,提交时的声明形撞同一堵墙);503 `memory.capture_optout_unpersisted`(采集**仍开着**,可重试)。恢复动作按错误码分、不按状态码分,是三端公共判定;本包只收了提交时的声明形铸点 | `src/request/taskRequest.ts`(`memoryCapture` 行,声明形)· sdk `dist/resources/runs.d.ts` 的 `memoryCaptureOptOut` 头注(处置表原文) | 今天没有端调这个动词。要接的端先提需求(§8-H),由包补处置表与措辞单源;**不要**在端侧先写一份 —— 按状态码分支会把 `sweep_failed` 这条部分成功读成失败、把 `memory_capture_unsupported` 读成「下次提交带声明就好」 |
1559
1576
 
1560
1577
  ### 7e. 缺口的共同形状(值得单独说)
1561
1578
 
1562
1579
  **P-1 / P-2 / P-3 / P-4 / P-5 / P-6 / P-7 是同一类**:上游(server / SDK)已经把材料铸到 wire 上了,
1563
- 而**本包没有接口把它交给端**。逐条摆出来的理由:**端在这些点上「读不到」不是端的 bug,
1580
+ 而**本包没有接口把它交给端**(其中 P-2 / P-3 / P-4 / P-6 已收,P-7 的回执另有读口;仍开着的是 P-1 剩下的四键与 P-5)。逐条摆出来的理由:**端在这些点上「读不到」不是端的 bug,
1564
1581
  补救也不该在端侧做**(跨仓缺陷源头修复,禁下游侧路补救 —— env 覆盖 / 参数旁支 / wrapper / monkey-patch
1565
1582
  一律违宪)。发现新的同形件请按 [C162] 令④ 回 C 板,带坐标。
1566
1583
 
1567
- **P-1 与 P-2 是一条链**:白名单剥掉 `status` ⇒ 终态 tick 不可观测 ⇒ 「子代从不发终态 tick」那句
1568
- 断言**永远无法被本包自己证伪**。修其中一个才能验另一个。
1584
+ **P-1 与 P-2 曾是一条链**(白名单剥掉 `status` ⇒ 终态 tick 不可观测 ⇒「子代从不发终态 tick」无法自证伪);
1585
+ 0.65.0 两条同批闭合,本段留作沿革。
1569
1586
 
1570
1587
  **P-10 ~ P-14 是同一类**:keyed API 建好了,而**消费路径还没带键透传**。
1571
1588
  多会话端必须按「今天怎么办」那一列绕行,**不要**假设 `*For` 变体已经全链贯通。
@@ -1595,15 +1612,8 @@ clone(web/desktop/CI)去读都扑空。凡属这一类(扫描 journal / workflow
1595
1612
  > 用法:web / desktop 按 [C162] 四令提货时**逐项打勾**;每一项后面括号里是验证方式,不是靠读代码相信。
1596
1613
 
1597
1614
  **A. 依赖与门**
1598
- - [ ] `@sema-agent/client-core` 版本对齐 §0a;**同批抬 `@sema-agent/sdk` 到 >=6.17.2**(peer floor)。
1599
- 🔴 **真实理由是类型面,不是「值级 import 上炸」**(#252 直证订正,2026-08-14):抬 floor 的那一批
1600
- **没有**新增任何值级 sdk import(值级面仍是 `AgentClient` / `SseIdleError` / `probeHealth` /
1601
- `APIError` / `TaskStopConflictError` 五个符号,零增减);硬要求来自 durable 卡两展示键读的
1602
- `PendingCheckpoint.ruleSuggestions` 与 `PendingCheckpoint.governanceForced` —— 这两位在 sdk
1603
- **6.16.0 的 `.d.ts` 上根本不存在**(实拉 6.16.0 tarball 直证:`dist/types.d.ts` 全文
1604
- `ruleSuggestions` 零命中,`governanceForced` 只长在 `PendingGateMaterial` 上),低于 6.17.2 的
1605
- 宿主**编译期**红。⚠️ 6.16.0 已经带 `same-origin-relay` 守卫、也已导出 `PendingCheckpoint` /
1606
- `RuleSuggestion` 两个名字 —— 别把 floor 的理由记在它们头上
1615
+ - [ ] `@sema-agent/client-core` 版本对齐 §0a;**同批把 `@sema-agent/sdk` 抬到 §0a「peer:wire 契约」行写的地板**
1616
+ (本行不抄数字;每次抬地板的理由逐版记在 §0a 与对应版本段)。
1607
1617
  - [ ] 跨大版本提货前先读 `CHANGELOG.md`(0.29.0 起建档)+ `docs/REFACTOR-LEDGER.md` 做 BREAKING 对表 —— 别猜。🔴 **互链**(web [C166]⑦):CHANGELOG 各版「已知局限」段只记**该版新增**,接入面局限的完整台账在本档 §6e/§7 —— **只读其一会漏**,两处都过
1608
1618
  - [ ] 建「禁直连」物理门([C162] 令①):直连 `@sema-agent/sdk*`/`@sema-agent/core*`(web 另加直 `fetch('/v1/`)的存量面冻结成精确集合基线,**只减不增**;样板 = `sema-cli/scripts/run-sdk-isolation-test.mjs` + `sdk-isolation-baseline.json`。挂进常驻门链(**门读数 + 变异实证**才算立住)
1609
1619
  - [ ] 浏览器/渲染进程宿主:确认自己的打包链下本包**不引入 Node 内建**(本包侧有 portability 门,端侧要确认自己没把它 externalize 掉)
@@ -1668,8 +1678,13 @@ reason 里写明「枚举器盲区形」。已知两形:
1668
1678
  - [ ] 用三态判据消费 `eventToSdkMessage`:`if (p.kind === 'message')`,**不要** `if (msg)`(§3a)
1669
1679
  - [ ] 在 per-turn `ctx` 上填 **`onDroppedFrame`**(`EmitContext` 的可选位,**唯一**注入位;`reportDroppedFrame` 是包内实现、不出公面),**不许吞**(§3b / §5a 表末行)
1670
1680
  - [ ] 抬 SDK floor 后**重跑穷举**(`assertNeverArm` 编译期打红),不许 `as` 绕过
1671
- - [ ] 知道自己**收不到**这几件:`approval_revoke`(卡不会被自动撤,P-4)· 重放的 `question` 不会弹覆盖层(P-5)· `task_progress` 的 `taskType`/`status`/`parentTaskId`(P-1)· 压缩失败(P-6)
1672
- - [ ] 子代行 settle **只靠防御 sweep**,别建「等终态 tick」的状态机(P-2)
1681
+ - [ ] 知道自己**收不到**这几件:重放的 `question` 不会弹覆盖层(P-5)· `task_progress` 的 `taskType` / `parentTaskId` / `seq` / `eventId`(P-1)。
1682
+ 沿革:`approval_revoke`(P-4,0.65.0 起,§30i)、`task_progress.status`(P-1 / P-2,0.65.0 起,§30d)、压缩失败(P-6,0.75.0 起,§74)
1683
+ 现在都收得到 —— 接对应的 chrome 臂
1684
+ - [ ] 子代行 settle 由包按终态 tick 落(0.65.0 起;缺席时防御 sweep 兜底),端**别**自建「等终态 tick」的状态机(P-2)
1685
+ - [ ] 重试 / 等待覆盖层按 `RetryStatus.kind` 分臂(`mapBrainStatusToRetry`,§18b / §18c):`waiting` 是「模型已连上、在等第一个
1686
+ token」,**不是失败重试**;把非空 `retryStatus` 一律渲成错误重试行的宿主会把正常等待说成请求失败。`attempt` /
1687
+ `maxRetries` 缺席 = 不知道,**不补数**
1673
1688
 
1674
1689
  **E. 上行与回执(§4,最容易漏)**
1675
1690
  - [ ] 请求一律经 `buildTaskRequest(input, lane)`,**不自拼字面量**;上 wire 前过 `unregisteredRequestKeys(req, lane)`
@@ -9599,6 +9614,321 @@ installCoreValuePorts({ resolveAutonomousLoopPrompt, loosenReasons, combinePolic
9599
9614
 
9600
9615
  **包侧缺口:** ① 出包面注释存量(别仓名 / 票号 / 帖号 / 过程词)与卫生门判据太窄(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
9616
 
9617
+ ## §106 🆕 0.83.6(2026-09-27)会话规则记录的无损判定补判定缺口:引擎会拒启的两类名字改判「不写」+ 成因词 `legacy_tool_name` + 现名出路位 `currentName`(patch;根公面运行期导出不变;公面类型不变;`SessionPolicyWithheldWhy` +1 员 `legacy_tool_name`〔穷尽分支的端编译期红〕;`SESSION_POLICY_WITHHELD_WHY` 5 → 6;`SessionPolicyWithheldRule` +1 可选位 `currentName`;`peer_wide` 那句改措辞〔判决不变〕;零投影臂;peer sdk 地板 `>=11.3.0` 不动)
9618
+
9619
+ > **patch**,修 0.83.1 起的一个判定缺口(CC-226;本节按 0.83.6 的读法写,若与本版发布帖不一致,以发布帖为准):
9620
+ > `sessionPolicyDeliverable`(§101 P-1)把两类名字判成「能写」—— **引擎退役名**(`Task` / `KillShell` / `MultiEdit` / `bash` / `grep` / `Recall` …)与**含 `__` 而不以协议前缀开头的名字**(`foo__bar` / `github__delete_repo` / `MCP__srv`)。这类名字写进会话规则记录后,引擎在这个会话**此后每一跑的准备阶段**以 `config.legacy_tool_name` 失败,模型一次都调不到;在今天的引擎上,非运营方对会话规则记录的写只能收紧(删掉或替换这一条都算放宽、被拒)⇒ 会话属主自己撤不掉,只能由运营方清(较新的引擎上属主可自己删那一条)。§101 与 KNOWN-LIMITS 此前把 CC 旧工具名写成「能写,只是不生效」—— 这个前提不成立。
9621
+ > 本版把两类扣下,成因词 `legacy_tool_name`(与引擎拒启码同名);引擎说「改名为 X」的退役名在结果条目上带 `currentName: X` 作出路。
9622
+ > 🔴 **仍在用自己那一份判定的宿主**(§101 P-1 尚未换调的)**不受本版保护** —— 请尽快换调;换调前先自拦这两类名字(106d)。
9623
+
9624
+ ### 106a. 处置表
9625
+
9626
+ 各端列的词同 §101a:`pending` = 有读点待改(格内注明必改与否);`n/a` = 该端零读点或零改动即得(按本机克隆的只读检索,见 106d 的日期)。
9627
+
9628
+ | # | 面 | 旧 → 新 | 终端 | 网页端 | 桌面端 | 管理台 | 验收方 | 本节 |
9629
+ |---|---|---|---|---|---|---|---|---|
9630
+ | P-11 | `sessionPolicyDeliverable('deny', rules)` 的逐条判据 | 引擎退役名 / 含 `__` 无协议前缀的名字判「能写」→ **扣下**,成因 `legacy_tool_name`。判序排在逐条判据最后(106a-1),已被别的成因扣下的保留原成因;整批语义不变(一条扣下 ⇒ 整批不写) | pending(🔴 必改:自己那一份判定仍把这两类判能写 —— 换调 §101 P-1,或换调前自拦) | n/a(本机克隆无会话规则写入口;若已有,同终端) | n/a | n/a | pending(G-P11 / G-P13) | 106a-1 · G-P11 / G-P12 / G-P13 |
9631
+ | P-12 | `SessionPolicyWithheldWhy` / `SESSION_POLICY_WITHHELD_WHY` | 五词 → **六词**(+`legacy_tool_name`,冻结数组照旧由措辞表键派生) | pending(穷尽分支的端加一臂;今天调 P-2 取句的端零改动) | n/a | n/a | n/a | pending(按「恰五词」断言的改锚) | 106a′ · G-P11 |
9632
+ | P-13 | `sessionPolicyWithheldNotice('legacy_tool_name')` | — → **新增**一句(106a-2) | pending(换调后对 `withheld` 逐条取句即得) | n/a | n/a | n/a | n/a | 106a-2 · G-P11 |
9633
+ | P-14 | `SessionPolicyWithheldRule.currentName?: string` | — → **新增**可选位:只在 `legacy_tool_name` 且引擎表说「改名为 X」时在场(106a-3) | pending(建议:在那句话旁边摆出现名,比如「改用 X」的一键出路;非必改) | n/a | n/a | n/a | n/a | 106a-3 · G-P11 |
9634
+ | P-15 | `sessionPolicyWithheldNotice('peer_wide')` 的句子 | 「覆盖一个服务器或对端的每一只工具」→「点了一个服务器或对端、没点它的某一只工具」(判决不变;尾分隔形 `mcp__srv__` / 尾空白形 `mcp__srv ` 在引擎里什么都不覆盖,旧句对它们不成立) | n/a(取句即得;按旧句逐字断言的测试改锚) | n/a | n/a | n/a | pending(改锚) | 106a′ · G-P14 |
9635
+
9636
+ #### 106a-1 · 逐条判据(在 §101a-3 上加一步)
9637
+
9638
+ §101a-3 的 deny 逐条判据,第 5 步(首尾空白)之后、「其余」之前插入:
9639
+
9640
+ 6. 名字属**引擎退役名表**(按原字节查:`Task` 在表、`task` / `Task ` 不在),或名字含 `__` 且**不以**引擎认得的任一协议前缀开头(今天是 `mcp__` / `a2a__`,区分大小写)⇒ `legacy_tool_name`。
9641
+ - 以协议前缀开头的畸形名(`mcp__`、`mcp____x`、`a2a____x`)不落这一步:引擎对它们只告警、不拒启,照旧能写;
9642
+ - 单下划线不是分隔符(`read_file_x`、`a_b` 照旧能写);
9643
+ - 本步排在最后:`foo__*` 仍是 `wildcard`、` foo__bar` 仍是 `not_a_tool_name`、`Task(x)` 仍是 `qualified_deny`(这些在引擎里同样拒启或拦不住,反正都扣下,原成因的话同样成立)。
9644
+ 7. 其余 ⇒ 恰好一个工具名(原第 6 步)。
9645
+
9646
+ 射程:本包看不到这一跑的工具名单。部署自己挂了一只与退役名同名的工具时引擎放行这个名字,本包照扣 —— 比引擎严,方向安全(代价是这一条走宿主的回落路)。
9647
+
9648
+ #### 106a-2 · `legacy_tool_name` 那一句
9649
+
9650
+ `Not written to this session’s rule record: unless a tool by exactly this name is available, the engine refuses it — it is a retired tool name, or it contains "__" but does not start with "mcp__" or "a2a__" — and with it in that record every later run of this session would fail at startup until that entry is removed from the record. If the tool still exists, use its current name; a server or agent-peer tool name starts with "mcp__" or "a2a__".`
9651
+
9652
+ 句中的前缀由本包的协议前缀表拼出(引擎加一个命名空间时随同版更新)。与其余五句同纪律:只收成因词、不回显规则串、不替宿主承诺回落路。
9653
+
9654
+ #### 106a-3 · `currentName`
9655
+
9656
+ | 引擎表的说明 | 例 | `currentName` |
9657
+ |---|---|---|
9658
+ | 改名为 X | `Task` ⇒ `Agent`、`KillShell` / `KillBash` ⇒ `TaskStop`、`BashOutput` / `AgentOutputTool` ⇒ `TaskOutput`、`bash` ⇒ `Bash`、`read_file` ⇒ `Read`、`ListMcpResources` ⇒ `ListMcpResourcesTool` | X |
9659
+ | 并进了更宽的工具 | `bash_readonly`(并进 `Bash`)、`WorkflowStatus`(并进 `TaskOutput`) | 不带(改写成那只更宽的工具会替用户多禁) |
9660
+ | 已删、没有继任工具 | `MultiEdit`、`Fork`、`Sleep`、`Remember` / `remember`、`Recall` / `recall` | 不带(这条规则没有可拦的对象,删掉即可) |
9661
+ | 含 `__` 无协议前缀 | `foo__bar`、`MCP__srv` | 不带(句子里的出路是「以协议前缀开头」) |
9662
+
9663
+ `currentName` 取自本包一张闭表,不回显用户字节;把它摆在那句话旁边(或做成「改用 X」的出路)由宿主定。宿主若据此替用户改写规则,请先让用户确认 —— 「改名为 X」是引擎的说法,X 的职责可能比旧工具宽一点(如 `TaskStop` 也能停后台子代)。
9664
+
9665
+ ### 106a′. 成文改口(旧判据眼作废 → 新判据眼)
9666
+
9667
+ 已发段(§101)不回改,以本段为准。
9668
+
9669
+ **作废**(旧判据眼装 0.83.6 后判红是预期行为,不是回归):
9670
+
9671
+ 1. 「`sessionPolicyDeliverable('deny', ['Task'])`(或 `KillShell` / `AgentOutputTool` / `BashOutputTool` 等 CC 旧工具名)答能写」—— 作废;§101 包侧缺口 ⑨ 与 KNOWN-LIMITS 里「CC 旧工具名判能写、系统里没有一层拦得住、代价只是一句误导的『已写』」的前提不成立:写进去会让会话此后每一跑在启动时失败。新判据眼见 G-P11 / G-P13。
9672
+ 2. §101a-3 第 4 步「前缀大小写不符(`A2A__payroll`)的不是命名空间规则,按普通名走」里的「按普通名走 ⇒ 能写」—— 作废:它仍不是命名空间规则(不是 `peer_wide`),但含 `__` 而无协议前缀 ⇒ `legacy_tool_name`。表外前缀(`zzz__peer`)同。
9673
+ 3. 断言 `SESSION_POLICY_WITHHELD_WHY` 恰五词 / `sessionPolicyWithheldNotice` 五句的判据眼 —— 作废,改六。
9674
+ 4. 断言 `sessionPolicyWithheldNotice('peer_wide')` 逐字等于旧句(含 `covers every tool of one server or agent peer`)的判据眼 —— 作废;新句见 G-P14。
9675
+
9676
+ **改读**(判据的意思保留,换读法):
9677
+
9678
+ 1. §101a-3 的逐条判据按 106a-1 读(多第 6 步,原第 6 步「其余」顺延为第 7 步);§101 G-P1 里各形的答案不变。
9679
+ 2. `peer_wide` 的读法:「点了一个服务器或对端、没点它的某一只工具」。标准形 `mcp__srv` / `a2a__peer` 在较新的引擎上确会覆盖这个对端的全部工具(本包照旧不写,§101 包侧缺口 ⑩);尾分隔形 `mcp__srv__` 与尾空白形 `mcp__srv ` 在引擎里什么都不覆盖。两半都扣下,判决不变。
9680
+ 3. §101 包侧缺口 ⑨「两形会被判能写而系统里没有一层拦得住」改读为只剩一形:带转义括号或反斜杠的名字(引擎对它只告警、不拒启)。
9681
+
9682
+ **新增**(新判据眼):
9683
+
9684
+ 1. 本包判「能写」的名字,写进会话规则记录后下一跑能正常开始(准备阶段不以 `config.legacy_tool_name` 失败)—— G-P13。
9685
+ 2. `legacy_tool_name` 条目上 `currentName` 按 106a-3 在场 / 缺席。
9686
+
9687
+ ### 106b. 缺席语义(逐键)
9688
+
9689
+ - `currentName` 缺席 = 引擎表对这个名字没有「改名为 X」的说法(并进更宽的工具 / 已删 / 不是退役名而是含 `__` 无协议前缀),**不是**「不知道现名」;非 `legacy_tool_name` 的条目上永远缺席。它只以自有键出现(不写 `undefined` 值)。
9690
+ - `withheld` 里没有 `legacy_tool_name` ≠ 这一批写进去一定不会让引擎拒启:本包看不到工具名单,且退役名表是构建时的一份(包侧缺口 ①②)。
9691
+ - 其余缺席语义同 §101b(`deliverable` 为 `{}` 的三种来源、`unreadable`、表外成因词回通用句)。
9692
+
9693
+ ### 106c. 黑盒判据骨架
9694
+
9695
+ > 🔴 标「本版证明」的格在 **0.83.5** 产物上必须 FAIL、在 0.83.6 上必须 PASS;标「回归约束」的格两版都 PASS。请记下两次跑的产物标识(版本 + tarball shasum)。
9696
+
9697
+ - **G-P11**(本版证明,纯包层):`sessionPolicyDeliverable('deny', ['Task'])` ⇒ `{ deliverable: {}, withheld: [{ rule: 'Task', why: 'legacy_tool_name', currentName: 'Agent' }] }`;`['KillShell']` ⇒ `currentName: 'TaskStop'`;`['bash']` ⇒ `currentName: 'Bash'`;`['MultiEdit']` / `['bash_readonly']` / `['Recall']` ⇒ `why: 'legacy_tool_name'` 且条目上没有 `currentName` 键;`['foo__bar']` / `['github__delete_repo']` / `['MCP__srv']` / `['Mcp__srv__x']` / `['A2A__payroll']` / `['zzz__peer']` / `['__']` ⇒ 各恰一条 `why: 'legacy_tool_name'`、无 `currentName`;`['Read', 'Task']` ⇒ `deliverable` 为 `{}`,`withheld` 只列 `Task`;`SESSION_POLICY_WITHHELD_WHY` 恰六词且冻结;`sessionPolicyWithheldNotice('legacy_tool_name')` 以 `Not written to this session’s rule record: ` 起句、含 `"mcp__" or "a2a__"`、含 `until that entry is removed from the record`、不含 `administrator` / `operator` / `owner`(不点名谁能删)。判别点:0.83.5 上前述各形都答 `{ deliverable: { toolDeny: [...] }, withheld: [] }`,闭集五词。
9698
+ - **G-P12**(回归约束,纯包层):`Agent` / `TaskStop` / `Bash` / `task` / `BASH` / `mcp__` / `mcp____x` / `a2a____x` / `mcp__srv__tool` / `Read\(x\)` ⇒ 各自整批能写;`foo__*` ⇒ `wildcard`、` foo__bar` ⇒ `not_a_tool_name`、`Task(x)` ⇒ `qualified_deny`、`Task `(尾空格)⇒ `not_a_tool_name`、`mcp__srv__` / `mcp__srv ` ⇒ `peer_wide`。
9699
+ - **G-P13**(本版证明;引擎层 —— 端到端「写入后下一跑不拒启」):
9700
+ - 包 + 引擎包(不需要服务端):对 G-P12 里本包判能写的每一形,写进引擎包的内存会话规则店后同一会话跑一次 ⇒ 准备阶段通过、模型被调到;对 G-P11 的每一形写进去 ⇒ 这一跑以 `config.legacy_tool_name` 失败、模型零调用(说明扣下的理由属实)。
9701
+ - 射程延伸(真部署,经宿主的「本会话规则」写口,在一跑进行中 deny `MultiEdit`;另取 `Recall` / `MCP__srv` / `foo__bar` 各一形。别拿 `Task` / `KillShell` 做这一格:会把旧名先改写成现名的宿主上它们本来就不中招,修前修后同答 = 假阴性):换调后 ⇒ 会话规则记录**不写**(不出现写成功那一句),出现 106a-2 那一句,回落告知照常,下一跑正常开始。判别点:用 0.83.5 的判定(或宿主自己那一份)同一操作 ⇒ 出现写成功那一句,下一跑在启动时以 `config.legacy_tool_name` 失败,在今天的引擎上会话属主再删这一条被拒(放宽不许)。
9702
+ - **G-P14**(本版证明,纯包层):`sessionPolicyWithheldNotice('peer_wide')` 逐字等于 `Not written to this session’s rule record: this rule names a server or agent peer without naming one of its tools, and an engine that matches that record by exact tool name would block none of that peer’s tools.`;`sessionPolicyDeliverable('deny', ['mcp__srv__'])` / `(['mcp__srv '])` 仍是 `peer_wide`。判别点:0.83.5 上是旧句。
9703
+ - 包层行为钉在门 `run-session-policy-deliverable-test.mjs`(新增退役名表对账段与端到端段;在场时与宿主侧那一份逐例差分,「本包更严」分歧四类逐类计数与独立计数相等)。
9704
+
9705
+ ### 106d. 端上要动的读点
9706
+
9707
+ 坐标省去开头的 `src/`;来自本机克隆的只读检索(终端 09-23、网页端 08-03、桌面端 08-03、管理台 09-19 —— 克隆陈旧的只代表那一刻),行号会漂,以各端现状为准。
9708
+
9709
+ **终端**
9710
+
9711
+ - 🔴 P-11(必改,P1):`sema/sessionPolicyWire.ts:127`(`sessionPolicyDeliverableRules`)/ `:150`(`isExactToolNameRule`)/ `:242`(调用点,`tryTightenSessionPolicyForRules`)仍是自己那一份判定,对 `Task` / `KillShell` / `foo__bar` / `MCP__srv` 等答能写 ⇒ 用户在「本会话规则」里加这类 deny,会话此后每一跑在启动时失败,而写成功后终端自己那一行「这条会话里撤不回」的告知也就成了真的。换调 `sessionPolicyDeliverable(behavior, rules)`(§101 P-1,读法对照见 §101a′ 改读 3),删掉那两只函数;要对用户说原因的对 `withheld` 逐条取 `sessionPolicyWithheldNotice(w.why)`,`w.currentName` 在场时建议摆在旁边。换调前的最小止血:在 `:242` 之前对这两类名字自拦(不走会话规则写口,走原有的回落路)。
9712
+ - 已经中招的会话:一跑以 `config.legacy_tool_name` 失败时,建议给出「这条会话的规则里有一条引擎会拒启的名字,删掉它」的出路,谁能删按部署实情说(本包还没有这一句,见包侧缺口 ③)。
9713
+ - P-12:今天不对成因词做分支,零编译改动。
9714
+
9715
+ **网页端 / 桌面端 / 管理台**
9716
+
9717
+ - 本机克隆未见会话规则写入口(不调 `tightenSessionPolicy`),零改动;将来加「本会话规则」写口时直接用 `sessionPolicyDeliverable`,不要自己判。已有写口的端按终端那一条办。
9718
+
9719
+ **验收方**
9720
+
9721
+ - 按 106a′ 作废 1–4 改锚;新增 G-P11–G-P14。
9722
+
9723
+ ### 106y. 🔴 三端升级必读(固定段式)
9724
+
9725
+ 1. **换钉 `^0.83.6` 之前**:对成因词做穷尽 `switch` / 按词建表(`Record<SessionPolicyWithheldWhy, …>`)的端,编译期会红 —— 加 `legacy_tool_name` 一臂(取句用 `sessionPolicyWithheldNotice`,不要自己写);按「恰五词」或 `peer_wide` 旧句逐字断言的测试改锚。其余零前置改动;peer sdk 地板 `>=11.3.0` 不动。
9726
+ 2. **逐面**:
9727
+ - **会话规则**:终端 —— 🔴 自己那一份判定不受本版保护,请换调 `sessionPolicyDeliverable`(同时拿到 §101 的三处更严与本版这一处);换调前先自拦两类名字。网页端 / 桌面端 / 管理台 —— 今天没有会话规则写入口,零改动。
9728
+ - **出路**:`legacy_tool_name` 条目的 `currentName`(在场时)与那一句一起摆出;已中招的会话要把那一条从会话规则记录里删掉(今天的引擎上只有运营方能删)。
9729
+ 3. **成文改口**:见 106a′(作废 / 改读 / 新增三向);已发段(§101)不回改,以本段为准。
9730
+
9731
+ **包侧缺口:** ① 本包看不到这一跑的工具名单:部署挂了与退役名同名的工具时,引擎放行而本包照扣(更严,方向安全;KL-157)· ② 退役名表是本包构建时对开发依赖引擎包对过账的一份:端连的引擎比它新、且新版引擎扩了退役名表时,新加的名字在本包跟进前仍判能写(KL-158)· ③ 已经写进会话规则记录、每跑启动失败的会话本包救不回,也还没有「删掉会话规则里那一条」的专门出路句(今天的引擎上只有运营方能删)· ④ `mcp__srv` / `a2a__peer` 与工具段通配形在较新的引擎上其实能被会话规则按集合命中,本包照旧不写(候服务端给出能力位后按位放开,CC-227)。
9732
+
9733
+ ## §105 🆕 0.83.5(2026-09-27)展示层出口:连接符按语境判 + 字面反斜杠成对 / 名字位空白两只开关 + 标记位置读口(CC-204)+ 机读字节的凭据洗消认孤代理项(CC-207)+ 转义记号在凭据再扫里原子与四处凭据读法存量修复 + hooks 启动模式收窄(CC-200)与设置来源去重(CC-208)+ 自愈重发结局的释放证据位(CC-212)+ 活段接入指引订正(patch;根公面运行期导出 +1,1277 → 1278〔`displayUntrustedMarks`〕;公面类型 +3〔`DisplayMarkSpan` / `DisplayUntrustedMarked` / `HooksStartupMode`〕;`DisplayUntrustedOptions` +2 可选位〔`escapeBackslashes` / `blanks`〕;`SettingsPort` +1 可选成员〔`hooksStartupMode`〕;`SelfHealOutcome` 三条重发结局臂各 +1 可选位〔`releaseConfirmedByEngine`〕;🔴 默认形输出字节变:清单外文字旁的 ZWJ / ZWNJ 改为标出来,控制符转义记号紧跟另一枚记号时不再留「反斜杠 + 记号」形,四处凭据读法多遮;零投影臂;peer sdk 地板 `>=11.3.0` 不动)
9734
+
9735
+ > **patch**,四组同发 + 成文改口(本节按 0.83.5 的读法写;若与本版发布帖不一致,以发布帖为准):
9736
+ > ① **连接符按语境判**(CC-204):ZWJ / ZWNJ 只在 emoji 连字与连写 / 印度系文字里原样,其余按所选标记形标出来(105a-1)。本包内经出口的五处文本随之变(U-2)。
9737
+ > ② **`escapeBackslashes`**:转义形上字面反斜杠成对,解码唯一(105a-2);🔴 开着不幂等,只在最终呈现处调一次。**`blanks`**:名字位上「像空白」的非 ASCII 码位在折平之前标出来。**`displayUntrustedMarks`**:同一份文本另报每一枚字符面标记的位置(105a-3)。为什么单射不做成默认:默认形承诺幂等(三端有多层重复调用),一个函数同时单射又幂等只能是恒等 ⇒ 单射只能是开关。
9738
+ > ③ **CC-207**:凭据两网的判别视图把孤代理项与格式字符同处置 —— 标签与值之间夹一枚孤代理项时,机读字节(结果帧 `errors[]`、合成终局行)与字符面全关的呈前出口此前洗不到值(W-1)。
9739
+ > ④ **转义记号原子**(存量缺陷修复,0.83.3 起):控制符转义记号紧跟另一枚记号时,凭据再扫不再把后一枚吃掉半枚(V-1);随之改的序列读法(没收尾的前缀整段一个单元、终字留字读法认已知凭据字面形首字、`@` 不当终字 …)让本版相对 0.83.4 零新增外泄(V-1 第二段)。**三处存量凭据读法**:URL 片段后接非 ASCII 空白与标签 / 方案词时在空白处断(V-2);谚文填充 / 盲文空点在词级网里当空白(V-3);值开头是引号包着的里层标签时让里层去认(V-4)。
9740
+ > ⑤ **hooks 启动模式**(CC-200):安全模式 / bare 模式下,发往引擎的设置来源 hooks 随模式收窄 —— 两种模式都只剩 managed(bare 取保守侧:managed 照发,见 SM-1 与包侧缺口)。宿主多一只可选词读口报启动模式;插件读数上已有的那一位按安全模式算数。没报的宿主零变化。
9741
+ > ⑥ **设置来源去重**(CC-208):同事件、同 `matcher` 组、同身份键的设置来源条目只发一份,宿主零改动即得(DD-1)。
9742
+ > ⑦ **自愈重发结局的释放证据位**(CC-212):三条重发结局 +1 可选位 `releaseConfirmedByEngine?: true`,用户行与注入件行按它分说(CS-1 / CS-3);两处出包说明串改口(CS-2,零判定)。
9743
+ > ⑧ **活段订正与冻结段成文改口**:§3c / §3d-2 / §3z / §4a / §4b-3 / §4f / §7 / §8 按现状订正、README 守卫表订正(文档面,不在处置表);冻结段的改口见 105a′。
9744
+ > **表态现势**:patch,全速模式,不设表态窗;默认字节变化那一面按下面 105a′ 的成文改口换读,各端列写本版读点普查的结论(读的是各端本地克隆的远端主干:终端 `968b4742`〔09-25〕、网页端 `cb5874a`〔09-26〕、桌面端 `5c99611`〔08-13〕、管理台 `4d135e7`〔09-26〕)。
9745
+
9746
+ ### 105a. 处置表
9747
+
9748
+ | # | 面 | 旧 → 新 | 终端 | 网页端 | 桌面端 | 管理台 | 验收方 | 本节 |
9749
+ |---|---|---|---|---|---|---|---|---|
9750
+ | U-1 | `displayUntrusted` 默认形与一切开着 `bidi` 的形里的 ZWJ / ZWNJ | 无条件原样 → 🔴 按语境判(语境取簇的基字:两侧各跨过组合符 / 变体选择符 / 肤色修饰):emoji 连字(左基字与紧后一码点都是按 emoji 呈现的象形字的 ZWJ:默认 emoji 呈现,或紧后是 U+FE0F / 肤色修饰;`©` / `™` 之间照标)、连接文字(两侧基字都是字母、Script_Extensions 都在 105a-1 清单内的 ZWJ / ZWNJ;文字属性通用 / 继承的修饰字母如 U+02BC、U+0640 不算)与旧编码 chillu / khanda-ta(紧跟 virama、virama 前的基字是清单文字字母的 ZWJ,右边不问)原样;其余按所选标记形标出来(`‍` / `‌`、`.`、空格)。RGI 地区旗照旧整串放行。`bidi: false` 时两枚照旧原样 | n/a(今天的呈现出口仍是自带叶子,不经本包;换装时见 105d) | n/a(今天无读点) | n/a(今天无读点) | pending(必改:五种载体都开着 `bidi`;按旧读数钉的测试当天红,见 105a′) | pending | 105a-1 · G-J1–G-J3 · G-J6–G-J8 |
9751
+ | U-2 | 本包内经出口的文本:`readDecisionNoteAudit(ack).note` 与 `decisionNoteAuditLine(...)`(空格形)、`resumeSettledSubagent(...)` 的 `receipt`(点形)、`hooksNotRunNotice(plan)` 的插件名 / 事件名、设置来源 hooks 不上请求体的一次性告警里的事件名、后台子代缺席行(`engineAgentAbsenceDroppedLine` 与迟到终报那一句)里的名字 / 状态 / 回收原因 | 连接符原样 → 同 U-1 | pending(换读:回决备注与续跑收据两处读点,见 105d) | n/a | n/a | n/a | pending | G-J4 |
9752
+ | U-3 | `escapeDisplayControlChars` / `collapseLabel` / `capForDisplay`、同伴署名规范化、hook 故障横幅 | **不变**(旧集不含格式类整类,连接符照旧原样;逐字节保持) | n/a | n/a | n/a | n/a | n/a | G-J5 |
9753
+ | E-1 | `DisplayUntrustedOptions.escapeBackslashes?: boolean` | 无 → 新增可选位(默认关;只在 `mark` 为 `escape` 时生效):字面反斜杠画成两枚,危险码位照旧画成标记 ⇒ 解码唯一(105a-2)。输入里没有反斜杠时与不开逐字节同。🔴 不幂等;封长量成对之后的长度 | n/a | n/a | n/a | pending(建议:名字 / 决断面载体开它;开了之后「真 U+2060 与字面六字符同形」那条钉当天翻面) | pending | 105a-2 · G-E1–G-E6 |
9754
+ | B-1 | `DisplayUntrustedOptions.blanks?: boolean` | 无 → 新增可选位(默认关):U+00A0 / U+1680 / U+2000–U+200A / U+202F / U+205F / U+3000 / U+115F / U+1160 / U+3164 / U+FFA0 / U+2800 在折平之前标出来,不并、不去首尾;开着时凭据两网对这类转义记号取字面与读回两种读法(不比开关关弱;「userinfo 中间夹一枚名字位空白」按 userinfo 遮;标签后、值开头那一枚在字面读法里判型透明 ⇒ 诊断词 / 点名 / 空值 / 里层标签与开关关同答,不凭空铸记号;行折平开着时另加折平读法,几种读法遮盖取并 ⇒ 开关开遮住的 ⊇ 开关关遮住的,例外 KL-150 / KL-151)。散文载体别开 | n/a | n/a | n/a | pending(建议:标识载体开它) | pending | G-B1–G-B5 |
9755
+ | W-1 | 凭据两网的判别视图:原字孤代理项(配不成对的 U+D800–U+DFFF)(CC-207) | 当普通字(标签 / 分隔符 / 值之间夹一枚就认不出键值对;默认形靠第二轮看见字符面铸的记号才洗到)→ 🔴 与格式字符同处置:两种视图里都是可剥单元,命中映回原文遮盖。机读口(结果帧 `errors[]`、合成终局行,两条车道)、呈前出口(一轮即洗到)、标记位置读口同批;凭据之外的孤代理项逐字节不动。同形变化:userinfo 左界停在孤代理项处、`scheme://` 形的值按地址豁免(与零宽空格在同一位置时逐字节同;此前孤代理项被粘进值,偶尔顺带遮掉邻近的非凭据文字)。**wire 可见**;凭据位上多数形更安全 —— 例外是含孤代理项的两形(userinfo 后无主机 / 方案词后的地址豁免;与零宽空格同位同答),0.83.4 顺带遮住的值本版露出(KL-143) | n/a(按 `errors[0]` 取失败详情的读点零改动即净) | n/a | n/a | n/a | pending(按原样断言凭据字节的判据改锚) | G-W1 / G-W2 |
9756
+ | V-1 | 凭据两网开着的一切形:控制符的转义记号紧跟另一枚转义记号(ESC 后接 U+2060 / U+200B / DEL / 又一枚 ESC …) | 判别视图把 `\u001B` 与下一枚的反斜杠读成 ESC-ST,下一枚的十六进制尾巴被当成值换成记号(`Basic\u001B\«redacted:secret»`;`max` 截在那里留串尾孤反斜杠;`escapeBackslashes` 留不成对反斜杠、丢一枚标记;0.83.3 起)→ 🔴 转义记号在判别视图里是整单元(序列终字 / ST 不取下一枚记号的反斜杠):`Basic` + ESC + U+2060 ⇒ `Basic\u001B⁠`;凭据判定不变。原子只认本出口会写、视图会剥的那一类(小写 `\u`、码位在字符面里);同批的序列读法:没收尾的 CSI / nF 前缀整段一个单元、终字留字读法认已知凭据字面形首字与「反斜杠 + 引号」、`@` 不当终字、`blanks` 读回空白读法里名字位空白当中间字节、只剩占位的用户名算用户名 —— 相对 0.83.4 零新增外泄(差分随机语料计数 0);`ESC [` + `sk-…` 这类单个序列头紧贴字面形的输入 0.83.4 露,本版遮住 | n/a(今天的呈现出口不经本包) | n/a | n/a | pending(按 `\u001B\«…»` 形断言的格换读;今天检索未见) | pending | G-V1 / G-V1b / G-V1c |
9757
+ | V-2 | 凭据 URL 结构面:URL 片段后接非 ASCII 空白(`\s` 同集、名字位空白族),再接一枚标签 / 方案词 | 片段只在 ASCII 空白处断,方案词被吞进 query 记号、值原样上屏(`?a=1` + NBSP + `Bearer <值>` ⇒ `?a=«redacted:query» <值>`)→ 🔴 这一串空白后紧跟标签 / 方案词时片段在此断(`?a=«redacted:query» Bearer «redacted:secret»`);后面不是标签 / 方案词时照旧不断(query 值中间夹 NBSP 仍整只进记号) | n/a(今天的呈现出口不经本包;机读口经本包的零改动即得) | n/a | n/a | pending(按旧读数钉的格换读;今天检索未见) | pending | G-V2 |
9758
+ | V-3 | 凭据词级面:标签与分隔符之间、分隔符与值之间、方案词与值之间的谚文填充 U+115F / U+1160 / U+3164 / U+FFA0 与盲文空点 U+2800 | 不算空白,整形认不出、值原样上屏 → 🔴 与空白同判,值换记号 | n/a | n/a | n/a | n/a | pending | G-V3 |
9759
+ | V-4 | 凭据词级面:值的起点是一串反斜杠 / 一枚引号之后的里层标签或方案词(`token= "password":"<值>"`) | 外层把 `"password"` 当引号值换掉,里层的值原样上屏 → 🔴 外层不算,里层去认(`token= "password":"«redacted:secret»"`) | n/a | n/a | n/a | n/a | pending | G-V4 |
9760
+ | M-1 | `displayUntrustedMarks(text, opts?)`;型 `DisplayUntrustedMarked` / `DisplayMarkSpan` | 无 → 新增:`{ text, marks }`,`text` 与同选项出口逐字节同,`marks` = 每一枚字符面标记的 UTF-16 区间(105a-3) | n/a | n/a | n/a | pending(建议:按样式区分标记时用) | pending | 105a-3 · G-M1–G-M3 |
9761
+ | SM-1 | `hooksForWire()` / `hooksWirePlan()` 的设置来源,在宿主报了启动模式时(CC-200) | 照发五源 → **`'safe'` 与 `'bare'`:只发 managed**(bare 取保守侧:上游对 bare × managed 两向都有依据,本版不从请求体拿掉 managed;细化见包侧缺口)。所有事件同判。两种模式插件 hook 全筛(`startup_mode`);会话目标 `Stop` hook 照发(合并 `disableAllHooks` 一类治理下照旧不发)。被筛掉的来源不进 `settingsDropped` 与开机清单(两处只剩 managed 的行)。整条腿关掉的治理门(未受信工作区 / managed 关停 / managed 读取抛错)先判、恒赢,与本版前同 | pending(实现 SM-2 读口即得;不实现 ⇒ 与 0.83.4 同) | n/a(不调 `hooksForWire()`) | n/a(不调 `hooksForWire()`) | n/a | pending | 105b · G-SM1–G-SM9 |
9762
+ | SM-2 | `SettingsPort.hooksStartupMode?(): HooksStartupMode \| undefined`;导出型 `HooksStartupMode = 'safe' \| 'bare'` | 无 → 新增可选成员与型:宿主运行在哪种启动模式,两者都开报 `'bare'`。只认这两个词(本版两词同处置;宿主照实报,bare 的处置细化时不用改宿主)。独立于插件读口;两条路径(传不传计划)都读。一轮至多读一次;整条腿已关的路径不读 | pending(返回 `isBareMode() ? 'bare' : isSafeModeActive() ? 'safe' : undefined`,见 105d) | n/a(若将来有这两种模式再实现) | n/a(同左) | n/a | pending | 105b · G-SM1 / G-SM2 / G-SM5 |
9763
+ | SM-3 | `PluginHooksReading.suppressedByStartupMode`(插件读数上已有的位) | 只筛插件 → **也作用于设置来源,按安全模式处置**(只发 managed;只在传了计划、读到插件口的路径上看得见)。词读口报了合法词时以词为准(词 `'bare'` ∧ 本位真 ⇒ bare,本版与安全模式同处置)。取值时抛错 ⇒ 插件那一半 `failed`,设置来源按 SM-2 判 | consumed(今天未报这一位;按 SM-2 报即可) | n/a | n/a | n/a | pending | 105b · G-SM3 |
9764
+ | DD-1 | `hooksForWire()` / `hooksWirePlan()` 的设置来源条目(CC-208) | 按来源逐份拼接(同一条写两处发两份)→ **同事件 ∧ 组上除 `hooks` 外逐字节同 ∧ 条目身份键同 ⇒ 只发一份:位置在拼接序首次出现处、字段取合并顺序优先级最高那份**(managed > flag > local > project > user,同来源取后出现的;managed 位置与值都不变);次序不变、没有重复的组原样、整组去空不发。身份键:command = `shell` + `command` + `args` + `if`;prompt / agent = 类型 + `prompt` + `if`;http = `url` + `if`;mcp_tool = `server` + `tool` + `input` + `if`;script = `script` + `file` + `if`。形坏 / 算不出键的条目、插件组、会话目标 `Stop` hook 不参与;启动模式收窄之后再去重 | consumed(零改动即得) | n/a(不调 `hooksForWire()`) | n/a(不调 `hooksForWire()`) | n/a | pending | 105b · G-DD1–G-DD5(含 G-DD2b) |
9765
+ | CS-1 | `SelfHealOutcome` 的 `running-cancelled` / `stale-park-cancelled` / `ask-decided-without-card` 三臂(CC-212) | 无 → **+1 可选位 `releaseConfirmedByEngine?: true`**(型面 additive):引擎直说会话已交出(`heldBy: null`)⇒ 严格 `true` 在场;只凭终态词判的释放 ⇒ 缺席,从不为 `false`。在结局对象的键上,复制 / 序列化 / 跨进程不丢。处置(`resending`)不按它分 | consumed(零改动即得;按 `kind` 穷举不受影响) | consumed(同左) | consumed(同左) | consumed(同左) | pending | G-CS1–G-CS5 |
9766
+ | CS-2 | `MIGRATED_COMPENSATIONS` T36 `what`;`REQUEST_FIELD_MATRIX` `lenses` 行 `why` | 过时说明 → 现状说明(见 CHANGELOG Changed)。零判定 | n/a(说明串) | n/a | n/a | n/a | n/a | — |
9767
+ | CS-3 | `activeRunSelfHealRow(outcome)` 对上面三条结局(用户形与 `origin: 'injected'` 形) | 一句说满 → **按 CS-1 那一位分说**(逐句见 CHANGELOG Changed):位在场才说「engine confirmed it is no longer holding this session」/「the session is free again」;位缺席 ⇒ 只说那条 run 已结束 + 可能要再发一次 / 可能再被挡一次(三臂的用户行同一句出路半句);`stale-park-cancelled` 与 `ask-decided-without-card` 位在场时不再说「报它已结束」。只认严格 `true`。宿主 `rowFor` 覆盖口照旧优先 | consumed(零改动即得) | consumed(同左;今天未接三选卡则零读点) | consumed(同左) | consumed(同左) | pending | G-CS1–G-CS5 |
9768
+
9769
+ #### 105a-1 · 连接文字清单(U-1 语境 ②)
9770
+
9771
+ Script_Extensions 值,门里另有一份独立清单与源码双向等值,并逐族核「字母 + ZWJ / ZWNJ + 字母原样;字母 + ZWJ + 数字、字母 + ZWNJ 在串尾、拉丁字母 + ZWJ + 该族字母、该族字母 + ZWJ + 拉丁字母都标」:
9772
+
9773
+ - **连写文字**(字形随左右连接变形):阿拉伯 `Arab`、叙利亚 `Syrc`、曼达 `Mand`、摩尼 `Mani`、诗篇巴列维 `Phlp`、粟特 `Sogd`、古回鹘 `Ougr`、花剌子模 `Chrs`、蒙古 `Mong`、八思巴 `Phag`、N'Ko `Nkoo`、阿德拉姆 `Adlm`、哈乃斐罗兴亚 `Rohg`;
9774
+ - **印度系 Brahmic**(连接符控制半形、连体字与显式 virama):天城 `Deva`、孟加拉 `Beng`、古木基 `Guru`、古吉拉特 `Gujr`、奥里亚 `Orya`、泰米尔 `Taml`、泰卢固 `Telu`、卡纳达 `Knda`、马拉雅拉姆 `Mlym`、僧伽罗 `Sinh`、婆罗米 `Brah`、凯提 `Kthi`、夏拉达 `Shrd`、悉昙 `Sidd`、提尔胡塔 `Tirh`、格兰塔 `Gran`、尼瓦尔 `Newa`、塔克里 `Takr`、莫迪 `Modi`、马哈加尼 `Mahj`、霍吉奇 `Khoj`、库达瓦迪 `Sind`、多格拉 `Dogr`、南迪那格里 `Nand`、马萨拉姆贡德 `Gonm`、贡贾拉贡德 `Gong`、迪维斯阿库鲁 `Diak`、拜克舒基 `Bhks`、札那巴札尔方字 `Zanb`、索永布 `Soyo`、阿洪 `Ahom`、查克马 `Cakm`、锡尔赫特 `Sylo`、索拉什特拉 `Saur`、梅泰 `Mtei`、林布 `Limb`、雷布查 `Lepc`、卡维 `Kawi`;
9775
+ - **东南亚与藏**:缅甸 `Mymr`、高棉 `Khmr`、泰 `Thai`、老挝 `Laoo`、藏 `Tibt`、巴厘 `Bali`、爪哇 `Java`、巽他 `Sund`、兰纳 `Lana`、傣越 `Tavt`、新傣仂 `Talu`、德宏傣 `Tale`、占 `Cham`、巴塔克 `Batk`、布吉 `Bugi`、望加锡 `Maka`、勒姜 `Rjng`、克耶 `Kali`、他加禄 `Tglg`、哈努诺 `Hano`、布希德 `Buhd`、塔格巴努亚 `Tagb`。
9776
+
9777
+ 语境按**簇的基字**判:连接符左侧跨过组合符(含变体选择符、virama、nukta、元音符号)与 emoji 肤色修饰回到基字,右侧同理取下一簇的基字;两个基字都要是**字母**、文字都在清单内。数字 / 标点(天城数字 U+0969、danda U+0964、阿拉伯逗号 U+060C)与没有基字的孤立组合符不提供文字语境。不看紧邻码点,是因为通用组合符的 Script_Extensions 会带上清单内的文字(U+0300 / U+0301 带 `Tale`,U+0308 带 `Syrc` / `Tale`):`a` + U+0301 + ZWJ + U+0301 + `b` 照标。文字属性是通用 / 继承的修饰字母(U+02BC、U+0640 …)不算字母语境。运行引擎不认的文字名在载入时滤掉(那一族旁的连接符改为标出来,KL-140)。
9778
+
9779
+ **旧编码的 chillu / khanda-ta**:ZWJ 紧跟在 virama 之后、virama 前的基字是清单文字的字母 ⇒ 原样,右边不问(词尾;马拉雅拉姆 U+0D28 U+0D4D + ZWJ、孟加拉 U+09A4 U+09CD + ZWJ)。virama 取 Canonical_Combining_Class = 9 且属清单内文字的 63 枚:天城、孟加拉、古木基、古吉拉特、奥里亚、泰米尔、泰卢固、卡纳达、马拉雅拉姆(三枚)、僧伽罗、泰、老挝、藏、缅甸(两枚)、他加禄(两枚)、哈努诺、高棉、兰纳、巴厘、巽他(两枚)、巴塔克(两枚)、锡尔赫特(两枚)、索拉什特拉、勒姜、爪哇、梅泰(两枚)、婆罗米(三枚)、凯提、查克马(两枚)、夏拉达、霍吉奇、库达瓦迪、格兰塔、尼瓦尔、提尔胡塔、悉昙、莫迪、塔克里、阿洪、多格拉、迪维斯阿库鲁(两枚)、南迪那格里、札那巴札尔方字(两枚)、索永布、拜克舒基、马萨拉姆贡德(两枚)、贡贾拉贡德、卡维(两枚)。ZWNJ 不在这一条里(virama + ZWNJ 在串尾照标)。门里另有一份独立的 virama 清单与源码双向等值,并逐枚核一正三负。
9780
+
9781
+ #### 105a-2 · `escapeBackslashes` 的解码文法(E-1)
9782
+
9783
+ 输出从左往右读:`\\` ⇒ 一枚字面反斜杠;`\u` + 四位大写十六进制 ⇒ 那个 BMP 码位(含孤代理项);`\u{` + 一到六位大写十六进制 + `}` ⇒ 那个 astral 码位;其余字符原样。开关开着的输出里不会出现别的「反斜杠 + 字符」组合。凭据两网都关、`foldLines: false` 时,解码结果恰是原输入;凭据网开着时,凭据位是记号(不可逆,KL-142),记号之外的部分照样逐字解回(凭据记号不会吃掉半枚转义记号,V-1);折平开着时空白串是一个空格。
9784
+
9785
+ #### 105a-3 · 标记位置的语义(M-1)
9786
+
9787
+ - `marks` 升序、不重叠;每枚 `text.slice(start, end)` 是码位 `codePoint` 的标记形:转义形 `\uXXXX`(BMP)/ `\u{X}`(astral),点形 `.`,空格形一个空格。
9788
+ - 只报字符面标记。凭据记号(`«redacted…»` 闭形)、`escapeBackslashes` 成对的字面反斜杠、原样放行的 RGI 地区旗与连接符都不在内。
9789
+ - 空格形:一串空白里有被标的码位 ⇒ 行折平并成的那一个空格报一枚,`codePoint` 取串里第一枚被标的;同串其余被标的码位不再出现。被去首尾的不报。
9790
+ - 封长:截点不劈标记;截掉的标记不报,不会报半枚。
9791
+ - 标记被凭据记号吞掉(它夹在一只凭据值中间)⇒ 不报。
9792
+ - `text` 与同选项的 `displayUntrusted(text, opts)` 逐字节相同(门对表);`escapeBackslashes` 开着时两只口各自只调一次即同。
9793
+
9794
+ ### 105a′. 成文改口(旧判据眼作废 → 新判据眼)
9795
+
9796
+ - **作废(U-1)**:§101a-1「双向与格式字符(`bidi`):格式类整类(…;ZWNJ / ZWJ 除外,emoji 序列与连字不受影响)」里「ZWNJ / ZWJ 除外」的判据眼 —— 本版起只在 105a-1 的两类语境里除外。按「任意位置的 ZWJ / ZWNJ 原样」断言的格(如 `displayUntrusted('a' + U+200C + 'b' + U+200D + 'c')` 原样)在 0.83.5 上判红是预期行为。
9797
+ - **作废(SM-1,CC-200)**:§103 包侧缺口 ③「宿主报的启动模式位只筛插件 hook,设置来源在这一位下不收窄、照发引擎」;§101 插件判定表「安全模式 / bare 模式」一行的后半句「设置来源的 hooks 不受这一位影响」;§101 成文改口第 6 条「对设置来源的 hooks 仍成立」半句;§100 射程句「宿主的『安全模式』本包没有读口,仍不在引擎腿上生效」。本版起:宿主报了启动模式 ⇒ 安全模式与 bare 模式都只发 managed。
9798
+ - **作废(DD-1,CC-208)**:§103 包侧缺口 ②「设置来源之间不去重,同一条 hook 写在两个来源里请求体上出现两次」—— 本版起同事件同 `matcher` 组同身份键的只发一份;剩余边界见本段包侧缺口(KL-153)。按「同一条 hook 写两处 ⇒ 请求体两份」断言的判据眼作废。
9799
+ - **作废(CS-3,用户形)**:「`running-cancelled` 行恒说 "The engine confirmed it is no longer holding this session"」的判据眼(含 §7b P-45 旧文「`running-cancelled` 行仍写着 …」那半句 —— 活段已同批改)。**改读**:结局带 `releaseConfirmedByEngine: true` 才出现 confirmed;位缺席(只凭终态词判释放,或宿主自拼不带位)⇒ 行里不出现 "confirmed"、带「you may have to send it once more」。按「cancel 成功 ⇒ 行里有 confirmed」断言的格改锚到「终态词那一路不出现 confirmed」;按「`stale-park-cancelled` / `ask-decided-without-card` 行恒说 reports it as finished / has since finished」断言的格改锚到「位缺席时这么说」;按「`ask-decided-without-card` 行逐字等于 … has since finished — sema is re-sending your message.(句号收尾)」断言的格改锚到带出路半句的新句。
9800
+ - **作废(CS-3,注入件形)**:「sema 自己发出的后续消息被挡后重发,那一行恒说 "the session is free again, so sema is sending the message now — nothing for you to do."」(0.83.0 起的注入件十二句事实表之一)。**改读**:位在场逐字仍是这一句;位缺席 ⇒「… that reply is now reported as finished, so sema is sending the message now — nothing for you to do (if the session has not quite freed up yet, it may be held back once more).」。注入件事实表十二句 → 十三句;「is sending the message now」「nothing for you to do」两个承诺短语只在重发档出现,不变。
9801
+ - **作废(0.56.0 已知局限)**:「`wiring_manifest` 两段的超集键名是临时形,SDK 声明该臂之后改名(BREAKING,另立一批)」的预告,本版成文撤回、不执行。**新律**:`wiring_manifest` 内部臂上的段键一律 `_sema_*`(今天九段:`modelGate` / `autoMode` / `mcp` / `tools` / `hooks` / `lsp` / `writeProtection` / `autoConsolidation` / `readDeny`),不随上游声明改名;端读的是 chrome 臂与 `WiringManifestView` 上的去前缀名,不受影响。
9802
+ - **作废(§101d 终端改调清单 P-1)**:「行为唯一的差:首尾带空白的名字从『写』变『不写』」一句。**改读**:`sessionPolicyDeliverable` 比终端旧判官更严的是**三类** —— 首尾带空白的名字、带 `*` 的通配名、按工具名整对端的非 MCP 命名空间名;三类都由包侧差分门逐例对数(与 0.83.1 CHANGELOG 的五词成因一致)。
9803
+ - **改读(管理台)**:`test/du-display-untrusted.test.ts:353-357`(⑥ 第二条:`displayField` / `displayDecisionLine` 对 `Bash` + {U+200D, U+200C, U+00A0, U+2003, U+3000, U+3164} + `x` 原样)—— 连接符两枚改为 `Bash‍x` / `Bash‌x`(当天红,正是预期路径);空白四枚在两只载体上仍原样(`blanks` 是开关,未开不变)。同文件 `:347-351`(⑥ 第一条:真 U+2060 与字面六字符同形)默认不变;载体开了 `escapeBackslashes` 后翻面为「两者不同」。`test/du-display-untrusted-r5.test.ts:43-61`(标识载体单射集)两版都绿,`:56-57` 的注释「ZWJ / ZWNJ 在上游那一份里原样通过」过时;`lib/web/display-untrusted.ts:24-25` 与 `displayIdentifier` 头注(`:160` 前后)同一句过时。
9804
+ - **改读(终端)**:本包铸的两处文本在屏上变 —— `components/tasks/SubagentContinueRow.tsx:52` 取的续跑收据(拉丁等字母旁的连接符 ⇒ `.`)、`sema/approvalStreamWire.ts:1567-1568` 取的回决备注(⇒ 空格)。自带的呈现叶子(`sema/displayUntrusted.ts:89` 经 `sema/untrustedDisplayText.ts:171` 的字符类,两枚连接符在白名单里)本版不受影响;换装本包出口时,`sema/bidiDisplaySanitize.test.ts:182`(H5:`nast` + ZWNJ + `a` + U+06A9 原样)在本包判据下是标出来(ZWNJ 夹在两枚拉丁字母之间),`:180`(H4 emoji 家族)仍原样,`sema/displayCapOrder.test.ts:39` 起用到 ZWJ 的格要按 105a-1 重读。
9805
+ - **改读(本包自己的门)**:`run-display-untrusted-projection-test.mjs` D13 只钉 emoji 那一半;R3 / R6 的旧实现对拍域移出格式类整类(含两枚连接符)。
9806
+ - **改读(V-1)**:「控制符转义记号紧跟另一枚记号,后面再跟凭据标签 / 方案词」的输入,0.83.3 / 0.83.4 画出的 `\u001B\«redacted:secret»` 形(反斜杠 + 记号)作废;本版是两枚完整标记加记号(`'token: '` + ESC + U+200B + 值 ⇒ `token: \u001B​«redacted:secret»`),`'Basic'` + ESC + U+2060 这类后面没有值的,不再出现记号(`Basic\u001B⁠`)。
9807
+ - **改读(W-1)**:「结果帧 `errors[]` / 合成终局行里,夹着孤代理项的键值对原样」的判据眼作废;孤代理项被当作值的一部分、连带遮掉邻近非凭据文字的读数(如 `<词>` + U+DC00 + `u:p@host` 整段成 `«redacted:userinfo»@host`)改为与零宽空格同位时同答(`<词>` + U+DC00 + `«redacted:userinfo»@host`)。
9808
+ - **改读(U-1 第二段)**:按「`©` / `™` 之间、U+02BC 修饰字母撇号之间、阿拉伯 tatweel 旁、emoji 与紧随的组合符之间的 ZWJ 原样」断言的格作废;本版这些位置标出来(`©‍©`)。按 emoji 呈现的序列(`❤` + U+FE0F + ZWJ + 🔥、肤色修饰后接 ZWJ)不变。
9809
+ - **改读(V-2 / V-3 / V-4)**:「URL 片段穿过 NBSP 把后面的方案词吞进 query 记号」(`?a=«redacted:query» <值>`)、「谚文填充 / 盲文空点旁的键值对原样」、「`token= "password":"<值>"` 外层遮 `password`」三种读数作废,改锚到值换记号的新形(105c G-V2–G-V4)。
9810
+ - **改读(SM-1)**:按「启动模式位真时请求体仍含 user / project / local / flag 的组」断言的判据眼作废,改为「两种模式都只含 managed 的组(与会话目标 `Stop` hook)」;「启动模式位真时计划的 `settingsDropped` / 开机清单列出非 managed 来源的行」作废。
9811
+ - **订正(活段 §3c / §3d-2 / §3z / §4a / §4b-3 / §4f / §7 / §8,本版同批改)**:§7a P-2 / P-3 / P-4 早在 0.65.0 已收(终态 tick 透传并落终态、`approval_request` / `approval_revoke` 两条 chrome 臂)、§7b P-7 的回执另有读口、P-45 的正位解(`heldBy` 读面)0.68.0 已兑现、§4f 的类型别名退役条件早已兑现、§8-A 的 sdk 地板旧数字、§7d P-43 的「余项」(启动模式收窄本版已收)—— 活段此前没跟,本版按现状改写;按那几行旧文写的判据眼(「端收不到 `approval_revoke`」「子代 settle 只靠防御 sweep」「`task_progress` 剥 `status`」)作废。§3d-2 旧文教的 `tool_end` 扁平读法(`settledBy === 'timeout' && resolution === 'window_expired'` 两键合取、臂上 `resolution` 读形)0.60.0 起已不成立(四个扁平词在 wire 上已删),改读门记录:`isApprovalWindowExpiredGate(gateOutcomeOf(f)) || isGateParkedToolEnd(f)` 一类包内谓词(§3d-2 / §24c);§4a 旧文「`ToolApprovalRespondAckView` 是 sdk 形的超集位」改读为「0.58.0 起就是 sdk `ToolApprovalRespondAck` 的别名」;§4b-3 实现锚里的 `readOfferSupply` 是 `readRuleOfferSupply`。
9812
+ - **新增**:G-J1–G-J8、G-E1–G-E6、G-B1–G-B5、G-M1–G-M3、G-W1–G-W2、G-V1 / G-V1b / G-V1c / G-V2–G-V4、G-X1;G-SM1–G-SM9;G-DD1–G-DD5(含 G-DD2b);G-CS1–G-CS5。
9813
+ - **不变**:旧四口与 hook 故障横幅的字符集;凭据两网的判定(`blanks` 关着时判别视图逐字节同);默认形幂等(含 `max`);不含连接符、不含孤代理项、且没有「转义序列(ESC / C1 序列头,可隔参数 / 中间字节)之后紧跟一枚转义记号」的输入上默认形输出逐字节同(凭据两网关时由门对冻结的上一版字符面逐字节钉;凭据两网开时另核:6 万条不含连接符 / 孤代理项的控制符 / 格式字符 / 凭据混排随机串 × 四种形 + 机读口共 30 万次调用对 0.83.4 发布产物,差异 4278 处全部落在这一射程里 —— 其中 20 处要在行折平把 NBSP 折成空格之后才成形 —— 射程外零差异);`bidi: false` 时连接符原样;RGI 地区旗整串放行。凭据位另核(判据:0.83.4 遮住的凭据字面,本版不许露;对 0.83.4 发布产物):转义记号 / 控制符人造池两组各 5 个种子 × 2 万条、ANSI 与不可见字符现实池 3 × 2.5 万、孤代理项 / 连接符池 3 × 2 万(各 × 五种形 + 机读口),序列头紧贴凭据字面形的定向池 3 × 4 万(× 两种形)、混排池两组 3 × 2 万(× 十二种形 + 机读口 + 旧四口)—— 「0.83.4 遮住、本版露出」计数 0。hooks:没报启动模式的宿主(词读口缺席 / 返回 `undefined` / 非法词 / 抛错,且插件读数没报真),在设置来源里没有同条目重复(跨来源或同组)时,请求体、计划、开机清单与 0.83.4 逐字节同(非法词与抛错多一行调试;有重复时按 DD-1 只发一份);插件在启动模式下全筛(`startup_mode`)与 0.83.1 起同;会话目标 `Stop` hook 的去留只随治理(与 0.83.0 起同);设置来源的拼接次序(managed 在前)。自愈:释放判据、重发腿与处置(`resending`)不变;引擎直说会话已交出时 `running-cancelled` 用户行与注入件行逐字不变。
9814
+ - 已发段(§100、§101、§103 与 0.56.0 的已知局限)不回改,以本段为准。
9815
+
9816
+ ### 105b. 缺席语义(逐键)
9817
+
9818
+ - `escapeBackslashes` 缺席 / `false` / 非 `true` 的任何值(`'true'` / `1` / `null`)⇒ 关(只认严格的 `true`);`mark` 为 `dot` / `space` 时即使 `true` 也关。
9819
+ - `blanks` 缺席 / `false` / 非 `true` 的任何值 ⇒ 关(只认严格的 `true`)。
9820
+ - `displayUntrustedMarks` 的 `text` 非串 ⇒ 按 `String(v ?? '')` 归一(与 `displayUntrusted` 同;`null` / `undefined` ⇒ 空串),不抛;`opts` 缺席 / `null` ⇒ 按默认(与 `displayUntrusted` 同)。
9821
+ - `marks`:文本里没有字符面标记 ⇒ 空数组(不是缺席)。`DisplayMarkSpan.codePoint`:空格形一串被并成一个空格 ⇒ 串里第一枚被标的码位;同串其余不报。
9822
+ - `hooksStartupMode` 不实现 / 返回 `undefined` = 宿主不在安全 / bare 模式(与插件读数上那一位「缺席 = 都不是」同一句)⇒ 不收窄,**零日志、不告警**(没有这两种模式的宿主不实现它是正确答案;有这两种模式的宿主不实现 = 设置来源照发,见包侧缺口)。
9823
+ - `hooksStartupMode` 返回 `'safe'` / `'bare'` 之外的值(`true`、`false`、`'true'`、`'SAFE'`、空串、`null`、数、对象……)⇒ 不收窄(大小写敏感,不做归一),记一行调试。
9824
+ - 读口**写成属性**(`hooksStartupMode` 在场但不是函数)⇒ 不收窄,每轮记一行调试(点名它不是方法;与非法词同口径 —— 宿主显然想报一个词,静默当缺席会让「开了安全模式却照发」无迹可查)。
9825
+ - 读口**抛错** ⇒ 不收窄,记一行调试。方向与 `mergedDisableAllHooks()` 抛错「按真处置」相反:那个值每个宿主都真实存在、按真最严只到「只发 managed」;启动模式读坏了若按某种模式处置,一个普通会话会因为读口故障每轮丢掉用户的 hooks。插件读数上的位报真时照样按安全模式收窄。
9826
+ - 插件读数上的 `suppressedByStartupMode` 缺席 / `false` ⇒ 这一处不算;为真 ⇒ 词读口没报出合法词时按 `'safe'`;取值时抛错 ⇒ 这一处不算、插件那一半 `failed`。
9827
+ - 不传计划的 `hooksForWire()` 不读插件口 ⇒ 插件读数上的位在这条路径上看不见;只在那里报位、又不传计划的宿主不收窄(与 0.83.4 同)—— 报 SM-2 读口即两条路径都认。
9828
+ - 两种模式下 managed 也没配 hooks、也没设会话目标 ⇒ 整份 `settings.hooks` 缺席(与「没配任何 hooks」同形,不发空对象)。
9829
+ - (DD-1)条目身份键算不出(条目不是对象、没有串 `type`、类型不认得、该类型的必需字段不是串、script 型的 `script` / `file` 在场却不是串或两者都缺、`if` 在场却不是串、`args` / `input` 序列化抛错)⇒ 这一条不参与去重,原样发出(形坏条目由服务端报错,与本版前同)。组不是对象或没有 `hooks` 数组、组上的键序列化抛错 ⇒ 整组不参与。
9830
+ - (DD-1)`matcher` 缺席与值为 `undefined` 算同一组键;缺席与空串 `''` 算不同组键(不合)。`shell` 缺席与任何显式值算不同(不合)。`if` 缺席与空串算相同(与上游同)。`args` 缺席与 `null` 算相同。
9831
+ - `releaseConfirmedByEngine` 缺席 = 这次释放不是引擎直说的(只凭终态词判),或结局对象是宿主自拼、没带这一位 ⇒ 不知道会话是否已真正交出 ⇒ 落不说满的那句;**缺席不当直证,也从不铸 `false`**;非严格 `true` 的值(`false` / `'true'` / 其它)与缺席同读。`heldBy` 整键缺席(老引擎)⇒ 只剩终态词那一路,位恒缺席。
9832
+
9833
+ ### 105c. 黑盒判据骨架
9834
+
9835
+ > 🔴 标「本版证明」的格在 **0.83.4** 产物上必须 FAIL、在 0.83.5 上必须 PASS;标「回归约束」的格两版都 PASS;标「端侧验收」的格验的是端换读 / 升级之后的行为。请记下两次跑的产物标识(版本 + tarball shasum)。前缀:G-J = 连接符、G-E = 反斜杠成对、G-B = 名字位空白、G-M = 标记位置、G-W = 孤代理项、G-V = 凭据读法存量修复、G-X = 端侧(展示层)、G-SM = 启动模式收窄、G-DD = 设置来源去重、G-CS = 自愈重发行。下文 U+XXXX 指真码位,反斜杠都是字面一枚;「字符面全关的出口」= `displayUntrusted(x, { controls: false, bidi: false, foldLines: false })`(只剩凭据两网)。
9836
+
9837
+ - **G-J1**(本版证明,纯包层;U-1):`displayUntrusted('Bash' + U+200D)` ⇒ `Bash‍`;`displayUntrusted('a' + U+200C + 'b' + U+200D + 'c', { foldLines: false, mark: 'escape' })` ⇒ `a‌b‍c`;`displayUntrusted('Ba' + U+200D + 'sh', { foldLines: false, mark: 'dot' })` ⇒ `Ba.sh`;`'x' + U+200D`、`U+200D + 'x'`、单独一枚 U+200D、`'1' + U+200D + '2'`、`'Ж' + U+200D + 'Ж'`、`'中' + U+200C + '文'`、U+1F468 + U+200D + `'a'`、U+1F468 + U+200C + U+1F469 在 `{ foldLines: false, mark: 'escape' }` 下连接符都成 `‍` / `‌`。判别点:0.83.4 上全部原样带着连接符。
9838
+ - **G-J2**(回归约束,纯包层;U-1):`ok ` + E + ` go` 在默认形 / `{ foldLines: false, mark: 'escape' }` / `{ foldLines: false, mark: 'dot' }` / `{ foldLines: false, keepLayout: true, mark: 'dot' }` / `{ mark: 'space' }` 下逐字节原样,E 取 U+1F468 U+200D U+1F469 U+200D U+1F467 U+200D U+1F466、U+1F469 U+1F3FD U+200D U+1F4BB、U+1F3F3 U+FE0F U+200D U+1F308、U+2764 U+FE0F U+200D U+1F525、U+1F3F4 U+200D U+2620 U+FE0F、U+1F468 U+200D U+1F9B0;英格兰旗(U+1F3F4 U+E0067 U+E0062 U+E0065 U+E006E U+E0067 U+E007F)原样。
9839
+ - **G-J3**(本版证明,纯包层;U-1 连接文字):U+0915 U+094D U+200D U+0937、U+0628 U+200C U+0628、U+0628 U+064E U+200C U+0628、U+1950 U+0301 U+200D U+1950 在 `{ foldLines: false, mark: 'escape' }` 下原样(回归一半,两版同);U+0628 U+200C `a` ⇒ U+0628 `‌a`;`a` U+0301 U+200D `b` ⇒ `a` U+0301 `‍b`;`a` U+0308 U+200C `b` 同判;`a` U+0301 U+200D U+0301 `b`、`a` U+0308 U+200D U+0628、`a` U+FE0F U+200D U+1F525 的连接符都标出来(语境按簇的基字判,不按紧邻码点;本版证明一半,0.83.4 上原样)。
9840
+ - **G-J4**(本版证明,纯包层;U-2):`readDecisionNoteAudit({ noteRecorded: true, decisionNote: 'deny' + U+200D + 'this' }).note === 'deny this'`;`resumeSettledSubagent` 的 facade 回 `{ note: 'agent' + U+200D + 'x' }` ⇒ `receipt === 'agent.x'`;`hooksNotRunNotice` 的插件名 `guard` + U+200D ⇒ 行内 `guard‍`。判别点:0.83.4 上三处原样带着 U+200D。
9841
+ - **G-J5**(回归约束,纯包层;U-3):`escapeDisplayControlChars('a' + U+200D + 'b')`、`collapseLabel(' a' + U+200C + 'b ')` 原样(后者只折首尾空白);`capForDisplay` 对含连接符的输入两版同答。
9842
+ - **G-J6**(回归约束 + 本版证明,纯包层;U-1 旧编码):U+0D28 U+0D4D U+200D(串尾)、U+0D23 U+0D4D U+200D + ` ` + U+0D15、U+09A4 U+09CD U+200D 在 `{ foldLines: false, mark: 'escape' }` 下原样(回归一半);对照:U+0D28 U+200D(串尾,没有 virama)⇒ U+0D28 `‍`,`a` U+0D4D U+200D ⇒ `a` U+0D4D `‍`,U+0D28 U+0D4D U+200C(串尾)⇒ U+0D28 U+0D4D `‌`(这三格本版证明:0.83.4 上原样)。
9843
+ - **G-J7**(本版证明,纯包层;U-1 非字母):U+0969 U+200D U+0915、U+0964 U+200D U+0915、U+060C U+200D U+0628、U+0301 U+200D U+0915(串首只有组合符)在 `{ foldLines: false, mark: 'escape' }` 下连接符都成 `‍`。判别点:0.83.4 上原样。
9844
+ - **G-J8**(本版证明,纯包层;U-1 第二段):`{ foldLines: false }` 下 `x` + U+02BC + ZWJ + U+02BC + `y` ⇒ `x` + U+02BC + `‍` + U+02BC + `y`;`©` + ZWJ + `©` ⇒ `©‍©`;`™` + ZWJ + `™` 同;U+0640 + ZWJ + U+0628 ⇒ U+0640 + `‍` + U+0628;U+1F525 + ZWJ + U+0301 + U+1F525 ⇒ U+1F525 + `‍` + U+0301 + U+1F525。回归一半:U+2764 U+FE0F ZWJ U+1F525、U+26F9 U+1F3FB ZWJ U+2642 U+FE0F 原样。判别点:0.83.4 上前五形原样。
9845
+ - **G-E1**(本版证明,纯包层;E-1):`displayUntrusted('report' + U+2060, { foldLines: false, mark: 'escape', escapeBackslashes: true })` ⇒ `report⁠`;同参数下字面六字符 `report⁠` ⇒ `report\\u2060`。判别点:0.83.4 忽略未知选项,两者都画成 `report⁠`。
9846
+ - **G-E2**(本版证明,纯包层;E-1 往返):按 105a-2 写一只解码器;对任意输入 `s`(含字面反斜杠、字面 `⁠`、真 U+2060、astral、孤代理项、连接符、名字位空白),`decode(displayUntrusted(s, { credentialUrls: false, credentialWords: false, foldLines: false, escapeBackslashes: true }))` === `s`;`controls` / `bidi` / `blanks` / `keepLayout` 任意组合同判。判别点:0.83.4 上含字面反斜杠的输入解不回。
9847
+ - **G-E3**(回归约束,纯包层;E-1):输入里没有反斜杠时,`displayUntrusted(s, { ...o, escapeBackslashes: true }) === displayUntrusted(s, o)`(`o` 取默认形、`{ foldLines: false, mark: 'escape' }`、带 `max` 的形);`mark` 为 `dot` / `space` 时开关不起作用。
9848
+ - **G-E4**(本版证明,纯包层;E-1 不幂等):输入 `a` + 一枚反斜杠 + `b`(三个字符),`{ escapeBackslashes: true }` ⇒ `a\\b`(四个字符);把它再喂一遍 ⇒ `a\\\\b`(六个字符)。
9849
+ - **G-E5**(本版证明,纯包层;E-1 封长):输入 `a` + 一枚反斜杠 + `b` + U+2060,`{ foldLines: false, mark: 'escape', escapeBackslashes: true, max: 4 }` ⇒ `a\\b`(四个字符;成对算两位、标记不劈);任取输入与 `max`,结果长度 ≤ `max`、按 105a-2 解得回、解出来是原输入的码位前缀,且再多一个码位的前缀编码后超过 `max`(凭据两网关、`foldLines: false`)。
9850
+ - **G-E6**(回归约束 + 本版证明,纯包层;E-1 凭据面):`displayUntrusted('token' + U+D800 + ': hunter2hunter2', { escapeBackslashes: true })` ⇒ `token\uD800: «redacted:secret»`(回归一半:两版同答);JSON 转义一层的键值对(键名与值两侧的每个引号前各一枚字面反斜杠:`{\"api_key\": \"hunter2hunter2\"}`)同参数下不含 `hunter2`(回归一半),输出里的字面反斜杠都成对(本版证明一半:0.83.4 忽略开关,反斜杠不成对)。开关开着与默认转义形的凭据位一致。
9851
+ - **G-B1**(本版证明,纯包层;B-1):`displayUntrusted('a' + U+00A0 + 'b', { blanks: true })` ⇒ `a b`;`displayUntrusted(U+3000 + 'x' + U+3000, { blanks: true })` ⇒ ` x `;`Bash`、`Bash` + U+00A0、`Bash` + U+3164、`Bash` + U+2800 在 `{ blanks: true }` 下画出来两两不同;`displayUntrusted('token=' + U+00A0 + 'hunter2hunter2', { blanks: true })` ⇒ `token= «redacted:secret»`。判别点:0.83.4 上第一格为 `a b`(并进折平),第二格去首尾。
9852
+ - **G-B2**(回归约束,纯包层):不开 `blanks` 时 `displayUntrusted('a' + U+00A0 + 'b')` ⇒ `a b`,`{ foldLines: false }` 下原样;开着时 ASCII 空格 / 制表 / 换行照常折平(`' a '` + U+0009 + `' b'` + U+000A ⇒ `a b`)。
9853
+ - **G-B3**(本版证明,纯包层;B-1 不削弱凭据网):字面写出的 `db user:pa ss@db.internal`(反斜杠是字面一枚)在 `{ blanks: true }` 下 ⇒ `db «redacted:userinfo»@db.internal`,与不开 `blanks` 同答;`https://?k= token=Bearer @<值>`(字面)开着时值照样换记号;`'token='` + U+00A0 + `'hunter2hunter2'` 开着时是 `token= «redacted:secret»`(标记留在记号外)。判别点:0.83.4 忽略这个开关 —— 前两格与不开同答(两版同),第三格画成 `token= «redacted:secret»`(NBSP 被折平)。
9854
+ - **G-B4**(回归约束,纯包层;B-1 字面读法 —— 判据 = 不凭空出记号、值照遮):`{ blanks: true }` 下 `'password:' + U+00A0 + 'missing'`、`'Legal keys:' + U+00A0 + 'maxTurns'`、`'tokens:' + U+00A0 + '250000'`、`'Authorization:' + U+00A0 + 'Bearer'`、`'key:' + U+3000 + 反引号 OPENAI_API_KEY 反引号`、`'token=' + U+00A0`、`'token=' + U+00A0 + 'token=' + U+00A0` 七形都不出记号、洗两遍同;`'token=' + U+00A0 + 'PLACEHOLDERVALUE'` 的值换记号。本版的逐字输出:`password: missing`、`Legal keys: maxTurns`、`tokens: 250000`、`Authorization: Bearer`、`key: ` + 原样、`token= `、`token= token= `、`token= «redacted:secret»`(0.83.4 忽略开关,空白被折平、同样不出记号)。
9855
+ - **G-B5**(回归约束,纯包层;B-1 取并 —— 判据 = 值不露):`displayUntrusted(ESC + '(' + U+3000 + 一枚字面反斜杠 + 'ghp_' + 二十位字母数字, { blanks: true })` 不含那二十位;本版输出逐字为 `\u001B( \«redacted:secret»`(0.83.4 忽略开关、与默认形同答 `\u001B( \«redacted:secret»`)。
9856
+ - **G-M1**(本版证明,纯包层;M-1):`displayUntrustedMarks('a' + U+202E + 'b')` ⇒ `{ text: 'a‮b', marks: [{ start: 1, end: 7, codePoint: 0x202E }] }`;`displayUntrustedMarks('token: ' + U+001B + 'SECRETVALUE', { foldLines: false, mark: 'escape' })` 的 `marks` 恰一枚、`codePoint === 0x1B`,`text` 含 `«redacted:secret»`;对任意输入与选项,`displayUntrustedMarks(s, o).text === displayUntrusted(s, o)`。判别点:0.83.4 上无此导出。
9857
+ - **G-M2**(本版证明,纯包层;M-1 空格形 / 封长):`displayUntrustedMarks('a' + U+0001 + U+0002 + 'b', { mark: 'space' })` ⇒ `{ text: 'a b', marks: [{ start: 1, end: 2, codePoint: 1 }] }`;`displayUntrustedMarks(U+0001 + 'a' + U+0002, { mark: 'space' }).marks` 为空;`displayUntrustedMarks('a' + U+202E + 'bcdefg', { foldLines: false, mark: 'escape', max: 4 })` ⇒ `{ text: 'a', marks: [] }`。
9858
+ - **G-M3**(本版证明,纯包层;M-1 × E-1):输入 `a` + 一枚反斜杠 + `b` + U+2060,`displayUntrustedMarks(s, { escapeBackslashes: true })` ⇒ `text` 为 `a\\b⁠`(十个字符),`marks` 恰为 `[{ start: 4, end: 10, codePoint: 0x2060 }]`;`ok ` + 英格兰旗 + ` ` + U+1F468 U+200D U+1F469 + ` ` + U+0915 U+200D U+0937 的 `marks` 为空。
9859
+ - **G-W1**(本版证明,纯包层;W-1 —— 机读字节的凭据洗消在标签与值之间夹孤代理项时也洗到):`runStream` 喂 `[{ type: 'failed', errorCode: 'network', errorMessage: 'fetch failed: token' + U+D800 + ': hunter2hunter2' }]` ⇒ 合成终局行正文逐字等于 `API Error: fetch failed: token` + U+D800 + `: «redacted:secret»`(孤代理项原样,机读字节不做字符面),结果帧 `errors[0]` 等于该行去掉 `API Error: `;经 `createWireToCcAdapter().adapt(…)` 的交互车道同判。字符面全关的出口对 `'token' + U+D800 + ': hunter2hunter2'` ⇒ 同一串(一轮即洗到);`api_key` + U+DC00 + `=<值>`、`Bearer` + U+D800 + `<值>`、`to` + U+D800 + `ken: <值>`、`password:` + U+DC00 + ` <值>` 同判。判别点:0.83.4 上前述各处原样带出值(默认形那一格两版都洗到,靠第二轮)。
9860
+ - **G-W2**(回归约束,纯包层;W-1):`'ok ' + U+D800 + ' done'`、`'k' + U+D800 + '=v'`、`'see http://h' + U+DC00 + '/path'` 经机读口(或字符面全关的出口)逐字节不变;`'token=abc' + U+D800 + 'def'` ⇒ `token=«redacted:secret»`(值中间的孤代理项随值进记号,两版同答)。
9861
+ - **G-V1**(本版证明,纯包层;V-1):`displayUntrusted('Basic' + U+001B + U+2060)` ⇒ `Basic\u001B⁠`;同输入 `{ max: 12 }` ⇒ `Basic\u001B`;`displayUntrusted('token: ' + U+001B + U+200B + 'hunter2hunter2')` ⇒ `token: \u001B​«redacted:secret»`;`displayUntrustedMarks` 同输入 `{ escapeBackslashes: true }` 的 `marks` 恰两枚(`[7, 13)` 码位 0x1B、`[13, 19)` 码位 0x200B)。对这类输入,输出里不出现「一枚反斜杠后接 u 与反斜杠以外的字符」,也不以孤反斜杠结尾。判别点:0.83.4 上前两格为 `Basic\u001B\«redacted:secret»` / `Basic\u001B\`,第三格为 `token: \u001B\«redacted:secret»`。
9862
+ - **G-V1b**(本版证明,纯包层;V-1 第二段):`displayUntrusted(ESC + '[sk-' + 二十位字母数字)` ⇒ `\u001B[«redacted:secret»`;`displayUntrusted(ESC + 'AKIA' + 十六位大写字母数字)` ⇒ `\u001B«redacted:secret»`;`displayUntrusted(U+009B + 'ghp_' + 二十位字母数字)` ⇒ `\u009B«redacted:secret»`;字符面全关的出口对同三形的值同样换记号。判别点:0.83.4 上三形原样(序列吞掉首字,余下不再是字面形)。
9863
+ - **G-V1c**(回归约束,纯包层;V-1 第二段 —— 判据 = 两版都不露值,输出形不同):`'api_key: '` + ESC + `[` + ESC + `PLACEHOLDERVALUE` 本版 ⇒ `api_key: \u001B[\u001BP«redacted:secret»`(`P` 是 `ESC P` 的引导字,KL-149;0.83.4 为 `api_key: \u001B[\«redacted:secret»`);`'https://u:PLACEHOLDERVALUE'` + ESC + ESC + `'@host/'` 本版 ⇒ `https://«redacted:userinfo»\u001B\u001B@host/`(0.83.4 为 `https://«redacted:userinfo»@host/`);`'password=abc'` + 字面 `\u001b\` + `PLACEHOLDERVALUE` ⇒ `password=«redacted:secret»`;`'Bearer PLA'` + 字面 `\u001b(​` + `CEHOLDERVALUE` ⇒ `Bearer «redacted:secret»`(后两形与 0.83.4 逐字同)。
9864
+ - **G-V2**(本版证明,纯包层;V-2):`displayUntrusted('GET https://api.example.com/v1?a=1' + U+00A0 + 'Bearer PLACEHOLDERVALUE')` ⇒ `GET https://api.example.com/v1?a=«redacted:query» Bearer «redacted:secret»`;字符面全关的出口对同输入 ⇒ `…?a=«redacted:query»` + U+00A0 + `Bearer «redacted:secret»`;`'https://h/?k='` + U+3000 + `'token=Bearer PLACEHOLDERVALUE'` 的值同样换记号。判别点:0.83.4 上为 `…?a=«redacted:query» PLACEHOLDERVALUE`。回归一半:字符面全关的出口对 `'https://h/?k=PLA' + U+00A0 + 'CEHOLDERVALUE'` ⇒ `https://h/?k=«redacted:query»`(两版同)。
9865
+ - **G-V3**(本版证明,纯包层;V-3):`displayUntrusted('api_key' + U+3164 + '=' + U+3164 + 'PLACEHOLDERVALUE')` ⇒ `api_key` + U+3164 + `=` + U+3164 + `«redacted:secret»`;`'Bearer' + U+2800 + 'PLACEHOLDERVALUE'` ⇒ `Bearer` + U+2800 + `«redacted:secret»`;`'token' + U+115F + ':' + U+FFA0 + 值` 同判。判别点:0.83.4 上值原样。
9866
+ - **G-V4**(本版证明,纯包层;V-4):`displayUntrusted('token= "password":"PLACEHOLDERVALUE"')` ⇒ `token= "password":"«redacted:secret»"`。判别点:0.83.4 上为 `token= "«redacted:secret»":"PLACEHOLDERVALUE"`。
9867
+ - **G-X1**(端侧验收;射程:管理台,升级到 0.83.5 后):两张审批卡的工具名分别为 `Bash` 与 `Bash` + U+200D ⇒ 不看单射后缀,名字本身画出来就不同(后者带可见 `‍`)。
9868
+ - **G-SM1**(本版证明,纯包层;SM-1 / SM-2 安全模式):五个来源各在 `PreToolUse` / `Stop` / `UserPromptSubmit` / `PostToolUse` 挂一组(命令依次 `p`(managed)/ `u` / `j` / `l` / `f`),设置口 `hooksStartupMode: () => 'safe'` ⇒ `hooksForWire()` 与 `hooksWirePlan({ engineOwnedByThisShell: true, shellHookEvents: [] }).wire` 四个事件上都只剩 `p`;宿主没实现插件读口、或插件读口抛错时同答。判别点:0.83.4 四个事件都是 `p u j l f`。
9869
+ - **G-SM2**(本版证明 + 回归约束,纯包层;SM-1 / SM-2 bare 模式):同 G-SM1 的五源,`hooksStartupMode: () => 'bare'` ⇒ `hooksForWire()` 与 `hooksWirePlan(…).wire` 四个事件上都只剩 `p`(本版证明);另加 managed `allowManagedHooksOnly: true`(或 `strictPluginOnlyCustomization: ['hooks']`,或合并读口答 `true`)⇒ 仍只剩 `p`,不是 `undefined`(回归约束:managed 不被拿掉)。判别点:0.83.4 前半格五源全发。
9870
+ - **G-SM3**(本版证明 + 回归约束,纯包层;SM-3):同 G-SM1 的五源,不实现词读口,插件读口返回 `{ plugins: [], suppressedByStartupMode: true }` ⇒ `hooksWirePlan(…).wire` 四个事件上只剩 `p`(managed 保留;本版证明);同一端口再加 `hooksStartupMode: () => 'bare'` ⇒ 仍只剩 `p`(词为准,两词同处置);加 `hooksStartupMode: () => true` / `'true'` / 抛错 ⇒ 仍只剩 `p`(旧位照算)。回归约束半格:只报旧位的端口调不传计划的 `hooksForWire()` ⇒ 仍是 `p u j l f`,插件读口零调用。
9871
+ - **G-SM4**(本版证明,纯包层;会话目标):`setWireSessionStopHook('DONE.txt exists', { ccSemantics: true })` 后 `'safe'` 与 `'bare'` 各一格 ⇒ `Stop` 上恰两组(managed 那组 + 会话目标那组,`type: 'prompt'`),其余事件只有 managed 那组;`'bare'` 再让 `mergedDisableAllHooks: () => true` ⇒ 只剩 managed 各组(会话目标随治理不发)。判别点:0.83.4 `Stop` 上是五源各一组 + 会话目标。
9872
+ - **G-SM5**(本版证明,纯包层;插件):`'safe'` 与 `'bare'` 各一格,插件读口交一只 managed 插件、一只非 managed 插件(各一条 `PreToolUse` command)⇒ `plan.excluded` 两只都是 `startup_mode`、`plan.verdicts` 为空、请求体零插件条目、`hooksNotRunNotice(plan)` 为空。判别点:0.83.4 两只照判。
9873
+ - **G-SM6**(本版证明,纯包层;下游):只有 user 来源有一条 `Stop` hook,`'safe'` ⇒ `resolveHeadlessFinalVerifyDetail(['--final-verify'], {}, hooksForWire())` 答 `on: true`;managed 与 user 各一条 `Stop` hook:`'safe'` 与 `'bare'` ⇒ `offReason: 'stop-hook'`(回归约束半格:managed 的照让位)。
9874
+ - **G-SM7**(回归约束,纯包层;反向):词读口缺席 / 返回 `undefined` / `true` / `false` / `'true'` / `'SAFE'` / `''` / `null` / `1` / `{}` / 抛错,插件读数上的位缺席或 `false` ⇒ `hooksForWire()`、`hooksWirePlan(…)`、`hooksNotRunNotice(plan)` 与 final-verify 判定和不实现词读口的端口逐字节同(五源全发)。另:设置口上 `hooksStartupMode: 'safe'`(属性,不是方法;另三格换 `'bare'` / `true` / `null`)⇒ `hooksForWire()` 五源全发,日志恰一行 debug、含 `not a method`,零 warn(调试行一半本版证明:0.83.4 上零日志)。
9875
+ - **G-SM8**(本版证明,包层 + 服务端发布版的 hook 执行入口):managed 一组 `touch <P>; exit 0`、user(另三格换 project / local / flag)一组 `touch <S>; echo deny >&2; exit 2`,`'safe'` ⇒ 请求体交给服务端 `parseHooksConfig` + `createTaskHooks`,`preToolUse('Bash', { command: 'ls' })` 答放行、`<P>` 出现、`<S>` 不出现;managed 一组 `touch <P>; echo deny >&2; exit 2`、user 一组 `touch <U>; exit 0`,`'bare'` ⇒ 答拒绝、`<P>` 出现、`<U>` 不出现(managed 的拒绝照生效);不报 ⇒ 答拒绝、标记都出现(回归约束半格)。判别点:0.83.4 两种模式下 user 那条同样执行。
9876
+ - **G-SM9**(端侧验收;射程:终端,本机引擎,接上 SM-2 读口之后):managed 设置与用户设置里各写一条 `PreToolUse` 的 command hook(各写一个标记文件)⇒ 让代理跑一次工具:`--safe-mode` 启动 ⇒ 用户那条的标记不出现、managed 那条的出现;`--bare` 启动(另一格配 `--settings <文件>`,文件里也写一条)⇒ 用户与 `--settings` 那两条的标记不出现、引擎侧 managed 那条照出现(本版保守侧;本机执行器在 bare 下另有自己的处置,不在此格);不带这两个参数启动 ⇒ 标记都出现。
9877
+ - **G-DD1**(本版证明,纯包层;DD-1):用户设置与 flag 来源各交 `{ PreToolUse: [{ matcher: 'Bash', hooks: [{ type: 'command', command: 'guard.sh' }] }] }` ⇒ `hooksForWire()` 与 `hooksWirePlan(…).wire` 的 `PreToolUse` 恰一组一条。判别点:0.83.4 两组。
9878
+ - **G-DD2**(本版证明,纯包层):managed 与用户设置各一组同条目(`timeout` 分别 5 / 60)⇒ 请求体恰一组,且就是 managed 交来的那个组对象(`timeout` 5)。五源同条目 ⇒ 一条,来自 managed。判别点:0.83.4 两组 / 五组。
9879
+ - **G-DD2b**(本版证明,纯包层;字段取值):用户设置一组 `[A(timeout 5)]`、项目设置一组 `[Z]`、flag 来源一组 `[A(timeout 99)]`(同 `matcher`)⇒ 请求体 `A | Z`,那一条排在 Z 之前(user 处),且就是 flag 交来的条目对象(`timeout` 99);user / project / local 三处同条目(`timeout` 1 / 2 / 3)⇒ 一条、`timeout` 3。判别点:0.83.4 两条 / 三条。
9880
+ - **G-DD3**(回归约束,纯包层):两来源各一条、只差一处 ——`matcher`(`Bash` 对 `Edit`)/ 事件(`PreToolUse` 对 `PostToolUse`)/ 命令末尾多一个空格 / `if` / `shell` 缺席对 `'bash'` / prompt 对 agent ⇒ 两条都在。两版同答。
9881
+ - **G-DD4**(本版证明,纯包层;次序):managed `Edit` 组 `[A]`、用户 `Bash` 组 `[A, B]`、flag `Bash` 组 `[C, A, D]` ⇒ 请求体 `A | A,B | C,D`;managed 组与用户组是原对象,flag 组是新对象,端交来的 flag 组不被改。判别点:0.83.4 为 `A | A,B | C,A,D`。
9882
+ - **G-DD5**(本版证明,包层 + 服务端发布版的 hook 执行入口):用户设置与 flag 来源各写同一条 `UserPromptSubmit` command(每次执行往计数文件追加一行,并回一段固定的 `additionalContext`)⇒ 请求体交给服务端 `parseHooksConfig` + `createTaskHooks`,`userPromptSubmit(…)` 之后计数文件一行、那段上下文出现一次;另一格 user 那份 `timeout: 1`、flag 那份 `timeout: 10`、命令先 `sleep 2` ⇒ 请求体那一条 `timeout` 为 10,执行一次、上下文到一次;命令差一个字节 ⇒ 两行、两次(回归约束半格)。判别点:0.83.4 两行、两次(`timeout` 那一格两条都发,user 那条超时、flag 那条跑完)。
9883
+ - **G-CS1**(本版证明,纯包层):running 三选卡选 cancel,`runs.get` 首发答 `{status:'running'}`(出卡前存活对账)、其后答 `{status:'completed'}`(不带 `heldBy`)⇒ 结局 `running-cancelled` 且不带 `releaseConfirmedByEngine`,`activeRunSelfHealRow(outcome)` 不含 `confirmed`、含 `reports that run as finished` 与 `send it once more`;同一结局以 `origin: 'injected'` 渲 ⇒ 不含 `the session is free again`、含 `is sending the message now` 与 `nothing for you to do`。判别点:0.83.4 两行分别含 `The engine confirmed it is no longer holding this session` / `the session is free again`。
9884
+ - **G-CS2**(本版证明 + 回归约束,纯包层):同 G-CS1 但其后答 `{status:'completed', heldBy:null}` ⇒ 结局 `releaseConfirmedByEngine === true`(本版证明:0.83.4 无此键);行含 `The engine confirmed it is no longer holding this session`、不含 `send it once more`(回归约束:两版同答);答 `{status:'suspended', heldBy:null}` 同,且不含 `reports that run as finished`。对这一结局做 `{...outcome}` 与 `JSON.parse(JSON.stringify(outcome))` 后再渲 ⇒ 与原结局的行逐字相同。
9885
+ - **G-CS3**(本版证明,纯包层;取并那一格):其后答 `{status:'completed', heldBy:'run-99'}` ⇒ 仍是 `running-cancelled`(判据不变)、不带位,行不含 `confirmed`。判别点:0.83.4 含。
9886
+ - **G-CS4**(本版证明,纯包层;两选卡):停泊行已不在引擎上的两选卡选 cancel,cancel 之后 `runs.get` 答 `{status:'suspended', heldBy:null}` ⇒ `stale-park-cancelled` 带位,行不含 `reports it as finished` / `will not resume`、含 `confirmed it is no longer holding this session` 与 `sending your message again now`;cancel 之后答 `{status:'failed'}` ⇒ 不带位、行逐字同 0.83.4。判别点:0.83.4 前一格含 `reports it as finished`。
9887
+ - **G-CS5**(本版证明,纯包层;无卡直决):规则直决(重开判决 `{reopened:false, decidedWithoutCard:true}`)后 `runs.get` 答 `{status:'suspended', heldBy:null}` ⇒ `ask-decided-without-card` 带位,行不含 `has since finished`、含 `confirmed it is no longer holding this session`;答 `{status:'completed'}` ⇒ 不带位、行含 `has since finished` 且以「you may have to send it once more.」收尾(与 0.83.4 只差这半句)。宿主自拼 `{kind:'running-cancelled', taskId:'t'}` / 带 `releaseConfirmedByEngine:false` / `'true'` ⇒ 都落弱句(回归约束)。判别点:0.83.4 前一格含 `has since finished`。
9888
+ - 包层行为钉在门 `run-display-untrusted-projection-test.mjs` X 段(X0–X27b;修复格 X8d–X8g、X12d–X12i、X13c / X13d、X16b–X16e)、X′ 段(X28–X33)与 X″ 段(X34–X40b;G-V1b–G-V4、G-J8、G-B4 / G-B5);`run-hooks-merged-disable-projection-test.mjs` SM 段与 DD 段(G-SM8 / G-DD5 在可选的引擎执行面 SM-E / DD-E,没装服务端包时如实标为未跑);`run-selfheal-reopen-test.mjs` G8⑤l / G8⑤m / G11④f 段与 `run-terminal-identity-copy-test.mjs` 注入件事实表(G-CS1–G-CS5)。
9889
+
9890
+ ### 105d. 端上要动的读点
9891
+
9892
+ 坐标是各端仓内路径,省去开头的 `src/`(测试文件保留 `test/`),以免与本包路径混读;来自 09-26 对各端本机克隆 `origin/main` 的只读检索(终端 `968b4742` 09-25、网页端 `cb5874a` 09-26、桌面端 `5c99611` 08-13 —— 本机克隆陈旧,只代表那一刻、管理台 `4d135e7` 09-26);行号会漂,以各端现状为准。105a′ 的坐标同此。
9893
+
9894
+ **终端**
9895
+
9896
+ - U-2:`components/tasks/SubagentContinueRow.tsx:52`(续跑收据)与 `sema/approvalStreamWire.ts:1567-1568`(回决备注)零改动即得新行为;按旧读数(连接符原样)钉的格换读。
9897
+ - 自带呈现叶子换装本包出口(同名影子豁免到期 0.85.0)时:字符面判据以本节为准,`sema/bidiDisplaySanitize.test.ts:182` 与 `sema/displayCapOrder.test.ts:39` 起用到连接符的格按 105a-1 重读;需要名字不同形的载体(工具名 / 模型名)可开 `blanks` 与 `escapeBackslashes`。
9898
+ - SM-2:在设置口上实现 `hooksStartupMode: () => isBareMode() ? 'bare' : isSafeModeActive() ? 'safe' : undefined`(bare 优先:两种模式同开时上游对 hooks 按 bare 判;本版两词同处置,照实报即可)。实现后 `--safe-mode` 与 `--bare` 下都只有 managed 设置里的 hooks 在引擎侧执行(`--settings` 交来的与用户 / 项目 / 本地设置的都不执行;G-SM9)。
9899
+ - SM-3:今天未实现插件读口;将来实现时,读数上的 `suppressedByStartupMode` 与 SM-2 报同一件事即可(词读口在场时以词为准)。
9900
+ - DD-1 / CS-1 / CS-3:零改动即得。
9901
+
9902
+ **网页端**
9903
+
9904
+ - 展示层今天无读点(远端主干上零处直接调用本出口,也不读 U-2 的五处文本)。接入 D-1 时按本节载体建议。
9905
+ - hooks 零读点(不调 `hooksForWire()`,与 §100a 同);若将来有安全 / bare 一类启动模式并接 `hooksForWire()`,实现 SM-2。
9906
+ - CS-1 / CS-3 零改动即得(复制 / 序列化结局对象不丢这一位)。重试 / 等待覆盖层按 `RetryStatus.kind` 分臂(接入指引,非本版新增行为;§18b / §18c,本版在 §8-D 补了一条)—— 不读 `kind`、把非空 `retryStatus` 一律渲成「请求失败 · 正在重试」的宿主,会把「模型已连上、在等第一个 token」说成失败重试;`attempt` / `maxRetries` 缺席 = 不知道,不补数。
9907
+
9908
+ **桌面端**
9909
+
9910
+ - 今天无读点(展示层、hooks 同网页端);CS-1 / CS-3 零改动即得。
9911
+
9912
+ **管理台**
9913
+
9914
+ - U-1:`lib/web/display-untrusted.ts:38-57` 的五种载体都开着 `bidi`,43 处呈前出口在文本含清单外连接符时字节变;`CUT_ONLY`(`:85-95`,五网全关)不变。按 105a′ 换读 `test/du-display-untrusted.test.ts:353-357`,更新 `:24-25` 与 `displayIdentifier` 头注。
9915
+ - E-1 / B-1(建议):标识载体(`decisionLine`,`displayIdentifierParts` 用它)开 `escapeBackslashes: true` 与 `blanks: true` 后,真格式字符与字面转义文本、名字位空白与 ASCII 空格在本包那一份里就已可分;单射后缀仍覆盖 KL-138 / KL-139 与标准等价两形,是否保留由本端定。🔴 `escapeBackslashes` 的输出不许再喂回出口(`wash()` 里「全文一份 + 带 `max` 再调一次」两次调用各自从原文起算,不受影响;`cutWashed` 把洗后文本喂给五网全关的出口只截不洗,也不受影响)。
9916
+ - M-1(建议):要按样式画标记时换读 `displayUntrustedMarks`,不必按 `\u` 前缀猜。
9917
+ - hooks 零读点;CS-1 / CS-3 零改动即得。
9918
+
9919
+ **验收方**
9920
+
9921
+ - 按 105c 各格:G-J / G-E / G-B / G-M / G-W / G-V 与 G-SM / G-DD / G-CS 的纯包层格在两版产物上对拍;G-SM8 / G-DD5 带服务端发布版跑;G-X1 在管理台真部署上跑,G-SM9 在终端接上 SM-2 读口之后跑。按 105a′ 各条改锚。
9922
+ - 要自渲「会话已交出」一类措辞的端,读 `releaseConfirmedByEngine === true`,别拿 `kind` 当直证;自己拼结局对象的壳不带这一位 ⇒ 拿到不说满的那句。
9923
+
9924
+ ### 105y. 🔴 三端升级必读(固定段式)
9925
+
9926
+ 1. **换钉 `^0.83.5` 之前**:无前置编译改动(纯 additive:一只新函数、三个新型、`DisplayUntrustedOptions` 两个可选位、`SettingsPort` 一只可选成员、`SelfHealOutcome` 三条臂各一个可选位)。🔴 例外:把 `DisplayUntrustedOptions` 用在 `satisfies Record<…, DisplayUntrustedOptions>` 之外的**精确对象型**比较(如 `keyof DisplayUntrustedOptions` 的穷尽表)要补两键(今天检索未见这类读点);对三条重发结局做穷尽键集断言的端要跟 `releaseConfirmedByEngine`(按 `kind` 穷举的读法不受影响)。
9927
+ 2. **可观察变化**:🔴 默认形与一切开着 `bidi` 的形里,清单外文字旁 / 串首尾 / 孤立的 ZWJ / ZWNJ 从原样变为标出来(U-1);本包内五处文本随之变(U-2);emoji 连字、连接文字里的连接符与 RGI 地区旗不变;`©` / `™` / U+02BC / tatweel 旁的 ZWJ 标出来(U-1 第二段);转义序列之后紧跟一枚转义记号时不再留「反斜杠 + 记号」形(V-1);序列头紧贴已知凭据字面形、URL 片段后接非 ASCII 空白与方案词、谚文填充 / 盲文空点夹在键值对里、值开头是引号包着的里层标签这几形的值本版换成记号(V-1 第二段 / V-2 / V-3 / V-4);机读字节(结果帧 `errors[]`、合成终局行)上,夹着孤代理项的凭据值换成记号(W-1);旧四口与 hook 故障横幅不变;不含连接符、不含孤代理项、也没有「序列紧跟记号」的输入逐字节不变;两只开关不开就没有别的变化。hooks:宿主报了启动模式时安全模式与 bare 模式都只发 managed,计划的 `settingsDropped` 与开机清单里被筛来源的行不再出现,非 managed 来源写的 `Stop` hook 不再让显式 `--final-verify` 让位,会话目标 `Stop` hook 照发,收窄时多一行调试;没报的宿主零变化(词读口返回非法词或抛错时多一行调试);对所有宿主,同一事件同一 `matcher` 组里身份键相同的设置来源条目只发一份(留 managed / 首次出现那份的位置,字段取优先级最高那份),这类重复此前会在引擎上执行两次;传了计划、宿主没实现插件读口时,那条一次性告警现在排在设置来源「拿掉条目」的调试行之前。自愈:三条重发结局只凭终态词判释放时,用户行换成「引擎报它已结束 + 可能要再发一次」(`running-cancelled`;`ask-decided-without-card` 原句之后补同一句出路半句)、注入件行换成「那一轮报已结束 + 可能再被挡一次」;引擎直说会话已交出时 `running-cancelled` 用户行与注入件行逐字不变,`stale-park-cancelled` / `ask-decided-without-card` 用户行不再说「报它已结束」。
9928
+ 3. **要做的事**:按 105a′ 换读钉着「连接符原样」「启动模式位下设置来源照发」「同一条 hook 两份」「cancel 成功即 confirmed」「`tool_end` 扁平两键合取」的格(管理台 ⑥ 第二条当天红);名字 / 标识载体按需开 `escapeBackslashes` 与 `blanks`,开 `escapeBackslashes` 的载体只在最终呈现处调一次、输出不再喂回出口;要按样式区分标记的读 `displayUntrustedMarks`;终端实现 SM-2 读口(bare 优先);要自渲「会话已交出」措辞的端读 `releaseConfirmedByEngine`。已发段(§100、§101、§103 与 0.56.0 的已知局限)不回改,以本段为准;活段 §3c / §3d-2 / §3z / §4a / §4b-3 / §4f / §7 / §8 随版改。
9929
+
9930
+ **包侧缺口:** 展示层 —— ① 连接文字语境里的连接符不保证单射(清单内同一文字的两个字母之间夹一枚、而该文字在这一对字母上不变形时同形;名字位的严格上下文规则本包没有按它判;KL-138)· ② 零宽组合符(U+034F、变体选择符、蒙古自由变体选择符、高棉 U+17B4 / U+17B5)与渲成空白的罕见符号(如 U+1D159)不在任何一网(KL-139)· ③ 运行引擎不认的文字名载入时滤掉,那一族旁的连接符改为标出来(过严;KL-140)· ④ 点形 / 空格形下 `blanks` 分不出是哪一枚空白,空格形合并的一串只报第一枚(KL-141)· ⑤ `escapeBackslashes` 只让字符面无歧义,凭据记号与字面同形文本、行折平仍有损(KL-142)。凭据读法 —— ⑥ 含孤代理项的两形(userinfo 后无主机 / 方案词后的地址豁免)与零宽空格同位同答,0.83.4 顺带遮住的值本版露出(KL-143)· ⑦ 软连字符拆开的字面形尾段、零宽字符切开的 Digest 参数名、整段落在已结尾控制串里的值、裸值里字面 `\uXXXX` 之后的半段(两版同,KL-144–KL-147)· ⑧ 没有 `@` 的 `scheme://<名>:<非数字>` 值按地址豁免(两版同,KL-148)· ⑨ 转义序列吞掉值首的一个字时那一个字留在可见转义形里(KL-149)· ⑩ `blanks` 开着时「遮住的 ⊇ 开关关」的两类例外:输入里字面写出的名字位空白转义形紧跟标签(KL-150)、与点形 / 空格形同开(KL-151)。hooks —— ⑪ 宿主有安全 / bare 模式却没报(不实现 SM-2 读口、插件读数也没报;或只在插件读数上报、不传计划调 `hooksForWire()`)⇒ 设置来源照发引擎,本包不告警(KL-152)· ⑫ 设置来源去重是上游执行期去重的子集:`matcher` 不同但都匹配到同一次调用的同一条命令照发两份;`shell` 缺席与显式 `bash` 不合;会话目标 `Stop` hook 与设置里同文本的 prompt hook 不合;`args` / `input` 对象键序不同不合(KL-153)· ⑬ bare 模式下本包仍发 managed 那一份(与安全模式同处置);上游在非 managed-only 的路径上 bare 不跑 managed hooks,本包在查实之前取保守侧(KL-154)。开机工具面 —— ⑭ 回落估计表无条件列 `ToolSearch`,引擎只在有延迟披露工具时才挂 ⇒ 回落路径上可能多报一只(KL-155)。记忆采集 —— ⑮ 中途关闭记忆采集的动词(capture-optout)的结局处置表仍未归包,本包只有提交时的声明形(KL-156;§7d P-46)。自愈 —— ⑯ 只凭终态词判的释放仍可能在会话真正交出之前重发一次(§7b P-45,存量):本版只让文案不说满,判据与重发腿不变。
9931
+
9602
9932
  ## §104 🆕 0.83.4(2026-09-26)plan 审批卡「用户关掉的卡自动触发不放回」归包(含 409 自愈腿结局与行句)+ 座位审批请求补强制位 / 理由词 / 缺席因由 / 出身词 + `<system-reminder>` 剥离 / 解包口上公面(线性实现)+ 两条展示层指引订正(patch;根公面 +4 名,1273 → 1277〔`stripSystemReminderBlocks` / `unwrapSystemReminder` / `toolPermissionRequestAskBits` / `clearPlanReviewUserDismissals`〕;公面类型 +2〔`PlanReviewReopenTrigger` / `PlanReviewGateInstanceReader`〕;`ToolPermissionRequest` +4 可选位;`TOOL_PERMISSION_REQUEST_KEYS` 10 → 14;`ReopenPlanReviewOpts` +3 可选位;`armPlanReviewApproval` 选项 +1 可选位;`ReopenCardVerdict` 拒开臂 +1 可选位 `dismissedByUser`;`SelfHealOutcome` 的 `plan-review-reopen-failed` 臂 +1 可选位 `dismissedByUser`;`ActiveRunSelfHealDeps.reopenPlanReview` +1 可选第二参;开发依赖引擎 `~7.33.1`〔本包零运行期读点〕;零投影臂;peer sdk 地板 `>=11.3.0` 不动)
9603
9933
 
9604
9934
  > **patch**,三件同发 + 成文改口(本节按 0.83.4 的读法写;若与本版发布帖不一致,以发布帖为准):