@sema-agent/client-core 0.88.0 → 0.90.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 (61) hide show
  1. package/CHANGELOG.md +208 -0
  2. package/README.md +27 -21
  3. package/dist/adapter/activeRunSelfHeal.js +4 -2
  4. package/dist/adapter/downstream/eventToSdkMessage.js +4 -2
  5. package/dist/adapter/downstream/wiringManifestView.d.ts +9 -0
  6. package/dist/adapter/downstream/wiringManifestView.js +27 -0
  7. package/dist/adapter/runStream.d.ts +2 -0
  8. package/dist/adapter/runStream.js +157 -32
  9. package/dist/attachmentsWireCaps.d.ts +13 -2
  10. package/dist/attachmentsWireCaps.js +25 -5
  11. package/dist/controlRouter.d.ts +7 -1
  12. package/dist/controlRouter.js +43 -1
  13. package/dist/coreValuePorts.d.ts +1 -0
  14. package/dist/disableSkillsWire.d.ts +17 -0
  15. package/dist/disableSkillsWire.js +52 -0
  16. package/dist/displayUntrusted.js +122 -55
  17. package/dist/engineCapReader.js +12 -1
  18. package/dist/engineNoticeCodes.d.ts +25 -9
  19. package/dist/engineNoticeCodes.js +161 -68
  20. package/dist/fileHistoryLegNotice.d.ts +20 -0
  21. package/dist/fileHistoryLegNotice.js +122 -0
  22. package/dist/gateOutcome.d.ts +1 -1
  23. package/dist/gateOutcome.js +1 -0
  24. package/dist/generated/engineFactTables.d.ts +1 -0
  25. package/dist/generated/engineFactTables.js +3 -0
  26. package/dist/generated/engineNoticeTables.d.ts +3 -0
  27. package/dist/generated/engineNoticeTables.js +107 -2
  28. package/dist/hitl/toolApprovalWire.d.ts +6 -2
  29. package/dist/hitl/toolApprovalWire.js +30 -0
  30. package/dist/hookToolAliases.d.ts +3 -0
  31. package/dist/hookToolAliases.js +10 -0
  32. package/dist/hooksWireCaps.js +80 -12
  33. package/dist/index.d.ts +14 -3
  34. package/dist/index.js +10 -3
  35. package/dist/permissionsAllowGrantCapability.d.ts +17 -0
  36. package/dist/permissionsAllowGrantCapability.js +75 -0
  37. package/dist/permissionsDeclaration.d.ts +25 -0
  38. package/dist/permissionsDeclaration.js +227 -0
  39. package/dist/pluginHooksWire.d.ts +46 -4
  40. package/dist/pluginHooksWire.js +277 -24
  41. package/dist/promptDelivery.d.ts +5 -2
  42. package/dist/promptDelivery.js +8 -3
  43. package/dist/providerRejection.d.ts +7 -0
  44. package/dist/providerRejection.js +58 -0
  45. package/dist/request/taskRequest.d.ts +2 -0
  46. package/dist/request/taskRequest.js +67 -9
  47. package/dist/runTerminal.d.ts +6 -0
  48. package/dist/runTerminal.js +23 -0
  49. package/dist/sdkRegistryTransit.d.ts +1 -0
  50. package/dist/sdkRegistryTransit.js +1 -0
  51. package/dist/seam.d.ts +3 -0
  52. package/dist/seatContract.d.ts +9 -1
  53. package/dist/seatContract.js +10 -0
  54. package/dist/subagent/engineSubagentSteer.d.ts +8 -1
  55. package/dist/subagent/engineSubagentSteer.js +26 -3
  56. package/dist/supportFloor.d.ts +10 -0
  57. package/dist/supportFloor.js +42 -0
  58. package/dist/taskRequestWords.d.ts +1 -0
  59. package/dist/taskRequestWords.js +14 -0
  60. package/docs/INTEGRATION-CLIENTS.md +896 -14
  61. package/package.json +3 -3
package/CHANGELOG.md CHANGED
@@ -49,6 +49,214 @@
49
49
  > 挡住 ⇒ 本批把它机械化——④a0 对 `pending` 行**要求段头已是日期形**(`(未发布)` 直接红),阶段一
50
50
  > commit 漏转在发布前就红,不再靠人记。
51
51
 
52
+ ## 0.90.0(2026-10-04)
53
+
54
+ > 主题:引擎 7.40 / 服务端 7.113 / sdk 16 探针换钉提货 · `settings.permissions` 三桶装配口与 allow 桶的能力位门控 · 文件历史一句的五态判定与声明事实账本 · hooks matcher 工具别名读口 · 机读支持底线与引擎版本三态 · 投递账本两只绑定方法 · 云控制面子路径入口五名转口。
55
+
56
+ ### Removed
57
+
58
+ - **通告事实读器 `readLegacyModeSeedMigrated` 与具名型 `LegacyModeSeedMigratedFactsView` 退出根入口**(CC-291;🔴 型面 BREAKING;接入文档 **§116 EN-1 … EN-3**;根公面运行期导出 −1,本版合计见 Added「公面合计」)。引擎 7.39.0 删掉了「7.34.0 之前写下的停泊行读一次并迁成 `permissionMode`」那条一次性迁移,通告码 `resume.legacy_mode_seed_migrated` 随之退出引擎码册(86 → 85):`ENGINE_NOTICE_CODES` / `ENGINE_NOTICE_AUDIENCE` 各少一项,`EngineNoticeFactsCode` 少一员(对它穷举的 `switch` 里写了这一码的分支编译期红),`readEngineNoticeFacts` 的派发表少一行。老引擎(< 7.39.0)续跑 7.34.0 之前写下的停泊行时仍可能发这一码:按册外码处置 —— `engineNoticeInCatalog` 答 `false`、`readEngineNoticeFacts` 答 `undefined`、`noticeAudienceOf` 照旧答 `operator`(册外码的保守缺省,与它在册时的受众同值);端走册外兜底、渲引擎给的 `message`(KL-411)。四端产品源码零具名 import。
59
+ - **请求键 `attachments.planModeReminder` 退役**(CC-291;🔴 型面 BREAKING;**§116 SV-1**):引擎 7.39.0 起 plan 姿态由引擎在 `permissionMode: "plan"` 的运行里自己陈述,服务端 7.113.0 起带这一键(任何值)的提交即 `400 request.field_invalid`,sdk 16 型面已删。`ATTACHMENTS_SPEC_KEYS` 10 → 9,`AttachmentsSpec` 少 `planModeReminder?`,`SEMA_ATTACHMENTS=full` 点满的 literal-true 族 7 员 → 6 员。显式点名它(`planModeReminder` / `+planModeReminder` / `-planModeReminder` / 夹在多 token 里 / 单 token / 大小写变体)⇒ `attachmentsForRequest` 抛,句子点名「已退役」与出路(要 plan 姿态发 `permissionMode: "plan"`);宿主手写的 `attachments` 对象点名这一键(任何大小写 / 前后空白 / `+` `-` 前缀 / `=值` 尾)⇒ `buildTaskRequest` 抛 `TypeError`(与这一装配口其余入参拒同型;两处同一条点名规则;此前原样上 wire),只在带 `attachments` 的车道(`live: true` 的交互 / print 两车道)判;句子按「键」措辞,理由只写真的那一半 —— 精确键 `planModeReminder` 上 wire 会被服务端 ≥7.113.0 整发 400,别的拼写服务端不认、会忽略,本包从严拒(显式点名退役键的宿主多半以为它还管用);值为 `undefined` 的**数据属性**按缺席(JSON 序列化本来就丢它,上一版这样的体照发照过):不抛、请求体上不带这一键;例外:这一键是**取值器**(哪怕它答 `undefined`)⇒ 抛 `TypeError` —— 取值器在序列化时才跑,本口判不出它答什么(0.89.0 对取值器答 `undefined` 的那一形发出 `{"attachments":{}}`)。env 口按「不认识的键」处置,但比普通未登记词更响(单 token 的普通未登记词仍按历史契约回落默认对;一个必被服务端 400 的键不能静默降成默认对)。老部署(服务端 < 7.113.0 且引擎 < 7.39.0)升级后少了显式开 plan 提醒的那一键(KL-409)。**不升级的话**,服务端 ≥7.113.0 上 `SEMA_ATTACHMENTS=full` 的每一发都是 400。
60
+
61
+ ### Added
62
+
63
+ - **云控制面子路径入口 `@sema-agent/client-core/registry` 转入登录 / 令牌轮换 / scope 列举与切换五名**(CC-136;接入文档 **§116 RG-1 … RG-6**):`requestDeviceCode`(设备码申请)/ `pollUntilApproved`(轮询到批准)/ `refreshTokens`(令牌轮换)/ `listScopes`(scope 列举)/ `switchScope`(scope 切换)—— 与已转的十个值同一转口形:**只转不包、不改签名、不吞错**,与 `@sema-agent/sdk/registry` 的同名导出是**同一函数对象**(不是「长得一样的另一份」)。子路径入口值级 10 → 15(15 个值 + 2 个型);**根入口零变化**(这一面不进根 barrel,根公面运行期导出不因本项变化)。peer 地板 `@sema-agent/sdk >=12.0.1` 不抬:五名在 12.0.1 / 15.3.0 / 16.0.0 三代上都在,它们的签名型由上游声明自带(声明文件出发的相对 import 闭包零裸说明符),干净安装树上 `skipLibCheck: false` 不产生 `Cannot find module`。此前这五名在接入文档 §86 R-3 记为 declined / pending(签名型曾来自上游未随包安装的声明包),该行自本版起作废(**§116 116r**)。令牌存储仍归宿主(`TokenProvider` 由宿主实现);同入口的 `logoutRegistry`、`InMemoryTokenProvider`、管理面类等邻名仍不转。本入口不转五名的响应型别名(`DeviceCodeResponse` / `TokenGrantResponse` / `ScopesListResponse` / `ScopeSwitchResponse`),要具名型的端取 `Awaited<ReturnType<typeof 函数名>>` 或契约包的同名型。缺席语义:上游少了其中任一名 ⇒ 本包构建期 `export … from` 编译红、常驻门红(不是跳过,不会运行期静默 `undefined`)。端上要动的:原直连 `@sema-agent/sdk/registry` 取这五名的 import 落点改到本入口(**116d**)。
64
+ - **`UserInputUndrainedFactsView.childSessionId?`**(CC-291;**§116 EN-4**;KL-364 销):引擎 7.39.0 起,子代 run 收场时没用上的用户输入在**父会话**里再说一条副本帧(`detail` 带 `childSessionId`,`sessionId` / `taskId` 是父的,无 `runId`)。`readUserInputUndrained` 对两码都读这一位(自有非空串才交;缺席 = 这一条不是子代副本,不补;坏形 / 取值器抛 / 只在原型链上只丢这一位);`userInputUndrainedNotice(facts)` 的入参 `Pick` 多收这一位,对确定的两形(steer × `leg_end` / follow-up)多说「在一个子代的 run 里」—— `N messages you sent while the run was in progress were not used before a sub-agent's run ended and will not be delivered. Send them again if you still need them.` / `N follow-up messages you queued were not used before a sub-agent's run ended …`,不带任何 id;`crashed` / 表外 `cause` 上带这一位不改句。子代副本与子代自己那一帧是两帧,本包不合并、不跨帧去重(KL-410)。
65
+ - **`AllowDenyPolicyOptionsView.scope?: 'grant' | 'narrowing'`**(CC-291;**§116 EN-9**):引擎 7.40.0 起 `createAllowDenyPolicy` 的入参多可选 `scope`(`allow` 名单命中是「已陈述的许可」还是「只划范围、不是同意」;缺省 `grant`)。入参镜像加这一位,值原样透传给装的那一只、本层不判成员不补缺省。
66
+ - **文件历史一句的判定:`fileHistoryLegNoticeVerdict(input)` + `fileHistoryLegNoticeSentence(verdict)` + 闭集 `FILE_HISTORY_LEG_VERDICTS`**(CC-294;接入文档 **§116 FH-1 / FH-2**)。入参四维 `{ capability, declaration, captureOffByUser, legWord }`:能力位读数(`observedFileHistoryCapture()`,经 `fileHistoryCaptureMode` 判类 —— 与请求片段口 `fileHistoryDeclarationField` 同一只判据)、这条 run 的提交带没带关断声明(`'sent' | 'not_sent' | 'unknown'`)、用户关没关文件检查点(只认严格 `true`,与片段口同律)、接线回执上这条 run 报的词(`WiringManifestView.fileHistory` / chrome `wiring_manifest` 臂的 `fileHistory`)。五态 `not_honored` / `not_offered` / `honored` / `not_declared` / `unknown`,只有前两态出句:
67
+ - `not_honored` —— 这条 run 的提交**真带了** `fileHistory: "disabled"`、引擎仍报 `on`。只看声明事实,不看能力位。句子:「The engine is still capturing file history for this session, though your settings asked it not to.」(98 字符,结论在句首);
68
+ - `not_offered` —— 用户关了、这条 run 没带(或不知道带没带)、能力位答 `on-always`(这一代引擎没有按会话关闭的位)、引擎报 `on`。句子:「This engine always captures file history and cannot turn it off per session, even though file checkpoints are off in your settings.」;
69
+ - `honored`(带了、报 `disabled`)/ `not_declared`(用户没关;或确知没带而引擎本来就没捕获 / 能力位答 `on-optional`、是这一发刻意没带,例如还原文件的那一次提交)/ `unknown`(读数不够:回执上没报或报了表外词、能力位读不到或认不出而声明不是 sent、用户关了却不知道带没带)—— 零句。
70
+ - 判定是一张先中先得的六行清单,72 格真值表见接入文档 §116c。入参只认自有属性;任何一维缺席或坏形落该维的缺席值;绝不抛。
71
+ - **声明事实账本 `createFileHistoryDeclarationLedger()` + 出站体读口 `fileHistoryDeclarationOfBody(body)`**(CC-294;**§116 FH-3 / FH-4**)。宿主在装配完、交给 SDK 之前对**那一份出站体**记一笔 `ledger.declared(requestKey, fileHistoryDeclarationOfBody(body))`(体上自有、可枚举的**数据属性** `fileHistory` 恰为 `"disabled"` ⇒ `sent`;读得动的普通对象而没有 ⇒ `not_sent`;证明不了上 wire 的就是这一份 —— 体带 `toJSON`(自有或继承)、这一键是取值器、体上任何自有可枚举键是取值器(序列化时会跑它)、描述符上的值与属性访问不一致(代理的取值陷阱)、这一键的值是非 null 对象(`new String('disabled')` 与带 `toJSON` 的对象序列化后可以是 `"disabled"`,证明不了)—— 或读不动 ⇒ `unknown`、不记;体不是普通数据对象时先物化 `JSON.parse(JSON.stringify(body))`、对物化后的那一份记、把那一份交给 SDK);这次提交的流上每来一帧调 `ledger.boundToRun(requestKey, runId, frame)` —— 只有证明引擎为这次提交建了 run 的帧才绑定,判据与 `createPromptDeliveryLedger().deliveredByFrame` 是同一只(开流首帧 `meta`、开流重放的审批卡 / 撤卡、会话已有在跑 run 的拒收帧都不算;拒收帧与重放卡带的是别的 run 的 id);接线回执到了查 `ledger.declarationOf(runId)`。两张只增不删的映射 ⇒ 结论与调用次序无关;同一条 run 上记录互相矛盾、绑上的提交没记过、没绑过的 run(恢复进来的 / 别的进程提交的 / 接管重连的)⇒ `unknown`。账本只在进程内,不落盘、没有读回口。
72
+ - 型:`FileHistoryDeclarationFact` / `FileHistoryLegNoticeVerdict` / `FileHistoryLegNoticeInput` / `FileHistoryDeclarationLedger`。
73
+ - **hooks matcher 的工具别名读口 `hookToolAliasesOf()` / `canonicalHookToolName(name)`**(CC-298;接入文档 **§116 HA-1 … HA-6**):引擎的静态工具目录里,有的内置工具带别名(今天一条:`ListPeers` 是 `ListAgents` 的别名)。端上按工具名认 hook 条目的 matcher 时,别名拼写与规范名是同一只工具;此前终端在壳侧手抄了一份钉版镜像,引擎一加别名就悄悄对不上。
74
+ - `canonicalHookToolName(name)` ⇒ `string`:是某个内置工具的别名 ⇒ 它的规范名(`ListPeers` → `ListAgents`);其余一切 —— 规范名自己、表外名、空串、`constructor` / `__proto__` / `toString` 一类原型键 —— 原样返回。**逐字比**,不折大小写、不裁空白、不折零宽字符(`listpeers` / `ListPeers ` 都原样)。入参不是串(JS 宿主给了 `undefined` / 数 / 对象)⇒ 原样返回同一个值,不抛、不按 `toString` 当串认。永不抛。
75
+ - `hookToolAliasesOf()` ⇒ `Readonly<Record<string, string>>`:别名 → 规范名的表,每次交同一个冻结实例(null 原型,用工具名当键直接取值也读不到 `Object.prototype` 上的东西);今天 `{ ListPeers: 'ListAgents' }`。表本身不另出名,只经这个读口给。
76
+ - 表是**构建期从已装开发依赖引擎的静态工具目录生成**的(`scripts/gen-upstream-tables.mjs` 第六批:展开引擎包根读口 `describeToolCatalog()` 每条的 `face.aliases`;引擎包根没有现成的别名表导出),运行期不读引擎、不手抄,所以没有「引擎读不到」这回事。生成器遇到目录读口缺席 / 抛 / 形不对、一张别名都没有、别名撞别条目的规范名、两条目对同一别名给出不同规范名、别名是整数形串(JS 对象会把这类键重排),一律拒生成(非零退出、不落盘空表冒充「引擎没有别名」);生成物从键值对构造(对象字面量里的 `__proto__` 键不建自有属性,字面量写法会静默丢这一行)。
77
+ - 射程:只含静态目录里**内置**工具的别名;调用方在 `spec.tools` 里声明的别名、MCP 工具的别名不在静态目录里,不在表(对它们原样返回);参数别名(`pathTarget.aliases`,如 Read / Edit 的 `path`)不是工具别名,不在表;本口只回答「这个名字是不是某个内置工具的别名」,matcher 的通配 / 正则语法不在本口(KL-391)。
78
+ - **机读支持底线声明 `SUPPORT_FLOOR` + 组件读口 `supportFloorOf(component)`**(CC-299;接入文档 **§116 SF-1 … SF-4**):本包承诺仍然支持的最老服务端 / 引擎 / sdk 版本,冻结对象;型面是三只 `string` 位、不带字面值(抬底线不是型面变化)。本版取值:服务端 `7.104.0`、引擎 `7.33.8`(那一版服务端精确依赖的引擎)、sdk `12.0.1`(与 peer 地板同值)—— 服务端与引擎两项是保守初值(取本包门必跑的最老那份服务端),各端回报各自的底线后改值(KL-404)。引擎一项在活引擎的 wire 上读不到(`/v1/capabilities` 与 `/health` 的 `version` 都是服务端包版本),只供本包的退役条件判(KL-407)。`supportFloorOf` 对 `'server'` / `'core'` / `'sdk'` 以外的任何入参(大小写不同、带空白、原型链上的名字、非串)答 `undefined`。
79
+ - **引擎版本三态判定 `engineVersionTier(version, floor?)`**(CC-299;**§116 VT-1 … VT-4**):引擎(服务端)自报的版本串 ⇒ `'engine'`(纯 `x.y.z` 且不低于门槛,等于算)/ `'legacy'`(纯 `x.y.z` 且低于门槛)/ `'unknown'`(读不懂:预发布、构建元数据、`v` 前缀、首尾空白、段数不是三、前导零、服务端读不出自身版本时报的 `"unknown"`、空串、非串;低于门槛的预发布也是 `'unknown'`)。门槛 = `SUPPORT_FLOOR.server`;调用方可另给 `floor`(纯 `x.y.z`),只能抬不能降;`floor` 不是纯 `x.y.z` ⇒ `TypeError`(先于版本判定,错误文本不回显值)。版本串本身怎么坏都不抛。读法与 `inheritEnvServerSupport` 同一只(整串正式版)。
80
+ - 公面类型 `SupportFloor` / `SupportFloorComponent` / `EngineVersionTier`。
81
+ - **投递账本的两只绑定方法**(CC-300;**§116 PD-6 … PD-8**):`PromptDeliveryLedger` 对象上多两只读口,把两只自由函数的「账本实参」收进账本自己 —— `ledger.knownUndeliveredMessage(message)`(按消息行判「确知没交出去」,与 `promptKnownUndelivered(ledger, message)` 同答)与 `ledger.withoutUndelivered(messages)`(旁路载荷过滤,与 `withoutUndeliveredPrompts(ledger, messages)` 同答)。两只方法与自由函数是**同一份判定**(方法体就是对自由函数的一次调用、账本自己作实参),同一账本、同一入参逐格同答:行没有 uuid / 没走过提交路径 ⇒ `false`(不知道),非对象 / `null` / `undefined` / 读 `uuid` 抛 ⇒ `false`,行表不是数组 ⇒ 空数组、不抛。方法是闭包绑定,不读 `this`:脱离账本取出、展开拷贝、账本冻结之后都照常可调;读的是账本此刻的状态。用 `fromRecords` 读回的记录建的账本同样带这两只方法(读回记录里只有 attempted 的行判「确知没交出去」;没有任何记录的旧行两判皆假)。两只自由函数照旧导出、答案不变,账本参数型放宽为只要求 `knownUndelivered` 一只成员(`Pick<PromptDeliveryLedger, 'knownUndelivered'>`;它们运行期也只读这一只),按 0.89.0 九口形自写的旧账本替身照常传入。🔴 型面上 `PromptDeliveryLedger` 接口加两个必有成员(本版型面 BREAKING 第三处):只消费账本(工厂产物 / 调自由函数)的端零改动;把自写替身赋给该接口型的那一处编译红一次(补两只成员,或改用 `createPromptDeliveryLedger()` 的真账本)。🔴 按行的那只**叫 `knownUndeliveredMessage`、不叫 `knownUndelivered`**:`knownUndelivered(uuid)` 是 0.88.0 起账本上的 **uuid 键口**(入参是串,语义不变),同名重载会让裸串在两个入参域里答不同;两个口入参域互斥 —— 串按 uuid 判只走 `knownUndelivered`,把串交给按行的方法答 `false`(串不是消息行)。零新顶层名:根公面运行期导出不因本项变化,`PromptDeliveryLedger` 接口 +2 个成员(九 → 十一只口)。终端换调这两只方法后,两只同名薄包装可删,同名影子对账门过渡表里对应两行随之删(期限 0.90.0 = 删行期限,本版不改窗)。
82
+ - **`permissionsDeclaration(input, caps)`** ⇒ `PermissionsDeclaration`(CC-302;接入文档 **§116 PM-1 … PM-8**):宿主解析好的权限规则(`deny` / `ask` / `allow` 三列,外加可选的来源表 `origins` 与命令行 deny `cliDeny`)装成请求体 `settings` 的 `permissions` 片段。一条规则贯穿三只桶:
83
+ - **按来源信任序排**:托管策略 > 命令行 > `--settings` > 会话 > 用户 > 本地 > 项目 > 来源说不清的(保持原序)。同一来源内按来源表的登记序;同一条规则只留最受信那一处;命令行 deny 排在命令行那一档。超过引擎条数上限时(服务端 7.106.0 起整请求拒收而不截断;更老的引擎截尾),截掉的只会是最不受信的那一截。本口自己不截断。
84
+ - **过同一只安全投影**:引擎会因之拒收整份请求的规则不发 —— 裸工具名是退役名、无协议前缀的 `__` 短形或不完整协议名;路径文法工具以 `~/` 起头的规则;引擎的规则编译器拒收的规则。判据全部取已装的引擎值级端口(`installCoreValuePorts`),与引擎同一只函数。整工具规则投归一后的工具名(`Bash(*)` ⇒ `Bash`、旧工具名 `Task` ⇒ `Agent` 等),内容形规则投原串。
85
+ - **整服务器 / 整 peer 写法改写**:引擎协议前缀表上的每一个协议(今天 `mcp__` / `a2a__`;前缀问已装引擎的 `protocolOf`,不手抄)同一条规则 —— `mcp__<服务器>` / `a2a__<peer>`(按引擎读裸规则的读法先去两端空白;之后前缀之后非空、不含 `__`、不以 `_` 结尾;整工具形 `(*)` / `()` 同)三桶一律改写成原名 + `__*` 再过安全投影 —— 引擎规则编译器对两形逐名同判(逐协议),服务端 7.104.0 – 7.114.0 对裸形 deny / ask 整请求拒、对 `__*` 形三桶都收(逐协议);改写出的名字编译器拒收的不发。终端 1.0.140 对这一形是丢(留在客户端匹配器上),本口改写后引擎侧也执行(接入文档 §116 PM-9)。服务器 / peer 段以 `_` 结尾的仍只留客户端匹配器(KL-396);改写出的名字、以及任何整工具名,被引擎规则编译器拒收的一律不投(见下 Fixed 与 KL-418)。
86
+ - **同一条规则跨桶不去重**:deny 与 ask 里都有就两只桶都发(引擎 deny 先生效)。
87
+ - 🔴 **allow 只在能力位读到「按规则读、不当名单」时才发**:`caps` 是 `observedPermissionsAllowGrant(baseUrl)` 的读数,只有 `present ∧ grants === true` 才发 allow 桶。不认这一位的引擎(今天的全部引擎)可能把 allow 当**名单**读 —— 在场即收窄、名单外的工具一律拒,所以没报 / 为假 / 没读到 / 读数畸形一律不发;这种引擎上审批照旧由客户端按 allow 规则放行,与上一版同一条路。发出去的 allow 在引擎那边是「有人对这只工具表过态」,不是免问:引擎自己要问的(写门、shell 一类)照样会问;内容形 allow(`Bash(git:*)` / `Edit(src/**)`)本口不投,仍由客户端同步放行。allow 桶永不发空数组;规则编译器对某条 allow 规则答不上来时那一条不发(deny / ask 在同一形上照发 —— 判不出一律往收紧落)。
88
+ - 产物:每只桶只在非空时在场,三只都空 ⇒ `{}`;数组每次新铸、不别名入参、不改入参。用法:`permissions: { ...宿主自己的其它 permissions 子键, ...d.permissions }`,经 `settings.resolved` 交给装配口。
89
+ - 拒绝面:入参不是对象、某个字段只在原型链上、某只桶不是数组、来源表不是 Map 形 ⇒ `TypeError`;有规则要投而引擎值级端口(`MCP_NAMESPACE` / `RETIRED_TOOL_NAMES` / `protocolOf` / `ruleToolGrammarOf` / `validatePermissionRules`)缺任一 ⇒ 抛并点名缺哪几只(不判就发会让整份请求被拒,不判就删会静默丢掉 deny);装着的端口自己抛(`RETIRED_TOOL_NAMES` / `protocolOf` / `ruleToolGrammarOf`)⇒ 原样外抛(装 core 的同名实现时不发生);规则编译器对某条规则答不上来不抛 —— deny / ask 那一条照发、未经校验(远端编译不了时整请求 422,KL-414),allow 那一条不发。数组里的非串、空串、纯空洞跳过;空洞在原型链上有值(`Array.prototype` 被写过)⇒ `TypeError`(静默跳过会丢一条 deny / ask)。
90
+ - **能力位读器 `permissionsAllowGrantCapability`**(CC-302;**§116 PM-6**):`projectPermissionsAllowGrantCapability` / `noteEngineCapsForPermissionsAllowGrant` / `observedPermissionsAllowGrant` / `forgetPermissionsAllowGrantReading` / `__resetPermissionsAllowGrantReadingsForTests` 四口 + 投影,与既有能力位读器同一套(按 baseUrl 分格、代际守卫、畸形删格)。三态读数 `PermissionsAllowGrantReading`:`unobserved` / `not_reported`(路径上任一段缺席 —— 判不出,**不是**「不支持」)/ `present`(`grants` 是引擎报的布尔)。判据单源 `permissionsAllowGrantAvailable(reading)`(只有 `present ∧ grants === true` 才真;宿主自拼的坏读数一律假、不抛);doctor 句 `permissionsAllowGrantDoctorDetail(reading)`(四句互异,两种「读不出」都不说引擎不支持;句子从判据同一只派生 —— 说「sent」⇔ 判据真,「引擎说不」⇔ 自有 `kind: 'present'` ∧ 自有 `grants === false`,宿主自拼的坏读数〔`grants` 非布尔 / 缺席、不认识的 `kind`、非对象、`null`、位只在原型链上〕⇒「读不出」那一句,永不抛)。
91
+ - 🔴 **位名候定**:按 `/v1/capabilities` 的 `settings.permissions.allowGrant`(布尔)读;服务端尚未发布这一位,今天的一切引擎在这一位上都读 `not_reported` ⇒ allow 一条都不发。服务端定名后若不同,下一版改读(KL-392)。
92
+ - 公面类型 +6:`PermissionsDeclaration` / `PermissionsDeclarationBuckets` / `PermissionsDeclarationInput` / `WireRuleOrigin` / `WireRuleOrigins` / `PermissionsAllowGrantReading`。
93
+ - **错误载体铸口 `toolHistoryErrorCarrierOf(terminalOrResult)`**(CC-309;**§116 PR-2**):同一终局 ⇒ 会话历史 tool_use 错配判型 `classifyToolHistoryMismatch` 的入参形 `{ code?, status?, message? }` —— 终局码(failed 因由的 `code` / 扁平形 `errorCode`)、服务商状态(结果上 `apiFailure.status`,没有则取服务商拒绝详情 `detail.status`;引擎两处同值)、失败句原值。入参是 `done` 帧 / 它的 `result` / `failed` 帧 / run 行的 `result`。只读自有数据位(取值器 / 只在原型链上的位 / 读它就抛 ⇒ 该位缺席;中间快照每一层都是 null 原型);不是 failed 终局、终局行不落 `API Error:` 臂(409 占锁 / 治理 / 模型输出三臂,与铸行处选臂同一只判据)、入参不是对象 ⇒ 空载体 `{}`;产出冻结、null 原型(按属性访问读它只看得到它自己的三位);永不抛。本包终局行判错配(挂 `_sema_tool_history_mismatch` 与 `/rewind` 出路句)读的就是这一只,宿主把它的返回值交给 `providerRejectionResend` ⇒ 行上有键 ⇔ 判定口让位。
94
+ - **`attachments` 声明的拒绝改抛具名类 `AttachmentsSpecRefused`**(CC-316;接入文档 **§116 SV-7**;`TypeError` 的子类):`attachmentsForRequest(env)` 对 `SEMA_ATTACHMENTS` 的拒绝(未登记键 / 对字面真族用 `-` / 只关不开的键用 `+` 或裸键 / `key=value` 形不合 / `todoReminderMode` 取值不合 / 点名退役键)与 `buildTaskRequest` 对 `attachments` 对象里退役键的拒绝,抛**同一个类** —— 壳按 `instanceof AttachmentsSpecRefused` 接,不靠解析消息串;`message` 一字不动(env 口逐字节同 0.89.0;装配口逐字节同本版此前)。env 口此前抛普通 `Error`,`instanceof TypeError` 只会由假变真。自有数据位:`token`(被拒的 token;env 口是整串小写之后的那一段,装配口是对象的键原样)/ `why`(理由半句,与 `message` 里同一份)/ `allowed`(合法形,冻结数组:env 口 = 句里列的九项,装配口 = `ATTACHMENTS_SPEC_KEYS` 九个键名)/ `key`(只在装配口在场,= 被拒的键;env 口抛出的实例没有这一自有位);`name` 恒 `'AttachmentsSpecRefused'`。不按拒绝原因分子类。
95
+ - 公面合计(本版):根入口运行期导出 1379 → 1397(+19 −1):删名 CC-291 `readLegacyModeSeedMigrated`(具名型 `LegacyModeSeedMigratedFactsView` 同批退出,见 Removed);新增 CC-294 `FILE_HISTORY_LEG_VERDICTS` / `fileHistoryLegNoticeVerdict` / `fileHistoryLegNoticeSentence` / `fileHistoryDeclarationOfBody` / `createFileHistoryDeclarationLedger`;CC-298 `hookToolAliasesOf` / `canonicalHookToolName`(表 `HOOK_TOOL_ALIASES` 是模块内部件、不上根入口);CC-299 `SUPPORT_FLOOR` / `supportFloorOf` / `engineVersionTier`;CC-302 `permissionsDeclaration` / `projectPermissionsAllowGrantCapability` / `noteEngineCapsForPermissionsAllowGrant` / `observedPermissionsAllowGrant` / `forgetPermissionsAllowGrantReading` / `permissionsAllowGrantAvailable` / `permissionsAllowGrantDoctorDetail`;CC-309 `toolHistoryErrorCarrierOf`;CC-316 `AttachmentsSpecRefused`(类)。测试钩 62 → 63(CC-302 `__resetPermissionsAllowGrantReadingsForTests`);公面类型名 952 → 964(+13 −1:CC-294 四只、CC-299 三只、CC-302 六只;CC-291 −`LegacyModeSeedMigratedFactsView`);子路径入口 `./registry` 值级 10 → 15(CC-136,不计入根公面);`PromptDeliveryLedger` 接口 +2 个必有成员(CC-300);`providerRejectionResend` +1 可选参(CC-309);超集键不变。🔴 型面 BREAKING 三处:CC-291 两处(Removed 两条)+ CC-300 接口 +2 必有成员(把自写替身赋给该接口型的端编译红一次)。
96
+
97
+ ### Changed
98
+
99
+ - **开发依赖引擎 `~7.38.2` → `~7.40.1`**(CC-291;六版累积 7.38.3 / 7.39.0 / 7.39.1 / 7.39.2 / 7.40.0 / 7.40.1;**§116 EN-***):生成表三只按新引擎重生(码册 / 受众 / 铸方各 −1 行)。7.38.3 / 7.39.1 / 7.39.2 / 7.40.1 的机读清单对公面零增减;7.39.0 / 7.40.0 机读清单标的六处硬破坏里:`planModeReminder` 与通告码册 −1 本包有读点(上面 Removed);`AttachmentSource` / `TaskEvent.source` 的 −`plan_mode` 本包按开集读、标签表的 `plan_mode` 行留作老引擎词;`ModePolicy` +必填 `unstated`、`HandsBandOptions` −`readCyberReminder` 两处本包零读点。`ASK_CLASSES` +`shell_floor`(7.39.0)+`unstated`(7.40.0):问类读器本来开集、原样收,`unstated` 卡在端上不丢。`steering_injected.source` −`plan_mode` +`output_style` 与任务规格 `outputStyle` 席:服务端 7.113.0 不接 `outputStyle`,经服务端不会出现这一来源,出现时落默认句。
100
+ - **结算词表 13 → 14 词**(CC-291;**§116 EN-5 … EN-7、SV-2**):`SETTLEMENT_KIND_WORDS` +`policy_allowed`(引擎 7.39.0;排在 `policy_refused` 前,逐词逐序同引擎);`SettlementWhoView.party` 的词表是引擎的五词(`person` / `policy` / `engine` / `host` / `none`),读口仍开集透传。服务端 7.113.0 起:无人值守路径按类放行的那一问记成 `policy_allowed` + `who.party: "policy"` + `who.approver: "unattended_class_answer"`(此前 `human_allowed` + `person`)、策略拒 `policy_refused` 的 party 由 `none` 改 `policy` —— `isHumanSettledGate` 对机器放行不再答真,`isPolicyRefusedGate` 只认词、两代 party 同答。无新谓词(无消费场景前不铸)。编译期正向钉对 sdk 12 的联合放宽了登记过的一个滞后词(KL-413)。两代记法各说各的:服务端 < 7.113.0 的无人值守放行仍读成 `human_allowed`(KL-412)。
101
+ - **服务端夹具换钉 7.114.0(含 7.113.0 起的行为)/ sdk 16.0.0 进地板见证矩阵**(CC-291;**§116 SV-3 … SV-6、SD-1、HK-1**):服务端 7.114.0 起 fresh 提交对「选中工具别名、选不中正名」的设置 hooks matcher 整请求 400(字面 / 正则 / 两端空白 / 逗号名字表 / 竖线名字表 / 含空段同一条规则;7.113.0 只拒字面形与竖线名字表形),本包对 matcher 零改码:原样透传、跳过口按原串做键、不预检(KL-416);会话读三口非属主 404 的码改 `not_found.session`(本包会话读口不按码分诊,零改读)、live steer 的 `inputId` 等于回执 `messageId`(投递账本按消息 uuid 记,零行为变化)、`blocked` 终局 `terminal.detail` 等项本包零读点。peer sdk 地板 `>=12.0.1` 不动,`.d.ts` 对 sdk 16.0.0 严格编译零错;地板见证环境 `SEMA_SDK_WITNESS` 由单个路径改为路径列表(开发依赖 12.0.1 + 15.0.0 / 15.2.0 / 15.3.0 / 16.0.0 探针树)。
102
+ - **文件历史「没照办」那一句改口**(CC-294;**§116a′**):0.88.0 接入文档 G-FH7 的判据「用户关了文件检查点、引擎报 `on` ⇒ 渲『本会话未按声明执行』」作废 —— 那一句只在**这条 run 的提交真带了关断声明**时说(`not_honored`);能力位 `on-always` 的部署上改说「这台引擎按会话关不掉」(`not_offered`);能力位 `on-optional` 而这一发没带(还原文件的那一次提交)零句;回执上没报「引擎没报」那一档也不再单渲一句(零句,不渲「已关闭」)。英文句换成结论在句首的新句(见 Added)。
103
+ - **能力位读器家族交出的读数冻结**(全家族十八只 `observed*()`;**§116 CR-1**):读口交出的是读账里那一只对象 —— 此前读者就地改它(`r.grants = false` / `r.kind = …`)会改掉这一格此后所有读者的答案(放行位被改真 ⇒ allow 规则被交出去)。本版存进读账时逐层冻结 —— `present`、`not_reported` 与逐位读器某一位 `malformed` 的读数同律(只冻 `present` 会让读者把 `not_reported` 就地改成 `present` / 放行真):非严格模式改写无效、严格模式抛 `TypeError`,再读仍原值;未观测读数(含畸形删格之后)每次新铸、不进读账、不冻;交给 tee 的能力回体不冻。要改读数先拷一份。
104
+ - **状态派生粗码表 `STATUS_DERIVED_COARSE_CODES` 有了上游真源**(CC-299;**§116 RL-1 / RL-2**):服务端契约附录 A.1e 出了「状态派生粗码」一节(服务端 7.113.0),sdk 16.0.0 出了同名常量(同名同序)。表内九词与顺序逐字节不变、判定口 `isStatusDerivedCoarseCode` 不变;门改为三向对拍(服务端分发器铸点 / sdk 同名常量 / 契约那一节)。表**不**改成从 sdk 导入:peer 地板 `>=12.0.1` 上 sdk 12 – 15.4 的入口没有这个导出,具名导入会让装着这些版本的宿主在加载本包时就失败 —— 表与上游双源对拍,peer 地板不抬;sdk 支持底线越过 16.0.0 那一版再改为转出 sdk 的常量(退役登记 RL-18)。
105
+ - **老引擎两代读法的退役改按支持底线判**(CC-299;**§116 RL-3**):`ruleStoreUnreadable` 一族与「谁拒的」退役词 `plan_mode` 在声明的引擎底线越过 7.34.0 那一版删,请求键 `approverPosture` 的按名专句在声明的服务端底线越过 7.106.0 那一版删(删公面名的那一版走 minor 并提前一版预告)。本版三者都不动。
106
+
107
+ ### Fixed
108
+
109
+ - **「改了重发」判定口与会话历史 tool_use 错配的出路句相矛盾**(CC-309;**§116 PR-1 / PR-2**):错配那一行本包补 `/rewind` 出路句,而 `providerRejectionResend(detail)` 只按状态码判、对同一终局给「改了再发」那一句 —— 错配会话重发永远不成。`providerRejectionResend(detail, carrier?)` 加可选第二参:同一终局的错误载体判为错配 ⇒ `undefined`(让位);载体由新根入口 `toolHistoryErrorCarrierOf(同一终局帧)` 铸,本包终局行判错配读的是同一只 ⇒ 行上有错配键 ⇔ 判定口让位(终局行判错配读的服务商状态此前只取 `apiFailure.status`:只带服务商拒绝详情 `detail.status` 的终局上行不带错配键、不补 `/rewind` 句;本版补上这一处,与判定口的让位读同一只载体)。判定口把载体原样交给 `classifyToolHistoryMismatch`(同一只判型、同一读法)⇒ 两只公面口对任何载体同答(SDK 错误对象这类类实例可直接交);读它就抛 / 不是对象 ⇒ 判不出 = 不让位。不传 / 判不出 ⇒ 与 0.89.0 逐字节同。端要得到让位,渲这一句的接线处得把载体交进来(KL-417)。
110
+ - **权限规则装配口:被引擎规则编译器拒收的整工具名照发**(CC-302 修订;**§116 PM-11**;KL-418):整工具规则归一后名字没变(`shell\runner(*)` 归一成 `shell\runner`、`odd)name()` 归一成 `odd)name`)时,修前只有改写出的名字过规则编译器、这一类跳过校验照投 —— 引擎对它们答 `invalid.paren`、服务端整请求 422。修后每个要投出的整工具名都过同一只判定、同一条策略(拒收 ⇒ 不投、留在客户端匹配器上;答不上来 ⇒ deny / ask 照投、allow 不投)。本机实测(core 7.40.1,U+0000 – U+30FF 逐字符放进裸名 / 协议名服务器段 / 协议名工具段 / 整服务器写法):修后让规则不发的恰是 `(` `)` `\` 三个字符,不论放在哪一段(修前裸名与两段里只有 `(` 不发)。与终端 1.0.140 在这一形上多一类登记差异(终端照发)。校验器答不上来时 allow 的整工具名也不再投(收紧方向;修前裸名不经校验器照投)。
111
+ - **终局行与错误载体对同一帧各读一遍**(CC-309 修订;**§116 PR-2 / G-PRC9**):铸行处先算一遍选臂读数、载体铸口自己再算一遍 —— 占锁位 / 终局码是「只在某一次读答某个值」的取值器时(只有宿主自建对象可达),行文是占锁话 / 治理话却带错配键与 `/rewind` 句,或反过来。修后铸行处把算好的读数交给载体铸口,同一帧同一拍只读一遍;公面口 `toolHistoryErrorCarrierOf` 自己调一次也只读一遍。另「有没有终局行」只有一个判据 —— 错误句非空:`failed` 帧 `errorMessage: ''` 不出终局行,载体也是空载体(修前载体是 `{ code }`)。
112
+ - **`createPromptDeliveryLedger().deliveredByFrame` 喂撤销式代理帧时外抛 `TypeError`**(CC-294 同批;只有宿主自建对象才可达,JSON 帧上不可达):判据第一步的数组判就会抛,与它的头注「读帧抛 ⇒ 不算」不符 —— 本版答「不算」、不记、不抛。与账本 `boundToRun` 共用这一只判据。同一包里其余几只入口在撤销式代理上仍外抛(KL-402)。
113
+
114
+ ### Gates
115
+
116
+ - 扩门 `scripts/run-sdk-registry-transit-test.mjs`(94 → 158 格;缺 16.0.0 探针树 147 格、15.3.0 与 16.0.0 探针树都缺 136 格;CC-136):五名并入值级名单,A(同一引用)/ C(名单双向)/ E(上游声明见证)/ I(干净树下游探针)四段对五名同样生效;新增 B2(`dist/sdkRegistryTransit.d.ts` 的值级转口块与门名单双向相等)、I⑧(五名在干净树上的返回型与入参型是真型:`@ts-expect-error` 两向探针,型塌成 `any` 时指令未使用 ⇒ 红,引用相等对这一形是盲的)、J 段(五名转口 × 三代 SDK:装着的 12.0.1 + 环境变量 `SEMA_SDK15_ROOT`〔15.3.0〕+ `SEMA_SDK16_ROOT`〔16.0.0〕逐代读 —— JS 产物里是函数 / 声明入口里值级具名导出 / 声明闭包(import / export / import 型 / path 引用四类相对边)零裸说明符 / 转口产物在以该代为 `@sema-agent/sdk` 的沙箱里真载入且十五个值与该代同名导出同一对象 / 导出名集合恰等于门名单且十四个同入口邻名一个都没转;缺名、声明缺、闭包带裸说明符、不同一对象一律红,探针树未设 ⇒ 该代标为未跑,设了而解析不到 SDK 包 ⇒ 门退出码 9;三代版本必须互不相同且各不低于槽位对应的大版本 12 / 15 / 16,同一份 SDK 填进两个槽 ⇒ 退出码 9)与合成夹具(缺名 / 裸说明符同文件 / 裸说明符出 registry 目录一跳 / path 引用指空处 / path 引用引进的文件带裸说明符 / 包装函数 / 多转一名 / export 口指空处 / 代际登记各一,夹具用合成的完整转口、不随真产物变)。
117
+ - 新门 `scripts/run-server-7113-fixture-test.mjs`(42 格;CC-291):服务端发布包夹具对拍,每格两代(服务端 ≥7.113.0 一代〔今天的夹具 7.114.0〕+ 7.113.0 之前的一代〔7.111.0〕;夹具缺席各自标未跑、必跑档红)。格分两类:A 段的 A1 / A2 / A5 是**源码文本见证**(读服务端发布包的 `admission.js` / `spec-fields.js` 文本,核铸点句与 attachments 形说明,不起路由),B / C / D 段是**真路由 / 真模块**跑的格 —— A `attachments` 键表(服务端形说明文本的键集 ≡ `ATTACHMENTS_SPEC_KEYS` 九键 / 退役键 400 铸点文本 / 本包 `SEMA_ATTACHMENTS` 五种取值的产出不越界 / 显式点名本地抛;老一代十键含它)· B 会话读三口(详情 / head / events)非属主 404:真 `handleSessions` + 真 `runOwnerOk` 起在 http 上逐口读状态与码(新一代 `not_found.session`、老一代 `not_found.run`),真 SDK client 打非属主 404 ⇒ 本包 `fetchDelegatedPrompt` 两代同答 `unreadable` · C live steer 的 `inputId`:真 `handleRuns` 的 `run-steer` 两代各驱一发(新一代 `inputId === 回执 messageId === 账本受理 id`、老一代选项里无 `inputId`),同一 `inputId` 的 queued / applied 两帧各投一帧、投递账本只记一次 · D 无人值守按类放行的结算:真模块答案 / 引擎铸口 / 本包读口 / 投影后的 `tool_end_result` 上 gate 原样在场且读回 `policy_allowed`、不是人批的(带三枚吞帧负控)/ 老一代词表 13 词。
118
+ - 扩门 `scripts/run-engine-notice-catalog-test.mjs`(1594 → 1610 格,带服务端 7.114.0 夹具与七份老一代夹具列表;六份列表时 1580):码册 85、该码读器 / 具名型 / 派发行 / 三张生成表行全部退役(册外码答 `undefined` 不抛)、五只新读器(原六);G-UI5 由「不读子代位」改「读」+ G-UI5b … G-UI5m(缺席不铸 / 五种坏形与取值器抛只丢这一位 / 真铸点 `undrainedUserInputNotices` 第五参四帧:自己两帧读数与上一版逐字节同、父会话副本两帧带 `childSessionId` 且无 `runId` / 经派发口受众 `user` / 子代句逐字 / `crashed` 与表外 `cause` 上带这一位不改句)。
119
+ - 扩门 `scripts/run-gate-vocabulary-test.mjs`(→ 510 格):结算词 13 → 14(对引擎真字节逐词逐序;开发依赖 sdk 的词 = 引擎的词去掉登记滞后词 `policy_allowed`;≥16.0.0 的 sdk 见证词集与引擎全等,没有这样的见证 ⇒ 标未跑、必跑档红)、`policy_refused` 的 party 两代各一说、引擎 `SETTLEMENT_PARTIES` 恰五词且读口开集透传、谓词登记表 14 词(机器放行五只具名谓词全不说话、不产出拒绝分类)、`policy_refused` 两代 party 同答;T2d 编译期正向钉放宽的滞后词按语法树核 —— 别名必须是非空、无重复的字符串字面量联合,正向钉的声明类型逐字不变,别名的词集与门里登记的滞后词表相等,每个滞后词不在 peer 地板 sdk 的结算联合里、而在 `SEMA_SDK_WITNESS` 最新一代 sdk 与已装引擎的结算词表里(见证列表读不出 ⇒ 标未跑);别名放成 `string` 时构建照绿、此前本门也照绿,本版起红。
120
+ - 扩门 `scripts/run-core-value-ports-test.mjs`(→ 59 格):入参镜像与引擎 `createAllowDenyPolicy` 第一参逐键相等(读两份 `.d.ts` 的语法树;`scope` 可选、字面联合逐字同)、`scope` 原样透传。
121
+ - 扩门 `scripts/run-client-core-pure-test.mjs`(4159 → 4253 格):`attachments` 拒绝的具名类 `AttachmentsSpecRefused`(CC-316:env 口十一种拒绝 × 三真 `instanceof` / 自有位与句子逐位一致 / 与 0.89.0 发布产物对拍两边都因同一原因拒的八形 `message` 逐字节同〔没给基线 ⇒ 标为未跑〕/ 退役键整句逐字节冻结;装配口两车道 × 五种写法 × 三真与自有位 / 精确键整句逐字节冻结;`allowed` 冻结、两口各是各的合法形;env 口抛出的实例没有 `key` 自有位);`attachments` 键面 10 → 9、`full` 点满 6 员、退役键九种写法一律抛并点名退役与出路、装配口 `buildTaskRequest` 对 `attachments` 对象里的退役键七种写法 × 两车道 × 两值一律抛(`TypeError`,句子按「键」措辞;精确键说服务端 400、别的拼写说服务端忽略)、值为 `undefined` 的四种写法 × 两车道按缺席(不抛、请求体不带这一键)、不带退役键的原样透传、`output_style` 来源落默认句不丢;approvals 推送 feed 段(B7③)的正向计数格(「至少再取了几次 / 至少重试了一次」)改有界等待(判据不变,3 s 截止;固定窗在取件被拖慢时假红),零拍负控照旧固定窗。`scripts/run-approval-frame-keys-test.mjs`(→ 243 格):逐个读已装引擎 `ASK_CLASSES` 的每个词,作问类过卡腿都原样在场。`scripts/run-subagent-injected-wire-test.mjs`(184 格):夹具真路由的假账本补 `confirm`(服务端 7.113.0 起受理账本多这一口)。
122
+ - 地板见证:`scripts/run-public-surface-test.mjs`(110 → 139 格:`SEMA_SDK_WITNESS` 列表带四份见证时的读数;只带三份见证时 132 格)与 `scripts/run-sdk-floor-test.mjs` 读的见证环境 `SEMA_SDK_WITNESS` 由单个路径改为路径列表(开发依赖 12.0.1 + 15.0.0 / 15.2.0 / 15.3.0 / 16.0.0 探针树),列表里每份逐份验;没有 ≥16.0.0 的见证 ⇒ 标未跑、必跑档红。
123
+ - 新门 `scripts/run-file-history-leg-notice-test.mjs`(184 格;CC-294):S 五只口在根入口且与模块同一对象、在公面基线里、闭集冻结定序、账本恰三只口冻结;V 72 格真值表逐格(表是门里的字面规格)+ 出句 ⇔ 两态 + 闭集 ⇔ 产出 + 四维代表值全扫 1386 格;W 两句逐字、结论前置(`not_honored` 整句 ≤ 100 字符、结论起于前 10 字符);P 入参只认自有属性(四维各一格,每格都选「读原型就会出句」的形)、敌意入参不抛;U 能力位读不到而声明不是 sent 的 2856 格一律零句、声明 sent ∧ 报 `on` 恒 `not_honored`;L 账本:绑定判据与投递账本 25 帧逐帧同答、逐帧分类对期望表断言(建了 run 7 / 开流与拒收 9 / 非帧 9 —— 两处一起判错时也红)、四只操作 24 种次序终局同答、矛盾 / 没记过 / 没绑过 ⇒ `unknown`、拒收帧与重放卡带的别的 run 的 id 不被改写;B 出站体读口:普通数据属性与 JSON 序列化逐形同答,`toJSON` / 取值器 / 取值陷阱代理 / 兄弟取值器(在前 / 在后 / 符号键)/ 读不动 / 这一键的值是非 null 对象(包装串、带 `toJSON` 的对象、普通对象、数组、`Date`)⇒ `unknown`、诚实代理与不可枚举取值器与原始值 / 函数值照读;E 真 SDK 流解析 + 本地假引擎收下真出站体 → 投影 → 适配层 → 判定 → 句(自定义 `toJSON` 拿掉这一键、会变的取值器、取值陷阱代理、兄弟取值器删键四形:账本 `unknown`、零句,wire 上没带就不说「没照办」);D 与上一份宿主侧实现逐格对拍(差恰 18 格,全是零句之间)。
124
+ - 扩门 `scripts/run-upstream-tables-test.mjs`(G7 / N2e / N4e / N6f / N7;CC-298):生成物 `CORE_HOOK_TOOL_ALIASES` 对已装引擎目录独立重算逐键逐序、冻结 + null 原型 + 非空;`canonicalHookToolName` 对引擎自己的名字解析器 `rosterToolName` 逐名同答(目录全部名字 + 原型键 / 大小写 / 空白 / 零宽字符探针);`ListPeers → ListAgents`、表外名原样、大小写与空白不折叠、参数别名不进表、非串入参原样不抛;读口交同一冻结实例且往里写进不去;根入口只出两只读口且与模块内同一引用;源码初始化式绑定生成物(AST);src 里别名零串字面量(尺子先响)。负控:目录加别名 ⇒ 生成物不同、改参数别名与自别名 ⇒ 生成物不变、同名两条目同一别名 ⇒ 接受;二十五种坏形(含整数形别名)与整类抽掉(全目录无别名)⇒ 拒生成;目录读口缺席 ⇒ 拒生成点名并与老引擎缺名一次点齐;N8 把生成的表转译**执行**后对引擎自己的 `rosterToolName` 逐名对拍(别名是 `__proto__` / `constructor` / `toString` / `hasOwnProperty` 一类原型键名时每个声明的别名都是自有键、键序 = 声明序;看着像整数却不是数组下标的串键序不变);**进程级**:生成器 CLI 对无别名的目录跑 `--write` ⇒ 非零退出、生成目录一个字节不动(换回真目录的 `--check` 为零差异正控)。
125
+ - 新门 `scripts/run-support-floor-projection-test.mjs`(52 格,服务端底线有夹具见证时;CC-299,包侧投影门):SF0 公面三名三型、型面不带字面底线值 / SF1 声明 `scripts/support-floor.json` 读得出(读不到即红)、三项都是纯 `x.y.z` 且与运行期常量逐项相等、常量冻结 / SF2 sdk 一项 ≡ peer 地板 / SF3 服务端底线在门的服务端夹具列表里有见证,其精确依赖与装着的引擎都 = 声明的引擎底线(必跑档无见证即红),逐份打印每份夹具在底线之下 / 等于 / 之上 / SF4 组件读口 / VT 三态边界(上下各三邻、按数比不按串比)、坏形十三种与非串八种、门槛只能抬、坏形门槛先于版本判定拒、敌意入参不抛、与 `inheritEnvServerSupport` 读法同源(同池「读不懂」逐格同答)。
126
+ - 扩门 `scripts/run-retirement-ledger-test.mjs`(22 → 26 格):上游条件第四种子式 `floorKind` + `floorCrosses` —— 按支持底线声明判(声明那一项 ≥ `floorCrosses` ⇒ 条件已满足,等于即满足);声明读不到 / 坏形即红,不是跳过;子式行形(表外组件 / 非 `x.y.z` / 读已装包 / 与别的子式混用各自报)与判官自证三格。
127
+ - 扩门 `scripts/run-resume-refusal-copy-test.mjs`(210 → 216 格;带 sdk ≥ 16.0.0 探针树时 217 格):CC-243-y 粗码表 ≡ sdk 同名常量(读 `SEMA_SDK16_ROOT` / `SEMA_SDK15_ROOT` / `SEMA_SDK15_ROOT_OLD` 三只变量与开发依赖里的每一份 sdk;逐项同序;按解析后的真实包路径逐份读,同版本的两份也各读一次;≥ 16.0.0 而入口没有这个导出即红;一份 ≥ 16.0.0 都没有 ⇒ 标为未跑、必跑档红;配置的探针路径解析不到 ⇒ 标为未跑)、CC-243-z 粗码表 ≡ 服务端契约附录 A.1e 的表(逐词双向;服务端源码树未配置且同级不在 ⇒ 标为未跑;配置了却不存在、不是服务端包、版本读不出、没有契约文档 ⇒ 红;只有版本读得出且 < 7.113.0 时缺这一节才算合法缺席)。
128
+ - 扩门 `scripts/run-prompt-delivery-projection-test.mjs`(111 → 156 格,带两代服务端夹具;其中 B 段等 +35、H 段 +10;CC-291 / CC-300):H 段 —— 同一 `inputId` 先 queued 后 applied 只记一次 delivered、乱序 / 回放同、`inputId` 与消息 uuid 同值 / 不同值 / 缺席三形读数逐字节同、回执路径与帧路径先后到达互不重记;S4 账本口数改十一只;新 B 段 —— 同账本 × 同入参 17 形(`undefined` / `null` / 裸串 / 数字 / 空对象 / 行无 uuid / 空串与非串 uuid / 不知道 / 被拒 / 在飞 / 交出去 / 读回只有 attempted 与 attempted + delivered / `uuid` 取值器抛 / 抛错代理 / 原型上的 `uuid`)方法、自由函数与期望三者同答;行表同答、保序、返回新数组,非数组 ⇒ 空数组;脱离账本取出 / `this` 缺席 / `this` 被改 / 展开拷贝 / 再冻结仍可调;`knownUndelivered(uuid)` 语义不变且与按行方法入参域互斥;读活账本、两只账本互不串;读回账本(JSON 往返、混坏行)对整张入参矩阵同答;真 tsc 编真 d.ts 的类型正例两格(新方法的签名;九口形旧替身传进两只自由函数)+ 反例七格(反例落在预期诊断码上)。
129
+ - 新门 `scripts/run-permissions-declaration-test.mjs`(140 格,带终端源码树与八代服务端夹具时;CC-302,包侧投影门):C 能力位读器 —— 路径逐段三态、原型链上的段不算在场、每段恰读一次、判据单源真值表(宿主自拼的坏读数一律假、不抛)、doctor 四句互异且与判据同源(十三种坏读数说「读不出」、不抛)/ MS 整服务器 / 整 peer 写法(协议前缀表取已装引擎、逐协议)—— 两件前提先证(装着的引擎规则编译器两形 × 三行为逐名同判、改写过的每只服务器 / peer 名同判;每一代服务端夹具的受理口收 `__*` 形三桶、编出的策略对该服务器 / peer 答该行为,裸形逐代打印)再证产出(三桶改写 / 与显式 `__*` 去重 / 命令行 deny 同改 / 整工具形同改 / 坏形与以 `_` 结尾的不改写 / 改写出的名字编译不了的不发 / 信任序位置)/ N 位名只此一处 / A allow 四种读数 × 四形(只有「真 ∧ 投影后非空」才发 allow、永不发空 allow、能力位不影响 deny / ask)/ V 冻结向量(旧名归一 / 整工具形 / 跨桶不去重 / 信任序 / 命令行 deny 并入 / 三条 422 腿 / 不截断)/ D 与终端 1.0.140 同一池逐例比 deny / ask 请求体字节(对照 = 同一份终端代码只给整工具形套上同一条改写;改写前的终端与本口的差单数,每例只差在改写出的 `__*` 条目上;终端源码树缺席 ⇒ 标为未跑)/ I 入参纪律 / PT 端口缺席与判官失灵(取舍格标 KL-414)/ E 端到端经 `buildTaskRequest` 落到请求体 / MW 整工具名同过编译器(右括号 / 反斜杠 / 两者并存 / 服务器段含 `(` 四形 × 三桶:投出列表零含编译器拒收的名,正控三名仍在;校验器抛 / 回非数组 ⇒ deny / ask 的整工具名与改写名照投、allow 不投;3000 条随机规则串 × 三桶:投出的每一条都被装着的引擎规则编译器接受)/ D 段登记差异 ⑥(被编译器拒收的整工具名:终端照发、本口不投;每例只差在这几个名字的条目上,deny / ask 与 allow 各自独立数);扩门 `scripts/run-engine-cap-reader-factory-test.mjs`(读器工厂族名单 +1 `permissionsAllowGrant`;F14 存下的读数逐层冻结、非严格改写不生效、严格模式抛、不冻入参;F14e `not_reported` 与逐位 `malformed` 读数同律、F14f 删格后的未观测读数改写不留,694 → 821 格)。
130
+ - 扩门 `scripts/run-terminal-cause-projection-test.mjs`(443 → 481 格;CC-309):G-PRC6a —— 三种错配句 × 三种载体形 ⇒ 判定口让位;G-PRC6b 非错配载体、G-PRC6c 坏载体(非对象 / 取值器抛 / 撤销式代理)⇒ 与不传载体逐字节同、不抛;G-PRC6d 载体判错配而 `detail` 不是服务商拒绝 ⇒ 照旧 `undefined`;G-PRC6f 判定口与判型口对十一只手搓载体(取值器 / 原型链上的位 / SDK 形错误对象 / 串形状态 / 只有句)逐只同答、本包铸的载体冻结 · null 原型 · 让位;G-PRC6e 不传载体与上一发布产物(`SEMA_DU_BASELINE_TGZ`)在 280 余只 `detail` 上逐字节同(没给基线 ⇒ 标为未跑)。扩门 `scripts/run-tool-history-mismatch-projection-test.mjs`(212 → 293 格;CC-309):D2c 载体同源 —— 三十一只终局帧(十二只治理终局〔blocked / `limits.*` / `output.invalid` × 因由形 done / failed 帧 / 扁平形 done,含治理码是取值器或只在原型链上的形〕:载体全是空载体、终局行是治理行、无错配键、无 `/rewind`;另十九只:只带 `detail.status` / 只带 `apiFailure` / 两位都缺有无引擎前缀 / 两位都在 / 两位打架 / 非错配句 / 409 拒收信封 / `failed` 帧两形 / 带占锁位的错配终局两形 / 模型输出问题句开头 / 结果与终局上的自有取值器、原型链上的位、会变的取值器)交真 `runStream` 看行上错配键,同一帧的 `toolHistoryErrorCarrierOf` 交判定口:键在 ⇔ 让位、「改了再发」句与 `/rewind` 句永不同时给;载体冻结、null 原型、只带三位自有数据属性、`done` 帧与它的 `result` 同一只载体、敌意入参空载体不抛、`Object.prototype` 被写进三位与抛错取值器时载体不带原型上的位且不抛;F40 —— `activeTaskId` 取值器第 N 次读才答占锁(N = 1 / 2 / 3 × done / failed 帧)读次数恰 1、行自洽,`errorCode` 有状态取值器(前 k 次答治理码 / 占锁码、之后答 `invalid_request`,及反向;21 帧)治理行 / 占锁行不带键、公面口自己调一次读 1 次、空句终局不出行且载体空。
131
+ - 新门 `scripts/run-server-7114-fixture-test.mjs`(128 格,带八份服务端夹具时;包侧投影门):服务端发布包夹具的**真受理口**(`createAdmission(...).prepareSpec` 起在本机 http 上,装配口换成哨兵)逐代对拍 —— 设置 hooks 的工具事件 matcher 九形 × 逐代断言表(≥7.114.0:别名选中而正名没选中六形 400 `request.field_invalid` 且句子点名别名与正名、也选中正名的与两只无关正控受理;7.113.x:只拒字面形与竖线名字表形;≤7.111.x:九形全受理),老一代夹具列表里的每一份都跑、按版本落档,表外的代即红,必跑档下三档各要有夹具跑到;本包装配口两车道原样透传 matcher、装配出的请求体过 ≥7.114.0 真受理口与直交同答;跳过口按原串做键;L 段自证门库的老一代夹具读法(必跑档下老一代列表未设 ⇒ 段红,非必跑档照旧标未跑;L2 自证 `fixtureRequired` / `oldGenListAbsence`);P 九形闭集的独立钉 —— 形数与形串逐字写成另一份字面量,与 H 段常量、逐代断言表三档的期望、接入文档 G-HKM1 条列的九形互相对读(少一形 / 多一形 / 改一形 / 档位期望翻一格都红;H 段的期望与遍历取自同一份数组,单删一形原先门不响)。
132
+ - 门库 `scripts/_gate-lib.mjs`:必跑档(`SEMA_CC_REQUIRE_SERVER_FIXTURE=1`)下老一代夹具列表 `SEMA_CC_SERVER_FIXTURE_OLD` 没设 ⇒ 读老一代夹具的各门老一代段红(此前标为未跑、收集结果仍按绿计;与新一代段 / sdk 16 见证缺席同律);非必跑档照旧标未跑。统一问法:`fixtureRequired()` / `oldGenListAbsence()`;之前各自拼「必跑档 ∧ 列表已设」一类合取而仍绿的五道门同改 —— `run-approval-frame-keys-test.mjs`(问类两位腿老一代 / 首铸代两段)/ `run-prompt-delivery-projection-test.mjs`(E 老一代)/ `run-resume-refusal-copy-test.mjs`(CC-281-x 老一代)/ `run-support-floor-projection-test.mjs`(SF3 底线见证)/ `run-permissions-declaration-test.mjs`(MS2 老一代受理口):必跑档 ∧ 老一代列表未设 ⇒ 红,权威环境(列表在)读数不变。
133
+ - 扩门 `scripts/run-layering-shadow-export-test.mjs`(121 → 123 格):新差分格 `cc294-file-history-verdict` —— 终端 1.0.141 先铸的同名文件历史判定(第二份实现)与本包判定喂同一张 144 格网格,差只许落在两类零句之间的登记类(表外词 ∧ 用户没关 ∧ 声明不是 sent;用户关 ∧ 声明不知道 ∧ 回执上报 `disabled`:终端答 `not_declared`、本包答 `unknown`,恰 18 格),类外即红;两份合成端自证。负控常驻套(CASE 33 → 35,另一枚是本版 CC-299 的)加回「语义差分格类外差」一枚:摘掉该差分格第二个登记类的分类谓词(`scripts/_layering-shadow-diffs.mjs`)⇒ 网格上 6 格差落到类外 ⇒ 影子门红;此前这一格的负控在 0.89.0 因影子表零 divergent-copy 行退役,本版有了一行而加回。
134
+ - `scripts/run-package-hygiene-test.mjs`:本地过程词表新增一条只扫三份 md 的协作称呼(向前执法同上;dist 里同一个词是子代与主线会话之分的产品语义,不扫);`scripts/run-fixture-flat-done-ratchet-test.mjs`:新门里的两帧 409 拒收信封补注,未注扁平 done 位点回到上限 23(棘轮不抬)。
135
+ - 登记物:根公面基线 1379 → 1397(+19 −1;删名 `readLegacyModeSeedMigrated`,具名型 `LegacyModeSeedMigratedFactsView` 同批退出)、测试钩 62 → 63;门清单 `scripts/gates-manifest.json` 172 → 177 条(新门 `file-history-leg-notice` / `support-floor-projection` / `permissions-declaration` / `server-7113-fixture` / `server-7114-fixture`),README「Guards」与负控文档由生成器同批重写(自动化负控 27 → 28:声明的服务端一项抬一个 patch ⇒ SF1d / SF4a 红,必跑档下 SF3 同红;行为套 +4);单例清单 610 → 617 条(CC-294 +1 / CC-298 +2 / CC-299 +1 / CC-302 +3),high 上限 133 → 134;棘轮 `portability.index` 234 → 239(CC-294 / CC-298 / CC-299 各 +1、CC-302 +2)、`typeshape.unknownExport` 466 → 469(CC-299 / CC-302 各 +2、CC-291 −1)、`singleton.highRiskCeiling` 133 → 134,账 332 → 340 条;退役登记 RL-11 退役(上游两条件齐,门改三向对拍),RL-12 / RL-13 / RL-14 的条件改为机读的支持底线子式(复核期不动),新增 RL-17(hooks 工具别名表的目录展开:引擎包根导出现成的别名表时改读,0.91.0 复核)、RL-18(粗码表本地字面量,sdk 支持底线越过 16.0.0 时改转出)与 RL-20(结算词正向钉的滞后词别名,sdk 支持底线越过 16.0.0 时删),RL-19(`readLegacyModeSeedMigrated` 与具名型)退役即入已退役,在册 9 → 11 行、已退役 6 → 8 行;导出存活登记 `removed` 账 +0.90.0 一格;`docs/KNOWN-LIMITS.md` KL-391 … KL-418 新增、KL-364 / KL-246 销;同名影子对账表 +1 行(第二份实现,CC-294;差分格见上)、三行记录的声明哈希按终端 1.0.141 重新核对;冻结账 1644 格不变。
136
+
137
+ ### Known limits(本版新增)
138
+
139
+ - **KL-409**:`planModeReminder` 退役后老部署(服务端 < 7.113.0 且引擎 < 7.39.0)少了显式开 plan 提醒的那一键。
140
+ - **KL-410**:子代副本帧与该子代自己那一帧是两帧,本包不合并、不跨帧去重。
141
+ - **KL-411**:老引擎仍发已退役的通告码 `resume.legacy_mode_seed_migrated`,按册外码处置、无 typed 事实。
142
+ - **KL-412**:服务端 < 7.113.0 的无人值守按类放行记成 `human_allowed`,`isHumanSettledGate` 在那一代上读成「人批的」(记录上分不开);`policy_refused` 的 party 两代两说。
143
+ - **KL-413**:开发依赖 sdk 12.x 的结算联合没有 `policy_allowed`,编译期正向钉放宽了一个登记过的滞后词,等 peer 地板抬到 ≥16.0.0 再收(这个滞后词的形由门按语法树守;退役登记 RL-20)。
144
+ - **KL-414**:权限规则装配口在规则编译器对某条 deny / ask 答不上来时照发那一条、未经校验;远端引擎编译不了它时整请求 422。
145
+ - **KL-415**:结算词 `policy_allowed` 没有具名谓词,端要区分「策略放行」按词判。
146
+ - **KL-416**:本包对设置 hooks 的 matcher 不求值、不预检;服务端 7.114.0 起「只选中别名」的 matcher 由服务端整请求拒。
147
+ - **KL-417**:「改了重发」判定口的错配让位要宿主把 `toolHistoryErrorCarrierOf` 铸的载体交进来,不传时与 0.89.0 同答;宿主自拼的载体照收(与判型口同一读法),但不保证与行上的错配键同答。
148
+ - **KL-418**:名字里带 `(` `)` `\` 的整工具 / 整服务器 / 整 peer 规则不上请求体(含左括号的整工具名由安全投影挡下,其余被引擎规则编译器拒收),只留客户端匹配器;与终端 1.0.140 在被编译器拒收的整工具名一形上不同(终端照发、整请求 422,本包不发)。
149
+ - 文件历史一句(CC-294):每进程只说一次一类的去重留在端上(KL-398);能力位读的是说话那一刻的读数,提交时还没读到能力位而没带声明的那一发、到说话时能力位已是 `on-optional` ⇒ 判 `not_declared`、零句(KL-399);绑定信任宿主给的 run id,只提交不跟流的 durable 提交在宿主喂到那条 run 的一帧之前读 `unknown`(KL-400);出站体读口只在证明得了上 wire 的是这一份时记 `sent`(取值陷阱代理、体上有可枚举取值器都读 `unknown`),三只陷阱同口径撒谎的代理、嵌套值在序列化时回头改顶层体、记完之后宿主再改体仍看不见(KL-401);投递账本其余入口在撤销式代理上仍外抛(KL-402);账本不淘汰(KL-403)。
150
+ - hooks 工具别名表(CC-298):是构建期快照,引擎之后新增的内置别名要等本包下一版换钉才进表;调用方 / MCP 声明的别名与 matcher 的通配 / 正则语法不在本口(KL-391)。
151
+ - 支持底线(CC-299):本版取值是保守初值,不是各端回报的底线(KL-404);`engineVersionTier` 的 `'unknown'` 不分「带前后缀的版本号」与「不是版本号的词」(KL-405);引擎一项在活引擎上读不到,只供退役条件判(KL-407);既有五只按服务端版本判功能在不在的读口各用各的门槛与读法,不随支持底线收(KL-408)。
152
+ - 粗码表(CC-299):仍是本包的本地字面量;与 sdk 常量、契约那一节的一致只在门带着 sdk ≥ 16.0.0 探针树与服务端源码树时核(KL-406)。
153
+ - 权限规则(CC-302):能力位位名候定,今天 allow 一条都不发;规则能不能编译由客户端装的引擎值级端口判,不是远端引擎;规则编译器对某条 deny / ask 答不上来时那一条照发、未经校验(KL-414);整服务器 / 整 peer 写法里服务器段以 `_` 结尾的仍只留客户端(KL-396);被编译器拒收的整工具名不投、只留客户端(KL-418);一只桶超过引擎条数上限时整请求被拒(三桶同律,本口不截断);规则编译根基取固定的绝对路径。详见接入文档 §116「包侧缺口」。
154
+ - 登记物按既定裁定改窗(本版对这些物零改动):同名影子对账门的过渡表里,终端三只同名读口(`promptKnownUndelivered` / `withoutUndeliveredPrompts` / `reopenPlanReviewCard`)期限 0.90.0 → 0.91.0 —— 删行期限按「终端删掉包装之后的下一个本包版本」定(前两只在终端消费本版的账本绑定方法后删,第三只换读本包 0.83.4 起的读点后删);「只续已有会话」被拒粗码读法的退役登记复核期 0.90.0 → 0.91.0(服务端 7.114.0 的两处拒绝尚未挂码)。
155
+
156
+ ## 0.89.0(2026-10-03)
157
+
158
+ > 主题:**minor** —— 七项同发(按票序)。① **引擎 7.38 提货**(CC-282):开发依赖换钉引擎 `~7.38.2`;通告码册 81 → 86(`task.tool_turn_incomplete` 与四只服务端自铸通告码入册),引擎码册自带的铸方表接手服务端自铸码的受众,本包手写的四行受众表退役、`SERVER_NOTICE_AUDIENCE` 退出根入口;「工具轮不完整」与「用户输入没被用上」两族通告各有事实读器,后者另有一句用户面话;终局失败带的服务商拒绝详情窄读,并给「改了重发」判定口;steer 账本写不进的 503(`steering.ledger_unavailable`)归「原文稍后重发」一档,主 run / 自愈 / 子代三条 steer 腿读同一张码表;请求装配回执的省略成因短语口。② **审批四面问类两位**(CC-284):活卡帧、待决行、卡与运维队列行上的 `askClass` / `classes`。③ **请求键 `disableSkills`**(CC-277):这一发一只技能都不装。④ **hooks 设置来源条目的唯一执行者**(CC-287):设置来源条目与插件条目共用一只判定,每条恰有一个执行者,另给本端跳过口。⑤ **凭据被拒判官上根入口**(CC-289)。⑥ **服务端 7.111.0 两项**(CC-282 余项):`wiring_manifest` 接线回执新段 `instructions`(这条腿准备时项目记忆加载器选中的指令文件),只带这一段的帧开始出事件;子代转向成功结局带受理 id `messageId`。⑦ **展示出口对无标签裸 `Token <值>` / `token <值>` 形照遮**(CC-290):`token` 进方案词网,与 `Bearer` / `basic` 同分隔、同放行判法;地址路径以 `/token` 收尾后接三位 HTTP 状态码的日志行形放行。**为什么是 minor**:八只新顶层导出(`readToolTurnIncomplete` / `readUserInputUndrained` / `userInputUndrainedNotice` / `providerRejectionResend` / `taskRequestOmissionCausePhrase` / `disableSkillsDeclaration` / `settingsHooksKeptLocally` / `isReadCredentialRefusal`);根入口删一名 `SERVER_NOTICE_AUDIENCE`(🔴 型面 BREAKING;本机检索四端源码零读点,改用 `noticeAudienceOf`);🔴 对下列联合 / 闭集做穷尽 `switch` / `Record` 的 TypeScript 端编译红一次:`ControlSafetyCode` +1 员(`ledger_unavailable`)、`EngineNoticeFactsCode` +3 员(`EngineNoticeFacts` 另 +3 臂)、子代 steer 结局联合 +1 臂(`reason: 'not-delivered'`)、`PluginHookReason` +6 词与 `PluginHookExclusionReason` +1 词(见 Changed 第 2 / 3 / 8 条);可选位 additive:`ApprovalCardRequest` / `ToolPermissionRequest` / `ToolApprovalFrame` 各 +2 位(`askClass` / `classes`)、`readRunTerminal` 的 `failed` 臂 +`detail?`、`HooksWirePlan` +2 数组(判形口对缺这两只的计划按空数组收下:按 0.88.0 型面拼 / 派生计划的 JS 宿主零改动;TypeScript 自造计划 / 引擎事实字面量要补位)/ `HooksWireEngineFacts` +1 位 / `HooksWirePlanOptions` +2 可选入参、`TaskRequestInput.disableSkills?`、`WiringManifestChromeEvent` / `WiringManifestView` 各 +1 可选位 `instructions?`、子代转向成功结局 +1 可选位 `messageId?`;通告码册长度与受众来源、自愈 steer 腿的 503 判定、审批键表长度、交互车道上设置来源 hook 的请求体与执行者、展示出口对无标签 `token` 方案词形的输出字节等**已发导出的可观察变化**在 Changed 逐条单列(写明谁要跟)。根公面运行期导出 1372 → 1379(+8 −1);测试钩 62 不变;公面类型名 942 → 952(+10);超集键 +1(`_sema_instructions`);零新投影臂;请求装配车道表 45 → 46 行;`ENGINE_NOTICE_CODES` 81 → 86;`ENGINE_NOTICE_FACT_READERS` 17 → 20 行(用户面 13 → 16,运维面 4 不变);`PLUGIN_HOOK_REASONS` 13 → 19、`PLUGIN_HOOK_EXCLUSION_REASONS` 5 → 6;`TOOL_APPROVAL_FRAME_KEYS_MIRROR` 31 → 33、`TOOL_PERMISSION_REQUEST_KEYS` 14 → 16;peer sdk 地板 `>=12.0.1` 不动;开发依赖引擎 `~7.37.1` → `~7.38.2`(构建期,不进运行期依赖)。
159
+
160
+ ### Added
161
+
162
+ - **`task.tool_turn_incomplete` 的事实读器 `readToolTurnIncomplete(notice)`**(CC-282;接入文档 **§115 TI-1 … TI-3**)⇒ `{ cause, count, toolCallIds?, sessionId, runId } | undefined`,挂进 `readEngineNoticeFacts`(受众 `user`)。引擎 7.38.0 起,一条 run 里模型这一轮的工具调用没成形(参数没写完就被截断 / 没有工具名 / 流里有读不出的帧被丢掉)或更早的调用没有记录到结果时,告诉用户一次(每个成因每条 run 至多一次)。`cause` 按开集透传(引擎今天四词 `truncated` / `unnamed` / `bad_frame` / `missing_result_synthesized`,型 `ToolTurnIncompleteCause`;表外词原样带回);`count` 正整数;`toolCallIds` 只在引擎给出可回显的调用 id 时在场(冻结副本)。`cause` / `count` / `sessionId` / `runId` 任一缺席或坏形 ⇒ 整只 `undefined`;`toolCallIds` 坏形只省这一键。只认自有属性、每格只读一次、永不抛。服务端 7.110.0 起这一码才上会话流(KL-365)。
163
+ - **用户输入没被用上:`readUserInputUndrained(notice)` + `userInputUndrainedNotice(facts)`**(CC-282;**§115 UI-1 … UI-6**):
164
+ - `readUserInputUndrained` 一只读器认两码 `task.user_steer_undrained` / `task.user_followup_undrained`(都挂进派发表,受众 `user`)⇒ `{ kind: 'steer' | 'followUp', count, cause?, taskId?, sessionId?, runId? } | undefined`。`kind` 由**码**定;`count` 是没被用上的条数(正整数,steer 码读 `steer`、follow-up 码读 `followUp`),读不出 ⇒ 整只 `undefined`;其余各位在场才交、坏形只省那一位。`cause` 开集透传(引擎 7.38.0 起 steer 码上两词:`leg_end` 引擎收场时还没用上 / `crashed` 服务端 7.110.0 起、受理那条 steer 的服务端进程在 run 收场前停了;型 `UserSteerUndrainedCause`);**缺席不补** —— steer 码缺 `cause` 是 7.38.0 之前的引擎,不等于 `leg_end`(KL-363)。`crashed` 那一臂恒无 `runId`(跨进程没有那条 run 的句柄),不是坏形。
165
+ - `userInputUndrainedNotice(facts)` ⇒ `string | undefined`:这一条的用户面一句,按 `kind` × `cause` 分四句 —— steer × `leg_end`「N 条在 run 进行中发的消息在 run 结束前没被用上、不会再投递;还需要就再发」;steer × `crashed`「N 条发给先前那条 run 的消息受理过,但服务端在那条 run 结束前停了,用没用上不知道 —— 先看那条 run 的记录与结果再决定要不要重发」(**不说**「没用上」;KL-362);follow-up「N 条排队的 follow-up 在 run 结束前没被用上、不会再投递;还需要就再发」;其余(表外 `cause`、steer 码缺 `cause`)「N 条消息可能没被用上,原因本版认不出 —— 先看记录再重发」。只说条数,不引用任何用户正文,也不带 id。对读器交出的读数恒有一句;读不懂的入参(`kind` 表外 / 条数不是正整数 / 读它就抛)⇒ `undefined`,不编句。
166
+ - 去重(本包不铸去重键):同一条告知 run 的流内 `(code, taskId)` 恰一帧;跨告知 run 可以再说一次 ⇒ 到一帧渲一帧、条数相加;重放按事件序号去重 —— **不要**按 `code + taskId` 跨流去重。引擎 7.39.0 预告的「子代收场没用上的输入在父会话里再说一条」那一位本版不读(KL-364)。
167
+ - **终局失败带的服务商拒绝详情**(CC-282;**§115 PR-1**):`readRunTerminal` 的 `failed` 臂新增可选位 `detail?: RunTerminalFailureDetail`(`{ kind, status?, code? }`)。服务端 ≥ 7.110.0、引擎 7.38 起,模型服务商拒绝了这次请求(HTTP 4xx)时在场:`kind: "provider_rejected"`,`status` 是服务商的 HTTP 状态码,`code` 是服务商自己给的那个词(有才带)。窄读规则:`kind` 是非空串(开集,表外词原样带回);`status` 是 100–599 的整数;`code` 是非空串;`kind` 为 `provider_rejected` 而状态码缺席、坏形或不在 400–599(铸点只给 4xx;`200` / `302` 一类不可能是服务商拒绝)⇒ 整只 `detail` 缺席,别的 `kind` 上的状态码仍收 100–599。只读自有数据位;读属性就抛 ⇒ 缺席,读器不抛。只在因由形(`result.terminal`)上读,扁平形不读。没有 `detail` 的失败终局,读数与 0.88.0 逐字节相同(不出现 `detail: undefined` 键)。CC 形结果帧(`doneToSdkResult`)不投这一位,带不带 `detail` 投影结果相同。
168
+ - **「改了重发」判定口 `providerRejectionResend(detail)`** ⇒ `{ resend: 'edit_and_resend' | 'not_by_editing'; text } | undefined`(CC-282;**§115 PR-2**),**只读状态码**:400 / 413 / 422 ⇒ `edit_and_resend`,句子 `The model provider rejected this request as sent (HTTP <status>). Change it — for example shorten it or remove an attachment — and send it again.`;其余一切 ⇒ `not_by_editing`,句子按档给出路,前半句同为 `The model provider refused this request (HTTP <status>)`:401 / 403 接 `: check the provider credentials or access for this account.`;404 接 `: the model is not available from this provider — choose another model.`;429 接 `: the provider is rate-limiting this account — wait and try again.`;5xx 接 `: the provider reported an internal error — try again later.`;其余(408 / 409 / 451 与表外状态码)接 ` for a reason that editing it will not fix — check the provider account or try again later.`。`detail` 缺席 / `null` / 不是 `provider_rejected` / 状态码读不出 / 读属性就抛 ⇒ `undefined`(说不出,不是「不能改了重发」)。服务商的 `code` 不进句子。只说「改了再发有望过」,不保证过(KL-376)。
169
+ - **省略成因短语口 `taskRequestOmissionCausePhrase(cause)`** ⇒ `string`(CC-282 g;**§115 OP-1**):请求装配回执成因的**从句**(小写起头、不带句点、不含「没发出去」那半句),给已有自己「没发出去」行形的端接在后面用;读不出 / 表外 ⇒ `for a reason this version does not recognize`。纯函数、绝不抛;与整句表同一张表派生。`other_channel` 的从句接在「这一次没发出去」之后不是逐字真 —— 另一步可能发了同一位(KL-359)。
170
+ - **审批卡与座位请求上的问类两位 `askClass` / `classes`**(CC-284;**§115 AC-1 … AC-6**):服务端 7.109.0 起,引擎给一次审批问盖的「这一问是哪一类」(`askClass`,对外说的那一个类)与「这一问属于的全部类」(`classes`,首员即 `askClass`)出现在活卡帧、待决行的整帧、卡面与运维队列行上。本版三只型各多两只可选位 —— 卡口入参 `ApprovalCardRequest`、座位请求 `ToolPermissionRequest`、活卡帧 `ToolApprovalFrame` —— 由**同一只**成对窄读填:活卡帧腿(待决行 `livePending[].frame` 经它出卡)、耐久待决行腿、卡 → 座位过境口 `toolPermissionRequestAskBits(card)`(出参多这两位)。
171
+ - 读法:两位都是对象**自有**的键,`askClass` 非空串,`classes` 是非空数组、每员非空串、无重复员、首员 === `askClass` ⇒ 原样带上(`classes` 是冻结副本,顺序是服务端交出的序);任一条不过 ⇒ **两位一起不带**(只有一半时只丢不补,不会拿 `askClass` 造一只 `[askClass]`);两位都缺 ⇒ 不带。
172
+ - 🔴 **缺席不是「普通问」**:缺席 = 服务端 < 7.109.0 / 该版本之前就已停下的那只问 / 引擎不盖类的站 / 服务端判坏形已丢。`ordinary` 是引擎闭集里的一个真词,只在在场时出现。
173
+ - 🔴 **开集、不重排**:本包不判词在不在引擎的类词表里(下一版引擎预告加类),端按词分支必须带 `default`;顺序原样(服务端 7.110.0 起按引擎规范序交出,7.109.0 原样交出;KL-360)。带重复员的一对本包两位都丢(比服务端 7.109.0 严;KL-361)。
174
+ - `approval_request` 卡面(呈卡帧与断连重放帧)上同一对本来就随信封原样到端(0.65.0 起本包不窄读那一面),本版无改动。门记录(`gateOutcomeOf`)上模式放行 / 模式拒绝两臂的同名两位读法不变(那两位由引擎在门记录上铸,与卡面不是同一铸点)。
175
+ - **`disableSkillsDeclaration(want, baseUrl)`** ⇒ `DisableSkillsDeclaration`(CC-277;**§115 DS-4**):请求键 `disableSkills`(这一发一只技能都不装 —— 部署的技能、调用方给的技能、agent 定义里的技能一个都不进引擎;其余工具照挂)的唯一取值口。读通用能力缓存的 `disableSkills` 位:读数为真 ⇒ 片段 `{ disableSkills: true }`;没报(服务端 ≤ 7.108.0)/ 为假 / 本进程还没读到 / 读不懂 ⇒ 空片段 + `withheld: { cause: 'not_reported' | 'unsupported' | 'unprobed' | 'unreadable', text }`(`text` 是一句给用户看的话,四句互异,起头 `Skills were not turned off for this request:`)。不发的理由:不认这一键的服务端对**整份**请求 400,不是忽略。意图 `false` / 缺席 ⇒ 空片段、无回执;意图是别的值(`'yes'` / `1` …)⇒ `TypeError`(先于能力位判,不回显值)。产物冻结。能力还没读到时提交的那一条不关技能(给一句话);端先 `await engineCapsSettled(baseUrl)` 再取片段可消除(KL-357)。
176
+ - **车道表 +1 行 `disableSkills`**(CC-277;45 → 46;**§115 DS-1**):interactive / print 有座、live 门后;utility 无座(同 `skills` 一行)。`TaskRequestInput.disableSkills?: true`(型只收字面 `true`)。
177
+ - **hooks 设置来源条目的本端跳过口 `settingsHooksKeptLocally(plan, event, group, opts?)`**(CC-287;**§115 HK-5**):客户端执行器跑一组设置来源 hook 之前调一次,拿回该跑的那几只。按内容认条目(同 matcher ∧ 同条目身份;matcher 缺席 / 空串 / `*` 同义 —— 都是全匹配),只对照计划的请求体;没有可跳的时返回同一个数组引用。压缩前后两事件收 `opts.engineCompaction`(`'not_performed'` ⇒ 引擎这一次没压,客户端照跑)。请求体一侧只认自有键(原型链上的键不随请求过境);客户端组与条目按属性访问读 —— 客户端执行器读到什么就按什么比(类实例、原型上的取值器照读)。计划缺 `settingsExcluded`(按 0.88.0 型面拼 / 派生的计划)按空数组照比请求体,与 `hooksForWire({ plan })` 收下这类计划同一口径(随请求发出的那几只客户端认得出、不跑第二次);`settingsExcluded` 在场而不是数组 ⇒ 读不懂,客户端照跑。
178
+ - 计划入参 +2 可选位:`shellHookTypesByEvent`(每个已报事件上客户端执行器能跑的 hook 型;🔴 报了事件的宿主请与换钉同批交。缺席 ⇒ 设置来源条目:command / http 按事件(报了 ⇒ 客户端能跑)、prompt / agent 视为客户端跑不了 —— 留在请求体上交给引擎;插件条目:报了事件即全型,与上一版同)、`promptAuthoredByUser`(`false` ⇒ 这一发不是用户写的,`UserPromptSubmit` 条目两源都不发、客户端也不跑)。
179
+ - 计划 +2 数组:`settingsVerdicts`(设置来源条目的执行者与依据)、`settingsExcluded`(`hooksForWire({ plan })` 的判形口与跳过口 `settingsHooksKeptLocally` 对缺这两只的计划同按空数组收下,在场就必须是数组);引擎事实 +1 位 `hooksCapable`(`taskSettings.hooks` 三态:读到 `true` / 显式 `false` / 没读到或没报 ⇒ `null`)。
180
+ - 判定依据闭集 `PLUGIN_HOOK_REASONS` +6(`engine_hooks_off` / `engine_hooks_unknown` / `engine_type_skipped`〔PowerShell 形 command,确定〕/ `engine_llm_limit`〔本事件第五只起的 prompt / agent,引擎可能跳过〕/ `engine_unconfirmed` / `engine_elsewhere`),筛掉原因 `PLUGIN_HOOK_EXCLUSION_REASONS` +1(`prompt_not_user_authored`),各配一句;按词穷尽分支的端编译红一次。
181
+ - **凭据被拒判官上根入口**(CC-289;**§115 CR-1**):`isReadCredentialRefusal(e)` 按名从根入口导出(此前只在包内两处读口之间共用,根入口只有那一句话 `READ_CREDENTIAL_NOT_ACCEPTED_NOTICE`)。零行为变化,射程不动:状态 401 且码为 `auth.unauthorized` 或无码 / 空码才答 `true`;401 上的 `auth.principal_required` / `principal_unverified`(身份类)、403、407、别的状态一律答 `false`;结构读、永不抛。端侧读 fleet 流时「凡 401 记一次被拒」可改调它 —— 同一只判官三处共用(workflow 监视器、后台视图 fleet 源、端侧 fleet 流),不另立 fleet 专用分类口。去抖(几次、多久)与按凭据来源出的句子仍归宿主(那是宿主的会话事实)。
182
+ - **接线回执多一段 `instructions`**(CC-282 余项;服务端 7.111.0 起;接入文档 **§115 IN-1 … IN-4**):`wiring_manifest` chrome 臂(`WiringManifestChromeEvent`)与非流式提交回执视图(`WiringManifestView`,`readSubmitWiringManifest`)加可选位 `instructions?: { readonly selected: readonly string[] }` —— 这条腿准备时,项目记忆加载器选中的指令文件(相对工作目录的拼写;今天的候选是 `CLAUDE.md` / `.claude/CLAUDE.md` / `AGENTS.md` / `.claude/AGENTS.md`,首中即选,所以今天至多一员)。读法:在场 ⇒ 原样交出冻结副本(段对象与数组都冻结,不与入参共享引用);`selected: []` 原样交出 = 找过了、一个都没选中;**整段缺席 = 这条腿没有关于指令文件的陈述**(老服务端、部署没接加载器、没有执行环境的腿、工作目录不是本机绝对目录、委派子代腿),不是「没有指令文件」,不补键。坏形(不是对象 / `selected` 不是数组 / 成员不是非空串 / 数组有洞)⇒ 只丢这一段、同帧别段照交;成员按开集原字节交(不按今天的四个候选收窄,不判段长;KL-380)。报的是这条腿准备时读到的那一份,不是盘上此刻。超集键 `_sema_instructions`。根公面运行期导出不变。
183
+ - **子代转向成功结局带受理 id**(CC-282 余项;服务端 7.111.0 起;**§115 MI-1**):`steerEngineSubagent` 的 `{ ok: true, receipt }` 结局,在 200 回执带自有非空串 `messageId` 时原样多带 `messageId` —— 这次转向在服务端用户输入账本里的受理 id,与会话读面上「受理了、没用上」那一行的 `messageId` 是同一个值。缺席 = 老服务端(子代转向不经账本)或回执没带;空串 / 非串 / 原型链上的同名键 / 读取时抛 ⇒ 不带;`ok` / `receipt` 逐字节不变。续聊已结束子代(`resumeSettledSubagent`)的回执没有这一位(服务端只在转向上铸)。本包只原样交、不做关联(KL-381)。
184
+ - 公面合计:根入口运行期导出 +8 −1(CC-282 `readToolTurnIncomplete` / `readUserInputUndrained` / `userInputUndrainedNotice` / `providerRejectionResend` / `taskRequestOmissionCausePhrase`,删 `SERVER_NOTICE_AUDIENCE`;CC-277 `disableSkillsDeclaration`;CC-287 `settingsHooksKeptLocally`;CC-289 `isReadCredentialRefusal`;CC-284 零新名);测试钩不变;公面类型名 +10(`ToolTurnIncompleteCause` / `ToolTurnIncompleteFactsView` / `UserSteerUndrainedCause` / `UserInputUndrainedFactsView`;`RunTerminalFailureDetail` / `ProviderRejectionResend` / `SubagentSteerNotDelivered`;`DisableSkillsDeclaration`;`SettingsHookVerdict` / `SettingsHookExclusion`);`TaskRequestInput` +1 可选位;`ApprovalCardRequest` / `ToolPermissionRequest` / `ToolApprovalFrame` 各 +2 可选位;服务端 7.111.0 两项零新名。
185
+
186
+ ### Removed
187
+
188
+ - 🔴 **根入口删 `SERVER_NOTICE_AUDIENCE`**(CC-282;型面 BREAKING;**§115 NM-3**):这张「服务端自铸通告码 → 受众」四行表的事实,引擎 7.38.0 起由引擎码册自己承载(四码入码册,受众进引擎受众表、铸方记服务端),本包不再持第二份。`engineNoticeInCatalog` / `noticeAudienceOf` 只查引擎码册生成物,四码的答案逐码同 0.88.0(`instructions.source_changed` / `session.records_skipped` / `server.model_unreachable` ⇒ `user`,`memory.layer_locked_legacy` ⇒ `operator`,全部在册)。**谁要跟**:按表遍历过它的端改用 `noticeAudienceOf(code)`(本机检索四端源码零读点)。名字进已退役名账,接入文档活段退役名录 §2z 同批加一行。
189
+
190
+ ### Changed
191
+
192
+ 🔴 **已发导出的可观察变化(逐条;按旧行为断言过的测试请按接入文档 §115a′ 改锚)**:
193
+
194
+ 1. **通告码册 81 → 86**(CC-282;开发依赖引擎 `~7.37.1` → `~7.38.2`;**§115 NM-1 / NM-2 / NM-4**):`ENGINE_NOTICE_CODES` / `ENGINE_NOTICE_AUDIENCE` 收进 `task.tool_turn_incomplete`(`user`)与四只服务端自铸码。随之 `engineNoticeInCatalog('task.tool_turn_incomplete')` 由 `false` 改答 `true`、`noticeAudienceOf` 由 `'operator'`(表外保守缺省)改答 `'user'`。四只服务端码的在册 / 受众答案不变(来源从本包手写表换成引擎码册)。`ENGINE_NOTICE_CODES` 里 `task.tool_turn_incomplete` 排在 `task.interrupt_unconsumed` 与 `approval.read_root_granted` 之间(引擎元组序)。**谁要跟**:按「码册八十一码」或「`approval.read_root_granted` 紧跟 `task.interrupt_unconsumed`」断言的格改锚(§115a′ 第 1 条)。
195
+ 2. **按码派发口多认三码**(CC-282;**§115 TI-1 / UI-1**):`readEngineNoticeFacts` 对 `task.tool_turn_incomplete` / `task.user_steer_undrained` / `task.user_followup_undrained` 由 `undefined` 改答 `{ code, audience: 'user', facts }`;派发表 17 → 20 行,用户面码 13 → 16(运维面 4 不变);`EngineNoticeFactsCode` 联合 +3 员 —— 对它做穷尽 `switch` / 穷尽 `Record` 的 TypeScript 端**编译红一次**(本机检索四端零处)。
196
+ 3. **steer 账本 503 归「原文稍后重发」一档,三条腿读同一张码表**(CC-282;**§115 SL-1 … SL-4**):
197
+ - `ControlSafetyCode` +1 员 `ledger_unavailable`(🔴 对它做穷尽 `switch` 的端编译红一次)。`steering.ledger_unavailable`(服务端写不进用户输入账本 ⇒ 503,这次输入一个字节都没交给引擎)由开集位 `steering_other` 改归这一位(与另两条腿同一合取:状态码 503 ∧ 码或类名;码或类名在而状态码对不上 —— 502、状态码是串、没有状态码 —— 仍落 `steering_other`),`ControlSafetyError.message` = `steering.ledger_unavailable — the server could not record this steer in its user-input ledger and refused it before anything reached the engine — the input was NOT delivered; resend the same text later (the same Idempotency-Key is fine)`。错误对象上码被剥掉时,按类名 `SteeringLedgerUnavailableError`(sdk 15.2.0 起)同认(更早的 sdk 造的是基类,认不出,KL-378)。其余八码的判别位与句子逐字节不变。 `steering_other` 那一句按状态码分两句:4xx(服务端收到、解析、明确拒)上仍是 0.88.0 原句「the steer did NOT land」;5xx / 状态码是串 / 没有状态码上改说「送达未知、别当它确知被丢而重发」(`ControlSafetyError.message` 的后半句在这几形上字节变;码表外的 `steering.*` 与「码在而状态码不是 503」两形都落这一位,同样按状态码取句)。`atMostOnceFailureClass`(自愈 steer 腿与 cancel 腿共用的送达判定)读状态码与主 run / 子代两腿同口(`status ?? statusCode`,数值才算):`{ statusCode: <4xx> }` 形由 `unknown` 改答 `rejected`(**§115a′ 第 14 条**)。
198
+ - 自愈 steer 腿(`atMostOnceFailureClass`):**503 且码为 `steering.ledger_unavailable`** ⇒ `rejected`(确知没送到);其余 5xx(含不带码的 503、带别的码的 503)仍是 `unknown`。用户可见:自愈三选卡 steer 腿撞上这一形,行文由「可能已送到、先观察」改为「没送到,可以再发」(用户形行首措辞的残留见 KL-377)。
199
+ - 子代 steer 结局联合 +1 臂 `SubagentSteerNotDelivered` = `{ ok: false, reason: 'not-delivered', safety: 'ledger_unavailable', detail }`,`detail` 是上面同一句处置。条件与自愈腿同一判定(503 且该码;状态码与自愈腿同读 `status`,缺席时读 `statusCode`);修前同一形答 `{ ok: false, reason: 'error', detail: '503' }`。🔴 对 `reason` 做穷尽分支的端编译红一次。`ledger_unavailable` 在主 run steer / interrupt 上自服务端 7.110.0 起出现,子代 steer 自服务端 7.111.0 起;更老的服务端在同一形上答 200。
200
+ 4. **`readRunTerminal` 的 `failed` 臂多一个可选位 `detail?`**(CC-282;**§115 PR-1 / PR-4**):见 Added。按「`failed` 臂键集恰为 …」断言的格加这一键(缺席时读数与 0.88.0 逐字节同)。
201
+ 5. **审批键表 31 → 33 / 14 → 16**(CC-284;**§115 AC-4**):`TOOL_APPROVAL_FRAME_KEYS_MIRROR` 31 → 33 键、`TOOL_PERMISSION_REQUEST_KEYS` 14 → 16 键,各 +`askClass` / `classes`。按「键表恰为 N 项 / 逐元素等于某份清单」断言的测试格加这两键;`toolPermissionRequestAskBits` 的出参在卡入参带一对时多两键(按「出参键集恰为 …」断言的格同改);手造卡上 `classes` 的取值器会抛时过境口原样抛(与 `origin` 取值器同律,不吞宿主异常;0.88.0 不读这一位,答 `{}`)。不带问类的卡、帧、行上所有出参逐字节同 0.88.0。
202
+ 6. **请求装配对 `disableSkills`**(CC-277;**§115 DS-1 … DS-3**):
203
+ - `buildTaskRequest` / `assembleTaskRequest`:`disableSkills: true` 上请求体;`false` / `undefined` / `null` 不发、不进回执;非布尔值 `TypeError`(不回显值);`disableSkills: true` 与非空 `skills` 或入参上任一非空 `agents[].skills` 同交 ⇒ `TypeError`,句子点名两键、说二选一、不回显技能名(上游对这一组合 400 `request.field_conflict`;KL-358)。两类拒绝都不分车道、不受 live 门。修前这一键是表外键 ⇒ 任何值都 `TypeError`(「不认识的键」那一句)。
204
+ - `applyLiveRequestDefaults`:落位 `agents` 之后,若请求体带 `disableSkills: true` 而落位后的 `agents`(宿主给的或请求体自带的)里任一定义带非空 `skills` ⇒ `TypeError`(同一只判定)。这是本函数唯一会抛的一形;不带这一键的请求逐字节同 0.88.0。
205
+ - `TASK_REQUEST_OMISSION_CAUSE_NOTICES`(**§115 OP-2**):改由一张两列表(前导 + 成因从句)派生;四句与 `taskRequestOmissionCauseNotice` 的表外兜底句**逐字节同 0.88.0**,型不变。
206
+ 7. **交互车道上设置来源 hook 的请求体与执行者**(CC-287;**§115 HK-1 … HK-10**):交互车道上,用户设置里的 `UserPromptSubmit` / `PreCompact` / `PostCompact` hook 此前既由客户端自己的执行器跑、又原样随请求交给引擎再跑一遍。现在 `hooksWirePlan()` 对设置来源条目与插件条目用同一只判定定唯一执行者:引擎确定会跑且引擎是本客户端在本机起的(或本客户端跑不了这一只)⇒ 交给引擎、客户端跳过;否则 ⇒ 客户端跑、不随请求发。判定只覆盖引擎点亮的九个事件上的 command / http / prompt / agent 条目;其余事件、形坏(含必要字段坏形:`command` / `url` / `prompt` 不是非空串)与表外型的条目不判定,请求体逐字节同上一版(服务端照旧整份拒)。
207
+ - 部署要身份(`taskSettings.hooks: false`)时,这些事件上客户端跑得了的条目同样不上请求体(引擎本来整份忽略)。`-p` 车道、不报本地事件的宿主与不传计划的 `hooksForWire()` 的请求体逐字节同 0.88.0。
208
+ - 插件条目:客户端报了型表(`shellHookTypesByEvent`)时,「客户端执行」只给它真能跑的型(例:客户端跑不了 agent 型 ⇒ 改判不跑、进「不会执行」清单);`promptAuthoredByUser: false` 时插件的 `UserPromptSubmit` 条目同样排除。端不交型表时插件判定同 0.88.0。
209
+ - 压缩前后两事件(`PreCompact` / `PostCompact`):引擎可能跑的设置条目(能力真而不确认引擎是本机自起 / 能力没读到)不判给客户端、照随请求发(`engine_unconfirmed`)—— 引擎在 run 中途自动压缩时只跑请求带来的 hooks,客户端的执行器没有机会先跑;客户端发起的压缩仍经跳过口 + `engineCompaction` 去重。引擎确定不跑的(能力 false / PowerShell 形)与本事件第五只起的 prompt / agent 条目(引擎在自动压缩里本来也超限不跑)客户端能跑就客户端跑(KL-368 / KL-369)。
210
+ - 「不会执行」清单(`hooksNotRunNotice`)多列设置来源判为不跑的条目(PowerShell 形 command;引擎整份忽略请求带来的 hooks 且客户端跑不了)。
211
+ - 🔴 可见变化:判给引擎的 hook 子进程看到的是引擎的环境(引擎白名单的基础变量、`CLAUDE_PROJECT_DIR` 与设置里的 `env`),不是客户端进程的环境;依赖本机环境变量的 hook 请把变量放进设置的 `env`(KL-370)。被引擎侧 `UserPromptSubmit` 拦下的主提交本版端上只见 `blocked` 终局 + 文字(KL-371)。端接上本端跳过口之前,本端执行器照旧跑,仍是两次;接了才一次。
212
+ 8. **hooks 判定依据闭集**(CC-287;**§115 HK-6**):`PLUGIN_HOOK_REASONS` 13 → 19、`PLUGIN_HOOK_EXCLUSION_REASONS` 5 → 6(见 Added)。对 `PluginHookReason` / `PluginHookExclusionReason` 做穷尽 `switch` / `Record` 的 TypeScript 端编译红一次。
213
+ 9. **开发依赖引擎 `~7.37.1` → `~7.38.2`**(CC-282;构建期,不进运行期依赖):构建期生成的引擎事实表按 7.38.2 重生成,生成器自本版起另读引擎的通告铸方表与两只成因闭集(`task.user_steer_undrained` / `task.tool_turn_incomplete`)并与码册逐键对照,缺行即拒生成;7.38.1 / 7.38.2 相对 7.38.0 闭集零变化。引擎自 7.38 起把闭集数组写成冻结形(`Object.freeze([...])`),本包读口不就地改任何入参,对冻结与未冻结入参同答。
214
+ 10. **只带 `instructions` 一段的 `wiring_manifest` 帧成臂**(CC-282 余项;**§115 IN-4**):0.88.0 把这样的帧投影成 `none / not_in_slice`(不出 chrome 事件),非流式回执读成 `unreadable`;本版出 chrome 事件 / 读成 `manifest`(那一段就是读数)。服务端 7.111.0 上,一条腿若在本包投影的十二段里只报了这一段,0.88.0 会整帧不出事件。连带的两处可观察变化见接入文档 §115a′ 第 8 条(print 车道名册判定口对这样的帧答 `no-roster`;一次性任务回落读提交回执时换一句拒用说明)。
215
+ 11. **开发依赖 `@sema-agent/settings-schema` `^6.0.0` → `^7.0.1`**(CC-296;构建期,不进运行期依赖、不进 `peerDependencies`、不出包;**§115 TY-6**):本包 `src/` 对它零 import,7.0.0 删除 / 改形的 WorkerSpec 面(`runtime.sessionBackend` / `memoryBackend` / `db`、`coords.tidbHost` / `tidbPort` / `tidbUser`、`secretRefs.tidbPasswordEnv`、`remote-docker` 变体)在本包 `src/` 零读点;换钉只影响读该包产物的六道常驻门(`run-additive-key-passthrough-test.mjs` / `run-cloud-effective-projection-test.mjs` / `run-display-untrusted-projection-test.mjs` / `run-layering-shadow-export-test.mjs` / `run-model-capability-probe-test.mjs` / `run-plugin-hooks-projection-test.mjs`),换钉前后逐格同读,唯一可见差异是 `run-additive-key-passthrough-test.mjs` 的 G7v 标签里装着的 major 由 6 变 7;hook 条目必要字段判据所在的 `hooks.js` 两版逐字节相同。终端 1.0.141 先行把自己的依赖换到 7.0.x;G7v 判的是「本包装着的 major ≥ 终端在用的 major」,终端先升而本包不跟时这一格会红,本版换钉后恢复。门侧同批补两处对账(见下 Gates 的两条扩门):上游 hook 必要字段判据与本包判定逐值同答(G-HK29)、`@sema-agent/*` 声明的范围 / lockfile / 装着的版本四处一致(公面门 ⑤c)。
216
+ 12. **通告事实读器与派发口的信封只认自有属性**(**§115 NM-7**;收紧方向):派发表里的每一只事实读器(此前各版已发的十六只 —— `readMcpInjectionDrop` / `readAskUnresolvable` / `readDurableGateUnavailable` / `readSkillsListingTruncated` / `readMcpServerRedialed` / `readReadRootGrantNotice` / `readInstructionsSourceChanged` / `readSessionRecordsSkipped` / 0.86.0 六只 / `readToolTurnRepaired` / `readModelUnreachable` —— 与本版两只)与 `readEngineNoticeFacts` 读通告的 `code` / `detail` 时,原型链上的同名键不再算在场 ⇒ `undefined`(此前派发口按属性访问读这两格、再交给读器,只在原型链上的信封经派发口照读出事实,直读器与派发口不同答);`providerRejectionResend` 读终局读数的 `detail` 同律。来自 JSON 的通告只有自有键,读数不变;按「`Object.create({ code, detail })` 读得出事实」写的测试作废。
217
+
218
+ ### Fixed
219
+
220
+ - **展示出口:无标签的 `Token <值>` / `token <值>` 照遮**(CC-290;接入文档 **§115 DU-7 / DU-10**):`displayUntrusted` / `displayUntrustedMarks`(与本包合成终局行 / 结果帧 `errors[]` 共用的凭据面)此前只把 `token` 当**标签**认(要 `:` / `=`:`token=<值>`、`Token: <值>`),或只在 `Authorization:` 头值里当授权方案认;没有标签的方案词写法 —— `Token <值>`(`Authorization: Token <key>` 一族的头值单独出现时)、命令行 `--token <值>`、`{"auth":"Token <值>"}`、`MCP server failed: Token <值> rejected` —— 只有值本身是已知凭据字面形(`sk-` 前缀且随机段够长、`ghp_…` 等)才遮,`Token sk-l963-…` 一类原样上屏。本版 `token` 与 `bearer` / `basic` 用同一只方案词判法:同一组分隔(ASCII 与 Unicode 空白 —— 含不换行空格 / 表意空格 / 各宽空格 / 谚文填充 / 盲文空点 —— 不可见单元、换行)、同一只值扫描、大小写不分;紧跟在方案词后的普通英文词按放行表原样(`token` 那一张更宽:计量词、生命周期词、系动词 / 助动词、跨行后的句首词 —— `Token count: 1234`、`token expired`、`the token was rejected`、`OAuth token refresh failed: invalid_grant`、`token limit exceeded: 4096`、`Failed to refresh token\nPlease run /login again` 都原样);同一位置能按标签读的(`token:` / `token =` / `"token":`)仍按标签读,输出与上一版同字节。放行表外的词照遮(`token sidecar started` ⇒ `token «redacted:secret» started`、截短回显的值 `Invalid token abcdefgh…` ⇒ `Invalid token «redacted:secret»`、引号包着的放行词也是值 `token "count"` ⇒ `token "«redacted:secret»"`),方向是多遮(KL-382);地址路径以 `/token` 收尾后接三位 HTTP 状态码的日志行形(`POST https://auth.example/oauth/token 400 Bad Request`)原样放行,路径尾后跟别的值照遮;尖括号 / 括号包着的值是占位写法,两版都原样(KL-383);JS / JSON 解析器诊断(`token` 左邻恰是 `unexpected` 加一枚空格:`SyntaxError: Unexpected token '<', "<!DOCTYPE "... is not valid JSON`、`Unexpected token u in JSON at position 0`)整句原样,引号里的单元也不遮;`token indices` 在放行表里;凭据标签的值以 `token` 方案词起头(`"token": "Token https://h/<串>/x"`、`password: Token\u00a0https://h/<串>`)时外层标签整值遮,与 0.88.0 同字节(裸值形 `password: Token <值>` 两只记号并排);`token` 只给它自己的值加遮盖,不改标签与 `bearer` / `basic` 方案词的值怎么读 —— 外层值以别的字符起头再接 `token` 族方案词 + 非 ASCII 空白 + 地址(`Authorization: “Token\u00a0https://h/<串>”`、`` password=`Token\u3000https://h/<串>` ``)、`bearer` / `basic` 的值里接 `token` + 地址(`Bearer Token\u00a0https://h/<串>`、`Bearer “Token\u00a0https://h/<串>”`)、引号值里 `bearer` / `basic` 之后再出现 `token` + 地址(`password: "Bearer x Token https://h/<串>"`),一律与 0.88.0 同字节整值 / 整截遮;ASCII 空格分隔、不加引号的 `password: Token https://h/<串>` 两版都只遮 `Token`、地址按结构显示(既有形,KL-386);标签值写成「`bearer` / `basic` 方案词 + 地址」时地址的主机 / 路径原样显示(0.88.0 既有形,KL-386)。零新公面名。
221
+ - **地址片段里「值 + Unicode 空白 + 方案词 / 标签」的断法与 `,` / `;` 处同判**(CC-290 同批;**§115 DU-8**;只多遮;KL-384):带 scheme 的地址里,query / 片段的值后隔着 Unicode 空白再跟方案词 / 标签时,只有那一对的分隔是 ASCII 空白(值落在片段外)才让给词级面 —— 与 `,` / `;` 处同一只判据;分隔是不换行空格 / 表意空格 / `=`(`https://h/?a=1\u00a0Bearer\u00a0<值>`、`?a=1\u00a0token=<值>&b=2`)时值仍在片段里、按 query 整只遮(只开 URL 结构面的出口 `credentialWords: false` 上一版这几形原样)。
222
+ - **控制串跨行时一遍即落定**(CC-290 同批;**§115 DU-9**;只多遮;KL-385):控制串跨行时屏上读到的那一份内容另扫一次 —— `\u001bP<方案词 / 标签> \n\u001b]8;;h\u001b\` 一类在折平 / 转义形出口上上一版要洗两遍才落定(第二遍才遮 `8`),本版一遍到位,洗两遍 = 洗一遍(上一版同形,不是本版引入)。
223
+
224
+ ### Gates
225
+
226
+ - 扩门 `scripts/run-engine-notice-catalog-test.mjs`(1193 → 1594 格,带新一代与老一代服务端夹具;CC-282 a–d):NM(码册 86 / 受众 / 派发表 / 删名)、TI(工具轮不完整读器)、UI(用户输入没被用上读器与四句;句口与两只读器的信封只认自有属性、follow-up 的保守句名词按 kind 取)新段;G-NM6 改写为就地写入自证(派发表每一码的全形 `detail` 深冻结后与未冻结的同答、未冻结入参读后逐字节不变;引擎包根的冻结闭集数组 96 只喂入全部读口一轮后仍冻结);服务端自铸码对账(IX)两代重写 + 自证;`E3-up` 否定半边加正控(修前尺子抽不出新形码册字面时恒真);常量表识别认 `Object.freeze` 形;G-NM7 —— 派发表每一码 × 四形(`code` / `detail` / 两者只在原型链上、`Object.prototype` 植入)派发口、直读器、句口同答 `undefined`。
227
+ - 扩门 `scripts/run-terminal-cause-projection-test.mjs`(375 → 443 格,带两代服务端夹具;CC-282 e):`PR` 段 —— `detail` 窄读(缺状态码整只丢 / 状态码非整数与越界 / `provider_rejected` 的状态码不在 400–599 整只丢 / 只读自有位 / 读属性就抛 / 扁平形不读 / 缺席时读数逐字节同 0.88.0、不出 `detail: undefined` 键)、`providerRejectionResend` 的状态分档与按档的句子(五档两两互异)、新一代 / 老一代服务端真铸点过境读数;G-PR3e —— `Object.prototype.detail` 植入合形服务商拒绝时判定口对缺席 / 空对象 / 表外 kind 仍答 `undefined`。
228
+ - 扩门 `scripts/run-selfheal-reopen-test.mjs`(704 → 711 格;CC-282 f):G18 —— 自愈 steer 腿「503 ∧ 该码 ⇒ 确知没送到」及其合取两半各一格(500 + 该码 / 无状态码 + 该码 / 503 + 别的码 / 码读不出都仍是送达未知),三选卡行文不再说「可能已送到」。
229
+ - 扩门 `scripts/run-wiring-manifest-projection-test.mjs`(219 → 296 格,带两代服务端夹具与 sdk 15.3.0 / 15.2.0 对拍;CC-282 余项):IN 段(G-IN1 – G-IN8)—— `instructions` 段在场原样冻结副本且不与入参共享引用、`selected:[]` 原样、缺席不折不补键、十四种坏形整段缺席、读取时抛按缺席(同帧别段照交)、只带这一段的帧成臂、成员开集原字节、不经投影口直喂适配层的内部臂再过同一只窄读、视图层与 chrome 臂两型键集相等;服务端 7.111.0 / 7.110.0 发布包真铸链(加载器陈述 → 租户面与 operator 面两只投影器 → 本包)逐字节同,7.110.0 无段;sdk 15.3.0 的事件臂声明可选 `instructions`、15.2.0 没有(夹具与探针树缺席时对应段标为未跑)。
230
+ - 扩门 `scripts/run-submit-wiring-manifest-test.mjs`(34 → 38 格;CC-282 余项):S7a – S7d —— 提交回执只带 `instructions` 一段 ⇒ `manifest`、`selected:[]` 在场、缺席无键、只有坏形 ⇒ `unreadable`。
231
+ - 扩门 `scripts/run-subagent-injected-wire-test.mjs`(155 → 184 格;CC-282 f / 余项):① 子代 steer 503 + 该码 ⇒ `not-delivered` 臂,500 + 该码与 503 + 别的码仍是 `error` 臂(→ 158 格);② MI 段(服务端 7.111.0)—— 成功结局 `messageId`:自有非空串才带,空串 / 数 / `null` / 布尔 / 对象 / 数组 / 原型链上的同名键 / 读取时抛都不带、不抛,回执体坏形走缺省句,`ok` / `receipt` 逐字节不变,注入 client 形与已装目标形同答;服务端 7.111.0 与 7.110.0 两代发布包真路由 × 开发依赖 sdk 与 sdk 15.3.0 两只真 client:7.111.0 的结局 `messageId` 与 200 回执逐字节同、与账本受理的是同一个值,7.110.0 回执无此键、子代转向不经账本、结局无此键;sdk 15.3.0 声明 `SubagentSteerReceipt.messageId?`、15.2.0 没有(→ 184 格)。
232
+ - 扩门 `scripts/run-approval-frame-keys-test.mjs`(139 → 241 格,带三代服务端夹具与新版 SDK 探针树;不带时夹具段与 SDK 对拍段标为未跑;CC-284):帧键镜像 31 → 33,两键按开发依赖 SDK 的锚登记为领先(退出条件:开发依赖 SDK 含这两键的那一版);新版 SDK(≥ 15.2.0)帧键锚与镜像两向相等、卡键锚新增的两键都已在卡入参上;问类两位腿 —— 帧腿在场原样冻结、半对 / 首员不符 / 重复员 / 空数组 / 非串员 / 空串员 / 非数组 / 稀疏 / 原型链上的键或员一律两位都不带、开集词与非规范序原样;耐久待决行腿与座位过境口同判、座位门不为这两位拒整条请求;门记录两臂读法不变;三代服务端夹具真铸点(运维队列行投影 / 出帧处的成对窄读 / 建卡 → 信封 → 重放帧;两代新服务端另走内嵌引擎自己的分类与盖章口)经 JSON 过境后两条卡腿与卡面逐字同服务端交出形:老一代(7.108.0)缺席、首铸代(7.109.0)在场且不重排、规范序代(7.110.0)重排后的序 / 服务端拒了的形缺席。
233
+ - 扩门 `scripts/run-mandated-card-values-test.mjs`(41 → 47 格;CC-284):夹具内嵌引擎 ≥ 7.37.0 时盖章口要引擎自己的分类作参数(修前换到服务端 7.109.0 / 7.110.0 夹具本门在构造期就抛);四类强制卡与普通名单卡上引擎盖的问类两位,经服务端投影后两条卡腿逐字同。
234
+ - 扩门 `scripts/run-live-pending-ask-test.mjs`(92 → 97 格;CC-284):待决行整帧带一对 ⇒ 帧腿卡入参带同值两位;行顶层凭空一对不长出卡位;帧上半对两位都缺席;盲卡形如实缺席。
235
+ - 新门 `scripts/run-disable-skills-wire-test.mjs`(93 格,带两代服务端夹具;CC-277,包侧投影门):构造器(车道表一行 / 三车道 × live 两态 / `false` 与缺席 / 坏值句不回显值〔已撤销代理也只报形状〕/ 与非空 `skills` 或带技能的 `agents` 冲突按名拒 / live 兜底层同判)、片段口五态(真 / 没报 / 假 / 没读到 / 读不懂)、新一代受理面对「`disableSkills:true` + 非空 skills」的 400 与老一代对未知键的 400 两条夹具腿、不带这一键的装配 / 回执 / 座位读数 / 出口判官读数对 0.88.0 发布产物逐字节同(sha256)。
236
+ - 扩门 `scripts/run-task-request-omission-receipt-test.mjs`(535 → 573 格;CC-282 g / CC-277):成因词 4、上游无对位 3 键、车道表 46 行、逐键判别式 48 格 × 车道 3 × live 2;整句 === 前导 + 成因从句、表外 / 异形入参一律落兜底从句不抛、src 里整句字面量零处;四句与兜底句对 0.88.0 发布产物金样逐字节同;终端从句对照读数(终端词集与本包短语逐字不同,预期)。
237
+ - 扩门 `scripts/run-plugin-hooks-projection-test.mjs`(225 → 293 格,`SEMA_SERVER_ROOT` 指向引擎源码树时 295 格;CC-287 / CC-296):H 段 —— G-HK0 穷尽矩阵(设置来源 × 事件 × 型 × 引擎能力 × 自有 × 端形〔含「只报事件、不交型表」〕× 非用户所写 × 压缩〔没交 / 压了 / 没压 / 引擎自动压缩〕,共 2520 份计划,逐格按服务端执行语义 + 本端执行器模型求「这一次一共跑几次」:两边任一真能跑 ⇒ 恰 1、被排除或两边都跑不了 ⇒ 0;引擎自动压缩那一列只有请求体上的条目能跑;能力没读到 × 引擎其实不跑 × 客户端发起、引擎压了的 48 格按 KL-369 取舍期望 0、单独计数;修前 168 格不符)、压缩两事件四形留在请求体与确定理由两形照旧本端跑(G-HK0c / G-HK0d / G-HK0e)、跳过口与计划两只数组的行只认自有属性〔整行与单个键在原型链上各有格〕且本端组读抛不外抛(G-HK27 / G-HK27d)、六键计划照认(G-HK28)、只报事件时设置来源 prompt / agent 照投(G-HK0b)、判定与依据词(G-HK1 – G-HK12 / G-HK14 – G-HK23b)、必要字段坏形不判定(G-HK24)、设置来源条目的承重字段与已装上游受理面逐值同答(G-HK29,CC-296:`command` / `http` / `prompt` / `agent` 四型 × 十二种取值 48 格,期望由已装 `settings-schema` 的 `HooksConfig.safeParse` 现算,上游拒 ⇔ 本包不判定;此前坏形表是手写的、只对本包一侧断言,上游把「非空串、不含 NUL」放宽或收紧一个字节没有任何一格会红;读不到上游契约时这一格标为未跑)、计划两只新数组的坏行(G-HK25)、跳过口 matcher 五形同键(G-HK26)、同条目不同 matcher 各占一位(G-HK8d)与判给本端的 LLM 条目不占引擎位次(G-HK8e)两格(位次的粒度与去重键的粒度)、新一代 / 老一代服务端发布版执行入口夹具(G-HK13:判给引擎的条目计数文件恰 1 行,修前 2 行)、包内每事件 LLM 条目上限与引擎源码及夹具执行器一致(E4)、六键 / 八键计划经投递口 + 跳过口每只恰 1 且计划两位只认自有键(G-HK30 / 30b / 30c / 30d)、客户端组 / 条目是类实例或 `Object.create` 出来的 × 三事件恰 1(G-HK31)、压缩两事件上超限的 prompt / agent 条目 144 份计划 864 格无「谁都不跑」(G-HK0f / 0f-2)。
238
+ - 扩门 `scripts/run-public-surface-test.mjs`(101 → 110 格;CC-296):⑤c —— `package.json` 里每条 `@sema-agent/*` 声明(`dependencies` / `devDependencies` / `peerDependencies` 各自在场的,今天 6 条)四处一致:范围串与 lockfile 根记录的同字段范围串同串、lockfile 里该包的版本满足该范围、`node_modules` 里装着的版本与 lockfile 里的版本一致。此前只比 `@sema-agent/sdk` 一个包:换钉时把范围写回旧值、或装着的不是 lockfile 记的那一版,这道门都是绿的,而装着的那一版正是读该包产物的各门的真实输入。范围写法只认 `^` / `~` / `>=` / 精确四形,认不出 ⇒ 工具坏了(exit 9)、不给产品判词;判据自证两格(范围满足判定的正反例、四处一致判定对伪造样本会说话)与声明条数下限一格。
239
+ - 扩门 `scripts/run-read-credential-refusal-projection-test.mjs`(30 → 52 格,带 sdk 15.x 两代探针树;缺 15.0.0 一代 48 格、两代都缺 44 格;CC-289):C 段 —— 公面判官与包内两处读口是同一只函数、判表逐行同答、三处同答(后台视图 fleet 源 ⟺ 公面判官)、sdk 三代(12.0.1 / 15.2.0 / 15.0.0)由 401 体造出的认证错误对象公面判官答 `true`、身份类两码 / 403 / 407 答 `false`;缺席的一代打 `SKIPPED-SECTION`(`SEMA_SDK15_ROOT` 钉 15.2.0、`SEMA_SDK15_ROOT_OLD` 钉更老的探针树,冒号分隔可多个)。
240
+ - 扩门 `scripts/run-client-core-pure-test.mjs`(→ 4159 格):帧键镜像 33 项;steer 账本 503(G-SL1 / G-SL2 两代 sdk 错误工厂 / G-SL5 其余八码逐字节同 0.88.0〔表外码 4xx 上同 0.88.0 原句〕/ G-SL6 三条 steer 腿对同一抛出物九形逐格同答 / G-SL6b 表外码 × 状态码与 `statusCode` 拼法八形三腿同答)。
241
+ - 扩门 `scripts/run-registry-test.mjs`(③d):棘轮账对**上一发布 tag** 比前缀(此前只对上一次提交比 —— 新账插在旧账之前、提交之后就看不出);取不到 tag 时打 SKIPPED-SECTION;判据正控 +1(新账插到中间)。
242
+ - 稳定门修补(换钉引擎 7.38.x 后同形红的识别):`run-gate-vocabulary-test.mjs` / `run-retired-vocabulary-census-test.mjs` / `run-auto-mode-unavailable-test.mjs` 对引擎闭集数组的读法认 `Object.freeze([...])` 形(判据不变);`run-upstream-tables-test.mjs` 的生成物对账带通告铸方表一行(与码册逐键对照)。
243
+ - 扩门 `scripts/run-display-untrusted-projection-test.mjs`(479 → 541 格;CC-290):H 段 —— 终端给的字节判据(`Token <值>` 不含值 ∧ 含 `«redacted:`)/ 坐实的十形 / 普通英文散文逐句不洗(与凭据两网全关的同选项出口逐字节同)/ 邻形族 / 出口族 / 同位置能按标签读的仍按标签读 / 现状钉(KL-382 表外词多遮、KL-383 尖括号值不认)/ 一轮即不动 / 屏上视图认出的控制串内容同扫 / `/token` 路径尾 + 三位状态码放行 / 引号包着的放行词照遮 / 解析器诊断 `Unexpected token X` 与 `token indices` 原样、`unexpected` 不是左邻时照遮(H13)/ 凭据标签的值以 `token` 方案词起头整值遮(复现三形 + 差分门 N3 原 9 格 + 自造 21 形金样;`bearer` / `basic` 字节不动;H14)/ `token` 只给自己的值加遮盖 —— 外层值以别的字符起头、`bearer` / `basic` 的值里、引号值缝里的 `token` + 非 ASCII 空白 + 地址十形机读口逐字节 = 0.88.0 且全出口不露,ASCII 空格不加引号的既有形回归(H15)。
244
+ - 扩门 `scripts/run-display-untrusted-baseline-diff-test.mjs`(差分池 135923 → 143410 串,20 格不变;CC-290):最小形池另收外层标签 / `bearer`·`basic` 值 × 前缀字符 × `token` 族 × 非 ASCII 空白 × 地址与引号值缝里 `bearer` 之后 `token` + 地址两族 1272 串(带角色进 B1;修前对 0.88.0 凭据位 10368 格);对 0.88.0 发布产物,「上一版遮、本版露」凭据位 0 格、非凭据位 0 格;洗两遍 ≠ 洗一遍 0 / 2007740 格;到改写次数帽 0 / 717050 格。
245
+ - 登记物:根公面基线 1372 → 1379(+8 −1);测试钩 62 不变;超集台账 `docs/type-superset.json` 98 → 99 条(`_sema_instructions`);门清单 `scripts/gates-manifest.json` 171 → 172 条(新门 `disable-skills-wire`),README「Guards」与负控文档由生成器同批重写;`docs/KNOWN-LIMITS.md` KL-357 … KL-390 新增、KL-179 / KL-329 / KL-332 / KL-333 销;退役登记 RL-15 销(`SERVER_NOTICE_AUDIENCE`)。
246
+
247
+ ### Known limits(本版新增)
248
+
249
+ - 通告 / 终局 / steer(CC-282):服务端重启后补发的「用没用上不知道」那一句不能说得更确定(KL-362);引擎 7.38.0 之前的 steer 未用上通告落保守句(KL-363);引擎 7.39.0 预告的子代上报位本版不读(KL-364);服务端 < 7.110.0 不把 `task.tool_turn_incomplete` 放上会话流(KL-365);「改了重发」只读状态码(KL-376);自愈三选卡用户形 steer 腿撞账本 503 时行首措辞仍说引擎(KL-377);码被剥且 sdk < 15.2.0 时专类认不出(KL-378);省略成因 `other_channel` 的从句接在端的「没发出去」之后不逐字真(KL-359)。
250
+ - 审批问类(CC-284):不判成员、不重排(KL-360);带重复员的一对整对丢,比服务端 7.109.0 严(KL-361)。
251
+ - `disableSkills`(CC-277):能力位没读到时第一条请求不关技能(KL-357);与带技能的 agent 定义同交按名拒、本包不替宿主剪(KL-358)。
252
+ - hooks(CC-287):自行嵌入且不给 hook 载体的宿主上 prompt / agent 型设置 hook 静默不跑(KL-366);连非自有 / 远端引擎时只有引擎触发的事件与压缩前后两事件上的设置 hook 在那台机器上跑(KL-367);第五只起的 prompt / agent 条目客户端跑不了时判未确认、跑得了时(压缩两事件同)由客户端跑(KL-368);压缩前后 hook:引擎可能跑的设置条目照投,客户端发起的压缩依赖端交「引擎这次压没压」,能力没读到而引擎其实不跑时那一次谁都不跑(KL-369);判给引擎的 hook 看不到本机终端的环境变量(KL-370);引擎跑的 `UserPromptSubmit` 注入的上下文没有单独一行、被它拦下的主提交只显示 `blocked`(KL-371);端不交型表时设置来源的 prompt / agent 一律交引擎、客户端不跑(引擎这一次不跑时客户端本可跑的 prompt 也不跑;KL-372);端派发前按现算计划做减法的接缝(KL-373);`once` 按任务计(KL-374);`/goal` 的 Stop 钩子与上限 / 跳过口索引(KL-375)。
253
+ - 凭据被拒判官(CC-289):码这一位读取时抛错的手造异常对象按「无码 401」答 `true`(KL-379)。
254
+ - 服务端 7.111.0 两项(CC-282):`instructions.selected` 按开集原字节交(KL-380);子代转向 `messageId` 只原样交、不做关联(KL-381)。
255
+ - 展示出口(CC-290):`token` 方案词后放行表外的词 / 数字 / 反引号变量名 / 截短回显的值多遮一个词(KL-382);尖括号 / 括号包着的值不认(KL-383);只开 URL 结构面的出口里 URL 片段在「Unicode 空白 + 方案词 / 标签」处的断点并入 `,` / `;` 那一只判据,全开出口上方案词 / 标签名并进 query 记号(KL-384);屏上视图认出的控制串内容另扫一次(KL-385);标签值写成「`bearer` / `basic` 方案词 + 地址」时地址的主机 / 路径原样,ASCII 空格分隔、不加引号的 `password: Token https://…` 两版同样显示路径(KL-386)。
256
+ - 既有读法(0.88.0 同,本版不改):失败终局因由的 `code` / `kind` 与插件判定行字段按属性访问读,原型链上的同名键算在场(KL-387);steer 抛出物的状态码 / 码位是读它就抛的取值器时读取错误原样抛出(KL-388);hooks 跳过口客户端一侧按属性访问读,`Object.prototype` 上放着组 / 条目字段名(如 `matcher`)时认不出已发出(KL-390)。
257
+ - 登记物按既定裁定改窗(本版对这些物零改动):同名影子对账门的过渡表里,终端投递事实两只同名读口(`promptKnownUndelivered` / `withoutUndeliveredPrompts`)期限 0.89.0 → 0.90.0 ——下一个 minor 在账本对象上出同判的两只方法,终端改调方法后删包装,这两行随删;十行基线存量的复核期 0.89.0 → 0.91.0(终端排在下一版一次清);过渡物退役登记四行的复核期 0.89.0 → 0.91.0(退役条件未满足)。
258
+ - 完整台账见接入文档 §115 末行「包侧缺口」。
259
+
52
260
  ## 0.88.0(2026-10-02)
53
261
 
54
262
  > 主题:**minor** —— 十票同发(按票序)。① **展示出口凭据面一次扫描**(CC-247):`displayUntrusted` / `displayUntrustedMarks`(与本包合成终局行 / 结果帧 `errors[]` 铸点共用的凭据面)此前是几张识别网**串行改写同一份文本、再洗到不动点**;本版改为在一份只读的判别视图上一遍收齐全部候选(URL 结构 / 无 scheme 的 userinfo / 标签与方案词的值 / PEM 块 / 参数表 / 已知凭据字面形 / 控制串内容),按写死的优先序归并、落地;带凭据的输入在出口内部对落地结果再过一遍,到输出不再变为止(按改写遍数计、帽 8 次;实测遍数(含确认输出不再变的那一遍):差分门的随机 / 穷举 / 文法池与两条已知构造链至多 3 遍,非定向的自造文法串也见到 4 遍(门池收了一只),定向搜索构造的串至多 6 遍,都在帽内;干净文本一遍、逐字节同),一轮即不动对**帽内收敛的输入**由这只循环保证(定向构造可让改写遍数随长度增长;到帽交最后一次改写的输出,再过一遍只多遮不多露;KL-355)。带凭据的输入上输出字节变(凭据位上「多遮 / 记号位置变」,非凭据位上几形少遮);对上一发布产物做五池 × 十五出口全池差分,凭据位(= 本包认得的凭据标签 / 方案词的值位,与 URL 结构位:userinfo / query 值 / 片段)上「上一版遮、本版露」为 0(射程:差分门五池与门内追加的最小形之内;池外仍有上一版遮、本版原样的几形,逐形见 Known limits 口令禁字一条;本包铸点洗过再经展示出口的复合路径另见 KL-317)。② **崩溃收敛 `cause` 认第二个词 `shutdown_before_park`**(CC-218):服务端 7.108.0 起,有序关停截断了一条还没闭的腿时照列收敛行,修前这些行整行计入 `dropped`,本版照常分桶;同版服务端对未被追踪腿的 pending 孤儿改给 `resumeSafe:false`(本包零代码,分桶读数随之变)。③ **`server.model_unreachable` 用户面通告入册**(CC-270 ①):服务端自铸码受众表 +1 行(user)+ 事实读器 `readModelUnreachable`,修前按受众分发的端看不到它。④ **开发依赖换钉引擎 `~7.36.0` → `~7.37.1`**(CC-272):构建期事实表按 7.37.1 重生(通告码册 +1 `context.tool_turn_repaired`,运维面)、放行原因闭集镜像 `GATE_MODE_RELEASE_REASON_WORDS` 与判词谓词 `isGateModeReleaseReasonWord`、修复通告事实读器 `readToolTurnRepaired`。⑤ **会话所有者自助记忆抹除**(CC-264):调用口 `eraseSessionMemory` + 结局判定口 `sessionMemoryEraseOutcome` + 三只闭集镜像。⑥ **registry 写冲突的两种 409 分得开**(CC-280):`classifyRegistryConflict` / `isScopeGoneError`。⑦ **请求装配认得 `requireExistingSession`**(CC-281):车道表 +1 行 + 被拒读口 `requireExistingSessionRefusalFromError` 与一句 `requireExistingSessionRefusalContent`。⑧ **投递事实判定归包**(CC-271):提交事实账本 `createPromptDeliveryLedger` + 两只按消息行的读口;判据 = 引擎为这次提交**建了 run**。⑨ **plan 决断台账**(CC-278):被离门证据结掉、还没被投递口认领的那一笔登记,由随后到达的投递口认领原笔(不另铸刻度)。⑩ **`wiring_manifest` 帧的 `fileHistory` 段**(CC-279):这条腿捕不捕文件历史,可选成员 + 超集键。**为什么是 minor**:十六只新顶层导出;`CrashConvergedRow.cause` 型联合 +1 词、`EngineNoticeFactsCode` +2 员 / `EngineNoticeFacts` +2 臂(对它们做穷尽 `switch` / `Record` 的 TypeScript 端编译红一次,见 Changed 第 2 / 5 / 6 条);`WiringManifestChromeEvent.fileHistory?` / `WiringManifestView.fileHistory?` / `TaskRequestInput.requireExistingSession?` 三只可选位(对构造方 additive);展示出口输出字节、`SERVER_NOTICE_AUDIENCE` 行数、通告码册长度、`latestPlanReviewDecisionMark` 刻度等**已发导出的可观察变化**在 Changed 逐条单列(写明谁要跟)。型面 BREAKING 零处(对构造方)。根公面运行期导出 1356 → 1372(+16);测试钩 62 不变;公面类型名 922 → 942(+20);超集键 +1(`_sema_fileHistory`);零新投影臂(chrome `wiring_manifest` 臂多一只可选成员);请求装配车道表 44 → 45 行;`ENGINE_NOTICE_CODES` 80 → 81;`SERVER_NOTICE_AUDIENCE` 三行 → 四行;peer sdk 地板 `>=12.0.1` 不动;开发依赖引擎 `~7.36.0` → `~7.37.1`(构建期,不进运行期依赖)。