@sema-agent/client-core 0.83.3 → 0.83.5

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 CHANGED
@@ -49,6 +49,147 @@
49
49
  > 挡住 ⇒ 本批把它机械化——④a0 对 `pending` 行**要求段头已是日期形**(`(未发布)` 直接红),阶段一
50
50
  > commit 漏转在发布前就红,不再靠人记。
51
51
 
52
+ ## 0.83.5(2026-09-27)
53
+
54
+ > 主题:patch —— 展示层出口一族、凭据读法、hooks 启动模式与去重、自愈行措辞四组同发,另有一批接入指引订正与门的稳定性改造。① `displayUntrusted` 三件(CC-204):零宽连接符 ZWJ / ZWNJ **按语境判**(🔴 默认形输出字节变:只在 emoji 连字与连写 / 印度系文字里原样,其余按所选标记形标出来);两只**可选**开关 `escapeBackslashes`(字面反斜杠成对,转义形解码唯一)与 `blanks`(名字位上「像空白」的非 ASCII 码位在折平之前标出来);新读口 `displayUntrustedMarks` 同一份文本另报每一枚字符面标记的位置。② 凭据两网的判别视图把原字孤代理项与格式字符同处置(CC-207):标签与值之间夹一枚时,机读字节(结果帧 `errors[]`、合成终局行)此前洗不到值。③ 凭据读法的存量缺陷一批(🔴 默认形输出字节变):控制符转义记号紧跟另一枚记号时凭据再扫不再吃掉半枚(0.83.3 起)及配套的序列读法;URL 片段后接非 ASCII 空白与标签 / 方案词时在空白处断;谚文填充 / 盲文空点在词级网里当空白;值开头是引号 / 转义反斜杠包着的里层标签时让里层去认 —— 对 0.83.4 发布产物的差分随机语料上「0.83.4 遮住、本版露出」计数为 0。④ hooks:宿主报了启动模式(新可选读口 `SettingsPort.hooksStartupMode()`,或插件读数上已有的位)时,安全模式与 bare 模式下发往引擎的设置来源 hooks 都只剩 managed(CC-200);设置来源里同一条 hook 只发一份(CC-208)。⑤ 自愈腿三条重发结局 +1 可选位 `releaseConfirmedByEngine`,上屏行按释放证据分说:只凭终态词判释放时不再说「引擎确认已交出」(CC-212)。默认形仍幂等 —— 一个函数同时单射又幂等只能是恒等,所以单射只做成开关。根公面运行期导出 1277 → 1278(+1:`displayUntrustedMarks`);公面类型 +3(`DisplayMarkSpan` / `DisplayUntrustedMarked` / `HooksStartupMode`);`DisplayUntrustedOptions` +2 可选位;`SettingsPort` +1 可选成员;`SelfHealOutcome` 三条重发结局臂各 +1 可选位;零投影臂;peer sdk 地板 `>=11.3.0` 不动。
55
+
56
+ ### Added
57
+
58
+ - **`displayUntrustedMarks(text, opts?)`** ⇒ `{ text, marks }`(型 `DisplayUntrustedMarked`;`marks` 的元素型 `DisplayMarkSpan` = `{ start, end, codePoint }`)(CC-204)。`text` 与同选项的 `displayUntrusted(text, opts)` 逐字节相同;`marks` 是 `text` 里每一枚字符面标记的 UTF-16 区间,升序、不重叠,`text.slice(start, end)` 就是码位 `codePoint` 的标记形(可见转义 `\uXXXX` / `\u{X}`、`.` 或空格)。宿主可以按样式区分标记,不必靠文字约定。不进 `marks` 的:凭据记号(`«redacted:…»`,闭形可认,另一类)、成对的字面反斜杠、原样放行的 RGI 地区旗与连接符。空格形里一串被行折平并成一个空格时报一枚(码位取串里第一枚被标的);被封长截掉、被去首尾、被凭据记号吞掉的标记不报,也不会报半枚。
59
+ - **`DisplayUntrustedOptions.escapeBackslashes?: boolean`**(默认关;只在 `mark` 为 `escape` 时生效,点形 / 空格形忽略;CC-204):输入里的每个字面反斜杠画成两枚,危险码位照旧画成 `\uXXXX` / `\u{X}` ⇒ 输出里每个「反斜杠 + u」都是标记、每个字面反斜杠都成对,按「`\\` → `\`、`\uXXXX` / `\u{X}` → 码位」解码唯一:真 U+2060 画成 `⁠`,字面六字符 `⁠` 画成 `\\u2060`。只管字符面 —— 凭据记号与行折平本来就有损(要完整往返用 `foldLines: false` 并关掉两张凭据网)。成对只在管线收尾做一次(凭据与字符面照旧洗到不动点,与默认形同一条管线),所以输入里没有反斜杠时输出与默认转义形逐字节相同。🔴 开着时**不幂等**(再过一遍会把反斜杠再翻一倍)⇒ 只在最终呈现处调一次,不要把它的输出再喂回出口。封长量的是成对之后的长度(字面反斜杠算两位),截点不劈成对反斜杠、不劈标记、不劈代理对。
60
+ - **`DisplayUntrustedOptions.blanks?: boolean`**(默认关;CC-204):看起来是空白、但不是 ASCII 空格的码位 —— 不换行空格 U+00A0、欧甘空格 U+1680、U+2000–U+200A 各宽空格、窄不换行空格 U+202F、数学中空格 U+205F、表意空格 U+3000(空格类 Zs 除 U+0020 外全部),以及渲成空白的谚文填充 U+115F / U+1160 / U+3164 / U+FFA0 与盲文空点 U+2800 —— 在行折平之前按所选标记形标出来,不再被并成一个空格、不被去首尾。给工具名 / 模型名 / 标识符这类「两个不同的名字不许画成一样」的载体;散文载体别开(不换行空格在不少语言里是正当排版)。ASCII 空格、制表与换行照常折平。开着时凭据两网的读法见 Changed「判别视图」一条。
61
+ - **`SettingsPort.hooksStartupMode?(): HooksStartupMode | undefined`**(新增可选成员)与导出型 **`HooksStartupMode = 'safe' | 'bare'`**(CC-200):宿主运行在哪种启动模式。两种模式都开时报 `'bare'`(上游对 hooks 的判定同序:bare 胜)。两个词本版同处置(只发 managed);宿主照实报哪一种,以后 bare 的处置细化时不用改宿主。
62
+ - 只认这两个词;不实现 / 返回 `undefined` = 不在这两种模式(与插件读数上那一位「缺席 = 都不是」同一句),不收窄、不告警;返回别的值(`true`、`'true'`、别的串、`null`……)或抛错 ⇒ 同样不收窄,记一行调试。写成属性而不是方法(`hooksStartupMode: 'safe'`)⇒ 同样不收窄(接口是方法),也记一行调试(点名它不是方法)。
63
+ - 它独立于插件读口:插件读口是可选的、读失败整段 `failed`,不传计划的调用也不读插件口 —— 设置来源的收窄不跟着它缺席。
64
+ - 与插件读数上 `suppressedByStartupMode` 的关系:词读口报了合法的词 ⇒ 以词为准(词 `'bare'` 而那一位为真 ⇒ bare);词读口没报出合法的词、那一位为真(传了计划时)⇒ 按安全模式处置(那一位分不出两种模式,保守保留 managed)。
65
+ - 一轮至多读一次;整条 hooks 已经被治理关掉(未受信工作区、managed `disableAllHooks`、managed 读取抛错)时不读。接入文档 **§105 SM-2**。
66
+ - **`SelfHealOutcome` 三条重发结局 +1 可选位 `releaseConfirmedByEngine?: true`**(`running-cancelled` / `stale-park-cancelled` / `ask-decided-without-card`;CC-212):释放是引擎**直说**的(`GET /v1/runs/:id` 回 `heldBy: null`)时严格 `true` 在场;只凭终态词判的释放(引擎不发 `heldBy`,或 `heldBy` 仍非空而状态已是终态词)时**缺席**,从不为 `false`。证据在结局对象的键上,复制 / 序列化不丢。处置(`selfHealSubmissionDisposition` 仍为 `resending`)不按它分。接入文档 **§105 CS-1**。
67
+
68
+ ### Changed
69
+
70
+ - 🔴 **ZWJ / ZWNJ 按语境判**(CC-204;`bidi` 一网开着时,默认开):只在两类语境里原样 ——
71
+ 语境按**簇的基字**判:连接符左侧跨过组合符(含变体选择符、virama、nukta、元音符号)与 emoji 肤色修饰回到基字,右侧同理取下一簇的基字。
72
+ ① emoji 连字:ZWJ 左侧的基字与紧后一码点都是**按 emoji 呈现**的象形字(RGI 的 ZWJ 序列:家族、职业带肤色、彩虹旗、心火、海盗旗、发色 … 都是这一形)。按 emoji 呈现 = 默认就是 emoji 呈现(`\p{Emoji_Presentation}`),或紧后一码点是 U+FE0F / 肤色修饰;`©`、`™` 这类默认按文字呈现的象形字之间的 ZWJ 照标(`❤` + U+FE0F + ZWJ + 🔥 原样)。右侧看的是紧邻码点(不跨组合符):ZWJ 后先来一枚组合符(🔥 + ZWJ + U+0301 + 🔥)不是 RGI 形,标;
73
+ ② 连接文字:两侧的基字都是**字母**,且文字(Script_Extensions)都在连写文字(阿拉伯、叙利亚、蒙古、N'Ko、阿德拉姆 …)或印度系 Brahmic 与东南亚、藏文字清单里(清单见接入文档 §105a-1);文字属性是通用 / 继承的修饰字母(U+02BC 修饰字母撇号、阿拉伯 tatweel U+0640 …)不算 —— 它们跨文字共用,Script_Extensions 虽带着清单内的文字,却不提供哪一种文字的连写语境(`x` + U+02BC + ZWJ + U+02BC + `y` 照标);
74
+ ③ 旧编码的 chillu / khanda-ta:ZWJ 紧跟在 virama 之后、virama 前的基字是清单文字的字母 ⇒ 后面没有字母(词尾)也原样(马拉雅拉姆 U+0D28 U+0D4D + ZWJ、孟加拉 U+09A4 U+09CD + ZWJ 是 Unicode 5.1 之前的合法写法;virama 取清单内文字的 63 枚,见 §105a-1)。
75
+ 其余 —— 拉丁 / 西里尔 / 希腊 / 汉字 / 假名 / 谚文 / 希伯来 … 字母旁、数字与标点旁、串首串尾、孤立、连着两枚、emoji 与字母之间 —— 按所选标记形标出来(可见转义 `‍` / `.` / 空格)。不按紧邻码点判,是因为通用组合符的 Script_Extensions 会带上清单内的文字(U+0301 带德宏傣文、U+0308 带叙利亚文):只看紧邻码点的话,`a` + U+0301 + ZWJ + U+0301 + `b`、`a` + U+0308 + ZWJ + 阿拉伯字母、`a` + U+FE0F + ZWJ + emoji 都会被放行;数字 / 标点(天城数字 U+0969、danda U+0964、阿拉伯逗号 U+060C)不提供文字语境。RGI 地区旗照旧整串放行。整串线性(每枚连接符向两侧各跨一串组合符)。
76
+ 射程:`displayUntrusted` 默认形与一切开着 `bidi` 的形;本包内经这只出口的文本同样变 —— 审批回决备注(`readDecisionNoteAudit` / `decisionNoteAuditLine`,空格形)、子代续跑收据(`resumeSettledSubagent`,点形)、开机「不会执行」清单的插件名 / 事件名(`hooksNotRunNotice`)、设置来源 hooks 不上请求体的一次性告警里的事件名、后台子代缺席行里的名字 / 状态 / 回收原因。不变:`escapeDisplayControlChars` / `collapseLabel` / `capForDisplay`、同伴署名规范化、hook 故障横幅(旧集本来就不含格式类整类,逐字节保持);凭据两网的判定。接入文档 **§105 U-1 / U-2**。
77
+ - 🔴 **转义记号在凭据再扫里是原子的**(存量缺陷修复,0.83.3 起;默认形输出字节变):一段转义序列(ESC / C1 序列头,可隔参数 / 中间字节,如 `ESC [`、`ESC (`、`ESC` + 空格)之后紧跟一枚转义记号(ESC 后接 U+2060 / U+200B / DEL / 又一枚 ESC …,画出来是 `\u001B⁠` 这类)时,凭据两网的判别视图此前把 `\u001B` 与下一枚开头的反斜杠读成一段 ESC-ST 序列,下一枚剩下的十六进制尾巴被当成「值」换成凭据记号 —— 默认形留下 `Basic\u001B\«redacted:secret»` 这种「反斜杠 + 记号」的误导形,`max` 截在那里时留一枚串尾孤反斜杠,`escapeBackslashes` 开着时留一枚不成对的反斜杠、那一枚标记也不在 `displayUntrustedMarks` 里。本版起转义序列的终字 / 串结尾(ST)不取下一枚转义记号的反斜杠:每一枚记号在判别视图里是一个整单元,凭据遮盖要么整枚吞下它、要么整枚不碰。`'Basic'` + ESC + U+2060 ⇒ `Basic\u001B⁠`(`max: 12` ⇒ `Basic\u001B`);`'token: '` + ESC + U+200B + 值 ⇒ `token: \u001B​«redacted:secret»`(开关开同)。凭据判定不变(值照洗)。原子只认本出口会写出、判别视图会整枚剥的那一类:小写 `\u` + 四位十六进制 / `\u{…}`(十六进制任意大小写)且解码后落在字符面会标的码位上(`blanks` 开着、读回空白的那一种读法里另加名字位空白的转义形);大写 `\U`、码位不在字符面里的同形串(`\`、`A` 这类本出口从来不写)照旧是普通字面,序列的终字可以取它们的反斜杠(与 0.83.4 同读)。随原子一起改的读法(原子化之后有几类输入一度比 0.83.4 少遮,本版一并收口):① 没收尾的 CSI / nF 前缀(`ESC [` + 参数 + 中间字节、`ESC` + 至少一枚中间字节,原字与转义形同判)在终字之前撞上下一枚可剥单元(ESC、C1、控制符、格式字符、孤代理项、原子记号)、非法终字或串尾 ⇒ 前缀整段是一个单元(终端就是这么吞的;此前只剥 ESC,留下的 `[` / `(` / `;` 当停字符把值截断 —— `api_key: ` + ESC + `[` + ESC + 值);② 序列的终字恰是已知凭据字面形的首字(`ESC [` + `sk-…`、ESC + `AKIA…`、C1 CSI + `ghp_…`、`ESC (` + JWT;与散文里不带标签的字面形同一张判据表)时,「终字留在屏上」那一种读法也认它(此前首字被当终字吞掉,余下的 `k-…` 不再是字面形 —— 这一形 0.83.4 同样原样上屏);终字是反斜杠且后接引号时同样另读一遍(终端吞掉反斜杠,那枚引号就成了没转义的收尾引号,值在那里截断);③ 序列从不把 `@` 当终字(`ESC @`、`CSI @`):它是 userinfo 的定界符(`https://u:<口令>` + ESC + ESC + `@host`)。另两处:`blanks` 开着、读回空白的那一种读法里,名字位空白(原字或它的转义形)在序列里与 ASCII 空格同判为中间字节(开关关时字符面先把它折成空格,再洗一遍时序列就是这么读的);用户名一段整个是被剥的单元、紧贴冒号(`<孤代理项>:<口令>@host`)时,占位串算用户名(userinfo 整段遮)。对 0.83.4 发布产物跑差分随机语料(转义记号 / 控制符人造池、ANSI 与不可见字符现实池、孤代理项 / 连接符池、序列头紧贴凭据字面形的定向池):0.83.4 遮住而本版露出的计数为 0(计数与种子见 §105a′「不变」一条)。接入文档 **§105 V-1**。
78
+ - 🔴 **机读字节的凭据洗消在标签与值之间夹孤代理项时也洗到**(CC-207):凭据两网的判别视图此前把格式字符、非空白控制符与本出口铸的转义记号当可剥单元,**原字**孤代理项(配不成对的 U+D800–U+DFFF)却当普通字 —— `token` + U+D800 + `: <值>`、`api_key` + U+DC00 + `=<值>`、`Bearer` + U+D800 + `<值>`、把标签切成两半的 `to` + U+D800 + `ken: <值>` 这类形,结果帧 `errors[]` 与合成终局行(两条车道)原样带出值;`displayUntrusted` 默认形靠第二轮看见字符面铸的 `\uD800` 记号才洗到,字符面全关的形洗不到。本版起孤代理项与格式字符同处置(两种视图里都是可剥单元,命中映回原文遮盖),机读口、呈前出口(一轮即洗到)与标记位置读口同批。凭据之外的孤代理项逐字节不动(机读口不做字符面)。随之而来的同形变化:孤代理项此前被当普通字粘进一只值或 userinfo,偶尔把邻近的非凭据文字一起遮掉;现在它与零宽空格一样是单元,userinfo 的左界停在它那里,值是 `scheme://` 形时按地址豁免(与格式字符在同一位置时逐字节同,门对 4000 条随机串同位核)。这一同形变化不全是多遮:userinfo 后无主机 / 方案词后的地址豁免两形里,0.83.4 顺带遮住的是凭据本身,本版与零宽空格同位一样露出(KL-143)。接入文档 **§105 W-1**。
79
+ - 判别视图:`blanks` 开着时,凭据两网对名字位空白的转义记号(` ` 这类六个字符)取两种读法、各洗一遍:先按字面(六个字符原样,与开关关时同判,但整枚一起映回 —— 遮盖要么整枚吞下它、要么整枚留在外面),再读回原字(空白;与第一遍看见的同形,标签与值之间那一枚标记留在记号外)。字面写出的同形串与本出口铸的分不开(默认形只承诺幂等),两种读法都跑才既不削弱凭据网、又幂等;记号在两种读法里都整枚进出,不会被吃半枚。字面读法里,标签之后、值开头的那一枚在**判型**上透明(它在屏上是空白 —— 开关开时字符面把真 NBSP 画成的正是它):之后那一段为空、是里层标签 / 方案词、诊断词、点名(`keys:` 后的键名、`tokens:` 后的整数、反引号里的凭据变量名)、`Authorization` 的方案词 ⇒ 不遮(与开关关时同答:`password:` + NBSP + `missing`、`token=` + NBSP、`token=` + NBSP + `token=` + NBSP 都不出记号);其余照开关关时的字面读法判(含地址形的判法),遮盖连同那一枚整枚进出。另两种读法补「开关关时字符面先把空白折成空格」那一层:行折平开着时加**折平读法**(会被折平的名字位空白 —— NBSP、各宽空格、表意空格 —— 连同它们的转义形读成一个 ASCII 空格;谚文填充 / 盲文空点开关关时原样留着,读回原字),文本里同时有这两类时再加**折平 + 字面读法**(会被折平的读成空格、另一类的转义形按字面)。几种读法各在同一份输入上洗、遮盖区间映回原文取并再一次换成记号 —— 不接力(前一种读法铸的小记号会拆掉后一种读法要认的大形)。由此开关开遮住的 ⊇ 开关关遮住的(转义形、反斜杠成对、折平关三对;例外两类见 KL-150 / KL-151):`ESC (` + U+3000 + 字面反斜杠 + `ghp_…` 开着时与开关关同答(开关关时 U+3000 折成空格、是 nF 的中间字节,序列吃掉的是反斜杠)。随之:开关开着时「userinfo 中间夹一枚名字位空白」的形(`db user:pa` + NBSP + `ss@db.internal`,或字面写出的 ` `)按 userinfo 遮(开关关时真 NBSP 被折成空格,不遮)。开关关着时判别视图逐字节不变。接入文档 **§105 B-1**。
80
+ - 🔴 **URL 片段后接非 ASCII 空白与凭据标签 / 方案词时在空白处断**(存量缺陷修复;默认形输出字节变):URL 片段此前只在 ASCII 空白 / 控制符 / 结构终止符处断,`?a=1` + NBSP + `Bearer <值>`、`?k=` + U+3000 + `token=Bearer <值>` 把方案词吞进 query 记号,值原样上屏。本版起非 ASCII 空白(`\s` 同集与名字位空白族)与分隔视图的占位同判:片段在这里不断(query 值中间夹一枚 NBSP 仍整只进记号,与 0.83.4 同),这一串空白后面紧跟一枚标签 / 方案词时断。接入文档 **§105 V-2**。
81
+ - 🔴 **谚文填充与盲文空点在词级网里当空白**(存量缺陷修复):U+115F / U+1160 / U+3164 / U+FFA0 / U+2800 屏上画成一格空白、却不在 `\s` 里 —— `api_key` + U+3164 + `=` + U+3164 + `<值>`、`Bearer` + U+2800 + `<值>` 此前整形认不出、值原样上屏。本版起它们在标签与分隔符之间、分隔符与值之间、方案词与值之间与空白同判。接入文档 **§105 V-3**。
82
+ - 🔴 **值开头是引号 / 转义反斜杠包着的里层标签或方案词 ⇒ 让里层去认**(存量缺陷修复):`token= "password":"<值>"` 此前外层把 `"password"` 当引号值换掉、里层标签没了,真正的值原样上屏;`Bearer ` + 两枚反斜杠 + `Bearer <值>` 同形。本版起值的起点跨过一串反斜杠与至多一枚引号之后是标签 / 方案词时外层不算。接入文档 **§105 V-4**。
83
+ - **安全模式 / bare 模式下,设置来源的 hooks 随启动模式收窄**(CC-200):宿主报了启动模式(见 Added 的词读口,或插件读数上已有的 `suppressedByStartupMode`)时,`hooksForWire()` / `hooksWirePlan()` 发往引擎的设置来源 hooks 按模式收窄,所有事件同判:
84
+ - **安全模式**(`'safe'`)与 **bare 模式**(`'bare'`)⇒ 只剩 managed(policy)那一份,user / project / local / flag 四源不再上请求体。bare 模式在上游对 managed hooks 的处置两向都有依据(一条路径连 managed 也不跑,另一条在 managed-only 时照跑 managed),本版取保守侧:**managed 照发**,不从请求体拿掉管理员的 hooks;两个词与读法不变,以后细化只改这一处的处置。
85
+ - 两种模式下插件 hook 都全筛(`startup_mode`);会话目标(`/goal`)的 `Stop` hook 照发(上游在这两种模式下照跑会话级 hooks,只随 managed 关停 / 合并 `disableAllHooks` 一类治理停)。
86
+ - 被启动模式筛掉的来源不再逐条出现在计划的 `settingsDropped` 与开机「不会执行」清单里(与治理筛掉同处置:这些 hook 在这种模式下哪都不跑,不是缺口);两种模式下两处都只剩 managed 的行。
87
+ - 下游:非 managed 来源的 `Stop` hook 因此不上请求体时,显式 `--final-verify` 不再让位(`resolveHeadlessFinalVerifyDetail` 答 `on: true`);managed 的 `Stop` hook 在两种模式下照发、照让位。
88
+ - 收窄时记一行调试(两种模式各一句)。
89
+ - 宿主没报启动模式、且设置来源里没有同条目重复(跨来源或同组)时 ⇒ 请求体、计划、开机清单与 0.83.4 逐字节同;有重复时按下面「只发一份」一条处置。
90
+ - 此前(0.83.1–0.83.4)启动模式位只筛插件 hook,设置来源照发引擎,与本机执行器、与上游在这两种模式下的行为都不一致。接入文档 **§105 SM-1 / SM-3**。
91
+ - **插件口在拼设置来源之前读**(CC-200):传了计划时,插件读口挪到设置来源投影之前调用(一轮仍只调一次),以便插件读数上的启动模式位能作用于设置来源;不传计划的 `hooksForWire()` 仍不调插件读口。插件读数上的 `suppressedByStartupMode` 取值时抛错 ⇒ 插件那一半按 `pluginReader: 'failed'` 处置(与遍历时抛错同一句),设置来源按词读口判。一处可观察的次序变化:传了计划、宿主没实现插件读口时,那条一次性告警现在排在设置来源「拿掉条目」的调试行之前(内容与次数不变)。
92
+ - **设置来源里同一条 hook 只发一份**(CC-208):同一事件上、组的 `matcher`(及组上其余键)逐字节相同、条目按类型的身份键相同的设置来源条目,请求体上只发一份:**位置**在拼接序里首次出现处,**字段**取合并顺序里优先级最高的来源那份(managed > flag > local > project > user;同一来源里出现多次取后出现的),与上游同答 —— managed 在拼接序最前、优先级又最高,位置与值都不变;例如 user 与 flag 各写一份、`timeout` 不同 ⇒ 排在 user 处、用 flag 的 `timeout`。其余条目的相对次序不变,没有重复的组原样发出,整组都去掉的组不发。此前同一条写在两个来源里(常见于启动参数交来的设置与用户设置各写一份)会发两份,引擎逐条执行 ⇒ 跑两次(`additionalContext` 重复、有副作用的命令执行两次、占两份事件预算与条目上限)。身份键按上游执行期的去重键:command = `shell` + `command` + `args` + `if`;prompt / agent = 类型 + `prompt` + `if`;http = `url` + `if`;mcp_tool = `server` + `tool` + `input` + `if`;script = `script` + `file` + `if`(`script` / `file` 在场须是串、至少在场一个);`timeout` / `statusMessage` 一类不进键(不同也算同一条,取优先级最高那份的值)。两处比上游保守(都往「不合」那边):上游在执行期按「这一次调用匹配到的条目」去重、`matcher` 不进键,本包投影期只合同一 `matcher` 组里的;`shell` 缺席不按 `bash` 补。形坏的条目(非串 `command`、非串 `if`、script 型的非串 `script` / `file` 或两者都缺、未知类型……)与算不出键的条目不参与。插件注册的组与会话目标 `Stop` hook 不参与;安全 / bare 模式收窄之后再去重。去掉了条目时记一行调试。接入文档 **§105 DD-1**。
93
+ - **自愈腿三条重发结局的上屏行按释放证据分说**(CC-212;`activeRunSelfHealRow`):释放判据两条取并 —— ① 引擎直说会话已交出;② 状态落终态词(推断)。此前两条同说一句,走 ② 时说满。本版起按 `releaseConfirmedByEngine` 分:
94
+ - `running-cancelled`:位在场 ⇒「The engine confirmed it is no longer holding this session, so sema is sending your message now.」(逐字不变);位缺席 ⇒「The engine now reports that run as finished, so sema is sending your message now; if that run has not fully let go of the session yet, you may have to send it once more.」(与两选卡 cancel 结局同口径)。
95
+ - `stale-park-cancelled`:位缺席 ⇒ 逐字不变(「the engine now reports it as finished, so it will not resume …」);位在场 ⇒ 不再说「报它已结束 / 不会恢复」(那一刻引擎报的状态可能仍是停泊词),改说「You chose to cancel that run, and the engine confirmed it is no longer holding this session, so sema is sending your message again now.」。
96
+ - `ask-decided-without-card`:位缺席 ⇒ 仍说「… resumed and has since finished — sema is re-sending your message」,句尾补出路半句「; if that run has not fully let go of the session yet, you may have to send it once more.」(与上两臂同口径);位在场 ⇒「… resumed and the engine confirmed it is no longer holding this session — sema is re-sending your message.」。
97
+ - sema 自己发出的后续消息(`origin: 'injected'`)的重发行:位在场 ⇒ 逐字不变(「… the session is free again, so sema is sending the message now — nothing for you to do.」);位缺席 ⇒「… that reply is now reported as finished, so sema is sending the message now — nothing for you to do (if the session has not quite freed up yet, it may be held back once more).」。
98
+ - 释放判据、重发腿、处置全不变;宿主 `rowFor` 覆盖口照旧优先。宿主自拼的结局对象不带这一位 ⇒ 落不说满的那句。接入文档 **§105 CS-3**。
99
+ - 两处出包说明串改口(只是说明文字,不参与任何判定):`MIGRATED_COMPENSATIONS` 里 T36 的 `what` 改为「子代终态 tick 缺席时(老服务端 / 丢帧 / 断流)四处防御 sweep 兜住面板行 …;终态 tick 在场时按它落终态」(0.65.0 起终态 tick 已透传、按它落行,原句「子代永不发终态 tick」过时;同条 `retireOn` 本版不动);`REQUEST_FIELD_MATRIX` 的 `lenses` 行 `why` 改为如实说明服务端按数字读、非数字回 400,本层型面仍按旧形声明为字符串数组(已知不一致,随该族退役处理)。接入文档 **§105 CS-2**。
100
+ - 文档订正(无代码改动):
101
+ - README 守卫表(由门清单生成):终局错误行的行类旗写成现名 `_sema_api_error_message`(0.83.0 之前叫 `isApiErrorMessage`);`DeniedBy` 是十词(原写九词),两张门词表兜底句分家的理由改为现行判据 —— 不认识的拒绝层可能是更新的引擎新增、也可能是记录损坏,兜底句说判不了、不断言损坏;durable 审批行的规则报价写成现键 `ruleOffers`(老服务端发的旧键 `ruleSuggestions` 仍兼容读),落只读卡键 `ruleOffersReadOnly`,可兑付卡位是 `ruleOffers`;本版改到的四道门(展示层出口、hooks 投影、负控套、门中断安全)在守卫表里的行按本版判法改写;另补十一处句间漏掉的句号。
102
+ - 接入文档活段:§3c(`prompt_assembled` 指向改 §76;`wiring_manifest` 今天投九段、其余十一段仍未投影)· §3d-2(`tool_end` 的读法改成门记录 `gateOutcomeOf` 与包内谓词 —— 扁平的 `settledBy` / `resolution` / `autoDenied` / `approver` 四词 0.60.0 起已退役,旧文仍教两键合取)· §3z(连坐位的读位同批订正)· §4a(`ToolApprovalRespondAckView` 自 0.58.0 起是 sdk `ToolApprovalRespondAck` 的别名,不再是超集)· §4b-3(实现锚 `readRuleOfferSupply`;帧键镜像门的描述改为现行对账形)· §4f(`GateCurrentPending` 的退役条件早已兑现,现为上游形别名)· §7 头部(P-43 / P-44 历史撞号的消歧注,新登记从 P-46 起编)· §7a P-1(白名单九键 / 仍剥四键)、P-2 / P-3 / P-4 转已收(0.65.0)· §7b P-7(`/decide` 回执另有读口 `readDecideReceipt`)、P-8(三选卡)、P-45(`heldBy` 读面 0.68.0 已兑现;自愈行文案本版已收)· §7d P-15(`gap` 行 5 → 3)、P-43 余项(启动模式收窄本版已收)、新 P-46(中途关闭记忆采集的结局处置表仍未归包)· §7e(缺口的共同形状按现状改写)· §8-A(sdk 地板改为指向 §0a,不再抄旧数字)· §8-D(收不到的清单按现状改写;新增一条:重试 / 等待覆盖层按 `RetryStatus.kind` 分臂,`waiting` 不是失败重试,`attempt` / `maxRetries` 缺席不补数)。接入文档 **§105a′**。
103
+
104
+ ### Gates
105
+
106
+ - `run-display-untrusted-projection-test.mjs` 新 X 段(X0–X27b):参考解码器往返(3000 条定种子随机串 × 16 组网开关,含字面 `⁠` 六字符、真 U+2060、字面成对反斜杠、astral、孤代理)、开关关 ≡ 缺席、无反斜杠输入 ≡ 默认转义形、不幂等、封长为最长码位前缀、凭据面不变弱(6000 条凭据味随机串);emoji 连字十二形原样、连接文字 73 族清单与源码双向等值并逐族两正四负、清单外十二族与「拉丁字母 + 组合符 + 连接符」照标、两格线性计时(n 与 4n);名字位空白 21 枚逐枚、Zs 完备、凭据网下标记完整、幂等(含 max);凭据两网关时字符面对冻结的上一版实现逐字节(48 组选项 × 五档 max,域 = 不含连接符);`displayUntrustedMarks` 的 `text` 与出口逐字节(2505 条 × 16 形)、标记形逐枚核、四形精确神谕(无反斜杠输入的转义形 / 开关开的任意输入 / 无 `.` 输入的点形 / 无空白输入的空格形,`marks` 恰是 `text` 里全部标记形的位置)、空格合并 / 封长 / 非标记四类 / 非串入参各一格;读口与开关的追踪路径两格线性计时。D13 改钉 emoji 那一半(拉丁旁的一半改判由 X9 / X9b 钉);R3 / R6 回归域移出格式类整类(连接符的改判由 X 段钉)。
107
+ - 同门 X′ 段(X28–X33,CC-207):机读口五形、字符面全关的呈前出口一轮即洗到、追踪路径、合成终局行 print / 交互两车道与结果帧 `errors[0]`、凭据之外的孤代理项逐字节不动、孤代理项换成零宽空格前后同位逐字节同(4000 条)、三格线性计时。
108
+ - 同门修复格:X8d–X8g(转义记号原子:四例与三只序列解析口(CSI 终字 / nF 终字 / 控制串结尾,另 C1 CSI 头)五形 × 七种形 × `max` 0–39 与缺席,输出零「单反斜杠 + 非 u / 非反斜杠」、`marks` 精确;4000 条无字面反斜杠的控制符 / 格式字符 / 凭据混排随机串同判;开关开 + 凭据两网开时参考解码器在遮盖段之外逐字往返);X12d–X12i(连接符语境按簇的基字判:组合符 / 变体选择符 / 肤色修饰夹在中间的九形照标、非字母十形照标、回归七形原样;virama 清单 63 枚与源码双向等值并逐枚一正三负;马拉雅拉姆 / 孟加拉旧编码原样)与 X13c / X13d 两格线性计时;X16b–X16e(字面名字位空白记号 21 枚夹在 userinfo 里与开关关同答;4000 条随机串开关开不比开关关漏;真空白照读回、标记留在记号外;真 NBSP 与字面形同答且幂等)。
109
+ - 同门 X″ 段(X34–X40b):转义记号原子之后的配套读法 —— 被 ESC / C1 / 记号截断的 CSI / nF 前缀、单个序列头紧贴已知凭据字面形、大写 `\U` 与码位不在字符面里的同形串十二形 × 默认形 / 成对开关 / 机读口凭据字面不露;对 0.83.4 产物的差分随机语料里抽出的最小形十六形 × 三种形 + 机读口凭据字面不露(`ESC @` / `CSI @`、终字反斜杠后接引号、读回空白读法里名字位空白当中间字节、只剩占位的用户名、值开头的引号标签 / 转义反斜杠方案词);`blanks` 字面读法七形与开关关同答、字面 L2 形与真值照遮;URL 片段后接非 ASCII 空白 + 标签 / 方案词在空白处断、谚文填充 / 盲文空点当词级分隔、query 值中间夹 NBSP 照旧整只遮;连接符残余七形(修饰字母撇号 / tatweel、© / ™、❤ + FE0F、🔥 + ZWJ + 组合符、肤色修饰);两格线性计时;`blanks` 开着遮住的 ⊇ 同形不开遮住的 —— 定种子 2500 条(转义序列 / 原字名字位空白 / 标签 / 字面形 / URL 混排)× 转义形 / 反斜杠成对 / 折平关三对,「开时露、关时不露」计数 0,另钉 `ESC (` + U+3000 + `\ghp_…` 与「折平 + 字面」混合各一形。
110
+ - 另核(不入门):凭据两网开的整条出口上,不含连接符的输入与上一版产物 52 万次调用逐字节同(CC-204 部分;CC-207 改的是含孤代理项的输入)—— 这是转义记号原子一件之前的读数;那一件之后另核见 §105a′「不变」一条。
111
+ - 扩门 `run-hooks-merged-disable-projection-test.mjs`(SM 段,CC-200):
112
+ - 构建产物声明型面:新成员可选、零参、返回 `HooksStartupMode | undefined`;`HooksStartupMode` 导出、恰两词;插件读数上的旧位仍可选(AST)。
113
+ - `'safe'` 与 `'bare'` 各四形(不传计划 / 传计划 / 宿主没实现插件读口 / 插件读口抛错)⇒ 四个事件上的设置来源只剩 managed;`'bare'` 在三种「只发 managed」的治理下同样只发 managed(不拿掉 managed)。
114
+ - 旧位真而无词 ⇒ 按安全模式、managed 保留;旧位真 ∧ 词 `'bare'` ⇒ 以词为准(同样只发 managed);旧位真 ∧ 词读口返回非法词或抛错 ⇒ 旧位照算。
115
+ - 两种模式插件全筛;会话目标 `Stop` hook 照发(与 managed 那组并存)、在合并 `disableAllHooks` 下照旧不发;managed 的 `Stop` hook 在两种模式下照让位 final-verify;计划拿掉记录与开机清单在两种模式下都只剩 managed。
116
+ - 反向负控:词读口缺席 / 返回 `undefined` / `true` / `false` / `'true'` / `'SAFE'` / `'none'` / `''` / `null` / `1` / `{}` / 抛错 × 旧位缺席或 `false` × 传不传计划 × 有无会话目标的 88 格与没有词读口的端口逐字节同。
117
+ - 抛错与非法词各记一行调试、不告警;写成属性(`'safe'` / `'bare'` / `true` / `null`)⇒ 五源照发、每轮一行调试点名它不是方法;返回 `undefined` 零日志;缺席不告警;两种模式各一行调试。
118
+ - 读的次数:整条腿已关的路径零调用;只发 managed 的治理下仍读一次(bare 还会改答案);旧位已报真仍读一次(词可能是 bare);不传计划不读插件口。
119
+ - 类实例端口按方法调用;旧位取值器抛错不外抛。
120
+ - 编译期钉:包内认得的词表与 `HooksStartupMode` 两向钉(型面加减一词而词表没跟 ⇒ 构建即红)。
121
+ - 可选的引擎执行面一段(SM-E):把请求体原样交给装好的服务端发布版的 hook 执行入口 —— 安全模式(词与旧位两种报法)下 user / project / local / flag 各源的 `PreToolUse` hook 不执行、managed 的照执行,managed 的拒绝照生效;bare 下 managed 的拒绝 hook 同样照执行、照拦,user 的不执行(词单报与词 + 旧位两形),带会话目标时请求体是 managed 的组加会话目标那一组、服务端照常受理;不报时两条都执行、非 managed 那条拦下。一格手排请求体的自证先证拦截条目在这份服务端上确实会执行。没装服务端包时这一段如实标为未跑。
122
+ - 同门 DD 段(CC-208):user 与 flag 同条目 ⇒ 请求体一份(两条路径);managed 与 user 同条目 ⇒ 只留 managed 的原组;user 与 flag 同条目而 `timeout` / `statusMessage` 不同 ⇒ 位置在 user 处、字段是 flag 交来的那一条;user / project / local 三处 ⇒ 取 local 的;同组内两条 ⇒ 取后一条的值、放在前一条的位置;managed 与 flag ⇒ managed 的位置与值;五源同条目 ⇒ 一份;同组内重复 ⇒ 一条;prompt / agent / http / mcp_tool / script(`script` 串形与 `file` 形)/ 同 `if` / 同 `shell` / 同 `args`(引擎报支持 exec 形时)各一份;反向 —— `matcher` 不同、`matcher` 缺席对空串、事件不同、命令差一个字节、`if` 不同、`args` 不同、`shell` 缺席对显式 `bash`、prompt 对 agent、组上多一个键,以及身份键逐字段各差一处(http 的 `url` / `if`;script 的 `script` / `file` / `if`;mcp_tool 的 `server` / `tool` / `input` / `if`;prompt 的 `prompt`)⇒ 两份都在;形坏条目(含 script 型的非串 `script` / 非串 `file` / 两者都缺)与算不出键的条目(序列化抛错)两份原样、不外抛;次序不变、没有重复的组是原对象、有重复的组是新对象、整组去空的组不发、端交来的文档不被改;启动模式收窄之后再去重(bare 下只剩 managed 那一份);插件组不参与;去掉条目时恰一行调试、没有时零行。可选的引擎执行面一段(DD-E):同条目的请求体交给服务端发布版的 hook 执行入口 ⇒ 执行一次、`additionalContext` 不重复(user 对 flag、managed 对 user、project 对 local 三对);user 那份 `timeout` 1 秒、flag 那份 10 秒、命令耗时 2 秒 ⇒ 请求体那一条带 10、在引擎上跑完一次(取 user 的值会在 1 秒处被判超时);命令差一个字节 ⇒ 执行两次;一格手排请求体的自证先证这份执行器本身不去重。
123
+ - 改门 `run-hooks-merged-disable-projection-test.mjs`(FS7a ③):上下文总帽一格的三段非 managed 内容改为三条不同的条目(原先两段逐字节相同,本版去重后只剩两段、帽挤不满,格的前提失守),并把「帽确实被挤满」写进判据。
124
+ - `run-selfheal-reopen-test.mjs` 新 G8⑤l 段(九格)、G8⑤m 段(四格)、G11④f 段(两格),断言打在结局位与最终上屏行上:`heldBy` 缺席 + 终态词 ⇒ 位缺席、行中不出现 "confirmed"、说引擎报它已结束并提示可能要再发一次;`heldBy: null`(状态为终态词 / 仍是停泊词)⇒ 位严格 `true`、行说 confirmed、停泊词那格不说「报它已结束」;`heldBy` 非空 + 终态词(仍判释放)⇒ 位缺席、不出现 "confirmed";宿主复制(`{...o}` / JSON 往返)的结局仍得强句;位缺席 / `false` / `'true'` ⇒ 弱句;两路处置同为 `resending`;两句互异;注入件行随位分说;`ask-decided-without-card` 位缺席时句尾带出路半句、位在场不带;无卡直决与两选卡 cancel 两条腿同位同分说。门报数 497 → 512。
125
+ - `run-terminal-identity-copy-test.mjs` 注入件事实表:重发那一句按释放证据分成两句(十二句 → 十三句,两两互异),样本补三条带位结局与一条 `false` 位结局。门报数 915 → 987。
126
+ - 同名影子对账门的豁免表删两行:网页端已删 `classifyRulesFailure` / `listAllPersistedRules` 两只本地实现、改用本包(豁免在到期前提前销)。
127
+ - 新门 `run-gate-interrupt-safety-test.mjs`(59 格,全在临时目录里跑真收集器与真负控套的逐字节副本,不碰本树物料):全门收集器 `run-client-core-all-gates.mjs` 单门到点改为**先发 SIGTERM、宽限后才 SIGKILL**(修前到点直接 SIGKILL:负控套在高负载下跑过上限被杀时,正在演练的那只登记物停在篡改态、`.negctl-bak` 备份留在盘上,后面读那份物料的门连带红);到点之后不论门怎么退都记超时,退码 0 也不算绿。单门上限与宽限可在 `scripts/gates-manifest.json` 那一条的可选 `runner` 格里单独放宽(`{ timeoutMs?, graceMs?, why }`,理由必填;格坏形 ⇒ 收集器一只门都不起、exit 9),负控套放宽到上限 30 分钟、宽限 2 分钟。门进程退出之后收集器至多再等一个排空窗(2 秒)让输出管道收尾,到点截断管道、按门自己的退出落定,并打一行说明 —— 门起的子进程继承了门的输出管道、比门活得久时,此前收集器要等那个子进程退出才落定:退码 0 的门被拖到单门上限判成超时,宽限到点强杀了门也照样等;现在落定不晚于上限 + 宽限 + 排空窗。负控套 `run-gate-negative-controls-test.mjs`:收到 SIGTERM / SIGINT / SIGHUP(终端断开时发的是 SIGHUP,此前按缺省处置直接退、不复原)⇒ 整组收掉在飞的目标门(连同它起的子进程)、在飞物料用备份逐字节复原、用复原后的源码重编 dist(重编上限按清单里本套的宽限扣掉已用掉的时间,到点强杀编译器、说明行写明 dist 未重编 —— 此前重编自带 5 分钟上限,比宽限还长,收集器宽限到点的强杀会落在重编中途、留下还在跑的编译器)、打 `NEGCTL-INTERRUPTED` 并以 128+信号号退出(复原失败 exit 9 并留备份);开跑前扫备份残留(各演练目标所在的目录树,含软链进来的依赖目录)⇒ `NEGCTL-RESIDUE` 点名路径与核对 / 复原命令、exit 9、不覆盖不自动删,一只都不演练;篡改空转的 exit 9 不再留下备份。判法:体面门 / 顽固门 / 快门三形与收尾三件套逐字(慢门到点前没就绪时放大上限重跑一次)、坏形 `runner` 格四形(含拼错的键与合法键并存)、清单每条的顶层键在闭集里、子进程攥着输出管道的两形(退码 0 的门照判通过且在上限之前落定;顽固门落定约为上限 + 宽限 + 排空窗,不等那个子进程)、三种信号下的演练中断(退出码、物料字节、零备份、进程组,并在临时目录里的最小工程上断言中断收尾的重编真跑了)、重编超出宽限预算(假编译器挂两分钟、宽限 4 秒:负控套在宽限内退出、说明行写明未重编、假编译器随之被收掉)、三处残留位置、篡改空转、收集器到点中断负控套的端到端一链;全绿时格数满额自证。
128
+ - 线性时间格改量**本线程 CPU 时间**(共用助手 `linearTimeCheck` / `linearTimeCheckAsync`,`scripts/_gate-lib.mjs`):`run-display-untrusted-projection-test.mjs` 的全部比值法计时点(含端到端流一格与嵌套豁免一格)和 `run-client-core-pure-test.mjs` 的两格原来各自抄一份**墙钟**比值法,高负载下长的那一次被调度抢占、倍数随负载涨而误报(负载 300–600 下实测 11.8× / 12.7× / 26.6×,负载回落同码绿)。尺寸、门限(大尺寸在 250ms 内或倍数 < 10;嵌套格 100 倍尺寸、400 倍门限)、各量三次取最快、一次不达标重量一次一概不变,无负载下与改前同判;墙钟读数随结果带出只作诊断。另加助手判别力自证(判据六形、钟随工作量走、钟不计等待、合成平方工作必红 / 合成线性工作必过)。
129
+
130
+ ### Known limits(本版新增)
131
+
132
+ - 连接文字语境里的连接符不保证单射:清单内同一文字的两个字母之间夹一枚 ZWJ / ZWNJ,若该文字在这一对字母上不产生半形 / 连体变化,画出来与不夹一样;名字位的严格上下文规则本包没有按它判(散文载体会误标正当排版)。要求两个名字绝不同形的宿主另加码点级区分(KL-138)。
133
+ - 零宽组合符不在任何一网:组合字形连接符 U+034F、变体选择符 U+FE00–U+FE0F / U+E0100–U+E01EF、蒙古自由变体选择符 U+180B–U+180D / U+180F、高棉固有元音 U+17B4 / U+17B5 —— `Bash` 后接一枚仍与 `Bash` 同形;渲成空白的罕见符号(如 U+1D159)同样不收(KL-139)。
134
+ - 运行引擎的 Unicode 版本早于清单里某个文字时,那个文字名在载入时被滤掉,它旁边的连接符改为标出来(过严方向,不影响安全;KL-140)。
135
+ - 点形 / 空格形本身有损:`blanks` 在这两种形下画成 `.` / 空格,分不出是哪一枚空白;空格形里一串被并成一个空格时 `marks` 只报第一枚被标的码位。要逐枚区分用转义形(KL-141)。
136
+ - `escapeBackslashes` 只让字符面无歧义:字面写出的 `«redacted:secret»` 与凭据记号仍同形;行折平开着时空白串仍折成一个空格。完整往返只在「两张凭据网关、`foldLines: false`」下成立(KL-142)。
137
+ - 孤代理项与格式字符同处置之后,两形在 0.83.4 上被顺带遮住、本版露出,均与「同一位置换成零宽空格」逐字节同:userinfo 后面没有主机、方案词后的值是地址形(按地址豁免)。是格式字符一族早就有的缺口,不是孤代理项独有(KL-143)。
138
+ - 两版相同的凭据读法边界:软连字符 U+00AD 把已知凭据字面形拆成两半时尾段原样上屏(KL-144);`Authorization: Digest` 参数表的参数名被零宽字符切开时 `response` 的值原样上屏(KL-145);值整段落在一段已结尾的控制串里(如超链接地址)时不遮(KL-146);裸值里夹一枚字面写出、码位不在字符面里的 `\uXXXX` 时值在反斜杠处断、后半原样上屏(KL-147);标签后的值是没有 `@` 的「`scheme://<名>:<非数字>`」时按地址形豁免(KL-148)。
139
+ - 转义序列吞掉值的第一个字(`api_key: ` + ESC `[` + ESC + `P<值>` 的 `P` 是 `ESC P` 的引导字)时,那一个字留在序列的可见转义形里、不进记号(KL-149)。
140
+ - `blanks` 开着时「遮住的 ⊇ 开关关」的两类例外:输入里**字面写出**的名字位空白转义形(六个字符 ` ` 一类)与本出口写出的那一枚分不开,偶尔与开关关时定界不同(KL-150);与点形 / 空格形同开时名字位空白画成 `.` / 空格,再洗一遍时与真点 / 真空格分不开(KL-151)。
141
+ - 宿主有安全 / bare 模式却没报(没实现 `hooksStartupMode()`,插件读数上也没报;或只在插件读数上报、却不传计划调 `hooksForWire()`)⇒ 设置来源照发引擎,与 0.83.4 同。本包不告警(没有这两种模式的宿主不实现它是正确答案;KL-152)。
142
+ - 设置来源去重是上游执行期去重的子集:上游按「这一次调用匹配到的条目」去重,`matcher` 不同但都匹配到这次调用的同一条命令在上游只跑一次,本包照发两份;`shell` 缺席与显式 `bash` 本包不合;会话目标 `Stop` hook 与设置里文本相同的 prompt hook 本包不合;`args` / `input` 里对象的键序不同本包不合(KL-153)。
143
+ - bare 模式下本包仍发 managed 那一份(与安全模式同处置);上游在非 managed-only 的路径上 bare 不跑 managed hooks —— 这一处与上游不同,待查实后细化(词读口与两个词不变)。只在插件读数上报 `suppressedByStartupMode: true` 的宿主同样按这一处置(KL-154)。
144
+ - 开机工具面在名册缺席、走回落估计表时无条件列 `ToolSearch`;引擎只在这一 run 有延迟披露工具时才挂它 ⇒ 回落路径上可能多报一只。名册在场时不受影响(KL-155)。
145
+ - 中途关闭记忆采集的动词(`POST /v1/runs/:id/memory/capture-optout`,能力位 `runMemoryCaptureOptOut`)的结局处置表仍未归包:200 两种、403、四形 409(其一 `memory.capture_optout_sweep_failed` 是部分成功)、503,恢复动作按错误码分;本包只收了提交时的声明形 `memoryCapture: 'off'`。今天没有端调这个动词(接入文档 §7d P-46;KL-156)。
146
+ - 上一版登记的「启动模式位只筛插件 hook、设置来源照发」一条本版销(KL-128);「设置来源之间不去重」一条本版改为上面那条边界(KL-125 由 KL-153 接替)。
147
+ - 完整台账见接入文档 §105 末行「包侧缺口」。
148
+
149
+ ## 0.83.4(2026-09-26)
150
+
151
+ > 主题:patch —— 三件同发 + 两条接入指引订正。① plan 审批卡「用户亲手关掉的卡,自动触发不在同一道门上放回屏上」的判定归包:`reopenPlanReviewCard` 多一个触发者位 `trigger`,自动触发撞上「用户关卡」记号时拒开并如实回 `dismissedByUser`;用户自己的下一个动作照开;409 自愈腿按提交出身替宿主传触发者,结局带同一位、整行由本包出。② 座位审批请求补上卡请求早就有的四位 —— 强制位 `mandated`、强制理由词 `mandate`、报价缺席因由 `ruleOffersAbsence`(寄存行那条腿的强制表达)、出身词 `origin`,经一只与卡请求同形窄读的过境口 `toolPermissionRequestAskBits` 上座位。③ `<system-reminder>` 信封壳的剥离 / 解包两只纯函数上公面(`stripSystemReminderBlocks` / `unwrapSystemReminder`),并改成线性时间实现。另订正两条展示层接入指引(§104a′)。根公面运行期导出 1273 → 1277(+4:`stripSystemReminderBlocks` / `unwrapSystemReminder` / `toolPermissionRequestAskBits` / `clearPlanReviewUserDismissals`);公面类型 +2(`PlanReviewReopenTrigger` / `PlanReviewGateInstanceReader`);`ToolPermissionRequest` +4 可选位;`ReopenPlanReviewOpts` +3 可选位;`armPlanReviewApproval` 的选项 +1 可选位;`ReopenCardVerdict` 的拒开臂 +1 可选位 `dismissedByUser`;`SelfHealOutcome` 的 `plan-review-reopen-failed` 臂 +1 可选位 `dismissedByUser`;`ActiveRunSelfHealDeps.reopenPlanReview` +1 可选第二参 `{ trigger? }`;开发依赖引擎 `~7.33.1`(本包零运行期读点);peer sdk 地板 `>=11.3.0` 不动;零 wire 投影臂。
152
+
153
+ ### Added
154
+
155
+ - **plan 审批卡:用户关掉的卡,自动触发不放回屏上**(CC-201):用户在 plan 审批卡上按 Esc、中止,或给了一个既不是批准也不是驳回的作答,本包在那张卡的作答口里**同步**记下「用户关卡」(按会话 × 任务;在作答口的同步段里记,排在卡后面的注入件下一拍撞 409 时记号已经在)。`reopenPlanReviewCard(taskId, { trigger })`:
156
+ - `trigger: 'automatic'`(注入件撞 409 的自愈、补捞、卡离屏补一拍、对账这类自动腿)撞上记号 ⇒ `{ reopened: false, dismissedByUser: true }`,不铸新卡 —— 修前这一拍会在 0.1–1.7 秒内把卡放回屏上,用户紧接着打的命令与回车落在新卡上,等于又批准一次。
157
+ - `trigger: 'user'`(用户自己的下一个动作,如他手打的消息撞 409)照开;卡回到屏上即撤记号。
158
+ - 同一条任务长出**新的** plan 门时照开:宿主经 `readGateInstanceKeys`(新具名型 `PlanReviewGateInstanceReader`,答「这条任务此刻挂着的 plan 门实例键集」)交读口,本包在用户关卡那一刻读一次、在自动触发判定时再读一次,出现一枚不在被关集合里的实例 ⇒ 视为新门、照开并撤旧记号。读回的集合在落定那一刻取快照(宿主交出自己就地改的活集合也认得出新门)。读口缺席、读不出、抛错、超时、关卡那一刻集合为空 ⇒ 证不出是新门 ⇒ 保守拒开。同步形(不带 `presentationReceiptMs`)读不了实例,撞记号即拒。
159
+ - 异步形的判定读回来之后、铸卡之前再核一次:这期间这道门上交了决断(包内看得见的:决断投递在飞、决断性作答;宿主报的:新可选谓词 `decisionHandedOver(taskId)` 答 `true`)⇒ 拒开并回 `_sema_decisionInFlight`(答案在路上,不是「卡是你关的」)。条目这期间换了一枚 ⇒ 这次评估不铸卡,判决按**此刻**条目如实说:用户又关了一张 ⇒ `dismissedByUser`(新记号保留);卡已被放回屏上(用户自己叫回、或同时在路上的另一次自动触发已把新门的卡放上去 —— 在本次回执窗内等那一次落定,等回来再读一次此刻条目:仍是那一次且上屏了才答卡在屏上,等的期间又换了一枚就按新条目说)⇒ `{ reopened: true, firstSight }`;条目没了(会话换代、记号账超上限被挤掉)⇒ `{ reopened: false }`(不带 `dismissedByUser`)。
160
+ - 每条任务至多一次在路上的重开:同一会话 × 任务上一次重开的卡已发布、回执还没到时,后到的重开(任何触发者,含 `trigger` 缺席与同步形)**并入**那一次 —— 不铸第二张卡、不退役前一张的作答口;异步形等那一次落定(上限 = 自己的回执窗),上屏 ⇒ `{ reopened: true, firstSight: false }`,没上屏 ⇒ `{ reopened: false }`;同步形当拍答 `{ reopened: true, firstSight: false }`(同步形「发布即答重开了」的既有语义)。修前:两次重开错开到达时屏上出现两张新卡,答前一张落空。
161
+ - 撤记号:决断性作答(包内作答口的决断臂、宿主的 `notePlanReviewAnsweredIfDecisive` 报的那一次 —— 但包内作答口已按那张卡自己展示的选项判为「非决断」的**同一张卡**,宿主记账口不再撤)、成功重开(同步形即时;回执模式回执到手时;只撤**铸卡之前**那一枚 —— 铸卡到回执之间用户又关的这张新卡是一枚新记号,不被这次成功撤掉)、`clearPlanReviewUserDismissals(sessionKey?)`(会话换代时宿主调;缺省 = 默认会话;只清这一个会话)。
162
+ - `trigger` 缺席 = 与 0.83.3 同答(不判记号、不读实例;唯一例外是上一条的并入:同一任务上一次重开还在路上时不再铸第二张)。`armPlanReviewApproval` 的选项多一位 `readGateInstanceKeys`(首呈卡被关时同样按门实例记)。接入文档 **§104a P-1–P-7**。
163
+ - **409 自愈腿接「用户关卡」**(CC-201):`ActiveRunSelfHealDeps.reopenPlanReview` 多一个可选第二参 `{ trigger }`,由本包按提交出身映射 —— `submissionOrigin: 'user'` ⇒ `'user'`,`'injected'` ⇒ `'automatic'`;出身缺席 ⇒ 只传 `taskId`(与 0.83.3 同一调用)。重开口回 `dismissedByUser: true` 时,结局 `plan-review-reopen-failed` 带同名位(严格 `true`),`activeRunSelfHealRow` 出整行:用户形、系统注入件形、steer 落 `queued` 的两形各一句 ——「计划在等你审,卡是你关的,sema 不自己放回;发条消息叫回来」—— 不给「保住对话」那条路、不给引擎决断入口(卡回得来,不是「重开不了」);端仍可经 `rowFor` 整行覆写。接入文档 **§104a P-8**。
164
+ - **座位审批请求补强制位 / 强制理由词 / 报价缺席因由 / 出身词**(CC-203):`ToolPermissionRequest` +4 可选位 `mandated?: true` / `mandate?: ApprovalMandateWord` / `ruleOffersAbsence?: string` / `origin?: string`(`TOOL_PERMISSION_REQUEST_KEYS` 10 → 14),语义原样来自卡请求同名位。`ruleOffersAbsence` 是寄存行那条腿的强制表达(行上没有 `mandated` 位,强制只以它 `=== "mandated"` 出现)—— 它不上座,同一张卡在卡上与座位上对 `approvalIsMandated` 就会不同答。新过境口 `toolPermissionRequestAskBits(card)`:与卡请求同一把窄读 —— `mandated` 只认自有键上的严格 `true`;`mandate` 只认闭集六词之一(精确字节,自有键);`ruleOffersAbsence` / `origin` 只认自有键上的非空串(原文字节,开集)。对经这只过境口铺座位请求的宿主,表外词、大小写变体、空串、非串、含糊真值、原型链上的同名键 ⇒ 那一位不上座位请求;四位各自过、互不推。座位校验器不校这四位(登记为刻意豁免:为一个位拒掉整条审批请求 = 把安全 ask 交给引擎超时拒绝);不经过境口自铸座位请求的宿主要自己按同一把窄读。座位上读这几位用卡请求的读口:`approvalIsMandated(req)` / `readApprovalMandate(req)` / `askSurvivesPosture(req, facts)`。接入文档 **§104a S-1–S-3**。
165
+ - **`<system-reminder>` 剥离 / 解包口上公面**(CC-205):`stripSystemReminderBlocks(text)` 删掉文本里**所有**成对的块;`unwrapSystemReminder(text)` 在整条文本以开标签起头、以闭标签收尾时返回两标签之间的正文(头一个开标签到末尾闭标签)。开标签文法只认引擎铸的两形:裸 `<system-reminder>` 与恰一个 `mark="<22 位 base64url>"` 属性的 `<system-reminder mark="…">`;闭标签逐字 `</system-reminder>`。块语义与 0.83.3 包内行为逐字同(只改时间复杂度,线性),见接入文档 **§104a-1**。
166
+
167
+ ### Changed
168
+
169
+ - 接入指引订正两条(文档,无代码改动):① 结果帧 `errors[]` 与本包合成的终局行正文自 0.83.1 起在铸点洗过凭据,它们是**展示文**,不是语义判据 —— 判错误类型读结构位(`_sema_error_code` / 终态原因位),文案只用于上屏;② §101 的载体映射把审批入参归进凭据网射程是指引错误 —— 审批入参是授权面,用户必须看见要批的真参数:展示载体用 `displayUntrusted(x, { credentialUrls: false, credentialWords: false })`(只中和控制符 / 双向与格式字符 / 折行),截断要显式标出。接入文档 **§104a′**。
170
+ - 三处改按**自有键**读(与过境口同一把判法):审批卡两条腿(活卡帧 → 卡、待决行 → 卡)盖 `mandated` 只认自有键上的严格 `true`;判据口 `approvalIsMandated` 读 `mandated`(自有键上的严格 `true`)与 `ruleOffersAbsence`(自有键上的串 `"mandated"`)。JSON 形帧 / 行 / 卡请求零变化;原型链上挂着的同名键不再被当成引擎铸的强制位 / 缺席词。
171
+ - `<system-reminder>` 两只口改线性时间实现(修前:解包口在开标签后跟一长串空白 / 换行时回溯到秒级;剥离口在大量未闭合开标签上平方)。只改时间复杂度:块语义与 0.83.3 逐字同(见 §104a-1),包内两处读点(委派子代的提示词剥壳、自动模式分类器裁决的解包)答案不变。
172
+
173
+ ### Gates
174
+
175
+ - 新门 `run-plan-review-dismissal-test.mjs`(94 格):用户关卡之后自动触发零新卡 / 记号在作答口同步段里成立 / 判决形只多 `dismissedByUser` 一位 / 反复自动触发(同步形、异步形)仍零新卡 / 用户动作照开并撤记号 / 再关再记 / 决断性作答撤记号(宿主记账口与包内作答口两路)/ 非决断作答照记 / 会话换代按会话清 / 记账点源码锚 / 重开身份卡同样记 / 按会话 × 任务分桶 / 非 plan 卡零记号 / 判定读点全文件恰一处且在在飞守卫之后、铸卡之前 / 门实例:同门拒、新门开并撤旧记号、多一枚实例即新门 / 证不出是哪道门的七形保守拒开(关卡那一刻读 null / reject / 空集 / 同步抛,判定那一刻读口抛 / 缺席 / 挂死 —— 有界等待)/ 首呈卡同样记并按门实例判 / 判定读在路上时交了决断(宿主记账口一形、决断投递在飞一形、宿主交出窗谓词一形)⇒ 拒开回「答案在路上」、被批准那张卡的作答入口不被退役 / 谓词 false 不挡、抛错保守拒开并回不带位的 `{ reopened: false }` / 陈旧评估按此刻条目分说(又关一张 ⇒ 卡是你关的;用户叫回、另一次自动触发已放回 ⇒ 卡在屏上;叫回并批准 ⇒ 答案在路上;会话换代、超上限挤掉 ⇒ 不带 `dismissedByUser`)/ 陈旧评估等放回落定之后再读一次此刻条目(等的期间用户叫回又关掉 ⇒ 卡是你关的;叫回并批准 ⇒ 答案在路上;会话换代 ⇒ 不带位)/ 新门上两次自动触发同拍恰一张新卡(含宿主入队延迟 60 / 200 ms 时陈旧评估等那一次落定、另一次自动触发的回执晚到时同样等;回执窗小于入队延迟 ⇒ 两次都答不带位的拒开)/ 新门卡没上屏不留残留条目(残留条目会占记号账一格、把别的任务最早一枚真记号挤掉)/ 每任务单飞:错开到达的两次自动触发、用户触发并入在路上的自动触发、同步形与异步形交错 ⇒ 恰一张新卡、前一张的作答入口不被退役 / 读口回宿主活集合按快照比较 / 包内作答口判为非决断的同一张卡,宿主记账口不撤记号 / 解析口单源且不上公面 / 回执窗竞态只撤铸卡之前那一枚、回执窗尽不撤 / `trigger` 缺席与 0.83.3 同答(同步形、异步形,零读口调用)/ 每会话记号账有界 / 表外触发者词按自动判。
176
+ - 扩门 `run-selfheal-reopen-test.mjs`(G13 段:13 格 + 1 枚判据自证):重开口回「用户关卡」⇒ 结局带位 / 用户形、注入形、steer `queued` 两形整行 / 不问宿主「保会话」出路、不给引擎决断入口 / 处置档仍是 not-delivered / 端整行覆写口仍优先 / 含糊值不打标 / 与「决断在飞」同在时按在飞说 / 注入口第二参按提交出身映射(缺席 ⇒ 单参调用)/ 注入件 steer 落 `queued` 同样带触发者 / 端到端(包内重开口当注入口:用户关卡后注入件零新卡、用户下一条消息卡回来)。
177
+ - 扩门 `run-seat-contract-keys-test.mjs`(K 段):四位进座位键集 / 过境口在公面 / 卡请求带位 ⇒ 原样 / 只管自己那几位 / 带位的座位请求过座位门且卡请求读口读得出 / 寄存行形(只有缺席词)的卡请求过境后座位上 `approvalIsMandated` 与卡上同答 / 缺席词按开集原文过 / 九种负样本零键 / 原型链零键 / 缺席零键 / 非对象入参零键不抛 / 只有词不长位 / 只有位不编词 / 坏形不拒整条请求;H 段覆盖表随四位豁免登记自动投毒对账。
178
+ - 扩门 `run-durable-card-display-keys-test.mjs`(⑰ 段 +4 格):两条腿上只在原型链上的 `mandated` 不上卡 / 自有键正控 / 判据口 `approvalIsMandated` 对只在原型链上的 `mandated` / `ruleOffersAbsence` 答 `false`、自有键照认。
179
+ - 扩门 `run-client-core-pure-test.mjs`(㊲b 段,B2 段地板 440 → 469):两只剥离口在根入口 / 生产方真形正样本四形 / 非引擎形负样本七形 / 截断不吞 / 无块逐字节原样 / 解包整条、非整条、非引擎形 / 与 0.83.3 实现逐条对拍(门里冻结两条旧正则,3 万条定种子随机串两只口逐字节同,另有一枚语料覆盖自证)/ 四个边角与 0.83.3 同答(两块相接、两块夹正文、字面开标签与后面的真块配对、嵌套)/ 分类器拒绝理由引用开标签(裸形、带 mark)照认且 reason 逐字 / 解包是铸造口的逆(正文含字面开标签)/ 正文含字面开标签的真块整块删净 / 正文两端空白全去、正文字面闭标签照当正文 / 截断信封解包原样 / 线性时间两格(n 与 4n 比值法)。
180
+
181
+ ### Known limits(本版新增)
182
+
183
+ - 包分不出空作答是谁送的:宿主的 hook 以空作答拒掉 plan 卡时,本包同样记成「用户关卡」,自动触发随之拒开(方向保守;行句会说成「卡是你关的」)。
184
+ - 首呈卡的呈现口(`armPlanReviewApproval`,运行流里 plan 停泊帧到达时调)既不判也不撤「用户关卡」记号:同一停泊帧被重放时首呈卡照样再立一次;立回屏上之后记号仍在,这期间的自动触发照拒并答 `dismissedByUser`(尽管卡在屏上)。
185
+ - 同步形(不带回执窗)的重开读不了门实例:用户关过这条任务的卡之后,同一条任务长出的新 plan 门要等用户的下一个动作、决断性作答或会话换代才会被自动触发放回。
186
+ - 「用户关卡」记号账每会话至多 32 条,超出按先后挤掉最早一条;被挤掉那条任务的自动触发回到 0.83.3 的行为。
187
+ - 座位校验器不校四个新位;坏形值由过境口挡在座位请求之外,不经过境口自铸座位请求的宿主要自己按同一把窄读。
188
+ - 宿主交出窗谓词只在异步判定的读后复核里问一次:没有记号的自动触发、同步形、`trigger` 缺席、用户动作都不问它(那几条铸卡前没有等待,由宿主调重开口之前自己的守卫负责)。
189
+ - `<system-reminder>` 开标签文法本身不上公面:要按开标签切块(不只是删 / 解包)的端仍需自持文法并与本包两只口按正负样本对表。
190
+ - `stripSystemReminderBlocks` 从一个开标签配到它之后最近的闭标签:用户正文里一个没闭合的字面开标签会与后面一个真块配对,两者之间的正文一起被删掉(0.83.3 起的既有行为,本版不改)。
191
+ - 完整台账见接入文档 §104 末行「包侧缺口」。
192
+
52
193
  ## 0.83.3(2026-09-26)
53
194
 
54
195
  > 主题:patch —— 三件入参 / 来源面放宽,零新运行期导出。① `--settings` 一类入口交来的 flag 来源设置里写的 hooks 进请求体(此前只投 managed / user / project / local 四源,flag 来源的 hooks 到不了引擎);flag 来源排在 local 之后,设置来源的拼接次序其余不变(managed 仍在最前)。② `listAllPersistedRules` 的入参只要 `list` 一口(新具名型 `RulesListFacade`;其余四口作为可选成员认得 —— 内联对象字面量、参数不写型的箭头照样可传,拼错口名照样报错),只装读 / 撤两口的宿主可以直接用。③ 模型身份判据认「目录缺省代替启动环境里的模型名」:宿主报本机引擎接受目录缺省(`engineAcceptsCatalogDefault: true`)时,只用模型目录文件的配置判 `resolvable`;报 `false` 判 `not_resolvable`;不报仍判不出(`unknown`)。根公面运行期导出 1273 不变;公面类型 +1(`RulesListFacade`);`HookSettingsSource` +1 员;`ModelIdentityLanes` 的目录一格闭集 +`complete`;`LocalEngineModelIdentityReading` +1 可选位;peer sdk 地板 `>=11.3.0` 不动;零 wire 投影臂。