@sema-agent/client-core 0.84.0 → 0.85.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.
- package/CHANGELOG.md +247 -0
- package/README.md +27 -13
- package/dist/abortableSleep.d.ts +10 -0
- package/dist/abortableSleep.js +37 -0
- package/dist/adapt/arms.js +1 -1
- package/dist/adapt.d.ts +1 -1
- package/dist/adapt.js +1 -1
- package/dist/adapter/downstream/terminalToSdkResult.d.ts +1 -0
- package/dist/adapter/downstream/terminalToSdkResult.js +19 -10
- package/dist/adapter/runStream.js +6 -2
- package/dist/agentSession/engineSessionBackgroundStop.d.ts +50 -0
- package/dist/agentSession/engineSessionBackgroundStop.js +291 -0
- package/dist/agentsWireCaps.d.ts +2 -1
- package/dist/agentsWireCaps.js +8 -0
- package/dist/cloudConfigWireCaps.js +2 -1
- package/dist/corruptSession.d.ts +3 -0
- package/dist/corruptSession.js +29 -0
- package/dist/corruptSessionCopy.d.ts +1 -0
- package/dist/corruptSessionCopy.js +4 -0
- package/dist/decideFailureNote.d.ts +2 -1
- package/dist/decideFailureNote.js +8 -3
- package/dist/decideReceipt.d.ts +6 -0
- package/dist/decideReceipt.js +30 -1
- package/dist/detachWire.d.ts +1 -0
- package/dist/detachWire.js +13 -5
- package/dist/displayUntrusted.js +114 -18
- package/dist/effortWire.d.ts +2 -1
- package/dist/effortWire.js +2 -4
- package/dist/engineErrorCodes.d.ts +11 -0
- package/dist/engineErrorCodes.js +32 -0
- package/dist/engineNoticeCodes.d.ts +39 -4
- package/dist/engineNoticeCodes.js +117 -161
- package/dist/engineWireFor.d.ts +43 -0
- package/dist/engineWireFor.js +399 -0
- package/dist/engineWireSdk.d.ts +6 -0
- package/dist/fileHistoryCaptureCapability.d.ts +4 -1
- package/dist/fileHistoryCaptureCapability.js +43 -9
- package/dist/gateVocabulary.d.ts +1 -2
- package/dist/gateVocabulary.js +1 -22
- package/dist/generated/engineNoticeTables.d.ts +3 -0
- package/dist/generated/engineNoticeTables.js +156 -0
- package/dist/generated/toolNameTables.d.ts +2 -0
- package/dist/generated/toolNameTables.js +43 -0
- package/dist/headlessPermissionModeWire.js +2 -4
- package/dist/hitl/askGateWire.d.ts +1 -1
- package/dist/hitl/askGateWire.js +1 -1
- package/dist/hitl/frameRouter.js +4 -2
- package/dist/hitl/hitlHostSurface.js +1 -1
- package/dist/hitl/parkResolver.d.ts +1 -0
- package/dist/hitl/parkResolver.js +11 -3
- package/dist/hitl/planReviewWire.d.ts +41 -3
- package/dist/hitl/planReviewWire.js +264 -49
- package/dist/hitl/rosterMountedNames.d.ts +2 -0
- package/dist/hitl/rosterMountedNames.js +38 -0
- package/dist/hitl/sessionPolicyDeliverable.d.ts +8 -2
- package/dist/hitl/sessionPolicyDeliverable.js +39 -48
- package/dist/hitl/sessionPolicyWire.d.ts +40 -0
- package/dist/hitl/sessionPolicyWire.js +173 -0
- package/dist/hitl/toolApprovalWire.d.ts +4 -2
- package/dist/hitl/toolApprovalWire.js +6 -4
- package/dist/index.d.ts +10 -3
- package/dist/index.js +7 -2
- package/dist/liveInitToolFace.js +28 -10
- package/dist/permissionWireCaps.d.ts +2 -1
- package/dist/permissionWireCaps.js +2 -7
- package/dist/request/taskRequest.d.ts +2 -0
- package/dist/request/taskRequest.js +18 -1
- package/dist/resumeRefusalCopy.d.ts +11 -0
- package/dist/resumeRefusalCopy.js +42 -2
- package/dist/runTerminal.js +4 -0
- package/dist/sandboxWire.js +1 -1
- package/dist/sealedKeyCapability.d.ts +17 -0
- package/dist/sealedKeyCapability.js +42 -0
- package/dist/seatContract.d.ts +2 -1
- package/dist/seatContract.js +5 -21
- package/dist/subagent/engineCompactWire.d.ts +13 -2
- package/dist/subagent/engineCompactWire.js +48 -37
- package/dist/subagent/engineDelegatedPrompt.d.ts +9 -1
- package/dist/subagent/engineDelegatedPrompt.js +16 -16
- package/dist/subagent/engineRowStopGate.d.ts +2 -2
- package/dist/subagent/engineRowStopGate.js +4 -4
- package/dist/subagent/engineSubagentOutput.d.ts +8 -0
- package/dist/subagent/engineSubagentOutput.js +37 -18
- package/dist/subagent/engineSubagentResume.d.ts +11 -2
- package/dist/subagent/engineSubagentResume.js +28 -14
- package/dist/subagent/engineSubagentSteer.d.ts +10 -1
- package/dist/subagent/engineSubagentSteer.js +16 -11
- package/dist/subagent/engineSubagentTail.d.ts +10 -1
- package/dist/subagent/engineSubagentTail.js +35 -17
- package/dist/subagent/engineTaskHandleWire.d.ts +13 -0
- package/dist/subagent/engineTaskHandleWire.js +41 -20
- package/dist/systemReminderTag.d.ts +5 -0
- package/dist/systemReminderTag.js +20 -9
- package/dist/taskRequestWords.d.ts +5 -0
- package/dist/taskRequestWords.js +4 -0
- package/dist/wireErrorTriage.d.ts +1 -0
- package/dist/wireErrorTriage.js +3 -1
- package/dist/wireRefusalCopy.d.ts +10 -0
- package/dist/wireRefusalCopy.js +62 -2
- package/docs/INTEGRATION-CLIENTS.md +1128 -22
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -49,6 +49,253 @@
|
|
|
49
49
|
> 挡住 ⇒ 本批把它机械化——④a0 对 `pending` 行**要求段头已是日期形**(`(未发布)` 直接红),阶段一
|
|
50
50
|
> commit 漏转在发布前就红,不再靠人记。
|
|
51
51
|
|
|
52
|
+
## 0.85.0(2026-09-29)
|
|
53
|
+
|
|
54
|
+
> 主题:**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 开头逐条单列、写明谁要跟。
|
|
55
|
+
|
|
56
|
+
### Added
|
|
57
|
+
|
|
58
|
+
- **plan-review 决断台账**(CC-241):重开口「这道门的决断还在路上」的判据,从本包投递口「POST 未落地」那一段扩成一本三端共用的台账 —— 宿主经别的路径交出的决断、读起点早于结算的陈旧快照、已证出没生效的例外,判定与账都在包里;端只在交出前登记一笔、读待决行前取一枚刻度、证出没生效或离门时说一声。接入文档 **§109a L-1–L-9 / 109a-11**。
|
|
59
|
+
- `notePlanReviewDecisionHandedOver(taskId)` ⇒ `PlanReviewDecisionHandle | null`:宿主在**交出之前**(把对卡的决断性作答送进 `respondToQuestion` 之前,或自带投递路径发 POST 之前)登记一笔。句柄 `settle()` = 自带投递路径落定(成功 / 失败同处);`revoke()` = 这次作答没被任何 responder 收下;两者都幂等。同一任务已有一笔未结算 ⇒ `null`(两条通路报的是同一次决断)。本包 `decidePlanReview` 被投递口闩放行时认领同任务那一笔(没有就自铸一笔),结算权归本包 —— 认领之后宿主的 `settle()` 不放开它。非串入参 ⇒ `null`。
|
|
60
|
+
- `planReviewPendingReadMark()` ⇒ `number`:读待决行**发起之前**取的读起点刻度;经新可选位 `ReopenPlanReviewOpts.pendingReadStartedAt` 随那次读拿到的行带进重开口。
|
|
61
|
+
- `planReviewDecisionInFlight(taskId, pendingReadStartedAt?)` ⇒ `boolean`:有一笔未结算;或给了读起点、有一笔结算晚于它、且那一笔没被判「没生效」。重开口的拒开判据就是它;非数的读起点按缺席。
|
|
62
|
+
- `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` 不自证。
|
|
63
|
+
- `notePlanReviewGateLeft(taskId)`:正面证据「这条 run 已离开那道门」⇒ 结算这条 run 全部未结算的笔(投递口闩照守;本包 POST 还在飞的笔即便被它结算,也不因容量被挤)。
|
|
64
|
+
- `latestPlanReviewDecisionMark(taskId)` ⇒ `number | null`:最近一笔的交出刻度。
|
|
65
|
+
- 型 `PlanReviewDecisionHandle`(`settle(): void` / `revoke(): void`)。台账每进程至多 32 笔(到顶先挤最旧的已结算且本包调用已返回的笔,再挤最旧的宿主登记、本包还没认领的笔;本包投递口自己在飞的笔 —— POST 在飞与回拉 / 结局在途,不论结算刻度是否已被离门证据写上 —— 永不因容量被挤,挤不下就暂时超出上限、落定后回落);刻度是单调的逻辑时钟,不读墙钟;无 TTL。
|
|
66
|
+
- **子代族与 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**。
|
|
67
|
+
- `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`)。
|
|
68
|
+
- `engineTaskHandlesCapable(sessionKey?, capsBaseUrl?)` / `engineRowNeedsStopConfirm(taskId, sessionKey?, capsBaseUrl?)`:能力证据键的显式形(给了只按它读,不读槽)。
|
|
69
|
+
- **`capsBaseUrl`** = 宿主 `kickEngineCapsProbe(baseUrl, …)` 用的那把键。读共享能力缓存的入口(任务句柄读 / 停、行停止门)不给 ⇒ 能力未知 ⇒ `null` / `unavailable`(detail 点名)、零请求 —— 已装目标上有证据也不回落;自带能力探测的入口不给 ⇒ 报告 / 尾随每次都探一次(不缓存),压缩不预热、按 fail-open 发。
|
|
70
|
+
- 坏连线(`null` / 非对象 / 读 `client` 就抛)与坏 client(缺动词)同一处置:按各入口既有的「发不出」臂落(`null` / `no-wire` / `unavailable` / `offline` / `unreadable`),零请求、不抛、不留未处理拒绝、不回落已装目标。动词路径的中间段收对象**或函数**(`assistant` / `runs` 本身可调用、动词挂在它上面的函数型命名空间照收,与 0.84.1 plan-review 守卫同答);`client` 本身只收对象。注入动词同步抛(没先返回 promise)与 Promise 拒绝同一处置:错误对象原样交给该入口的失败分类(停止 / resume 按 `status` / `errorCode` 分)。
|
|
71
|
+
- **已装目标在解析那一刻按值快照** `{ baseUrl, token, principal }`:这一发(含压缩的延迟发射与 404 重试、plan-review 的决后回拉)只用这份快照 —— 宿主用 getter / 原地改值表达「当前引擎」时,温切之后旧 run 的那一发仍去原引擎、带原凭证(子代族各入口与 0.84.1 同答;plan-review 的决后回拉在 0.84.1 是回拉那一刻才读目标,这一处与 0.84.1 不同,见 Changed 第 20 条)。
|
|
72
|
+
- **注入 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)」:这一发可能已被引擎受理,本包不重发、不撤回。
|
|
73
|
+
- **「没答复」机读位 `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 的宿主复用这只分类器即与本包三只写腿同判;宿主装了两份本包时,一份抛的截止 / 发出后取消错误交另一份的分类器同判。
|
|
74
|
+
- 出站头由 client 自决(同源中继形零 `Authorization`);本包在注入形下不接触任何凭证,日志 / 返回值 / detail 零出现。
|
|
75
|
+
- 新型(公面类型 +17):`EngineWireInjection<C>` 与上列十六个 `*Wire` / `*WireClient`。运行期导出零增减;超集键零增减。
|
|
76
|
+
- **会话规则无损判定的可选名册入参**(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**。
|
|
77
|
+
- **只收紧、不放宽**:不交名册时被扣下的名字(引擎退役名、含 `__` 而无协议前缀的名字、首尾带空白、带通配、整对端、带括号、非串),**在名册里也照扣、成因与现名不变**。名册是某一跑的快照:部署今天挂着一只恰叫退役名的工具,写进去之后哪一跑没挂它,这条会话就每一跑启动即失败,而会话规则记录只收紧、在较旧的引擎上属主撤不掉。结果:带名册能写的批必定不带名册也能写,且写出的 `toolDeny` 逐字相同。
|
|
78
|
+
- **别名在册 ⇒ 能写**:引擎准备期的名字审计按名册的名 ∪ 别名认;写成别名的 deny 写进会话规则记录,与同一条规则走设置那条路同义,是无损的。名册读法与 0.84.1 的窄撤销动词 `removeRefusedSessionRules` 是**同一份实现**:两处对「这个名字在不在名册里」永远同答。
|
|
79
|
+
- **大小写与拼写**:`read`(名册里是 `Read`)、`mcp__SRV__tool`、名册外的协议工具名、一只这一部署没有的工具 ⇒ `not_in_roster`。引擎对这类名字只告警「匹配不到这一跑挂着的任何工具」,写进去在这里一只都拦不住,端上却会渲「已保存」。
|
|
80
|
+
- **名册坏 ⇒ 整批读不懂**:第三参不是对象、读 `roster` 就抛、名册读不成(不是对象 / `entries` 不是数组 / 任一行没有非空串名字 / `aliases` 在场却不是串数组 / 读属性就抛 —— 一行坏整只不认)⇒ 结果带 `unreadable: true`、一条不写(闭合失败,不退回「没交名册」)。读得懂的空名册是名册(一只工具都没挂)⇒ 今天能写的全部 `not_in_roster`。`roster: undefined` / `null`、`opts` 缺席或为 `undefined` / `null` / `{}` ⇒ 当没交。
|
|
81
|
+
- 引擎的命名空间覆盖形(`mcp__srv` / `a2a__peer` / 工具段带 `*`)今天都先按 `peer_wide` / `wildcard`(带括号的按 `qualified_deny`)扣下,名册在场时成因不变。
|
|
82
|
+
- 纯判定照旧:零网络、零状态、不抛;名册的 `entries`、每行的 `name` / `aliases` 各恰读一次。
|
|
83
|
+
- 公面类型 +1:`SessionPolicyDeliverableOptions`。运行期导出零新增。
|
|
84
|
+
- **会话后台任务停止口 `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**。
|
|
85
|
+
- **连线**:经本版的共用构造点(与子代族同一处判定)—— `opts.wire: { client, capsBaseUrl? }` 给了就只用它、已装的引擎目标一个字不读;不给 ⇒ 读 `opts.sessionKey` 槽(缺省默认槽)的已装目标。坏连线 / 坏 client ⇒ `unavailable` / `no_wire`,零请求、不抛、不回落已装目标。
|
|
86
|
+
- **能力门先于一切请求**:`capabilities.background.exitFaces` 自有严格 `true` 才发。能力缓存里这把键没读到(没探 / 在飞 / 探测失败;注入形没给 `capsBaseUrl`)⇒ `unavailable` / `capability_unknown`;读到了但不是严格 `true`(键缺席 = 老服务端,没有这条路由;`false` = 没有会话属主面;非布尔 / 只在原型链上)⇒ `unavailable` / `no_exit_face`。两者都零请求。证据键:注入形只读宿主点名的 `capsBaseUrl`,已装目标形读目标的 `baseUrl`。
|
|
87
|
+
- **请求体**:本口自铸恰好一键的 `{ includeRetained }`(必填布尔、没有缺省:`true` 连显式保留的活服务一起停,`false` 保留它们、它们在受据里是 `retained_skipped`);调用方交来的对象上多余的键不上 wire。
|
|
88
|
+
- **结局闭集** `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`。
|
|
89
|
+
- **「没答复」机读位 `unconfirmed: true`**(只在 `error` 上):这一发可能已送到、却没有答复(注入 client 上本包 60 s 独立截止先到;client 自己的每请求时限到点;请求送达后连接断了等说不出没送出的传输失败;或停止请求发出之后调用方取消了等待)—— 停止可能已经落地,宿主渲「可能已停」,不要渲「停止失败」。判据与本版子代族三只写动词同一只;引擎真答了、或可证没送出(调用前就已取消 —— 零请求;注入动词同步抛;成因链上带连接阶段 / 构造期(含参数校验)/ 证书校验与客户端握手配置的码;OpenSSL 原因码 `ERR_SSL_*` 不算)⇒ 键缺席。
|
|
90
|
+
- **写动词、不幂等、不重试**:每次调用恰发一次(非提交类 POST,sdk 不重试;本包不自己重发)。重复停止安全但不是空操作:已收掉的 shell 行下一次答 `already_gone`,但每一次都对那一刻还活着的全部后台工作再收敛一遍(两次之间新起的后台命令也会被停;有后台行时每次都再等一次宽限,缺省约 1 s)。
|
|
91
|
+
- 受据只含 shell 行(`background_bash` / `monitor`);后台代理 / 工作流由会话结算、不出受据 ⇒ `receipts: []` 不等于「什么都没在跑」。`no_pgid` = 没有同步硬收落地(远端 / 沙箱执行的常态),**可能还在跑**,绝不渲成「已停」。
|
|
92
|
+
- 绝不抛:入参 / 选项 / 连线 / 能力记录 / 应答体 / 错误对象上的取值器抛,一律落进结局闭集;宿主日志口抛不改结局。凭证不经本口(不读、不记、不回显)。
|
|
93
|
+
- **受据归类口 `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 字样。
|
|
94
|
+
- 新型(公面类型 +9):`EngineSessionBackgroundStopClient`(动词切片 `sessions.backgroundStop`,`AgentClient` 直接满足)/ `EngineSessionBackgroundStopWire` / `EngineSessionBackgroundStopOptions` / `EngineSessionBackgroundReceipt` / `EngineSessionBackgroundStopUnavailableWhy` / `EngineSessionBackgroundStopRefusedWhy` / `EngineSessionBackgroundStopResult` / `EngineSessionBackgroundReceiptState` / `EngineSessionBackgroundReceiptReading`。运行期导出 +3(停止口、归类口、三态闭集镜像);超集键零增减。
|
|
95
|
+
|
|
96
|
+
- **会话存档读不出(`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**:
|
|
97
|
+
- `isCorruptSessionError(err)` —— 抛出物按码判(折叠形按原码),不看状态、不读散文、绝不抛;
|
|
98
|
+
- `isCorruptSessionResult(result)` —— `done.result` / 同步 200 体,两代字节都认,只认 failed 臂;
|
|
99
|
+
- `isCorruptSessionRunRow(row)` —— run 行:结果读得出终局时只信结果,读不出才读行上的 `errorCode` 列;
|
|
100
|
+
- `corruptSessionContent()` —— 唯一一句:存档读不出、重试无用、要这台引擎的运维修、先换个会话继续。不复述引擎原句,零机器码。
|
|
101
|
+
- `CORRUPT_SESSION_ERROR_CODE` / `isCorruptSessionCode(code)`(严格等值)。
|
|
102
|
+
- **turn 错误判决 `http` 臂新位 `sessionUnreadable?: true`**(CC-217)—— 这次拒绝的码是 `corrupt_session` 时在场(只铸 `true`,别的码键缺席),与 `isCorruptSessionError` 同判;与 0.82.0 的 `storedRowWhere` 同一只取码口。
|
|
103
|
+
- **`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**。
|
|
104
|
+
- **删会话被拒的 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**。
|
|
105
|
+
- **`/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**。
|
|
106
|
+
- **能力面公钥发现读口 `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**:
|
|
107
|
+
- `present` = 段上**恰**三键 `alg` / `publicKeyId` / `publicKey` 逐键非空串(都按自有键读),三键原样进读数;`alg` 按开集收(今天唯一值 `libsodium-sealedbox-x25519`,宿主拿它与自己的封装库比对)。
|
|
108
|
+
- **只出公钥三键**:段上多出来的任何键(私钥、秘钥、`createdAt`、别的)一律不进读数;读数是新建对象、不与回体共享引用 —— 这只读口不是凭证面。
|
|
109
|
+
- 键缺席 ⇒ `not_reported`,**不要封**:两种含义(老服务端不认识这一位 / 这台引擎起服时没建成钥匙保管店)是同一个动作,读口不替宿主分,也不编默认公钥。段在场却畸形(`null` / 非对象 / 数组 / 缺一键 / 空串 / 非串)⇒ 这一格删掉(读口答 `unobserved`),不铸半截读数、不留上一台引擎的公钥。
|
|
110
|
+
- 按引擎地址分格:多副本不共享保管目录时各副本答的公钥不同,别跨地址复用一份。
|
|
111
|
+
- **「这一次运行别捕获文件历史」的请求词出口**(CC-243;服务端 ≥7.104.0 提交体键 `fileHistory: "disabled"`)—— 请求构造器车道表新增 `fileHistory` 一行(交互 / 无人值守两条用户车道有座、live 门后;side-channel 车道无座 —— 它零工具面,不会改任何文件);单成员闭集:值恰是 `'disabled'` 才上请求体,别的值(`'Disabled'` / `'off'` / 布尔 / 对象 …)构造期 `TypeError`(不回显值),`undefined` / `null` = 照常捕获。接入文档 **§109a M-4 / 109a-18**。
|
|
112
|
+
- 片段口 **`fileHistoryDeclarationField(reading, captureOff)`**:只在能力读数是 `on-optional`(引擎明说「可以按 run 关」)且宿主意图是「别捕获」时给 `{ fileHistory: 'disabled' }`,其余一律空片段 —— 老服务端(≤7.103.x)对这一请求键是表外键、整条提交会被 400 拒,所以宿主设置里早就存在的「不要文件检查点」开关**不许**无条件映射成这一键。用法:`buildTaskRequest({ …, ...fileHistoryDeclarationField(observedFileHistoryCapture(), captureOff) }, lane)`。🔴 宿主义务:用户关了文件历史时,第一次提交前先等这把键的能力探测落地(读数没到时片段口不给请求词,那一次运行照常捕获;KL-244)。
|
|
113
|
+
- 字面常量 `FILE_HISTORY_DISABLED`(`'disabled'`)供断言锚用;拼请求走片段口。
|
|
114
|
+
- 本包不预判「同一提交又要还原文件」的冲突:服务端在受理时 400 `request.field_conflict`(任何副作用之前);宿主怎么处理见接入文档 §109a-18(KL-243)。
|
|
115
|
+
- **按状态派生的粗码识别表 `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**。
|
|
116
|
+
|
|
117
|
+
### Changed
|
|
118
|
+
|
|
119
|
+
🔴 **已发导出的可观察变化(逐条;按旧行为断言过的测试请按接入文档 §109a′ 改锚)**:
|
|
120
|
+
|
|
121
|
+
1. **三个运行期名字退出根入口**(型面 BREAKING)—— 见 Removed。
|
|
122
|
+
2. **`ASK_ORIGIN_WORDS` / `APPROVAL_MANDATE_WORDS` 就是 SDK 导出的那两个数组**(CC-230):值即 SDK 包根的 `ASK_ORIGINS` / `PERSISTED_RULE_MANDATES`(引用相等),不再是本包的抄件。
|
|
123
|
+
- **不再冻结**:SDK 没冻结这两个数组,`Object.isFrozen(...)` 由 `true` 变 `false`。请当只读用。本包自己的判定不读它们 —— 出身措辞、常驻姿态判定、`isApprovalMandateWord`、`approvalMandateDetail`、`readApprovalMandate` 在这两个数组被就地改写后照答原样。
|
|
124
|
+
- **运行期成员跟着你装的 SDK 走**:SDK 在 peer 地板(12.0.1)时与 0.84.1 逐词同(出身十一词、强制六词)。装了加过词的新 SDK 时,新词会出现在数组里,而本包的句子与闭集判定仍只认本包构建时那一代 SDK 的词:新出身词走既有的「这个词比这一端新」那一句,新强制词在 `readApprovalMandate` 里仍读作缺席。
|
|
125
|
+
- **型不变**:`ASK_ORIGIN_WORDS` 仍是 `readonly string[]`;`APPROVAL_MANDATE_WORDS` 与 `ApprovalMandateWord` 仍是本包构建时那一代 SDK 的六词字面形。**谁要跟**:按值 `includes` / 遍历的写法照旧成立;断言它们冻结的判据改锚;别就地改写(改的是 SDK 的表,所有读者一起看到)。
|
|
126
|
+
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 加一档的那次升级会先在编译期看到新档,而本包的运行期词表要到本包随之发版才认它。
|
|
127
|
+
4. 🔴 **成因闭集 `SessionPolicyWithheldWhy` / `SESSION_POLICY_WITHHELD_WHY` 六词 → 七词**(+`not_in_roster`,排在最后;冻结数组照旧由措辞表的键派生,旧六词的序与用户面话逐字节不变)(CC-228)。`not_in_roster` 只在宿主交了名册时出现。**谁要跟**:对成因词做穷尽 `switch` / 按词建表(`Record<SessionPolicyWithheldWhy, …>`)的端编译期会红 —— 加一臂,取句用 `sessionPolicyWithheldNotice('not_in_roster')`,不要自己写;按「恰六词」断言的测试改锚。今天各端都没有按成因词分支的读点,不交名册的调用零改动。另:`SessionPolicyDeliverability.unreadable` 的触发条件多两形(只在交了第三参时:第三参不是对象 / 名册读不成)。
|
|
128
|
+
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`(值原样)。
|
|
129
|
+
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` 分句(有它渲「可能已生效」)。
|
|
130
|
+
7. 🔴 **`reopenPlanReviewCard` 拒开面变宽**(CC-241):0.82.1 起只在本包投递口 **POST 未落地**时拒开;本版起按台账判 —— 本包投递口从 POST 到**投出结局**的整段(含决后回拉,至多 15 s)、宿主登记的交出、以及调用方读起点早于某笔结算(快照陈旧)都拒开,判决仍是 `{ reopened: false, _sema_decisionInFlight: true }`;结算即放(无冷却)。异步判定的读后复核同样按台账(读起点取调用方读起点与判定前刻度中较早的一枚),`decisionHandedOver` 谓词保留为并联的第二证据。**谁要跟**:按「POST 落地后重开照开」写的判据改锚(新判据眼见 §109a′);端上零改动即得更宽的拒开面。
|
|
131
|
+
8. **`HITL_REJECT_MESSAGE` 的已发产物字面位置**(CC-230):值与 `REJECT_MESSAGE` 同一句、字节不变;这句字面在产物里只剩 `dist/adapt/wireShapes.js` 一处,`dist/hitl/frameRouter.js` 不再含它。**谁要跟**:按产物文件钉这句字面「在哪只文件里铸」的登记(终端有一条)删掉 `hitl/frameRouter.js` 那一行。
|
|
132
|
+
|
|
133
|
+
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'`,别当数算)。
|
|
134
|
+
10. **turn 错误判决 `http` 臂 +可选位 `sessionUnreadable?: true`**(CC-217;型面加宽):码为 `corrupt_session` 时在场、恒 `true`,别的码键缺席。**谁要跟**:对 `http` 臂做键集恒等断言的端放宽。
|
|
135
|
+
11. 🔴 **流上的终局错误行与 CC 形结果帧 `errors[0]` 在码为 `corrupt_session` 时补一句**(CC-217;`runStream` / `terminalToSdkResult` / `doneToSdkResult` / `failedToSdkResult`):引擎原句之后换行接 `corruptSessionContent()`;行身份前缀仍是 `API Error:`;别的码逐字节同旧(原句一字不差而码不是本码的形也不补 —— 按码不按词)。**谁要跟**:按「这一码的终局行 = `API Error: <原句>`」整串断言的格改锚。
|
|
136
|
+
12. 🔴 **决断出口的失败文字在 `/decide` 停驻挪动三码上补一句;停泊腿按码续读流**(CC-243):审批卡的批准 / 拒绝、提问卡作答、中断撤卡撞 `decide.not_parked` / `gate_moved` / `claim_lost` 时,失败文字在原句之后补 ` — ` + `decideParkMovedContent(…)`;停泊腿对三码一律按码走「门已不在原处 ⇒ 续读这条 run 的流、按当前状态重新呈卡」(仍受同因连续一次的限次)。修前靠扫服务端原句,会话被删那一形(7.104.0 新触发,原句不带 already)被当成真失败收场。**谁要跟**:按「`decide(approve|deny) failed: <原句>` 逐字」断言的格改锚;端上自有「门已决」扫词链的,在扫词之前问 `isDecideParkMovedCode`。
|
|
137
|
+
13. 🔴 **`fileHistoryCaptureMode` 认 `on-optional`;`FileHistoryCaptureMode` 三员 → 四员**(CC-243):`present` / `on-optional` 修前答 `'unknown'`,现答 `'on-optional'`;`fileHistoryCaptureDoctorDetail` 对它修前落「a mode this client does not know yet」那一句,现有自己的一句(其余五句逐字不变)。**谁要跟**:按 `FileHistoryCaptureMode` 穷举的 `switch` 编译红 —— 该接这一态(它是「可以关」的唯一信号)。
|
|
138
|
+
14. **`readRunTerminal` 在同时带 `terminal` 与顶层 park 词的载体上**(只有服务端 7.104.0 起的同步 park 体会这样)按 park 词读 `paused`、`flatStatus` 带回那个词(修前按因由读、`flatStatus` 缺席;打架形修前按因由、现按 park 词)。别的载体一个字节都没变(CC-243)。
|
|
139
|
+
15. **`resumePolicyBlockContent`**:`named` 读数里的码是按状态派生的粗码时,第二句落「The refusal did not name a more specific check」并括注那个粗码,不再说「The check that refused it: request.rejected」;具体码照旧点名;`resumePolicyBlockFromError` 的读数不变(CC-243)。
|
|
140
|
+
16. 读法未改、但服务端 7.104.0 让读数变了的三处(上游形变,不是本包改了判据):同步 park 体的 `readRunTerminal(...).plane` 由 `'flat'` 变 `'cause'`;`terminalEventFromRunRow` / `withHeadlessR1Reconnect` 在 park 行上立刻交出 `done`(不再计预算重试到耗尽);`effectiveWireErrorCode` 在不带码的折叠上答粗码(修前答折叠码本身)(CC-243)。
|
|
141
|
+
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)。
|
|
142
|
+
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、不编词)。正常四态逐字节不变。**谁要跟**:按「坏读数会抛」断言的格改锚。
|
|
143
|
+
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.」;第二行、另三臂与判别逐字节不变。**谁要跟**:按原句逐字断言的格改锚(四端产品源码零读点)。
|
|
144
|
+
20. **`decidePlanReview` 已装目标形的决后回拉所带凭据**(CC-236 同批):0.84.1 的回拉在回拉那一刻读宿主装进来的目标对象(宿主用 getter / 原地改值表达「当前引擎」时,决断 POST 与回拉之间温切 ⇒ 回拉去新目标、带新凭据);本版决断与回拉都从解析那一刻按值快照的同一份 `{ baseUrl, token, principal }` 构造 ⇒ 回拉仍去原引擎、带原凭据(与决断同一份)。温切只影响下一次决断。决断请求、结局文字与机读位不变。**谁要跟**:依赖「回拉时轮换过的新 token」的宿主(0.84.1 上回拉会带它)改为在下一次决断前轮换;按回拉请求头断言新 token 的格改锚。
|
|
145
|
+
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` 分句的端零改动即得「另一道审批在等」那一句。
|
|
146
|
+
|
|
147
|
+
其余改动:
|
|
148
|
+
|
|
149
|
+
- **引擎事实表改为构建期生成,不再手抄**(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**。
|
|
150
|
+
- **包内多份同一事实收成一份**(CC-230;零 wire 面):`SEAT_REASONING_EFFORTS` / `PERMISSION_MODE_INTENTS` / `HEADLESS_PERMISSION_WIRE_MODES` 值、序与形制不变(仍是彼此独立、不冻结的数组),改由每组词唯一一只运行期元组派生,那只元组与 SDK 型在构建期两向钉住;`HITL_REJECT_MESSAGE` 与 `REJECT_MESSAGE` 同一句、字面只剩一处;取消终态码与档位五词同样各只留一份。
|
|
151
|
+
- **plan-review 的 client 构造迁到同一个共用构造点**(CC-236):`armPlanReviewApproval` 的在场判与版本证据键不变;三条「发不出」出路的句子逐字不变(槽空 / 注入 client 不可用 / 目标形造不出);已装目标形的决断 6 h client 与回拉 15 s client 从解析那一刻按值快照的同一份目标构造(宿主的 getter 目标在决断与回拉之间温切,回拉仍去原引擎;回拉所带凭据相对 0.84.1 的可观察变化见上第 20 条)。
|
|
152
|
+
- **不变**(CC-236):八个入口与两只行停止门不带新位 ⇒ 请求体 / 出站头 / 会话参数 / 取址闸序(先连线、后取址)/ 能力位缓存 / 结局形状逐字节同 0.84.1(时限 / 传输失败 / 发出后取消三臂除外,见 Changed 第 6 条与接入文档 §109 P-13);`EngineWireTarget` 型不动;`makeEngineWireClient` 不动;`subagentResumeAvailable(baseUrl)` / `auditRetainWithoutWake({ baseUrl })` 与十五只能力读器的显式 `baseUrl` 入参(中继宿主早已可用)不动。
|
|
153
|
+
- 投递口闩(POST 未落地 ⇒ 第二次 `decidePlanReview` 拒)判据与窗**不变**,只是改由决断台账承载;`__resetPlanReviewDecisionLatchForTests()` 现在清整本账。结局机读位 `_sema_planReviewOutcome` 由台账同一笔投出,每条结局恰对应一笔,宿主不再需要按数认领结局(CC-241)。
|
|
154
|
+
- **`surfaceRememberNotApplied` 撤回退役预告,留在公面**(CC-221):0.84.0 把它与下面三名一起定为 0.85.0 退出,前提是「四端零具名 import」;终端在飞版已具名 import 并直调它(自己读回体的停泊腿用它说同一句「本会话允许没被记住」),前提失效。行为不变。
|
|
155
|
+
- 常驻姿态谓词 `askSurvivesPosture` 答 `unknown`(本包不认识的出身词)时宿主**出卡问人**、不折成姿态放行 —— 成文写进接入文档 **§109a-12**;判定本身不变。
|
|
156
|
+
- **能力词 `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` 不牵连回退可用性),门加格钉住。
|
|
157
|
+
- **同步提交停在门上的 200 体**(CC-243;服务端 7.104.0):体改成「引擎结果本身 + 回执三键 `taskId` / `sessionId` / `status`」,带 `terminal` ⇒ `readRunTerminal` 走因由臂;判序与 sdk 13 的三代读法对齐 —— 因由成形之后**先看顶层 park 词**(`suspended` / `needs_review`),是就读 `paused`(绝不把一个服务端明说停在门上的体读成终局)。老服务端的三键体照旧走扁平臂;因由座在场却读不出照旧 `unknown`(KL-248)。
|
|
158
|
+
- **park 中的 run 行带 `result`**(CC-243;服务端 7.104.0):无头重连腿读到 park 行时**立刻**合成 `done`(paused)交给下游(与活流收到 park 终帧同形),不再计预算重试到耗尽才走判死文案;不带 `result` 的 park 行(老服务端)照旧重试。读法本身没改(「行上带 result 对象就合成」一直如此)。
|
|
159
|
+
- **处置订正(无行为面)**(CC-246):0.84.0 接入文档把 `sessions.backgroundStop` / `capabilities.background.exitFaces` 登为 declined「宿主动作,本包零读点,端直调」—— 作废。端不直连 sdk,这一口由本包转调(见 Added);成文改口见接入文档 **§109a′**。
|
|
160
|
+
|
|
161
|
+
### Removed
|
|
162
|
+
|
|
163
|
+
- 🔴 **三个运行期名字退出根入口**(型面 BREAKING,0.84.0 已预告 0.85.0 退出;按本版普查四端产品源码零具名 import)(CC-221):
|
|
164
|
+
- `DENIAL_LIMIT_KINDS` —— 同一个运行期值在 `@sema-agent/sdk` 根入口(本包此前再导出的就是它,同一个数组对象);型面 `DenialLimitKind` 在本包照旧导出。
|
|
165
|
+
- `engineCapNestedTrue` —— 无公开替代(包内能力读口照旧用它)。
|
|
166
|
+
- `shortTaskLabel` —— 无公开替代(子代卡的短标签由 `adapt()` 铸在卡上)。
|
|
167
|
+
- 根公面运行期导出 −2 函数 −1 常量;名字进已退役名账(0.85.0),接入文档活段新增退役名录 §2z。**谁要跟**:从本包根入口按名 import 这三名在 TS 下编译不过、在 JS 下拿到 `undefined`;管理台有两处测试夹具拿 `shortTaskLabel` 当「在公面上的名字」,换钉前换名(§109d)。
|
|
168
|
+
|
|
169
|
+
### Gates
|
|
170
|
+
|
|
171
|
+
- 新门 `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 那个数组」(此前判冻结)。
|
|
172
|
+
- 新门 `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 撤卡门只随决断台账换了一处源码锚,见下)。
|
|
173
|
+
- 扩门 `scripts/run-session-policy-deliverable-test.mjs`(418 格;CC-228)名册一段:① 不交名册的六种写法与 **0.84.1 发布产物**逐字节同答(门内嵌那一版发布包里的判定文件原文、按 sha256 钉住;五万余例,含坏入参)、闭集只在末尾多一员;② 只收紧:三千余个名字各自放进名册(作名 / 作别名)答案与不交名册逐字节同,引擎退役名表全员在册照扣且现名不变;成批时带名册能写 ⇒ 不带名册同样能写且逐字同;③ 名册坏二十一形 / 选项坏六形 ⇒ 整批读不懂;④ 读取计数;⑤ 端到端:开发依赖引擎包的真 Runner 挂一只带别名的自定义工具,取这一跑真名册 —— 带名册能写的名与别名写进会话规则记录后下一跑过准备阶段且引擎名字审计不报它,以 `not_in_roster` 扣下的写进去引擎审计确报它匹配不到任何挂着的工具;⑥ 与宿主侧旧实现差分的那一腿认出它自带的名册闸,差异只许「别名」「在册的引擎拒启名」两类且逐类计数。名册读法挪进一只包内叶(不出公面),窄撤销动词与翻译判定共用。
|
|
174
|
+
- 新门 `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`(改窗 / 首次定期写明谁在哪天定的)。
|
|
175
|
+
- 差分门 `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`;无宿主口静默不抛。
|
|
176
|
+
- 接入文档冻结账门 ⑧c 射程分两半:「已退役名的每处提及必带退役注记」只执法**活段**;**冻结段**(`## §NN` 标题里第一个 `0.x.y` 版本号是已发且已入冻结账的版本)是历史记录、不回改,改为补偿格 —— 冻结段里出现的每个已退役名,必须在活段的退役名录里有一行,且名录旁写明「冻结段是历史记录,其中提到的名字以本名录为准」。认不出版本号、或那一版未定案的段按活段严判。段界与冻结账截 CHANGELOG 段是同一份实现。
|
|
177
|
+
- 同名影子对账门 `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。
|
|
178
|
+
- 导出存活门 `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 临时仓里布五种情形。
|
|
179
|
+
- 新门 `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 源码锚随守卫换(不变量不变)。
|
|
180
|
+
- 新门 `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 同核)。
|
|
181
|
+
- 新门 `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 的错误映射后进本包读口。改前代码上红(公面缺席);变异十枚各有格红。
|
|
182
|
+
- 扩门 `run-engine-notice-catalog-test.mjs`:服务端自铸码表两行 ⇒ 三行、用户面六码 ⇒ 七码;新 K 段(`readSessionRecordsSkipped` 计数逐格 `'unknown'` 不折 0 / `sessionId` 缺整只缺席 / 敌意取值器不抛 / 补句只在恰为 0 时给、坏入参不抛不给;可选腿直驱服务端发布包的通告真铸点部分毁 / 全毁 / 没跳过三形,经派发口读回);派发夹具 +1。IX 段对服务端 7.104.0 发布包双向等值随之转绿。
|
|
183
|
+
- 新门 `scripts/run-sealed-key-capability-test.mjs`(CC-243):段形恰三键逐键非空串 / 键缺席 = `not_reported` / 七形畸形删格(含三键只挂原型链)/ 只出公钥三键零私钥字节、读数不共享引用 / 读账四口 / 服务端 7.104.0 包的唯一投影真产出(有保管店 ⇒ `present` 三键逐字同;没有 ⇒ 整键缺席 ⇒ `not_reported`)。
|
|
184
|
+
- 扩门(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 段加一格:镜像索引缺席那一句含配置中心现名、不含旧名。
|
|
185
|
+
- 门负控常驻套 `run-gate-negative-controls-test.mjs` 新增六枚真篡改:手改构建期生成物一格 ⇒ 生成物新鲜度红;退役登记在册第一行 `retireBy` 改成当前版本 ⇒ 到期红;同名影子对账门三枚(第一只登记了分歧类的差分行登记清空 ⇒ 语义差分红;第一只薄包装行改判「就是本包那只函数对象」⇒ 机器证明红;第一条核对记录换成对不上的哈希 ⇒ 核对过期红);导出存活门第二枚(按条件挑一只自报消费端非空、端树在场的 contract 行改登 retire ⇒ E 段 retire 格必红且点名挑中的名字;挑不到 ⇒ 负控套 exit 9)。这几枚守的是判决行的接线:把判决短路掉的变异,门自己的自证看不出,负控会红。负控套的普查总账改为按门去重计数(同一道门可以登多枚)。
|
|
186
|
+
- 登记物:根公面基线 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 行。
|
|
187
|
+
|
|
188
|
+
### Known limits(本版新增)
|
|
189
|
+
|
|
190
|
+
- 两张 SDK 词表未冻结:端上若就地改写,所有读者(含 SDK 自己)都看到改后的表;本包判定不受影响(KL-194)。出身词 / 强制词的运行期成员跟随已装 SDK,本包的句子与闭集判定停在构建时那一代(KL-195);思考档 / 权限模式的型跟随已装 SDK,运行期词表停在构建时那一代(KL-196)。
|
|
191
|
+
- 注入形的读在本包截止落定之后,那只注入 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)。
|
|
192
|
+
- 名册按腿、按跑铸:只在子代腿上挂的工具、后来某一跑才挂上的工具,以及装配时注入而不列在名册里的那一只工具检索器,会以 `not_in_roster` 扣下(比引擎严,方向安全;KL-204)。
|
|
193
|
+
- 退役登记只执法已登记的行,注释式退役条件的新增靠同批登记,没有常驻普查(KL-207);终端首帧工具自报三张估计词表的退役条件量不出,按复核期执法(KL-206);冻结段识别靠标题里第一个 `0.x.y` 版本号,本包出 1.0 那天要改(KL-213)。
|
|
194
|
+
- 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)。
|
|
195
|
+
- 会话后台任务停止口:受据只含 shell 行,后台代理 / 工作流停了哪些要靠停前停后两次登记读数对比(KL-227);能力位不含凭据就绪,位为真仍可能答 503(KL-228);不幂等、无去重键,「没答复」之后重发会连同两次之间新起的后台工作一起停(KL-229);只带粗码、不带状态的错误对象照旧按码读(KL-254);读不出的受据行只计数(KL-230);能力证据要宿主先探(KL-231);只停本副本上的后台行(KL-232)。
|
|
196
|
+
- 展示层出口与凭据读法本版不变(与 0.84.1 逐字节同):引号值里空白之后的尾巴一形照旧(KL-193);另补登四形 0.84.1 起既有的读法 —— 标签后的引号值是 `scheme://` 地址、地址后隔着空白还有文字时那段文字原样(KL-233);无标签、单引号包着的无 scheme userinfo 口令原样(KL-234);用户名整个是一枚记号时认不出 userinfo(KL-235);值首紧贴不可见单字的标签引号值,键左边紧贴的无标签文字原样(KL-236)。
|
|
197
|
+
- 服务端 7.104.0 会话侧:直接读会话的各面分类器对 `corrupt_session` 没有具名臂(KL-237);非流式同步提交口与续跑 verify 腿收不到跳过记录的通告(KL-238);存档读不出的终局行身份仍是 `API Error:`(KL-239);停泊腿续读流在根会话被删的极端并发形上多一轮(KL-240);`/decide` 撞根会话存档读不出时决断出口不补那一句(KL-241);删会话那一句至多点名三只子代(KL-242)。
|
|
198
|
+
- 服务端 7.104.0 能力 / 同步体侧:请求词与还原键同交不预判、由服务端 400 拒(KL-243);能力读数没到之前片段口不给请求词 —— 宿主须先等探测落地(KL-244);接线回执的 `fileHistory` 段不投(KL-245);粗码表是镜像(KL-246);公钥读口不校编码与长度(KL-247);同步 park 体因由座坏而 park 词在场时读 `unknown`(KL-248)。
|
|
199
|
+
- 其余只改门的限制(差分格语料有限、导出存活门只读已提交的 ref、近期分支窗 14 天等)见接入文档 §109 末行「包侧缺口」。
|
|
200
|
+
|
|
201
|
+
## 0.84.1(2026-09-28)
|
|
202
|
+
|
|
203
|
+
> 主题:**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`(非破坏)。按原样字节断言过的测试请改按「不含值」写。
|
|
204
|
+
|
|
205
|
+
### Added
|
|
206
|
+
|
|
207
|
+
- **`findSystemReminderOpenTag(text, from?)`** ⇒ `SystemReminderOpenTagSpan | null`(型 `SystemReminderOpenTagSpan = { readonly start: number; readonly end: number }`)(CC-210):引擎 `<system-reminder>` 信封的**开标签定位口**,给自己按开标签把消息切成「信封块 / 正文」的宿主(历史回放拆分、转录搜索这一类),不必再自持一份开标签文法。接入文档 **§108a O-1 / 108a-1**。
|
|
208
|
+
- 从 `from`(缺席 = 0)起找下一枚开标签,回它的 UTF-16 起止(`end` 为开标签后一位,`text.slice(start, end)` 恰是那枚开标签);没有回 `null`。
|
|
209
|
+
- 只认引擎铸的两形:裸 `<system-reminder>`,或恰一个 22 位 base64url `mark` 属性的 `<system-reminder mark="…">`。与 `stripSystemReminderBlocks` / `unwrapSystemReminder` 走**同一个**判定(本版起三只口认开标签是一份实现),所以三口对「哪一处是开标签」永远同答。
|
|
210
|
+
- 串尾截断的开标签(标签名半截、属性值半截、少收引号或 `>`)不认;只认 `start ≥ from` 的那一枚(`from` 落在一枚开标签内部时,那一枚不认)。
|
|
211
|
+
- 与块上下文无关:块正文里的字面开标签、没闭合的开标签、嵌套的内层开标签都认 —— 配闭标签、处置截断块是宿主的循环(剥离口的块语义见接入文档 §104 的 104a-1)。
|
|
212
|
+
- 线性:单次调用一趟扫到命中或串尾;`from` 前移逐枚找完整串,总开销线性。
|
|
213
|
+
- 入参不抛:`text` 非串 ⇒ `null`(不强转);`from` 不是 0 到 `text.length` 之间的整数(负数、小数、`NaN`、`Infinity`、非数)⇒ `null`。
|
|
214
|
+
- **`isDetachDurableOff400(err)`** ⇒ `boolean`(CC-219):这一枚错误是不是对 `x-detach-on-disconnect` 头的拒绝 —— 部署没有耐久 run 账本(没有 run store 或这次提交没有会话)时,提交答 400。判据只有两条:`status === 400`(数字),`message` 是串且含本包的锚句常量 `DETACH_DURABLE_OFF_400_ANCHOR`。接入文档 **§108a DT-1 / 108a-2**。
|
|
215
|
+
- **不认错误码**:这条拒绝带的码是通用前置条件码,同一条提交路上与 detach 头无关的拒绝也用它(比如 device 部署首轮没有会话、cascade 没配梯子);按码判会把那些提交当成「去头重发」的对象。
|
|
216
|
+
- 不读进程台账:浏览器 / 桌面这类从不 arm 终端 detach 台账的宿主也能用同一个判定。`detachDurableOffHint(err)` 本版起就是「头确已发出(`isDetachArmed()`)∧ 本判定」(差别见 Changed)。
|
|
217
|
+
- **一律不抛**:非对象、缺字段、`message` 不是串 ⇒ `false`;读 `status` / `message` 时 getter 抛错、Proxy 陷阱抛错、已撤销的 Proxy ⇒ `false`(不外抛、不重试读)。每个属性至多读一次,先读 `status`,不是 400 就不读 `message`。它通常跑在宿主的 `catch` 里 —— 判定自己再抛,会把原本那一枚错误遮掉。
|
|
218
|
+
- **服务端自铸通告码进码册与受众表**(CC-213):服务端自 7.101.0 起经同一条通告通道投它自己铸的码,这些码不在引擎的码册里 —— 修前 `engineNoticeInCatalog` 对它们答「册外」、`noticeAudienceOf` 回落 `operator`,按受众分发的端把一条给用户看的通告投进了运维面。新公面表 `SERVER_NOTICE_AUDIENCE`(冻结对象,码 → 受众),两行:`instructions.source_changed`(`user`)/ `memory.layer_locked_legacy`(`operator`);`engineNoticeInCatalog` 与 `noticeAudienceOf` 同认(先查引擎镜像表,再查本表,两表之外仍保守判 `operator`;查表按自有属性)。本表**不并进**引擎镜像的 `ENGINE_NOTICE_CODES` / `ENGINE_NOTICE_AUDIENCE`(那两张照旧与引擎码册逐码相等),两表零交集。接入文档 **§108a N-1 / N-2**。
|
|
219
|
+
- **`readInstructionsSourceChanged(notice)`**(CC-213):`instructions.source_changed`(同一会话这一次运行读的项目指令文件与上一次运行读的不是同一份)的事实读器,视图 `InstructionsSourceChangedFactsView { previous: string | null; current: string | null; sessionId: string }`。`previous` / `current` 是指令文件的相对路径,`null` = 那一次运行没有项目指令文件(真读数);三格必填,键缺席、空串、非串非 `null` ⇒ 整只 `undefined`(「不知道」不折成 `null` 或空串)。只认自己那一个码,敌意取值器不抛。接入文档 **§108a N-3**。
|
|
220
|
+
- **按码派发的通告事实口 `readEngineNoticeFacts(notice)`**(CC-214):一条通告 → 按 `code` 判别的联合 `EngineNoticeFacts`(每臂 `{ code, audience, facts }`,`facts` 是那个码的读器视图,`audience` = `noticeAudienceOf(code)`);表里没有这个码 / 读器判不成形 / 坏入参 ⇒ `undefined`,不抛。派发表 `ENGINE_NOTICE_FACT_READERS`(冻结对象,码 → 读器)覆盖本包全部七只事实读器、八个码:`mcp.injection_dropped` / `delegation.ask_unresolvable` / `config.durable_gate_unavailable` / `instructions.source_changed` / `approval.read_root_granted` / `approval.read_root_grant_rejected`(受众 `user`,**只有这六个属用户面**;后两码同是 `readReadRootGrantNotice`,视图按 `outcome` 判别)与 `skills.listing_truncated` / `mcp.server_redialed`(受众 `operator`,只属运维面)。`code` 与 `detail` 各只读一次,读器拿到的是这两只读数的快照。新具名型 `EngineNoticeFactsCode` / `EngineNoticeFactsOf<K>` / `EngineNoticeFacts`。接入文档 **§108a D-1 / D-2**。
|
|
221
|
+
- **停泊审批决断 422 `parked_resume.startup_failed` 的读口、一句话与判定**(CC-225):码常量 `PARKED_RESUME_STARTUP_FAILED`;读口 `parkedResumeStartupFromError(err, decision?)` → `ParkedResumeStartupDetail { code; cause; taskId?; resendable: false; denyStaysOpen: true } | null`(只认 `errorCode` 串,不看状态数字、不读正文、不要求 SDK 错误类);措辞 `parkedResumeStartupContent(detail)`。这枚码有两种成因:续跑没起来(被停泊的代理会话没了,或引擎拒了这次决断本身,如答案挂错了问题);停在一只「代理从发起它的任务继承来的工具」上的批准,而这台服务端交不出那只工具(同一个批准永远不会成,只能拒掉或等服务端升级)。**服务端回体上没有能分开两者的字段** ⇒ 本包只按调用方自己发的决断方向排除:`decision: 'deny'` ⇒ `cause: 'resume_rejected'`(第二种成因只对批准出);批准或未声明 ⇒ `cause: 'undetermined'`,那一句把两条出路都摆出来。判定恒定:同一个决定不自动重发(`resendable: false`),deny 照开(`denyStaysOpen: true`)。两句都不替引擎断言卡还在(第一种成因里一形行已不可再决),都指路「重取待决列表」。新具名型 `ParkedResumeStartupDecision` / `ParkedResumeStartupCause` / `ParkedResumeStartupDetail`。接入文档 **§108a P-1–P-3 / 108a-3**。
|
|
222
|
+
- **会话规则记录里有引擎拒启名字的会话:出路**(CC-229):会话规则记录里一旦有一条引擎会拒的名字(引擎退役名,或含 `__` 而不以协议前缀开头的名字),这条会话此后每一跑都在准备阶段以 `config.legacy_tool_name` 失败、模型一次都调不到。0.83.6 起本包在**写之前**扣下这两类;本版补上**已经写进去**那一侧。接入文档 **§108a E-1–E-6 / 108a-4–108a-6**。
|
|
223
|
+
- **`removeRefusedSessionRules(facade, sessionId, roster, opts?)`** —— 窄撤销动词:读当前记录 → 只拿掉 `toolDeny` / `toolAllow` 里引擎会拒启、**且名字不在 `roster` 里**的条目 → 带版本号整份回写。`roster` = 这台部署上一跑的工具名册(`wiring_manifest` 经 `projectToolRoster` 读出的那一份):引擎那道审计先看名字在不在这一跑的名册里(每行的名 ∪ 别名,原样比、分大小写),在就放行 —— 部署自己挂了一只恰叫退役名的工具(或别名)时,那一条是**生效的**限制,撤了就是把 deny 撤成 allow,所以名册里有的名字一条不碰。名册缺席(`undefined` / `null`)或读不了 ⇒ 结局 `roster_required`,一条不撤、一个请求都不发;读得懂的空名册照常判。因这一码启动失败的那一跑在交出装配清单之前就停了,名册要取自这条会话 / 这台部署上过了准备阶段的一跑。其余桶与条目逐字节原样、序不变;白名单被拿空时留成在场的空列表(一个也不放行 —— 丢掉它才是放宽)。命令桶与目录桶不进引擎那道名字审计,一字不动。撞上并发键只重读重写一次;不读能力位、不按版本猜。结局八臂:`roster_required`(`why`:`absent` / `unreadable`)/ `removed`(带新版本号与撤掉的条目)/ `nothing_to_remove` / `loosen_forbidden`(引擎把这次删除判成放宽:这台引擎上只有运营方能从会话规则记录里删条目,记录不变)/ `conflict` / `read_failed` / `write_refused` / `write_unconfirmed`(写发出去了但裁决没到手或回执对不上 —— 可能已经生效;再调一次就是核对,生效了会答 `nothing_to_remove`)。
|
|
224
|
+
- **`sessionPolicyRemovalNotice(outcome)`** —— 八臂各一句用户面话(唯一措辞真源):放宽被拒那句点明「这台引擎上只有运营方能删」,写不定那句说「可能已经生效」,名册那两句说清为什么要名册,其余失败句说「什么都没改」;撤成那一句**按撤掉的桶分说**(撤 deny:不解开任何挂着的工具,要按现名拦就新加一条 deny;撤 allow:不放行任何新东西,白名单拿空即一个都不放行,要按现名放行就把现名加回白名单);不回显任何规则串或引擎原文。
|
|
225
|
+
- **`legacyToolNameFailureNoteOf(code)`** —— 一跑以 `config.legacy_tool_name` 启动失败时的出路句;只按码判(别的码 ⇒ `undefined`)。句子列出那一条可能在的四处(这条会话的规则记录 / 随跑发送的设置 / 父会话的规则记录 / 部署自己的工具规则)—— 引擎的拒因里没有层位,句子不断言一定在会话规则记录里;不点名谁能删(新旧引擎答案不同,撤销动词的结局会如实说出这一台的答案);不回显名字(引擎自己的错误原文已点名)。
|
|
226
|
+
- **`isEngineRefusedToolName(name)`** —— 引擎准备期按名字拒启的判据本体(退役名表按原字节查;含 `__` 且不以任一协议前缀开头,区分大小写)。它比 `sessionPolicyDeliverable` 的 `legacy_tool_name` 判词**宽**:` foo__bar`(首尾空白)、`foo__*`(带通配)在判词里先落了别的成因,可引擎照样拒启 —— 撤销动词用的是本体。适合给「本会话规则」可见段标坏行。
|
|
227
|
+
- **`CONFIG_LEGACY_TOOL_NAME`**(`'config.legacy_tool_name'`)码常量。
|
|
228
|
+
- 公面类型 +3:`SessionPolicyRemovalOutcome` / `SessionPolicyRemovedEntry` / `SessionPolicyRosterRequiredWhy`。
|
|
229
|
+
- **plan-review 编排收注入 client**(CC-209;接入文档 §7 P-28 的 plan-review 半场)。浏览器同源中继宿主没有合法的引擎目标可装(`EngineWireTarget.token` 只收串,装不进 `{ mode: 'same-origin-relay' }`),此前只能采本包的纯判定、在端侧重建整条决断编排。现在三口各收一个可选的注入连线,宿主把自己构造的 `AgentClient`(中继形即可)交进来。接入文档 **§108a W-1–W-6**:
|
|
230
|
+
- `decidePlanReview(taskId, decision, permissionModeAfter?, opts?)` 第四参 `DecidePlanReviewOptions`:`wire: { client, capsBaseUrl? }` —— 给了就**只**用它(决断 POST 与决后回拉都经它;已装的引擎目标一个字不读,混用 = 把决断发到另一个部署);`reason` —— 随决断上送的理由(`PlanReviewRequest.reason`;任一决断都可带;trim,空白 / 非串 ⇒ 键不落,超 4096 字符截到 4096 并留一行 debug —— 超长会被服务端 413 打回,丢的是整次决断);`onOutcome` —— 结局交回宿主(见下)。请求体键序 `decision` → `reason` → `permissionModeAfter`;不带理由时体逐字节同旧。`default` 撞 400 `request.field_conflict` 的去键重发保留 `reason`。
|
|
231
|
+
- `armPlanReviewApproval(result, sessionKey?, opts?)` 的 `opts` +2 可选位 `wire` / `onOutcome`:给了 `wire` ⇒ 在场判看它(client 不可用 ⇒ 不出卡,`false` + error 留痕 —— 不出一张答不出去的卡),CC-46 三选卡的版本证据从 `wire.capsBaseUrl`(= 宿主 `kickEngineCapsProbe` 用的那把 baseUrl)读,不给 ⇒ `unknown` ⇒ 老两选卡,**不**回落已装目标的 baseUrl;responder 递交决断时把 `wire` / `onOutcome` 原样带给 `decidePlanReview`。
|
|
232
|
+
- `reopenPlanReviewCard` 的 `ReopenPlanReviewOpts` +2 可选位 `wire` / `onOutcome`:缺省投递口从此经注入 client 投递;于是**非默认会话槽给了 `wire` 就不必再自带 `deliverDecision`**(两者都缺席时照旧拒开)。canonical 复用臂(`mintFreshQuestionId: false` 且首呈卡的作答口仍绑着)沿用首呈那一次给的连线,本位不生效(与 `deliverDecision` 同一成文例外,命中留一行 debug)。
|
|
233
|
+
- 注入的 client 不可用(不是对象 / 缺 `assistant.planReview` 或 `runs.get`)⇒ 一个字节都没送出去:结局 `not_sent`,专句「the engine client supplied by the host cannot send it」,绝不回落已装目标。
|
|
234
|
+
- 新型 `PlanReviewWire` / `PlanReviewWireClient`(结构型:`assistant.planReview` + `runs.get`,`AgentClient` 直接满足)/ `PlanReviewDeliveryOptions` / `DecidePlanReviewOptions` / `PlanReviewDecisionOutcome` / `ArmPlanReviewOptions`(`armPlanReviewApproval` 第三参的命名形,字段与此前的内联对象逐字相同 + 两个新可选位)。运行期导出零新增。
|
|
235
|
+
- **决断结局交回宿主**(CC-209):`onOutcome(outcome)` 与队列口 `enqueueMetaPrompt` **并行**(不是二选一):每次被在飞闩放行的决断恰回调一次,载荷 `{ taskId, dispatchNo, decision, effect, detail, tail, prompt, status? }` —— 前四键与队列项机读位 `_sema_planReviewOutcome` 同源,`prompt` 与队列项 `value` 逐字节相同,`detail` 是结局正文、`tail` 是尾句,`status` 是措辞所依据的任务状态(回拉读到的,次之决断 200 体自带的;都没读到 = 键不落)。被闩拒的那次不回调(与「不铸号、不投结局」同律);本地拒发(零 POST)也回调(`effect: 'not_sent'`);回调抛只留一行 debug,不影响队列投递与 promise 落定。**队列口缺席而宿主接了回调 ⇒ 不再打 error 级「MISSED」留痕**(改一行 debug);两条通道都没有才照旧 error 级。没有模型提示注入通道的宿主(浏览器)据此渲自己的回执。
|
|
236
|
+
- **两只能力探针收注入 client**(CC-209):`EngineProbeOpts.client`(`EngineProbeClient` = `capabilities` + `scenarioCapabilities` 两只动词,`AgentClient` 直接满足)。给了 ⇒ `engineSupportsTaskAgents` / `probeScenarioTools` 直接用它,`baseUrl` / `authToken` / `principal` / `fetchImpl` 都不用来构造(不读);`timeoutMs`(3 s / 2 s 缺省)是**独立落定**的截止:到点即答「不知道」并中止底层请求 —— 注入 client 的读重试在退避 / `Retry-After` 睡眠期间不看取消信号,只中止会被拖过预算。失败分类不变(`undefined` / `null`)。建议给注入 client `maxRetries: 0`(本包自构造的 client 同此)。
|
|
237
|
+
- **`_sema_permission_denials[]._sema_tool_input_redacted?: true`**(CC-235,超集位;`SemaPermissionDenial` +1 可选成员,CC 数组同一条目同值):在场 ⇒ 该条 `tool_input` 是同一条流 `tool_start` 帧上的入参,但到达客户端之前已被传输层脱敏 —— 它是那次调用入参的**脱敏视图,不是原值**;拿 `tool_input` 重跑、比对或生成放行规则之前先读它。只在 `true` 时在场,绝不铸 `false`;在场时 `_sema_tool_input_source` 恒为 `'tool_start'`。判据是字面记号(`«redacted` 前缀 / 叶值恰等于两个占位串;多认不少认 —— 入参里本来就含这些字面的调用也会被盖,方向只多一句「可能不是原值」)。接入文档 **§108a PD-2**。
|
|
238
|
+
|
|
239
|
+
### Changed
|
|
240
|
+
|
|
241
|
+
- `stripSystemReminderBlocks` / `unwrapSystemReminder` 的开标签识别改走与定位口同一个判定函数。行为不变:与 0.83.3 冻结实现的定种子对拍、§104 的正负样本照旧逐字节同。
|
|
242
|
+
- `detachDurableOffHint` 改为包 `isDetachDurableOff400`。
|
|
243
|
+
- 🔴 **`detachDurableOffHint` 遇到读属性会抛错的错误对象不再抛**(CC-219):`status` / `message` 的 getter 抛错、Proxy 陷阱抛错、已撤销的 Proxy,此前(已 arm 时)原样抛出,本版起回 `null`(「不是那一枚 400」)。其余输入的返回值逐字不变(门里冻结改前实现逐条对拍);`message` 此前读两次、本版起至多读一次(只有带计数 getter 的对象看得出)。**谁要跟**:按「会抛」写的测试改锚为回 `null`;端上包着它的 try/catch 从此不再因这类对象触发。四端产品源码零改动。
|
|
244
|
+
- 🔴 **`readReadRootGrantNotice(notice)` 的入参型放宽为 `unknown`**(CC-214;此前 `{ code?, detail? } | null | undefined`):与本模块其余事实读器同型,派发口因此对派发表逐行做编译期入参检查。读法与返回值不变。**谁要跟**:零改动 —— 任何实参照旧可传;只有拿它的形参型做类型推导的代码会看到 `unknown`。
|
|
245
|
+
- 🔴 **`noticeAudienceOf('instructions.source_changed')` 由 `operator`(回落)改为 `user`**(CC-213)。**谁要跟**:按 `noticeAudienceOf` 分发的端不改代码即跟着走 —— 这条通告从运维面挪到用户面;若为它写过运维面专属行,那一行跟着挪。按「受众 `operator`」写的判据改锚。`memory.layer_locked_legacy` 的受众仍是 `operator`(此前是回落得来,本版起是表上写明)。接入文档 **§108a N-2 / 108a′**。
|
|
246
|
+
- 🔴 **`engineNoticeInCatalog` 对两枚服务端自铸码(`instructions.source_changed` / `memory.layer_locked_legacy`)由 `false` 改为 `true`**(CC-213)。**谁要跟**:按 `engineNoticeInCatalog` 决定「渲不渲」的端,这两枚码从「只落调试」变成「册内通用行」,不改代码即跟着走;按「这两枚码册外 / 只落调试」写的判据改锚。接入文档 **§108a N-2 / 108a′**。
|
|
247
|
+
- 🔴 **决断失败码优先于「门早已决」扫词臂**(CC-225):修前,停泊审批决断撞 422 `parked_resume.startup_failed` 时,包内停泊审批腿按失败文字扫「门已决」词表(`no pending checkpoint` / `resolved` / `already` / `not found`)——被停泊的代理会话没了那一形,引擎原句恰是「Parked resume did not complete: parked resume failed — the approval is no longer redeemable: Session not found: <id>」,命中 `not found` ⇒ 判成「这张卡早被别处决了」、静默重连一轮,失败文字(连同本码那一句)不上失败面,连续命中后以一句坐标失配的话收场。本版起这枚码先按码分类:不重连,失败文字带本码那一句收场。没有机读码、或别的码的失败,扫词臂照旧。新公面判定 `isCodeClassifiedGateFailure(code)`:这枚决断失败码自己说清了处置、失败文字不许再按那张词表扫(= `isGateStandingErrorCode` 的两码 ∪ 本码);本码**不**进 `isGateStandingErrorCode`(会话没了那一形门已不在)。**谁要跟**:走包内停泊腿的终端零改动即得;端侧自有「门已决」判据链的,在扫词之前问这一口;按「这一形会重连一轮」写的判据作废。接入文档 **§108a P-5**。
|
|
248
|
+
- **四个决断出口的失败文字补上 422 那一句**(CC-225):审批卡两条腿(批准 / 拒绝)、提问卡腿(作答 = 带答案的批准 / 空作答 = 拒绝)、中断撤卡(拒绝)撞 `parked_resume.startup_failed` 时,失败文字(结局 `reason`、宿主日志、中断撤卡上屏的那一行)在原句之后补 ` — <那一句>`,按这一次发的决断方向选句;别的码 / 无码时失败文字逐字节不变。补句不含本包「门早已决」扫词表里的词。**谁要跟**:按失败文字整串断言本码的格多出那一段;别的码零改动。接入文档 **§108a P-4**。
|
|
249
|
+
- `sessionPolicyDeliverable` 的 `legacy_tool_name` 臂改为调用 `isEngineRefusedToolName`(同一张镜像表、同一判序,判决与话一字不变)。
|
|
250
|
+
- 🔴 **配置拒绝识别表 `CONFIG_REFUSAL_CODES` +1 员 `config.legacy_tool_name`(七员 → 八员,排在最后)**(CC-229),与前缀判定 `isConfigRefusalCode` 一致(前缀谓词本来就认它)。**谁要跟**:按成员数或逐员逐序断言这张表的测试改锚;按 `.has` 判的端零改动。
|
|
251
|
+
- 🔴 **`decidePlanReview` 决断撞上请求时限那一臂改说「已送出、时限内没有答复」**(CC-209;两条路同一句):sdk 的每请求时限到点(`TimeoutError`)时这一发其实已经送出、引擎多半正在驱动续跑 —— 此前两条路都落「could not reach the engine」。本版起结局正文是「The plan_review <决断> was sent, but no answer came back from the engine within the time limit this host allows for it — it may have taken effect (…)」,`effect` 仍是 `unconfirmed`;真连不上(连接被拒、断网)照旧是「could not reach the engine」。已装目标那条路的时限是 6 h;注入形用宿主 client 的 `timeoutMs`,🔴 要求不低于 6 h(sdk 的逐请求选项只有取消信号,本包改不了注入 client 的时限;沿用 sdk 缺省 60 s 的 client,续跑超过一分钟的批准会落这一臂),见接入文档 **§108a-9**。**谁要跟**:按「时限到点 ⇒ could not reach」整串断言的格改锚;按 `effect` 分支的端零改动;网页端给中继 client 设 `timeoutMs`(108d)。
|
|
252
|
+
- 决后回拉在注入形上是 15 s 的**独立落定**截止:到点即当回拉失败(回落决断 200 体自带的状态措辞)并中止底层请求,不被注入 client 的读重试退避拖长;已装目标那条路照旧是独立的 15 s 短超时 client。
|
|
253
|
+
- 注入连线本身坏形(`wire` 为 `null` / 非对象 / 读 `client` 就抛 —— JS 调用方)与 client 不可用同一处置:结局 `not_sent`、`onOutcome` 照回、零请求,不抛(此前这一形在决断入口之外抛出,`void decidePlanReview(…)` 留下一只未处理的拒绝、结局与回调都没有)。
|
|
254
|
+
- **不变**:不带新位的三口(请求体 / 出站头 / 结局文字〔时限那一臂除外〕/ 队列项键集 / 投递闩 / 投递序号 / 重开判决)逐字节同 0.84.0;`EngineWireTarget` 型不动;`makeEngineWireClient` 不动;子代族动词(tail / steer / output / compact / task handle / delegated prompt / resume)仍只吃已装目标(见接入文档 §7 P-28)。
|
|
255
|
+
- 🔴 **终帧 CC 形 `permission_denials` 收入参被传输层脱敏过的拒绝**(CC-235):服务端把 `tool_start.args` 转发给客户端之前做一道保形脱敏(结构与键名不动,字符串叶里的凭据形子串换成 `«redacted…»` 记号;环与超深子树换成 `[circular]` / `[depth-limit]` 占位串)。0.73.4–0.84.0 把这一类当成「拿不出可信入参」:那一行只进 `_sema_permission_denials`,并让 `_sema_permission_denials_absent: true` 落下 ⇒ 只读 CC 三键的消费方把一次真实的拒绝读成没发生(入参里写了 `scheme://user:token@host` 形 URL 的命令被拒时就是这一形,与哪条拒绝路径无关)。而同一条输出流里,这只对象早已作为转录 `tool_use.input` 交给了同一批消费方;参照形的记录点手里恒有入参、三键必填,从不因入参形态拒记一条。本版起:入参是普通对象、在扫描预算内、只是被传输层动过 ⇒ 照进 CC 数组,`tool_input` 就是帧上**同一只**对象(与转录 `tool_use.input` 同一个引用;不复制、不反解、不剔记号),条目带 `_sema_tool_input_redacted: true`(见 Added)。CC 数组是 `_sema_permission_denials` 的过滤子集,两处是**同一个条目**、同在同值。清单里只有这一类不完整时,`_sema_permission_denials_absent` 不再落下(它的语义不变 —— 仍是「CC 那条清单不可声称完整」;条数完整了,入参不是原值这件事由标记说)。账本行与流内补行(0.82.1 对账补上的那一半)同一条律。
|
|
256
|
+
- **不变**:真没有入参对象的几类 —— 行无 `toolCallId`、本流没见过那只 `tool_start`(重连后的流、宿主自建管线没交快照、同一个 id 见到两份不同入参)、入参不是普通对象、入参超出扫描预算(节点 / 深度)、本流快照溢出、流内补行的工具名读不出 —— 仍只在 `_sema_permission_denials`,`tool_input` 缺席(绝不铸 `{}`),`_absent: true` 照落。「被传输层动过 ∧ 超预算」按超预算判,不因见到记号先放行。账本自己带入参时账本那份恒优先,不盖标记。
|
|
257
|
+
- 这是**读法变化**:已发的 §66 G2(「入参带会被传输层替换的凭据形串 ⇒ `permission_denials` 空、`_absent: true`」)与 G3 在本版上判红是预期行为。成文改口见接入文档 **§108a′**。**谁要跟**:终端 —— 「这条 run 真的拒过」的判定结论不变(这一类此前经超集载体判「拒了」,现在经 CC 数组判「拒了」),`-p` 结果帧整帧过境零改动即得;凡拿 `tool_input` 重跑 / 比对 / 生成放行规则的读点先读标记(今天没有这类读点)。网页端 / 桌面端 / 管理台今天零读点。验收方按 §66 G2 / G3 写的判据改锚。
|
|
258
|
+
|
|
259
|
+
- 🔴 **凭据读法:`displayUntrusted` 系地址豁免的判法改了,两处「值 / 口令原样上屏」收口(CC-234;输出字节与 0.83.4 不同,断言按「不含值」写)**。机读口(合成终局行、结果帧 `errors[]`)、`displayUntrusted`(全部载体与开关)、`displayUntrustedMarks` 同批。接入文档 **§108a K-1 / K-2 / 108a-8**:
|
|
260
|
+
- **方案词 / 凭据标签与地址形的值之间、紧贴值夹着不可见单字**(格式类字符 —— 零宽空格、软连字符、标签字符等 —— 孤代理项、非空白控制符、没接成序列的 ESC / C1;原字,或本出口画出的可见转义形 `\uD800` / `` 这一类)时,值不再按地址豁免(豁免 = 主机与路径原样、只遮 userinfo / query / 片段)。`scheme://` 留,主机与路径换 `«redacted:secret»`,query / 片段照旧换 `«redacted:query»` / `«redacted:fragment»`。例:`Authorization: Bearer` + U+D800 + `https://secret.example/x` ⇒ `Authorization: Bearer` + U+D800 + `https://«redacted:secret»`。0.83.5–0.84.0 上这一形在正文 / 单行 / 字段三种载体都原样露出值;同一位置换成零宽空格的一形各版都露。
|
|
261
|
+
- **`user:<口令>@` 后面的主机位被可剥单元占住、再往后没有主机**(串尾 / 空白 / `/ ? #` 等右界、`:<端口>`、或下一枚 `@`)⇒ 按 userinfo 遮成 `«redacted:userinfo»@…`;这一形里用户名一段跨过可剥单元(与点形载体上屏的读法一致)。此前只有点形 / 空格形载体顺带遮住(单元画成的 `.` 恰像主机),机读口、默认形、转义形原样上屏。候选挂在一枚凭据标签 / 方案词上 —— 是它的值(分隔一直吃到候选起点,含引号值的开引号:`password: "user:<口令>@` + 零宽空格 + `/ <尾>"`),或把它吞了一截(`token=u:<口令>@…`、`"token":"u:<口令>@…`)—— 时不走这一条,整只值照旧由标签那一遍换记号(与 0.84.0 同答);标签 / 方案词被可剥单元拆开(`to` + 软连字符 + `ken=`、`Bea` + 零宽空格 + `rer `、`tok` + 着色序列 + `en=`)也按剥掉单元的读法认。标签的值是别的词、与候选之间隔着空白(`token=abc user:<口令>@` + 零宽空格)⇒ 候选照认 userinfo。
|
|
262
|
+
- **不变的**:值左邻是真空白、分隔符或引号时照旧按地址豁免(`Bearer https://docs.example.com/x`、`api_key: https://console.example.com/keys` 逐字节不变);紧贴值的是完整转义序列(着色等)时照旧豁免(标签后给值上色是正当排版);`@` 后面直接是真空白 / 串尾的无主机形照旧不算 userinfo;没有冒号的 `a@<单元>` 不动;凭据之外的不可见字符逐字节不动;孤代理项与零宽空格同位同答照旧成立。
|
|
263
|
+
- 🔴 **可见字节差异**(按「输出不含凭据」写的判据零改动;按原样字节写的改锚):不可见单字 / 它的转义形留在原处、不进记号(`Bearer \uD800https://«redacted:secret»`);`Authorization:` 头值上 0.83.4 是整段一枚记号,本版是 `Bearer` + 单字 + `https://«redacted:secret»`;点形载体上「方案词 + 空格 + 单字 + 地址」一形为 `Bearer «redacted:secret»`。**谁要跟**:管理台 —— 提货测试里钉「三载体露值」与零宽空格对照的格按预期翻红,翻面为「不含值 ∧ 含 `«redacted:`」;凡按字节断言凭据输出的格一律改按「不含值」写,不按 0.83.4 原样字节写。终端 / 网页端经本包适配层的机读口升级即净,零改动。
|
|
264
|
+
|
|
265
|
+
### Gates
|
|
266
|
+
|
|
267
|
+
- 新门 `run-system-reminder-open-tag-test.mjs`(30 格):引擎两形逐下标 · 非引擎形 15 形不认、不吞其后真形 · 串尾截断六形不认 · `from` 域外十一形 / 非串八形 `null` 不抛 · 与块上下文无关(嵌套 / 未闭合 / 块正文里的字面开标签)· 2 万条定种子随机串上,定位口找出的开标签集合 ≡ 只用剥离口、解包口的可观察答案反推的集合(不读内部),用定位口重写的剥离 / 解包与两口逐字节同 · 线性两格(单次扫大量近似开标签;`from` 前移走完整串)。
|
|
268
|
+
- 新门 `run-detach-durable-off-verdict-test.mjs`(34 格,其中服务端铸点见证一段只在给了服务端源码树时跑):锚句在场 ⇒ 真(含假 fetch 回 400 体、经 SDK 提交流真抛出的那一枚)· 同码另三句原文 ⇒ 假 · 非 400 七形 / 畸形输入十八形 ⇒ 假不抛 · 不读进程台账 · 冻结改前 `detachDurableOffHint`,除抛错形外逐条对拍返回值(armed / 未 arm × 22 条)· 抛错形五形(getter 抛错、Proxy 陷阱抛错、已撤销 Proxy)纯判定回 `false`、包装层回 `null`,改前两者都抛 · 读次数:`status` 恰一次、`message` 至多一次 · 服务端源码树在场时:通用码的全部 400 铸点里恰一处含锚句且以它起头,其余逐句判假。
|
|
269
|
+
- 按错误文案分支的门:具名豁免那一处从 `detachDurableOffHint` 搬进 `isDetachDurableOff400`(同一处锚句判断,站点数不变)。
|
|
270
|
+
- 扩门 `run-engine-notice-catalog-test.mjs`:I 段(服务端自铸码表两行冻结、与引擎镜像码册和实装引擎码册零交集、引擎镜像不被污染;在册判据与受众读口同认、原型键与脏码不冒充;`readInstructionsSourceChanged` 三格与缺席 / 空串 / 非串 / 原型链 / 敌意取值器各形)· IX 段(可选腿:指向一份装了服务端发布包的目录时,对它的服务端自铸码受众表双向等值、受众逐行同值、与引擎码册零交集、判 `user` 的码在用户流白名单而判 `operator` 的不在、派发口的用户面码全在白名单;没指时如实标为未跑,必跑档缺席即红)· J 段(派发表冻结;本模块每只导出的事实读器都是表里的同一只函数、表里每只都是本模块的导出、表里的码都在册;按码分家交叉矩阵 —— 每只读器恰读得出它挂的那几个码的夹具、别的码一概不给读;表里每个码都必须有门夹具,派发结果与直接读逐键同值、受众与受众读口同答;用户面恰六码、运维面两码;读目录授权两码经派发口视图按 `outcome` 判别、`covers` 坏词经派发口仍 `undefined`;在册无读器 / 册外 / 原型键 / 坏入参 / 敌意取值器 ⇒ `undefined`;`code` 与 `detail` 各只读一次)。另有编译期钉:派发表与本模块导出的事实读器两向相等(删表里一行构建即红)。
|
|
271
|
+
- 新门 `run-parked-resume-startup-test.mjs`(89 格):读口两成因与分不出(正文点名哪种成因都不分臂)、决断方向只认严格 `'deny'`、`taskId` 顶层优先附加键兜底 / 缺席不编;判定两位严格恒值;上游前提钉(实装引擎产物里「继承工具」那一因的判据行只对批准出);两句三段、互异、都指路重取待决列表、分不出那一句摆两条出路、不带扫词表里的词、零内部词;措辞单源(源码全树逐文件扫,两句只在一处铸);别码 / 无码 / 大小写 / 空白 / 兄弟码 / 退役键位 / 敌意取值器 ⇒ `null`,不看状态数字;真 SDK `toApiError(422)` 实例照读;五条出口补对应那一句(整串相等),别的码逐字节同旧;码优先:引擎真正文(会话没了那一形,先自证它命中「门已决」词表)上,停泊提问卡腿作答 / 空作答、审批卡腿批准 / 拒绝都不重连、失败文字带对应那一句,同一正文无码 / 别码照旧走扫词臂重连;`isCodeClassifiedGateFailure` 认本码与两只「门还在」码,本码不在「门还在」判定里。
|
|
272
|
+
- 新门 `run-session-policy-refused-removal-test.mjs`(111 格):判据本体对开发依赖引擎的真退役名表与协议前缀表独立判官逐名两向相等(向量 + 退役名表全员 + 前缀大小写变体 + 定种子随机名),且比 `legacy_tool_name` 判词宽;真 `Runner` + 内存会话规则店,单条名字分别写进 `toolDeny` / `toolAllow` 跑一次 —— 判据本体说「会拒」⟺ 引擎以 `config.legacy_tool_name` 拒启且模型零调用;撤销动词只撤会拒条目(其余桶与条目逐字节原样、序不变、在场空桶留空桶、一读一写、版本号 +1)、撤后同一会话下一跑过准备阶段(语料全员逐名跑,两只桶)、没有要撤的零写;老引擎真店上普通调用方删 `toolDeny` ⇒ `loosen_forbidden`、恰一次写、记录逐字节不变、下一跑仍拒启,只有 `toolAllow` 里有 ⇒ 撤得成;并发键撞一次恰重读重写一次、撞两次 ⇒ `conflict`;读失败 / 写被拒 / 写不定逐类(写不定含裸抛 / 5xx / 无码 4xx / 落盘后抛 / 回执读不懂 / 回执对不上),写不定之后再调一次 ⇒ `nothing_to_remove`;名册:真 `Runner` 挂一只叫 `Task` 的自定义工具(与一只别名是 `KillShell` 的)⇒ 引擎认那一条 deny,撤销动词拿这一跑的真名册不撤它、下一跑照过准备阶段且 deny 还在,名册只按原样比(小写 `task` 不豁免 `Task`,与引擎同),名册缺席 / 读不了十一形 ⇒ `roster_required`、零请求、不抛,读得懂的空名册照撤;八臂措辞两两互异、撤成那句按撤掉的桶分说、零用户字节、表外值不抛;出路句只认一码、列四处位置、不点名谁能删,真 `Runner` 拒启交出的正是这枚码,同一枚码也从调用方策略那一层来(记录为空)⇒ 撤销动词答 `nothing_to_remove`。
|
|
273
|
+
- 新门 `run-plan-review-injected-wire-test.mjs`(119 格):真 dist + 真 sdk 中继 client(spy fetch 路由到假引擎 A),已装目标故意指向另一只假引擎 B —— P 正控(spy 记到 Bearer 头)· W1 十三格场景矩阵注入形 vs 目标形结局 / 体 / 次数 / 机读位逐字节同答且 B 零命中 · W2 投递闩三形 · W3 `field_conflict` 去键重发恰一次 / `acceptEdits` 不重发,CC-46 双闸只从 `capsBaseUrl` 读证据(不回落已装目标)· W4 中继形每一发零 `authorization`(判别力:同一 spy 此刻仍记到带 token client 的 Bearer)· W5 植入的假 token 在四路结局 + 拒连路上零出现于日志 / 结局 / 队列项 / 回调 · W6 reason 七形 · W7 onOutcome 九形 · W8 reopen + wire 三形 · W9 五形坏 client · W10 两只探针 · W11 结构化最小 client 端到端 + 回拉带 signal · W12 决断时限两路同答(真 sdk + 缩放计时器:按接入段要求构造的注入 client 与已装目标对同一只慢回答逐字节同答;注入 client 时限短于回答 ⇒ `unconfirmed`「已送出、时限内没有答复」,已装目标撞上每请求时限 ⇒ 同一句,连接被拒仍是「could not reach」)· W13 读口截止独立落定(真 sdk、读口答 429 + `Retry-After: 60`、缺省读重试:两只探针在 `timeoutMs` 附近落定答「不知道」,决后回拉在截止处落定并回落 200 体状态,截止同时中止底层请求)· W14 坏连线四形(`null` / 串 / 数 / 读 `client` 就抛)不抛、无未处理拒绝、`not_sent` + 回调恰一次。
|
|
274
|
+
- 扩门 `run-permission-denial-projection-test.mjs`(349 → 375 格):F5 改判 —— 五种被动过的形(顶层记号 / 嵌套残片记号 / 裸记号 / 环占位 / 深度占位)各进 CC 数组恰一条、三键齐、`tool_input` 是同一只对象、两载体同一条目严格 `true` 标记 + 来源位、判别位不落、账本摘要位照过境;F1e 没被动过的入参 ⇒ 标记键缺席;F5b 正文里提到占位串不盖标记;F5g / F5g2 被动过 ∧ 超节点预算(记号先被扫到 / 预算先耗尽两序)、F5h 被动过 ∧ 超深度、F5i 入参挂在别的 id 上、F5j 带记号但不是普通对象 ⇒ 仍不进、不盖标记;F6b 账本自带入参 ⇒ 不盖标记;F10b 公开入口 `runStream` 端到端:`tool_input` 与同一条输出流里转录 `tool_use.input` 是同一只对象;L4 改判 —— 流内补行同一条律,L4b 没被动过不盖标记。变异反证七枚逐格见红(账本行标记丢失 / 流内补行标记丢失 / 两条路径各把「没见过 `tool_start`」按空对象收进来 / 见到记号即提前收 / 没动过也铸 `false` / 标记盖到账本自带入参上)。
|
|
275
|
+
- 扩门 `run-display-untrusted-projection-test.mjs`(402 → 414 格):X41 地址形值左邻是不可见单字 14 形 × 12 种出口(机读口、十种呈前载体、标记位置读口)凭据不露 · X41b 原形实得值 · X41c 主机与路径只剩被剥的单元时不凭空铸记号 · X42 空主机 userinfo 10 形 × 12 种出口不露 · X43 / X43b 真空白 / 着色序列 / 无冒号形逐字节不变 · X44 幂等与标记位置读口同字节 · X45 线性 · X46 与上一发布产物差分抽出的最小形(上一版遮住的出口上本版不露)· X47 空主机 userinfo 候选挂在标签 / 方案词上的 15 形(引号值夹单元 3 形 + 标签 / 方案词被单元拆开 12 形)× 12 种出口,口令与尾巴都不露(0.84.0 全遮)· X48 引号内空白池 / 拆标签池各取的样本 5 串 × 12 种出口 · X49 标签不挂在候选上时 userinfo 照认。另对 0.84.0 发布产物跑差分(宽池、拆标签定向池与引号内空白池各三到五组种子,全池五组种子 × 13 种出口;对 0.83.4 发布产物跑两形池):「上一版遮 / 本版露」只剩一类 3 格(点形单行载体上控制空白前的上一个词,KL-181 同类),其余计数 0。
|
|
276
|
+
- **终帧夹具第二批换成现役因由形**(CC-233;只改门,出包面零变化)。只换「结论依赖终态读法」的套:`run-permission-denial-projection-test.mjs`(15 处:成功臂与错误信封是否同一个铸点,哪一臂由终态读法判出)、`run-streamjson-timing-honesty-test.mjs`(13 处:到限码 → `subtype`、合成终局行、抢救正文)、`run-terminal-identity-copy-test.mjs`(18 处:终局行说哪一句)、`run-result-text-backfill-test.mjs`(1 处:补差读的是成功臂上的终答)、`run-parked-resume-startup-test.mjs`(3 处:停泊审批 / 提问的 park 终帧;问答门按引擎真实铸形补 `kind: 'human'`),以及 `run-client-core-pure-test.mjs` 余下的 41 处(终态投影、成本单轨、409 负控里的普通失败、降级链各臂、抢救腿、错误信封单一铸点等)—— `done` 帧从退役平面形(`status` + `errorCode` / `errorMessage` / `blockedReason`)换成 `result.terminal`(`completed` / `failed{code, message}` / `blocked{reason}` / `paused{gate}`)。只换形不改判据:六套换形前后检查数逐一相同且全绿(375 / 41 / 987 / 105 / 89 / 4112)。换形之前,把终态读法的因由分支改坏(成功读成「认不出」、失败从平面键名取码与原话、被挡读成成功),前五套照样全绿;换形之后同一组改动五套都红(权限拒绝投影停在错误信封的正控格,exit 9)。停泊决断 422 那一套另做一次:把因由形的 park 读成「认不出」,换形前全绿、换形后在「作答真走到决断」的自证格停下(exit 9)。每套另做一次夹具负控:把换进来的终态词改成表外词 ⇒ `run-streamjson-timing-honesty-test.mjs`、`run-terminal-identity-copy-test.mjs`(失败 / 被挡各一次)、`run-result-text-backfill-test.mjs`、`run-client-core-pure-test.mjs`(失败一次、终态投影成功臂一次)红,`run-parked-resume-startup-test.mjs` 在自证格停下(exit 9:认不出 park 就走不到决断);`run-permission-denial-projection-test.mjs` 对表外词**不红** —— 表外词落「认不出的终态」臂,那一臂同样是错误信封,而本套的结论只分「成功臂 / 错误信封」;对它改做「被挡 → 成功」的换词负控,当场停在错误信封的正控格。
|
|
277
|
+
- **合法的扁平帧逐格注明**:仍是扁平形的 29 处都是现役 wire 上真会出现的扁平字节,帧上或帧正上方各注一行 `// 409: …`(服务端自己的 active-run 拒绝信封,含老服务端只带人话的那一形)或 `// 回放面: …`(升级前落盘、经读盘面逐字回放的历史行;同步提交 park 体经幂等重放上 SSE;只可能出现在回放行上的退役词 / 表外词防御格)。涉及 `run-client-core-pure-test.mjs`、`run-streamjson-timing-honesty-test.mjs`、`run-terminal-identity-copy-test.mjs`、`run-selfheal-reopen-test.mjs`、`run-result-frame-projection-test.mjs`、`run-display-untrusted-projection-test.mjs`、`run-terminal-cause-projection-test.mjs`、`run-hitl-gate-honesty-test.mjs`、`run-shell-gate-durable-allow-test.mjs`;这些套的检查数不变。
|
|
278
|
+
- 新门 `run-fixture-flat-done-ratchet-test.mjs`(CC-233,12 格):扫 `scripts/` 下每一只 `{ type: 'done', result }` 字面量,把 `result` 追到它真正的对象字面量 —— 就地、经变量、经助手参数(同文件每个调用点各算一处)、经展开、经迭代(`for … of` 的数组行、`[…].map` 回调)五形都追 —— 再判因由形 / 扁平形;扁平位点没有 `// 回放面:` / `// 409:` 注(注释以标记开头、冒号后有理由;字符串 / 模板 / 正则里的 `//` 不算)的,计数不许超过登记物里的上限(只降;低于上限打印 `RATCHET-SLACK`)。本版实测 143 → 23:剩下 23 处都在结论与终态读法无关的九套里(见 Known limits)。尺子先植后量:植入语料里六形扁平、字符串里的假注、没写理由的注、两处真注、三处因由形与一只 `turn_end` 干扰项逐形逐数对拍,对不上 exit 9;真树另有人口地板(文件数、done 字面量数、因由形位点数)。
|
|
279
|
+
- 新门 `run-authority-envelope-mirror-test.mjs`(CC-230 过渡对账,37 格):同事正文写进转录行之前要拆火的权威信封标签表,是引擎那张表的本包镜像;此前没有门对它对账。现在对开发依赖引擎包双向对账 —— 引擎有、本包缺 ⇒ 红(那个标签的伪造信封会原样进转录);本包有、引擎没有 ⇒ 红(同事正文里的普通标签被改写);并核引擎那张表仍由它的信封登记表派生。引擎包根不导出这张表,门按路径读引擎模块里的值,门头注写明这是过渡读法(候镜像表改为构建期生成物)。消费面:三条同事车道渲出的转录行里,引擎每个权威标签(开 / 闭 / 带属性 / 全大写)全被拆火,引擎表里的非权威信封标签原样不动。
|
|
280
|
+
- 登记物:根公面基线 1260 → 1275(+15);型面门 unknown 出境棘轮 417 → 422(新口收宿主 catch 到的原值 / 通告原值,派发口入参放宽一格);`export-liveness` 登记 46 → 44 行(`DETACH_HEADER` / `engineSupportsTaskAgents` 两条 contract 行因有门按名引用而按退出条件删,棘轮 `maxRows` 同批 46 → 44);超集键台账 89 → 90(`_sema_tool_input_redacted`);单例清单 526 → 529(服务端自铸码受众表、派发表、422 两句措辞表入册);同名影子对账门豁免 25 → 26(一端本地同名同义的 detach 判定,到 0.85.0 为止);门数 144 → 151,README「Guards」表 151 行(`run-registry-test.mjs` 那一行改为不写死读它的门数);负控文档「自动化」表 25 行 = 负控套 `CASES` 25(新增两枚:棘轮上限改小 1 ⇒ 门必须红且点名;引擎信封登记表里把一个 framing 行改判 authority ⇒ 门必须红且点名缺的那个标签);棘轮新格 `fixtureFlatDone.unmarkedCeiling` = 23(附一条沿革账);可移植闭包 kernel 18 / adapt 35 / index 213 不变;裸定时器登记 `agentsWireCaps.ts` 2 → 1、`liveInitToolFace.ts` / `hitl/planReviewWire.ts` 出表(三处读口截止收进包内共享等待叶,该叶登记数不变)。
|
|
281
|
+
|
|
282
|
+
### Known limits(本版新增)
|
|
283
|
+
|
|
284
|
+
- 开标签文法常量本身仍不上公面:定位口回「在哪」,不回一段拿去拼正则的源码(与上一版同一取舍,见文末 KL-135 那一条)。
|
|
285
|
+
- `isDetachDurableOff400` 只认锚句:那条拒绝的原文改了,判定答 `false`(方向:不退让、不出提示行,原 400 照常交给宿主),在这条拒绝配上专码之前没有更稳的判据(KL-176)。
|
|
286
|
+
- 422 `parked_resume.startup_failed` 的两种成因在回体上分不开:对批准,本包只能说「分不出」那一句(两条出路都摆);继承工具那一形里,端若照旧把同一张卡连同批准再呈,用户会再撞一次同一个 422。等服务端在回体上带出机读成因位后再分句(KL-177)。
|
|
287
|
+
- 端侧自有「门早已决」判据链(按失败文字扫词)的,要在扫词之前问 `isCodeClassifiedGateFailure`,否则会话没了那一形仍会在端上被认成「门已决」;失败文字被拍平成串、机读码读不到的端路径,只能按 SDK 错误类名兜底(KL-178)。
|
|
288
|
+
- 服务端自铸码表只镜像服务端当前两行;服务端再加自铸码时,本包在对账腿(需指向服务端发布包)上先红,没指发布包的日常跑不出这一红(KL-179)。
|
|
289
|
+
- 拒启会话的出路:撤销动词按宿主交来的**一份**工具名册判「名字在不在名册里」—— 因这一码启动失败的那一跑交不出名册,名册要取自同一部署上过了准备阶段的另一跑;两跑挂的工具不同(子代腿、按场景卸载)时按交来的那一份判(KL-182);退役名表是本包构建时对过账的一份,引擎扩表后新加的名字在本包跟进前撤不掉(撤销动词答 `nothing_to_remove`)(KL-183);老引擎上一份记录同时在 `toolDeny` 与 `toolAllow` 里有坏行时,整份写被判放宽而拒,白名单那几条也一起没撤(KL-184);写口直接拒收这两类名字的 400 尚无专码,到货前落在收紧结局的 `request_rejected`(KL-185);出路句说不出是哪一层、也不点名谁能删(KL-186)。
|
|
290
|
+
- plan-review 注入形的决断腿时限 = 宿主那只 client 的 `timeoutMs`(sdk 缺省 60 s),本包改不了(sdk 的逐请求选项只有取消信号):短于 6 h 的 client,分钟级的续跑会落 `unconfirmed`「已送出、时限内没有答复」;注入 client 的读重试在退避睡眠期间不看取消信号,本包的截止落定之后它仍可能再睡一轮(至多 60 s)才收手 —— 给注入 client `timeoutMs` ≥ 6 h 与 `maxRetries: 0` 即无这两形(KL-191)。子代族动词在中继部署下仍只吃已装目标(接入文档 §7 P-28 余半场)。
|
|
291
|
+
- 拒绝清单上的 `tool_input`(0.73.4 起在 CC 数组里的条目与本版新收的脱敏条目同样)取自 `tool_start` 帧 —— 那是调用**开始时**的入参,先于 hook / 策略在判定前的改写;被拒的是改写后的最终入参,两者可以不同。上游在被拒调用的收口帧上带出最终入参之后改读它(KL-175)。「入参被传输层动过」今天仍按字面记号认:上游没有记录级的机读「已脱敏」位;入参里本来就含记号字面的调用会被多盖标记(KL-11,本版改写)。
|
|
292
|
+
- 凭据读法:地址形的值左邻只有完整转义序列(着色等)、没有不可见单字时,照旧按地址豁免,与真空白同答(KL-180);点形单行载体上,空主机 userinfo 前面隔着换行 / 制表符的上一个词不再随用户名一起遮 —— 上一版那一形是把换行画成点之后的副作用,本版与有主机形两版同答(KL-181)。另两形既有、本版不修:用户名与 `:` 之间紧贴 C1 引导符 U+009B 时机读口与转义形露口令、点形遮住(KL-192);无 scheme 的 userinfo 左界不在 `"` 处断开,主机在场时会把 JSON 键或引号值的开引号吞进记号,引号里空白之后的尾巴原样上屏(KL-193)。
|
|
293
|
+
- 九套(23 处)终帧夹具仍是扁平形、未注:`run-cost-reconcile-projection-test.mjs` 8 / `run-assistant-arm-identity-test.mjs` 4 / `run-subagent-usage-projection-test.mjs` 3 / `run-cost-absence-projection-test.mjs` 2 / `run-tool-roster-projection-test.mjs` 2 / `run-lane-proof-identity-test.mjs` 1 / `run-selfheal-reopen-test.mjs` 1 / `run-subagent-durable-divert-test.mjs` 1 / `run-terminal-facts-projection-test.mjs` 1。它们的终帧只是流的终止符,或只断两臂共有的量(成本、用量、名册、车道证明、子代分表),结论与终态读法无关;由棘轮封顶、只许减少(KL-187)。
|
|
294
|
+
- 棘轮只管一格总数:同一批里删掉一处未注扁平帧、别处新增一处,总数不变 ⇒ 绿。注是声明不是证明,门不判注了「回放面」的帧是不是真的回放面;追不到对象字面量的形(调用返回值、成员读)打印但不计(KL-188)。三处格对「表外终态词」夹具负控不响(那几格只分成功 / 非成功或与终态无关,认不出的终态词按设计落错误信封)(KL-190)。
|
|
295
|
+
- 权威信封标签对账读的是开发依赖引擎包的模块内部值:端连的引擎新于本包对账的那一版、且新版加了权威标签时,新标签在本包跟进之前不被拆火(对账门在抬开发依赖当天红)(KL-189)。
|
|
296
|
+
- 上一版登记的「开标签文法不上公面、按开标签切块的端仍需自持文法」一条本版销(定位口上公面;KL-135);「孤代理项与格式字符同处置之后两形露出」一条本版销(凭据读法收口;残余见 KL-180 / KL-181;KL-143)。
|
|
297
|
+
- 完整台账见接入文档 §108 末行「包侧缺口」。
|
|
298
|
+
|
|
52
299
|
## 0.84.0(2026-09-27)
|
|
53
300
|
|
|
54
301
|
> 主题:🔴 **minor** —— peer sdk 地板 `>=11.3.0` → `>=12.0.1`,同版四件 additive 与一批陈旧逻辑清扫。① 后台代理**登记读数**(缺席行的下半场):读口 + 取代判定 + 归类口 + 登记键桥 + 补行谓词,宿主终于有真读数可以填进缺席行回收入参的 `registry` 位;② 读目录授权两枚**结论通告**的事实读口;③ 接线回执 **`hands` 段**(引擎对「这条腿有没有挂上它自带的文件 / shell 工具」的正面声明);④ 审批词表与云控制面子路径**追平 sdk 12**(读法零改);⑤ **清扫**:退役键 `rewind.rewindFiles` 构造期拒收(专句点名去处)、`WorkflowRunState.agentCount` 改可选、26 个内部件退出包根、九张公面判定表换成只读的 Set 子类、包内判定用的十五张数组运行期冻结、`resume_at` 文本兼容腿退役。根公面运行期导出 1278 → 1260(+8 −26);公面类型 +10;超集键 +1 `_sema_hands`;开发依赖引擎 `~7.33.1` 不变。🔴 换钉前先读下面 BREAKING 五条(终端有一处编译期会红:`agentCount` 改可选)。
|