@sema-agent/client-core 0.85.2 → 0.87.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/CHANGELOG.md +263 -0
  2. package/README.md +25 -16
  3. package/dist/adapt/arms.js +14 -1
  4. package/dist/adapter/downstream/terminalToSdkResult.d.ts +3 -3
  5. package/dist/adapter/downstream/terminalToSdkResult.js +4 -1
  6. package/dist/adapter/runStream.js +75 -2
  7. package/dist/adapter/types.d.ts +3 -0
  8. package/dist/agentSession/backgroundView.js +7 -1
  9. package/dist/agentSession/contract.d.ts +1 -1
  10. package/dist/centerWiringCapability.d.ts +38 -0
  11. package/dist/centerWiringCapability.js +202 -0
  12. package/dist/decideFailureNote.js +3 -0
  13. package/dist/decideReceipt.d.ts +1 -1
  14. package/dist/decideReceipt.js +1 -1
  15. package/dist/detachWire.d.ts +6 -1
  16. package/dist/detachWire.js +22 -1
  17. package/dist/engineCapReader.d.ts +8 -0
  18. package/dist/engineCapReader.js +15 -0
  19. package/dist/engineErrorCodes.d.ts +3 -0
  20. package/dist/engineErrorCodes.js +8 -0
  21. package/dist/engineNoticeCodes.d.ts +62 -0
  22. package/dist/engineNoticeCodes.js +247 -29
  23. package/dist/executionLaneCapability.d.ts +6 -0
  24. package/dist/executionLaneCapability.js +55 -2
  25. package/dist/fleet/fleetProjection.js +6 -8
  26. package/dist/fleet/workflowSizeWarning.js +2 -5
  27. package/dist/gateOutcome.d.ts +13 -0
  28. package/dist/gateOutcome.js +48 -1
  29. package/dist/gateVocabulary.d.ts +6 -3
  30. package/dist/gateVocabulary.js +7 -15
  31. package/dist/generated/engineFactTables.d.ts +10 -0
  32. package/dist/generated/engineFactTables.js +113 -0
  33. package/dist/generated/engineNoticeTables.js +14 -0
  34. package/dist/hitl/crashConverged.d.ts +1 -0
  35. package/dist/hitl/crashConverged.js +17 -2
  36. package/dist/hitl/hitlBridge.d.ts +4 -0
  37. package/dist/hitl/hitlBridge.js +6 -0
  38. package/dist/hitl/parkResolver.js +17 -12
  39. package/dist/hitl/refusedToolNameProse.d.ts +4 -0
  40. package/dist/hitl/refusedToolNameProse.js +7 -0
  41. package/dist/hitl/sessionPolicyDeliverable.js +9 -5
  42. package/dist/hitl/sessionPolicyWire.d.ts +16 -0
  43. package/dist/hitl/sessionPolicyWire.js +49 -1
  44. package/dist/hitl/suspendedReopen.d.ts +7 -0
  45. package/dist/hitl/suspendedReopen.js +38 -7
  46. package/dist/hitl/toolApprovalWire.js +4 -5
  47. package/dist/index.d.ts +6 -1
  48. package/dist/index.js +6 -1
  49. package/dist/inheritEnvWire.d.ts +22 -0
  50. package/dist/inheritEnvWire.js +84 -0
  51. package/dist/peerFrames.js +2 -10
  52. package/dist/printInitToolFace.d.ts +6 -0
  53. package/dist/printInitToolFace.js +115 -2
  54. package/dist/readCredentialRefusal.d.ts +2 -0
  55. package/dist/readCredentialRefusal.js +7 -0
  56. package/dist/request/taskRequest.d.ts +4 -5
  57. package/dist/request/taskRequest.js +33 -23
  58. package/dist/resumeRefusalCopy.d.ts +2 -7
  59. package/dist/resumeRefusalCopy.js +2 -24
  60. package/dist/rewindArchiveCapability.js +5 -0
  61. package/dist/runTerminal.js +2 -6
  62. package/dist/seam.d.ts +11 -1
  63. package/dist/seam.js +7 -0
  64. package/dist/sqlEngineCapability.js +15 -2
  65. package/dist/storePostureCapability.d.ts +25 -0
  66. package/dist/storePostureCapability.js +132 -0
  67. package/dist/toolHistoryMismatch.d.ts +63 -0
  68. package/dist/toolHistoryMismatch.js +425 -0
  69. package/dist/toolResult.js +2 -47
  70. package/dist/wireErrorTriage.d.ts +1 -0
  71. package/dist/wireErrorTriage.js +3 -0
  72. package/dist/wireFailureShape.d.ts +3 -0
  73. package/dist/wireFailureShape.js +44 -0
  74. package/dist/wireRefusalCopy.d.ts +39 -1
  75. package/dist/wireRefusalCopy.js +350 -2
  76. package/dist/workflowClient.d.ts +7 -2
  77. package/dist/workflowClient.js +15 -7
  78. package/docs/INTEGRATION-CLIENTS.md +942 -16
  79. package/package.json +2 -2
package/CHANGELOG.md CHANGED
@@ -49,6 +49,269 @@
49
49
  > 挡住 ⇒ 本批把它机械化——④a0 对 `pending` 行**要求段头已是日期形**(`(未发布)` 直接红),阶段一
50
50
  > commit 漏转在发布前就红,不再靠人记。
51
51
 
52
+ ## 0.87.0(2026-10-01)
53
+
54
+ > 主题:**minor** —— 六票同发(按票序)。① **会话历史 tool_use 错配的自救出路**(CC-268;终端的请托):provider 因为会话历史里一只工具调用对不上结果而拒掉这一会话的每一次请求时,合成终局错误行带机读超集键 `_sema_tool_history_mismatch`;本面真有 `/rewind` 命令的宿主钉 `EmitContext.offersRewind`(`true`,或对象形 `{ engineBaseUrl }` —— 那台引擎明说没有对话锚时不加句)后,行尾另起一行出路句(与 CC 同句),同一会话连续第二次起再补一句次数;另出两只根入口纯函数 —— 判型 `classifyToolHistoryMismatch` 与回退节点解析 `resolveToolHistoryRewindTarget`。② **崩溃收敛 needsHuman 桶的因由位**(CC-269):`projectCrashConverged` 的 needsHuman 行带闭集四词 `needsHumanReason`,分桶判据一字未改。③ **停车 fail-soft 真因超集键**(CC-273):HITL 桥在同步腿终帧在场时 fail-soft 收场,那只终帧照旧原样回吐、顶层多 `_sema_park_failed_reason`(与 durable 腿合成终帧的 `errorMessage` 逐字相等),结果帧透传同名键。④ **workflow 活动台账与监视器源的凭证位收取值函数**(CC-274):连线身份改按凭证来源认,宿主持同一只取值函数时令牌轮换不再清账。⑤ **detach 取消兜底的 arm 口收取值函数**(CC-275):取件口每调一次现读。⑥ **chrome 臂 `suspended_reopened`**(CC-276):流上 `suspended{reopened}` 投成一条 chrome 事件(读数 + reopen 族单源句 + 幂等键)。**为什么是 minor**:两只新顶层导出(`classifyToolHistoryMismatch` / `resolveToolHistoryRewindTarget`)+ `ChromeEvent` 新臂 `suspended_reopened`(对 `ChromeEvent['kind']` / `ChromeArmKind` 做穷尽 `Record` / `switch` 的 TypeScript 端编译红,与 0.86.0 同口径)+ 四处可选位 / 入参放宽(`EmitContext.offersRewind?`、`CrashConvergedRow.needsHumanReason?`、`LiveWorkflowConfig.authToken` / `WorkflowActivityLedgerConfig.authToken` 收取值函数、`armDetachCancel` 入参 `authToken` 收取值函数;对构造方均 additive)。型面 BREAKING 零处(对构造方;读那两只配置位 `authToken` 并按「串 / 中继」二分的宿主代码会编译红,见 Changed 第 5 条)。根公面运行期导出 1354 → 1356(+2);测试钩 62 不变;公面类型名 922 不变(两只新口的入参 / 出参型名不上入口,宿主按结构传;chrome 新臂是 `ChromeEvent` 联合的内联成员);超集键 +2(`_sema_tool_history_mismatch` / `_sema_park_failed_reason`);投影臂 +1(chrome `suspended_reopened`;`CHROME_ARMS` +1 行,`required:false`);另有**已发导出的可观察变化**在 Changed 逐条单列(第 1–6 条,写明谁要跟;第 7 条是公面零变化的内部搬家)。peer sdk 地板 `>=12.0.1` 不动;开发依赖不变。
55
+
56
+ ### Added
57
+
58
+ - **会话历史对不上时的自救出路**(CC-268;接入文档 **§113 TH-1 / TH-5 / TH-6**):provider 因为会话历史里一只工具调用没有对应的结果(或一只结果没有对应的调用、或一只调用 id 重复)而拒掉这一会话的每一次请求时,合成终局错误行(`API Error: …`)多一只机读键 `_sema_tool_history_mismatch: { kind, toolUseId?, consecutive? }`。`kind` 取 `tool_use_without_result` / `orphan_tool_result` / `duplicate_tool_use_id` 之一;`toolUseId` 是 provider 点名的第一只 id(provider 那句话没点名、或读不出时缺席);`consecutive`(只从第二次起在场)= 同一会话连续几次 run 撞上同一错配。这只键只铸在那一行上,且只在失败是三句 provider 模板之一时铸;别的终局行与 0.86.0 逐字节同。`adapt()` 重建这一行时接力这只键;原样转发这一行的宿主(例如 print 车道的 JSON 流)也带着它。
59
+ - 判型从不读 assistant 正文。别的状态(401 / 404 / 429)、别的 400(例如模型名无效)与引用这句话的形都不认。provider 回体是 JSON 时只认错误信封上的那句话(顶层 `message` 或 `error.message`;回体须从开头就是这个对象,宿主直接交 SDK 错误对象时的 `400 {…}` 形同认),请求回显、数组成员、更深一层对象里的同名键都不认。宿主直接交 SDK 错误对象、回体不是 JSON 时的 `400 <provider 原话>` 形同认(只剥一个状态词)。
60
+ - `toolUseId` 按整只读:带字符集外字符(例如 `/`)、后接截断标记 `…`、或顶在失败文本末尾(被截断)时整只缺席,不取前缀。token 后面紧跟列表分隔符(`,` / `;`)时整只就是 id、一个字符都不剥(带尾冒号的 `call_1:` 照收);后面是空白或结尾时至多剥一个句末 `.`,剥完仍以 `.` / `:` 收尾 ⇒ 分不清 id 后缀与句末标点 ⇒ 缺席。孤儿结果那一句在 `` `tool_result` `` 之后带 `blocks`、`block` 或直接接冒号都认。
61
+ - 连续次数按进程、按会话记(键是引擎回显的会话 id),只数不同的 run(同一次 run 被重看不加码)。回放的终局、不带 run id 的终局(含失败文本为空的失败事件帧)与结局读不出的终局不记次数,但与这一次错配不同时照样清零;这一会话的任何别的结局清零。先开后收的老流晚到的终局**只许清零、不许加码**:与行上指纹不同(别的结局 / 别的错配)⇒ 本段到此为止、不答次数;同指纹 ⇒ 不改账;较新的流收到的任何终局(包括不改次数的那几形)都推水位。终局上没有引擎回显的会话 id 时(失败事件帧、会话占锁的 409 拒绝、结局读不出的 done)按宿主开流时钉的 id 记;那只 id 从没被引擎回显过(宿主每轮现铸会话 id)时这一终局认不出属于哪一只会话,本进程里每一只会话正在数的连续都按被打断处理(下一次从 1 起)。拿不准时不报次数,不多说。
62
+ - **`EmitContext.offersRewind?: boolean | { engineBaseUrl: string }`**(CC-268;**§113 TH-2 / TH-3**):本面有 `/rewind` 命令的宿主钉它;错配那一行随之在行尾另起一行 `Run /rewind to recover the conversation.`(与 CC 同句),从连续第二次起再多一句,给出次数并说明 `/rewind` 是恢复这一会话的唯一出路(` The same error has now happened N times in a row; /rewind is the only way to recover this conversation.`)。缺席、`false`、`print` 车道与 `utility` 车道都不加句。结果帧 `errors[]` 恒是引擎原文。
63
+ - 对象形 `{ engineBaseUrl }`(推荐):本包按那台引擎查自己的「只回退对话」判据(与 `/rewind` 菜单同一只 `rewindConversationAvailability`)。引擎明说没有对话锚时两句都不加,键照铸;引擎说有、或判不出(没报、读不出、没观测过)时照加。`true` 不查这只判据,由宿主自己担保。
64
+ - **`classifyToolHistoryMismatch({ code, status, message })`** ⇒ `{ kind, toolUseId? } | null`(CC-268;**§113 TH-7**):与那一行同一只判型,给手里握着失败本身(run 的失败码、provider 状态、失败文本)的宿主。只认 HTTP 400(状态 `400`,或失败文本以 `<标签> HTTP 400:` 起头);给了码时只认 `invalid_request`;且 provider 那句话须在 provider 消息的开头(JSON 回体里是顶层 `message` 或 `error.message` 的开头)。永不抛。
65
+ - **`resolveToolHistoryRewindTarget(rows, mismatch)`** ⇒ `{ target } | { rootReopen: true } | { undecidable: reason }`(CC-268;**§113 TH-8**):交进宿主自己的转录行(每行可带 `toolUseIds` / `toolResultIds` / `prompt` / `engineHandle` / `local` / `sessionRoot`),找最早提到那只 id 的一行,再回溯到那一轮的 prompt:答那只 prompt 行本身(回退到它之前);那只 prompt 是会话第一轮时答从头开始;判不了时答六个理由之一(`no-mismatch` / `no-tool-use-id` / `id-not-found` / `prompt-not-found` / `prompt-without-handle` / `unreadable-rows`)。跳过宿主本地行,绝不越过没有引擎句柄的 prompt,不改入参,永不抛(`mismatch` 的位读不出 ⇒ `no-mismatch`;行读不出 ⇒ `unreadable-rows`)。
66
+ - **崩溃收敛 needsHuman 桶的因由位**(CC-269):`projectCrashConverged` 产出的 `needsHuman[]` 每一行多一位 `needsHumanReason`(`CrashConvergedRow` 上的可选位,闭集四词):`approved_then_interrupted`(`decided` ∧ `resumeSafe:false`:人当时批了、执行窗内引擎断了)/ `pending_unsafe`(`pending` ∧ 无已批证据 ∧ `resumeSafe:false`)/ `unstable_row`(载体带取值器或自带原型)/ `contradictory`(`pending` 却带已批证据,或 `decided` 却 `resumeSafe:true`)。优先序:载体不可信 > 判据位冲突 > 人已批 > pending 却不安全。与分桶出自**同一次读**;`resumeSafe[]` 的行不带;供给行上碰巧有同名位 ⇒ needsHuman 行被覆盖、resumeSafe 行被摘掉。分桶判据一字未改。接入文档 **§113 N-1 / 113a′ 第 4 条**。
67
+ - **停车 fail-soft 真因超集键 `_sema_park_failed_reason`**(CC-273):HITL 桥(`bridgeAskUserQuestionGates`)在一张卡决不成、fail-soft 收场时,若这张 park 来自同步腿终帧 `done{suspended}`,那只终帧**照旧原样**回吐(不造第二只终帧,`type` / `id` / `result` 同一只对象),但顶层多一位 `_sema_park_failed_reason` = 真因 + 出路那一句,与 durable 腿同一失败合成的 `failed{errorCode:'hitl_unanswered'}` 的 `errorMessage` 逐字相等;结果帧投影(`terminalToSdkResult` / `runStream`)把它透传到 CC 结果信封同名键,出口与 `errors[]` 过同一只凭据洗消(句中 URL 的 userinfo / 查询串换成记号;帧上那一位是原句),`errors[]` / `subtype` / `is_error` 一字不动。触顶收场两形(连续非进展轮 / 决了又停回来 `hitl_stalled`)与宿主撤卡收场同样带各自那一句。缺席 = 没有能给用户的真因:用户 Esc、普通终帧,以及这一端没有决断面(宿主没装审批卡口、卡口装在别的会话键上、问答腿没有 overlay —— 真因是装配诊断,「卡再出现时在卡上决」在这一端不成立;durable 腿合成终帧照旧带那一句)。接入文档 **§113 P-1 / P-2**。
68
+ - **chrome 臂 `suspended_reopened`**(CC-276):`runStream` 对流上一帧 `suspended{reopened:<码>}` 发一条 chrome 事件(与该帧同一拍、按流序;转录面仍零行):`{ kind, laneProof, reopen, content?, eventId?, taskId? }` —— `reopen` = `suspendedReopenOf` 读数(恒 `reopened` 臂,原码开集);`content` = reopen 族单源句 `resumeReopenContent`(与决断回执那一路逐字同句;码不在 reopen 族闭集内 ⇒ 缺席);`eventId` = 帧的 durable id;`taskId` 只在帧上自带时在场(帧上 `taskId` 键原样 —— 服务端用这个键、且值按 run 唯一时它才等于 run id)。明说没重开 / 老引擎缺键 / 坏形 / 帧上的位读不出(取值器抛)⇒ 一条不发、流照走。同一条流上的重放按既有 durable 幂等只报一次。`CHROME_ARMS` +1 行(`required:false`)。接入文档 **§113 R-1**。
69
+ - 公面合计:根入口运行期导出 +2(CC-268:`classifyToolHistoryMismatch` / `resolveToolHistoryRewindTarget`);测试钩不变;公面类型名不变;`EmitContext` +1 可选成员(`offersRewind`)、`CrashConvergedRow` +1 可选成员(`needsHumanReason`)、`ChromeEvent` +1 臂(`suspended_reopened`)。
70
+
71
+ ### Changed
72
+
73
+ 🔴 **已发导出的可观察变化(逐条;按旧行为断言过的测试请按接入文档 §113a′ 改锚)**:
74
+
75
+ 1. **合成终局错误行**(CC-268):错配形那一行多 `_sema_tool_history_mismatch`(宿主不改代码也会看到);宿主钉 `offersRewind: true`(或对象形,且那台引擎没明说没有对话锚)时行尾另起一行出路句、连续时再加次数句;`adapt()` 重建的行同带这只键;终端 `-p` stream-json 输出的合成行照出这只键、不加句。非错配行与结果帧 `errors[]` 与 0.86.0 逐字节同。**谁要跟**:按「行恰等于 `API Error: <原句>`」或「合成行键集恰为 …」断言的格改锚(§113a′ 第 1 / 2 条)。
76
+ 2. **`projectCrashConverged`**(CC-269):needsHuman 行多一位 `needsHumanReason`;供给行上碰巧有同名位 ⇒ needsHuman 行被覆盖、resumeSafe 行被摘掉;分桶不变。**谁要跟**:按「needsHuman 行键集恰等于供给行键集」断言的格改锚(§113a′ 第 4 条)。
77
+ 3. **`bridgeAskUserQuestionGates`**(CC-273):在上述收场形上吐出的同步终帧是一只**新信封**(多一位,`result` 仍是同一只对象;按对象同一性比对终帧的宿主注意);结果帧在上述收场形上多一位超集键。**谁要跟**:按 `===` 比对回吐终帧、或按「帧键集恰等于引擎那一帧」断言的格改锚(§113a′ 第 5 条)。
78
+ 4. **`runStream`**(CC-276):有 `emitChrome` 时多发一种 chrome kind `suspended_reopened`;转录面不变。**谁要跟**:对 `ChromeEvent['kind']` / `ChromeArmKind` 做穷尽 `Record` / `switch` 的 TypeScript 端补一行(否则编译红);「`runStream` 发出的 chrome kind 恰为某集合」的判据加这一词(§113a′ 第 6 条)。按端:终端必改两处(臂登记表补一行;臂对账要求每条已知臂有在场的消费点 ⇒ `consumeChrome` 补一条零行为 `case 'suspended_reopened':`,或 `hostSink` 补一支判别);网页端必改三处(chrome 臂台账补一行;臂 parity 测试正控臂数 35 → 36;同一测试的 `SAMPLES` 补一条合成事件)。另:`suspendedReopenOf` 读 `reopened` 时取值器抛错(或入参是已撤销的 Proxy)由外抛改答 `unstated`(兑现「永不抛」;流驱动主循环也读它)。
79
+ 5. **workflow 活动台账与监视器源的凭证位收取值函数**(CC-274):`LiveWorkflowConfig.authToken` 与 `WorkflowActivityLedgerConfig.authToken` 由 `string | { mode: 'same-origin-relay' }` 放宽为 `WireAuthTokenSource | { mode: 'same-origin-relay' }`(`WireAuthTokenSource` = 串或 `() => string | undefined`,与 `makeEngineWireClient` 同一形)。取值函数原样交给 wire client,**每发一次请求读一次**(活动流的每次开流 / 断流重连、监视器源的每次 list / get),构造期零读。放宽对**构造方** additive;**读**这两只配置位、按 `typeof c.authToken === 'string' ? … : c.authToken.mode` 二分的 TypeScript 宿主代码会编译红(TS2339)—— 要补函数那一支(运行期函数形落进「串」那一支会把函数源码当令牌拼进头里)。
80
+ - **连线身份改按凭证来源认**:活动台账判「同一 workflow 的新请求是不是同一条连线」时,串按值比、取值函数按**函数引用**比、同源中继声明形按 `mode` 比;形不同恒不等(串 → 取值函数算换了来源,顶掉一次,之后稳定)。比较时**从不调用**取值函数。结果:宿主持同一只取值函数时,令牌轮换不再把同一台引擎、同一 principal 的台账当成另一条连线顶掉 —— 修前宿主只能每次现读一个串塞进来,每一次轮换都让台账被换成空账、已收的运行期活动事实清零。
81
+ - 🔴 宿主要持**同一只**函数(建一次,各入口 spread 同一份连线对象):每次调用现造一只箭头函数 = 每次都是另一连线身份,台账会被顶掉,监视器源随之停手退回只读快照轮询(接入文档 §113a′ 第 7 条)。
82
+ - 串形 / 中继形:判法与 0.86.0 逐格同(串的值就是它的来源)。
83
+ - `authToken` 缺席(`undefined`,JS 宿主漏传):同一 workflow 第二次 `ensureWorkflowActivityLedger` 由抛 `TypeError` 变为复用同一台账(两次来源相同);`null` 两版都抛。
84
+ 6. **detach 取消兜底的 arm 口收取值函数**(CC-275):`armDetachCancel` 入参的 `authToken` 另收 `() => string | undefined`。arm 时零读;取件口 `detachCancelArm()` **每调一次读一次**,读到的值过与 wire client 同一只三态解析(`resolveWireAuth`)后,仍以 `string | { mode: 'loopback-unauthed' }` 两形之一交出 —— 宿主发射腿(按「是不是串」分两支)的读法一字不变,发送前同步取件即拿到发送那一刻的凭证。`DetachCancelArm` 型本身不变(它是取件形)。
85
+ - 取不到(`undefined` / 空串 / 非串 / 抛错)⇒ 回环地址答 `{ mode: 'loopback-unauthed' }`(发射腿零 Authorization 头,绝不伪造),非回环答 fail-closed 匿名身份;取值函数抛错时取件口**不抛**(它跑在信号处理路径上)。
86
+ - 串 / 回环免鉴权声明形:取件口照旧给回 arm 进来的**同一个对象**,与 0.86.0 逐字节同。取值函数形每次取件给一个新对象:原型与 arm 相同(类实例 arm 原型上的 `getTaskId` 照样可达),自有位按属性描述符整份拷(含不可枚举的自有位;`getTaskId` 等同一引用);副本不是同一实例,方法读类的 `#private` 字段时在副本上仍抛(KL-316)。
87
+ 7. 内部搬家(公面零变化;CC-276):`ResumeReopenDetail` / `resumeReopenFromError` / `resumeReopenContent` 的定义从 `resumeRefusalCopy` 模块逐字搬到 `suspendedReopen` 模块(为 chrome 臂与决断回执两路共用一句,且不把前者的依赖拖进流驱动);原模块留同一绑定的转口(已发文档写的坐标照旧找得到),包根经两条星号导出拿到的是同一个函数对象,公面名单与个数不变。只走包根入口的端零感知。
88
+
89
+ ### Gates
90
+
91
+ - 新门 `scripts/run-tool-history-mismatch-projection-test.mjs`(212 格,带两代服务端夹具;不带时 204 格、夹具腿标为未跑;CC-268,包侧投影门):S0 两只口在根入口上、与实现模块同一函数对象、在公面基线里,账本 / 两句文案 / 锚表 / 测试钩不上入口;D1 判型 —— 三句 provider 模板单源锚表(冻结、三行三 kind),真端点 / 用户报案 / 兼容端点 / 无反引号 / 原始与截断 JSON 体都认,孤儿结果 / 重复 id(不带 id ⇒ 键缺席)也认;K5 401 / 404 / 429 / 模型名无效 / 无任何 HTTP 400 证据 / 治理码 ⇒ `null`;K6 句中引用 / JSON 消息以别的话开头 / 半句 ⇒ `null`;会抛的取值器不抛;id 窄读(控制字符 / 超 128 字 ⇒ 缺席);用开发依赖引擎包的真铸终局喂入。D2 `runStream` 终局行:错配形挂键、宿主声明 `offersRewind` 才在行尾另起一行补句(缺省 / `false` / `-p` / 工具车道不补)、`errors[0]` 原文;401 / 模型名无效行逐字节同旧、无键;治理拒绝理由复述 / 模型输出问题行 / 模型正文逐字复述 ⇒ 无键无句;`adapt()` 重建行接力同键(坏 kind 整键丢、坏成员逐个丢、模型行不接力)。D5 会话级连续同指纹:不同 run 第 2 / 3 次 ⇒ 次数句、`consecutive` 2 / 3;同一 run 重看不加码;回放帧与无 run id 帧不记账也不打断;成功一轮清零;换指纹从 1 起;别的失败打断;别的会话各记各的;键是引擎回显的会话 id;开流代际(先开后收的老流不改账);有界 64 只会话、挤出后从 1 起。D3 节点解析:坏轮 prompt 行本身(本地行跳过)/ 会话第一轮 ⇒ 从头开始 / 结果晚到取最早提到 id 的那一轮 / 判不了六理由闭集(prompt 无句柄不越级)/ 敌意行不抛。D1 另钉三件:JSON 回体只认错误信封(请求回显 / 兄弟对象 / 数组成员 / 更深一层 / 体是数组 / 顶层 `message` 非串 / 回体前有别的文字 ⇒ `null`;真信封 / 顶层 `message` / 转义引号在前 / 截在首只 id 里 / 闭合值里最后一只 / SDK `400 {…}` 形照认);id 按整只读(带 `/` / 后接 `…` / 服务端截断标记 / 顶在末尾 ⇒ 缺席,逗号 / 句点 / 分号 / 点号冒号形照读,带 `/` 的那一只交节点解析 ⇒ `no-tool-use-id`);孤儿结果 `blocks` / `block` / 直接冒号三形都认。D2x `offersRewind` 对象形:引擎明说没有对话锚 ⇒ 两句都不加、键照铸(含 `consecutive`);引擎说有 / 没观测过 / 读不出 / 读数失效后 / 地址不是串 / 取值器抛 ⇒ 照加;`true` 不查判据;print 车道不加;非错配行不变;类型面对象形可赋值、老形照过。D5x 连续账本:同一会话 17 次后重看第 1 次不报次数、第 17 次仍 17、下一次 18;两次错配之间夹不带 run id 的别的失败 / 结局读不出的 done / 不带 run id 的另一只错配 / 回放的成功 / 409 会话占锁拒绝 ⇒ 清零;同指纹的无 run id 帧与回放帧不打断;成功清零后重看上一段的 run 不开新段;换指纹再换回、重看第一段的 run 不加码。D1 另钉 SDK 错误对象的非 JSON 形 `400 <原话>`(认、id 取首只;重复 id 那一句认、不带 id;`400 ` 后面是别的话 / 句中才引用 / 两个状态词 / 状态 429 ⇒ `null`)。D3 另钉敌意入参不抛(`mismatch.kind` / `toolUseId` 取值器抛、`mismatch` 是已撤销的 Proxy ⇒ `no-mismatch`;`rows` 是已撤销的 Proxy ⇒ `unreadable-rows`)。D5y 代际水位:同指纹无 run id 的较新终局与较新流重看认得的 run 都把老流挡在外面(两条交错序列逐项读数 + 两条真开流的 `runStream` 交错);同 run 接管重放照答原次数、水位不回退。D5z 会话键无从归属:宿主每轮现铸会话 id、两次错配之间夹失败事件帧 / 体无会话 id 的 409 占锁拒绝 ⇒ 第三次无次数;宿主钉的 id 等于引擎回显 id 时夹 429 清零 / 同指纹无 run id 不打断 / 成功清零三形逐字同修前;取舍格(另一只从没被回显过的会话里的一帧失败 ⇒ 这一会话下一次从 1 起,少报);段被打断后重看最近那只 run 不报次数。H 出路句与 CC 同句逐字、次数句过卫生禁表且零机器码。X 夹具腿(服务端 7.106.0 / 7.104.0):夹具自带的引擎包铸终局 → 夹具服务端上 wire 前洗消 → 本包:键与出路句在、run id 原样上 wire ⇒ 第二次加码、401 无键。
92
+ - 新门 `scripts/run-park-failed-reason-projection-test.mjs`(55 格):P1 同步腿 + 409 `resume_blocked_by_policy` 折叠码 ⇒ 恰一只终帧、帧上带句;P2 含折叠句与出路、与 durable 腿合成终帧 `errorMessage` 逐字相等;P3 原样吐(`result` 同一只对象、调用方那一帧不被就地改写);P4 结果帧透传、`errors[]` / `subtype` / `is_error` 与未带键的同一帧投影逐字同;P5 缺席三形;P6 触顶收场两腿;P7 durable 腿不变;P8 宿主撤卡收场同样带句;P9 凭据洗消 —— 决断失败的原话里嵌着带 userinfo 与 `?token=` 的 URL,409 折叠码 / 422 续跑起不来 / 403 三形:帧上那一位与 durable 腿合成终帧同句(原句)、结果信封上这只键无明文且与 durable 腿结果信封 `errors[0]` 逐字相等、其余位与不带键的同一帧投影逐字同;P5′ 没有决断面的收场 —— 宿主没装审批卡口 / 卡口装在别的会话键上 / 问答腿没有 overlay ⇒ 同步终帧与结果帧都不铸、`errors[0]` 不变、durable 腿合成终帧照旧带句,宿主装了卡口而卡口自己报失败 ⇒ 照铸。
93
+ - 扩门 `scripts/run-crash-converged-projection-test.mjs`(118 → 138 格):G8 四因由各一形 + 优先序 + resumeSafe 行不带 + 供给同名位覆盖 / 摘除 + 32 格全组合分桶与 §12c 五项合取逐格一致 + 值形(自有可枚举数据位)+ 旧词 `crashed_before_park` 带因由 / 新词 `shutdown_before_park` 今天仍整行 dropped + 混合表账不混;G7a 编译语料加两行(因由位可赋闭集四词、不带它的老字面量照样可赋值),G7c 表外词赋值恰为 TS2322。
94
+ - 扩门 `scripts/run-suspended-reopen-projection-test.mjs`(15 → 55 格):C 段形(臂表登记、载荷键集、三码单源句、非重开零事件、开集码不带句、`taskId` 只取帧上、车道证明逐条新建);E 段端到端序列:重放(同 id 一次、第二次按既有幂等留 `duplicate_seq` 痕 / 不同 id 各一)· 接管(从第一帧重放:报在流序里自己的位置,晚于之前那一帧的转录、先于之后的正文与终局;前台腿与接管腿幂等键相同)· 迟订阅(游标在重开之后 ⇒ 零事件;停在重开上才接 ⇒ 照报)· 宿主没接 / sink 同步抛 / 返回被拒 Promise ⇒ 转录逐形不变、零未处理拒绝 · 从 HITL 桥一路到 chrome 回调;另钉帧上的位读不出(`reopened` / `taskId` 取值器抛、已撤销的 Proxy)⇒ 读口答 `unstated`、零事件、流不断、转录与不带 `reopened` 的同一条流逐形相同、零未处理拒绝。
95
+ - 扩门 `scripts/run-wire-auth-source-test.mjs`(30 → 83 格)。G8t / G9t:类型面 additive,真跑 tsc(取值函数形可赋值;老形 —— 串 / 中继 / 回环免鉴权 / 老宿主手里的 `DetachCancelArm` 变量 —— 照过;取件口仍只收窄成两形,`arm.authToken.mode` 那一支照编得过;非法形负控恰两条)。G8(CC-274):同一只取值函数两次预热之间轮换 ⇒ 不开第二条流、台账帧数与已收 beat 原样、未收口;断流重连与监视器源 GET 每发带当下的值;取值函数读取次数 = 出站请求数(身份比较零读);负控:换另一只函数(同值)⇒ 按新来源另开一条流、旧账被顶掉、持旧函数的监视器源停手不抢回;串按值 / 中继按 mode 与 0.86.0 逐格同、串 → 同值取值函数与中继 → 取值函数都算换来源。G9(CC-275):arm 期零读、台账读口(`isDetachArmed` / `detachedTaskId` / 400 分诊)零读;arm 后换值 ⇒ 取件口给取件那一刻的值且恰读一次;宿主发射腿冻结副本一字未改,发出去的取消请求头上是发送那一刻的值、凭证只在 Authorization 头;三态(回环 `undefined` / 空串 / 非串 ⇒ 免鉴权声明形且零 Authorization 头;非回环 ⇒ 匿名身份);取值函数抛错取件口不抛;串 / 回环声明形给回同一个对象;类实例 arm(`getTaskId` 在原型上)取值函数形取件后方法可达、宿主发射腿照发,串形类实例仍给回同一个对象。
96
+ - 登记物:根公面基线 1354 → 1356(+2);测试钩 62 不变;超集台账 `docs/type-superset.json` 95 → 97 条(`_sema_tool_history_mismatch` / `_sema_park_failed_reason`);门清单 `scripts/gates-manifest.json` 165 → 167 条(两道新门;崩溃收敛 / 重开挂起 / 凭证取值三道扩门的说明同批更新),README「Guards」与负控文档派生表同批重生;棘轮 `portability.kernel` 20 → 22、`portability.adapt` 36 → 37、`portability.index` 228 → 229(registry.json 追四条账:内核闭包新边 `src/hitl/suspendedReopen.ts`〔CC-276,值级 import 只有已在内核里的 `engineErrorCodes`〕与零 import 叶子 `src/toolHistoryMismatch.ts`〔CC-268,经流驱动与 `adapt()` 进内核 / A 层 / 根入口闭包〕);单例清单 561 → 573 条,高风险上限 133 不变。
97
+
98
+ ### Known limits(本版新增)
99
+
100
+ - 会话历史错配(CC-268):判型只认三句 Anthropic 形 provider 模板,OpenAI 兼容车道的同病不出键、不出出路句;JSON 回体只认从开头起的错误信封(宿主直接交的 SDK 错误对象形 `400 {…}` / `400 <原话>` 同认;KL-308);`toolUseId` 读不出的几形(字符集外、超过 128 字、失败句被截在 id 中间)键里不带 id、节点解析随之判不了(KL-309);连续次数账本在进程内、按会话、上界 64 只会话,重启 / 挤出后从 1 重数;宿主开流时钉的会话 id 从没被引擎回显过时,没有回显会话 id 的终局(失败事件帧、409 拒绝等)认不出属于哪一只会话,本进程里每一只会话正在数的连续都按被打断处理 —— 少报,不多报(KL-310);没有 run id 的终态、回放终态与结局读不出的终态不记次数(与这一次错配不同时清零),这些形上只有出路句、没有次数句;段外只认得最近 16 只 run,更早的 run 被重看会被当成新的一次(KL-311);重复 id 那一句模板不带 id,节点解析判不了,次数的指纹只剩 kind(KL-312);节点解析信宿主交进来的行序(KL-313);孤儿结果 / 重复 id 两句的报文全形是照 provider 错误体形构造的,只有锚串有出处(KL-314);连续账本是可写的会话级模块单例,同一进程里有两份本包实例时各记各的 —— 各从 1 数起(少加一句次数),另一份经过的别的结局这一份看不见、不会清零(可能多报一次「连续」)(KL-315)。
101
+ - 崩溃收敛 / 重开挂起(CC-269 / CC-276):`suspended_reopened.taskId` 今天恒缺席 —— 服务端的重开挂起帧不带 `taskId` 键,本包不从同一条流的首帧代用;将来在场时是帧上 `taskId` 键原样,只有服务端用这个键、且值按 run 唯一时它才等于 run id(KL-305);接管 / 从头重放的腿上本臂按流序报每一次重开(含已成历史的那次),「此刻还成立吗 / 还属于这块屏」由宿主判(KL-306);`decided` ∧ `resumeSafe:true` 判 `contradictory`,不判 `approved_then_interrupted`(KL-307)。
102
+ - 取值函数形的连线身份按函数引用认:宿主每次现造一只函数会让活动台账每次都被顶掉、监视器源停手退回快照轮询。按值比会重新引入本版要去掉的形(令牌轮换即清账),按形比会让同址同 principal 的两只不同凭证来源共用一条台账 —— 两害取轻,口径成文(KL-303)。
103
+ - 监视器源在 401 之后的 60 s 长退避不变:取值函数形下,若某一发恰好落在引擎换代、新令牌还没写回的窗口里答了 401,即使取值函数随后已给出新值,下一次重试仍要等到长退避到点(KL-304)。
104
+ - 登记物按既定裁定改窗(本版对这些物零改动):同名影子对账门豁免表对终端 1.0.139 集成分支跟表后剩下的两行(重开口外层 / 回执成因词表),期限 0.87.0 → 0.88.0;装配 / 宿主扩展类十行对终端 1.0.139 集成分支重看判词不变,重看期 → 0.89.0;过渡物退役登记 RL-11 … RL-14 到期重看 —— 上游契约那一节与同名常量仍未出、本包支持的引擎 / 服务端底线仍未越过 —— 重看期 0.87.0 → 0.89.0(本版距上一版一天,重看期实质未过)。
105
+ - 完整台账见接入文档 §113 末行「包侧缺口」。
106
+
107
+ ## 0.86.0(2026-10-01)
108
+
109
+ > 主题:**minor** —— 八件同发,另有开发依赖两步换钉。① **引擎 7.34.0 提货,两代读法**(CC-249 / CC-245 / CC-230 第二批;老引擎照旧、新引擎按新形,缺席读作老引擎、不折成否定):引擎包入口导出的六张事实表与本批碰到的三张闭集改为构建期生成;门处置「谁拒的」改为两代并集(新引擎的 `mode` 有了专句,老引擎仍发的 `plan_mode` 照认);门记录上权限模式两臂进视图并给具名读口 `gateModeRelease`;通告码册 +6 且各有事实读器;读站判不出读什么时的专属卡 `read_unestablished` 进结构化卡型全集;本人规则店读不出在新引擎上改为「跳过 + 一条通告」,老引擎那张卡照读;粗 shell 档那一句改成两代都成立的说法。② **服务端 7.105.0 提货**(CC-251 / CC-252):会话规则写口拒「写进去就跑不了」的工具名(`400 rules.legacy_tool_name`)投成三只写面的具名结局;配了服务凭据的部署上,门前只读路(workflow 读路、fleet 流)的 `401 auth.unauthorized` 投成具名态与一句话。③ **请求键 `approverPosture` 退役**(CC-253):引擎按名拒收、服务端 7.106.0 起整条 400,本包停发;宿主仍给 ⇒ 构造期按名响亮拒,不改发 `permissionMode`。④ **委派判不出通告带补救话**(CC-254):`delegation.ask_unresolvable` 视图 +可选 `remedy`,原样透传。⑤ **开发依赖换钉引擎 `~7.35.0` 再到 `~7.36.0`**(CC-255 / CC-261):生成物重生成、既有表一个值都没变;引擎工具声明门的九个拒码登记进配置拒绝识别表(`CONFIG_REFUSAL_CODES` 8 → 17,只登记不分派);通告码册再 +1 `route.tool_call_id_folded`(受众运维面,只登记)。⑥ **`adapt()` 在错误信封上不再回落读旧名 `result`**(CC-221):0.83.0 两名并读的收口;现役流零变化,只有宿主把 0.83.0 之前的原始输出落盘再喂回 `adapt()` 那一形看得见。⑦ **服务端 7.106.0 提货**(CC-250 / CC-256 / CC-257 / CC-262 / CC-263 / CC-265):caps `store` / `centerWiring` 两只窄读口、SQL 姿态两代读、计费入口 503 `fleet.lease_unavailable` 的读口与一句话;caps `executionLane.isolated` 与「本机无 OS 沙箱」判定;请求键 `inheritEnv` 的构造、版本闸片段口与两只拒按码出句;权限规则表超帽 / 坏项的机读读口与一句;工具声明拒按码认领「不是暂时故障」;请求体键形拒的两张键表读口;强制卡值变零改动实证。⑧ **`-p` 首帧带出工具清单的来源**(CC-266 / CC-267):`withPrintInitFrame` 放出的首帧多两只超集键;三张估计工具表改为常驻(零行为)。根公面运行期导出 1310 → 1354(+46 −2);测试钩 60 → 62;公面类型 891 → 922(+31);超集键 +2(`_sema_tools_source` / `_sema_tools_fallback_reason`);通告码册 73 → 80;零新投影臂(既有 `tool_end` 臂上的门记录视图多两组可选位);开发依赖引擎 `~7.33.1` → `~7.36.0`。peer sdk 地板 `>=12.0.1` 不动 —— sdk 14 的三处型面 BREAKING(`TaskRequest.approverPosture` 删、`Capabilities.taskApproverPosture` 删、顶层 `Capabilities.sql` 搬进 `store.sql`)本包已按结构读覆盖:本版全部 `.d.ts` 在 sdk 12.0.1 / 13.1.0 / 14.0.0 / 15.0.0 下严格编译(不跳过库检查)都零错误,消费方先升 sdk 14 或先升本包都不编译红;服务端 7.105.0 / 7.106.0 与 sdk 13 / 14 的新形一律按码 / 按结构读,不 import 只有新版 sdk 才有的型 / 值。🔴 **型面 BREAKING 三处**(`TaskRequestInput.approverPosture` 删;两个运行期名字退出根入口,见 Removed;`SemaPermissionDenial.deniedBy` 闭集 +`mode`:型由 SDK `DeniedBy` 换成 `GateDeniedByWord`,对它穷尽 `switch` 的端编译红,见 Changed 第 4 条);另有**已发导出的可观察变化**在 Changed 逐条单列(第 1–34 条与第 36 条,写明谁要跟;第 35 条是零行为的重分类);对下列联合做穷尽 `switch` 的端编译期红:`EngineNoticeFactsCode`(+6 员)、`SessionPolicyFailure` / `SessionPolicyTightenOutcome` / `SessionPolicyRemovalOutcome` / `WorkflowResolution`(各 +1 臂)、`BackgroundSourceHealth`(+1 词)、`SemaPermissionDenial` 的 `deniedBy`(+`mode`)。
110
+
111
+ ### Added
112
+
113
+ - **门记录上的权限模式两臂**(CC-249;接入文档 **§112a M-1–M-4 / 112a-1**):
114
+ - `GateDispositionView` 放行臂 +1 可选位 `released?: GateModeReleaseView` —— 一个权限模式替人答掉了一只没人答的问(引擎今天只有 `bypassPermissions` 这么做)。视图 `GateModeReleaseView { mode, askClass, classes, origin?, mandate?, reason? }`:`mode` / `askClass` 非空串、`classes` 每员非空串的非空数组(冻结)三位必在,缺一或坏形 ⇒ 整只缺席、处置照读;`origin` / `mandate` / `reason` 坏形只丢那一位;词一律按原样透传(不按闭集判)。
115
+ - `GateDispositionView` 拒绝臂 +3 可选位 `mode?` / `askClass?` / `classes?` —— `deniedBy: "mode"` 旁引擎写的哪个模式拒的、被拒那一问的类与整组类;逐位挑、坏一位只丢那一位。
116
+ - `gateModeRelease(g)` ⇒ `GateModeReleaseView | undefined`:放行臂上有那一条账才交出;`undefined` **不是**「没经过模式放行」(老引擎 / 没投影这一位的服务端都不带它)。
117
+ - 投影:`eventToSdkMessage` 的 `tool_end` 臂把视图原样挂在 `tool_end_result.gate` 上(同一只窄读器)。超集键零增减。
118
+ - **六只通告事实读器**(CC-249;接入文档 **§112a N-1–N-8 / 112a-2**),都挂进按码派发口 `readEngineNoticeFacts` / `ENGINE_NOTICE_FACT_READERS`(`EngineNoticeFactsCode` +6 员 —— 对它穷尽分支、不带 `default` 的端编译期红):
119
+ - `readRuleStoreUnavailable(notice)` ⇒ `RuleStoreUnavailableFactsView { at, sessionId, runId }`(`permission.rule_store_unavailable`,受众 user)。`at` 按原样透传(引擎今天两词:`prepare` = 这一跑开头取的路径规则行被跳过、下一跑重读 / `call` = 那一次调用的规则检查跳过了它们、之后每次调用重读)。
120
+ - `readClassifierUnavailable(notice)` ⇒ `ClassifierUnavailableFactsView { toolName, toolCallId, cause, disposition, sessionId?, runId? }`(`classifier.unavailable`,受众 user)。`cause` 按 `AUTO_MODE_UNAVAILABLE_CAUSES` 闭集读,`disposition` 按两词闭集 `asked` / `denied` 读(与引擎型面编译期两向钉住),表外词 ⇒ 整只缺席。
121
+ - `readPermissionModeUnavailable(notice)` ⇒ `PermissionModeUnavailableFactsView { requested, effective, by, sessionId, runId, childSessionId? }`(`config.permission_mode_unavailable`,受众 user)。`by` 按新导出的闭集 `PERMISSION_MODE_FOLD_REASONS`(`operator_deny` / `face_absent` / `inherited_ceiling`,冻结)读;模式词按原样透传;子代会话被父会话的上限折回时,父会话流上那一条带 `childSessionId`(此时 `sessionId` 是父会话的)。
122
+ - `readAskReleasedByMode(notice)` ⇒ `AskReleasedByModeFactsView { mode, askClass, origin?, mandate?, count, firstToolCallId, sessionId?, runId? }`(`permission.ask_released_by_mode`,受众 user;每 run 每(模式, 问类)一条,报第一次;`count` 正整数)。
123
+ - `readReadDenyUnapplied(notice)` ⇒ `ReadDenyUnappliedFactsView { mode, toolCallId, tiers, rows, rowCount, sessionId, runId }`(`permission.read_deny_unapplied`,受众 user;`rows` 只带前八行,总数在 `rowCount`;两张名单冻结,可为空表)。
124
+ - `readLegacyModeSeedMigrated(notice)` ⇒ `LegacyModeSeedMigratedFactsView { permissionMode?, droppedKeys, sessionId, runId }`(`resume.legacy_mode_seed_migrated`,受众 operator;wire 上的 `detail.migrated.*` 摊平成顶层)。
125
+ - 六只读器同一套规矩:只认自己那一个码;必填格缺一 ⇒ 整只缺席;分支键按闭集读、描述性词按原样透传;读点不抛(会抛的取值器 / 代理同样:必填格读不出 ⇒ 整只缺席,可选格读不出只省那一键;每一格恰读一次);一句措辞都不抄(转录用引擎给的 `message`)。
126
+ - 型 `GateDeniedByWord`(见 Changed 第 1 条)。
127
+ - **会话规则写口拒「写进去就跑不了」的工具名,投成具名结局**(CC-251;服务端 7.105.0 起;接入文档 **§112a L-1–L-5 / 112a-5**)。服务端的会话规则写口(`PUT /v1/sessions/:id/policy`;同步导入的规则面同码)对工具名桶(`toolAllow` / `toolDeny`)里的引擎退役名、或含 `__` 却不以协议前缀开头的名字,在写之前拒 —— `400 rules.legacy_tool_name`,店里一个字节都不落,体顶层平铺两格 `field`(哪一桶)/ `name`(哪一条)。
128
+ - 码册:`RULES_LEGACY_TOOL_NAME`(`'rules.legacy_tool_name'`)与 `rules.` 族前缀谓词 **`isRulesRefusalCode(code)`**(开集前缀判,与 `isConfigRefusalCode` 同形制;非串 / 空串 / 别族 ⇒ `false`)。它与准备期拒启码 `config.legacy_tool_name` 是两件事:那一码是「已经写进去了、这一跑被拒启」,这一码是「这次写被拒、记录没动」。
129
+ - `classifySessionPolicyFailure` 新臂 **`{ kind: 'legacy-tool-name'; message; field?; name? }`**:按码判、码先于状态(sdk 12 上它是裸 `APIError`,sdk 13.1.0 起是 `BadRequestError`,两代同判)。`field` 只认 `'toolDeny'` / `'toolAllow'`,`name` 只认非空串,都只从错误对象的体源槽(sdk 的 `extra`)读 —— 错误对象自己的 `name` 是错误类名,绝不当工具名;读不出 / 越界 ⇒ 键缺席。
130
+ - `tightenSessionPolicy` 结局新臂 **`{ kind: 'legacy_tool_name'; message; field?; name?; alreadyInRecord? }`**:什么都没写、不重试。`alreadyInRecord` = 点名的那一条是不是这次读到的记录里**早就有**的(`true` ⇒ 7.104.x 及以前写进去的存量:重发同一批没用,得先从记录里撤 —— 见 `removeRefusedSessionRules`;`false` ⇒ 是这次送来的新条目;两格读不出、或两边都找不到那一条 ⇒ 缺席,不猜来源)。
131
+ - `removeRefusedSessionRules` 结局新臂 **`{ kind: 'legacy_tool_name'; message; field?; name? }`**:撤销动词有意留下的一条(所给名册里挂着恰叫这个名字的工具 —— 那是生效的限制;或本版镜像还不认得它是拒启名)恰是写口不收的名字 ⇒ 整份回写被拒、记录不变(KL-265)。
132
+ - 措辞:`sessionPolicyTightenNotice` / `sessionPolicyRemovalNotice` 各多一句;收紧那句就是 **`legacyToolNameFailureNoteOf('rules.legacy_tool_name')`**(同一处铸,见 Changed 第 15 条)。
133
+ - **门前只读路「凭据没被接受」的具名态**(CC-252;服务端 7.105.0 起;接入文档 **§112a W-1–W-5 / 112a-6**)。配了服务凭据的部署上,workflow 只读路与 `GET /v1/fleet/stream` 对没带本部署认的凭据的请求答 `401 auth.unauthorized`(「没带」与「带错」同体)。
134
+ - workflow 监视器 `createLiveWorkflowSource(...).resolution()` 新态 **`{ kind: 'unauthorized'; state: WorkflowRunState | null; lastError }`**:`401 auth.unauthorized` 或无码 401(详情读与列表读两路)。`state` = 曾 live 过就是最后一份快照(与 `snapshot()` 同一份),否则 `null`;`lastError` 带引擎原句(说要哪一份凭据)。
135
+ - 后台视图 `BackgroundSourceHealth` 新词 **`'unauthorized'`**(今天只有 fleet 源会落这一词):fleet 快照 `401 auth.unauthorized` / 无码 401。与 `not-configured` / `unavailable` 并列,这一源的行不进视图。
136
+ - 一句话 **`READ_CREDENTIAL_NOT_ACCEPTED_NOTICE`**(两处共用):「This engine requires a credential to show this, and this client did not present one it accepts.」—— 不说成没有工作流 / 列表空,不说成引擎坏了 / 连不上;不带任何值。
137
+ - 403(`auth.forbidden` 等)/ 407 / 同为 401 的另两只码 `auth.principal_required`、`principal_unverified` **不进**这一态(KL-266)。没配服务凭据的部署行为逐字节不变(门内对拍)。
138
+ - **`AskUnresolvableFactsView.remedy?: string`**(CC-254;接入文档 **§112a U-1**):`delegation.ask_unresolvable` 通告的一句补救话 —— 调用方那一侧改什么这次调用就能跑(引擎单点铸造,与拒绝的工具文本同一句;引擎今天只在 `no_approver_wired` 那一臂铸,服务端的通告投影原样透传)。`readAskUnresolvable` / `readEngineNoticeFacts` 只认非空串、原样透传(不 trim、不截、不拼、不在本包渲染、不按 `cause` 过滤);缺席 / 空串 / 非串 / 读它就抛 ⇒ 键不铸,且不影响整只视图(它不参与「必在位缺一 ⇒ 整只缺席」)。不带它的通告视图与 0.85.x 逐字节同。
139
+ - **caps `store` 存储姿态窄读口**(CC-250;服务端 ≥7.106.0):`projectStorePostureCapability(caps)` / `noteEngineCapsForStorePosture` / `observedStorePosture` / `forgetStorePostureReading`(与既有能力位读器同一套四态:`unobserved` / `not_reported` / `present`)+ 判据 `storePersistence(reading)` ⇒ `'durable' | 'not_durable' | 'unknown'` + doctor 句 `storePostureDoctorDetail(reading)`。接入文档 **§112 SP-1 – SP-4**。
140
+ - 读数视图 `{ declared, backend, durable, degradedReason?, sql? }`:三个词位按开集原样带出(认不出的词不折成已知词);`durable` 严格布尔;`sql` 子座与 SQL 姿态读面同一份三座判据;任一座坏形 ⇒ 整条读数作废。
141
+ - 🔴 键缺席 = 老引擎(<7.106.0)没报 ⇒ `not_reported`,**不是**「不持久」。`store` 在场而不是普通对象(或读它就抛)⇒ 这一格畸形删格,且不当新一代见证(同体的 `centerWiring` / SQL / `isolated` 按老一代读)。投影口直调不抛。
142
+ - **caps `centerWiring` 中心接线窄读口**(CC-250;服务端 ≥7.106.0):`projectCenterWiringCapability(caps)` / `noteEngineCapsForCenterWiring` / `observedCenterWiring` / `forgetCenterWiringReading` + 判据 `callerQuotaLease(reading)` + doctor 句 `centerWiringDoctorDetail(reading)`。接入文档 **§112 C-1 – C-5**。
143
+ - 四态多一档 `none`:键缺席而同一回体带 `store` 且它是普通对象(7.106.0 起恒在场)⇒ 这台引擎没接配置中心(正面事实);不带,或 `store` 坏形 / 读不出 ⇒ 老引擎 `not_reported`(与 SQL 读面、车道 `isolated` 同一只判法)。投影口直调不抛(会抛的取值器 / 代理 ⇒ 读不出的座按畸形处置)。
144
+ - `lease: "absent"`(没装租约)时 `leaseHealth` / `failMode` / `caller` 三键缺席是合法形;五个词位开集原样带出。
145
+ - `callerQuotaLease` ⇒ `'enforced' | 'not-enforced' | 'exhausted' | 'unobserved' | 'no-lease' | 'unknown'`:四个调用方租约词精确比对原样答;没装租约 / 没接中心 ⇒ `no-lease`;其余 `unknown`。
146
+ - **计费入口 503 `fleet.lease_unavailable` 的读口与一句话**(CC-250;服务端 ≥7.106.0):码常量 `FLEET_LEASE_UNAVAILABLE`;`fleetLeaseUnavailableFromError(err)` ⇒ `{ code, reason?, retryAfterSec? } | null`(按码认、不按状态;`reason` 开集原样;等待秒数体上的 `retryAfterSec` 优先、缺席时读 `Retry-After` 头算出的毫秒上取整;不编数);`fleetLeaseUnavailableContent(detail)` 一句话(额度确认不了、这次没被受理、请求本身没错;两个已知成因各补一句;有数带数)。接入文档 **§112 LU-1 – LU-3**。
147
+ - **caps `executionLane.isolated` 与「本机无 OS 沙箱」判定**(CC-256;服务端 ≥7.106.0):`ExecutionLaneCapabilityView` +`isolated?`(严格布尔)/ +`isolatedAbsent?`(`'no_hands' | 'not_reported' | 'unreadable'`,恰一在场;`no_hands` 只给新一代引擎上工具不在本机的那一形,工具在本机却缺席记 `unreadable`;`isolated` 在场而不是严格布尔、或读它就抛 ⇒ `unreadable`,只作废这一位,车道其余两位照读);`noOsSandboxOnThisHost(reading)` ⇒ `'yes' | 'no' | 'unknown'`(= `isolated === false ∧ toolsOnThisHost`,三值合取);`noOsSandboxContent()` 那一句(只在 `yes` 时渲);operator 面 `GET /v1/diagnostics/wiring` 的 `executionLane` 段读口 `projectExecutionLaneWiring(wiring)`(与 caps 同一份判据)。接入文档 **§112 X-1 – X-5**。
148
+ - **请求键 `inheritEnv`**(CC-257;服务端 7.106.0):`TaskRequestInput.inheritEnv?: 'all' | 'scrub'` —— 模型驱动的 shell 继承多少本机环境。
149
+ `'all'` = 整份继承(只在单用户、工具跑在引擎本机的部署上兑现);`'scrub'` = 缺省清洗(剥掉凭据形变量)。interactive / print 两条车道有座
150
+ (live 门后),utility 车道无座(零工具面没有 shell;给了进回执 `off_lane`)。两词原样上请求体,不按车道 / 部署预判;缺席不发(不替服务端补
151
+ `'scrub'`)。词表外的值(大小写变体、空串、环境变量名单数组、布尔 …)构造期 `TypeError`,点名键、不回显值,不分车道、不受 live 门。
152
+ 接入文档 **§112 IE-1**。
153
+ - 🔴 缺席不是零效应:服务端把缺席读成「缺省清洗,并清掉本会话上一条声明」—— 要本会话整份继承,就**每个提交都带**。
154
+ - **`INHERIT_ENV_WORDS`**(冻结元组 `['all', 'scrub']`,序同服务端)与判词口 **`isInheritEnvWord(v)`**(精确字节,型守卫)。
155
+ - **服务端版本闸 + 片段口**(CC-257):宿主只经这一口给值,不再自己记版本。
156
+ - **`inheritEnvServerSupport(version)`** ⇒ `'supported' | 'unsupported' | 'unknown'`:整串正式版 `x.y.z` ≥ 7.106.0 才 supported;低于 ⇒ unsupported;
157
+ 缺席 / 非串 / 预发布 / `v` 前缀 / 首尾空白 / 前导零 ⇒ unknown(不折任何一边)。地板常量 **`INHERIT_ENV_MIN_SERVER`**(冻结 `[7, 106, 0]`)。
158
+ - **`inheritEnvDeclaration(word, serverVersion)`** ⇒ `{ field, withheld? }`:版本 supported ⇒ `field` 恰带一键;unsupported / unknown ⇒ `field` 为空、
159
+ `withheld = { cause: 'server_too_old' | 'server_version_unknown', word }`(7.105.0 及更早的服务端对这一键整条 400);意图缺席 ⇒ 空片段、无回执;
160
+ 坏词先于版本响亮拒(`TypeError`,不回显值)。产物冻结。版本串常见来源 `engineCapString(baseUrl, 'version')`。
161
+ - **`inheritEnvWithheldNotice(withheld)`** ⇒ 一句终端用户面话(成因 × 词四句,逐字见 §112 112a-14):说清这一项没发、这一次 shell 拿到什么环境;
162
+ 版本读不出 × `'all'` 另说「在认这一键的引擎上,缺席也清掉本会话上一条整份继承的选择」;`'scrub'` 两句说不发与发同效。读不懂的入参 ⇒ 一句通用句,不抛。
163
+ - **新提交两只拒按码出单源句**(CC-257):
164
+ - **`hostPostureRefusalFromError(err, sentRequest?)` / `hostPostureRefusalContent(detail)`**:422 `request.host_posture_refused` 一只读口。
165
+ 同码两个住户 —— 多用户部署拒 `inheritEnv:'all'`,与拒写面放开(`bypassPermissions`,托管或运维钉了拒)—— 拒体不说是哪一个;调用方交出**这一次发出去的请求体**,
166
+ 读口按请求体归因:`askedWholeEnvironment` / `askedOpenWriteFace`(顶层 `permissionMode` 或 `settings.permissions.defaultMode`)各自 present-iff、
167
+ 两位都缺席 = 归因读不出。四句(整份环境 / 写面放开 / 两件都要了、不说是哪一个 / 读不出、指向引擎自己那句话)都说「跑之前拒的、不是本地设置的问题、
168
+ 本端给不了」。只认新提交的外层码;续跑折叠形答 `null`。修前本包对这一码零读口。§112 HP-1。
169
+ - **`inheritEnvRefusalFromError(err, sentRequest)` / `inheritEnvRefusalContent(detail)`**:400 `request.field_invalid` × 请求体真带 `'all'` × 体上
170
+ 没有权限桶机读字段 ⇒ 认领(工具不在引擎本机跑 / 请求不属于会话时 `'all'` 不被收下)。同码住着别的字段拒、拒体不点名字段 ⇒ 句子按条件措辞。§112 IE-5。
171
+ - **权限规则表超帽 / 坏项的机读读口与单源句**(CC-262;服务端 7.106.0):**`settingsPermissionBucketRefusalFromError(err)`** ⇒
172
+ `{ bucket: 'allow' | 'deny' | 'ask', reason: 'over_cap' | 'bad_entry', count?, cap?, index?, folded? }`;按码(续跑折叠形按 `blockedBy`)+ `field` 三值 +
173
+ `reason` 两词窄读,不按文案匹配;新提交 400 与续跑 409 折叠两形同读(后者 `folded: true`);数字各自窄读,坏形 / 缺席不编数。
174
+ **`settingsPermissionBucketRefusalContent(detail)`** ⇒ 一句:哪一张规则表、有几条对上限几条超了几条,或第几条坏(按从 1 数的位置),或它不是一张规则表;
175
+ 新提交说「没截没丢,改好再发」、续跑说「存下来的请求照原样续不下去,改好作为新请求重新提交」。§112 PB-1 / PB-2。
176
+ - **工具声明拒那一族的读口与一句**(CC-263 ②;服务端 7.106.0):**`toolDeclarationRefusalFromError(err)`** ⇒ `{ code } | null`,按码认领引擎工具声明门
177
+ 那一族(九码,随开发依赖引擎包的闭集);**`toolDeclarationRefusalContent(detail)`** ⇒ 一句:请求本身的问题、不是暂时故障,原样重发同样被拒,
178
+ 改好或去掉那只工具声明再发(是哪只工具哪一格,引擎自己那句话写着)。不看 HTTP 状态、不看错误类。§112 TD-1。
179
+ - **请求体键形拒的两张键表**(CC-265):**`bodyShapeRefusalFromError(err)`** ⇒ 400 `request.body_shape` 体上的 `unknownKeys` / `unsupportedKeys`
180
+ (各自 present-iff 体上那张是字符串数组;一项坏 ⇒ 整张读不出;空表在场 = 「这一类没有」;冻结、与抛出物脱钩);**`bodyShapeRefusalTouchesSettings(detail, sentBody?)`**
181
+ ⇒ `true` / `false` / `undefined` —— 这一只拒是不是冲着 `settings` 层。回显键名带 `settings.` 前缀**判不出是哪一层**(提交体顶层一只字面叫 `settings.permisions` 的坏键,引擎回显的也是这一串),所以带前缀的键按调用方这一次发出去的**整份**请求体 `sentBody`(与 `hostPostureRefusalFromError` 的第二参同一份)归层。一只拒只来自一道检查(顶层先判),所以先找「整只来自顶层」的证据:表里有不带前缀的键(设置层的回显恒带前缀),或有一只键在请求体顶层对得上(按引擎回显的同一形比:剥控制 / 双向字符、超 64 字截断补 `…`)⇒ `false`;否则有一只键在 `settings` 对象里按引擎的两层检查(`settings.<键>` / `settings.permissions.<键>`,同样按回显同形比)对得上 ⇒ `true`;两张都是空表 ⇒ `false`;其余 —— 没交请求体、两处都对不上、值带可调用 `toJSON`(序列化时可能被丢,发没发出去不可知)、表读不出 ⇒ `undefined`。§112 BS-1 / BS-2。
182
+ - **`-p` 首帧 `system/init` 带出工具清单的来源**(CC-266):非交互 print 车道的第一行 `tools` 此前可能是三种来源之一 —— 引擎按这一 run 真实挂载铸的名册、名册确定不会来时本包拼的估计、或宿主自己的静态表 —— 但只在调试日志里说,帧上没有标记,自动化照这一行配 allow / deny 时分不出它是不是引擎说的。本版起这一行多两只超集键:
183
+ - `_sema_tools_source`:`engine-roster` / `estimate` / `host-static`(闭集三词)。
184
+ - `_sema_tools_fallback_reason`:只在 `estimate` 时在场,闭集四词 —— `manifest-without-roster`(根腿接线帧到了但没带读得出的名册)/ `model-activity-first`(名册之前先见到模型活动)/ `run-ended`(名册之前 run 就结束,含提交被拒、不经引擎的路径)/ `wait-timeout`(等待上界到点)。`engine-roster` / `host-static` 上恒缺席。
185
+ - 铸口 `printInitToolFaceSupersetKeys(face)` ⇒ `{ _sema_tools_source, _sema_tools_fallback_reason? }`(每次新对象;坏入参不抛:不是对象 ⇒ `host-static`,来源读不出 ⇒ `estimate`,来源写着 `engine-roster` 却带回落原因 ⇒ `estimate`(那是回落分支的面),原因不在闭集 ⇒ 原因键缺席)。估计面的两种组装(缺省词表 / 非缺省场景探测后的拼表)在帧上都是 `estimate`,区别只进调试句;宿主交的回落面来源词不在这两种组装词里(JS 宿主写成 `engine-roster` 也一样)⇒ 判定口按缺省组装词记,首帧答 `estimate`。
186
+ - `withPrintInitFrame` 已替宿主铺好:铺在宿主 `buildInit` 返回的**那只对象**上(不换对象,按对象同一性认 init 的宿主不受影响),`tools` 与其余各键逐字节不动;宿主帧上已有的同名两键以本包为准(判定没有原因时删掉宿主放的原因键);宿主帧不可写(冻结 / 代理 / 同名键只读)⇒ 不铺、不抛、照放(写到一半写不进或抛出,两键都回到宿主给的样子,不留半套;同名键是取值器 / 设值器 ⇒ 整只不铺;帧不可扩展而这一次要新增键 ⇒ 整只不铺)。`buildInit` 每次返回一只新对象:返回缓存 / 共享的帧会被就地改写,同一只对象之后从别处放出时带着上一轮的来源键。自写循环直接用判定闸、或不经包装器自建首帧(离线 / 不发给引擎的命令)的宿主,把铸口结果展开到自己的帧上(没有判定面 ⇒ 传 `null`)。
187
+ - 不改 CC 同名键 `tools` 的语义。接入文档 **§112 TS-1–TS-4 / 112a-18**。
188
+ - 公面合计:根入口运行期导出 +46(CC-249 八名:`gateModeRelease` / 六只读器 / `PERMISSION_MODE_FOLD_REASONS`;CC-251 两名:`RULES_LEGACY_TOOL_NAME` / `isRulesRefusalCode`;CC-252 一名:`READ_CREDENTIAL_NOT_ACCEPTED_NOTICE`;CC-250 十五名;CC-256 三名;CC-257 十名;CC-262 / CC-263 / CC-265 各两名;CC-266 一名:`printInitToolFaceSupersetKeys`),另 −2 见 Removed;测试钩 +2(`__resetStorePostureReadingsForTests` / `__resetCenterWiringReadingsForTests`);公面类型 +31(CC-249 八个:`GateModeReleaseView` / `GateDeniedByWord` / 六只 `…FactsView`;CC-250 / CC-256 九个;CC-257 / CC-262 / CC-263 / CC-265 十二个;CC-266 两个:`PrintInitToolsSource` / `PrintInitToolFaceSupersetKeys`);`AskUnresolvableFactsView` +1 可选成员(`remedy`)、`ExecutionLaneCapabilityView` +2 可选成员(`isolated` / `isolatedAbsent`)、`TurnWireErrorVerdict` 的 `http` 臂 +1 可选成员(`leaseUnavailable`)、`TaskRequestInput` 少一个可选成员(`approverPosture`)多一个(`inheritEnv`)。
189
+
190
+ ### Changed
191
+
192
+ 🔴 **已发导出的可观察变化(逐条;按旧行为断言过的测试请按接入文档 §112a′ 改锚)**:
193
+
194
+ 1. **`GATE_DENIED_BY_WORDS` 十词 → 十一词,序变,元素型变**(CC-249):= 引擎包 7.34.0 入口 `DENIED_BY_VALUES` 十词原序(`policy` / `hook` / `org` / `persisted_rule` / `classifier` / `compliance` / `write_protection` / `ask_resolution` / `read_boundary` / **`mode`**)+ 老引擎仍会发的退役词 `plan_mode`(排在**最后**;0.85.x 在 `classifier` 与 `compliance` 之间)。元素型由 SDK 的 `DeniedBy` 改为本包的 `GateDeniedByWord`(= 新引擎十词 ∪ `plan_mode`;SDK 声明的每个词都在里面,编译期钉住)。**谁要跟**:按值 `includes` / 遍历照旧成立;按下标取词、断言恰十词或断言序的判据改锚;把 `isGateDeniedByWord` 窄化后的值赋给 SDK 12 的 `DeniedBy` 的写法,遇到 `mode` 编译不过(改用 `GateDeniedByWord`)。
195
+ 2. **`isGateDeniedByWord`**(CC-249):型守卫由 `v is DeniedBy` 改为 `v is GateDeniedByWord`;对 `mode` 由 `false` 变 `true`。
196
+ 3. **`gateDeniedByDetail('mode')`**(CC-249):由「本版不认识这个层名」兜底句改为专句 `denied by this session's permission mode`(不点名是哪个模式、不劝人换模式;模式词在门记录的 `mode` 位上)。`plan_mode` 那一句照旧(老引擎仍发)。
197
+ 4. **`ccToolDenialKindForToolEnd` 与投影出的 `_sema_denial_kind`**(CC-249):`deniedBy: "mode"` 且无结算 ⇒ `permission-rule`(0.85.x 缺席:表外层名不分桶)。交互记录、`-p` 结果帧与终帧拒绝清单的分类词随之同答;同一只拒绝在 `-p` 结果帧两处拒绝清单行(`_sema_permission_denials[]` / `permission_denials[]`)上的 `deniedBy` 由缺席变 `"mode"`(来源位 `_sema_denied_by_source: "tool_end"`,两个载体同值;0.85.x 的闭词表不认 `mode`,那一行不盖层名)。🔴 型面随之:`SemaPermissionDenial.deniedBy` 由 SDK 12 的 `DeniedBy`(没有 `mode`)换成 `GateDeniedByWord` —— 只对 SDK 十词穷尽 `switch` 的 TypeScript 端编译红(补 `mode` 一臂);按 `if` 链只认已知几格的端不会编译红,新值会掉进默认格。**谁要跟**:读 `-p` stream-json 结果帧、按层名分支的自动化补 `mode`(渲句用 `gateDeniedByDetail`)。
198
+ 5. **`askOriginDetail('shell_gate_tighten')` 的句子**(CC-249):`this deployment asks about shell commands the coarse shell gate rates above this tier` → `the coarse shell check rates this command above the tier it lets through, so it asks`。引擎 7.34.0 起那一档是每个全 shell 上的形状档(或 `always` 地板),不再是部署挑的档;新句两代都成立,仍不说「每一条都问」。
199
+ 6. **`STRUCTURED_DETAIL_TYPES` 与 `structuredDetailType`**(CC-249):+1 型 `read_unestablished`(读站判不出这条命令读什么时的专属卡,取代此前借用的根外读那张卡)⇒ 带这张卡的 `tool_end` 由「structured 不在场」改判「在场」,模型面正文的正则反解对它退位;集合迭代序改为引擎 `engineCardTypes()` 的序(成员判据不看序)。
200
+ 7. **`CONTROL_TOOL_VERBS`**(CC-249):成员不变(仍是那八个名字),迭代序改为「引擎五名在前、本包登记的旧名与 goal 动词在后」。
201
+ 8. **`ENGINE_NOTICE_CODES` / `ENGINE_NOTICE_AUDIENCE` 七十三码 → 七十九码**(CC-249;本版另有 CC-261 再 +1,合计八十码,见第 27 条):+`config.permission_mode_unavailable`(user)/ `permission.ask_released_by_mode`(user)/ `permission.read_deny_unapplied`(user)/ `permission.rule_store_unavailable`(user)/ `resume.legacy_mode_seed_migrated`(operator)/ `classifier.unavailable`(user),位置随引擎码册序。这六码在 `engineNoticeInCatalog` 由 `false` 变 `true`,`noticeAudienceOf` 由保守缺省 `operator` 变为上列受众。**谁要跟**:断言码数的改锚;按受众分发的面会开始把五条 user 码投到用户面(前提是服务端把它们送上用户流,见 Known limits)。
202
+ 9. **`readEngineNoticeFacts`**(CC-249):上列六码由 `undefined` 变为 typed 事实;派发表九码 → 十五码。
203
+ 10. **`ASK_UNRESOLVABLE_CAUSES` / `DURABLE_MANDATE_SOURCES` / `TERMINAL_CAUSE_KINDS` / `WORKFLOW_SIZE_GUIDELINE_AGENT_CAPS`**(CC-249):对象换成构建期生成物那一只(值 / 序 / 冻结 / 型全同,对象身份变)。
204
+ 11. **`gateOutcomeOf`**(CC-249):视图在两臂上多出 Added 所列的可选位(在场才有;additive)。
205
+ 12. 🔴 **`classifySessionPolicyFailure`**(CC-251):码 `rules.legacy_tool_name` 从 `{ kind: 'request-rejected' }`(400 按状态落)改为 `{ kind: 'legacy-tool-name', message, field?, name? }`,不论状态;同族未知码 `rules.*` 配 4xx 从按状态落(400 / 413 / 422 ⇒ `request-rejected`,其余 4xx ⇒ `error`)改为一律 `error`(引擎带码答了、本面没有具名臂;不说成「形不对」)。其余各臂逐字节不变。
206
+ 13. 🔴 **`tightenSessionPolicy`**(CC-251):写口撞 `rules.legacy_tool_name` 从 `{ kind: 'unknown', why: 'request_rejected', message }` 改为 `{ kind: 'legacy_tool_name', message, field?, name?, alreadyInRecord? }`;`sessionPolicyTightenNotice` 那一句随之从「rejected the shape of this rule record … Fix the entries」换成写入被拒那一句。`SESSION_POLICY_TIGHTEN_UNKNOWN_WHY` 仍是十二词(新臂在顶层,不在 `unknown` 的成因里)。
207
+ 14. 🔴 **`removeRefusedSessionRules`**(CC-251):写口撞同一码从 `{ kind: 'write_refused', why: 'request_rejected', message }` 改为 `{ kind: 'legacy_tool_name', message, field?, name? }`;`sessionPolicyRemovalNotice` 对应换句。
208
+ 15. **`legacyToolNameFailureNoteOf(code)`**(CC-251):从只认 `config.legacy_tool_name` 改为认两码 —— `rules.legacy_tool_name` 从 `undefined` 改为写入被拒那一句;`config.legacy_tool_name` 那一句逐字节不变。两句共用「是哪两类名字」一段,写入被拒那句与写前扣下那句(`sessionPolicyWithheldNotice('legacy_tool_name')`)共用「怎么改」一段(逐字同);写前扣下那句逐字节不变。
209
+ 16. 🔴 **`createLiveWorkflowSource`**(CC-252):`401 auth.unauthorized` / 无码 401 时 `resolution()` 从 `{ kind: 'pending', lastError }` 改为 `{ kind: 'unauthorized', state, lastError }`;循环从每 1–3 s 重试一轮(详情读那一路每轮还会去开一次活动流,流同样被拒)改为 60 s 一次的长退避、不开活动流;凭据被接受后照常回 `live`(KL-270)。`status()` 形与值不变(`code: 401`、`degraded: false`),`snapshot()` 不变(曾 live 过仍是最后一份)。别的状态 / 别的 401 码逐字节不变。
210
+ 17. 🔴 **`createBackgroundView`**(CC-252):fleet 快照 `401 auth.unauthorized` / 无码 401 时 `sources.fleet` 从 `'unavailable'` 改为 `'unauthorized'`;501 ⇒ `not-configured` 与其余一切 ⇒ `unavailable` 不变;assistant 源的 401 仍 `unavailable`(KL-267)。
211
+ 18. 🔴 **两只结局联合与三个型加员(对这些联合做穷尽 `switch` 的端编译期红)**(CC-251 / CC-252):`SessionPolicyFailure` +1 臂(`legacy-tool-name`)· `SessionPolicyTightenOutcome` +1 臂(`legacy_tool_name`)· `SessionPolicyRemovalOutcome` +1 臂(`legacy_tool_name`)· `WorkflowResolution` +1 态(`unauthorized`,六态 → 七态)· `BackgroundSourceHealth` +1 词(`'unauthorized'`)。**谁要跟**:见接入文档 §112d。
212
+ 19. 🔴 **宿主仍给 `approverPosture` ⇒ 构造期按名响亮拒**(CC-253):`buildTaskRequest` / `assembleTaskRequest` 在入参上见到它(任何值,含曾经唯一合法的 `'bypass'`,以及 `false` / `''` / `0`)⇒ `TypeError`,一句专句点名它是退役键、从不授权任何东西、要删掉、真要放行请显式给权限模式;错误文本只报键名不回显值;不分车道、不受 live 门。`undefined` / `null` 与缺席同读(不拒、不上请求体、不进回执)。不静默丢。报错次序:值级坏值(`memoryCapture` / `memory` / `maxCostUsd` / `excludeAllTools` / `maxTokens` / `outputRetries` / `fileHistory` / `inheritEnv`)先报;这句专句先于通用「不认识的键」那一句与嵌套退役子键 `rewind.rewindFiles`;`utility` 车道缺卸载声明的那一句最后报。读序:这一键不再占一格早读 —— 它上面的取值器排在全部声明位之后跑,吞不掉 `maxTokens` / `outputRetries` / `fileHistory`。
213
+ 20. **`taskRequestSeatOf('approverPosture', lane)`**(CC-253):`{ seat: 'seated', liveGated: true }`(interactive / print)/ `{ seat: 'none', cause: 'off_lane' }`(utility)→ 三条车道都是 `{ seat: 'unknown' }`。
214
+ 21. **`unregisteredRequestKeys(req, lane)`**(CC-253):请求体上的 `approverPosture` 此前在 interactive / print 两条车道上不点名 → 三条车道都点名(绕过构造器自己往请求体上塞这一键的端,出口判官抓得到)。
215
+ 22. **`REQUEST_FIELD_MATRIX`**(CC-253 / CC-257):`approverPosture` 一行删、`inheritEnv` 一行加(见第 31 条),车道表仍是 44 行;interactive 36 / print 38 / utility 16 键数不变(interactive 与 print 各换一员)。**谁要跟**:按行数 / 键数断言的判据照旧成立;逐键列成员的台账两处都要改(删 `approverPosture`、加 `inheritEnv`);见 Removed。
216
+ 23. **`readAskUnresolvable` 与 `readEngineNoticeFacts` 的 `delegation.ask_unresolvable` 视图**(CC-254):上游给了非空 `remedy` 时多一个键(恰为末尾一键);不带时逐字节同 0.85.x。**谁要跟**:按「视图键集恰为五键」断言的判据改为「必在位四键 + 可选 `parkLaneExisted` / `remedy`」。
217
+ 24. **配置拒绝识别表 `CONFIG_REFUSAL_CODES` 八员 → 十七员**(CC-255):引擎 7.35.0 起把「调用方在 `spec.tools` 里声明的工具在准备阶段被拒」时 `terminal.code` 的取值收成一个导出闭集 —— `config.tool_mount_denied` / `config.tool_roster_bound` / `config.tool_name_too_long` / `config.tool_contract_too_long` / `config.tool_schema_bound` / `config.tool_face_invalid` / `config.tool_name_invalid` / `config.egress_requires_write_effect` / `config.reserved_tool_name`。本包把这九码登记进识别表(由构建期生成,不手抄;排在既有八员之后)。只登记、不分派:没有新增任何按这九码分支的处置;`isConfigRefusalCode` 按 `config.` 前缀本来就认它们,行为不变;落 `terminal.code` 的这九码照旧走配置拒绝那一族的既有处置。型面不变(`ReadonlySet<string>`,运行期冻结照旧)。**谁要跟**:按「恰八员」断言的改锚(接入文档 §112a′)。
218
+ 25. **开发依赖 `@sema-agent/core` `~7.33.1` → `~7.36.0`**(CC-249 先到 7.34.0,CC-255 一步换钉 7.35.0,CC-261 再换钉 7.36.0;lockfile 每一步只变 core 那一条,完整性值与发布包一致)。构建期生成的引擎事实表按 7.36.0 重生成:既有表一个值都没变(码册多一码,见第 27 条)。生成器自本版起要求开发依赖 core ≥ 7.35.0;更老的 core 让生成器停下并按起始版本分组点齐全部缺席的导出名(不回落去读私有路径)。
219
+ 26. 🔴 **`adapt()` 不再把错误信封上的旧名 `result` 当抢救正文**(CC-221):0.83.0 把结果帧错误信封上「从写出窗抢救回来的正文」改名 `_sema_salvaged_result`(`result` 只留给成功臂),交互适配器的终帧臂当时两名并读、新名优先,没有写到期;本版收口 —— 终帧臂在**错误信封**上不再读 `result`,只认 `_sema_salvaged_result`(串才算;在场却不是串 ⇒ 当作没有抢救正文,不回落旧名)。**错误信封 = 只有 `subtype` 以 `error_` 起头的结果帧**(CC 的四个错误子型,以及日后新增的同前缀子型);其余结果帧照旧读 `result`。其后的终答补差五格(整段 / 无事 / 同段 / 补后缀 / 分岔)一字未改。
220
+ - **现役流零变化**:投影口自 0.83.0 起只在错误信封上铸新名;`runStream` → `adapt()`、续读 / 接管重放(由当前版本重新投影)、老引擎,这几条路上错误信封都只带新名。
221
+ - **受影响的只有一形**:宿主把 **0.83.0 之前**的 `runStream` 原始输出落盘,再直接喂回 `adapt()`;且只在截断的 run(token / 墙钟到限、错误信封带抢救正文)上看得见 —— 屏上一字未出时,抢救正文不再铸成终答行;已上屏的是抢救正文的前缀时,不再补吐后缀;已上屏的与抢救正文分岔时,不再报 `result_text_diverged`。`adapt()` 交出的转录面里本来就没有结果帧本身,落 `adapt()` 输出的宿主不受影响。
222
+ - **不变**(与 0.85.x 逐字同):成功信封照读 `result`(三格照旧);`subtype: 'success'` 同时 `is_error: true` 的那一形照读 `result`(判别按 `subtype`,不按 `is_error`);`subtype` 不以 `error_` 起头的串(空串、认不出的词、大小写不符的 `Success`、裸 `error`)、`subtype` 缺席或不是串的结果帧,一律照读 `result`;错误信封上两名同在时只认新名(与 0.83.0 起一致)。
223
+ - **谁要跟**:各端按本版普查零读点(四端的 `adapt()` 入口都只吃同一安装内 `runStream` 的现铸流)。要在 0.83.0 之前的落盘流上继续出抢救正文的宿主,喂回之前自己在**错误信封**(`subtype` 以 `error_` 起头)上把旧 `result` 改名成 `_sema_salvaged_result`:新名已在就不覆盖;成功信封不动。本包不提供迁移口(0.83.0 成文「旧转录不迁移、不改写」)。接入文档 **§112 R-1 / 112a-9 / 112a′ / G-R1–G-R8**。
224
+ 27. **引擎通告码册 +1:`route.tool_call_id_folded`**(CC-261;引擎 7.36.0 起):`ENGINE_NOTICE_CODES` 本版合计七十三 → **八十**员(CC-249 +6 与这一条),新码紧跟 `route.response_model_mismatch`;`engineNoticeInCatalog('route.tool_call_id_folded')` false → **true**;`noticeAudienceOf` 答 `'operator'`(修前册外码按保守缺省同答 `'operator'`,答案不变、出处改为受众表);`ENGINE_NOTICE_AUDIENCE` 多这一键。**只登记、不加事实读器**:按码派发口 `readEngineNoticeFacts` 对它答 `undefined`(与其余「在册但没有 typed 读器」的码同形 —— 端渲引擎给的 `message`);`detail.reason`(引擎的两词闭集 `charset` / `length`)本包不读。受众是运维面(端按受众分流的,不上用户面)。接入文档 **§112 TF-1 / 112a-10**。
225
+ 28. **`projectSqlEngineCapability` 两代读**(CC-250):服务端 7.106.0 起顶层 `sql` 删掉、同一个对象搬进 `store.sql`。修前 7.106.0 回体一律读成 `not_reported`(doctor 那一行说「这台引擎不报、要升级」);本版回体带 `store` ⇒ 读 `store.sql`(在场 ⇒ `present` / 缺席 ⇒ `none`),不带 ⇒ 照旧读顶层 `sql`;两处都缺席才是 `not_reported`。导出名、四态词、doctor 四句逐字不变。接入文档 **§112 Q-1**。
226
+ 29. **`projectExecutionLaneCapability` 的 `present` 读数恒多一位**(CC-256):`isolated` 或 `isolatedAbsent` 恰一在场;其余两位与判据(`toolsRunHereFromExecutionLane`、doctor 四句)逐字不变。按「视图恰两键」断言的格要改(§112a′)。
227
+ 30. **`classifyTurnWireError` 的 `http` 判决**(CC-250):`fleet.lease_unavailable` 这一码时带 present-iff `leaseUnavailable: true`(与读口同一只判官);其余判决逐字不变。
228
+ 31. 请求装配(CC-257):`assembleTaskRequest` / `buildTaskRequest` 认得入参键 `inheritEnv`(修前:表外键,响亮拒);车道表多 `inheritEnv` 一行(interactive / print 有座、live 门后;utility 无座),见第 22 条。其余入参同一份输入的 `{ request, omitted }` 逐字节同上一版。读序:`inheritEnv` 的早读排在全部既有声明位之后(它上面的取值器改不掉先读的声明)。
229
+ 32. 决断出口(审批 approve / deny、提问卡作答、中断撤卡、计划复核)的失败文字(CC-262):续跑腿折叠体(409 `resume_blocked_by_policy`)带着权限规则表的机读字段时,在折叠码那一句之后**多补**权限表那一句。其余失败形逐字节同上一版。
230
+ 33. 工具声明门那一族的码(CC-263 ②):识别表与前缀谓词不变;多一个按成员认领整族的读口(不按码分派,九码同一句)。
231
+ 34. **`withPrintInitFrame` 放出的首帧**(CC-266):宿主 `buildInit` 返回的那只对象上多铺两只超集键 `_sema_tools_source` / `_sema_tools_fallback_reason`(见 Added);`tools` 与其余各键、键序逐字节不动;宿主帧上已有的同名两键以本包为准;宿主帧不可写(含不可扩展而要新增键)⇒ 不铺、不抛、照放。判定、放行时机、放出序、调试句与 0.85.x 逐字节同 —— 唯一例外:宿主交的回落面来源词不在两种组装词(`wire-vocabulary` / `scenario-probe`)里(型面不许,JS 宿主才给得出),`decidePrintInitToolFace` 的判定面按缺省组装词 `wire-vocabulary` 记,0.85.x 原样透传(交 `engine-roster` 时 0.85.x 的判定面冒充名册臂、调试句说成引擎名册)。**谁要跟**:按「首帧键集恰等于某集合」逐键断言的格改锚(接入文档 §112a′)。
232
+ 35. **`-p` 首帧的三张估计工具表改为常驻,不再挂退役条件**(CC-267;零行为变化):`ENGINE_HANDS_BAND` / `ENGINE_SCENARIO_EXTRAS_DEFAULT` / `ENGINE_RUNNER_FACE`(连 `runnerFaceForEnv` 的 env 过滤)此前登记为过渡物,条件是「名册恒在场的引擎版本成为支持底线」。名册的版本线早已满足,但名册在**每一次 run** 上并不恒在场:提交被拒 / 准备阶段之前就失败、服务端判形不过丢段、本包读不出整只不要、准备阶段超过等待上界、不经引擎的 `-p` 发 —— 这五种路径任何引擎版本都在,删表会让它们退回宿主静态表。本版把三张表改为「名册缺席时的最好估计」常驻,退出过渡物退役登记;重开退役的条件改为「上游提供运行前的完整工具清单」。三张表的内容、`resolveLiveInitToolFace` / `runnerFaceForEnv` 的产出与 0.85.x 逐字节同;漂移由对实装引擎逐名对账的门看守。接入文档 **§112 RS-1 / 112a-19**(KL-206)。
233
+ 36. **按码事实读器每一格只读一次**(既有九只 + 本版六只;`readEngineNoticeFacts` 同):此前部分格「校验读一次、返回再读一次」,名单格「校验读一遍、拷贝再读一遍」—— 随读变的取值器会让校验过的格交出别的值(闭集分支键交出表外词)。本版每一格(含名单元素)恰读一次,交出的就是校验过的那一次读数;名单里有洞(稀疏数组)⇒ 整张读不出(此前洞会以 `undefined` 进名单)。wire 上的 JSON 没有取值器:普通对象输入的读数与 0.85.x 逐字节同。**谁要跟**:无(只在宿主交进会变的取值器 / 代理时看得见)。
234
+
235
+ **闭集减员逐词(新引擎不再发;本包读法认旧词、句子不删)**:
236
+ - `DENIED_BY_VALUES` −`plan_mode`:见第 1 / 3 条;新引擎的 plan 模式在调用时**问**,不再以这一层拒。
237
+ - `ruleStoreUnreadable`(`store` / `call`)整位退役:见下方「不变」第一条;服务端 7.106.0 起活卡帧也不再带它(本包两代读照认)。
238
+ - 读站座位 −`bash_off` / −`bash_classify`(+`full_shell`):本包没有这张表的镜像、零读点 ⇒ 零改动。
239
+ - shell 门教条 −`classify` / −`off`:本包没有镜像;唯一受影响的是第 5 条那一句。
240
+ - 审批姿态 −`bypass`:只涉及请求键 `approverPosture`,见第 19–22 条与 Removed。
241
+
242
+ **引擎 7.35.0 的其余变化本包零改动、原样透传**(读法两代都成立,老引擎行为逐字节不变):
243
+ - `config.tool_mount_denied` 不再是引擎的治理码(一个带它失败的子代,任务结果卡上的 `errorKind` 由 `governance` 变 `logic`、不可重试)—— 本包对治理码没有穷举读点,`errorKind` 原样透传;
244
+ - 同一次按别名发起的调用,门记录 / 审批卡请求 / 停放行 / 拒绝清单 / PreToolUse 钩子(含其失败通告的 `toolName`)上是归一后的工具名,`tool_use` 块 / `tool_start` / `tool_end` / PostToolUse 钩子上仍是模型的写法 —— 本包按调用 id 配对,名字按层原样透传(KL-281;引擎 7.36.0 起执行后钩子的名字见下一组);
245
+ - `dontAsk` 下一个钩子的提问若同时撞上 ask 规则或安全检查,引擎改为直接拒(门记录 `deniedBy: "mode"`,不出卡);词与那一句人话不变;
246
+ - `config.permission_mode_unavailable` 的 `by: "inherited_ceiling"`:继承来的上限在起它的那一跑停下之后改读同一会话最近提交的那一跑(会话级后台子代会跟着会话的下一轮改模式,被折回时照旧通告一次);读器不变;
247
+ - 服务商回声字段 `responseModel`:新引擎只送可见 ASCII 1–128 的值,形外 = 缺席;本包仍按「非空串」透传,空串两代都读成缺席(KL-282);
248
+ - `config.secret_env_scrubbed` 通告的码、受众与 `detail.names` 形不变(点名的变量集合随引擎的新判定变);
249
+ - 引擎对退役请求键 `approverPosture` 的拒绝句改为「姿态从不授权;删掉这一键;放行审批是另一项决定」,与本包构造期那句专句同向 —— 本包专句不改、判决不变(在场即拒)。
250
+
251
+ **引擎 7.36.0 的其余变化本包零改动**(CC-261;除第 27 条外):
252
+ - 执行后钩子 PostToolUse / PostToolUseFailure 改收**调用实际派发到的工具名**(wire 名,与 PreToolUse 同层);PostToolBatch 仍收模型的写法。本包钩子失败通告的 `toolName` 只做有界处理、不改名 ⇒ 连 7.36.0 引擎时这两只钩子的失败通告上是 wire 名(KL-281 按此改口)。按模型拼写匹配这几条通告的端改按 wire 名。
253
+ - provider 给的工具调用 id 不在「可见 ASCII 1–128 且不含 `~`」形内时,引擎改用自己的折叠形 id(回给 provider 的仍是原始 id;每 run 首次折叠发一条 `route.tool_call_id_folded`)。本包把工具调用 id 当不透明串(配对、去重、卡身份都按原串比对,不解析形状),折叠形照常配对。
254
+ - `ToolCall.wireId?` / `SideQueryResult.toolCalls[].wireId?`(provider 原始 id,仅折叠时在场):本包不投影 `ToolCall`,零读点。
255
+ - 停车行 `pendingAction.names` 的名字序改为「拼写先」:零读点。
256
+ - `AggregateBudgetOptions.toolNameOf?` / `ContextEditOptions.toolNameOf?`:引擎内部选项,非 wire 面。
257
+ - 一只调用方工具的名字分属两只引擎工具时,引擎在准备阶段以 `config.tool_face_invalid` 拒(码已在识别表与工具声明族里,见第 24 / 33 条):零改动。
258
+
259
+ **不变**:
260
+ - **本人规则店读不出的两代读法**(CC-245):`RULE_STORE_UNREADABLE_KINDS` / `RuleStoreUnreadableKind` / `isRuleStoreUnreadableKind` / `ruleStoreUnreadableDetail` 与审批卡请求的 `ruleStoreUnreadable` 位**行为一个字节不变** —— 新引擎不再铸这一位(店读不出改为跳过 + 通告),老引擎照铸照读;在新引擎的卡上它恒缺席,缺席不带语义。`askSurvivesPosture` 对出身 `rule_store_unavailable` 仍答必问(新引擎上这个词只剩「这次调用对不上本人的规则行」一种机制,引擎仍要求真人批)。
261
+ - **请求体的权限模式口径**(CC-249 核过):请求词表跟 SDK 的请求型派生(开发依赖 SDK 12.0.1:五词);服务端 7.104.0 发布包的请求体只收五词、词表外答 400 `request.field_invalid`;壳侧 `dontAsk` 照旧归一成 `default` 发出、由壳侧拒绝臂兑现。引擎 7.34.0 自己执行的 `dontAsk` 要等服务端请求体收这个词、SDK 型面出第六词,那天开发依赖 SDK 升级当拍编译钉先红、同批改请求词表(KL-275)。
262
+ - 没配服务凭据的部署上 workflow 监视器与后台视图逐字节同 0.85.x;`config.legacy_tool_name` 那一句、写前扣下那一句、`SESSION_POLICY_TIGHTEN_UNKNOWN_WHY` 十二词不变;`permissionMode` 的全部判据、`rewind.rewindFiles` 专句、通用「不认识的键」那一句不变。
263
+ - 强制卡四类(部署命令策略 / 永不自动放行名单 / 耐久预算耗尽 / 编排路由判到监督者的 shell 与写)在服务端 7.106.0 上的值变(`mandated: true`、`ruleOffersAbsence: "mandated"`、会话级记住回执 `false`、不带理由词)由本包既有判据零改动即得(CC-263 ①);服务端 7.106.0 用户流白名单里的五个新通告码已在本包码册与派发表(CC-263 ③)。
264
+
265
+ ### Removed
266
+
267
+ - 🔴 **请求键 `approverPosture` 退役**(型面 BREAKING;CC-253):引擎 7.34.0 起在任务规格入口按名拒收这一键,服务端 7.106.0 起提交体带它整条 400 `request.body_shape`(`unknownKeys` 点名它;7.105.0 及以前照收)。本包停发:
268
+ - `TaskRequestInput.approverPosture` 删(TypeScript 宿主传它当场编译红;JS 宿主传它构造期抛,见 Changed 第 19 条);
269
+ - 车道表 `REQUEST_FIELD_MATRIX` 的 `approverPosture` 一行删(本版另加 `inheritEnv` 一行,车道表仍 44 行,见 Changed 第 22 条);
270
+ - 根入口两名退出:`APPROVER_POSTURE_BYPASS`、`approverPostureDeclarationField`(根公面运行期导出 −1 常量 −1 函数;按本版普查四端产品源码零具名 import);名字进已退役名账(0.86.0),接入文档活段退役名录 §2z 同批加两行。
271
+ - 🔴 **不改发 `permissionMode`**:这一键只是一句渲给模型看的审批姿态声明,从不授权任何东西;把它换成一项授权等于替调用方授了它没要的权。要引擎侧放行审批是另一件事,宿主自己显式给权限模式。
272
+
273
+ ### Gates
274
+
275
+ - 新门 `scripts/run-mode-release-projection-test.mjs`(47 格,带服务端夹具;不带时 43 格、真老一代投影那两格标为未跑;CC-249,包侧投影门):放行账整只逐格透传与冻结、可选位缺席不铸、必在位坏形只丢那一位、词按原样透传、只在放行臂上读、具名读口只对放行臂答;缺席语义两代 —— 老引擎形无此位 ⇒ 读口 `undefined`(不交 `false`),可选段把同一批门记录过一遍夹具服务端的投影 —— 老一代服务端:放行账被剥掉、模式拒那一条整条扣下;带新引擎的服务端:两者都得投出且逐格同(不投即红);夹具先过引擎包入口的门记录不变式筛(零缺陷)且筛子对坏形会响;视图位与引擎 `ModeRelease` / `ModeRefusal` 两只接口的成员(按语法树读声明)双向等值;投影口端到端;`mode` 分类词与专句。
276
+ - 新门 `scripts/run-rules-legacy-tool-name-projection-test.mjs`(47 格;不给 sdk 13 真物时 46 格、那一格标为跳过;CC-251):码册与前缀谓词;失败分类两代 sdk 按码认(sdk 12 真映射 + sdk 13.1.0 形,另可对 sdk 13 真物跑)、码先于状态、体源槽窄读(顶层 `name` 是类名不当工具名)、`extra` 读就抛不连坐、同族未知码落通用臂;收紧编排对照写口读者模型店(实装引擎真表判名、上游同序):宿主直送退役名 / 记录里早有 / 本包镜像落后三形都落具名结局、恰写一次、记录不动;撤销动词名册挂着同名工具时同落具名结局;措辞单源(收紧那句 ≡ 出路句、与准备期那句 / 写前扣下那句逐字共用两段)。
277
+ - 新门 `scripts/run-read-credential-refusal-projection-test.mjs`(30 格;CC-252):workflow 监视器两码两路 ⇒ `unauthorized`、401 之后排长退避(计时器读数记账)不开活动流、凭据被接受回 `live`(列表读恢复成零 run ⇒ 进 `empty`,不粘在 `unauthorized`)、live 后带最后一份快照、403 / 407 / 另两只 401 码不进;后台视图 fleet 两形 ⇒ `unauthorized`、恢复回 `ok`;两处老部署对拍(非 401 各状态与连接错误,与门内冻结的修前判定逐格同答);一句话单源。
278
+ - 扩门 `scripts/run-upstream-tables-test.mjs`(90 → 146 格,带老一代服务端夹具;没有老一代夹具时老引擎直驱那一段标为未跑、143 格;CC-230 第二批 + CC-255 第三批 + CC-263 ②):生成器多写一只 `src/generated/engineFactTables.ts`(第二批九张表 + 第三批工具声明门拒码一张);消费点绑定(公面五名引用相等,四处模块私有 / 组合按源码语法树见证绑的是生成物);逐员对引擎包入口;加员 ⇒ 生成物不同、形不对 / 整类抽掉 ⇒ 拒生成;**老引擎包** ⇒ 拒生成并一次点齐缺席名、按起始版本分组、只点缺的(合成形 + 可选段直驱服务端夹具里真老一代引擎包);「源码里生成表零字面抄件」一格(尺子先在合成源码上证明会响);第三批 —— 识别表包含引擎 7.35.0 源码里的全部九码(地板)且前缀谓词全认、生成物对引擎包根逐码逐序对拍且冻结、识别表的初始化式展开的就是生成物且数组里零字面抄件(语法树见证)、只登记不分派;工具声明门闭集生成物的读者从「恰一个」改为「恰两个」(识别表 + 族读口),九码的字符串字面量在源码里零处不变;负控:上游加一码 ⇒ 生成物不同,空 / 重复 / Set / 空串 / 非 `config.` 前缀 ⇒ 拒生成,7.33.x 形八个缺席名一次点齐、各带起始版本,7.34.x 形只缺这一张 ⇒ 拒生成、只点它。一次性改前快照段按退出条件删除(升开发依赖当天红)。开发依赖换到引擎 7.36.0 后判「盘上生成物 == 重新生成」逐字节(三只生成物只头注版本行与码册一码两处不同)。
279
+ - 扩门 `scripts/run-gate-vocabulary-test.mjs`(CC-249):「谁拒的」改判两代并集(本表 == 引擎入口十词 + 退役词;SDK 声明 ⊆ 本表;退役词确是上游某一代的词;领先 SDK 的词都来自引擎;老一代引擎的词全在本表 —— 可选段);十一句互异、`mode` 专句;两处出处原文跟上引擎 7.34.0 的改写;规则店两词改对**老一代引擎包**逐词逐序等值(可选段)+ 新一代上确已退役 + 退役登记在场。
280
+ - 扩门 `scripts/run-engine-notice-catalog-test.mjs`(619 → 950 格;CC-249 / CC-254 / CC-261):码册八十员;两张通告 detail 闭集改读引擎包入口;新 L 段六只读器(位置与受众、真码名、四个门口拒绝码不在册、逐格 / 闭集 / 原样透传 / 坏形 / 按码分家)+ 两只**真铸点直驱**(引擎自己的通告铸造函数铸帧、过本包派发口);服务端夹具的引擎比开发依赖老一代时,新引擎码按「老一代用户流白名单里没有它」判;`remedy` 一段(透传 / 缺席四形 / 三成因都透传 / 老形逐字节同 / 不改写 / 必在位优先 / 键序 / 恰读一次 / 真铸点直驱三形);`route.tool_call_id_folded` 在册且受众运维面、与引擎包入口元组同序(紧跟 `route.response_model_mismatch`)、只登记不加读器(派发口答 `undefined`、读器表没有这一键);会抛的取值器 / 代理一段(六只新读器必填格读不出整只缺席、可选格读不出只省那一键、`remedy` 读不出只省它,直调与派发口都不抛)与只读一次一段(派发表十五码每一格、含名单元素,换成「首读合法、再读哨兵」的取值器 ⇒ 读数不泄哨兵、每格至多读一次)。
281
+ - 扩门 `scripts/run-task-request-omission-receipt-test.mjs`(带终端源码树 508 → 479 格;CC-253 / CC-257):退役键一段按退役改写(三车道 × live 两态 × 两个口 × 十种在场值一律专句拒;缺席两形;不长出权限模式;座位读数 `unknown`;出口判官三车道点名;入参型与两名退出读发布产物;报错次序;读序);另三段同批改口;全量输入与逐键判别式 −`approverPosture` +`inheritEnv`(46 格不变)、utility 无座键清单 +1;车道表 44 行。
282
+ - 改门:`run-terminal-word-source-test.mjs`(「为什么是抄件」的存活断言按退出条件改判:引擎包入口导出因由处置表,本包那张表就是生成物)· `run-authority-envelope-mirror-test.mjs`(标签表改读引擎包入口、与定义模块同一引用;本包侧改为「源码常量绑生成物」;三条车道最终拆火结果不动)· `run-workflow-size-warning-test.mjs`(规模档帽改对引擎包入口,不再门内抄值)· `run-engine-vocab-floor-test.mjs`(控制面保留名改读引擎包入口)· `run-auto-mode-unavailable-test.mjs`(退役格的正控锚换成两份声明上长住的同族位)· `run-client-core-pure-test.mjs`(两张判定表的期望值改由生成物派生;结构化卡型门内名单 +1;写审批问句铸点见证认引擎 7.34.0 的新行形;识别表逐员钉改为「手写八员 + 生成物」)· `run-terminal-cause-projection-test.mjs` / `run-permission-denial-projection-test.mjs`(无结算层名分桶两格 +`read_boundary` +`mode`;后者另加 N 段 —— 模式拒那一行两个载体 `deniedBy: "mode"`、公面型收得下它且与 `GateDeniedByWord` 两向相等(编译期)、只穷尽 SDK 十词的 `switch` 编译红(负控)、源码零强转)· `run-memory-spec-wire-test.mjs`(识别表总数账 +9)· `run-engine-caps-ledger-test.mjs`(能力位 `taskApproverPosture` 本包零读点;SDK 删位那天改判「行已删」)· `run-retired-vocabulary-census-test.mjs`(+2 条:两个退出公面的名字,上游存活断言读引擎的退役键表;另 1 格反向钉:退役由来留在源码注释里)。
283
+ - 接入文档冻结账门 ①c:签名块表长的铸点登记改为可列多处(「谁拒的」表 = 生成物十词 + 退役词表一词,两处求和);表长抽取器剥 `as const`(只收窄型、不改长度),别的断言照旧判不出;新增一格自证。
284
+ - 负控常驻套:门词汇那一枚的篡改由「从 SDK `DeniedBy` 摘一个已发词」改为「往 SDK `DeniedBy` 加一个本表没有的词」(两代并集下前者不该再红;后者在编译期先红、错误文本点名那个词)。
285
+ - `scripts/run-result-frame-projection-test.mjs`(128 → 191 格;CC-221):「旧形帧(错误信封骑 `result`)照旧读得到」一格翻判,新增 D3 段 —— ① 旧错误形(只骑 `result`、`subtype` 是 CC 错误子型)⇒ 屏上已有终态错误行时不报分岔、assistant 行一行不多;屏上一字未出时不铸终答行 ② 已上屏抢救正文的前缀 + 旧错误形 ⇒ 不补尾 ③ 成功形照读三格(整段 / 补后缀 / 分岔,正控),同一帧换成 CC 错误子型只剩屏上已有的(反向对照)④ 错误形两名同在只认新名;新名在场但不是串(`null` / 数 / 对象)⇒ 不回落旧名;④b 不以 `error_` 起头的 `subtype` 串(空串 / `teleported` / `Success` / 裸 `error`)三格照读 ④c 认不出但以 `error_` 起头的子型(`error_future_kind`)三格按错误信封不读 ⑤ `subtype: 'success'` + `is_error: true` 三格与同一帧 `is_error: false` 逐格同 ⑥ `subtype` 缺席 / `null` / 数 / 数组三格照读(④b⑤⑥ = 回归约束:产出等于具体期望、且与同一帧 `subtype: 'success'` 逐格同,与 0.85.x 逐字同)。每格配夹具判别力自证(照读期望 ≠ 不读期望)与新名形自证。变异:运行期七枚各红在点名格(回落恢复成不分臂 ⇒ ①②④④c 与反向对照红;判别换成 `is_error` ⇒ ④c⑤ 与反向对照红;先串化再判 `error` 前缀 ⇒ ④b〔裸 `error`〕⑥〔数组〕红;新名非串也回落 ⇒ ④ 红;`subtype === 'success'` 才读 ⇒ ④b⑥ 红;「是串且不是 `success`」⇒ ④b 红;四员字面名单 ⇒ ④c 红);编译期钉四枚(模板换前缀 / 前缀常量换值 / `SDKResultError.subtype` 多一个非前缀员 / 放宽成 `string`)⇒ 构建红,唯一的错误落在钉那一行。既有四套门里不带 `subtype` 的终帧夹具保持原样(照读路径的覆盖留着)。
286
+ - 新门 `scripts/run-store-center-wiring-capability-test.mjs`(79 格;CC-250;含 7.106.0 夹具真投影对拍:存储姿态五形、中心接线 38 形,服务端词表每词落已知臂,服务端复合位成员闭集 ≡ 读数视图键集;四只 caps 读器同一只新一代见证 —— 同一坏形 `store` 回体上无一当新一代、经读口同判;两只投影口直调遇会抛的取值器 / 代理不抛)。
287
+ - 扩门:`run-sql-engine-capability-test.mjs` 59 → 78(两代读 + 夹具四形;`store` 坏形按老一代读顶层 `sql`)· `run-execution-lane-capability-test.mjs` 38 → 68(`isolated` 三种缺席 / 三值判定 / 单源句 / 诊断面 / 夹具八车道 / `isolated` 读取抛只作废这一位 —— 投影、读口、判据口、诊断面四处 / 坏形 `store` 不当新一代)· `run-wire-refusal-copy-test.mjs` 110 → 131(503 读口经真 SDK 链 + 句 + 判决位 + 夹具 `leaseRefusalOf`)· `run-engine-cap-reader-factory-test.mjs` 580 → 656(表 15 → 17 只)(CC-250 / CC-256)。
288
+ - 新门 `scripts/run-inherit-env-wire-test.mjs`(98 格;CC-257):构造器(车道表一行 / 座位读数 / 两词透传 / 缺席不发 / 非 live 回执 / 坏词构造期拒且不回显 / 读序 / 恰读一次)·
289
+ 版本闸三态 · 片段口(发 / 不发带成因 / 坏词先于版本 / 冻结 / 端到端)· 不发那一句(四句互异、说清环境、版本读不出另说清掉上一条、零机器码、卫生禁表)·
290
+ 400 未兑现读口(按条件措辞;别的成因 / 没发 all / 折叠形 / 422 ⇒ null;敌意取值器不抛)· 夹具腿(两词、拒码、铸点字节对服务端 7.106.0 发布包)。
291
+ - 新门 `scripts/run-submit-refusal-projection-test.mjs`(97 格,带服务端 7.106.0 夹具;不带时 85 格、夹具三段标为未跑;CC-257 / CC-262 / CC-263 / CC-265):权限表(决断出口补句 / 读口三形 / 单源句六形)· 工具声明族(真 sdk 把 503 映成「稍后重试」类、
292
+ 本包按码认领且既有暂时故障判据一格不认领、九码一句)· 422 两住户(按请求体归因四形、四句)· 键表读口与三态谓词(带 `settings.` 前缀的键按已发请求体归层,先找整只来自顶层的证据:不带前缀的键 / 顶层按回显同形对得上 ⇒ `false`;值带 `toJSON` 的键归不了层;夹具腿用服务端真键闭集函数铸体,按受理顺序串两只铸点铸「顶层字面点键 / 嵌套坏键」两形 —— 回显同一张表,交各自请求体 ⇒ `false` / `true`,不交 ⇒ `undefined`;另铸双向字符 / 超长 / `toJSON` 三类形,钉上游回显剥字符集,并逐码点扫 12290 个码点确认顶层比对与上游回显同形)。
293
+ 错误对象一律经 sdk 真映射器 `toApiError` 铸(机读字段住在 `APIError.extra`)。
294
+ - 新门 `scripts/run-mandated-card-values-test.mjs`(41 格;CC-263 ①;特征化门,零改动即得):强制卡值变的四类卡(部署命令策略 / 永不自动放行名单 / 耐久预算耗尽 /
295
+ 编排路由)由服务端 7.106.0 发布包的真铸点现铸,经它捆的引擎盖章与服务端真投影,喂本包活卡 / 耐久两条卡腿:判据口答强制、不编理由词、会话级放行
296
+ 不被记住时告知恰一次;普通名单卡负控、旧值对照。夹具缺席时如实标未跑。
297
+ - `scripts/run-approval-frame-keys-test.mjs` 服务端夹具腿:`ruleStoreUnreadable` 登记为退役保读键(服务端 7.106.0 起活卡帧不再带它;老引擎仍发,本包两代读照认;sdk 运行期锚仍含它)—— 修前在 7.106.0 夹具上该腿红(多出项未登记);登记带两条退出条件(仍在本包镜像 / 夹具上确已退役 —— 后者按夹具服务端版本认代,只在 7.106.0 及以后的夹具上判)。夹具腿缺席(未设 / 目录里解析不到服务端的帧声明)改为标为未跑(修前只打一行「未跑」,收集器按绿计),必跑档红;新增一段自证夹具认代工具(预发布版不认代、引擎包按服务端自己加载的顺序找、版本读不出 / 预发布 / 代际不匹配三种原因分开说)与一枚子进程负控(普通档缺席 ⇒ 输出带收集器的未跑标记、exit 0;加必跑档 ⇒ 红)。
298
+ - 扩门 `scripts/run-tool-roster-projection-test.mjs`(244 → 316 格)J 段(CC-266):铸口 —— 名册 ⇒ `engine-roster` 恰一键(空名册同);四种回落原因 × 两种估计组装逐一 ⇒ `estimate` + 对应原因、恰两键;判定 `null` ⇒ `host-static` 恰一键;坏入参(`undefined` / 非对象 / 缺原因 / 名册面上带原因 / 原因不在闭集 / 来源或原因的取值器抛)不抛,读不出来源绝不答 `engine-roster`,原因只认闭集;每次新对象。编排口 `withPrintInitFrame` 六种判定端到端(名册先到 / 接线帧无名册 / 模型活动先到 / 流结束 / 计时到点 / 回落面 null):首帧恰带对应的自有键(不多一只 `undefined` 值键)、首帧就是宿主建的那只对象、除两键外逐字节不变(含 `tools` 与键序)、判定回调拿到的工具面不被铺键;真实 `runStream` 两形(名册先到 / 接线帧前失败);宿主帧已有同名两键 ⇒ 本包为准、陈旧原因键删掉;宿主帧冻结 / 非对象 ⇒ 不抛、原样照放;宿主的来源键只读 / 原因键锁死 ⇒ 任一步写不进即回滚,帧逐字节回到宿主给的样子(不出现「来源与原因各说各的」半套);写 / 删**抛出**的两腿(代理陷阱)同样回到宿主原状(删陷阱对所有键都抛、宿主带陈旧原因而没有来源键时,先删原因、删不掉就什么都不写),同名键是取值器 / 设值器 ⇒ 整只不铺(不调宿主的设值器;访问器在原型链上同判);帧不可扩展而这一次要新增键 ⇒ 整只不铺(两键都已在照铺);来源写着 `engine-roster` 却带回落原因的判定面 ⇒ `estimate`;JS 宿主把回落面来源写成 `engine-roster` ⇒ 判定口不透传、首帧 `estimate`。变异 18 枚各红在点名格(漏铺 / 原因错位 / 换对象铺 / 宿主优先 / 陈旧原因不删 / 组装词原样透出 / `null` 当估计 / 读不出当名册 / 留 `undefined` 值键 / 冻结帧严格赋值 / 挪动 `tools` 键序 / 去回滚 / 回滚时删再加 / 先写原因后写来源 / 只查自有键的访问器 / 不判可扩展性 / 名册面不看回落原因 / 回落面来源词透传)。
299
+ - 夹具腿认代:带服务端夹具的门改按夹具里服务端 / 引擎的**版本**认代,不再按「文件在不在」—— 老一代服务端上同名文件多半也在,只是没有新符号 / 新值:修前 7.104.0 夹具上五道门产品红(审批帧键的退役格、强制卡值、执行车道八车道、`inheritEnv`、提交面拒绝),计费入口 503 那道判据自证失败(exit 9);7.106.0 夹具上老一代段打了未跑标记(收集器记 PARTIAL),分段的提示句却说成「夹具未设或其中没有引擎」,误导。新一代段(服务端 ≥7.106.0):代际不匹配 ⇒ 标为未跑(不当绿,也不误红),提示句点名实得版本;新一代夹具上铸点文件不在 ⇒ 判据自证失败(上游搬了文件,改锚)。老一代段(引擎 <7.34.0:「谁拒的」老一代词表、老一代出处原文、规则店两词、老引擎直驱生成器)先读新变量 `SEMA_CC_SERVER_FIXTURE_OLD`,没设时夹具本身是老一代也认。版本按 semver 先序比(预发布尾小于正式版);预发布版夹具(如 7.106.0-rc.1)一律不认代,两代段都标为未跑;版本读不出、预发布、代际不匹配三种原因分开说;引擎包按服务端自己加载的顺序找(先 server 包下嵌套的那份,再旁边的,最后夹具根),夹具根可以是 server 包目录本身。必跑档 `SEMA_CC_REQUIRE_SERVER_FIXTURE=1` 强制新一代段;老一代段在设了 `SEMA_CC_SERVER_FIXTURE_OLD` 时同样强制,没设 ⇒ 标为未跑。发版跑法:两代夹具各一遍(`SEMA_CC_SERVER_FIXTURE=<7.106.0> SEMA_CC_SERVER_FIXTURE_OLD=<7.104.0> SEMA_CC_REQUIRE_SERVER_FIXTURE=1` 一遍,`SEMA_CC_SERVER_FIXTURE=<7.104.0>` 一遍)。
300
+ - 登记物:根公面基线 1310 → 1354(+46 −2);测试钩 60 → 62;已退役名账 +0.86.0 两名;超集台账 `docs/type-superset.json` 93 → 95 条(`_sema_tools_source` / `_sema_tools_fallback_reason`);过渡物退役登记在册 7 → 8 行、已退役 4 → 5 行(+3:本人规则店读不出一族 / 退役层名 `plan_mode` / 退役请求键专句,复核期 0.87.0;错误信封旧名回落那一行挪进已退役;三张估计工具表重分类为常驻、移出登记,不进已退役账 —— 它没有被删);退役词普查 13 → 15 条;单例清单 538 → 561 条,高风险上限 131 → 133;型面门 unknown 出境棘轮 432 → 452(新读器与新判定入参为 `unknown`,与同模块既有读器同型;另一只是包内凭据判官的入参);失败显式门已注释豁免上限 43 → 44(铺来源键遇到会抛的宿主帧时回到宿主原状、首帧照放 —— 外抛会丢掉整条 print 车道的第一行及其后全部输出);可移植闭包 kernel 19 → 20 / adapt 35 → 36 / index 222 → 228;棘轮沿革账 306 → 318 条;门数 158 → 165,README「Guards」表 165 行。
301
+
302
+ ### Known limits(本版新增)
303
+
304
+ - 引擎 7.34.0 提货:门记录上权限模式的两臂要服务端按键投影跟上才到端 —— 服务端 7.104.0 / 7.105.0 的投影不带这几位(放行账被剥、模式拒那一条整条扣下);缺席不许读成「没经过模式放行」(KL-271)。六条新通告要服务端的用户流白名单收进才上用户流;7.104.0 的白名单里没有它们(老引擎也不铸)(KL-272)。新引擎 plan 模式的写审批卡问句不同,帧与流都没带参数的退化卡上读不出目标路径(诚实缺席)(KL-273)。新引擎上本人规则店读不出只剩一条通告;端不渲这条 user 码,人就不知道自己的规则这一轮没生效(KL-274)。请求体权限模式仍五词,引擎自己的 `dontAsk` 这一代用不上(KL-275)。
305
+ - 服务端 7.105.0 提货:会话规则写口比准备阶段严一格 —— 部署挂了恰叫退役名的工具时,撤销动词有意留下那一条,整份回写被写口拒、别的会拒条目也撤不掉(KL-265)。`unauthorized` 只认 `401` 的 `auth.unauthorized` / 无码两形;`auth.principal_required` / `principal_unverified` 照旧(KL-266);后台视图 assistant 源的 401 仍 `unavailable`(KL-267);`status()` 与活动台账读口不另给判别位(KL-268)。同步导入的规则面遇 `rules.legacy_tool_name` 没有具名结局(会话 bundle 三函数是原样转口;`legacyToolNameFailureNoteOf(err.errorCode)` 给同一句话)(KL-269)。凭据修好之后,workflow 监视器最多要等一个 60 s 退避周期才回 `live`(KL-270)。本包退役名镜像落后于引擎时,连 7.105.0 起的服务端,那一形从「写进去、之后每一跑启动失败」降为「写口拒收、收紧结局 `legacy_tool_name`、记录不动」(KL-158 现状补记)。
306
+ - 请求键退役与补救话:装着的 sdk 12.0.1 `TaskRequest` 型面仍声明 `approverPosture`,绕过本包构造器、直接按 sdk 型拼请求体的宿主类型层不报,只有出口判官 `unregisteredRequestKeys` 与服务端 7.106.0 的 400 抓得到(KL-279)。协作形审批请求的作者位 `AskRequest.authoredBy` 不读(KL-276);接线回执上的权限模式回执到不了端(KL-277);引擎包根新导出的九张权限裁决表不在端复刻(KL-278)。引擎自己那句退役句曾与本包专句方向相反(KL-280)—— 引擎 7.35.0 已改句、同向,登记即收口;直连引擎 7.34.x 的宿主仍会看到旧句。
307
+ - 引擎 7.35.0 / 7.36.0:别名调用在两层上的工具名本包按层原样透传、不互译,按名字判卡形的端对「拿引擎工具名作别名」的调用方工具会落通用卡(仍然问人,只少了专用预览);执行后钩子的名字按引擎版本分两代 —— 7.35.x 上 PostToolUse 是模型拼写,7.36.0 起 PostToolUse / PostToolUseFailure 与 PreToolUse 同为 wire 名、PostToolBatch 仍是模型拼写,本包钩子失败通告的 `toolName` 按收到的原样透传(KL-281,本版按 7.36.0 改口);服务商回声字段 `responseModel` 不套引擎的回声形谓词,新引擎上形外的值缺席、老引擎上照旧透传(KL-282)。
308
+ - 服务端 7.106.0 提货:SQL 读面 `none` 那一句在 7.106.0 上多盖「声明了 SQL 后端、却降级到内存」一形,句子本版不改;落差由同批存储姿态那一行说(KL-290)。`centerWiring.caller` 按调用方成立,读账按 baseUrl 分格:同一 baseUrl 上用多个身份取 caps 的宿主,读口里的 `caller` 是最后一次交进来的那个身份的;多身份宿主对每个身份的回体直调投影口(KL-291)。「新一代」见证只看同一回体的自有键 `store` 且它是普通对象(四只 caps 读器共用一只判法):不带 `store`、或 `store` 坏形 / 读不出的回体一律按老引擎读(`centerWiring` 缺席答 `not_reported`、`isolated` 缺席记 `not_reported`、SQL 读顶层 `sql`;`store` 自己那一格坏形照旧整条作废)(KL-292)。`store` / `centerWiring` 任一座坏形 ⇒ 整条读数作废,一座坏连带其余几座都读不到(KL-293)。503 `fleet.lease_unavailable` 在 SDK 的非流式提交上先按 `Retry-After` 自动重试到上限才交给宿主;流式提交单发即交(KL-294)。
309
+ - 片段口在引擎版本读不出的那一拍不发 `inheritEnv`:宿主要整份继承而能力探测还没落定时,这一次按缺省清洗跑;在认这一键的引擎上,这一次的缺席还清掉本会话上一条整份继承的声明(回执那一句说出这一点)。要严格就先等到版本读数再提交(KL-295)。两只 `inheritEnv` 相关的拒只认新提交:续跑腿折叠形(409)由折叠码那一句点名原码,不归因到 `inheritEnv` —— 决断出口不知道停着的请求带没带它(KL-296)。400 未兑现那一句按条件措辞(同码多种成因、拒体不点名字段);422 两件都要了时不说是哪一个;调用方不交请求体时归因读不出(KL-297)。权限表那一句只说引擎报的那一只表、那一条:引擎按 allow → deny → ask 的序只报第一只出问题的表、表内第一只坏项,改好再发可能撞到下一只(KL-298)。键表读口读的是引擎回显的键名:每张表至多 20 条、过长的键名被截短、控制字符被剥;「没有点名 settings 路径」只对列出的键成立;带 `settings.` 前缀的键只凭前缀判不出层,不交已发请求体、请求体两处都对不上、或对得上的键值带可调用 `toJSON`(发没发出去不可知)⇒ 谓词答不知道(KL-299)。
310
+ - `-p` 首帧来源键:宿主帧上 `_sema_tools_source` / `_sema_tools_fallback_reason` 两键以本包为准:宿主在 `buildInit` 里放的同名键会被改写,判定没有原因时宿主放的原因键被删掉(KL-300)。宿主帧不是对象或不可写(冻结 / 不可扩展 / 同名键不可写或不可删 / 同名键是取值器或设值器 / 会抛的代理)⇒ 来源两键不铺、首帧原样放出;写到一半写不进或抛出 ⇒ 两键都回到宿主给的样子(先删了陈旧原因、写来源又被拒的那一形,原因按原样补回、键排到末尾;恢复本身也被宿主代理拒绝的极端形上尽力而为);帧不可扩展而这一次要新增键 ⇒ 整只不铺;`buildInit` 返回缓存 / 共享的帧会被就地改写,同一只对象之后从别处放出时带着上一轮的来源键 —— 每次返回新对象(KL-301)。来源两键带不出:估计面是哪一种组装(只进调试句);`host-static` 那一形为什么没有名册;不经包装器自建首帧的路径在宿主接铸口之前两键缺席(KL-302)。三张估计工具表改为常驻后,外接别的引擎 / 场景 / env 门时估计会偏,这一条按常驻口径改写(KL-206,非新增)。
311
+ - 完整台账见接入文档 §112 末行「包侧缺口」。
312
+
313
+ > 同名影子对账门的豁免表:终端 1.0.139 晚于本版就绪,按既定裁定把终端那十行的期限改到 0.87.0(仍候 1.0.139 退掉这十行;本包对这十行零改动)。另十二行装配类 / 宿主扩展类到了重看期(终端 @ 6e050ef7:九行机器证明门实跑全部成立、三行声明哈希与记录逐字同,recheck 之问无新事实)⇒ 判词不变,重看期推到 0.87.0。
314
+
52
315
  ## 0.85.2(2026-09-30)
53
316
 
54
317
  > 主题:**patch**,一件 + 一处同族修复 —— 自愈重开的两只失败结局(`plan-review-reopen-failed` / `ask-reopen-failed`)带上**这一次重开放弃所依据的那一发失败请求的外层 wire 码**(CC-260,终端的请托);另把自愈腿读**错误对象与成功应答记录**上的各位收进保护(见 Fixed),注入形交接行在投递方式未知时改说实话(见 Changed)。零型面 BREAKING;根公面运行期导出 1310 不变;测试钩 60 不变;公面类型名不变(两个已导出型各多一个可选位:`ReopenCardVerdict` 不成功臂 `_sema_errorCode` · `SelfHealOutcome` 两只失败臂 `errorCode`);超集键 +1(`_sema_errorCode`);`activeRunSelfHealRow` 不引用 `errorCode`,只在注入形交接行、投递方式未知那一形换两句(见 Changed);零投影臂;peer sdk 地板 `>=12.0.1` 不动;开发依赖不变。