@sema-agent/client-core 0.67.1 → 0.68.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 +211 -0
- package/README.md +67 -3
- package/dist/adapt/arms.js +27 -2
- package/dist/adapt/turnFlags.d.ts +14 -0
- package/dist/adapt/turnFlags.js +4 -1
- package/dist/adapter/activeRunSelfHeal.d.ts +53 -6
- package/dist/adapter/activeRunSelfHeal.js +79 -8
- package/dist/adapter/downstream/eventToSdkMessage.d.ts +18 -1
- package/dist/adapter/downstream/eventToSdkMessage.js +33 -2
- package/dist/adapter/downstream/terminalToSdkResult.d.ts +75 -6
- package/dist/adapter/downstream/terminalToSdkResult.js +144 -44
- package/dist/adapter/runStream.d.ts +22 -2
- package/dist/adapter/runStream.js +190 -52
- package/dist/adapter/types.d.ts +4 -28
- package/dist/autoModeUnavailable.d.ts +17 -9
- package/dist/autoModeUnavailable.js +26 -8
- package/dist/classifierStatus.d.ts +32 -4
- package/dist/classifierStatus.js +5 -3
- package/dist/engineErrorCodes.d.ts +52 -0
- package/dist/engineErrorCodes.js +117 -0
- package/dist/engineNoticeCodes.d.ts +95 -1
- package/dist/engineNoticeCodes.js +124 -1
- package/dist/gateVocabulary.d.ts +18 -7
- package/dist/gateVocabulary.js +21 -8
- package/dist/hitl/parkResolver.d.ts +0 -14
- package/dist/hitl/parkResolver.js +22 -9
- package/dist/hitl/toolApprovalWire.d.ts +2 -1
- package/dist/hitl/toolApprovalWire.js +1 -0
- package/dist/ownKey.d.ts +34 -0
- package/dist/ownKey.js +36 -0
- package/dist/retryStatus.d.ts +13 -2
- package/dist/retryStatus.js +4 -1
- package/dist/runTerminal.d.ts +87 -14
- package/dist/runTerminal.js +89 -15
- package/dist/toolResult.js +8 -0
- package/dist/workflowClient.d.ts +22 -0
- package/dist/workflowClient.js +37 -0
- package/docs/INTEGRATION-CLIENTS.md +469 -10
- package/package.json +2 -2
|
@@ -19,11 +19,11 @@
|
|
|
19
19
|
|
|
20
20
|
| 项 | 值 | 真源 |
|
|
21
21
|
|---|---|---|
|
|
22
|
-
| 本包 | `@sema-agent/client-core` **0.
|
|
22
|
+
| 本包 | `@sema-agent/client-core` **0.68.0**(本批发布版 = 🔴 **BREAKING** minor:内容批 4e98884(车 S),core 7.16.0 → **7.17.1** 提货:`turn_end.usage` 缺席臂退役(违约响亮留痕 + 整帧不投影 + 下界位,占位零判据贯穿五处)/ 终态词两表分源 `TERMINAL_CAUSE_KINDS` + `RUN_TERMINAL_STATUSES`(旧名无别名删)/ `ask_unresolvable.cause`、`durable_gate_unavailable.source` 读器 / `readWorkflowParks` 三键 + park 四拒码 / `heldBy`·`cancelRequested` 三态 / L-244·L-245·L-246 包侧半场;引擎地板 core ≥7.17.0;详见 §33(母本 §33z 逐键处置表);`CHANGELOG.md` `## 0.68.0(2026-09-13)`;0.67.2 patch = 上一版)| `package.json` `version` |
|
|
23
23
|
| peer:wire 契约 | `@sema-agent/sdk` **>=8.4.0**(value-level,非 type-only;**0.60.0 抬版**,四条硬理由见 §24a 与 `scripts/run-sdk-floor-test.mjs` 的 `FLOOR` 注;上一次是 0.59.0 的 `>=8.3.0`)。🔴 支持窗同批收到 **engine ≥7.64.0**:sdk 8.4.0 与 7.63.0 及以前的 wire **不同窗** | `package.json` `peerDependencies` |
|
|
24
24
|
| peer:会话词汇表 | `@sema-agent/agent-types` **>=0.2.0**(type-only,零运行时) | 同上 |
|
|
25
25
|
| runtime dep | `diff` ^9.0.0(**唯一**一条;portability 门按**等值**钉死) | `package.json` `dependencies` |
|
|
26
|
-
| 公开导出面 | **
|
|
26
|
+
| 公开导出面 | **952** 个运行期符号(+ 44 个测试钩;= 0.68.0 未发布版的值 = 相对 0.67.2 **二十件 additive、🔴 两件删除(BREAKING)**:additive = `TERMINAL_CAUSE_KINDS`/`isTerminalCauseKind`/`RUN_TERMINAL_NOT_SUCCESS_STATUSES`/`RUN_TERMINAL_STATUSES`(L-247 终态词两表分源,详见 §33b)/ `SEMA_SUBAGENT_USAGE_PARTIAL_KEY`/`subagentUsageIsPartial`(L-244 子代下界位自有名,§33g)/ `ASK_UNRESOLVABLE_CAUSES`/`readAskUnresolvable`/`DURABLE_MANDATE_SOURCES`/`readDurableGateUnavailable`(core 7.17.0 #709 ①② 两只通告事实窄读器,§33c)/ `WORKFLOW_PARK_TRUTH_UNREADABLE`/`WORKFLOW_PARK_NOT_PENDING`/`WORKFLOW_PARK_BINDING_BROKEN`/`WORKFLOW_PARK_REQUIRES_RUN_STORE`/`WORKFLOW_PARK_REFUSAL_CODES`/`isWorkflowParkRefusalCode`/`readWorkflowParks`(core 7.17.0 #652 park 真相四码 + parks 三键读器,§33d)/ `ENGINE_STOP_REASONS`/`engineStopReasonToCc`(L-246 A13 停止原词映射下沉,§33g)/ `readCancelRequested`(L-230 读面,§33f);🔴 **删除两件** `TERMINAL_NOT_SUCCESS_STATUSES`/`TERMINAL_STATUSES`(随 L-247 两表分源更名成 `RUN_TERMINAL_*`,clean-cut **不留别名** —— 留一个别名等于让端可以继续按合起来的那张表读,分源就白做了,详见 §33b)。`0.67.0` 是 **934**,那批是相对 0.66.0 **七件 additive、🔴 两件删除**:additive = `CLASSIFIER_DENY_CAUSES`/`isClassifierDenyCause`/`classifierDenyCauseOf`/`classifierDenyCauseDetail`(core 7.14.0 退役 `classifierUnavailable` 之后的**拒绝面**继任读器与措辞,详见 §32b)/ `RULE_STORE_UNREADABLE_KINDS`/`isRuleStoreUnreadableKind`/`ruleStoreUnreadableDetail`(core 7.14.0 #688 C3 的规则店机制位三件,详见 §32d);🔴 **删除两件** `classifierUnavailableOf`/`classifierUnavailableDetail`(随 core 7.14.0 的 Retired keys 表整族退役,clean-cut 不留别名,详见 §32b;同批删的还有**型** `ClassifierUnavailableView`、卡位与帧位 `classifierUnavailable`、以及一条恒真的型面钉 `_askOriginWordsPin`)。`0.66.0` 是 **929**,那批是一件 additive、零删除:`readRunCostFacts`(终局成本事实的唯一读器:`costBreakdown` / `nested` 窄读 + 对账三段与两个判别位,终帧超集键与 chrome 对账臂共用它;详见 §31c);已发的 **0.65.x 十一件 additive、两件删除**:additive = `DECIDE_WORKFLOW_HOST_UNKNOWN`/`DECIDE_WORKFLOW_HOST_NOT_PARKED`/`DECIDE_WORKFLOW_REMEMBER_UNSUPPORTED`/`DECIDE_WORKFLOW_LANE_CODES`/`readDecideReceipt`/`decideAcceptedNotResolved`/`decideRefusalFromError`(B-070 `/decide` 回执读面与三码人话,详见 §30h)/ `TERMINAL_NOT_SUCCESS_STATUSES`/`isTerminalNotSuccess`/`TERMINAL_STATUSES`/`isTerminalStatus`(L-215② 终局词汇单铸谓词,详见 §30j);🔴 **删除两件** `AUTO_MODE_BREAKER_CAUSES`/`classifierBreakerOf`(熔断族随 core 7.12.0 的 Removed(BREAKING) 整只退役,clean-cut 不留别名,详见 §30k②;同批删的还有**型** `ClassifierBreakerView` 与 `ClassifierStatusView.breaker` 一位)。`0.64.2` 是 **919**,那批是一件 additive、零删除:`readDenialLimitFallback`(限额回落卡的窄读器上公面,壳侧同判据副本退役,详见 §29③);`0.64.0` 是 **918**,那批是件①+件② 十三件 additive、零删除:`CLASSIFIER_STATUS_STATES`/`classifierBreakerOf`/`classifierStatusOf`/`classifierStatusDetail`(分类器状态面,详见 §28②)/ `THINKING_FORMATS`/`THINKING_FORMAT_WIRE_TWINS`/`THINKING_DISABLE_PROBE_ORDER`/`MODEL_PROBE_VERDICTS`/`PROBE_PROMPT`/`PROBE_MAX_TOKENS`/`probeRequestBody`/`probeModelCapability`/`applyProbeToEntry`(模型思考能力探测,详见 §28①);`0.63.0` 是 **905**,那批是八件 additive、零删除:`projectServerGateKnobs`/`postureKnobSourceOf`/`postureSourceIsOperatorPinned`/`postureKnobDetail`/`POSTURE_SOURCE_WORDS`(S-178 三根 posture 旋钮读数,详见 §27b)/ `PERSISTED_RULE_BEHAVIORS`/`PERSISTED_RULE_BEHAVIOR_UNKNOWN`/`persistedRuleBehaviorOf`/`persistedRuleBehaviorLabel`/`revokeTargetFromPersistedRule`(三态规则身份,§27c)/ `engineIdentityOf`/`engineIdentityVerdict`/`engineIdentityChanged`/`engineIdentityChangedBy`/`ENGINE_IDENTITY_ANCHORS`(S-179 代际锚,§27d)/ `GATE_DENIED_BY_WORDS`/`gateDeniedByDetail`/`ASK_ORIGIN_WORDS`/`askOriginDetail`(门词汇 +2,§27e)/ `PERMISSION_RULE_ISSUE_CODES`/`RETIRED_PERMISSION_RULE_ISSUE_CODES`/`permissionRuleIssueDetail`(规则 lint 码表,§27f)/ `projectToolRoster`/`toolRosterNames`/`toolShimFromRoster`/`applyToolRosterDelta`(L-161 工具名册,§27g)/ `ENGINE_NOTICE_CODES`/`ENGINE_NOTICE_AUDIENCE`/`noticeAudienceOf`/`engineNoticeInCatalog`/`MCP_INJECTION_DROP_REASONS`/`readMcpInjectionDrop`(L-167 通告码册,§27h)/ `AUTO_MODE_UNAVAILABLE_CAUSES`/`AUTO_MODE_BREAKER_CAUSES`/`classifierUnavailableOf`/`classifierUnavailableDetail`(件⑧ 分类器不可用事实,§27h2);`0.62.0` 是 **869**,那批是五件 additive、**零删除**:`capForDisplay`(呈前消毒 + 封长的共用铸点,详见 §26⑦)/ `SEAT_SEND_MESSAGE_KEY_ORIGINS`(座位载荷逐键出身表,详见 §26③)/ `configureSubagentContentStore`+`subagentContentStoreConfig`+`SUBAGENT_CONTENT_STORE_DEFAULTS`(子代内容账本字节预算,测试钩 `__resetSubagentContentStoreConfigForTests` +1,详见 §26②);`0.61.0` 是 **864**,那批是三件 additive、**零删除**:`projectReadFacePosture`/`readFacePostureDetail`/`readFaceDisagreement`(S-167 READ 容纳面 operator 读器,详见 §25);`0.60.0` 是 **861**,那批是二十五件 additive、**零删除**:`readRunTerminal`/`runTerminalCode`/`runTerminalGateKind`/`runTerminalGateToolName`/`isReviewPark`/`REVIEW_PARK_GATE_KINDS` 六件终局因由读器 + `gateOutcomeOf`/`isDeniedGate`/`gateDeniedBy`/`gateApprover`/`isApprovalWindowExpiredGate`/`isDenialLimitAutoDeniedGate`/`isParkSlaExpiredGate`/`isHumanSettledGate` 八件门记录读器 + `projectWriteProtectionCapability`/`noteEngineCapsForWriteProtection`/`observedWriteProtection`/`forgetWriteProtectionReading`/`writeProtectionDoctorDetail`/`projectWriteProtectionPosture`/`writeProtectionPostureDetail` 七件写保护读面(测试钩 `__resetWriteProtectionReadingsForTests` +1)+ `readWireErrorCode` + 真机边界①的两件 `isGateParkedToolEnd`/`GATE_PARKED_ERROR_CODE` + 异源复审逼出的 `engineCapsGeneration`;`0.59.0` 是 **836**,那批是八件 additive:`RULE_OFFERS_ABSENCE_REASONS`/`DENIAL_LIMIT_KINDS` 两张闭词表再导出 + `engineCapValue` 能力位四态通用读口 + `projectSqlEngineCapability`/`observedSqlEngine`/`noteEngineCapsForSqlEngine`/`forgetSqlEngineReading`/`sqlEngineDoctorDetail` 五件 SQL 姿态读面(测试钩 `__resetSqlEngineReadingsForTests` +1);`0.58.0` 是 **828**,那批是三件 additive:`RULE_OFFER_MATCHES`/`RULE_OFFER_BATCH_MEMBER_KINDS`/`RULE_OFFER_UNCOVERED_REASONS` 三张闭词表再导出 + `RESUME_REFUSAL_CODES`/`RESUME_PLACEMENT_MISMATCH`/`resumeRefusalFromError`/`resumeRefusalContent` 四件文案铸点;`0.57.0` 是 **821**;`0.56.0`/`0.55.0` 是 **815**;已发 `0.54.0`(design/385 十件 additive 含 `AUTHORITY_ENVELOPE_TAGS`);`0.52.0` 是 **805**(L-69⑨ 两件);`0.51.0` 是 **803**;`0.50.0` 是 **800**(S-81 五件);`0.49.0` 是 **795**;`0.48.0` 是 **794**;npm `0.47.0` 是 **790**,`0.46.0` 是 **787**,`0.44.0` 是 **783**,`0.43.1`/`0.43.0` 是 **776**,`0.42.0` 是 **771**,`0.41.0` 是 **767**,`0.39.0` 是 **766**,`0.38.0` 是 **764**;`0.37.0` 是 **753**,见 `CHANGELOG.md`) | `scripts/public-export-baseline.json` 的 `count` / `testHookCount` —— **别手抄进别处,以该文件为准** |
|
|
27
27
|
| 常驻门 | 以 `scripts/gates-manifest.json` 的 `suites` 长度为准(**本档不抄这个数**) | `scripts/gates-manifest.json`;`npm test` 的名单等值门与它逐名对账 |
|
|
28
28
|
| 沿革档 | 0.29.0 起建 `CHANGELOG.md`;更早批次记账在 `src/index.ts` 文件头 + `docs/REFACTOR-LEDGER.md` | — |
|
|
29
29
|
|
|
@@ -111,7 +111,7 @@ SDK 核对「本包 import 的每个值级符号仍然导出」「`TaskStats.cos
|
|
|
111
111
|
|
|
112
112
|
## §2 公共导出面地图(按域)
|
|
113
113
|
|
|
114
|
-
> 全集真源 = `scripts/public-export-baseline.json` 的 `names`(**
|
|
114
|
+
> 全集真源 = `scripts/public-export-baseline.json` 的 `names`(**952** 项)。
|
|
115
115
|
> 本节**不逐名抄**,只给「域 → 承重导出 → 用途 → 实现锚」。承重导出 = 一个端为了让这个域干活
|
|
116
116
|
> **必须**直接调到的那几个符号;其余是它们的类型、变体与辅助位。
|
|
117
117
|
> 单一入口:`import { … } from '@sema-agent/client-core'`(`exports` 只有 `.` 一个;
|
|
@@ -135,7 +135,7 @@ SDK 核对「本包 import 的每个值级符号仍然导出」「`TaskStats.cos
|
|
|
135
135
|
`WorkflowsGateUnknownDenial` 四形**不在**基线里,`src/selfOrchestrationDenial.ts` 对基线贡献
|
|
136
136
|
**4** 项运行期导出(三个函数 + `SELF_ORCHESTRATION_RETRY_WITHOUT`)。
|
|
137
137
|
|
|
138
|
-
|
|
138
|
+
952 项的内部构成(帮助端估读表大小):**295** 项是 `SCREAMING_SNAKE` 常量数据表/词汇表
|
|
139
139
|
(矩阵、键集、env 名、锚串)而非可调用物;**5** 项是 PascalCase 运行期值
|
|
140
140
|
(`ControlRouter` / `ControlSafetyError` / `HitlBridge` / `HitlSafetyError` / `DecideTransportRetryExhaustedError`);
|
|
141
141
|
**41** 项是 `*For(sessionKey, …)` 的 per-session 变体(§6;其中 `engineNamespaceKeyFor` 是命名巧合 —— 参数是 baseUrl 不是 sessionKey,见域 14)。
|
|
@@ -144,7 +144,7 @@ SDK 核对「本包 import 的每个值级符号仍然导出」「`TaskStats.cos
|
|
|
144
144
|
|
|
145
145
|
| # | 域 | 名数 | 承重导出 | 用途 | 实现锚 |
|
|
146
146
|
|---|---|---|---|---|---|
|
|
147
|
-
| 1 | **适配内核(下行主链)** |
|
|
147
|
+
| 1 | **适配内核(下行主链)** | 48 | `adapt` · `createWireToCcAdapter` · `runStream` · `eventToSdkMessage` · `terminalToSdkResult` · `readRunCostFacts`(0.66.0:终局成本事实的**唯一读器** —— `TaskStats.costBreakdown` / `nested` 逐键窄读 + 对账三段(own/nested/compaction)与两个「没定价」判别位;终帧的两个超集键与 chrome 臂 `run_cost_reconciled` **共用它**,两面不会各算各的,详见 §31c)· `TERMINAL_CAUSE_KINDS`/`isTerminalCauseKind`(0.68.0 / L-247:**core 终局因由**闭集,四词 `completed|failed|blocked|paused`)· `RUN_TERMINAL_NOT_SUCCESS_STATUSES`/`isTerminalNotSuccess`/`RUN_TERMINAL_STATUSES`/`isTerminalStatus`(L-215② 终局词汇的**单铸谓词**,0.68.0 随 L-247 **两表分源**更名 —— `killed` 属 server run 行状态面、`paused` 属 core 因由面,合成一张会让两边加词时都读不出该改哪儿;`blocked` 是 agent 自报终态,`suspended`/`needs_review` 刻意不在表里,详见 §33b / §30j)· `SEMA_SUBAGENT_USAGE_PARTIAL_KEY`/`subagentUsageIsPartial`(0.68.0 / L-244:子代用量下界位的**自有名**与唯一判据,与终帧 `_sema_usage_lower_bound` 分名,详见 §33g) · `turnUsageToModelUsage` · `isRunStreamActive` · `ADAPTER_DIVERGENCES` · `readRunTerminal` / `runTerminalCode` / `runTerminalGateKind` / `runTerminalGateToolName` / `isReviewPark` / `REVIEW_PARK_GATE_KINDS`(0.60.0 / engine ≥7.64.0:一次 run **怎么结束的**唯一读器 —— 终局从八个平面键换成一条带标因由 `terminal`,四臂 + `unknown` 防御臂 + `plane` 两代字节标;🔴 不认识的终态词绝不折成成功、本包不提供「因由→五词 status」的兼容投影,详见 §24b)| 引擎 SSE `AgentEvent` → 端要渲的**双面输出**:transcript(`SDKMessage`)+ chrome(瞬态 `ChromeEvent`)。**本包存在的理由** | `src/adapt.ts`、`src/adapt/{arms,wireShapes,panelTasks}.ts`(经 `adapt.ts` 再导出)、`src/adapter/runStream.ts`、`src/adapter/downstream/*`、`src/adapter/types.ts`、`src/runTerminal.ts` |
|
|
148
148
|
| 2 | **seam 公共契约** | 2(其余为 type-only) | `CHROME_ARMS` · `deriveTranscriptId` | 公共词汇 + **id 确定性不变量**(同一条流重放 ⇒ 同一串 id)。`CHROME_ARMS` = 端「我要消费哪些 chrome 臂」的对照清单 | `src/seam.ts` |
|
|
149
149
|
| 3 | **HITL 决断卡链**(§4/§5 主战场) | 167 | `makeHitlCanUseTool` · `HitlBridge` · `findPendingForTask` · `readDecideReceipt`/`decideAcceptedNotResolved`/`decideRefusalFromError`(B-070:`/decide` 200 = **投递受理**不是「门已解决」;`executionOutcome` 缺席 = 未知,详见 §30h) · `HitlSafetyError` · `bridgeAskUserQuestionGates` · `surfaceToolApprovalFrameAndRespond` / `surfaceFsApprovalAndDecide` · `readToolApprovalRespondAck` · `installApprovalCardPort(For)` · `installHitlHostSurface(For)` · `armPlanReviewApproval` · `reopenPlanReviewCard` · `decidePlanReview` · `startApprovalsFeed` · `pendingRowIsOwnedByThisSession` · `approvalCallKey`/`liveFrameCallKey`/`planReviewQuestionId` · `registerArmedGateFor`/`wasGateArmedFor`/`clearArmedGateFor` · `waitForGateArmed(For)`/`onGateArmed(For)`/`gateArmedWaitMs`(#244 F1 呈现回执事件源) · `planReviewArmedKey(For)`/`notePlanReviewAnswered(For)`/`notePlanReviewAnsweredIfDecisive(For)`(A-024.4 plan 呈现分代) · `toolEndOutputText` · `isAskTool` · `waitForParkRowBirth` · `classifyAskParkRows` / `askParkRowArm` / `classifyAskParkChainFailure` · `readDecisionNoteAudit` / `decisionNoteAuditLine` · `resumeRunningOptions` / `resumeChoiceFromLabels` · `persistedRulesLaneAvailable`/`persistedRulesGovernanceAvailable` · `classifyRulesFailure` · `listAllPersistedRules` · `classifySkippedReason` · `readRulePersistOutcome`(#244 F2:persist-ack 读口与 `readToolApprovalRespondAck` 合成一处) · `parseLocalAllowRule`(durable 腿本地落规则窄化骨架,谓词经 `LocalAllowRuleDeps` 注入) · `readToolApprovalRespondRefusal`(#225 件5,0.42.0:respond 抛错的结构化原文读口 —— 三位各自防御读、各自缺席不铸、**三位皆缺席时整只返 `undefined`**;原样交还零加工,UNTRUSTED-for-display)· `installEditedRuleTextPrechecker` / `hasEditedRuleTextPrechecker` / `precheckEditedRuleText`([5076] 转出口,0.42.0:core 5.57.0 `precheckEditedRuleText` 的**端口注入形** —— 类型面 + 注入口 + 诚实缺席读口。🔴 **不是** value 级 re-export,理由见 §7 缺口 **P-34**;未装 ⇒ 返 `undefined`,绝不编一个 `{ok:true}`)· `surfaceRuleArmNotSent` / `RULE_NOT_SENT_WARN_TEXT` + `surfaceRuleArmRejected` / `RULE_NOT_SENT_REJECTED_WARN_TEXT`(#334,0.43.0:人在卡上按下的「不再询问」被整条丢弃时的诚实告知——**两条刻意分开**:前者=**引擎能力位未确认**(换台引擎/等探测就好),后者=**这次选择没过包内表核/互斥核**(表外文本/坏下标/两臂同场,换引擎也不会变) —— 编辑臂 `respondFreeFormRules` 与批臂 `respondBatchRuleOffers` 两条同形存量共用一条,与 `surfaceRememberNotApplied` 同族纪律:决断照送、只是规则没存,静默丢掉用户明确意图 = 让人以为功能坏了)· `projectCrashConverged`(L-38,0.49.0:`/v1/approvals` additive 键 `crashConverged` 的分桶投影 —— 崩溃收敛的孤儿审批读面,**缺席 ≠ 空数组**、分桶恰一个合取、坏行丢弃并计数,详见 §12;同批把 `ApprovalsResourceLike.list()` 的返回位 additive 放宽成 `ApprovalsListEnvelope`,老形 `{pending}` 仍可赋值)· `readRuleOffers` / `readRuleOfferSupply`(L-103/[C228],0.57.0 additive 导出:「不再询问」候选两代 wire 键的窄读器**公面化** —— 此前只经卡端口出包,不走卡端口架构的宿主只能自己重铸一把,而它承载的是兑付安全判据(原始下标不前移/逐条丢坏/闭集 kind/两代取舍序),详见 §20)· `RULE_OFFERS_ABSENCE_REASONS` / `DENIAL_LIMIT_KINDS`(0.59.0 / sdk 8.3.0 提货:`ruleOffersAbsence` 三词与 `denialLimitFallback.limit` 二词的**运行期**闭词表再导出 —— 与 0.58.0 那三张同一条纪律:端拿它做判定别再手抄字面量。⚠️ **本包自己不拿这两张表做窄读判定**(两处都按开集透传,词表属主是 core、server 已按闭集拒过),再导出只是给端的 `switch` 一份可数的表,端仍必须带 `default` 臂,详见 §23a)· `DecideTransportRetryExhaustedError`(Inkglow-1085 P0a:decide 出站瞬断重试耗尽的 typed 判别 —— HitlBridge 内建单次退避重试,耗尽走重呈臂不判死 turn;端一般只消费行为,不需要 instanceof) · `gateOutcomeOf` / `isDeniedGate` / `gateDeniedBy` / `gateApprover` / `isApprovalWindowExpiredGate` / `isDenialLimitAutoDeniedGate` / `isParkSlaExpiredGate` / `isHumanSettledGate`(0.60.0 / engine ≥7.64.0:`tool_end.gate` 整条门记录的窄读器 + 判定谓词 —— 取代退役的四个正交词 `settledBy`/`resolution`/`autoDenied`/`approver`。🔴 **判定归包**:「是不是审批窗自己走完的拒绝」旧形上是端各自拼的两键合取,而三条窗词现在分得开、合并读回去等于把刚修好的判别力扔掉;⚠️ 公面型一律带 `View` 后缀 —— 本文件的 `GateOutcome`(决断腿结局)与 sdk 的 `GateOutcome`(引擎门记录)**同名不同义**,详见 §24c)· `isGateParkedToolEnd`(「这次调用没在这里结算」的**第二形**谓词:gate 缺席 + `errorCode:"gate.parked"`;端判这件事必须与 `isApprovalWindowExpiredGate` **两形合读**) · `readWireErrorCode`(B-037 候包件②:decide/取件失败上引擎 wire 机器码的单源读口,结构视图读不 `instanceof`;与本包铸的 `code` 是两个命名空间,详见 §24g)| suspended→decide→resume 环。🔴 **D-1 两元组 verbatim 回显**是字节级断言的安全不变量,端**不许重实现它的任何一段**。🔴 键空间边界(web [C1] d3 拦截):`gateIdentity` 四常量两函数只覆盖 HITL questionId/callKey 空间;seat 的 `TOOL_PERMISSION_REQUEST_ID_DOMAINS`(`plan:` 等)是另一键空间,**两者绝不合并**(合并=座位校验器静默拒全部 plan-review 卡) | `src/hitl/hitlBridge.ts`、`toolApprovalWire.ts`、`askGateWire.ts`、`planReviewWire.ts`、`hitlHostSurface.ts`、`gateIdentity.ts`、`armedGateRegistry.ts`、`parkOwnership.ts`、`parkResolver.ts`、`approvalsFeed.ts`、`frameRouter.ts`(**只挑名导出** `toolEndOutputText`/`ENGINE_ABORT_TOOL_RESULT`/`isAskTool`/`HITL_REJECT_MESSAGE`/`HITL_INTERRUPT_MESSAGE_FOR_TOOL_USE`)、`parkRowBirthWait.ts`、`approvalDecisionNoteAudit.ts`、`askParkRowRouting.ts`、`resumeRunningCard.ts`(#265 上收的判定层)、`persistedRulesWire.ts`、`localAllowRule.ts`(#244 F2 规则侧)、`crashConverged.ts`(L-38 崩溃收敛读面)、`src/gateOutcome.ts` |
|
|
150
150
|
| 4 | **子代 wire + 面板侧信道台账** | 87 | `tailEngineSubagent` · `installSubagentActivitySink` · `installSubagentTailMetaSink`(#280 件2:tail meta 帧发布口,`contentFrames` 判别位载体)· `stopEngineTask` + `classifyTaskStopConflict` · `fetchEngineSubagentReport` · `steerEngineSubagent`(0.32.0 未发布 #280 件A:additive 第三参 `childTaskId` —— 端有行上下文时**应当**传,传了就走「台账优先 / 缺席即诚实缺席 + `noteBgOwnerAbsence` 留痕」的 Q3 口径,与 tail·taskOutput·subagentOutput 三腿同姿势、与孪生 resume 腿共用同一个 `resolveOwnerRunId` 判据;**不传**则逐字维持旧行为=回落在飞 run)· `resumeSettledSubagent` + `resolveSubagentResumeContext` + `resolveOwnerRunId` + `classifySubagentResumeFailure` + `subagentResumeAvailable`(#242 批 2 A-028.7:resume 判定半场上收,与 steer 孪生同居;取址三态 = 台账有行用行值 / 指名了行但台账缺席则**诚实缺席绝不回落在飞 run** / 没指名行才回落。出路文案归端)· `recordSubagentOwnerFromProgress` + `getBgParentRunOwner`(A-028.6:「子代 → 宿主 run」**单表**,宿主 run 必须由持 stream-local 值的调用方显式传入,包内绝不从 `activeEngineRunId()` 推断)· `noteBgOwnerAbsence`(#242 批 3 [4000] Q3=B:tail/taskOutput·taskStop/subagentOutput 三腿台账缺席即诚实缺席**绝不回落在飞 run**,缺席 warn 留痕每 (腿,taskId) 一条)· `clearBgTerminalFacts`(#242 批 3 扫码修:复活=新周期,旧周期终态事实作废——fleetLedger 复活两腿按尾段清账,factsAccepted 方向核不再拿上周期终态当先例)· `auditRetainWithoutWake`([4000] Q5:引擎宣示 `subagentResume` + 本端在付 `retainSubagentSessions` + 端未实现 `wakeSubagent` ⇒ 响亮一条;`CLIENT_VERBS.wakeSubagent` 维持 fail-soft)· `subscribeSubagentContent` · `subscribeEngineAgentPanel` · `publishQuestionFrame` / `respondToQuestion` · `configureSubagentContentStore` / `subagentContentStoreConfig` / `SUBAGENT_CONTENT_STORE_DEFAULTS`(0.62.0:子代内容账本的**字节预算** —— 此前只有条数帽而单条无上限,一条 base64 工具结果就能让一个子代槽吃到十几 MB;越限从最早的内容开始丢并留一条可渲染的 `truncated` 记录,总帽淘汰整条最久未用的账本。配置面 fail-loud,详见 §26②)| 驱动与观测委派子代;经 module 级台账喂活体 agent/task 面板。全部**能力位 gate**(§5b) | `src/subagent/*.ts`、`src/subagentContentStore.ts`、`src/engineAgentPanelStore.ts`、`src/engineInlineTaskStats.ts`、`src/engineToolLabelStore.ts`、`src/liveQuestionStore.ts` |
|
|
@@ -155,11 +155,11 @@ SDK 核对「本包 import 的每个值级符号仍然导出」「`TaskStats.cos
|
|
|
155
155
|
| 9 | **能力/旋钮 wire 门族** | 96 | `projectAgentsForWire` / `awaitTaskAgentsWire` · `hooksForWire` · `mcpConfigsToSpecs` · `ultracodeForRequest` · `resolveWebSearch` + `buildWebSearchEnv` · `attachmentsForRequest` · `projectEffectiveBody` · `classifySelfOrchestrationRefusal` / `stripSelfOrchestrationIntent` / `projectWorkflowsGate` / `SELF_ORCHESTRATION_RETRY_WITHOUT`(S-81,server 7.57.0:上面两条 stamp 腿的**背面** —— 半配置多租户形态下 server 把带 `selfOrchestration` / `settings.ultracode` 的提交 501 拒掉,判型/去键/caps 闸三处都是判定不是文案,详见 §13) · `engineCapsGeneration`(0.60.0,异源对抗复审 [medium] 逼出:caps 探测的**当代号**读口 —— 代际闸在 probe **返回之后**才跑,而宿主的读面 tee 是在 probe **内部**落地的 ⇒ 一次慢的旧探测能把上一台引擎的读数写回来。宿主在**起探测那一刻**抓号、tee 时交回 `{generation}`,陈旧那一发整只丢掉;不传 = 逐字节同行为,详见 §24e)| 逐功能的「引擎有没有这个能力 + 这个字段怎么上 wire」投影器,由 `buildTaskRequest` 组装。🔴 `hooksForWire()` 是 **fail-closed**:无 `SettingsPort` ⇒ 返回 `undefined`(信任门,不是取值) | 17 个 `src/*WireCaps.ts` + `src/scratchpadWireCaps.ts`、`src/hooksWireCaps.ts`、`src/goalStopHook.ts`、`src/websearch/searchProviderPresets.ts`、`src/selfOrchestrationDenial.ts`(S-81 拒绝判定层) |
|
|
156
156
|
| 10 | **headless / 部署旋钮 wire** | 61 | `parseSandboxArgv` / `sandboxRequestFields` · `parseLimitsArgv` / `limitsForPrint` · `resolveHeadlessFinalVerify` · `resolveHeadlessPermissionMode` · `resolveHeadlessInteractiveTools` · `armDetachCancel` + `detachCancelArm` + `isDetachArmed` · `withHeadlessR1Reconnect` | `-p`/headless 车道的 env+argv 旋钮。🔴 `detachWire` 是**拆**的补偿:判定与 cancel-arm 台账在库,信号路径的裸 fetch 留宿主(`detachCancelArm()` 是取件口) | `src/sandboxWire.ts`、`scenarioWire.ts`、`finalVerifyWire.ts`、`limitsWire.ts`、`interactiveToolsWire.ts`、`headlessPermissionModeWire.ts`、`headlessReconnectWire.ts`、`detachWire.ts` |
|
|
157
157
|
| 11 | **模型目录与预算** | 76 | `resolveModelCatalog` · `loadCatalogWithSources` · `PROVIDER_PRESETS` / `MODEL_FAMILIES` · `defaultMaxTokensFor` · `getLiveModelCatalog` / `setLiveModelCatalogRefresher` · `providerAuthMethods` / `beginDeviceCodeAuth` · `providerCatalogRows` / `providerCatalogRowDetail` / `providerPresetById`(#244 F4 族D A-028.17:46 家表的规范折表层 —— 全表不重排、诚实缺席「model id typed in」,cli 目录/web 向导同一份折表)· `TIER_ORDER` / `CC_TIER_ALIASES` / `isTier` / `resolveTierBinding`(A-028.18:档位词表+校验+fail-open 降档派生单源;settings 存储归宿主)· `resolveEntryVision` / `computeDeleteBlockers` / `computeDeleteWarnings`(0.38.0 #318 件③ 上收:Model Hub 供给面的三端公共判定 —— vision 生效值+来源三态、删除断链核(拒删+指路)、删除降级后果(照删但必说)。**零 IO**,读盘那半场留各端;`doc === null` 的两义在调用方分流) | 三层 provider 目录解析(线上 URL → 包内预设 → 用户覆盖)+ per-model `maxTokens` 封顶。线上腿需注入 `CatalogFetchJson`,缺席 ⇒ 整条不启用(`online.reason='no-fetch-port'`);缓存落盘经 `CatalogCachePort` | `src/model/{catalog,catalogLoader,providerAuth,providerPresets,providerCatalog,tierVocabulary}.ts`、`src/liveModelCatalog.ts`、`src/modelBudgetRule.ts`、`src/sessionModelLatch.ts`、`src/effortWire.ts` |
|
|
158
|
-
| 12 | **workflow 与后台工作视图** |
|
|
158
|
+
| 12 | **workflow 与后台工作视图** | 20 | `projectWorkflowRun` · `createLiveWorkflowSource` · `ensureWorkflowActivityLedger` · `readWorkflowActivityLedger` · `stopWorkflowActivityLedger` · `resetWorkflowActivityLedgers` · `createBackgroundView` · `projectBackgroundView` · `recordWorkflowAgentTaskId` · `agentDisplayStatus` | 活过一个 turn 的长任务读面:workflow run + 跨 session 后台任务归一表(`assistant.tasks` 与 fleet SSE **两源独立降级**) | `src/workflow.ts`、`src/workflowClient.ts`、`src/workflowMonitor.ts`、`src/agentSession/backgroundView.ts`(+ 纯类型 `src/agentSession/contract.ts`) |
|
|
159
159
|
| 13 | **座位 IPC 契约** | 34 | `LOCAL_SESSIONS_SPEC` · `SEAT_METHOD_NAMES` · `SEAT_EVENT_TYPES` · `isLocalSessionEvent` · `isToolPermissionRequest` · `toolPermissionRequestId` · `SEAT_VALIDATOR_KEY_COVERAGE` · `SEAT_SEND_MESSAGE_KEY_ORIGINS`(0.62.0:座位载荷**逐键出身**登记 —— 每个位要么写明转投哪个引擎请求位、要么写明为什么不上 wire;常驻门对**装在盘上的** sdk 型面逐名核,详见 §26③)| desktop↔web 座位 IPC 契约的**单一真源**(此前两边各一份、名字零重合 ⇒ 编译器永远不会告诉你它们漂了)。🔴 加 verb 忘了加 `LOCAL_SESSIONS_SPEC` **不报错**:preload 不注册 channel、渲染端读到 `undefined` | `src/seatContract.ts`(**零 import**,纯类型 + 常量 + 纯谓词)。🔴 **证据等级标注(0.42.0,test [5087] 的「语料**种类**缺口」/ cli [5088] 认领件)**:该文件里所有以「CC 如何如何」为形的断言(`212 methods` / `854-channel census` / 方法名逐字保留 / `fQe` 逐字段对照 / 一切 `.vite/build/index.chunk-*.js` 坐标)**证据等级 = 桌面 unpack,本地语料库不可复验** —— 本仓手边可复验的参照语料**只覆盖终端 CLI 形态**的静态产物,拿它去 grep 桌面壳里的符号只会零命中,而零命中在这里**既不证真也不证伪**。复核这些断言**不得**拿本仓语料当反证 |
|
|
160
160
|
| 14 | **宿主端口与会话槽** | 26 | `installHost` · `installHostFor` · `hostPortMisses(For)` · `DEFAULT_SESSION_KEY` · `hostEnv` · `unrefTimer` · `parseLocaleTag` / `pickUiLanguage`(#244 F4 族D A-028.20:locale tag 手术单源 + UI 语言判定;与 `resolveRegionHint` 双出口成文 —— 语言偏好域 en/zh ≠ 地址可达域 cn/intl/unknown,`zh-Hant` 前者 zh 后者 intl 是设计)· `engineNamespaceKeyFor` / `mergeSessionMapRecord` / `mergeEngineEntry`(A-028.12:会话 id 映射单一键形 + merge 判定;存储经 `SessionMapStorePort` 归端 —— cli 文件锁/原子写,web localStorage)| 进程/端级装配层(settings/fs/queue/timers/session/log/probe),与 per-turn 的 `AdapterContext` **分层**。头注的判定规则:**这个能力每 turn 都会变吗?** 会 ⇒ `ctx`;不会 ⇒ `installHost` | `src/host.ts`、`src/hostEnv.ts`、`src/sessionSlot.ts`、`src/unrefTimer.ts`、`src/env/{localeGeo,localeTag,uiLanguage}.ts`、`src/sessionMap.ts` |
|
|
161
|
-
| 15 | **控制面与传输** |
|
|
162
|
-
| 16 | **引擎词汇表与包自检** |
|
|
161
|
+
| 15 | **控制面与传输** | 114 | `ControlRouter`(+ `ControlSafetyError`)· `makeEngineWireClient` + `resolveWireAuth` · `installEngineWireTarget` · `diagnoseSseIdleTear` / `isSseIdleError` · `attemptActiveRunSelfHeal` + `activeRunBusySignal` + `activeRunSelfHealRow` / `activeRunBusyHeadlessRow` · `kickEngineCapsProbe` / `engineCapTrue` / `invalidateEngineCaps(baseUrl, probe?)`(#307 S25:引擎温切后的 caps 生产失效口 —— kick 自带幂等闸,同 baseUrl 重启后不显式失效就永远读到旧引擎那一版能力位;调用方 = 壳的 respawn/restartEngine。🔴 **推荐两参形**:第二参给替代探测则「推进代际 + 注册新探测」在同一同步块内完成,失效与下一次 kick 之间那个「等待者读到未判」的窗按构造不存在;单参形保留给「只丢缓存、这一刻没有替代探测」的调用方,那种情形下读到未判是诚实结局) · `engineCapValue`(S-131,0.59.0:能力位的**四态**通用读口 `unobserved`/`not_reported`/`null`/`value` —— 既有三口把四种「读不出」全折成 fail-closed 一档,对**放行**问题是对的、对**读面/诊断**问题是错的:`null`(引擎明确说没有,正面事实)会与「老引擎不报」「还没探到」在屏上同形。`value` 位刻意不做形校验,形归各能力位自己的窄读器,详见 §23b)· `projectSqlEngineCapability` / `observedSqlEngine` / `noteEngineCapsForSqlEngine` / `forgetSqlEngineReading` / `sqlEngineDoctorDetail`(S-131,0.59.0:`Capabilities.sql`(server ≥7.60.0)的四态读面**从壳侧上收** —— 归层债,0.58.0 时它长在壳里正是因为包侧没有嵌套对象读口。🔴 **导出名与壳侧那份逐字同名 = drift-lock**;`txnMode: null` 是铸点域内的合法值不是畸形;换代失效口清成未观测而不是留旧值,详见 §23b)· `mapBrainStatusToRetry` · `waitForClaimRelease` + `CLAIM_RELEASED_STATES` / `CLAIM_HELD_STATES` · `atMostOnceFailureClass` / `readSteerDelivery` · `clearRunningChoiceOffer`(Inkglow-1085 P0b①:「Do nothing」登记的清口 —— 端的「重新打开操作菜单」入口;登记在场时 attemptActiveRunSelfHeal 不整卡重弹,not-parked 结局带 `alreadyOffered: true` 判别位,端据此降级渲一行)· `INTERACTIVE_WAY_OUT`(默认出路串单源)· `engineSessionParamFor`(design/285 批 0:`?session=` 派生的 **per-key** 形 —— `hostSessionFor(sessionKey)?.currentSessionId()` + [1501] 空串归一;零参 `engineSessionParam()` = 默认槽兼容层,取值链逐字等价)· `normalizeWirePrincipal`(A-028.10:principal 在场性 trim 原语 —— 全空白=缺席不发头,engineWireTarget 两臂/makeEngineWireClient/壳 livePrincipal 同尺)· `readSessionMemoryStatus` / `classifyMemoryStatusFailure` / `readCaptureOptOut` / `readLastCapture`(S-53 会话记忆姿态读面,0.48.0:失败分诊**码优先**——两个 404 分道 `not_found.session` / `not_found.route`,无码 404 不猜落 failed;五键逐键缺席语义两个合读器,`lastCapture` 三态的判别材料是 `committedCount` 不是本键;IO 归宿主注入 `MemoryStatusClientLike`,详见 §11) · `classifyTurnWireError` / `isWireTransportError` / `isPreStreamDrainingReject` / `isResumeAtRejection` / `drainingRetryDelayMs` / `scenarioDenyFromError` + `WIRE_NETWORK_ERROR_PATTERN`(A-028.11/.13:turn 错误分型判定半场,人话文案与渲染归端)· `resumeRetryLaterFromError`(L-102,0.57.0:resume 族**时间性拒绝**二码的判型半场 —— 这一族里唯一**带得出「等多久」**(`retryAfterSec`)的两个码。🔴 闭集**不是**「哪些码可以等」的名单:同族 `resume.row_recycling` 同样可等(窗口自清)只是没有秒数 ⇒ 本读口返回 `null` 只意味着没命中这两码,详见 §21) · `projectWriteProtectionCapability` / `observedWriteProtection` / `noteEngineCapsForWriteProtection` / `forgetWriteProtectionReading` / `writeProtectionDoctorDetail` / `projectWriteProtectionPosture` / `writeProtectionPostureDetail`(S-138,0.60.0:`Capabilities.writeProtection` (engine ≥7.63.0)的**四态**读面 + operator 面行表 —— 与上面 S-131 那一格**同构同纪律**。🔴 三位刻意不合成一个布尔;`not_reported` **不是**「这台部署没有写保护表」(座位缺席恰是缺省表在岗);逐行 name/kind 走**最小披露**只上 operator 面,详见 §24e)· `projectReadFacePosture` / `readFacePostureDetail` / `readFaceDisagreement`(S-167,0.61.0:operator 面 `diagnostics.wiring.readFace`(engine ≥7.65.0)的窄读器 —— 与上面S-138 那一格**同构同纪律**。🔴 三句「答不出来」逐字互异且没有一句等于「没有 READ 档」;`source` 按开集读;与租户面 `capabilities.readFace` 刻意不合流,只带一个纯比较函数,详见 §25)| 上行通道的**监管**半场(submit / steer / kill / 队列命令定序)+ 传输构造、caps 探测、SSE 断流分诊、**409 active-run 自愈** | `src/controlRouter.ts`、`steering.ts`、`sseIdleTriage.ts`、`retryStatus.ts`、`diagnostics.ts`、`engineWireSdk.ts`、`engineWireTarget.ts`、`src/principalWire.ts`、`src/wireErrorTriage.ts`、`engineSessionParam.ts`、`engineCapsCache.ts`、`liveInitToolFace.ts`、`adapter/activeRunSelfHeal.ts`、`src/sessionMemoryStatus.ts`、`src/writeProtectionCapability.ts`、`src/readFacePosture.ts` |
|
|
162
|
+
| 16 | **引擎词汇表与包自检** | 90 | `CONFIG_REFUSAL_CODES` / `isConfigRefusalCode` · `DECIDE_WORKFLOW_LANE_CODES`(+ 三个具名码;`/decide` workflow 车道,三条出路刻意不合并,详见 §30h)· `STOP_CONFLICT_CODES` · `isInterruptedToolEndCode` · `isRewindFamilyCode` · `CLIENT_VERBS` · `compensationSplitViolations` · `DELEGATION_CAP_CODES` / `isDelegationCapCode` / `DELEGATION_CONCURRENCY_CAP` / `DELEGATION_SESSION_CAP`(0.38.0 #318 件④:core 5.48.0 design/323 委派席位到限**两码,处置不对称禁合并** —— 并发帽=**可等**(兄弟结束即有位)/ 会话累计帽=**等也没用**(这条会话的配额用尽))· `CONFIG_DELEGATION_ENTRY_CAPS`(同批入 `CONFIG_REFUSAL_CODES` 识别表)· `delegationCapDispositionOf` / `MCP_SERVER_REVOKED`(0.39.0 载体到货消费件:core 5.50.0 补 `{ error: code, code }` 孪生拼法后两码真上 `tool_end.errorCode`,0.38.0「先立词不落消费分支」的已知局限自此解除;处置轴 `wait-for-slot` / `reuse-existing-or-await-reap` 机器可读(累计帽=retained-window 帐,行回收配额即回,处置=SendMessage 复用,**非**「换会话/永久耗尽」——0.38.0 段该句系勘误),未知 `delegation.*` 码 ⇒ `undefined`;`mcp.server_revoked` = 操作员 mid-session 吊销 server 后的工具面本地闸(被吊销的 server **名**今天不过 wire 境:detail.server 是进程内位,抬升腿只 lift code——归因渲染候 core 补 typed detail,已点名);载体门 = engine-vocab G3 腿锚 core dist 铸点)· `CAPABILITY_SELF_ORCHESTRATION_REQUIRED`(S-81,server 7.57.0:提交面的 selfOrchestration 准入拒绝码。🔴 **复用码** —— 与其它 `capability.*` 501 同体形而处置不同,消费点必须按**恰等**判、绝不放宽成前缀判;判型与「去键重发一次」归 `src/selfOrchestrationDenial.ts`,详见 §13) · `GATE_PARKED_ERROR_CODE`(0.60.0:「门把这次调用 park 了」的机读码单源 —— `frameRouter` 的连坐/中断判据与 `gateOutcome.isGateParkedToolEnd` 读同一个常量;真机黑盒直证 park 短路帧上**没有 `gate`**,这个码是那一形唯一的信号,详见 §24c)| 三端分臂共用的**去字面化** `errorCode` 词表(病根正是三端各抄一份字面);编译期 verb 闭合门;搬迁补偿登记表 | `src/engineErrorCodes.ts`(计数以 `scripts/public-export-baseline.json` 为准,别手抄;A-028.11/.13 补 `DRAINING_ERROR_CODE`/`SCENARIO_NOT_ALLOWED_ERROR_CODE`/`RESUME_AT_ERROR_CODE_PREFIX`;#318 件④ 补 `delegation.*` 族四位 + `config.delegation_entry_caps`;0.39.0 补三新码消费件三位);S-81 补 `capability.self_orchestration_required` 一位;L-102 补 `resume.*` 时间性拒绝二码 + 闭集 `RESUME_RETRY_LATER_CODES` 三位)、`src/classifierVerdictWire.ts`、`src/compensations.ts`、`src/clientSlice.ts`;**0.67.0 补锚**(这三件的导出一直计在本域,而本表此前没有它们的锚行 —— 如实补上,不是搬家):`src/gateVocabulary.ts`(`GATE_DENIED_BY_WORDS`/`gateDeniedByDetail`/`ASK_ORIGIN_WORDS`/`askOriginDetail` + 🆕 `RULE_STORE_UNREADABLE_KINDS`/`isRuleStoreUnreadableKind`/`ruleStoreUnreadableDetail`,详见 §32d)、`src/autoModeUnavailable.ts`(`AUTO_MODE_UNAVAILABLE_CAUSES` + 🆕 `CLASSIFIER_DENY_CAUSES`/`isClassifierDenyCause`/`classifierDenyCauseOf`/`classifierDenyCauseDetail`;🔴 同批**删**`classifierUnavailableOf`/`classifierUnavailableDetail`,详见 §32b)、`src/classifierStatus.ts`(`CLASSIFIER_STATUS_STATES`/`classifierStatusOf`/`classifierStatusDetail`)|
|
|
163
163
|
|
|
164
164
|
🔴 **`engineErrorCodes` 的开集纪律**(该文件头注逐字):这些 `ReadonlySet` / 前缀谓词一律是**识别表**,
|
|
165
165
|
回答的是「我认不认得这个码」,**绝不是**「合法码只有这些」。消费点 `switch` **必须留 `default`**,
|
|
@@ -4621,7 +4621,7 @@ an argument」。audience 答另一问:这条事实**说给谁听**。
|
|
|
4621
4621
|
**签名**
|
|
4622
4622
|
|
|
4623
4623
|
```ts
|
|
4624
|
-
ENGINE_NOTICE_CODES: readonly string[] //
|
|
4624
|
+
ENGINE_NOTICE_CODES: readonly string[] // 52 码,顺序同源
|
|
4625
4625
|
ENGINE_NOTICE_AUDIENCE: Readonly<Record<string, 'user' | 'operator'>>
|
|
4626
4626
|
noticeAudienceOf(code: unknown): 'user' | 'operator'
|
|
4627
4627
|
engineNoticeInCatalog(code: unknown): boolean
|
|
@@ -6573,6 +6573,42 @@ prepare 期拒绝 / 合成 abort)。**数字位仍是必填、仍是数到的那
|
|
|
6573
6573
|
`usageLowerBound === true`;两面的**在场性逐位相等**。反向:同一条路上没观测到缺口 ⇒ 两面**都**键缺席
|
|
6574
6574
|
(never false)。子流那一轮报的缺口**同样算数**(下界是这条流的性质,不分车道)。
|
|
6575
6575
|
|
|
6576
|
+
#### 🔧 0.67.2 订正(车 I 件 I-1,异源对抗复审 [medium] 实抓):流内观测位是 **per-stream**
|
|
6577
|
+
|
|
6578
|
+
0.67.1 把取并下沉到唯一读器,但**那一半来源自己住错了地方** —— 它写在
|
|
6579
|
+
`ctx.usageMissingObserved` 上,而 `EmitContext` 是**调用方的对象**、可以被复用给多条流
|
|
6580
|
+
(`startedAtMs` 本来就是这么用的;本包分表门的 J3 段明确支持「同一个 ctx 跑两条并发流」),
|
|
6581
|
+
且那一位**只置 `true`、永不清**:
|
|
6582
|
+
|
|
6583
|
+
- **顺序复用**:上一条流里的一轮缺口,让**下一条 usage 完整的流**的终帧铸出
|
|
6584
|
+
`_sema_usage_lower_bound`、同一拍的 `run_cost_reconciled` 也被标成下界 —— 宿主据此把一条
|
|
6585
|
+
账数得全的 run 渲成「≥」,并把不完整状态持久化;
|
|
6586
|
+
- **并发复用**:两条流互相串这一位。
|
|
6587
|
+
|
|
6588
|
+
「别人那条流有缺口」不是「这条流的数字是下界」的证据 —— 这一位问的是**这一条 run** 的账数全了没有。
|
|
6589
|
+
0.67.0 的头注曾写「复用 ctx 的两条流里只要有一条观测到缺口,两条就都该按下界读 —— 取并是安全的那一侧」,
|
|
6590
|
+
**那句话是错的**:失效方向在这里不是「多说一句」,是**断言一件没发生的事**。
|
|
6591
|
+
|
|
6592
|
+
**修形**:观测位落在 `runStreamInner` 的**局部量**上(per-stream),终局把**本流快照**按值同时交给
|
|
6593
|
+
两个投影口 —— 终帧(`terminalToSdkResult(ev, ctx, observed)` 第三参,additive)与 `run_cost_reconciled`
|
|
6594
|
+
铸臂(`readRunCostFacts(stats, observed)` 第二参),两面读的仍是**同一次计算**。
|
|
6595
|
+
🔴 **不是**靠「终帧那一拍把 ctx 上那一位清掉」修的:并发的两条流会互相覆盖那次清除,而且在共享对象上
|
|
6596
|
+
留一个会漂的位本身就是下一次串账的入口。
|
|
6597
|
+
|
|
6598
|
+
**型面变化**:`EmitContext.usageMissingObserved` **退役**(该位此前逐字写着「由 `runStream` 在流内写,
|
|
6599
|
+
宿主不要自己填」⇒ 端上不该有任何读者/写者)。端自建管线照旧用
|
|
6600
|
+
`readRunCostFacts(stats, { usageMissingObserved })` —— 那是一个**按次调用的入参**,不是跨流留存的状态。
|
|
6601
|
+
|
|
6602
|
+
**消费方待办**:无(cli / web / desktop 均无 `usageMissingObserved` 读写点;wire 键零增删)。
|
|
6603
|
+
|
|
6604
|
+
**黑盒判据(新增,不改既有号)**
|
|
6605
|
+
|
|
6606
|
+
- **G32-21c**:同一个 `EmitContext` 对象**顺序**跑两条流 —— 第一条 `turn_end{usageMissing:true}` + 终帧,
|
|
6607
|
+
第二条每一轮都报 usage、`stats` 也不说 ⇒ 第二条的终帧上**没有** `_sema_usage_lower_bound`、同一拍的
|
|
6608
|
+
`run_cost_reconciled` 上**没有** `usageLowerBound`(两面同时不在场);同一个 ctx 上第三条**自己真有**
|
|
6609
|
+
缺口的流照旧两面都铸(反向自证)。**并发**形:两条交错的流共用一个 ctx,有缺口的那条铸、没缺口的那条
|
|
6610
|
+
不铸。且跑完之后 ctx 上**没有** `usageMissingObserved` 这一格;宿主手填一个也不再影响投影。
|
|
6611
|
+
|
|
6576
6612
|
---
|
|
6577
6613
|
|
|
6578
6614
|
### 32g. F-6(L-228)per-subagent usage 分表(**ADDITIVE**:新 chrome 臂 + 两个终帧超集键)
|
|
@@ -6590,7 +6626,7 @@ prepare 期拒绝 / 合成 abort)。**数字位仍是必填、仍是数到的那
|
|
|
6590
6626
|
| 键 | 载体 | 形 | 缺席语义 |
|
|
6591
6627
|
|---|---|---|---|
|
|
6592
6628
|
| chrome 臂 `subagent_turn_usage` | 每条**子流** `turn_end` 一条(`required: false`) | `{ taskId, parentToolCallId, usage, engineUsage?, usageMissing?, stopReason? }`;`laneProof` 恒是 `{lane:'subagent', parentToolCallId}` | 不接本臂 = 子代用量面在那个宿主上看不见(不是报错) |
|
|
6593
|
-
| `_sema_nested_usage_by_task` | CC result 帧顶层(成功臂 + 错误信封) | `Record<taskId, { turns, inputTokens, outputTokens, cacheReadTokens?, usageMissing? }>` | **一行都没有 ⇒ 整键不铸** —— 空表会被读成「一个子代都没委派」,而真相可能是「委派了但这条流没看见任何一轮」 |
|
|
6629
|
+
| `_sema_nested_usage_by_task` | CC result 帧顶层(成功臂 + 错误信封) | `Record<taskId, { turns, inputTokens, outputTokens, cacheReadTokens?, usageMissing?, keyCollision? }>`(`keyCollision` 见 0.67.2 订正段) | **一行都没有 ⇒ 整键不铸** —— 空表会被读成「一个子代都没委派」,而真相可能是「委派了但这条流没看见任何一轮」 |
|
|
6594
6630
|
| `_sema_nested_usage_by_task_partial: true` | 同上 | 判别位 | 见下;**never false** |
|
|
6595
6631
|
|
|
6596
6632
|
**🔴 供给面的射程边界(如实记,异源对抗复审逼出)**:core 里子代事件有**两条**外送腿,而它们
|
|
@@ -6761,6 +6797,71 @@ setter ——**不产生自有属性**(值是对象时还顺手改了表自己
|
|
|
6761
6797
|
判别力自证三形:全真身份对得上 ⇒ 不铸;全回落且父调用与任务一一对应 ⇒ 不铸;全回落且多任务共父
|
|
6762
6798
|
⇒ 照旧铸(本条不是那一格的替身)。
|
|
6763
6799
|
|
|
6800
|
+
#### 🔧 0.67.2 订正(车 I 件 I-2,异源对抗复审 [medium] 实抓):两种身份的**键空间碰撞**
|
|
6801
|
+
|
|
6802
|
+
订正 ③(G32-25b)漏了一格:出身混合那道闸读的是**行上的**出身位,而行是按**裸 `taskId`** 攒的 ——
|
|
6803
|
+
行键的两个命名空间(真身份 `sourceTaskId` / 回落 `parentToolCallId`)**字面可以相等**,core 的合同
|
|
6804
|
+
并**没有**保证两者互斥。撞字面的两行在**累加那一层**就已经并掉,并掉之后那一行只剩一种出身 ⇒
|
|
6805
|
+
`mixedKeyOrigin` 当场读不出混合,订正 ③ 被绕过。
|
|
6806
|
+
|
|
6807
|
+
反例(异源复审逐字复现):三条子流 `turn_end` 的 `(sourceTaskId, parentToolCallId, inputTokens)` 依次为
|
|
6808
|
+
`('p','a',10)` / `(缺席,'p',20)` / `(缺席,'a',30)`,终局 `nested = {tasks: 2, turns: 3}`。
|
|
6809
|
+
真相是父调用 `a` 下那只任务花了 `10 + 30 = 40`、父调用 `p` 下那只花了 `20`;
|
|
6810
|
+
修前输出 `{p: 30, a: 30}`,**行数 2 === tasks 2**、**turns 之和 3 === turns 3**、出身位读不出混合
|
|
6811
|
+
⇒ `partial` **不铸** —— 一张归属错误的表被标成「可证完整」。
|
|
6812
|
+
|
|
6813
|
+
**修形**(三层,交付面零 BREAKING):
|
|
6814
|
+
|
|
6815
|
+
1. **累加表的键按出身隔离** —— `s:<sourceTaskId>` / `p:<parentToolCallId>`,**逐事件**把来源记进键本身。
|
|
6816
|
+
「一行的每一轮出身一致」从此是**构造保证**,不再是一条会失效的推理。前缀只活在包内:wire 上自带
|
|
6817
|
+
`s:` / `p:` 前缀的 id 因此不会与别人串。
|
|
6818
|
+
2. **交付面的键仍是裸 id**(端零改)。跨命名空间的同字面因此落到同一个交付键上 ⇒ **合并**成一行
|
|
6819
|
+
(数字与轮数按两边之和,不偷偷丢一边;`cacheReadTokens` 的「没报过 ⇒ 键不铸」在合并处照守),
|
|
6820
|
+
并在该行上立 **`keyCollision: true`**(**never false**)。
|
|
6821
|
+
3. **`partial` 恒立**:证不出逐任务归属就不许说完整。
|
|
6822
|
+
|
|
6823
|
+
🔴 **为什么不「两行分列」**:交付形是 `Record<taskId, row>`,同一个裸 id 不可能占两格 —— 要分列就得把
|
|
6824
|
+
出身前缀推到 wire 上,那是三端 BREAKING,而且把包内的编码变成端要解的身份语义。
|
|
6825
|
+
「合并 + 显式标记」是同一批事实下唯一不撒谎的交付形。
|
|
6826
|
+
|
|
6827
|
+
**消费方待办**:`keyCollision === true` 的行**不许**当成某一只子代的账去渲(它是几只混在一起的和);
|
|
6828
|
+
该位在场时 `_sema_nested_usage_by_task_partial` 必然同时在场,只读 `partial` 的端**行为不变**
|
|
6829
|
+
(失效方向仍是只会多说一句「数不全」)。
|
|
6830
|
+
|
|
6831
|
+
**黑盒判据(新增,不改既有号)**
|
|
6832
|
+
|
|
6833
|
+
- **G32-25c**:上面那三帧反例 ⇒ 终帧 `_sema_nested_usage_by_task_partial === true`,`p` 那一行
|
|
6834
|
+
`keyCollision === true`(`turns === 2`、`inputTokens === 30`),`a` 那一行**不受连坐**
|
|
6835
|
+
(`inputTokens === 30`、无 `keyCollision`),交付键仍是裸 `a` / `p`。
|
|
6836
|
+
判别力自证四形:全真身份且计数对得上 ⇒ 两位都不铸;**出身混合但不撞字面** ⇒ 无 `keyCollision`
|
|
6837
|
+
(那一形由 G32-25b 的 `partial` 管,两条判据不混用);**同一命名空间**里的同一个 id(同一只子代
|
|
6838
|
+
两轮)⇒ 正常并行、不是碰撞;wire 上自带 `s:` / `p:` 前缀的 id ⇒ 原样交付、互不并行。
|
|
6839
|
+
碰撞行的键是 `"__proto__"` 时仍产生自有属性、`JSON.stringify` 之后仍可见(G32-23c 那条纪律不因
|
|
6840
|
+
合并臂被绕开)。
|
|
6841
|
+
|
|
6842
|
+
#### 🔧 0.67.2 订正 ②(车 I 件 I-2b,轮二异源复审实抓):分表本身是**本流快照**,不再住在 `EmitContext` 上
|
|
6843
|
+
|
|
6844
|
+
与 §32f 的件 I-1 **逐字同形**的同形存量:「这条流看见了哪几只子代的哪几轮」同样是 per-stream 的事实,
|
|
6845
|
+
而它此前流结束后**留在调用方对象上**(`ctx.nestedUsageByTask`)。`terminalToSdkResult` /
|
|
6846
|
+
`doneToSdkResult` / `failedToSdkResult` 三只都是**公面导出** —— 端自建管线「A 走 `runStream`、
|
|
6847
|
+
B 直调终帧投影」共用一个 ctx 是它们存在的理由 —— 于是 B 的终帧带出 **A 的**分表;B 的 `nested` 计数
|
|
6848
|
+
若恰好与那张表对得上(`tasks` / `turns` 相等),`partial` 还**不铸** = 一张属于别人的表被标成
|
|
6849
|
+
「可证完整」。
|
|
6850
|
+
|
|
6851
|
+
**修形**:分表与观测位一起走终帧投影的**第三参**(`terminalToSdkResult(ev, ctx, { usageMissingObserved,
|
|
6852
|
+
nestedUsageByTask })`),`EmitContext.nestedUsageByTask` **退役**(该位此前同样逐字写着「由 `runStream`
|
|
6853
|
+
在流内写,宿主不要自己填」)。**没传快照 ⇒ 两个分表键都不铸**(诚实缺席:这次投影一条子流都没看见),
|
|
6854
|
+
绝不回头读残留。
|
|
6855
|
+
|
|
6856
|
+
**消费方待办**:无(cli / web / desktop 均无 `nestedUsageByTask` 读写点;经 `runStream` 的路径逐位不变)。
|
|
6857
|
+
自建管线若直调三只终帧投影器且想要分表,把本流的表放进第三参。
|
|
6858
|
+
|
|
6859
|
+
- **G32-25d**:同一个 `EmitContext` 上,A 经 `runStream` 跑完一条带子代的流(`nested` 为 `{tasks:1,turns:1}`)
|
|
6860
|
+
之后,B **直调** `terminalToSdkResult`(自己一条子流都没看见、`nested` 同为 `{tasks:1,turns:1}`)⇒
|
|
6861
|
+
B 的终帧上 `_sema_nested_usage_by_task` 与 `…_partial` **两个键都不在场**;`failedToSdkResult` 同理。
|
|
6862
|
+
跑完之后 ctx 上没有 `nestedUsageByTask` 这一格;宿主手填一份也不再影响投影。
|
|
6863
|
+
判别力自证:经 `runStream` 的下一条流照旧带**自己**那张表。
|
|
6864
|
+
|
|
6764
6865
|
#### ⚠️ 0.67.1 未修的**已知局限**(同族、已立案,本批**刻意不动**):子代**正文**分流仍只认 `parentToolCallId`
|
|
6765
6866
|
|
|
6766
6867
|
`src/adapter/runStream.ts` 的 C1 子代内容分流(`text_delta` / `reasoning_delta` / `text` / `reasoning` /
|
|
@@ -6883,3 +6984,361 @@ setter ——**不产生自有属性**(值是对象时还顺手改了表自己
|
|
|
6883
6984
|
| 7 | 状态面事实源 | `classifierStatusOf` 第二参从「一只 ask」变成「本轮那一次观测(ask / 耐久行 / 带 `gate` 的 `tool_end` 帧 / 门记录本体)」 | 签名与三态词表**未改**(不是编译期 BREAKING),但**喂什么**变了:端要把本 turn 的门记录喂进去,否则那一态恒不出现 |
|
|
6884
6985
|
|
|
6885
6986
|
---
|
|
6987
|
+
|
|
6988
|
+
## §33 🔴 0.68.0 提货批(core **7.16.0 → 7.17.1**;**BREAKING**:`turn_end.usage` 恒在场 / 终态词两表分源 / `ask_unresolvable.cause` 取代 `settlementKind`)
|
|
6989
|
+
|
|
6990
|
+
### 33a. 本节速览
|
|
6991
|
+
|
|
6992
|
+
| 件 | 一句话 | 端要做什么 |
|
|
6993
|
+
|---|---|---|
|
|
6994
|
+
| S-1 🔴 | **`turn_end.usage` 恒在场**(core 7.17.0 #711):那一轮没量出账时引擎发的是**六个 0 + `usageMissing:true`**,不再是「不发 usage」⇒ 本包把 0.65.1 / B-088 那条「usage 缺席也照发」的臂**整条删掉**,缺席改按**契约违约**收口(响亮留痕 + 整帧不投影 + 立下界位);同批把「**占位零不当读数**」这条判据贯穿**五处**读点(见 33b 的表) | 端**不必**改代码;要接丢帧告警面的端多认一个判词 `turn_end_usage_absent`。🔴 直接调公面读器 `turnEndUsage` 的端:它的 `undefined` 现在等于「这一轮的账不知道」(跨引擎升级答案**逐字不变**);要原样镜像改调 `turnUsageToModelUsage`。🔴 **引擎地板**:本版的 `turn_usage` 臂按 core ≥7.17.0 的铸形写,老引擎上那一形会被判成违约(见 33b 的「老引擎怎么办」) |
|
|
6995
|
+
| S-2 🔴 | **终态词两表分源**(L-247):`TERMINAL_STATUSES` / `TERMINAL_NOT_SUCCESS_STATUSES` **删**,换成 `TERMINAL_CAUSE_KINDS`(core 因由闭集四词)与 `RUN_TERMINAL_STATUSES` / `RUN_TERMINAL_NOT_SUCCESS_STATUSES`(server run 行状态面),三张表都是**字面元组**并各带派生型 | 手抄过那四个词的端(cli L-247 点名六处)改**派生型**;按旧名 import 的端改名(**无别名**);谓词 `isTerminalStatus` / `isTerminalNotSuccess` 名字与语义**未动**,并且现在是类型守卫 |
|
|
6996
|
+
| S-3 🔴 | `delegation.ask_unresolvable` 的 `detail.settlementKind` **换成** `detail.cause`(core #709 ②,三词闭集);`config.durable_gate_unavailable` 新增 `detail.source`(两词闭集)⇒ 本包新给两只**事实窄读器** | 渲这两条通告的端改读 `cause` / `source`;🔴 **不要**写「读不到 cause 就读 settlementKind」的双读(见 33c 的理由) |
|
|
6997
|
+
| S-4 | `GET /v1/workflows/:id` 的 `parks[]` **三键无 token**(core #652 / server [7084] D)⇒ 本包给 `readWorkflowParks` 三键读器(**凭据结构性不可达**)+ workflow **park 真相**四拒码闭集 | 要渲「这条 workflow 停了哪几只审批」的端接读器;🔴 `parks` **整键缺席 ≠ 空数组**(前者证不出,后者是正面事实) |
|
|
6998
|
+
| S-5 | `card.risk.irreversible` 在 off 车道 Bash ask 上从**缺席**变**在场**(core #713) | **本包 n-a**(卡上那格 `risk` 子树由端铸,包边界上没有这一位);壳/桌面/web 的卡面把「缺席 = 没有 irreversible 轴」这句注释改成「在场 = 有轴」,读法不变 |
|
|
6999
|
+
| S-6 | `GET /v1/runs/:id` 新增 `heldBy` / `cancelRequested`(server 7.73.0 S-122 P-45;L-230)⇒ `waitForClaimRelease` 多一条**更早、更硬**的释放证据,`ClaimReleaseVerdict` 多一位 `lastHolder` | 端零改造(两位缺席时行为**一字不变**);想渲「那条 run 还占着」的端可以改读 `lastHolder === 'held'` 这条直接证据 |
|
|
7000
|
+
| S-7 | 三张闭集表的**结构不可达兜底句**退役(L-245)/ `classifierStatusOf` 第二参有了名字 `ClassifierRoundObservation`(L-245 B6)/ 子代下界位有了自有名 `_sema_subagent_usage_partial`(L-244)/ 停止原词映射下沉包内(L-246 A13)/ 落键姿势单源化(L-246 B2) | 拿 `unknown` 喂两只措辞铸点的端要先过成员判据(**编译期** BREAKING);铸假门记录喂 `classifierStatusOf` 的端可以直接交 `{disposition}`;自拼 `_sema_usage_lower_bound` 渲子代行的端改用包给的名与判据;自持五词停止原词表的端改 import |
|
|
7001
|
+
| S-8 | core 7.17.0 码册 **+1** `config.artifact_host_invalid` / structured 卡型 **+1** `artifact` / `BrainRetryErrClass` 补第七桶 `stall` / `stalled` 臂透传引擎那句 `detail` | 按 audience 分发的端自动跟随;按 `errClass` 闭集写 `switch` 的端补一相;等待行可以渲引擎那句中性提示了 |
|
|
7002
|
+
|
|
7003
|
+
**共同形**:这一批的主线是**「缺席」这个字节被上游收回**。`turn_end.usage`、`parks`、`heldBy` 三处
|
|
7004
|
+
都从「可能不发」变成「恒发 / 发了就有正面语义」,而本包此前为「不发」写的那些臂,今天要么是死码
|
|
7005
|
+
(留着 = 给一个违约帧准备静默通道),要么把一句正面事实读丢了。**共同处置**只有一条:
|
|
7006
|
+
**缺席不再等于「照旧」**——它要么是违约(响亮 + 不投影,S-1),要么是「旧引擎写的记录,证不出」
|
|
7007
|
+
(S-4 的 `parks`),要么是「老引擎不发这一位,走既有路」(S-6 的 `heldBy`)。三者**逐字可分**,
|
|
7008
|
+
任何一处把它们折成同一个字节,都会让一件「不知道」被渲成一件事实。
|
|
7009
|
+
|
|
7010
|
+
**出处**:comms [7067](core 7.17.0 提货单)/ [7084] D 段(server 7.74.0 wire 变更清单)/ [7108]·[7109]
|
|
7011
|
+
(core 7.17.1 发车与提货单)。型面真源 = 实装 devDep `@sema-agent/core` 7.17.1 的 `dist/core/*.d.ts` 与
|
|
7012
|
+
`dist/**/*.js` 真字节:`runner/run-harness-handlers.js` 的 `onTurnEnd`(`turn_end.usage` 恒铸)、
|
|
7013
|
+
`terminal-cause.d.ts`(`TerminalCause` 四臂 + `TERMINAL_CAUSE_IS_REPLAYABLE`)、
|
|
7014
|
+
`ask-unresolvable-notice.d.ts:31`(`ASK_UNRESOLVABLE_CAUSES`)、`tool-policy.d.ts:1403`
|
|
7015
|
+
(`DURABLE_MANDATE_SOURCES`)、`orchestration/workflow.js:602`(park 四码)、`governance-codes.js:108`·`:181`
|
|
7016
|
+
(码册与 audience 加员)、`task-event.d.ts:117`(`BrainRetryErrClass` 七桶)。
|
|
7017
|
+
|
|
7018
|
+
**🔴 逐键处置表见 §33z** —— 下游抄 `wire-consumption-manifest` 时以它为母本。
|
|
7019
|
+
|
|
7020
|
+
---
|
|
7021
|
+
|
|
7022
|
+
### 33b. S-1 🔴 `turn_end.usage` 恒在场 ⇒ 「usage 缺席」臂整条退役(BREAKING)
|
|
7023
|
+
|
|
7024
|
+
**上游的形变**(core `dist/core/runner/run-harness-handlers.js` 的 `onTurnEnd`,真字节):
|
|
7025
|
+
|
|
7026
|
+
```js
|
|
7027
|
+
const usage = rs.turn.turnUsage ?? { inputTokens: 0, totalInputTokens: 0, outputTokens: 0,
|
|
7028
|
+
cacheReadTokens: 0, cacheWriteTokens: 0, costMicroUsd: 0 };
|
|
7029
|
+
const turnUsageUnknown = rs.turn.turnUsage === undefined || rs.turn.turnUsageMissing;
|
|
7030
|
+
queue.push({ type: "turn_end", usage, ...(turnUsageUnknown ? { usageMissing: true } : {}), … });
|
|
7031
|
+
```
|
|
7032
|
+
|
|
7033
|
+
⇒ **「没有 usage 的 `turn_end`」不再是一条合法形**。那一轮真没量出账时,引擎发的是**六个 0 +
|
|
7034
|
+
`usageMissing:true`**;而 0.65.1 / B-088 那条臂(「有 usage ∨ 有 stopReason ∨ 有 usageMissing 三者任一
|
|
7035
|
+
就发」)守的输入形,今天**不存在了**。
|
|
7036
|
+
|
|
7037
|
+
**本包的处置**(`src/adapter/runStream.ts` 的 `turn_end` 块):
|
|
7038
|
+
|
|
7039
|
+
| 修前 | 修后 | 为什么 |
|
|
7040
|
+
|---|---|---|
|
|
7041
|
+
| `usage` 缺席时靠三选一条件仍发一条 `turn_usage` | **整帧不投影**,并走丢帧留痕口 | 留着它 = 给一个**契约违约**的帧准备一条静默通道(§32 的「违约无断言」纪律) |
|
|
7042
|
+
| 三处 `usage !== undefined ? … : {}` / 两处 `usage?.x ?? 0` | 全部删(闸后 `usage` 恒在场) | 「缺席折 0」的写法留在码里,等于为一个不可能的形保留一条把「不知道」写成 0 的路 |
|
|
7043
|
+
| — | 违约那一拍**立下界位** | 整帧不投影很容易顺手把「这一轮没账」也丢掉,于是一条真丢了账的 run 在终帧上被渲成一笔**精确**的账 |
|
|
7044
|
+
|
|
7045
|
+
**响亮怎么响**:走已有的 `EmitContext.onDroppedFrame`(判词**开集** ⇒ 宿主不必改型),判词逐字
|
|
7046
|
+
`turn_end_usage_absent`;没装 sink 的宿主落 `console.error`,而且**那一行说的话与别的丢帧不同** ——
|
|
7047
|
+
缺省句逐字是「this build's projector has no arm for it」,对本形是**假话**(本 build 有臂,是上游那一帧
|
|
7048
|
+
违了自己声明的契约),一句说错方向的诊断会把读它的人指去升级客户端。
|
|
7049
|
+
|
|
7050
|
+
**🔴 `usageMissing` 那一轮的**占位零**不许当读数**(本件的族扫产物,#711 差一点把它抹平):
|
|
7051
|
+
|
|
7052
|
+
⚠️ **判据的关键一条(异源对抗复审轮一订正)**:`usageMissing:true` **并不保证**那六格是零 ——
|
|
7053
|
+
core 在**同一轮**里可能已经攒到过真数字(`rs.turn.turnUsage` 有值)而**另一次**模型调用报了缺账,
|
|
7054
|
+
于是判别位与真数字**同帧并存**(`run-harness-handlers.js:79-101` 与 `:289-293` 真字节)。
|
|
7055
|
+
⇒ 判据只能锚在**能证明是真读数的那一半**:占位恒为 `0`,所以**非零有限数必定是真的量到过**;
|
|
7056
|
+
而 `0` 在这一形上**分不出**占位与真零 ⇒ 按「不知道」办。
|
|
7057
|
+
(「缺账轮整条跳过」是**错**的:两帧 cache 10 / 100 且第二帧带判别位 ⇒ 合计应是 110,
|
|
7058
|
+
整条跳过给出 10,而实时增量腿仍交 10 与 100 —— 实时面与终局分表当场对不上。)
|
|
7059
|
+
|
|
7060
|
+
| 位 | 修前 | 修后 |
|
|
7061
|
+
|---|---|---|
|
|
7062
|
+
| `turn_usage.outputTokens` | 裸 `usageMissing` 帧上**不铸**(没有 usage) | 缺账轮上:`0` **不铸**(占位/真零分不出)、**非零照铸**(必是真读数,同帧的判别位说明它是下界) |
|
|
7063
|
+
| 分表行的 `cacheReadTokens` | 一轮都没报过 ⇒ 键不铸 | 同一条判据:缺账轮上的 `0` 不铸、**非零照累加** —— 「没报」与「零命中」这一格因此没有被 #711 抹平,而真读数也一格没丢 |
|
|
7064
|
+
| `RunStreamHandle.latestUsage` / `.latestEngineUsage` | 无条件覆盖 | 🔴 **只有占位轮不覆盖**(保留上一次真读数,与 #711 之前逐字相同 ⇒ 没跟车的消费者**零回归**);缺账轮带**非零真读数**时**照更新**(那些数字真的量到过,是下界)。另新增 **`latestUsageMissing`**(never false;测到账的轮删键)说出「最新那一轮的账不全」——这个公开出口上此前**没有任何判别位**,只吃它的 footer 会把「不知道」渲成一笔精确的零账。🔴 **读数更新**与**判别位**是两件事、分开决定:「读数是最新的真值」与「最新那一轮的账不全」可以同时为真 |
|
|
7065
|
+
| **坏形 `usage`**(`null` / 标量 / 数组) | 直接喂给映射 | 🔴 wire 是 JSON、SSE 解析**原样透传** ⇒ 这些形真到得了包边界。`null` 会让映射在读字段时**抛 `TypeError`** —— 那不是「一帧读不懂」,是**整条流当场断掉**(后面的 `done` 一并丢);标量更坏:它被逐格读不出、逐格折 0,映成一份**看起来已测量**的全零账。⇒ 成形判据一律是「**非 null 的非数组对象**」,坏形与缺席走**同一条**违约路(响亮 + 不投影 + 立下界位),**流不断** |
|
|
7066
|
+
| **A 层终帧补发腿** `response_metrics{phase:'end'}` | 拿终帧 usage 无条件补发 | 🔴 **同一条判据的第四处**(轮二实抓):`turn_usage` 那一拍没发过 end 时由它补发,而缺账 run 的终帧 usage 是**占位全零**(同帧的 `_sema_usage_lower_bound` 才是那句「不知道」)⇒ **下界位在场且读数是 0 ⇒ 不补发**(非零照发)。这一处是**消费链的末端**:前三处收口了而它没跟上,过滤就没贯穿到底 —— 本臂的宿主义务逐字是「驱动 responseLength reducer(ttft/对账)」 |
|
|
7067
|
+
| **公面读器 `turnEndUsage`**(🔴 BREAKING) | `ev.usage ? 镜像 : undefined` | 🔴 **同一条判据的第五处**(轮三实抓;这一处在**公面上**):`undefined` 的含义从「`usage` 这一格缺席」收窄成 **「这一轮的账不知道」**——两种入形都答它(整格缺席 / `usageMissing` 且六格全零),**非零照交**。理由是跨版本一致性:#711 之前「这一轮没量出账」的 wire 形是**不发 usage** ⇒ 本函数答 `undefined`;#711 之后同一件事的形变成六个 0,不改的话**同一个真实情形**在引擎升级前后由同一个公开读器给出两个相反的答案,而调用方一个字都没改。⚠️ 要**原样**镜像(不带缺席语义)请调 `turnUsageToModelUsage` —— 两者刻意分开,`runStream` 的违约闸走的正是后者(否则一条**合法**的占位帧会被误判成违约并整帧丢掉)|
|
|
7068
|
+
| **A 层 `turn_usage` 臂的模型轮边界** | 与「发 end 度量」合在**一个动作**里 | 🔴 **两件事分家**(轮五实抓的回归):`emitTurnUsageEnd` 一直在做两件事 —— 发 end 度量 **与** 复位下一 model round 的 TTFT 基线。缺账轮没有数字可发,整条跳过那个动作就**连模型轮边界也一起跳过**:下一轮不再发 `response_metrics{start}`,它的用量按**上一轮**的基线对账(整链实测:首轮 400 字符缺账、次轮 4 字符 + 50 tokens,计数从 150 掉到 101,下一轮 TTFT 一并丢失)。⇒ 边界动作(`noteModelRoundBoundary`)拆出来无条件走;它**只压基线、不置 `endEmitted`** —— 终帧若真带了一笔非零账,补发腿仍该补 |
|
|
7069
|
+
|
|
7070
|
+
**老引擎怎么办(如实登记)**:本件是 **BREAKING**,引擎地板随之抬到 **core ≥7.17.0**。在 <7.17.0 的
|
|
7071
|
+
引擎上,一条真实的「该轮零 usage」帧会被本版判成违约 ⇒ 留痕一条 + 那一拍的 `turn_usage` 不发 +
|
|
7072
|
+
终帧按下界交付。🔴 **这不是静默降级**:账仍然诚实(下界位在),丢的只有那一拍的实时增量,而且
|
|
7073
|
+
每一条都在丢帧留痕面上具名。本包**刻意不留**「按引擎版本分岔」的兼容读 —— 那要求包边界持有一个
|
|
7074
|
+
它读不出来的量(引擎版本不在帧上),而猜版本比响亮地说「这帧不合契约」更坏。
|
|
7075
|
+
|
|
7076
|
+
### 33c. S-3 🔴 `ask_unresolvable.cause` 取代 `settlementKind` + `durable_gate_unavailable.source`(BREAKING)
|
|
7077
|
+
|
|
7078
|
+
**`delegation.ask_unresolvable`**(core #709 ②;铸点 `gate-exit.ts` 的唯一 deny 出口):`detail` 上的
|
|
7079
|
+
`settlementKind` **换成** `cause ∈ ASK_UNRESOLVABLE_CAUSES`(三词)。
|
|
7080
|
+
|
|
7081
|
+
🔴 **两者不是改名**,所以本包**不做双读**:`settlementKind` 只说得出「结算是怎么落的」,而 in-fold
|
|
7082
|
+
拒绝那一臂(`mandate_unreconstructible`)**根本没有结算**骑在帧上 ⇒ 旧位在那一形上**恒缺席**。留一条
|
|
7083
|
+
「读不到 cause 就读 settlementKind」的兼容读,会在**最需要它的那一形**上给出缺席,并且让端以为自己
|
|
7084
|
+
兼容了老引擎。`settlementKind` 同批登记进 `scripts/run-retired-vocabulary-census-test.mjs`(`src/` 代码
|
|
7085
|
+
位置零命中 + 上游存活断言),任何人「顺手加一条兼容读」当天红。
|
|
7086
|
+
|
|
7087
|
+
| 铸点读法 | 缺席语义 |
|
|
7088
|
+
|---|---|
|
|
7089
|
+
| `readAskUnresolvable(notice)` → `{sessionId, toolName, toolCallId, cause, parkLaneExisted?}` | 四个必填格缺一 ⇒ **整只缺席**(读点判缺席**不抛** —— 读点抛只会把一条读不懂的通告升级成一次崩);`cause` **按闭集读**(它是三条恢复路的分支键);`parkLaneExisted` 读不出 ⇒ **键不铸**,绝不折 `false` |
|
|
7090
|
+
|
|
7091
|
+
**`config.durable_gate_unavailable`**(core #709 ①):`detail` 新增 `source ∈ DURABLE_MANDATE_SOURCES`。
|
|
7092
|
+
|
|
7093
|
+
| 位 | 读法 | 缺席语义 |
|
|
7094
|
+
|---|---|---|
|
|
7095
|
+
| `source` | **闭集**(两词;core 导出了这张表) | 表外词 ⇒ 整只缺席 —— 它是**恢复动作**的分支键,猜错会把人指去撤一项他根本没开的权利 |
|
|
7096
|
+
| `cause` | **开集透传**(非空串即原样带回) | core 今天**不导出**这两个词的闭集(铸点是一个三元表达式,`prepare-wiring-manifest.js:90`)⇒ 抄一份就是本包自铸词表,加员那天还是本包先错 |
|
|
7097
|
+
| `liveApprover` / `liveQuestionFace` | 布尔 | **读不出 ⇒ 键不铸**,不折 `false`:「没有人会答你这条 ask」与「引擎没说」的下一步不同 |
|
|
7098
|
+
|
|
7099
|
+
### 33d. S-4 workflow `parks[]` 三键读器 + park 真相四拒码
|
|
7100
|
+
|
|
7101
|
+
`GET /v1/workflows/:id` 的 200 体自 server 7.74.0 起带 `parks[]`,每行**恰好三键**
|
|
7102
|
+
`{callKey, sessionId, originRunId}` —— **没有** `token`(server 在读面把赎回凭据整只剥掉)。
|
|
7103
|
+
|
|
7104
|
+
🔴 **凭据在本包是结构性不可达的,不是纪律性的**:`readWorkflowParks` **逐键挑**三个键铸行,
|
|
7105
|
+
从不 spread 整行。于是即使哪天上游/中间层在这张行上多放了一个 `token`(或任何别的凭据形),
|
|
7106
|
+
它**在结构上**到不了本包的产物,更到不了三端的渲染面。一条「我们记得别渲 token」的纪律做不到这一点;
|
|
7107
|
+
门用一条带凭据的投毒行直接证它(产物**整棵树**序列化后那个值零命中,且同一把尺子对**输入**判得出)。
|
|
7108
|
+
|
|
7109
|
+
🔴 **缺席两义**(server [7084] A-2 逐字,两者的下一步相反):
|
|
7110
|
+
|
|
7111
|
+
| 读数 | 含义 | 端的下一步 |
|
|
7112
|
+
|---|---|---|
|
|
7113
|
+
| `undefined`(`parks` 整键缺席) | **旧引擎**写的记录 —— 它**证不出**有没有 park | 不许放行 resume;渲「这条记录证不出」 |
|
|
7114
|
+
| `[]`(键在、数组空) | 本引擎写的记录里**一个 park 都没有**(一句正面事实) | 可以放心 resume |
|
|
7115
|
+
|
|
7116
|
+
坏行只丢自己且保序;**非空输入而一行都没活下来 ⇒ `undefined`**(铸 `[]` 会把「读不出」伪装成「零 park」)。
|
|
7117
|
+
|
|
7118
|
+
**四个 park 真相拒码**(`WORKFLOW_PARK_REFUSAL_CODES`,core 7.17.0 `orchestration/workflow.js:602` 码集):
|
|
7119
|
+
`workflow.park_truth_unreadable` / `park_not_pending` / `park_binding_broken` / `park_requires_run_store`。
|
|
7120
|
+
它们**不是** `SCRIPT_ERROR_CODES` 的成员(core 顶注逐字:host runtime 类)。判据**绝不靠
|
|
7121
|
+
`workflow.park_` 前缀放宽** —— 前缀是命名巧合不是契约。
|
|
7122
|
+
|
|
7123
|
+
🔴 **`workflow.journal_incompatible` 仍是一个活码**:退役的是它的「journal entry missing」那**一条臂**
|
|
7124
|
+
(那四种情形从此各有各的码),不是这个码本身;把整个码当退役会让一族真拒绝在这一端无声消失。
|
|
7125
|
+
门里有一条反向钉守着它还活着。
|
|
7126
|
+
|
|
7127
|
+
### 33e. S-5 `card.risk.irreversible`(本包 n-a,端要改注释不改读法)
|
|
7128
|
+
|
|
7129
|
+
core #713 起,`classify` / `off` 车道的 policy ask 卡上 `axes.irreversible` 的**在场性**变了:
|
|
7130
|
+
off 车道的 Bash ask 上它现在**恒在场**(`true`),而 classify 车道的 policy ask 卡上**没有这一轴**。
|
|
7131
|
+
|
|
7132
|
+
🔴 **本包 n-a**,理由是取证不是口味:`ApprovalCardRequest`(`src/hitl/toolApprovalWire.ts`)上**没有**
|
|
7133
|
+
`risk` 子树,全树 `safetyAxis` / `axes` **零命中** —— 卡上那格风险层是**端**自己铸的(壳的三选卡 /
|
|
7134
|
+
桌面模态 / web 面板各有各的形)。⇒ 三端各自把那一格的**缺席语义注释**从「缺席 = 不知道有没有这一轴」
|
|
7135
|
+
改成「缺席 = **没有** irreversible 轴(不是 unknown)」,**读法一个字不改**。
|
|
7136
|
+
|
|
7137
|
+
### 33f. S-6 `heldBy` / `cancelRequested` 读点(L-230;additive,老引擎零行为变化)
|
|
7138
|
+
|
|
7139
|
+
`waitForClaimRelease` 此前**唯一**的释放判据是「`runs.get` 读回的 status 在 `CLAIM_RELEASED_STATES`
|
|
7140
|
+
白名单里」——那是拿「run 走到了某个终态词」去**推断**会话锁没了,而锁与 run 的生命周期不是同一件事
|
|
7141
|
+
(park 态保留 claim 正是这条推断会踩的坑)。server 7.73.0 S-122 P-45 之后有了直接证据:
|
|
7142
|
+
|
|
7143
|
+
| 读数(`readClaimHolder`) | 含义 | 判决 |
|
|
7144
|
+
|---|---|---|
|
|
7145
|
+
| `heldBy` 是**非空串** | 有一条 run 的名字在锁上 | 还占着(`lastHolder: 'held'`,文案的直接证据) |
|
|
7146
|
+
| `heldBy` **显式是 `null`** | 一句**正面事实**:会话交出来了 | **立刻 released** —— 哪怕 status 还是 park 词 |
|
|
7147
|
+
| `heldBy` **整键缺席** / 形不对 | 老引擎 / 读不出 | `'unknown'`,**绝不**当成释放;回落既有的白名单判据 |
|
|
7148
|
+
|
|
7149
|
+
🔴 `null` 与「键不在」必须分开:两者都读成「释放了」,老引擎上每一次探测都会当场答「已释放」并立刻
|
|
7150
|
+
重发那条被拒的消息 —— 而它可能一头撞回一个还锁着的会话。`cancelRequested` 同律三态
|
|
7151
|
+
(`readCancelRequested`:`true` / `false` 都是真读数,读不出 ⇒ `undefined`),而且它读的是
|
|
7152
|
+
**「请求已受理」不是「已取消」**:释放仍只由 `heldBy` 与终态词回答。
|
|
7153
|
+
|
|
7154
|
+
`ClaimReleaseVerdict` 新增 `lastHolder`(与 `lastStatus` **同律**:只记最近一次**有回答**的探测);
|
|
7155
|
+
`confirmedHeld` 的判据改成**两条取并**(直接证据优先,老引擎回落状态词),两条都答不出仍收口成
|
|
7156
|
+
`false` = 「确认不了」。**P-44(`Checkpoint.rev`)n-a**:那一件在 L-230 上已**撤回**(cli 不把
|
|
7157
|
+
`checkpointId` 送上 wire),本包全树无 `expectedRev` 读点。
|
|
7158
|
+
|
|
7159
|
+
### 33g. S-7 L-244 / L-245 / L-246 的包侧半场
|
|
7160
|
+
|
|
7161
|
+
**L-244(子代下界位分名)**:壳把「这一行还没收口」∪「这一轮没报账」铸成了**与终帧同名**的
|
|
7162
|
+
`_sema_usage_lower_bound`。两者**同名异义** —— 终帧那一位答「**这条 run 的合计**是下界」,子代面那一位答
|
|
7163
|
+
「**这一只子代的这一行**现在还不是最终数」;同名的代价是一个按键名聚合的面会把「一条只是还没收口的
|
|
7164
|
+
子代行」算成整条 run 的账不可信。⇒ 包给**自有名** `SEMA_SUBAGENT_USAGE_PARTIAL_KEY` 与**唯一判据**
|
|
7165
|
+
`subagentUsageIsPartial(row, { tablePartial })`(三源取并:行的 `usageMissing` / `keyCollision` / 整张表的
|
|
7166
|
+
`partial`)。🔴 判据 `false` **不是**「这一行是最终数」的证据 —— 行本身收没收口只有端自己的 store 知道,
|
|
7167
|
+
所以判据收一个 `opts` 而不是假装掌握全部真相。
|
|
7168
|
+
|
|
7169
|
+
**L-245(闭集面:收窄 + 编译期围栏,开集面:保留兜底)**:`CLASSIFIER_DENY_CAUSES` /
|
|
7170
|
+
`RULE_STORE_UNREADABLE_KINDS` 改**字面元组**并各出一个成员型;两只措辞铸点的入参从 `unknown` 收窄成
|
|
7171
|
+
成员型,措辞表的型改 `Record<成员型, string>`。那句「a word newer than this client」的兜底是
|
|
7172
|
+
**结构不可达**的(唯一到达铸点的路已经按闭集判过了),而且它说的话是**假的**(真有一个比这一端新的词
|
|
7173
|
+
时它压根不会到这里);更坏的是它假装这一面是开集,于是没人给这张表配编译期围栏 —— core 加词那天
|
|
7174
|
+
一声不响。⇒ 收窄之后,**加词 = 表少一个键 = 编译期当场红**。
|
|
7175
|
+
⚠️ **隔壁那一句刻意相反且两边都对**:`askOriginDetail` 的兜底**留着** —— `AskOrigin` 在 wire 上是
|
|
7176
|
+
**开集**(server 只判非空串,core 加词当天合法的帧就带着它到达),那一句真的会被走到。
|
|
7177
|
+
一套面一条规矩:闭集则收窄 + 围栏,开集则保留兜底。
|
|
7178
|
+
同批 `classifierStatusOf` 的第二参有了名字 `ClassifierRoundObservation`(三条合法入形:`{disposition}` /
|
|
7179
|
+
`{gate}` / `{origin}`,外加一个**故意**的索引签名让整只 wire 帧照样喂得进来)—— 端**不必**再为了过这只
|
|
7180
|
+
读器去铸一个假门记录。
|
|
7181
|
+
|
|
7182
|
+
**L-246**:`ENGINE_STOP_REASONS` 与 `engineStopReasonToCc()` 从壳**下沉包内**(CC 皮肤词汇表本来就该
|
|
7183
|
+
住在这里;住在壳里的后果是三端各抄一份五个词)。映射口是**三态**:`string`(映到 CC 词)/ `null`
|
|
7184
|
+
(映到**诚实缺席** —— `error`/`aborted` 在 CC 词表里没有对应词)/ `undefined`(**本端不认识这个词**)。
|
|
7185
|
+
🔴 `null` 与 `undefined` 合成一个值 ⇒ 引擎加第六个词那天会被渲成一次「这一轮没有 stop_reason」的**肯定
|
|
7186
|
+
事实**。另:`__proto__` 落键姿势从两份同形收成单源 `src/ownKey.ts` 的 `putOwnKey`。
|
|
7187
|
+
|
|
7188
|
+
### 33h. 🔴 三端换装清单(逐件坐标)
|
|
7189
|
+
|
|
7190
|
+
| 端 | 必改(编译期会红) | 建议改(行为面更诚实) |
|
|
7191
|
+
|---|---|---|
|
|
7192
|
+
| **cli** | ⓪ 壳内 seam shim(`seam/adapter/downstream/eventToSdkMessage.ts`)的 `turnEndUsage` 转出口:**签名不变、语义变**(`undefined` 现在等于「这一轮的账不知道」)—— 该文件今天零真实调用点(只有一处注释引用),所以是**零改**,但那句注释要跟着改口;① 旧名 `TERMINAL_STATUSES` / `TERMINAL_NOT_SUCCESS_STATUSES` 的 import(**无别名**);② `askFrameNotes.ts#ruleStoreUnreadableNote` 拿 `unknown` 喂 `ruleStoreUnreadableDetail` ⇒ 先过 `isRuleStoreUnreadableKind` 型守卫;③ `engineToolEndGuidance.ts#classifierDenyRow` 同理(`classifierDenyCauseOf` 已改出闭集成员型,通常零改);④ `classifierRoundObservation.ts` 喂 `classifierStatusOf` 的假门记录改成 `{disposition}` | ⑤ L-247 点名的手抄四词六处(`engineBgShellPanelStore` / `engineBgShellWatch` / `upstreamBridge` / `chrome-agentprogress` / `seamQuery` / `fleetDurableTerminalOverlay`)改**派生型** + `isTerminalNotSuccess()`;⑥ `printStreamJsonContract.ts#ENGINE_STOP_REASON_TO_CC` 自持表**让位**给包的 `engineStopReasonToCc`;⑦ `subagentUsageStore.ts` 的 `_sema_usage_lower_bound` 改用 `SEMA_SUBAGENT_USAGE_PARTIAL_KEY` + `subagentUsageIsPartial`;⑧ 丢帧告警面认 `turn_end_usage_absent`;⑧b 🔴 **别把 `response_metrics{phase:'end'}` 上缺席的 `outputTokens` 折成 0** —— 壳侧桥今天写的是 `e.outputTokens ?? 0`。本包**从不**发一条没有 `outputTokens` 的 `end`(两个铸点都传数),所以那条折叠今天走不到;但它与本批根治的病同形,而且它正是「包侧withhold 了占位零、端侧又把缺席补回 0」这条路唯一的入口 ⇒ 建议同批改成缺席即不喂;⑨ 卡面把 `axes.irreversible` 的缺席语义注释改口(33e);⑩ `waitForClaimRelease` 的文案层可改读 `lastHolder` |
|
|
7193
|
+
| **desktop** | 同 ①(若 import 过那两张表) | 同 ⑤⑧⑨;park 面板可接 `readWorkflowParks`(🔴 缺席 ≠ 空数组) |
|
|
7194
|
+
| **web-client** | 同 ①(若 import 过那两张表) | 同 ⑤⑧⑨;workflow 监视面可接 `readWorkflowParks` 与四拒码闭集;丢帧面板(`onDroppedFrame`,[C77]①)认新判词 |
|
|
7195
|
+
|
|
7196
|
+
### 33i. 黑盒判据(test 视角;wire 可观察,不引用内部实现)
|
|
7197
|
+
|
|
7198
|
+
> 口径同 §32:**以 `runStream` / 公面读器的输入输出为准**,不引用包内函数体;每一条都能用一段
|
|
7199
|
+
> `AgentEvent` 序列或一只通告对象复现。
|
|
7200
|
+
|
|
7201
|
+
- **G33-01**(S-1 正控):喂 `{type:'turn_end', usage:{六键真数}}` + `done` ⇒ 恰一条 `turn_usage`,
|
|
7202
|
+
带 `outputTokens` 与 `_sema_last_assistant_usage`;终帧上**没有** `_sema_usage_lower_bound`。
|
|
7203
|
+
- **G33-02**(S-1 六零形):喂 `{type:'turn_end', usage:{六个 0}, usageMissing:true}` ⇒ 恰一条
|
|
7204
|
+
`turn_usage`,**只带** `_sema_usage_missing:true`(`outputTokens` 与镜像两键**都不铸**)。
|
|
7205
|
+
- **G33-03**(S-1 🔴 违约):喂 `{type:'turn_end', usageMissing:true}`(**无 usage**)⇒ ① `turn_usage`
|
|
7206
|
+
**零条**;② 装了 `onDroppedFrame` 的宿主收到**恰一条** `{type:'turn_end', why:'turn_end_usage_absent'}`;
|
|
7207
|
+
③ 同一条流的终帧上 `_sema_usage_lower_bound === true`。
|
|
7208
|
+
- **G33-04**(S-1 反向):同一条流全是合法帧 ⇒ `onDroppedFrame` **零条**、终帧上那一位**不在场**。
|
|
7209
|
+
- **G33-05**(S-1 子代腿):子流(带 `parentToolCallId`)的违约帧同样零 `subagent_turn_usage` 臂,
|
|
7210
|
+
且该行仍进终帧分表(账不丢)。
|
|
7211
|
+
- **G33-05b**(S-1 占位零 vs 真读数,**五处同一条判据**):喂 `usage:{六个 0}, usageMissing:true` ⇒
|
|
7212
|
+
`turn_usage` 不带 `outputTokens`、分表行不带 `cacheReadTokens`、`RunStreamHandle` 保留上一次真读数
|
|
7213
|
+
并立 `latestUsageMissing`、整链末端**零** `response_metrics{phase:'end'}`、公面 `turnEndUsage` 答
|
|
7214
|
+
`undefined`;把同一格换成**非零**(`outputTokens: 42` / `cacheReadTokens: 100`)⇒ 五处**全部照交**
|
|
7215
|
+
(占位恒为 0,非零必是真读数)。
|
|
7216
|
+
- **G33-05c**(第五处的反向):同一条**占位帧**在 `runStream` 上**不是**违约帧 —— 零丢帧留痕,
|
|
7217
|
+
且照发一条只带 `_sema_usage_missing` 的 `turn_usage`(公面读器的收窄不许把合法帧读成违约)。
|
|
7218
|
+
- **G33-05d**(坏形 `usage`):`usage: null` / `7` / `'x'` / `[]` 各喂一帧后再喂 `done` ⇒
|
|
7219
|
+
① **终帧照样交付得出来**(流不断);② 恰一条丢帧留痕、零 `turn_usage`;③ 终帧立下界位;
|
|
7220
|
+
④ 公面 `turnEndUsage` 对这四形一律答 `undefined`(**与带不带 `usageMissing` 无关**),
|
|
7221
|
+
绝不映成一份「看起来已测量」的全零账。
|
|
7222
|
+
- **G33-05f**(模型轮边界与数字分家):`turn_usage{_sema_usage_missing}` 之后再来一轮
|
|
7223
|
+
`turn_usage{outputTokens:50}` ⇒ **两条** `response_metrics{start}`、**一条** `end`(值 50,缺账那轮
|
|
7224
|
+
不发假零);把缺账轮换成有数字的轮 ⇒ 两条 start、两条 end(反向对照)。另:缺账轮 + 终帧带
|
|
7225
|
+
**非零**账 ⇒ 补发腿**照补**那一发(边界动作不许顺手置「已发过 end」);终帧那一笔是占位零 ⇒ 仍零 end。
|
|
7226
|
+
- **G33-05e**(handle 的两件事分开):喂 `inputTokens:5` 再喂 `inputTokens:42 + usageMissing` ⇒
|
|
7227
|
+
两份读数**更新到 42**、`latestUsageMissing` **同时在场**;把第二帧换成占位六零 ⇒ 读数**停在 5**、
|
|
7228
|
+
判别位在场;首帧就是占位六零 ⇒ 两份读数缺席、判别位在场。
|
|
7229
|
+
- **G33-06**(S-2 分水岭):`TERMINAL_CAUSE_KINDS` 含 `paused` 不含 `killed`;`RUN_TERMINAL_STATUSES`
|
|
7230
|
+
含 `killed` 不含 `paused`;`isTerminalStatus('paused') === false` 且 `isTerminalCauseKind('killed') === false`。
|
|
7231
|
+
- **G33-07**(S-2 clean-cut):从包上读 `TERMINAL_STATUSES` / `TERMINAL_NOT_SUCCESS_STATUSES` ⇒
|
|
7232
|
+
**`undefined`**(无别名)。
|
|
7233
|
+
- **G33-08**(S-2 抄件):`TERMINAL_CAUSE_KINDS` 与实装 `@sema-agent/core` 的因由 kind 集**逐词等值且
|
|
7234
|
+
顺序同源**(集外词在三只谓词上一律 `false`,而 `false` 不是「成功」的证据)。
|
|
7235
|
+
- **G33-09**(S-3 ask):`{code:'delegation.ask_unresolvable', detail:{sessionId,toolName,toolCallId,
|
|
7236
|
+
cause:'approver_unavailable',parkLaneExisted:true}}` ⇒ 五格逐格读得出;把 `cause` 换成
|
|
7237
|
+
`settlementKind`(旧位)⇒ **整只缺席**。
|
|
7238
|
+
- **G33-10**(S-3 durable):`{code:'config.durable_gate_unavailable', detail:{…, source:'force_durable_gate',
|
|
7239
|
+
cause:'no_deployment_store'}}` ⇒ 读得出;`source` 换成陌生词 ⇒ 整只缺席;`cause` 换成陌生词 ⇒
|
|
7240
|
+
**原样透传**(两格方向相反)。
|
|
7241
|
+
- **G33-11**(S-3 两位布尔):`liveApprover` 缺席 ⇒ 键不铸;`liveApprover:false` ⇒ 键在场且为 `false`。
|
|
7242
|
+
- **G33-12**(S-4 凭据):`{parks:[{callKey,sessionId,originRunId,token:'SECRET'}]}` ⇒ 产物**整棵树**
|
|
7243
|
+
序列化后 `SECRET` 零命中,且行上恰三键;把 `token` 改名成任何别的键 ⇒ 同样零命中。
|
|
7244
|
+
- **G33-13**(S-4 缺席两义):`{}` ⇒ `undefined`;`{parks:[]}` ⇒ `[]`;两者**逐字可分**。
|
|
7245
|
+
- **G33-14**(S-4 坏行):`{parks:[好行, {只有 callKey}, null]}` ⇒ 只留好行;`{parks:[{只有 callKey}]}`
|
|
7246
|
+
⇒ **`undefined`**(不是 `[]`)。
|
|
7247
|
+
- **G33-15**(S-4 码):四个 `workflow.park_*` 码在 `isWorkflowParkRefusalCode` 上为 `true`;
|
|
7248
|
+
`workflow.park_<没登记的词>` 为 `false`(不靠前缀);`workflow.journal_incompatible` 为 `false`
|
|
7249
|
+
且它在上游**仍然存在**。
|
|
7250
|
+
- **G33-16**(S-6 heldBy):`get` 恒答 `{status:'suspended', heldBy:null}` ⇒ `released === true`;
|
|
7251
|
+
恒答 `{status:'suspended'}`(无 `heldBy`)⇒ 窗尽 `released === false`(老引擎零行为变化);
|
|
7252
|
+
恒答 `{status:'running', heldBy:'run-9'}` ⇒ `lastHolder === 'held'`。
|
|
7253
|
+
- **G33-17**(S-6 cancelRequested):`{cancelRequested:true}` ⇒ `true`;`{}` ⇒ `undefined`(不折 `false`);
|
|
7254
|
+
且一条 `{status:'running', cancelRequested:true}` 的 run 行**不构成**释放证据(窗尽仍 `released:false`)。
|
|
7255
|
+
- **G33-18**(S-7 L-245):`ruleStoreUnreadableDetail('store')` 与 `('call')` 两句**逐字互异**;
|
|
7256
|
+
`askOriginDetail('<陌生词>')` **仍然**渲出一句带那个词的兜底句(开集面一字未动)。
|
|
7257
|
+
- **G33-19**(S-7 L-246):`engineStopReasonToCc('stop') === 'end_turn'`、`('error') === null`、
|
|
7258
|
+
`('<第六个词>') === undefined` —— **三态互不相等**。
|
|
7259
|
+
- **G33-20**(S-8 码册):`engineNoticeInCatalog('config.artifact_host_invalid') === true` 且
|
|
7260
|
+
`noticeAudienceOf(…) === 'operator'`;`structuredDetailType({type:'artifact'})` 读得出。
|
|
7261
|
+
- **G33-21**(S-8 errClass):包的 `BrainRetryErrClass` 声明与实装 core 的同名联合**逐词等值**(含 `stall`);
|
|
7262
|
+
一条 `reconnecting` 的 `brain_status` 帧带 `detail` ⇒ `stalled` 读数上 `detail` **原样在场**(不截断);
|
|
7263
|
+
`detail` 缺席 / 空串 ⇒ 键不铸。
|
|
7264
|
+
|
|
7265
|
+
### 33j. 常驻门(本批新增两道 + 扩七道 + 一处枚举器补层)
|
|
7266
|
+
|
|
7267
|
+
| 门 | 守什么 |
|
|
7268
|
+
|---|---|
|
|
7269
|
+
| 🆕 `scripts/run-terminal-word-source-test.mjs` | S-2 两表分源:core 因由闭集双向等值 + 顺序同源 + 「为什么是抄件而不是 re-export」的**存活断言** + `killed`/`paused` 两格分水岭 + 旧名零别名 |
|
|
7270
|
+
| 🆕 `scripts/run-workflow-park-truth-projection-test.mjs` | S-4:🔴 凭据结构性不可达(投毒行整棵产物树零命中 + 换键名照样挡 + 源码级零 spread 反钉)+ 缺席两义 + 四拒码对 core 真字节直证 + `journal_incompatible` 仍活的反向钉 |
|
|
7271
|
+
| `scripts/run-assistant-arm-identity-test.mjs` | 扩 F 段:S-1 的六零形 / 违约形 / 响亮留痕 / 下界位四组(红先绿后的证据就在这一段) |
|
|
7272
|
+
| `scripts/run-subagent-usage-projection-test.mjs` | 扩 E/F 段:占位六零不当「零命中」读数 + 违约帧整帧收口 |
|
|
7273
|
+
| `scripts/run-engine-notice-catalog-test.mjs` | 扩 F 段:码册加员 + S-3 两只窄读器(闭集/开集两格方向相反 + 原型链投毒 + 读器按码分家) |
|
|
7274
|
+
| `scripts/run-selfheal-reopen-test.mjs` | 扩 G8④ 段:S-6 的 `heldBy` 三态 / 老引擎既有路 / `lastHolder` 与 `lastStatus` 同律 / `cancelRequested` 三态 |
|
|
7275
|
+
| `scripts/run-engine-vocab-floor-test.mjs` | 扩 G2-d 段:`BrainRetryErrClass` 对实装 core 双向等值(**此前这一族连门都没有**) |
|
|
7276
|
+
| `scripts/run-retired-vocabulary-census-test.mjs` | 登记 +1:`settlementKind`(src 代码位置零命中 + 上游存活断言) |
|
|
7277
|
+
| `scripts/run-client-core-pure-test.mjs` | 扩 B3-LB 段(S-1 的**消费链末端**):终帧补发腿的占位零过滤 / `runStream` → `adapt` **整链**三形 / 🔴 模型轮边界与数字分家(缺账轮之后下一轮照发 `start`;边界动作不置「已发过 end」)|
|
|
7278
|
+
| `scripts/run-client-core-singleton-test.mjs` | 🔴 **枚举器补层**:`Object.freeze([… ] as const)` 且**无类型注解**的写法此前**整类**不进模块级单例普查(初值是属性访问调用 ⇒ 工厂判据不认;没有注解 ⇒ 注解路走不到)。补层当天在 `src/` 里实捞出 **5 条存量**(`peerFrames` ×4 / `subagentContentStore` ×1)—— 它们不是新风险,是本来就该在册而一直隐身的;自检语料同批加两条已知判决 |
|
|
7279
|
+
|
|
7280
|
+
---
|
|
7281
|
+
|
|
7282
|
+
### §33z 逐键处置表(本批合同的**每一行**在本包的落点)
|
|
7283
|
+
|
|
7284
|
+
> 口径与 §32z 一致:`consumed`(+ `文件#符号` 坐标)/ `declined`(+ 理由)/ `n-a`(+ 理由)/
|
|
7285
|
+
> `pending`(+ 票)。**这张表是下游抄 `wire-consumption-manifest` 的母本**。
|
|
7286
|
+
> 🔴 `n-a` 的每一行都带 grep 证,不是「看起来没关系」。
|
|
7287
|
+
|
|
7288
|
+
#### ① core 7.17.0([7067])
|
|
7289
|
+
|
|
7290
|
+
| # | 键 / 面 | 处置 | 坐标 / 理由 |
|
|
7291
|
+
|---|---|---|---|
|
|
7292
|
+
| 1 | `turn_end.usage` **恒在场**(#711) | **consumed**(🔴 BREAKING) | `src/adapter/runStream.ts` 的 `turn_end` 违约闸 + 三处条件判退役;`src/adapter/types.ts` 的 `#DroppedFrameInfo` 的判词开集 +1 |
|
|
7293
|
+
| 2 | 终态词闭集 = `TerminalCause["kind"]` 四词(cli L-247 顺答) | **consumed**(🔴 BREAKING) | `src/runTerminal.ts` 的 `#TERMINAL_CAUSE_KINDS` / `#RUN_TERMINAL_STATUSES` / `#RUN_TERMINAL_NOT_SUCCESS_STATUSES` 三表分源 + 派生型;门 `run-terminal-word-source-test.mjs` |
|
|
7294
|
+
| 3 | `delegation.ask_unresolvable` `detail.cause`(#709 ②) | **consumed**(🔴 BREAKING) | `src/engineNoticeCodes.ts` 的 `#ASK_UNRESOLVABLE_CAUSES` / `#readAskUnresolvable`;旧位 `settlementKind` 进退役普查 |
|
|
7295
|
+
| 4 | `config.durable_gate_unavailable` `detail.source`(#709 ①) | **consumed** | `src/engineNoticeCodes.ts` 的 `#DURABLE_MANDATE_SOURCES` / `#readDurableGateUnavailable` |
|
|
7296
|
+
| 5 | `WorkflowRun.parks`(#652 三义务) | **consumed** | `src/workflowClient.ts` 的 `#readWorkflowParks`(三键逐键挑,凭据结构性不可达);门 `run-workflow-park-truth-projection-test.mjs` |
|
|
7297
|
+
| 6 | `workflow.park_requires_run_store` / `park_truth_unreadable` / `park_not_pending` / `park_binding_broken` 四新码 | **consumed** | `src/engineErrorCodes.ts` 的 `#WORKFLOW_PARK_REFUSAL_CODES` / `#isWorkflowParkRefusalCode` |
|
|
7298
|
+
| 7 | `journal_incompatible` 的「journal entry missing」臂退役 | **n-a** | 本包**从不读**这个码。grep 证:`src/` **代码位置**(剥注释后)**0 命中** —— 两处命中都在 `src/engineErrorCodes.ts` 的**注释**里,那正是 §33d 那条「它仍活着」的说明。🔴 那个**码本身仍活着**(门里有反向钉),退役的只是它的一条臂 |
|
|
7299
|
+
| 8 | `riskDescriptor.axes.irreversible`(#713) | **n-a** | 卡上那格 `risk` 子树由**端**铸;`ApprovalCardRequest` 上**没有 `risk` 这一位**。grep 证:`src/` 全树 `safetyAxis` **0 命中**;`axes` 的两处命中都是别处散文(`ultracodeWireCaps.ts` / `permissionWireCaps.ts` 里的 "orthogonal axes"),与卡面无关。三端注释改口见 §33e |
|
|
7300
|
+
| 9 | 码册 +1 `config.artifact_host_invalid` | **consumed** | `src/engineNoticeCodes.ts` 的 `#ENGINE_NOTICE_CODES` / `#ENGINE_NOTICE_AUDIENCE`(operator 行) |
|
|
7301
|
+
| 10 | structured 卡型 +1 `artifact` | **consumed** | `src/toolResult.ts` 的 `#STRUCTURED_DETAIL_TYPES`;门 `run-engine-vocab-floor-test.mjs` ⑤ 段当天红抓出 |
|
|
7302
|
+
| 11 | `tool_end.errorCode` `artifact.*` 七码 | **n-a** | `errorCode` 在本包是**开集透传**(`src/engineErrorCodes.ts` 顶注的开集纪律):认不得的码原样过境 + 落诚实兜底臂,不需要为这七个码加识别表。且它们仅在宿主接了 `artifactHost` 时可达 |
|
|
7303
|
+
| 12 | `permission.sandbox_admitted`(#715) | **n-a** | 本包不投影 `permission.*` 观察者载荷(读的是 `tool_end.gate`)。grep 证:`src/` 全树 `sandbox_admitted` **0 命中** |
|
|
7304
|
+
| 13 | `ToolExecuteContext` ctx 四键退役 / `RunWorkflowToolDeps` 两键退役 / `CheckpointState.pendingSteer` / `RunnerDeps.legacyRewindBoundaryProbe` / `RunnerDeps.microCompact.machine` / 规则店文件 schema / 路径家族签名 / `ContextEditOptions` 两键 | **n-a**(八行) | 全部是**引擎内部装配面**(`RunnerDeps` / `ToolExecuteContext` / core 内部 store),本包是响应面客户端库,一个都不铸。grep 证:`src/` 全树 `parentSpecSeat` / `legacyRewindBoundaryProbe` / `microCompact` / `pendingSteer` / `canonicalizeTarget` / `recognizeCcMarkers` **各 0 命中** |
|
|
7305
|
+
| 14 | 进程级数字旋钮台词(#708) | **n-a** | 引擎自己的 `announceEnvKnob` 出口(部署侧 env 解析),不上 wire 到本包。grep 证:`src/` 全树 `announceEnvKnob` **0 命中** |
|
|
7306
|
+
| 15 | #714 家目录读(默认档一次 mandated ask)/ #717 b `legacyBlocks`→`blocks` | **n-a** | 前者是**引擎行为**变化(卡上读的仍是既有的 `ruleOffersAbsence` 三态,本包读法一字未改);后者 [7025] 已定谳零读者。grep 证:`src/` 全树 `legacyBlocks` **0 命中** |
|
|
7307
|
+
|
|
7308
|
+
#### ② core 7.17.1([7109])
|
|
7309
|
+
|
|
7310
|
+
| # | 键 / 面 | 处置 | 坐标 / 理由 |
|
|
7311
|
+
|---|---|---|---|
|
|
7312
|
+
| 1 | @client-core 整段 **n/a**(上游自答:无 wire 帧形变、无闭集移动) | **n-a** | 提货单原文逐字。本包按 devDep 抬到 `~7.17.1` 对账,`run-engine-notice-catalog` / `run-engine-vocab-floor` / `run-terminal-word-source` 三门对**实装 7.17.1** 求值 |
|
|
7313
|
+
| 2 | `CompoundReadonlyVerdict.refusedWhole` / `RunInternals.workflowParkedResume[].outcome?` / 写守卫 deny 收窄 / `physicalPathOf` 两导出 | **n-a**(四行) | 全部是**引擎/服务端内部型面**。grep 证:`src/` 全树 `refusedWhole` / `workflowParkedResume` / `physicalPathOf` **各 0 命中** |
|
|
7314
|
+
| 3 | `WorkflowRun.errorCode` → 轮询 `details.errorCode`(#724 additive) | **pending**(cli L-235;与 §32z ①-4 同一票) | 本包到不了它的两条腿在 §32z ①-4 已逐字节核过,7.17.1 这一版**没有改变**那两条腿 |
|
|
7315
|
+
| 4 | `turn_end.usageMissing` 语义不变 / `TaskResult.stats.usageMissing` 同律(#722) | **consumed**(零改) | `src/adapter/downstream/terminalToSdkResult.ts` 的 `#readRunCostFacts` 的两源取并一字未动(0.67.1 / B-091 的形) |
|
|
7316
|
+
|
|
7317
|
+
#### ③ server 7.74.0 wire 变更清单([7084] D 段,点名 @client-core)
|
|
7318
|
+
|
|
7319
|
+
| # | 键 / 面 | 处置 | 坐标 / 理由 |
|
|
7320
|
+
|---|---|---|---|
|
|
7321
|
+
| 1 | 读面收窄(剥凭据):`parks[]` 三键、无 `token` | **consumed** | 同 ①-5。🔴 本包**此前零 park 凭据读点**(grep 证:`src/workflowClient.ts` 里 `token` 的全部命中只有 `stats.tokens` 计数与 SSE 的 `authToken`,与 park 赎回凭据无关),本批新加的读器从一开始就是三键逐键挑 |
|
|
7322
|
+
| 2 | `delegation.ask_unresolvable` `detail.cause` / `config.durable_gate_unavailable` `+detail.source` | **consumed** | 同 ①-3 / ①-4 |
|
|
7323
|
+
| 3 | `card.risk.irreversible` 在 off 车道恒在场 | **n-a** | 同 ①-8 |
|
|
7324
|
+
| 4 | `turn_end.usage` 恒在场 | **consumed** | 同 ①-1 |
|
|
7325
|
+
| 5 | `workflow.park_*` 四新码 / `journal_incompatible` ordinal −1 臂退役 | **consumed** / **n-a** | 同 ①-6 / ①-7 |
|
|
7326
|
+
| 6 | 持久数据面三条硬 breaking(`checkpoint.pending_steer_seat_retired` 拒启码 / `one_time_migrations_applied` 启动日志 / `snapshot_manifest`·`pending_steer` 列删) | **n-a**(三行) | 全部是 server **运维面**(启动期迁移与拒启),不上 wire 到客户端库。grep 证:`src/` 全树 `pending_steer` / `one_time_migrations_applied` / `snapshot_manifest` **各 0 命中** |
|
|
7327
|
+
| 7 | 脱敏:含 `sk-`/`ghp_`/`xox…`/`AKIA…` 子串的路径不再被吃 | **n-a** | server 侧脱敏器的行为修复;本包不做脱敏(它收到的已是脱敏后的字节),也不对路径做任何值级判断 |
|
|
7328
|
+
| 8 | 测试基座(InnoDB 夹具 / `db-lane.mjs` 暖库) | **n-a** | 明示「不上 wire」 |
|
|
7329
|
+
|
|
7330
|
+
#### ④ 本包自提件(票驱动,非上游合同行)
|
|
7331
|
+
|
|
7332
|
+
| # | 件 | 处置 | 坐标 / 理由 |
|
|
7333
|
+
|---|---|---|---|
|
|
7334
|
+
| 1 | L-230 `heldBy` / `cancelRequested` 读点 | **consumed** | `src/adapter/activeRunSelfHeal.ts` 的 `#DurableRunRecordView` / `#readClaimHolder`(私有)/ `#readCancelRequested` / `#waitForClaimRelease` 的两条释放证据取并 / `ClaimReleaseVerdict.lastHolder` |
|
|
7335
|
+
| 2 | L-230 P-44 `Checkpoint.rev` | **n-a** | 票上已**撤回**(cli 不把 `checkpointId` 送上 wire)。grep 证:`src/` 全树 `expectedRev` **0 命中** |
|
|
7336
|
+
| 3 | L-244 子代下界位分名 | **consumed**(包侧半场) | `src/adapter/downstream/terminalToSdkResult.ts` 的 `#SEMA_SUBAGENT_USAGE_PARTIAL_KEY` / `#subagentUsageIsPartial`;台账 `docs/type-superset.json` +1 行。壳侧 store 让位随 cli 1.0.110 |
|
|
7337
|
+
| 4 | L-245 闭集面收窄 + 观测型具名 | **consumed** | `src/autoModeUnavailable.ts` 的 `#ClassifierDenyCause` / `src/gateVocabulary.ts` 的 `#RuleStoreUnreadableKind` / `src/classifierStatus.ts` 的 `#ClassifierRoundObservation` |
|
|
7338
|
+
| 5 | L-245 A10 `deniedSource` 配对三处 / A8 `AUTO_MODE_UNAVAILABLE_CAUSES` 退役 | **declined**(本批不做,理由在票上) | A10 的三处里**两处在壳**(`wiringManifestStore` 重投 / 再判),包侧铸点(`eventToSdkMessage#projectAutoModeSection`)已是唯一判据且段内自洽 ⇒ 壳直接消费包型即可,包侧**无可改**;A8 那张表在本包仍是**公面导出**且 §32 已如实登记「无投影臂路径」,整只退役是一次公面删除(BREAKING),与本批的三件 BREAKING 无关联、不搭车 —— 单独立项更安全 |
|
|
7339
|
+
| 6 | L-246 A13 停止原词表下沉 / B2 `putOwn` 合一 | **consumed** | `src/engineErrorCodes.ts` 的 `#ENGINE_STOP_REASONS` / `#engineStopReasonToCc`;`src/ownKey.ts` 的 `#putOwnKey`(两处同形合一) |
|
|
7340
|
+
| 7 | L-246 其余九件(A5/A6/A7/A12/B3/B4/B5/B7/B9) | **declined**(本批不做) | 逐条:A5 / A6 / A12 / B4 / B5 / B7 的坐标**全在壳**(`engineAgentView` / `upstreamBridge` / `runCostReconcileStore` / `askFrameNotes` / `printStreamJsonContract` / `lastTurnUsageStore`),包侧无落点;A7 是 manifest 登记口径(改 `n/a`),归 cli 的 manifest;B3 `usageLowerBoundOf` 两算已在 0.67.1 / B-091 收成一只(票文是那次修之前的快照);B9 放宽 `LaneProof.subagent` 是**三端 BREAKING**(宿主今天按 `parentToolCallId: string` 读),本批的三件 BREAKING 已经够端消化一轮,再叠一件会让换装清单失焦 —— 留给下一个 BREAKING 窗 |
|
|
7341
|
+
| 8 | L-246 `BrainRetryErrClass` 补 `stall` + `stalled` 臂透传 `detail` | **consumed** | `src/retryStatus.ts` 的 `#BrainRetryErrClass` 七桶 + `RetryStatus` 的 `stalled` 臂 `detail?`;门 `run-engine-vocab-floor-test.mjs` G2-d(**此前这一族连门都没有**) |
|
|
7342
|
+
| 9 | S-8 其余七件(`skillCommandsToSpecs` 候选面 / `classifierStreakOf` 连败面 / `fetchDelegatedPrompt` 在飞记号 / `registerOutstandingBgTask` 订阅事件 / 交互 run steer 座 / `pathNotInRootRow` 措辞铸点) | **declined**(本批不做,逐条理由) | 它们都是**新能力面**(新公面 + 新行为 + 各自的门三件),而本批已经带着三件 🔴 BREAKING 与一次引擎地板抬升 —— 把新能力与 BREAKING 混在一版,端的换装清单会分不出「必须改」与「可以接」。🔴 另有两件带**上游前提**:`classifierStreakOf` 的到货形依赖 core #742(7.18.0 才有 `GateDisposition.classifier` 三键与 `auto.classifier_fallback` 通告码,见 L-260),现在铸会铸出一个上游还没定形的读法;`registerOutstandingBgTask` 发订阅事件牵动通知链的时序(本包最容易出跨流串账的一族)。⇒ 整体**改期**,与下一批非 BREAKING 的内容批同发 |
|
|
7343
|
+
|
|
7344
|
+
---
|