@sema-agent/client-core 0.84.1 → 0.85.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/CHANGELOG.md +206 -0
  2. package/README.md +20 -13
  3. package/dist/adapt/arms.js +1 -1
  4. package/dist/adapt.d.ts +1 -1
  5. package/dist/adapt.js +1 -1
  6. package/dist/adapter/activeRunSelfHeal.d.ts +3 -0
  7. package/dist/adapter/activeRunSelfHeal.js +149 -17
  8. package/dist/adapter/downstream/terminalToSdkResult.js +9 -5
  9. package/dist/adapter/runStream.js +6 -2
  10. package/dist/agentSession/engineSessionBackgroundStop.d.ts +50 -0
  11. package/dist/agentSession/engineSessionBackgroundStop.js +291 -0
  12. package/dist/agentsWireCaps.d.ts +2 -1
  13. package/dist/cloudConfigWireCaps.js +2 -1
  14. package/dist/corruptSession.d.ts +3 -0
  15. package/dist/corruptSession.js +29 -0
  16. package/dist/corruptSessionCopy.d.ts +1 -0
  17. package/dist/corruptSessionCopy.js +4 -0
  18. package/dist/decideFailureNote.js +4 -1
  19. package/dist/decideReceipt.d.ts +6 -0
  20. package/dist/decideReceipt.js +30 -1
  21. package/dist/effortWire.d.ts +2 -1
  22. package/dist/effortWire.js +2 -4
  23. package/dist/engineErrorCodes.d.ts +9 -0
  24. package/dist/engineErrorCodes.js +29 -0
  25. package/dist/engineNoticeCodes.d.ts +9 -0
  26. package/dist/engineNoticeCodes.js +44 -156
  27. package/dist/engineWireFor.d.ts +43 -0
  28. package/dist/engineWireFor.js +399 -0
  29. package/dist/engineWireSdk.d.ts +4 -0
  30. package/dist/fileHistoryCaptureCapability.d.ts +4 -1
  31. package/dist/fileHistoryCaptureCapability.js +43 -9
  32. package/dist/gateVocabulary.d.ts +1 -2
  33. package/dist/gateVocabulary.js +1 -22
  34. package/dist/generated/engineNoticeTables.d.ts +3 -0
  35. package/dist/generated/engineNoticeTables.js +156 -0
  36. package/dist/generated/toolNameTables.d.ts +2 -0
  37. package/dist/generated/toolNameTables.js +43 -0
  38. package/dist/headlessPermissionModeWire.js +2 -4
  39. package/dist/hitl/armedGateRegistry.d.ts +1 -0
  40. package/dist/hitl/armedGateRegistry.js +1 -1
  41. package/dist/hitl/frameRouter.js +4 -2
  42. package/dist/hitl/parkResolver.js +3 -1
  43. package/dist/hitl/planReviewWire.d.ts +11 -0
  44. package/dist/hitl/planReviewWire.js +191 -72
  45. package/dist/hitl/rosterMountedNames.d.ts +2 -0
  46. package/dist/hitl/rosterMountedNames.js +38 -0
  47. package/dist/hitl/sessionPolicyDeliverable.d.ts +6 -2
  48. package/dist/hitl/sessionPolicyDeliverable.js +25 -45
  49. package/dist/hitl/sessionPolicyWire.js +1 -38
  50. package/dist/hitl/toolApprovalWire.d.ts +4 -2
  51. package/dist/hitl/toolApprovalWire.js +4 -2
  52. package/dist/host.d.ts +1 -1
  53. package/dist/host.js +11 -2
  54. package/dist/index.d.ts +10 -4
  55. package/dist/index.js +7 -3
  56. package/dist/permissionWireCaps.d.ts +2 -1
  57. package/dist/permissionWireCaps.js +2 -7
  58. package/dist/request/taskRequest.d.ts +4 -0
  59. package/dist/request/taskRequest.js +30 -1
  60. package/dist/resumeRefusalCopy.js +4 -2
  61. package/dist/runTerminal.js +4 -0
  62. package/dist/sandboxWire.js +1 -1
  63. package/dist/sealedKeyCapability.d.ts +17 -0
  64. package/dist/sealedKeyCapability.js +42 -0
  65. package/dist/seatContract.d.ts +2 -1
  66. package/dist/seatContract.js +5 -21
  67. package/dist/subagent/engineCompactWire.d.ts +13 -2
  68. package/dist/subagent/engineCompactWire.js +48 -37
  69. package/dist/subagent/engineDelegatedPrompt.d.ts +9 -1
  70. package/dist/subagent/engineDelegatedPrompt.js +16 -16
  71. package/dist/subagent/engineRowStopGate.d.ts +2 -2
  72. package/dist/subagent/engineRowStopGate.js +4 -4
  73. package/dist/subagent/engineSubagentOutput.d.ts +8 -0
  74. package/dist/subagent/engineSubagentOutput.js +37 -18
  75. package/dist/subagent/engineSubagentResume.d.ts +11 -2
  76. package/dist/subagent/engineSubagentResume.js +28 -14
  77. package/dist/subagent/engineSubagentSteer.d.ts +10 -1
  78. package/dist/subagent/engineSubagentSteer.js +16 -11
  79. package/dist/subagent/engineSubagentTail.d.ts +10 -1
  80. package/dist/subagent/engineSubagentTail.js +35 -17
  81. package/dist/subagent/engineTaskHandleWire.d.ts +13 -0
  82. package/dist/subagent/engineTaskHandleWire.js +41 -20
  83. package/dist/subagent/subagentOwnerAbsence.js +2 -5
  84. package/dist/taskRequestWords.d.ts +5 -0
  85. package/dist/taskRequestWords.js +4 -0
  86. package/dist/wireErrorTriage.d.ts +1 -0
  87. package/dist/wireErrorTriage.js +3 -1
  88. package/dist/wireRefusalCopy.d.ts +10 -0
  89. package/dist/wireRefusalCopy.js +62 -2
  90. package/docs/INTEGRATION-CLIENTS.md +867 -22
  91. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -49,6 +49,212 @@
49
49
  > 挡住 ⇒ 本批把它机械化——④a0 对 `pending` 行**要求段头已是日期形**(`(未发布)` 直接红),阶段一
50
50
  > commit 漏转在发布前就红,不再靠人记。
51
51
 
52
+ ## 0.85.1(2026-09-30)
53
+
54
+ > 主题:**patch**,三件 —— 请求装配回执的省略成因补一张**给终端用户看**的句表与取句口(CC-248);plan-review 重开口在「这个会话没有接能显示卡的界面」那一形上带机读成因位、自愈行补一句成因(CC-258);多会话宿主在自己的会话键上登记呈现回执的口 `registerArmedGateFromQuestionIdFor` 回到根入口(CC-259)。零型面 BREAKING;已发导出的可观察变化:「没有接界面」那一形(见 Changed),另有两处修复 —— 宿主重开判决某一位读不出时自愈不再 reject、宿主日志 / 探针口抛错不再改变判决(见 Fixed);根公面运行期导出 1307 → 1310(+3:`taskRequestOmissionCauseNotice` / `TASK_REQUEST_OMISSION_CAUSE_NOTICES` / `registerArmedGateFromQuestionIdFor`);测试钩 60 不变;公面类型名不变(两个已导出型各多可选位:`ReopenCardVerdict` 不成功臂 `_sema_noPresentationSurface` · `SelfHealOutcome` 两臂 `noPresentationSurface`;一个已导出函数的返回型 `void` → `boolean`:`hostLog`,见 Fixed);超集键 +1(`_sema_noPresentationSurface`);成因闭集 `TASK_REQUEST_OMISSION_CAUSES` 不变;接入方那只 `taskRequestOmissionCauseDetail` 逐字不变;零投影臂;peer sdk 地板 `>=12.0.1` 不动;开发依赖不变。
55
+
56
+ ### Added
57
+
58
+ - **`taskRequestOmissionCauseNotice(cause)`** ⇒ `string`(CC-248):装配回执(`assembleTaskRequest(…).omitted`)一行的成因词 → 一句**给终端用户看**的话:这一项没发出去、为什么、用户能做什么(有才说)。三端要把同一份回执说给用户时不必再各写一张成因句表。接入文档 **§110 R-1 / 110a-1**。
59
+ - 与 `taskRequestOmissionCauseDetail`(写给接入方:带改法,表外词原样回显供对账)读**同一个**成因闭集 `TASK_REQUEST_OMISSION_CAUSES`;两张句表各自穷举这一个闭集,逐词不同句、零共句。
60
+ - 四句逐字:
61
+ - `upstream_absent` —— `Not sent with this request: this version has no way to send this setting in any request, so giving it or leaving it out makes no difference to what is sent.`
62
+ - `other_channel` —— `Not sent from here: that part of the request belongs to a separate step, so what goes out for it, if anything, is decided there rather than by the value given here.`
63
+ - `off_lane` —— `Not sent with this request: this kind of request does not carry this setting, so giving it or leaving it out makes no difference to what this request sends.`
64
+ - `not_live` —— `Not sent with this request: the request was marked as not going to a live engine (for example an offline or test run), and this setting is only sent on requests that go to one.`
65
+ - 句子只说这一次带没带,不说「生效 / 不生效」(带了不等于引擎兑现了);不含车道、回执、上游、字段这类接入方用词。`not_live` 那一句只说「这一发被标成不发往在线引擎」—— 本包只知道调用方交来的标记,不替宿主断言它连没连引擎;`other_channel` 那一句不说「后面会设上」—— 那一步落不落、落什么,本包不知道。
66
+ - 表外词、空串、非串、包装串对象、数组、带 `toString` 的对象、原型链上的名字(`constructor` / `__proto__` …)⇒ 一句通用句 `Not sent with this request, for a reason this version does not recognize.` —— 不抛(读属性会抛的对象、已撤销的 Proxy 同样不抛)、不回显那个词、不借任何一个成因。只认自身就是串的值,不强转。
67
+ - **`TASK_REQUEST_OMISSION_CAUSE_NOTICES`**(冻结对象,型 `Readonly<Record<TaskRequestOmissionCause, string>>`):上面那四句的表本身。给要按 `TaskRequestOmissionCause` **编译期穷举**、自建呈现表(比如逐词决定渲不渲)的端:句子从这里取,成因闭集加一个词时句子随包一起到。按一个外来的串取句请走取句口 —— 直接下标会撞到 `Object.prototype` 上的成员。
68
+ - **重开判决的「没有接能显示卡的界面」成因位**(CC-258):`ReopenCardVerdict` 不成功臂 +1 可选位 `_sema_noPresentationSurface?: true`。`reopenPlanReviewCard` 出卡 = 把一帧问题帧投给宿主**为这个会话键订阅**的问题帧端口(`onQuestionFrameFor(sessionKey, handler)`;默认会话 `onQuestionFrame`);这个会话没有订阅者 ⇒ 卡没有地方渲、拒开,判决从此带这一位:`{ reopened: false, _sema_noPresentationSurface: true }`。同步形与带 `presentationReceiptMs` 的回执形同答;异步判定(`trigger: 'automatic'` 撞关卡记号、读门实例)读回来之后界面没了,同答 —— 不论读出的是不是新门(读后复核与入口同序:先问界面,再判用户关卡)。只认严格 `true`。接入文档 **§110 PS-1 / PS-2 / 110a-2**。
69
+ - **自愈结局的同名键**(CC-258):`SelfHealOutcome` 的 `plan-review-reopen-failed` 与 `ask-reopen-failed` 各 +1 可选键 `noPresentationSurface?: true` —— `attemptActiveRunSelfHeal` 拿到的重开判决带上面那一位时在场(kind 不变;两臂同判,宿主自带的 ask 重开口铸这一位时 ask 臂同样带)。接入文档 **§110 PS-3**。
70
+ - **`registerArmedGateFromQuestionIdFor(sessionKey, questionId)`**(CC-259;0.72.0 退出公面的名字复活):多会话宿主按自己的会话键调 `reopenPlanReviewCard(taskId, { sessionKey, presentationReceiptMs })` 时,回执形等的是**那个会话键**上的呈现回执;宿主在卡真进界面那一刻用这一口登记(原始帧 id 的回执发在这个会话键上,归一后的卡身份记进这个会话的呈现台账)。修前根入口只有默认会话口 `registerArmedGateFromQuestionId`:非默认会话键的宿主照它登记,回执窗等不到、窗尽答 `{ reopened: false }`,而卡其实已经上屏;改用 `registerArmedGateFor(sessionKey, 原始 id)` 能让回执落定,但记进台账的是未归一的原始 id,同一张卡再开也读成首见。入参语义与默认会话口逐字同:`questionId` 不是非空串 ⇒ 什么都不做(不抛)。接入文档 **§110 RG-1**。
71
+
72
+ ### Changed
73
+
74
+ - 请求装配一族(CC-248)的已发导出零可观察变化:`taskRequestOmissionCauseDetail` 的四句与兜底句、`TASK_REQUEST_OMISSION_CAUSES` 的内容与序、`assembleTaskRequest` 同一入参的 `{ request, omitted }` 都与 0.85.0 逐字节同。接入方那张句表的字面量补挂 `satisfies Record<TaskRequestOmissionCause, string>`(只改构建期的类型检查,出包字节不变;见 Gates K4c)。
75
+ - CC-258 的可观察变化**只在「没有接界面」这一形上**(两处修复见 Fixed):
76
+ - `reopenPlanReviewCard`:这一形的判决从 `{ reopened: false }` 变为 `{ reopened: false, _sema_noPresentationSurface: true }`(多一键,`reopened` 照旧 `false`)。其余拒开形(回执窗没落定 / 决断在飞 / 界面在场时的用户关卡 / 非默认会话键没有投递口 / 陈旧评估时关卡记号已不在)与成功形逐字节同 0.85.0。按「恰 `{ reopened: false }`」逐键断言无界面形的测试请改锚(§110 110a′)。读后复核证出新门、读在路上时界面没了那一形,关卡账与 0.85.0 同:用户对旧门的记号撤掉(新门从未被用户关过),之后对新门的自动重开照常出卡 —— 变的只有判决多一键;入口那一形与同一道门那一形不动关卡记号。
77
+ - `reopenPlanReviewCard` 读后复核的一形:自动触发撞上同一枚关卡记号、读门实例证不出新门,而读在路上时界面没了 —— 0.85.0 及更早(0.84.1 实测同答)答 `{ reopened: false, dismissedByUser: true }`(「是不是新门」那一判排在界面复核之前;自愈行因此说「卡是你关的、发条消息叫回来」,而会话没有界面、发消息也叫不回卡),本版改答 `{ reopened: false, _sema_noPresentationSurface: true }`:读后复核与入口同序,先问界面、再判用户关卡。界面在场时同一形照旧答 `dismissedByUser`。
78
+ - `attemptActiveRunSelfHeal`:上面那一形的结局多 `noPresentationSurface: true`。
79
+ - `activeRunSelfHealRow`:五句在这一形上补同一句成因 `this session has no view attached that can show decision cards`,其余字节不变 —— plan / ask 用户形在 `could not reopen that approval card` / `could not reopen that card here` 之后接 `: <这一句>`;steer 回执 `queued` 的用户形在 `could not surface that decision card here` 之后、注入形在 `could not show here` 之后、注入形未送达在 `no open card you could answer to free it` 之后各接 ` (<这一句>)`。插入点之前与之后的两段各自逐字不变:整段落在插入点一侧的子串照旧命中;跨过插入点的子串在这一形上不再命中 —— 整句逐字、带句点的 `could not reopen that approval card.` / `could not reopen that card here.`、`could not surface that decision card here, so`、`sema could not show here;`、`free it. sema did not retry` 这类(§100 那张注入件句表的第 5 / 12 句在这一形上随之分句,见 §110 110a′ ⑤)。逐字表见 §110 110a-2。
80
+ - 首呈口 `armPlanReviewApproval` 不变(CC-258):它不问有没有界面,没有订阅者时照旧答 `true`、卡帧不会送到任何地方(见 Known limits)。
81
+
82
+ ### Fixed
83
+
84
+ - `attemptActiveRunSelfHeal` 读宿主重开口交来的判决(`reopenPlanReview` / `reopenAskPark` 的返回值)收进保护:判决在保护内逐键拷一次、成一份拷贝,之后两臂、steer `queued` 结局与出句口读的都是这一份;某一位读不出(会抛的取值器 / Proxy)⇒ 按这一位缺席处置,结局照常落定,与判决只缺这一位时逐字节同(修前自愈 Promise reject,`queued` 结局的出句口同步抛)。这是把本版新读的 `_sema_noPresentationSurface` 与既有七位(`reopened` / `firstSight` / `presented` / `decidedWithoutCard` / `pendingRowGone` / `_sema_decisionInFlight` / `dismissedByUser`)一并收进保护 —— 既有七位的取值器抛错时 0.85.0 及更早同样 reject(`decidedWithoutCard` 只在 ask 臂、`dismissedByUser` 只在计划臂,其余五位两臂都);出句口会同步抛的是其中 `reopened` / `presented` / `_sema_decisionInFlight` / `dismissedByUser` 四位(`firstSight` / `decidedWithoutCard` / `pendingRowGone` 出句口不读)—— 按 0.85.0 与 0.84.1 产物实跑核过,不是本版引入。拷贝拷的是宿主判决的全部自有可枚举键(字符串键与 Symbol 键),宿主加的超集键照旧原样随行,值原样、键序照宿主给的;null 原型的判决拷成 null 原型,其余是普通对象;读不出的那一键(含可枚举性判定本身读不出的)跳过;列不出宿主判决的键时只按上面八位读。普通判决的结局与行句与 0.85.0 一致 —— 键、键序、值、原型都同(`running-steered` 结局的 `reopened` 是这份拷贝,不再是宿主交来的同一个对象)。`activeRunSelfHealRow` 读宿主自铸结局里的判决同样不抛:读不出的位按缺席,`reopened` 整个缺席与 `null` 同句;结局上 `reopened` 这一键本身读不出(会抛的取值器 / 读这一键就抛的 Proxy)⇒ 同样按缺席出句(修前两处 `queued` 出句分支同步抛,0.85.0 及更早)。接入文档 **§110 PS-6**。
85
+ - 宿主经 `installHost({ log, probe })` 装的日志口 / 探针口抛错,不再改变任何判决:`hostLog` / `hostProbe` 自己兜住口抛出的错(诊断面坏了只丢那一行诊断)。这是 0.85.0 及更早就有的形(0.84.1 实测同形;入口「决断在飞」与读后复核「读在路上时交出决断」两形要 0.85.0 才有的交出登记口,0.84.1 上测不了)—— 修前日志口抛错时 `reopenPlanReviewCard` 实测:入口「决断在飞」答 `{ reopened: false }`(丢了 `_sema_decisionInFlight`)· 同步形用户关卡答 `{ reopened: false }`(丢了 `dismissedByUser`)· 入口铸卡段答 `{ reopened: false }`,而这道门旧身份的卡已经撤下、新卡没有铸出来 · 读后复核里「宿主交出谓词抛」「读在路上时交出决断」「读在路上时会话换代」「新门铸卡」四形都改答 `{ reopened: false, dismissedByUser: true }`(自愈行随之说「卡是你关的」)。本版起这七形的判决与卡帧序列与日志口不抛时逐字节同。`hostLog` 的返回值随之由 `void` 改为 `boolean`:`false` = 宿主日志口这一次抛了错(已吞,这一行没递到);没装口或正常递到 ⇒ `true` —— 口抛错原是调用方唯一看得见的递送失败信号,吞掉之后改由返回值交出(本包「同一件事只警告一次」的去重记号据此撤回,留痕机会不被一次坏口烧掉);`hostProbe` 仍返回 `void`。射程:只兜宿主口本身抛出的错,调用点拼诊断句的实参不在内;投影内核的上下文 `AdapterContext` 上的那一对 `log` / `probe` 是另一对口,本版未动。接入文档 **§110 PS-7**。
86
+
87
+ ### Gates
88
+
89
+ - 扩门 `scripts/run-task-request-omission-receipt-test.mjs`(445 → 508 格;与终端成因句表对照的那一段只在给了终端源码树时跑,读不到时 506 格、总结行标为未跑):L 段 —— 导出口在场且句表冻结、键 ≡ 成因闭集、取句口答的就是表里那一句、每词一句句句不同、句子挂对了词(每句带自己那个成因的语义锚、不带别的成因的锚)、与接入方那张逐词不同句;措辞恒以 `Not sent` 起头、零接入方用词(判别式先对接入方四句句句响作正控)、不说生效、过出包卫生词表;表外词 / 近形 / 非串 / 包装串 / 数组 / 会抛的 `toString` 与 `Symbol.toPrimitive` / 每个陷阱都抛的 Proxy / 已撤销的 Proxy / 十个原型链名 / 被污染的原型名 ⇒ 通用句、不抛、不回显;就地改写句表被拒;源码级 —— `as const satisfies Record<TaskRequestOmissionCause, string>` 挂在表字面量自己身上(删一句 / 多一句即编译红),源码里以成因词为键的对象字面量恰三处(判官表 + 两张句表,第三张即红);终端成因句表的每个成因词都在本包成因闭集里、且不重复(终端有、本包无即红;本包有、终端无只出读数;措辞只出读数不判;那张表退役或改名后该段如实标为未跑)。K4c —— 接入方那张句表的字面量同样挂 `satisfies Record<TaskRequestOmissionCause, string>`:此前它只有声明注解,少一句编译红、多一句却照样编译通过(只被运行期格抓到);本版起两个方向都在构建期红。出包字节不变。
90
+ - 同名影子对账门 `scripts/run-layering-shadow-export-test.mjs`:终端那张成因句表的语义差分格改为对位终端用户向取句口 `taskRequestOmissionCauseNotice`(此前对位接入方那只 —— 那一只写给接入方、带改法,不是端句的对位);登记行同批改名,登记的分歧类不变。
91
+ - 扩门 `scripts/run-plan-review-dismissal-test.mjs`(94 → 133 格)N 组(CC-258):会话没有订阅者 ⇒ 同步形 / 回执形 / 带触发者都答 `{ reopened: false, _sema_noPresentationSurface: true }`(键集恰两位)、零帧;按会话键问(别的会话有订阅不算;本会话装上即照开,判决形与旧版同);不带位的六形逐格恰等(有订阅的成功形 / 回执窗没落定 / 决断在飞〔有无订阅同答〕/ 用户关卡 / 非默认会话键没有投递口 / 关卡记号已不在);同一枚关卡记号上订阅没了 ⇒ 答没有界面(不说「卡是你关的」)—— 入口判时,与异步判定读在路上时订阅没了(读后复核与入口同序,0.85.0 在这一形答「卡是你关的」),订阅装回后同一道门照旧答用户关卡;异步判定读门实例证出新门、读在路上时订阅没了 ⇒ 读后复核带位、零新卡,订阅装回后同一道新门照开,且用户对旧门的关卡记号已随那一次撤掉(装回后同步形自动重开 / 回执形门实例读口答 null ⇒ 照开出卡、零次判定读);读后复核的判定序(在飞 → 陈旧评估 → 界面 → 用户关卡 / 新门):读在路上时交出了决断(台账登记 / 宿主交出谓词翻真)又退订 ⇒ 仍答在飞,关卡记号换了一枚 / 没了又退订 ⇒ 与不退订时逐字节同答陈旧评估那一形;宿主装的日志口对每一级都抛时,同步形 / 回执形 / 读后复核三形的无界面判决不变、零帧,既有七形(入口决断在飞 / 同步形用户关卡 / 入口铸卡段 / 读后复核四形)的判决与卡帧序列与日志口不抛时逐字节同,公面 `hostLog` / `hostProbe` 在宿主口抛错时不抛;首呈口无订阅的今日读数(答 `true`、零帧,不是承诺)。
92
+ - 扩门 `scripts/run-selfheal-reopen-test.mjs`(513 → 595 格)。判决读取收进保护(+59):判决上本包读的八位逐位换成会抛的取值器 × plan 臂 / ask 臂 / steer `queued` 两臂 / 宿主自铸的 `queued` 结局 ⇒ 结局照常落定、与判决只缺这一位时逐字节同,用户形 / 注入形行句不抛且逐字同;两种 Proxy(取值全抛 / 列键抛)同律;宿主自铸结局漏了 `reopened` ⇒ 与 `null` 同句;普通对象判决(含宿主加的超集键)进 `queued` 结局逐字节同(含键序、值为 `undefined` 的自有键);超集键的取值器抛 ⇒ 只跳过那一键;自有键恰叫 `__proto__` 的判决照原样拷、不改拷贝的原型;带 Symbol 键 / null 原型的判决进 `queued` 结局,按 `Reflect.ownKeys`、逐键值与原型对拍与原物一致;不可枚举的自有键不拷、可枚举性判定本身抛的那一键跳过;宿主自铸 `queued` 结局上 `reopened` 这一键本身读不出(取值器 / Proxy)⇒ 两形行句不抛、与 `null` 同句。CC-258(+15):包内重开口无订阅 ⇒ 结局带 `noPresentationSurface`;五句各与「不带位那一句只差这一句成因」逐字相等;带宿主「保会话」出路时同律;ask 臂同判;含糊值(`'true'` / `1` / `false`)与在飞 / 用户关卡 / 不带位的拒开既不带键也不含这一句;装上订阅 ⇒ 结局 `plan-review-reopened`。CC-259 G7b(+8):非默认会话键端到端 —— 订阅 `onQuestionFrameFor(K, …)` → 回执形重开 → 收帧后用新口登记 ⇒ `{ reopened: true, firstSight: true }`,卡帧只落在这个会话、默认会话零帧,呈现台账记在这个会话的卡身份上;未作答再开 ⇒ `firstSight: false`;决断性作答之后(宿主不另报记账)再开 ⇒ `firstSight` 回到 `true`;不作答地拿开卡(Esc)之后再开 ⇒ 仍 `false`、零投递;对照:同一会话键改用默认会话口登记 ⇒ 恰 `{ reopened: false }`(卡已交给订阅者)。另打一行读数:改用 `registerArmedGateFor(K, 原始 id)` 时两次重开都答首见(只作读数,不当判据)。
93
+ - 扩门 `scripts/run-terminal-identity-copy-test.mjs`(987 → 1041 条;CC-258):注入形事实表 13 → 15 句(无界面形的未送达与 `queued` 各一句),逐字钉、零内部词扫、承诺对账覆盖新样本。
94
+ - 导出存活门 `scripts/run-export-liveness-test.mjs` 新增 G′(CC-259):已退出公面的名字重新上公面只许经 `scripts/export-liveness.json` 的 `revived` 点名账,逐行同批成立(退出那一版的账里真有它 / 复活版晚于退出版且不晚于本文件顶段 / 票号与理由齐全 / 已回到公面基线);成立的名字才从「不许回到基线」那一格里减掉,退出账照原样保留(判官先对合成账逐形自证)。冻结账门 `scripts/run-integration-doc-freshness-test.mjs` ⑧c 读同一份点名账,把复活的名字从「已退役名」集合里减掉。同门新增 G″:退出账只增不删有了对历史的校验 —— 与**预期上一发布版**(冻结账门那本冻结账里最新一条已转正的版本)那枚 tag 上的同一份账逐版逐名比,旧账每个版本都在、每个名字仍在同一版本下(不许删名、不许挪版本、不许删整版),新增只许追加;修前只查结构,删掉一个历史名(连同它的复活行)再把它加回基线,G / G′ 都不红。基线只认预期那一枚 tag:它不在本地(浅克隆没取 tag / 发布后还没打)、或它上面没有这份账 ⇒ 这一格如实标未核(总结行 PARTIAL,不当绿),不退到别的 tag;不在 git 仓同样标未核;git 读不了 ⇒ 退出码 2;判官(选基线与判缩水两段)先对合成输入逐形自证。负控套 `scripts/run-gate-negative-controls-test.mjs` 为这道门补两枚常驻负控:从退出账最早一版、最近一版各摘掉一个没有复活行的名字 ⇒ G″ 必红且点名(删最近一版那一枚只有基线确是预期上一发布版时才红)。
95
+ - 登记物:根公面基线 1307 → 1310(+3);型面门 unknown 出境棘轮 430 → 432(CC-248 取句口入参与接入方那只同为 `unknown`,在函数内窄化、出境是串;CC-259 新口的 `questionId` 与同文件默认会话口同为 `unknown`,函数内先判非空串再归一,出境 void;沿革账 +2 条);失败显式门的已注释豁免棘轮 44 → 43(宿主诊断口改由唯一调用出口带值返回之后,子代台账缺席留痕那一处包住日志调用、靠捕获异常撤回去重记号的吞随之退役;沿革账 +1 条);单例清单 536 → 538 条(CC-248 句表;自愈腿判决快照按它逐位读的位名表);超集台账 `docs/type-superset.json` 90 → 92 条(CC-258 `_sema_noPresentationSurface`:判决形声明处与唯一铸点处各一);`scripts/export-liveness.json` 新增 `revived` 账一行(CC-259);门清单 `scripts/gates-manifest.json` 里回执省略、plan-review 关卡、自愈重开、导出存活四门的说明(导出存活门另有负控格)与 README「Guards」派生表同批更新;门数 158 不变。
96
+
97
+ ### Known limits(本版新增)
98
+
99
+ - 取句口的通用句仍以「Not sent with this request」起头:它信任调用方交来的是回执省略行的成因,拿一个不是回执成因的值来问,它照样说这一项没发出去(真回执每一行必带四词之一,走不到通用句)(KL-259)。
100
+ - `other_channel` 那一句说不出另一步最终发没发、发了什么:本包不知道宿主在构造之后调没调补位那一层、给没给值(KL-260)。
101
+ - `off_lane` 那一句不点名哪一种请求带这一项:车道名是接入方词,端知道自己的入口形,可在句前后补上(KL-261)。
102
+ - 四句与通用句只有英文一份,不随界面语言切换(KL-262)。
103
+ - 门那一侧:与终端成因句表的对照只读终端源码树上的一个文件、只比词集;别的端不读;终端改名或挪走那只文件时如实标为未跑,分不出是退役还是搬走(KL-263)。
104
+ - 首呈口 `armPlanReviewApproval` 不问有没有界面:没有订阅者时照旧答 `true`(布尔,带不了成因位),卡帧不会送到任何地方,作答口照登记;重开口此时带位,首呈口没有对位。宿主要判可在调用前问 `hasQuestionOverlayFor`;之后装上订阅,重开口照常出卡(KL-283)。
105
+ - 陈旧评估(异步判定读在路上时关卡记号换了一枚)按此刻的记号答、不问界面:同一任务另一次自动重开因订阅没了没上屏、记号随之撤掉时,这一次答不带位的 `{ reopened: false }` —— 这一位缺席不证明会话有界面(KL-284)。
106
+ - 门那一侧:导出存活门的「退出账只增不删」只对预期上一发布版那枚 tag 上的同一份账比,同一个未发版本里先追加又删掉的名字看不见;不在 git 仓、本地缺那枚 tag(浅克隆 / 发布后还没打)、或那枚 tag 上没有这份账时如实标未核,不退到别的 tag(KL-286)。
107
+ - 完整台账见接入文档 §110 末行「包侧缺口」。
108
+
109
+ ## 0.85.0(2026-09-29)
110
+
111
+ > 主题:**minor** —— 十件同发。① 引擎事实表(通告码册 / 受众表 / MCP 注入丢弃原因,以及会话规则翻译判定内部用的协议前缀与退役工具名)改为**构建期生成**,不再手抄;出身词与强制词两张词表直接就是 SDK 导出的那两个数组;包内同一事实的多份字面收成一份。② 子代族八个入口与两只行停止门收**注入 client**(浏览器同源中继宿主的正位入口;plan-review 那一半 0.84.1 已到),三只写动词的失败结局加「可能已送到、却没有答复」机读位。③ 会话规则无损判定收**可选工具名册**(只收紧)。④ 过渡物**退役登记**与到期门,本版执行其中三条;按 0.84.0 的预告**三个运行期名字退出根入口**,第四个撤回退役预告。⑤ plan-review **决断台账**收进包,重开口按台账拒开。⑥ 会话后台任务**停止口**收进包转调(此前登为「端直调」,而端不直连 sdk),附受据三态归类口。⑦ 服务端 7.104.0 **会话侧**提货:会话存档读不出(`corrupt_session`)三处载体同一判定与一句人话、跳过记录的通告、删会话 409 按码读、`/decide` 停驻挪动族按码读。⑧ 服务端 7.104.0 **能力 / 同步体侧**提货:同步 park 新体与 park 行 `result`、文件历史捕获两代词与「这一次别捕获」请求词、公钥发现段、折叠粗码。⑨ 同名影子对账门的豁免改按语义分类(只改门)。⑩ 导出存活门的端消费证据改读已提交历史(只改门)。根公面运行期导出 1275 → 1307(+35 −3);测试钩 59 → 60;公面类型 857 → 891(+34);超集键零增减;零新投影臂;请求键 +1 `fileHistory`(只在宿主经片段口给值时上 wire);peer sdk 地板 `>=12.0.1` 不动(服务端 7.104.0 与 sdk 13 的新形一律按结构读,不 import sdk 13 才有的型 / 值);开发依赖引擎 `~7.33.1` 不变。🔴 **型面 BREAKING 一处**(三个运行期名字退出根入口,见 Removed);另有几处**已发导出的可观察变化**,Changed 开头逐条单列、写明谁要跟。
112
+
113
+ ### Added
114
+
115
+ - **plan-review 决断台账**(CC-241):重开口「这道门的决断还在路上」的判据,从本包投递口「POST 未落地」那一段扩成一本三端共用的台账 —— 宿主经别的路径交出的决断、读起点早于结算的陈旧快照、已证出没生效的例外,判定与账都在包里;端只在交出前登记一笔、读待决行前取一枚刻度、证出没生效或离门时说一声。接入文档 **§109a L-1–L-9 / 109a-11**。
116
+ - `notePlanReviewDecisionHandedOver(taskId)` ⇒ `PlanReviewDecisionHandle | null`:宿主在**交出之前**(把对卡的决断性作答送进 `respondToQuestion` 之前,或自带投递路径发 POST 之前)登记一笔。句柄 `settle()` = 自带投递路径落定(成功 / 失败同处);`revoke()` = 这次作答没被任何 responder 收下;两者都幂等。同一任务已有一笔未结算 ⇒ `null`(两条通路报的是同一次决断)。本包 `decidePlanReview` 被投递口闩放行时认领同任务那一笔(没有就自铸一笔),结算权归本包 —— 认领之后宿主的 `settle()` 不放开它。非串入参 ⇒ `null`。
117
+ - `planReviewPendingReadMark()` ⇒ `number`:读待决行**发起之前**取的读起点刻度;经新可选位 `ReopenPlanReviewOpts.pendingReadStartedAt` 随那次读拿到的行带进重开口。
118
+ - `planReviewDecisionInFlight(taskId, pendingReadStartedAt?)` ⇒ `boolean`:有一笔未结算;或给了读起点、有一笔结算晚于它、且那一笔没被判「没生效」。重开口的拒开判据就是它;非数的读起点按缺席。
119
+ - `notePlanReviewDecisionNotApplied(taskId)`:宿主证出最近一笔已结算的决断没生效(同一道门实例在结算之后仍待决)⇒ 那一笔不再让陈旧读起点拒开;还有一笔在飞时不动。`decidePlanReview` 结局 `not_sent` 与**证得出是同一道门实例**的 `still_parked` 本包自证、结算时自动记上,不必宿主再证 —— `still_parked` 证得出的两形:引擎按契约不动状态的拒绝(`approve` + `acceptEdits` 撞 400 `request.field_conflict`),或卡由 `armPlanReviewApproval` 立、立卡结果上的 `checkpointId` 与决后回拉 run 行 `result` 上 paused 因由的 `checkpointId` 两边读得出且相等;回拉只说 `needs_review` 而证不出同一道门(公开口直调 / 重开卡上的决断 / 缺一边 —— run 推进到**新的一道** plan 门时状态词同样是 `needs_review`)⇒ 不自证,陈旧读起点照旧拒开(KL-250);两边身份读得出而**不同** ⇒ 结局是 `advanced`(决断生效、推进到新的一道门;见 Changed 第 21 条),同样不自证;`not_applied` / `unconfirmed` 不自证。
120
+ - `notePlanReviewGateLeft(taskId)`:正面证据「这条 run 已离开那道门」⇒ 结算这条 run 全部未结算的笔(投递口闩照守;本包 POST 还在飞的笔即便被它结算,也不因容量被挤)。
121
+ - `latestPlanReviewDecisionMark(taskId)` ⇒ `number | null`:最近一笔的交出刻度。
122
+ - 型 `PlanReviewDecisionHandle`(`settle(): void` / `revoke(): void`)。台账每进程至多 32 笔(到顶先挤最旧的已结算且本包调用已返回的笔,再挤最旧的宿主登记、本包还没认领的笔;本包投递口自己在飞的笔 —— POST 在飞与回拉 / 结局在途,不论结算刻度是否已被离门证据写上 —— 永不因容量被挤,挤不下就暂时超出上限、落定后回落);刻度是单调的逻辑时钟,不读墙钟;无 TTL。
123
+ - **子代族与 resume 编排收注入 client,经一个共用构造点**(CC-236;接入文档 §7 P-28 的后半场,与 0.84.1 plan-review 那一半同形)。浏览器同源中继宿主没有合法的引擎目标可装(`EngineWireTarget.token` 只收串,装不进 `{ mode: 'same-origin-relay' }`),此前子代族八个入口在中继部署下没有任何装法。现在每个入口各收一个可选的注入连线 `wire: { client, capsBaseUrl? }`(通用形 `EngineWireInjection<C>`,`C` = 那一口真用到的动词切片,`AgentClient` 直接满足,测试替身给最小对象即可);给了就**只**用它 —— 已装的引擎目标一个字不读(混用 = 把这一发送到另一个部署);缺席 = 旧路径逐字节。接入文档 **§109a P-1–P-13 / 109a-2 / 109a-3**。
124
+ - `fetchEngineSubagentReport(taskId, { signal?, wire? })`(型 `SubagentReportWire` / `SubagentReportWireClient`:`capabilities` + `runs.subagentOutput`);`tailEngineSubagent(taskId, { wire? })`(`SubagentTailWire` / `SubagentTailWireClient`:`capabilities` + `runs.subagentStream`);`fetchEngineTaskOutput(handle, { signal?, wire? })`(`EngineTaskOutputWire` / `EngineTaskOutputWireClient`:`runs.taskOutput`);`stopEngineTask(handle, { signal?, wire? })`(`EngineTaskStopWire` / `EngineTaskStopWireClient`:`runs.taskStop`);`steerEngineSubagent(target, text, childTaskId?, { wire? })`(`SubagentSteerWire` / `SubagentSteerWireClient`:`runs.steerSubagent`);`resolveSubagentResumeContext(childTaskId?, { wire? })`(`SubagentResumeWire` / `SubagentResumeWireClient`:`runs.resumeSubagent`;交出的 `facade` 即经注入 client,`resumeSettledSubagent` 不变);`requestEngineCompact(sessionKey?, { wire? })` 与 `onEngineTaskBound(taskId, sessionKey?, { wire? })`(`EngineCompactWire` / `EngineCompactWireClient`:`capabilities` + `runs.compact`);`fetchDelegatedPrompt(taskId, { wire? })`(`DelegatedPromptWire` / `DelegatedPromptWireClient`:`sessions.get`)。
125
+ - `engineTaskHandlesCapable(sessionKey?, capsBaseUrl?)` / `engineRowNeedsStopConfirm(taskId, sessionKey?, capsBaseUrl?)`:能力证据键的显式形(给了只按它读,不读槽)。
126
+ - **`capsBaseUrl`** = 宿主 `kickEngineCapsProbe(baseUrl, …)` 用的那把键。读共享能力缓存的入口(任务句柄读 / 停、行停止门)不给 ⇒ 能力未知 ⇒ `null` / `unavailable`(detail 点名)、零请求 —— 已装目标上有证据也不回落;自带能力探测的入口不给 ⇒ 报告 / 尾随每次都探一次(不缓存),压缩不预热、按 fail-open 发。
127
+ - 坏连线(`null` / 非对象 / 读 `client` 就抛)与坏 client(缺动词)同一处置:按各入口既有的「发不出」臂落(`null` / `no-wire` / `unavailable` / `offline` / `unreadable`),零请求、不抛、不留未处理拒绝、不回落已装目标。动词路径的中间段收对象**或函数**(`assistant` / `runs` 本身可调用、动词挂在它上面的函数型命名空间照收,与 0.84.1 plan-review 守卫同答);`client` 本身只收对象。注入动词同步抛(没先返回 promise)与 Promise 拒绝同一处置:错误对象原样交给该入口的失败分类(停止 / resume 按 `status` / `errorCode` 分)。
128
+ - **已装目标在解析那一刻按值快照** `{ baseUrl, token, principal }`:这一发(含压缩的延迟发射与 404 重试、plan-review 的决后回拉)只用这份快照 —— 宿主用 getter / 原地改值表达「当前引擎」时,温切之后旧 run 的那一发仍去原引擎、带原凭证(子代族各入口与 0.84.1 同答;plan-review 的决后回拉在 0.84.1 是回拉那一刻才读目标,这一处与 0.84.1 不同,见 Changed 第 20 条)。
129
+ - **注入 client 上的每一发都有本包独立落定的截止**(读 / 写同档 60 s;压缩能力预热 5 s):到点即按该入口的失败臂落定并中止底层请求 —— 不被 client 的读重试退避 / `Retry-After` 睡眠拖住;调用方自己的 `signal` 照样生效(`null` 与不给同读):调用前已取消 ⇒ 动词不调、零请求;动词调用之后取消 ⇒ 立即落定(同样不等退避睡眠)。写动词(steer / resume / stop / compact)到点落 `error` 臂,detail 说「no answer from the engine within N ms — the request was abandoned (it may still have been received)」:这一发可能已被引擎受理,本包不重发、不撤回。
130
+ - **「没答复」机读位 `unconfirmed: true`**(steer / resume / stop 三只写动词的失败结局各加一个可选键;`reason` 闭集不动):只在「这一发可能已送到、却没有答复」时出现 —— 本包截止先到(注入形);client 自己的每请求时限到点(已装目标形的 sdk 缺省 60 s、注入 client 自带的时限;fetch 以 `TimeoutError` 落定);或传输失败而说不出没送出(fetch 的网络错误 `TypeError`,成因链上没有「发出之前就失败」的码 —— 请求送达后、答复前连接被断,或浏览器拿不到成因;这一形 `detail` 说「no answer from the engine — the connection failed before an answer came back (the request may still have been received)」);或**动词调用之后**调用方取消了等待(取消停得了等待、停不了已送出的请求;`detail` 说「no answer from the engine — the wait was cancelled after the request was sent (cancelling stops only the wait, not the request: it may still have been received)」)。判据单源,plan-review 决断腿同一只。原则:**能证明没送出才说没送出** —— 引擎真答了(4xx / 5xx,含 409 各格)或可证没送出 ⇒ 键缺席;可证没送出 = 调用前就已取消(动词不调;已装目标形的 sdk 以那只信号的取消原因落定 —— 取消原因不必是 `AbortError`,按「拒绝的就是那只原因」认、不看错误名)、注入动词同步抛(没返回 promise ⇒ 请求没发出;只对那一次同步抛成立 —— 同一只错误对象之后在已送出的一发上异步拒绝照标)、成因链上带发出之前就失败的码(连接阶段 `ECONNREFUSED` / `ENOTFOUND` / `EAI_AGAIN` / `UND_ERR_CONNECT_TIMEOUT`,以及 `syscall` 为 `connect` 的 `EHOSTUNREACH` / `ENETUNREACH` / `ETIMEDOUT`;构造期 `ERR_INVALID_URL` / `ERR_INVALID_CHAR` / `ERR_HTTP_INVALID_HEADER_VALUE`,参数校验 `ERR_INVALID_ARG_TYPE`(外来 / polyfill 信号交给 sdk 的并联口);证书校验码与客户端握手 / 配置 `ERR_TLS_*`。OpenSSL 原因码 `ERR_SSL_*` 一只都不算:同名码在对端收下请求之后照样出现,握手期那几形因此照标;射程见 KL-249 / KL-252)。client 时限那一形的 detail 说「within the time limit this client allows」,不带毫秒数。宿主按这一位渲「可能已生效」,不要渲成「失败」,也不要按它重发。压缩腿没有返回形,只留 debug。**判据单源**:`classifySubagentResumeFailure(e)` 的判决 `SubagentResumeFailureVerdict` 同样 +1 可选键 `unconfirmed: true`(入参是 fetch 时限错误 / 本包截止或发出后取消抛的错误 / 说不出没送出的传输失败,且**没有** `status` / `errorCode` 时;直发 sdk 的宿主自己拿到的取消错误分类器分不出发前 / 发后,键缺席,见 KL-253;带机读码的答复永远按码分格,哪怕它的 `name` 恰是 `TimeoutError`)—— 直发 sdk 的宿主复用这只分类器即与本包三只写腿同判;宿主装了两份本包时,一份抛的截止 / 发出后取消错误交另一份的分类器同判。
131
+ - 出站头由 client 自决(同源中继形零 `Authorization`);本包在注入形下不接触任何凭证,日志 / 返回值 / detail 零出现。
132
+ - 新型(公面类型 +17):`EngineWireInjection<C>` 与上列十六个 `*Wire` / `*WireClient`。运行期导出零增减;超集键零增减。
133
+ - **会话规则无损判定的可选名册入参**(CC-228):`sessionPolicyDeliverable(behavior, rules, opts?)` 新增可选第三参 `SessionPolicyDeliverableOptions { readonly roster?: ToolRosterView }` —— 宿主手里这一跑的工具名册(`wiring_manifest` 经 `projectToolRoster` 读出的那一份)。交了名册时,逐条判据判「能写」的名字若**不在**名册的名 ∪ 别名里(原样比、分大小写),以新成因 `not_in_roster` 扣下;不交 = 与 0.84.1 逐字节同答。接入文档 **§109a N-1–N-5 / 109a-4 / 109a-5**。
134
+ - **只收紧、不放宽**:不交名册时被扣下的名字(引擎退役名、含 `__` 而无协议前缀的名字、首尾带空白、带通配、整对端、带括号、非串),**在名册里也照扣、成因与现名不变**。名册是某一跑的快照:部署今天挂着一只恰叫退役名的工具,写进去之后哪一跑没挂它,这条会话就每一跑启动即失败,而会话规则记录只收紧、在较旧的引擎上属主撤不掉。结果:带名册能写的批必定不带名册也能写,且写出的 `toolDeny` 逐字相同。
135
+ - **别名在册 ⇒ 能写**:引擎准备期的名字审计按名册的名 ∪ 别名认;写成别名的 deny 写进会话规则记录,与同一条规则走设置那条路同义,是无损的。名册读法与 0.84.1 的窄撤销动词 `removeRefusedSessionRules` 是**同一份实现**:两处对「这个名字在不在名册里」永远同答。
136
+ - **大小写与拼写**:`read`(名册里是 `Read`)、`mcp__SRV__tool`、名册外的协议工具名、一只这一部署没有的工具 ⇒ `not_in_roster`。引擎对这类名字只告警「匹配不到这一跑挂着的任何工具」,写进去在这里一只都拦不住,端上却会渲「已保存」。
137
+ - **名册坏 ⇒ 整批读不懂**:第三参不是对象、读 `roster` 就抛、名册读不成(不是对象 / `entries` 不是数组 / 任一行没有非空串名字 / `aliases` 在场却不是串数组 / 读属性就抛 —— 一行坏整只不认)⇒ 结果带 `unreadable: true`、一条不写(闭合失败,不退回「没交名册」)。读得懂的空名册是名册(一只工具都没挂)⇒ 今天能写的全部 `not_in_roster`。`roster: undefined` / `null`、`opts` 缺席或为 `undefined` / `null` / `{}` ⇒ 当没交。
138
+ - 引擎的命名空间覆盖形(`mcp__srv` / `a2a__peer` / 工具段带 `*`)今天都先按 `peer_wide` / `wildcard`(带括号的按 `qualified_deny`)扣下,名册在场时成因不变。
139
+ - 纯判定照旧:零网络、零状态、不抛;名册的 `entries`、每行的 `name` / `aliases` 各恰读一次。
140
+ - 公面类型 +1:`SessionPolicyDeliverableOptions`。运行期导出零新增。
141
+ - **会话后台任务停止口 `stopEngineSessionBackground(sessionId, { includeRetained }, opts?)`**(CC-246)—— 三端公共转调口(`POST /v1/sessions/:id/background/stop`,服务端 ≥7.102.0;sdk 12.0.1 `client.sessions.backgroundStop`)。此前端没有合规的调用面:0.84.0 把这一口登成「端直调」,而端不直连 sdk。现在一只口把「判连线 → 判能力位 → 发一次 → 按码分结局 → 窄读受据」收在包里,端只剩「什么时候调」与「怎么渲」。接入文档 **§109a S-1–S-7 / 109a-13 / 109a-14**。
142
+ - **连线**:经本版的共用构造点(与子代族同一处判定)—— `opts.wire: { client, capsBaseUrl? }` 给了就只用它、已装的引擎目标一个字不读;不给 ⇒ 读 `opts.sessionKey` 槽(缺省默认槽)的已装目标。坏连线 / 坏 client ⇒ `unavailable` / `no_wire`,零请求、不抛、不回落已装目标。
143
+ - **能力门先于一切请求**:`capabilities.background.exitFaces` 自有严格 `true` 才发。能力缓存里这把键没读到(没探 / 在飞 / 探测失败;注入形没给 `capsBaseUrl`)⇒ `unavailable` / `capability_unknown`;读到了但不是严格 `true`(键缺席 = 老服务端,没有这条路由;`false` = 没有会话属主面;非布尔 / 只在原型链上)⇒ `unavailable` / `no_exit_face`。两者都零请求。证据键:注入形只读宿主点名的 `capsBaseUrl`,已装目标形读目标的 `baseUrl`。
144
+ - **请求体**:本口自铸恰好一键的 `{ includeRetained }`(必填布尔、没有缺省:`true` 连显式保留的活服务一起停,`false` 保留它们、它们在受据里是 `retained_skipped`);调用方交来的对象上多余的键不上 wire。
145
+ - **结局闭集** `EngineSessionBackgroundStopResult`(按 `kind` 判别):`stopped`(200;`receipts` = 逐条窄读的受据,`id` 与受据词原样 —— 四词 `killed` / `already_gone` / `retained_skipped` / `no_pgid` 之外的词也保留该行、词不改写,交受据归类口落「可能仍在跑」,宿主因此能点名是哪一条;`id` 读不出、或词不是非空串的行不编造,计进 `unreadableReceipts`(≥ 1 才带);200 体整只读不出 ⇒ `receipts` **缺席**,不折成空表)· `unavailable`(零请求;`why` ∈ `bad_input` / `no_wire` / `capability_unknown` / `no_exit_face`)· `refused`(引擎答了拒绝;按 `errorCode` 分,码先于状态:`credentials_required`〔503 `auth.service_token_required`〕/ `not_permitted`〔其余 `auth.*` 或无码 401 / 403〕/ `ownership_required`〔501〕/ `session_not_found`〔404 `not_found.session`〕/ `route_absent`〔404 `not_found.route`〕/ `bad_request`〔具体的 `request.*` 码或无码 400;服务端在拒绝不带码时按状态补的粗码(`isStatusDerivedCoarseCode`)不比状态多说什么 ⇒ 读得到状态时按状态兜底,409 `request.rejected` 与无码 409 同落 `other`〕/ `rate_limited`〔`limit.rate_exceeded` 或无码 429;引擎给了等待量才带 `retryAfterMs`〕/ `other`;`status` / `errorCode` 读得到才带)· `error`(发了但失败:认不出的 5xx 等、传输层失败、调用方自己取消)。非 `stopped` 的三臂都带一句 `detail`。
146
+ - **「没答复」机读位 `unconfirmed: true`**(只在 `error` 上):这一发可能已送到、却没有答复(注入 client 上本包 60 s 独立截止先到;client 自己的每请求时限到点;请求送达后连接断了等说不出没送出的传输失败;或停止请求发出之后调用方取消了等待)—— 停止可能已经落地,宿主渲「可能已停」,不要渲「停止失败」。判据与本版子代族三只写动词同一只;引擎真答了、或可证没送出(调用前就已取消 —— 零请求;注入动词同步抛;成因链上带连接阶段 / 构造期(含参数校验)/ 证书校验与客户端握手配置的码;OpenSSL 原因码 `ERR_SSL_*` 不算)⇒ 键缺席。
147
+ - **写动词、不幂等、不重试**:每次调用恰发一次(非提交类 POST,sdk 不重试;本包不自己重发)。重复停止安全但不是空操作:已收掉的 shell 行下一次答 `already_gone`,但每一次都对那一刻还活着的全部后台工作再收敛一遍(两次之间新起的后台命令也会被停;有后台行时每次都再等一次宽限,缺省约 1 s)。
148
+ - 受据只含 shell 行(`background_bash` / `monitor`);后台代理 / 工作流由会话结算、不出受据 ⇒ `receipts: []` 不等于「什么都没在跑」。`no_pgid` = 没有同步硬收落地(远端 / 沙箱执行的常态),**可能还在跑**,绝不渲成「已停」。
149
+ - 绝不抛:入参 / 选项 / 连线 / 能力记录 / 应答体 / 错误对象上的取值器抛,一律落进结局闭集;宿主日志口抛不改结局。凭证不经本口(不读、不记、不回显)。
150
+ - **受据归类口 `engineSessionBackgroundReceiptReadingOf(outcome)`**(CC-246)—— 纯函数、绝不抛:把一条受据的 `outcome` 词归成三态并给出该态唯一的一句用户面话,三端调它渲染,不各自按表判。`killed` / `already_gone` ⇒ `stopped`(「Stopped.」);`retained_skipped` ⇒ `still_running`(「Still running — it was set to keep running, so it was left in place.」);`no_pgid` ⇒ `may_be_running`(「May still be running — the engine could not confirm that it ended.」)。认不出的词(将来的新词、大小写不同、前后空白、近形、原型链名)⇒ `may_be_running` 并在 `unrecognizedOutcome` 原样带出该词 —— **绝不**归成已停;非串入参(包装串对象、带 `toString` 的对象、数组等不强转)⇒ `may_be_running`、不带词。三态闭集的运行期镜像 `ENGINE_SESSION_BACKGROUND_RECEIPT_STATES`(冻结,序 = 已停 / 仍在跑 / 可能仍在跑)由措辞表的键派生。非「已停」两句不出现 stop 字样。
151
+ - 新型(公面类型 +9):`EngineSessionBackgroundStopClient`(动词切片 `sessions.backgroundStop`,`AgentClient` 直接满足)/ `EngineSessionBackgroundStopWire` / `EngineSessionBackgroundStopOptions` / `EngineSessionBackgroundReceipt` / `EngineSessionBackgroundStopUnavailableWhy` / `EngineSessionBackgroundStopRefusedWhy` / `EngineSessionBackgroundStopResult` / `EngineSessionBackgroundReceiptState` / `EngineSessionBackgroundReceiptReading`。运行期导出 +3(停止口、归类口、三态闭集镜像);超集键零增减。
152
+
153
+ - **会话存档读不出(`corrupt_session`)的三处载体读口与一句人话**(CC-217)—— 服务端 7.104.0 起,一只会话的存档读不出时(文件后端:没有会话头;两种 SQL 后端:一行坏的会话事件)三种后端答同一个码 `corrupt_session`(500)。它落在三处:HTTP 拒体(同步提交口在一个 token 都没烧时、流式提交在应答头之前、直接读会话的各口)、终局因由(流式提交已在跑时 `done.result.terminal.code`;做过工作的同步提交 200 + failed 体)、run 行(后台 run 的 `GET /v1/runs/:id`)。三只读口共用一只判定 `isCorruptSessionCode`。接入文档 **§109a K-1–K-3 / 109a-15**:
154
+ - `isCorruptSessionError(err)` —— 抛出物按码判(折叠形按原码),不看状态、不读散文、绝不抛;
155
+ - `isCorruptSessionResult(result)` —— `done.result` / 同步 200 体,两代字节都认,只认 failed 臂;
156
+ - `isCorruptSessionRunRow(row)` —— run 行:结果读得出终局时只信结果,读不出才读行上的 `errorCode` 列;
157
+ - `corruptSessionContent()` —— 唯一一句:存档读不出、重试无用、要这台引擎的运维修、先换个会话继续。不复述引擎原句,零机器码。
158
+ - `CORRUPT_SESSION_ERROR_CODE` / `isCorruptSessionCode(code)`(严格等值)。
159
+ - **turn 错误判决 `http` 臂新位 `sessionUnreadable?: true`**(CC-217)—— 这次拒绝的码是 `corrupt_session` 时在场(只铸 `true`,别的码键缺席),与 `isCorruptSessionError` 同判;与 0.82.0 的 `storedRowWhere` 同一只取码口。
160
+ - **`session.records_skipped` 通告**(CC-217)—— 服务端自铸的第三个通告码(受众 user):一只会话的存档被打开时有记录读不出、被跳过了,这一轮照跑但模型读到的历史少了一截。进服务端自铸码表 `SERVER_NOTICE_AUDIENCE`(在册、受众 user)与按码派发口 `readEngineNoticeFacts`;事实窄读器 `readSessionRecordsSkipped(notice)` 读 `{ dropped, entriesKept, sessionId }` —— 两个计数逐格读,缺席或不是非负整数 ⇒ `'unknown'`(**不折 0**,也不因一格读不出吞掉整条通告);`sessionId` 读不出 ⇒ 整只缺席。补句 `sessionRecordsSkippedNote(facts)` 只在留下的条目恰为 0 时给一句「上下文为空,这一轮照跑,模型看不到之前的对话」(入参按不可信读:不是对象 / 读属性就抛 ⇒ 不给补句、不抛)。新型 `SessionRecordsSkippedFactsView` / `NoticeCountReading`(`number | 'unknown'`)。接入文档 **§109a K-4 / K-5**。
161
+ - **删会话被拒的 409 读口 `sessionDeleteConflictFromError(err)` / `sessionDeleteConflictContent(detail)`**(CC-243)—— `DELETE /v1/sessions/:id` 的 409 按码分三形:`children_alive`(服务端 7.104.0 新码 `conflict.session_children_alive`:这只会话派出的后台子代跑在本副本停不了的地方,删除在任何东西被删之前就拒了;`remaining` = 这些子代的 id,与名册上的 `handle` 同串 —— 逐项非空串才收、坏项丢弃不编造,一项都读不出 ⇒ 键缺席,不是空表)· `active_run`(`conflict.session_active_run` + `activeTaskId`)· `unrecognized`(别的 `conflict.*` / 无码 409,族兜底不猜)。三句人话:两个具名臂都明说什么都没删并给出路;子代 id 至多点名三只、先转义控制字符再封长。出句口按不可信读:不抛、恒回串 —— 入参不是对象、`kind` 认不出、读属性就抛 ⇒ 兜底那一句;`remaining` 只点名非空串 id(不是数组 / 一只都读不出 ⇒ 与缺席同句)。常量 `CONFLICT_SESSION_CHILDREN_ALIVE`,新型 `SessionDeleteConflictKind` / `SessionDeleteConflictDetail`。`remaining` 顶层与 sdk 错误对象的 `extra` 两处都认。接入文档 **§109a K-6 / K-7**。
162
+ - **`/decide` 停驻挪动族读口**(CC-243)—— `decide.not_parked` / `decide.gate_moved` / `decide.claim_lost` 说的是同一件事:决断送到时那张卡已经不在原来的状态上(被停 / 已被别处决定 / 重新停驻 / 另一次决断先认领;7.104.0 起 `not_parked` 多一种触发:卡所属的根会话在等待期间被删了)。`decideParkMovedFromError(err)` 按码读(不依赖 sdk 错误类、不读散文)⇒ `{ code, taskId? }`;`decideParkMovedContent(detail)` 三句(逐码说发生了什么 + 「这次决定没有被施加,重取待决列表、按现在的状态再决」;认领被抢那一句多一句「列表里还在就过一会儿再决」;入参不是对象 / 码不是串 / 读属性就抛 ⇒ 三码共用的那一句,不抛)。闭集 `DECIDE_PARK_MOVED_CODES`(冻结,三员)+ 判定 `isDecideParkMovedCode(code)`(严格等值,不按 `decide.` 前缀放宽)+ 三只码常量;新型 `DecideParkMovedDetail`。接入文档 **§109a K-8 / 109a-16**。
163
+ - **能力面公钥发现读口 `projectSealedKeyCapability` / `noteEngineCapsForSealedKey` / `observedSealedKey` / `forgetSealedKeyReading` + 型 `SealedKeyReading`**(CC-243;服务端 ≥7.104.0 `GET /v1/capabilities.sealedKey`)—— 与其余能力位读器同一套四态(`unobserved` / `not_reported` / `present`)与同一套读账口(tee / 读口 / 换代失效 / 测试钩 `__resetSealedKeyReadingsForTests`)。接入文档 **§109a M-7 / 109a-19**:
164
+ - `present` = 段上**恰**三键 `alg` / `publicKeyId` / `publicKey` 逐键非空串(都按自有键读),三键原样进读数;`alg` 按开集收(今天唯一值 `libsodium-sealedbox-x25519`,宿主拿它与自己的封装库比对)。
165
+ - **只出公钥三键**:段上多出来的任何键(私钥、秘钥、`createdAt`、别的)一律不进读数;读数是新建对象、不与回体共享引用 —— 这只读口不是凭证面。
166
+ - 键缺席 ⇒ `not_reported`,**不要封**:两种含义(老服务端不认识这一位 / 这台引擎起服时没建成钥匙保管店)是同一个动作,读口不替宿主分,也不编默认公钥。段在场却畸形(`null` / 非对象 / 数组 / 缺一键 / 空串 / 非串)⇒ 这一格删掉(读口答 `unobserved`),不铸半截读数、不留上一台引擎的公钥。
167
+ - 按引擎地址分格:多副本不共享保管目录时各副本答的公钥不同,别跨地址复用一份。
168
+ - **「这一次运行别捕获文件历史」的请求词出口**(CC-243;服务端 ≥7.104.0 提交体键 `fileHistory: "disabled"`)—— 请求构造器车道表新增 `fileHistory` 一行(交互 / 无人值守两条用户车道有座、live 门后;side-channel 车道无座 —— 它零工具面,不会改任何文件);单成员闭集:值恰是 `'disabled'` 才上请求体,别的值(`'Disabled'` / `'off'` / 布尔 / 对象 …)构造期 `TypeError`(不回显值),`undefined` / `null` = 照常捕获。接入文档 **§109a M-4 / 109a-18**。
169
+ - 片段口 **`fileHistoryDeclarationField(reading, captureOff)`**:只在能力读数是 `on-optional`(引擎明说「可以按 run 关」)且宿主意图是「别捕获」时给 `{ fileHistory: 'disabled' }`,其余一律空片段 —— 老服务端(≤7.103.x)对这一请求键是表外键、整条提交会被 400 拒,所以宿主设置里早就存在的「不要文件检查点」开关**不许**无条件映射成这一键。用法:`buildTaskRequest({ …, ...fileHistoryDeclarationField(observedFileHistoryCapture(), captureOff) }, lane)`。🔴 宿主义务:用户关了文件历史时,第一次提交前先等这把键的能力探测落地(读数没到时片段口不给请求词,那一次运行照常捕获;KL-244)。
170
+ - 字面常量 `FILE_HISTORY_DISABLED`(`'disabled'`)供断言锚用;拼请求走片段口。
171
+ - 本包不预判「同一提交又要还原文件」的冲突:服务端在受理时 400 `request.field_conflict`(任何副作用之前);宿主怎么处理见接入文档 §109a-18(KL-243)。
172
+ - **按状态派生的粗码识别表 `STATUS_DERIVED_COARSE_CODES` + 判定口 `isStatusDerivedCoarseCode(code)`**(CC-243)—— 服务端分发器在拒绝**不带码**时按 HTTP 状态补的通用码(`request.rejected` / `auth.unauthorized` / `auth.forbidden` / `not_found.resource` / `request.payload_too_large` / `request.unprocessable` / `limit.rate_exceeded` / `capability.unavailable` / `internal.error`)。精确比对、不按前缀猜、冻结数组。**以服务端分发器的铸点为准**:404 是 `not_found.resource`(不是裸 `not_found`),409 没有专属粗码、落 `request.rejected`(不是 `conflict`)。今天服务端契约没有这张表的成节闭集,本表按分发器镜像,门对服务端包逐词双向对拍;上游出成节闭集与同名常量后改从上游取(KL-246)。接入文档 **§109a M-8 / 109a-20**。
173
+
174
+ ### Changed
175
+
176
+ 🔴 **已发导出的可观察变化(逐条;按旧行为断言过的测试请按接入文档 §109a′ 改锚)**:
177
+
178
+ 1. **三个运行期名字退出根入口**(型面 BREAKING)—— 见 Removed。
179
+ 2. **`ASK_ORIGIN_WORDS` / `APPROVAL_MANDATE_WORDS` 就是 SDK 导出的那两个数组**(CC-230):值即 SDK 包根的 `ASK_ORIGINS` / `PERSISTED_RULE_MANDATES`(引用相等),不再是本包的抄件。
180
+ - **不再冻结**:SDK 没冻结这两个数组,`Object.isFrozen(...)` 由 `true` 变 `false`。请当只读用。本包自己的判定不读它们 —— 出身措辞、常驻姿态判定、`isApprovalMandateWord`、`approvalMandateDetail`、`readApprovalMandate` 在这两个数组被就地改写后照答原样。
181
+ - **运行期成员跟着你装的 SDK 走**:SDK 在 peer 地板(12.0.1)时与 0.84.1 逐词同(出身十一词、强制六词)。装了加过词的新 SDK 时,新词会出现在数组里,而本包的句子与闭集判定仍只认本包构建时那一代 SDK 的词:新出身词走既有的「这个词比这一端新」那一句,新强制词在 `readApprovalMandate` 里仍读作缺席。
182
+ - **型不变**:`ASK_ORIGIN_WORDS` 仍是 `readonly string[]`;`APPROVAL_MANDATE_WORDS` 与 `ApprovalMandateWord` 仍是本包构建时那一代 SDK 的六词字面形。**谁要跟**:按值 `includes` / 遍历的写法照旧成立;断言它们冻结的判据改锚;别就地改写(改的是 SDK 的表,所有读者一起看到)。
183
+ 3. **`ReasoningEffort` / `WireThinkingLevel` / `PermissionMode` / `PermissionModeIntent` 改为 SDK 型的别名**(CC-230):前两者 = SDK `NonNullable<TaskRequest['reasoningEffort']>`,后两者 = `NonNullable<TaskRequest['permissionMode']>`,型从此跟着装的 SDK 走(peer 地板下成员逐词同)。运行期词表(`SEAT_REASONING_EFFORTS` / `PERMISSION_MODE_INTENTS` / `HEADLESS_PERMISSION_WIRE_MODES`)仍是本包构建时那一代。**谁要跟**:对这几个型写穷举 `switch` 的端,SDK 加一档的那次升级会先在编译期看到新档,而本包的运行期词表要到本包随之发版才认它。
184
+ 4. 🔴 **成因闭集 `SessionPolicyWithheldWhy` / `SESSION_POLICY_WITHHELD_WHY` 六词 → 七词**(+`not_in_roster`,排在最后;冻结数组照旧由措辞表的键派生,旧六词的序与用户面话逐字节不变)(CC-228)。`not_in_roster` 只在宿主交了名册时出现。**谁要跟**:对成因词做穷尽 `switch` / 按词建表(`Record<SessionPolicyWithheldWhy, …>`)的端编译期会红 —— 加一臂,取句用 `sessionPolicyWithheldNotice('not_in_roster')`,不要自己写;按「恰六词」断言的测试改锚。今天各端都没有按成因词分支的读点,不交名册的调用零改动。另:`SessionPolicyDeliverability.unreadable` 的触发条件多两形(只在交了第三参时:第三参不是对象 / 名册读不成)。
185
+ 5. 🔴 **`adapt()` 不再认压缩分割线上的旧名附带文件键 `attachedFiles`**(CC-221):0.83.0 把 CC 形 `system/compact_boundary` 上的附带文件键改名 `_sema_attached_files`,包内把它投成「Referenced file」附件行的读点当时两名并读、成文「0.84.0 起只认新名」;0.84.0 / 0.84.1 没有执行,本版执行。现役流不受影响(投影口自 0.83.0 起只铸新名,`runStream` → `adapt()` 这条路上旧名从不出现);受影响的只有「宿主把 0.82.x 及更早落盘的 CC 形行直接喂回 `adapt()`」这一形:只带旧名的 `compact_boundary` 行本身照常过境(键原样保留、不剥),但不再产出「Referenced file」附件行;两名同在时仍只认新名。**谁要跟**:各端按本版普查零读点;要在旧转录上继续出附件行的宿主,喂回之前自己把 `attachedFiles` 改名成 `_sema_attached_files`(值原样)。
186
+ 6. 🔴 **子代写动词撞上 sdk 每请求时限那一臂**(CC-236;已装目标形):`steerEngineSubagent` / `stopEngineTask` / `resumeSettledSubagent` 在 fetch 以 `TimeoutError` 落定时,失败结局从 `{ ok: false, reason: 'error', detail: <TimeoutError 原句> }` 变成 `{ ok: false, reason: 'error', detail: 'no answer from the engine within the time limit this client allows — …', unconfirmed: true }`;`classifySubagentResumeFailure` 对无 `status` / 无 `errorCode` 且 `name === 'TimeoutError'` 的入参同改(`reason` 不变)。同三只写动词撞上**传输失败而说不出没送出**(fetch 网络错误 `TypeError`,成因链上没有「发出之前就失败」的码:请求送达后连接断了、浏览器拿不到成因、fetch 的坏端口拦截、undici 不带码的非法头值、OpenSSL 原因码 `ERR_SSL_*`)时,失败结局从 `{ ok: false, reason: 'error', detail: <原句> }` 变成 `{ …, detail: 'no answer from the engine — the connection failed before an answer came back (the request may still have been received)', unconfirmed: true }`,分类器同改;可证没送出的逐字节不变 —— 成因链上带连接阶段码(`ECONNREFUSED` / `ENOTFOUND` / `EAI_AGAIN` / `UND_ERR_CONNECT_TIMEOUT`,`syscall` 为 `connect` 的 `EHOSTUNREACH` / `ENETUNREACH` / `ETIMEDOUT`)、构造期码(`ERR_INVALID_URL` / `ERR_INVALID_CHAR` / `ERR_HTTP_INVALID_HEADER_VALUE` / 参数校验 `ERR_INVALID_ARG_TYPE`)、证书校验码与客户端握手 / 配置 `ERR_TLS_*` 的,以及注入动词同步抛的。OpenSSL 原因码 `ERR_SSL_*`(含 `https` 指向明文端口时握手期的 `ERR_SSL_WRONG_VERSION_NUMBER`)证明不了没送出 —— 同名码在对端收下请求之后照样出现 —— 落上面那一臂(保守方向,KL-249)。`stopEngineTask` / `resumeSettledSubagent` 在**请求发出之后**调用方取消(0.84.1:`{ ok: false, reason: 'error', detail: <取消原句> }`)现落 `{ …, detail: 'no answer from the engine — the wait was cancelled after the request was sent (cancelling stops only the wait, not the request: it may still have been received)', unconfirmed: true }`;调用前就已取消的逐字节不变(取消原因不必是 `AbortError`:`AbortSignal.timeout(…)` 到点后才交进来、自定义取消原因同样键缺席、`detail` 是原取消句;判据是「拒绝的就是那只取消原因」,不看错误名;`resumeSettledSubagent` 对任何 facade 都这样判,包括宿主自己给的 —— 宿主 facade 没理会已取消的信号、以别的错误落定时按形判)。别的失败臂逐字节不变。**谁要跟**:按 `detail` 原句断言这几臂的测试改锚;拿 fetch 坏端口(1 / 9 等)当「连不上」的格换监听后关掉的端口;拿 `https` 指向明文端口当「连不上」的格改锚(本版起照标)或换证书校验失败;「发出之后取消 ⇒ 键缺席」的格改锚(调用前取消的格不动);失败回执可按 `unconfirmed` 分句(有它渲「可能已生效」)。
187
+ 7. 🔴 **`reopenPlanReviewCard` 拒开面变宽**(CC-241):0.82.1 起只在本包投递口 **POST 未落地**时拒开;本版起按台账判 —— 本包投递口从 POST 到**投出结局**的整段(含决后回拉,至多 15 s)、宿主登记的交出、以及调用方读起点早于某笔结算(快照陈旧)都拒开,判决仍是 `{ reopened: false, _sema_decisionInFlight: true }`;结算即放(无冷却)。异步判定的读后复核同样按台账(读起点取调用方读起点与判定前刻度中较早的一枚),`decisionHandedOver` 谓词保留为并联的第二证据。**谁要跟**:按「POST 落地后重开照开」写的判据改锚(新判据眼见 §109a′);端上零改动即得更宽的拒开面。
188
+ 8. **`HITL_REJECT_MESSAGE` 的已发产物字面位置**(CC-230):值与 `REJECT_MESSAGE` 同一句、字节不变;这句字面在产物里只剩 `dist/adapt/wireShapes.js` 一处,`dist/hitl/frameRouter.js` 不再含它。**谁要跟**:按产物文件钉这句字面「在哪只文件里铸」的登记(终端有一条)删掉 `hitl/frameRouter.js` 那一行。
189
+
190
+ 9. 🔴 **`session.records_skipped` 在册、受众 `user`;派发表 +1 码**(CC-217):`SERVER_NOTICE_AUDIENCE` 两行 → 三行;`engineNoticeInCatalog('session.records_skipped')` `false` → `true`、`noticeAudienceOf` `operator` → `user`、`readEngineNoticeFacts` `undefined` → typed 事实。`ENGINE_NOTICE_FACT_READERS` / `EngineNoticeFactsCode` / `EngineNoticeFacts` +1 码(型面加宽),用户面恰六码 → 七码。**谁要跟**:按受众分发的端不改代码即跟着走;按 `f.code` 穷举到 `never` 的 `switch` 当场编译红 —— 加一臂(计数是 `number | 'unknown'`,别当数算)。
191
+ 10. **turn 错误判决 `http` 臂 +可选位 `sessionUnreadable?: true`**(CC-217;型面加宽):码为 `corrupt_session` 时在场、恒 `true`,别的码键缺席。**谁要跟**:对 `http` 臂做键集恒等断言的端放宽。
192
+ 11. 🔴 **流上的终局错误行与 CC 形结果帧 `errors[0]` 在码为 `corrupt_session` 时补一句**(CC-217;`runStream` / `terminalToSdkResult` / `doneToSdkResult` / `failedToSdkResult`):引擎原句之后换行接 `corruptSessionContent()`;行身份前缀仍是 `API Error:`;别的码逐字节同旧(原句一字不差而码不是本码的形也不补 —— 按码不按词)。**谁要跟**:按「这一码的终局行 = `API Error: <原句>`」整串断言的格改锚。
193
+ 12. 🔴 **决断出口的失败文字在 `/decide` 停驻挪动三码上补一句;停泊腿按码续读流**(CC-243):审批卡的批准 / 拒绝、提问卡作答、中断撤卡撞 `decide.not_parked` / `gate_moved` / `claim_lost` 时,失败文字在原句之后补 ` — ` + `decideParkMovedContent(…)`;停泊腿对三码一律按码走「门已不在原处 ⇒ 续读这条 run 的流、按当前状态重新呈卡」(仍受同因连续一次的限次)。修前靠扫服务端原句,会话被删那一形(7.104.0 新触发,原句不带 already)被当成真失败收场。**谁要跟**:按「`decide(approve|deny) failed: <原句>` 逐字」断言的格改锚;端上自有「门已决」扫词链的,在扫词之前问 `isDecideParkMovedCode`。
194
+ 13. 🔴 **`fileHistoryCaptureMode` 认 `on-optional`;`FileHistoryCaptureMode` 三员 → 四员**(CC-243):`present` / `on-optional` 修前答 `'unknown'`,现答 `'on-optional'`;`fileHistoryCaptureDoctorDetail` 对它修前落「a mode this client does not know yet」那一句,现有自己的一句(其余五句逐字不变)。**谁要跟**:按 `FileHistoryCaptureMode` 穷举的 `switch` 编译红 —— 该接这一态(它是「可以关」的唯一信号)。
195
+ 14. **`readRunTerminal` 在同时带 `terminal` 与顶层 park 词的载体上**(只有服务端 7.104.0 起的同步 park 体会这样)按 park 词读 `paused`、`flatStatus` 带回那个词(修前按因由读、`flatStatus` 缺席;打架形修前按因由、现按 park 词)。别的载体一个字节都没变(CC-243)。
196
+ 15. **`resumePolicyBlockContent`**:`named` 读数里的码是按状态派生的粗码时,第二句落「The refusal did not name a more specific check」并括注那个粗码,不再说「The check that refused it: request.rejected」;具体码照旧点名;`resumePolicyBlockFromError` 的读数不变(CC-243)。
197
+ 16. 读法未改、但服务端 7.104.0 让读数变了的三处(上游形变,不是本包改了判据):同步 park 体的 `readRunTerminal(...).plane` 由 `'flat'` 变 `'cause'`;`terminalEventFromRunRow` / `withHeadlessR1Reconnect` 在 park 行上立刻交出 `done`(不再计预算重试到耗尽);`effectiveWireErrorCode` 在不带码的折叠上答粗码(修前答折叠码本身)(CC-243)。
198
+ 17. 🔴 **`decidePlanReview` 决断 POST 撞上传输失败而说不出没送出的那一臂换句**(CC-236 同批):请求送达后、答复前连接被断(或拿不到成因的网络错误、fetch 的坏端口拦截、undici 不带码的非法头值、OpenSSL 原因码 `ERR_SSL_*` —— 含 `https` 指向明文端口时握手期的 `ERR_SSL_WRONG_VERSION_NUMBER`,同名码在对端收下决断之后照样出现)时,结局正文从「The plan_review decision could not reach the engine: <错误串>」变成「The plan_review <决断> got no answer from the engine: the connection failed before an answer came back, and the request may already have reached the engine — it may have taken effect (…)」;`effect` 仍是 `unconfirmed`、机读位不变。**可证没送出**的照旧「could not reach the engine」(与 0.84.1 逐字节同):已装目标形与注入形的决断动词同步抛(没返回 promise)、成因链上带连接阶段码(拒连 / 解析不出主机 / 连接建立超时,`syscall` 为 `connect` 的主机或网络不可达与连接超时)、构造期码(非法 URL / 非法头值)、证书校验码与客户端握手 / 配置码。判据与子代族写腿同一只(决断腿不再自持一份超时判定);同一只错误对象先同步抛、之后在已送出的一发上异步拒绝 ⇒ 第二次落换句那一臂。**谁要跟**:按「传输失败 ⇒ could not reach」整串断言、而输入是请求送达后断连 / 坏端口 / `https` 指向明文端口的格改锚;拿 fetch 坏端口当「连不上」的格换监听后关掉的端口(KL-249)。
199
+ 18. **`fileHistoryCaptureMode` / `fileHistoryCaptureDoctorDetail` 坏入参由抛改为答值**(CC-243 同批):入参不是对象(`undefined` / `null` / 串 / 数)、`kind` 认不出、`present` 却不带非空串词、读属性就抛 —— 0.84.1 两只口对 `null` / `undefined` 都抛 `TypeError`,doctor 口对 `{ kind: 'present' }` 抛、对认不出的 `kind` 答 `undefined`;现在判据口答 `'unknown'`,doctor 口答「not observed」那一句(不说 off、不编词)。正常四态逐字节不变。**谁要跟**:按「坏读数会抛」断言的格改锚。
200
+ 19. **`sandboxDegradeHint` 镜像索引缺席那一臂的句子用配置中心现名**:括注里的配置中心由旧名改用现名,新句为「This worker has no sandbox image index configured (the sema-web-admin config center is not attached), so per-task profiles cannot resolve.」;第二行、另三臂与判别逐字节不变。**谁要跟**:按原句逐字断言的格改锚(四端产品源码零读点)。
201
+ 20. **`decidePlanReview` 已装目标形的决后回拉所带凭据**(CC-236 同批):0.84.1 的回拉在回拉那一刻读宿主装进来的目标对象(宿主用 getter / 原地改值表达「当前引擎」时,决断 POST 与回拉之间温切 ⇒ 回拉去新目标、带新凭据);本版决断与回拉都从解析那一刻按值快照的同一份 `{ baseUrl, token, principal }` 构造 ⇒ 回拉仍去原引擎、带原凭据(与决断同一份)。温切只影响下一次决断。决断请求、结局文字与机读位不变。**谁要跟**:依赖「回拉时轮换过的新 token」的宿主(0.84.1 上回拉会带它)改为在下一次决断前轮换;按回拉请求头断言新 token 的格改锚。
202
+ 21. 🔴 **`decidePlanReview` 决后回拉证出门身份变了那一形**(CC-241 同批):卡由 `armPlanReviewApproval` 立、决断 200 后回拉 run 行仍是 `needs_review` 而 paused 因由的 `checkpointId` 与立卡时不同(run 已离开原门、停在新的一道 plan 门)—— 0.84.1 落 `effect: 'still_parked'` 与「… STILL locked on the same review gate … did NOT take effect …」;本版落 `effect: 'advanced'` 与「The plan was <approved|rejected> and the task advanced to a NEW approval gate (post-decide status: needs_review) — the next approval card will surface it; this is not a completion yet.」(与 `suspended` 同一铸点,尾句随 `advanced`)。身份相同 / 缺一边 / 公开口直调(没有立卡时的身份)照旧 `still_parked`。**谁要跟**:按 `still_parked` 断言这一形的格改锚;按 `effect` 分句的端零改动即得「另一道审批在等」那一句。
203
+
204
+ 其余改动:
205
+
206
+ - **引擎事实表改为构建期生成,不再手抄**(CC-230):通告码册 `ENGINE_NOTICE_CODES`、受众表 `ENGINE_NOTICE_AUDIENCE`、MCP 注入丢弃原因 `MCP_INJECTION_DROP_REASONS`,以及会话规则翻译判定内部用的两张表(引擎协议命名空间前缀、引擎退役工具名 → 现名),改由 `scripts/gen-upstream-tables.mjs` 从**已装引擎包的包根出口**生成到 `src/generated/` 下的纯字面模块(随源码入库)。本包运行期仍不 import 引擎包。**值不变**:每张表与 0.84.1 逐元素、逐序相同(受众表的键序仍是码册序);三个公面名就是生成物那几个冻结对象,型不变。服务端自铸的通告码(`SERVER_NOTICE_AUDIENCE`;本版三行,见上第 9 条)不在引擎表里,仍是本包手写的一小张;`engineNoticeInCatalog` / `noticeAudienceOf` 的组合规则与 0.84.1 同:先查引擎表,再查服务端表,两表之外保守判 `operator`。接入文档 **§109a T-1–T-3 / 109a-1**。
207
+ - **包内多份同一事实收成一份**(CC-230;零 wire 面):`SEAT_REASONING_EFFORTS` / `PERMISSION_MODE_INTENTS` / `HEADLESS_PERMISSION_WIRE_MODES` 值、序与形制不变(仍是彼此独立、不冻结的数组),改由每组词唯一一只运行期元组派生,那只元组与 SDK 型在构建期两向钉住;`HITL_REJECT_MESSAGE` 与 `REJECT_MESSAGE` 同一句、字面只剩一处;取消终态码与档位五词同样各只留一份。
208
+ - **plan-review 的 client 构造迁到同一个共用构造点**(CC-236):`armPlanReviewApproval` 的在场判与版本证据键不变;三条「发不出」出路的句子逐字不变(槽空 / 注入 client 不可用 / 目标形造不出);已装目标形的决断 6 h client 与回拉 15 s client 从解析那一刻按值快照的同一份目标构造(宿主的 getter 目标在决断与回拉之间温切,回拉仍去原引擎;回拉所带凭据相对 0.84.1 的可观察变化见上第 20 条)。
209
+ - **不变**(CC-236):八个入口与两只行停止门不带新位 ⇒ 请求体 / 出站头 / 会话参数 / 取址闸序(先连线、后取址)/ 能力位缓存 / 结局形状逐字节同 0.84.1(时限 / 传输失败 / 发出后取消三臂除外,见 Changed 第 6 条与接入文档 §109 P-13);`EngineWireTarget` 型不动;`makeEngineWireClient` 不动;`subagentResumeAvailable(baseUrl)` / `auditRetainWithoutWake({ baseUrl })` 与十五只能力读器的显式 `baseUrl` 入参(中继宿主早已可用)不动。
210
+ - 投递口闩(POST 未落地 ⇒ 第二次 `decidePlanReview` 拒)判据与窗**不变**,只是改由决断台账承载;`__resetPlanReviewDecisionLatchForTests()` 现在清整本账。结局机读位 `_sema_planReviewOutcome` 由台账同一笔投出,每条结局恰对应一笔,宿主不再需要按数认领结局(CC-241)。
211
+ - **`surfaceRememberNotApplied` 撤回退役预告,留在公面**(CC-221):0.84.0 把它与下面三名一起定为 0.85.0 退出,前提是「四端零具名 import」;终端在飞版已具名 import 并直调它(自己读回体的停泊腿用它说同一句「本会话允许没被记住」),前提失效。行为不变。
212
+ - 常驻姿态谓词 `askSurvivesPosture` 答 `unknown`(本包不认识的出身词)时宿主**出卡问人**、不折成姿态放行 —— 成文写进接入文档 **§109a-12**;判定本身不变。
213
+ - **能力词 `fileHistoryCapture` 两代都认**(CC-243):服务端 7.104.0 起能力词闭集是 `off` / `on-optional`(`on-always` 删词;7.97.0–7.103.x 仍发它)。7.104.0 起 `FILE_HISTORY_CAPTURE=false` 只关**捕获**、回退四位照真:本包两只读器本来就各答各的(捕获读 `off` 不牵连回退可用性),门加格钉住。
214
+ - **同步提交停在门上的 200 体**(CC-243;服务端 7.104.0):体改成「引擎结果本身 + 回执三键 `taskId` / `sessionId` / `status`」,带 `terminal` ⇒ `readRunTerminal` 走因由臂;判序与 sdk 13 的三代读法对齐 —— 因由成形之后**先看顶层 park 词**(`suspended` / `needs_review`),是就读 `paused`(绝不把一个服务端明说停在门上的体读成终局)。老服务端的三键体照旧走扁平臂;因由座在场却读不出照旧 `unknown`(KL-248)。
215
+ - **park 中的 run 行带 `result`**(CC-243;服务端 7.104.0):无头重连腿读到 park 行时**立刻**合成 `done`(paused)交给下游(与活流收到 park 终帧同形),不再计预算重试到耗尽才走判死文案;不带 `result` 的 park 行(老服务端)照旧重试。读法本身没改(「行上带 result 对象就合成」一直如此)。
216
+ - **处置订正(无行为面)**(CC-246):0.84.0 接入文档把 `sessions.backgroundStop` / `capabilities.background.exitFaces` 登为 declined「宿主动作,本包零读点,端直调」—— 作废。端不直连 sdk,这一口由本包转调(见 Added);成文改口见接入文档 **§109a′**。
217
+
218
+ ### Removed
219
+
220
+ - 🔴 **三个运行期名字退出根入口**(型面 BREAKING,0.84.0 已预告 0.85.0 退出;按本版普查四端产品源码零具名 import)(CC-221):
221
+ - `DENIAL_LIMIT_KINDS` —— 同一个运行期值在 `@sema-agent/sdk` 根入口(本包此前再导出的就是它,同一个数组对象);型面 `DenialLimitKind` 在本包照旧导出。
222
+ - `engineCapNestedTrue` —— 无公开替代(包内能力读口照旧用它)。
223
+ - `shortTaskLabel` —— 无公开替代(子代卡的短标签由 `adapt()` 铸在卡上)。
224
+ - 根公面运行期导出 −2 函数 −1 常量;名字进已退役名账(0.85.0),接入文档活段新增退役名录 §2z。**谁要跟**:从本包根入口按名 import 这三名在 TS 下编译不过、在 JS 下拿到 `undefined`;管理台有两处测试夹具拿 `shortTaskLabel` 当「在公面上的名字」,换钉前换名(§109d)。
225
+
226
+ ### Gates
227
+
228
+ - 新门 `scripts/run-upstream-tables-test.mjs`(90 格;CC-230):生成物与「用已装引擎包重新生成」逐字节相同、生成目录里不许有别的文件、每只生成物头注写明生成器与引擎版本、生成物零 import、三个公面名就是生成物那几个对象;生成器遇到表缺席 / 为空、通告码与受众行不逐键对应、受众出现第三值、退役名说明串形状不认识时**拒生成**(不产出空表或半张表);只读本包自己依赖目录里装的那一份引擎包(解析落到上层目录 / 别的检出目录 ⇒ 拒读)。同门还判:两张 SDK 词表与 SDK 数组引用相等、就地改写它们不改本包判定;包内每组词在源码里恰一处字面;以及(到下一次升引擎或 SDK 为止)每张动过的表与 0.84.1 逐元素逐序相同。`node scripts/gen-upstream-tables.mjs --check` / `--write` 比对 / 刷新生成物。既有门一格不删,字面搬到哪里就改读哪里;强制词表的形制格改判「就是 SDK 那个数组」(此前判冻结)。
229
+ - 新门 `scripts/run-subagent-injected-wire-test.mjs`(155 格;CC-236):真 dist + 真 sdk 同源中继 client(spy fetch 路由到假引擎 A),默认槽与 keyed 槽都故意装到另一只假引擎 B(404 + 计数)—— 正控(spy 记到 Bearer 头 / 已装目标形真打到 B)· 源码形(子代族源码零 `makeEngineWireClient` 调用与 import;plan-review 经共用点)· 逐入口:注入形经 A 带行会话、B 零命中、零 `authorization`、`capsBaseUrl` 缺席与给了的缓存行为、已装目标形(旧签名)同答、四形坏 client 零请求、挂住的 client 在(缩放的)60 s 截止落定且交给动词的信号已 abort、调用方 signal 仍生效、keyed 行 · 凭证零泄漏 · 坏连线五形 · 真 sdk 读重试(429 + `Retry-After: 60`)截止按时落定并 abort 底层请求 · 已装目标按值快照(getter 目标在压缩延迟发射窗与 404 重试窗里温切,旧 run 仍去原引擎、带原凭证)· 注入动词同步抛与拒绝同分类 · 请求送达后连接断了 ⇒ 三只写腿 `unconfirmed`、真拒连不标、分类器对连接阶段四码(含 `AggregateError` 形)不标 · 能证明没送出才说没送出:分类器对证书校验 / 客户端握手配置 / `syscall` 为 `connect` 的不可达与超时 / 非法 URL 与头值 / 参数校验 `ERR_INVALID_ARG_TYPE`(含多地址合并错误每一次尝试都是)不标,读阶段超时 / 没有 `syscall` 的不可达 / 握手之后的重协商拒绝 / OpenSSL 原因码(`ERR_SSL_WRONG_VERSION_NUMBER` / `ERR_SSL_CIPHER_OPERATION_FAILED`)/ undici 不带码的非法头 / 坏端口 / 连接重置照标;注入动词同步抛 ⇒ 三只写腿不标;调用前已取消 ⇒ 零请求不标;动词调用之后取消 ⇒ 任务停止与 resume(注入形 / 已装目标形,真 http 服务端收下请求体不答)标、detail 说只取消了等待;取消独立落定(真 sdk 能力读 429 + `Retry-After: 60`、30 ms 时取消 ⇒ 远小于 `Retry-After` 即落定);落定后调用方信号上不留监听;真 TLS(免证书的 TLS 1.2 PSK,fetch 形宿主传输)对端读完请求后回损坏的记录 / 回明文 ⇒ 三只写腿照标;已装目标形调用前已取消、原因不是 `AbortError`(`AbortSignal.timeout` 到点后交进来 / 自定义原因)⇒ 零请求不标、`detail` 是原取消句;没有 `AbortSignal.any` 的运行时四路落定后调用方信号零监听;同一只错误对象先同步抛、再在已送出的一发上异步拒绝 ⇒ 第二次照标(注入 facade / 宿主 facade);外来信号 ⇒ 两形零请求、不标、同答;注入形 `signal: null` 与不给同答;两份包实例并存时截止 / 发出后取消错误跨实例同判 · plan-review 迁共用点。`run-plan-review-injected-wire-test.mjs`(129 格;另加函数型命名空间 client 照发照出卡、决断体送达后连接断了换「可能已生效」那一句、决断腿「没答复」判据单源;拒连两格的输入由 fetch 坏端口换成真拒连端口;可证没送出的注入四形〔同步抛 / 证书校验 / 连接阶段不可达 / 非法 URL〕与已装目标真非法 URL 回到「could not reach the engine」;已装目标 `https` 指向明文引擎与真 TLS 对端读完决断后失败落「连接断了、可能已生效」;同一只错误对象先同步抛再异步拒绝 ⇒ 第二次不说 could not reach)与 plan-review 决后核验、自愈重开两道门零改动全绿(plan-review 撤卡门只随决断台账换了一处源码锚,见下)。
230
+ - 扩门 `scripts/run-session-policy-deliverable-test.mjs`(418 格;CC-228)名册一段:① 不交名册的六种写法与 **0.84.1 发布产物**逐字节同答(门内嵌那一版发布包里的判定文件原文、按 sha256 钉住;五万余例,含坏入参)、闭集只在末尾多一员;② 只收紧:三千余个名字各自放进名册(作名 / 作别名)答案与不交名册逐字节同,引擎退役名表全员在册照扣且现名不变;成批时带名册能写 ⇒ 不带名册同样能写且逐字同;③ 名册坏二十一形 / 选项坏六形 ⇒ 整批读不懂;④ 读取计数;⑤ 端到端:开发依赖引擎包的真 Runner 挂一只带别名的自定义工具,取这一跑真名册 —— 带名册能写的名与别名写进会话规则记录后下一跑过准备阶段且引擎名字审计不报它,以 `not_in_roster` 扣下的写进去引擎审计确报它匹配不到任何挂着的工具;⑥ 与宿主侧旧实现差分的那一腿认出它自带的名册闸,差异只许「别名」「在册的引擎拒启名」两类且逐类计数。名册读法挪进一只包内叶(不出公面),窄撤销动词与翻译判定共用。
231
+ - 新门 `scripts/run-retirement-ledger-test.mjs` + `scripts/retirement-ledger.json`(22 格;CC-221):只写在注释里的退役条件逐条进机读登记 —— 每行 = 符号 / 按内容的代码锚 / 源码注释里的条件原句 / 三类触发之一:按本包版本(`retireBy`)· 按上游(已装版本 `atLeast` / 包入口导出 `exports` / 型面成员 `members`,用 TypeScript checker 读已装上游)· 按端侧事件(差分门参照树装的本包版本)。判红:触发已满足而过渡物仍在 · 锚在源码里找不到 · 条件原句与源码注释对不上 · 一行零机读触发 · `retireBy` 超出地平线(当前 minor + 3)· 已退役的锚复活。读不到分三态:能读就判;参照树不在盘、只作 peer 声明的上游没装 ⇒ `SKIPPED-SECTION` 如实打印;开发依赖声明了却没装、型面入口解析不了、参照树钉错、版本读不出 ⇒ exit 2。判官先在内存假件与已装 sdk 型面上各植已知在场 / 已知缺席自证会响,才给判词。在册 7 行(终端首帧工具自报的三张估计词表 · `CLASSIFIER_DENY_CAUSES` 镜像表 · 权限规则 lint 码表镜像 · `status` 臂两组结构视图读 · 结果帧错误信封上抢救正文的旧名回落 · 服务端按状态派生的粗码识别表镜像〔复核期 0.87.0〕);已退役 4 行(本版执行的旧名读法、差分门 hook 探针归一器与差分门参照侧的附带文件改名开关〔参照树装的本包换钉到 ≥ 0.83.0 后触发〕,以及 0.84.0 已删的 `SeamRewindSpec.rewindFiles` 型位),门钉它们不复活。行形有可选格 `ruling`(改窗 / 首次定期写明谁在哪天定的)。
232
+ - 差分门 `run-client-core-diff-test.mjs`:hook 探针行 `type=` 字段的参照树版本时差归一器按它自己写下的退役条件删除(参照树装的本包 ≥ 0.75.1、两侧原词逐字相等),hook 那一路改为原词逐字比;参照侧附带文件键名的时差开关同理删除(参照树装的本包 ≥ 0.83.0、两侧同形,那一格正向对照随之撤掉),是否真比过东西由 B4 正向对照的下限兜;检查数 −9(删掉的是只为归一器设的反空转格)。CC 形消息键普查门 X7b 翻面(只带旧名的重放行 ⇒ 零「Referenced file」行)+ 新增 X7b2(那一行本身照常过境、旧名键原样)。HITL 诚实门 F4-c⑮:根入口直调 `surfaceRememberNotApplied()` 恰一条 warning、立即上屏、正文恰是 `REMEMBER_NOT_APPLIED_WARN_TEXT`;无宿主口静默不抛。
233
+ - 接入文档冻结账门 ⑧c 射程分两半:「已退役名的每处提及必带退役注记」只执法**活段**;**冻结段**(`## §NN` 标题里第一个 `0.x.y` 版本号是已发且已入冻结账的版本)是历史记录、不回改,改为补偿格 —— 冻结段里出现的每个已退役名,必须在活段的退役名录里有一行,且名录旁写明「冻结段是历史记录,其中提到的名字以本名录为准」。认不出版本号、或那一版未定案的段按活段严判。段界与冻结账截 CHANGELOG 段是同一份实现。
234
+ - 同名影子对账门 `run-layering-shadow-export-test.mjs` 的豁免从「按名」改成「按语义」(CC-222):`scripts/layering-shadow-exemptions.json` 每一行多带一个类别(闭集六类)与这一类必须带的证据,门逐行查「类别与证据形对不对得上」 —— 端上那份就是本包那只函数对象、只往本包那只里注入宿主依赖:门每次在端侧源码上按语法树重证;包装里多出来的逻辑经端确认属宿主:端的理由原句 + 出处 + 钉声明哈希的核对记录;包装里多了自己的判定、同名但不是一件事:核对记录钉端上那份声明的规范化哈希(语法树逐节点的种类名 + 叶子文本,改注释、改排版不影响哈希),端上一改即红;同一件事的第二份实现:语义差分格 —— 从端所读的提交上取源码、按语法树摘出声明并沿端自己的相对导入逐个模块往下摘,转译后与本包 dist 喂同一批语料逐例比,分歧只许落在这一行登记的类里。首批 13 只差分格(回执成因句与预算实参解析、结果帧 `terminal_reason`、规模告警 guideline 词表、首启门模型身份两只、常量逐值、后台子代缺席行两句、展示层出口(字符面)、常驻姿态判定、审批卡 `denialLimitFallback` 读器、`subagentResume` 能力位、detach durable-off 400 判定、plan-review 决断台账)。新行形 `renamedTo`(跟踪端上改名)与 `awaitUntil`(预登一条端上尚未出现的影子)。尺子自证:每只差分格一份同义合成端与一份分叉合成端,外加语料下限;门起跑先编译 dist。
235
+ - 导出存活门 `run-export-liveness-test.mjs` E 段改读已提交历史,不读工作区(CC-240):读源 = 各端同一棵树的 `origin/main`(不在才退回 `HEAD`)∪ 近 14 天内有提交的本地分支头 ∪ 检出的 `HEAD`(不论多旧);两道门共用一份读源实现 `scripts/_end-read-source.mjs`(同名影子对账门的读数与判决逐字节不变)。「谁在消费」按语法树读真绑定(具名 import 含 `type` 与换名、具名转口、命名空间或动态 import 模块对象上的成员访问、动态 import 的解构、型位 `import(本包).Name`;端上与本包同名的本地声明不算消费),「能不能退」按绑定 ∪ 词级 ∪ 整面转口后可见(多算只会多挡一次退役)。每读一个 ref 打一行 `SOURCE`;登记名只在非主干 ref 上被消费时打 `INFLIGHT`;读不到的端逐端 `SKIPPED-SECTION`,不计进「零消费」。尺子自证 E0 在真 git 临时仓里布五种情形。
236
+ - 新门 `scripts/run-plan-review-decision-ledger-test.mjs`(102 格;CC-241):公面六口 + 句柄型 + 可选位;台账纯判定;重开口按台账拒开(含判别格:POST 落地、回拉未结束仍拒;登记并结算在判定读期间仍陈旧;结算落在投出结局之前;宿主登记被投递口认领);终端现行台账**活体对拍**(整模块转译,22 条向量两边逐检查点同答;登记差异:本包无「按数对账」臂、本包自证没生效两形);容量淘汰不丢本包在飞的笔(33 笔并发后重复批准恰一发;本包占满后宿主再登记只挤宿主登记;POST 挂起时离门证据先结算了它、随后他任务 32 笔入账 ⇒ 重复批准仍恰一发;本包调用都返回后到顶照常出账);`still_parked` 只在门身份证得出同一道门时自证(缺一边 / 公开口直调 ⇒ 拒开,同门身份 / `acceptEdits` 被拒 ⇒ 照开);门身份变了 ⇒ 结局 `advanced`、不说没生效、陈旧拦截照留。`run-plan-review-dismissal-test.mjs` P5 源码锚随守卫换(不变量不变)。
237
+ - 新门 `scripts/run-session-background-stop-test.mjs`(129 格;CC-246):真 dist + 真 sdk 同源中继 client(spy fetch 路由到假引擎 A),默认槽与 keyed 槽缺省装到另一只只答 404 的假引擎 B —— 主路(注入形 / 已装目标形 / keyed 槽;实收体恰好 `{"includeRetained":<bool>}`、路径段编码往返、零 `authorization`、两形结局逐字节同)· 能力门十三格全部零请求(没探 / 键缺席 / `false` / 非布尔 / 原型链 / 不回落已装目标的证据 / 能力记录取值器抛)· 200 窄读(多余键不带、认不出的受据词保留该行与原词并经归类口落「可能仍在跑」、`id` 读不出或词非串 / 空串的行计数、整只读不出 ⇒ 受据缺席、空表照实)· 按码分拒绝(码先于状态,十四格;按状态派生的粗码与同状态无码同一成因,409 / 413 / 422 / 400 / 404 五格)· 没答复(本包截止 / sdk 时限 / 真 http 服务端读完请求体后掐连接 / 请求送达后调用方取消〔注入形 / 已装目标形〕⇒ `unconfirmed: true`;真答复 / 真拒连 / 调用前已取消〔零请求;含 `AbortSignal.timeout` 到点后交进来与自定义取消原因,`detail` 是原取消句〕/ 注入动词同步抛 / 证书校验失败 / 连接阶段不可达 / 真非法 URL / 外来信号〔两形同答〕⇒ 键缺席;fetch 坏端口、`https` 指向明文 A〔握手期 `ERR_SSL_WRONG_VERSION_NUMBER`,A 零实收〕照标;真 TLS 对端读完停止请求后回损坏的记录 / 回明文 ⇒ 照标;同一只错误对象先同步抛、再在已送出的一发上异步拒绝 ⇒ 第二次照标)· 每次调用恰一发 POST(带缺省重试配置的 client 也一样)· 三十二格坏入参不抛零请求 · 凭证零泄漏三路 · 受据归类口九格(四词逐一 / 十四形认不出的词落「可能仍在跑」且原样带出、一个都不归成已停 / 十形坏入参不抛不强转 / 三句互异、非已停两句零 stop 字样 / 同格同句 / 闭集镜像与产出两向相等且撑不开 / 停止口受据端到端)。改前代码上逐格红(口不在公面);十八枚变异各有格红或编译红(含「认不出的词归成已停」「措辞表少一态 / 多一态」)。`run-sdk-floor-test.mjs` ②e 段地板理由的见证加两处:`SessionsResource.backgroundStop(sessionId: string, …)` 是方法、`Capabilities.background?.exitFaces` 是必有布尔(见证集里每一份 ≥ 地板的 sdk 同核)。
238
+ - 新门 `scripts/run-session-integrity-refusal-test.mjs`(CC-217 / CC-243):A `corrupt_session` 三处载体同一判定(HTTP / 终局因由 / run 行;按码不扫词、不看状态、折叠形按原码、敌意取值器不抛;turn 判决位在场当且仅当码是本码,且与 HTTP 读口同判)+ 真驱流上终局行与结果帧 `errors[0]` 四形补同一句、行与 `errors[0]` 单源、run 行经续收合成同路、别码逐字节同旧、那一句单源且零机器码 · B 删会话 409 三形(`remaining` 顶层 / sdk `extra` 两处、坏项丢弃、全坏 / 空表 / 非数组 ⇒ 键缺席、读数冻结;活跑臂;族兜底;非 409 ⇒ `null`;三句互异、两具名臂明说什么都没删、id 转义封长;出句口十一形坏入参不抛、恒回串)· C `/decide` 停驻挪动族(闭集冻结、不按前缀放宽、按码不依赖错误类、三句互异且都给「重取待决列表再决」、出句口七形坏入参不抛、恒回共用那一句、四个决断出口补句、停泊腿提问卡与审批卡两条腿按码续读流,同句无码 / 别码仍按扫词)· X 可选腿直驱服务端 7.104.0 发布包的真铸点再过开发依赖 sdk 的错误映射后进本包读口。改前代码上红(公面缺席);变异十枚各有格红。
239
+ - 扩门 `run-engine-notice-catalog-test.mjs`:服务端自铸码表两行 ⇒ 三行、用户面六码 ⇒ 七码;新 K 段(`readSessionRecordsSkipped` 计数逐格 `'unknown'` 不折 0 / `sessionId` 缺整只缺席 / 敌意取值器不抛 / 补句只在恰为 0 时给、坏入参不抛不给;可选腿直驱服务端发布包的通告真铸点部分毁 / 全毁 / 没跳过三形,经派发口读回);派发夹具 +1。IX 段对服务端 7.104.0 发布包双向等值随之转绿。
240
+ - 新门 `scripts/run-sealed-key-capability-test.mjs`(CC-243):段形恰三键逐键非空串 / 键缺席 = `not_reported` / 七形畸形删格(含三键只挂原型链)/ 只出公钥三键零私钥字节、读数不共享引用 / 读账四口 / 服务端 7.104.0 包的唯一投影真产出(有保管店 ⇒ `present` 三键逐字同;没有 ⇒ 整键缺席 ⇒ `not_reported`)。
241
+ - 扩门(CC-243):`run-file-history-capture-capability-test.mjs`(判据认三词、六句互异、两只口对同一组坏读数不抛(判据口答 `unknown`、doctor 口恰答「not observed」那一句)、`on-optional` 句不冒充关不掉、请求词片段口只在 `on-optional` ∧ 别捕获时给且端到端摊进请求构造器三条车道、跨读器、服务端 7.104.0 包的能力词闭集与铸点三形对拍)· `run-terminal-cause-projection-test.mjs`(同步 park 新体两代格:因由臂、判序对齐、回执词带回、打架形 park 词赢、门与工具名读得到、复核判据两代同答;run 行与无头重连腿:新行立刻交出 done 并收官,老行预算耗尽重抛原始错误)· `run-resume-refusal-copy-test.mjs`(粗码逐个落「没有指明」那一句、具体码照旧点名、精确比对、表冻结;粗码表与服务端 7.104.0 包分发器的状态兜底臂返回串逐词双向对拍,读语法树)· `run-task-request-omission-receipt-test.mjs`(`fileHistory` 一行的座位 / live 门 / 缺席 / 九种坏值响亮拒 / 读序排在全部既有声明位之后)· `run-engine-cap-reader-factory-test.mjs`(读器表第十五行)· `run-wire-refusal-copy-test.mjs`(粗码那一句不带「门早已决」词表里的词)。`run-client-core-pure-test.mjs` B5 段加一格:镜像索引缺席那一句含配置中心现名、不含旧名。
242
+ - 门负控常驻套 `run-gate-negative-controls-test.mjs` 新增六枚真篡改:手改构建期生成物一格 ⇒ 生成物新鲜度红;退役登记在册第一行 `retireBy` 改成当前版本 ⇒ 到期红;同名影子对账门三枚(第一只登记了分歧类的差分行登记清空 ⇒ 语义差分红;第一只薄包装行改判「就是本包那只函数对象」⇒ 机器证明红;第一条核对记录换成对不上的哈希 ⇒ 核对过期红);导出存活门第二枚(按条件挑一只自报消费端非空、端树在场的 contract 行改登 retire ⇒ E 段 retire 格必红且点名挑中的名字;挑不到 ⇒ 负控套 exit 9)。这几枚守的是判决行的接线:把判决短路掉的变异,门自己的自证看不出,负控会红。负控套的普查总账改为按门去重计数(同一道门可以登多枚)。
243
+ - 登记物:根公面基线 1275 → 1307(+35 −3),测试钩 59 → 60;`export-liveness` 登记 44 → 35 行(三行 retire 随名删、`surfaceRememberNotApplied` 那一行因有门按名引用而删、另五条 contract 行因有门按名引用而删;棘轮 `maxRows` 同批 44 → 35);已退役名账 +0.85.0 三名;同名影子豁免 26 → 38 行(按语义重分类后的 33 行 + 终端 plan-review 决断台账五只同名口);单例清单 529 → 536 条(投递口闩换成台账两格、受据归类口措辞表与三态闭集、公钥读账、停驻挪动族闭集与措辞表等),高风险上限 130 → 131;型面门 unknown 出境棘轮 422 → 430(新读口入参为 `unknown`,与各自模块的既有同伴同型);已注释豁免的吞(fail-loud 棘轮)40 → 44(共用构造点「送没送出」判法与取消竞速上四处带注释的安全侧吞:打 / 摘「没送出」标记失败、挂 / 摘取消监听失败);可移植闭包 kernel 18 → 19(适配内核新拉一只零 import 的措辞叶)、index 213 → 222(生成物、共用构造点、停止口、存档读不出、公钥读器等新模块);门数 151 → 158,README「Guards」表 158 行;负控套 `CASES` 25 → 31,负控文档「自动化」表 27 行(同一道门多枚合一行);超集键台账 90 不变;退役登记在册 7 行 / 已退役 4 行。
244
+
245
+ ### Known limits(本版新增)
246
+
247
+ - 两张 SDK 词表未冻结:端上若就地改写,所有读者(含 SDK 自己)都看到改后的表;本包判定不受影响(KL-194)。出身词 / 强制词的运行期成员跟随已装 SDK,本包的句子与闭集判定停在构建时那一代(KL-195);思考档 / 权限模式的型跟随已装 SDK,运行期词表停在构建时那一代(KL-196)。
248
+ - 注入形的读在本包截止落定之后,那只注入 client 若带读重试,仍可能再睡一轮(至多 60 s)才收手(KL-199);写动词的外包重发本包察觉不到、不去重(KL-200);压缩 arm-then-fire 两口各用各的 `wire`(KL-201);`capsBaseUrl` 缺席时报告 / 尾随每次都探、压缩不预热(KL-202);调用方自带的 `AbortSignal.timeout` 在动词调用之后到点按「发出后取消」照标(调用前已到点的零请求、不标),直发 sdk 的宿主把它交给分类器时与 client 时限分不开、照标(KL-203);传输失败只在读得到可证「没送出」的证据(发出之前就失败的码 / 同步抛)时才判没送出,fetch 的坏端口拦截、undici 不带码的非法头值、不带 `syscall` 的不可达等真没送出却读不到证据的形同标 `unconfirmed`(KL-249);证书校验码与客户端握手配置码仍按「没送出」判(依据:客户端在发出应用数据之前判定;OpenSSL 原因码一只都不算)(KL-252);直发 sdk 的宿主交给分类器的取消错误分不出发前 / 发后,键缺席(KL-253);注入形里引擎已答的拒绝与调用方取消落在同一轮微任务时,结局按「发出后取消」标 `unconfirmed`、不报那条答复(KL-255);引擎写口若答 3xx、重定向目标连不上或 `Location` 非法,发出前失败码不再证明没送出 —— 引擎写口不答 3xx,本包不看这一形(KL-256);宿主绕过本包直调、再拿同一只错误对象问分类器时,读到的「没送出」标记可能是上一次同步抛留下的(KL-257);调用前已取消而取消原因是冻结 / 不可扩展的对象时打不上标记,按形判照标(保守方向,KL-258)。
249
+ - 名册按腿、按跑铸:只在子代腿上挂的工具、后来某一跑才挂上的工具,以及装配时注入而不列在名册里的那一只工具检索器,会以 `not_in_roster` 扣下(比引擎严,方向安全;KL-204)。
250
+ - 退役登记只执法已登记的行,注释式退役条件的新增靠同批登记,没有常驻普查(KL-207);终端首帧工具自报三张估计词表的退役条件量不出,按复核期执法(KL-206);冻结段识别靠标题里第一个 `0.x.y` 版本号,本包出 1.0 那天要改(KL-213)。
251
+ - plan-review 决断台账:宿主登记且从未被认领、也没结算 / 撤销的笔无 TTL,直到离门证据或进程结束一直拒开(KL-222);自带投递路径的宿主在前一笔回拉期间交出同 run 第二笔会并入前一笔(KL-223);`not_applied` / `unconfirmed` 不自证没生效(KL-224);决断 200 之后的回声窗不收进包(KL-225);台账每进程 32 笔上限,本包投递口自己在飞的笔(不论结算刻度由谁写)不挤(KL-226);`still_parked` 只在证得出同一道门实例时自证,公开口直调 / 重开卡上的决断 / 老服务端 park 行没有 `result` 一律不自证(KL-250)。
252
+ - 会话后台任务停止口:受据只含 shell 行,后台代理 / 工作流停了哪些要靠停前停后两次登记读数对比(KL-227);能力位不含凭据就绪,位为真仍可能答 503(KL-228);不幂等、无去重键,「没答复」之后重发会连同两次之间新起的后台工作一起停(KL-229);只带粗码、不带状态的错误对象照旧按码读(KL-254);读不出的受据行只计数(KL-230);能力证据要宿主先探(KL-231);只停本副本上的后台行(KL-232)。
253
+ - 展示层出口与凭据读法本版不变(与 0.84.1 逐字节同):引号值里空白之后的尾巴一形照旧(KL-193);另补登四形 0.84.1 起既有的读法 —— 标签后的引号值是 `scheme://` 地址、地址后隔着空白还有文字时那段文字原样(KL-233);无标签、单引号包着的无 scheme userinfo 口令原样(KL-234);用户名整个是一枚记号时认不出 userinfo(KL-235);值首紧贴不可见单字的标签引号值,键左边紧贴的无标签文字原样(KL-236)。
254
+ - 服务端 7.104.0 会话侧:直接读会话的各面分类器对 `corrupt_session` 没有具名臂(KL-237);非流式同步提交口与续跑 verify 腿收不到跳过记录的通告(KL-238);存档读不出的终局行身份仍是 `API Error:`(KL-239);停泊腿续读流在根会话被删的极端并发形上多一轮(KL-240);`/decide` 撞根会话存档读不出时决断出口不补那一句(KL-241);删会话那一句至多点名三只子代(KL-242)。
255
+ - 服务端 7.104.0 能力 / 同步体侧:请求词与还原键同交不预判、由服务端 400 拒(KL-243);能力读数没到之前片段口不给请求词 —— 宿主须先等探测落地(KL-244);接线回执的 `fileHistory` 段不投(KL-245);粗码表是镜像(KL-246);公钥读口不校编码与长度(KL-247);同步 park 体因由座坏而 park 词在场时读 `unknown`(KL-248)。
256
+ - 其余只改门的限制(差分格语料有限、导出存活门只读已提交的 ref、近期分支窗 14 天等)见接入文档 §109 末行「包侧缺口」。
257
+
52
258
  ## 0.84.1(2026-09-28)
53
259
 
54
260
  > 主题:**patch** —— 九件同发,零 BREAKING。① `<system-reminder>` 开标签**定位口**(与剥离 / 解包同一个判定);② detach durable-off 400 的**纯判定**(不带进程门,任何宿主都能调);③ 服务端自铸通告码进码册与受众表(`instructions.source_changed` 从运维面回到用户面)+ 它的事实读器 + **按码派发**的 typed 通告事实口;④ 停泊审批决断撞 422 `parked_resume.startup_failed` 时的读口、成因分说的一句话与「同一个决定不重发、deny 照开」判定,决断失败先按码分类再扫词;⑤ 会话规则记录里有引擎拒启名字的会话:**窄撤销动词**(必交这台部署一跑的工具名册)与启动失败**出路句**;⑥ plan-review 编排三口与两只能力探针收**注入 client**(浏览器同源中继宿主零凭证形);⑦ 终帧 CC 形 `permission_denials` 收入参只被传输层脱敏过的拒绝(带脱敏标记);⑧ 凭据读法两处放行收口;⑨ 门夹具第二批换现役形 + 扁平终帧棘轮 + 权威信封标签对账门。根公面运行期导出 1260 → 1275(+15);公面类型 +18;超集键 +1 `_sema_tool_input_redacted`;peer sdk 地板 `>=12.0.1` 不动;开发依赖引擎 `~7.33.1` 不变。🔴 编译期零改动,但已发导出有几处**可观察的行为变化**,Changed 里逐条写了谁要跟:① `noticeAudienceOf('instructions.source_changed')` `operator` → `user`;② `engineNoticeInCatalog` 对两枚服务端自铸码 `false` → `true`;③ `CONFIG_REFUSAL_CODES` 七员 → 八员;④ 终帧 `permission_denials` 收只被传输层脱敏的行、`_sema_permission_denials_absent` 在只剩这一类时不再落下;⑤ `detachDurableOffHint` 读属性抛错时不再外抛、改回 `null`;⑥ `displayUntrusted` 系地址豁免的判法(输出字节与 0.83.4 不同);⑦ 停泊腿遇 422 `parked_resume.startup_failed` 不再判「门已决」(码优先);⑧ `decidePlanReview` 决断撞上请求时限那一臂的结局正文(两条路同一句「已送出、时限内没有答复」,不再说「连不上」;注入 client 的 `timeoutMs` 要求见接入文档 §108a-9)。另 `readReadRootGrantNotice` 入参型放宽为 `unknown`(非破坏)。按原样字节断言过的测试请改按「不含值」写。