# Changelog 本项目版本号遵循 `0.x` 阶段的语义化:`0..`;预发布版本带 `-beta.N` 后缀(面板中显示为 `0.3.0beta1`)。 ## v0.5.0-beta.1 — 2026/09/18 作者:啃轮胎的西狐 **架构基线 v0.5:优化器从"提示词作家"改成「依据搬运 + 缺口补齐器」。** 权威定义是 [SPEC.md](SPEC.md);`DELIVERY.md` / `PROMPT-OPTIMIZATION.md` 等旧文档自本版起降级为历史记录。 **为什么要改(判据错位的复盘)**:前几轮加的全是"优化器自己该怎么表现"的规则(档位轴、形态投影、身份层、i18n、字数基线),验证也全是**自证**的(投影不变、条款在位、字数对得上)——**没有一条验证在回答"下游一次能不能做对"**。而真实失败是"一半概率连正常目标都做不到、坦克有渲染问题",那是**能力 + 一次性执行**的问题,不是措辞问题。按模型特性重定方向:v4.1-flash 这类**不主动、不猜、一次做完**——没写进去、它又推不出来的就是**必然缺失**;写进去的它**一定照做**(提示词不是建议,是**指令集**,多写一条就多一条硬约束)。 1. **契约层重写(先砍)**:`V6_CORE` 改为【前提/依据/只补这五类/范围/歧义/不要写/语言】。**五类缺口**=① 指代与定位 ② 验收判据 ③ 约束与边界 ④ 隐含决定 ⑤ 入口与锚点。删掉"输出结构:目标 → 现状事实 → 步骤"这类**形式模板**、`验收(≤3 条,可机器判定)`、以及全部**没有具体指向**的验证套话("请充分验证/请自测")。档位正文同步瘦身:组织方式与篇幅仍由交付形态投影,其余只留"依据预算"。逐行差异见 `evidence/diff-v6-prompts.cjs`(本轮对照 `evidence/v6-prompt-baseline-beta6.json`)。 2. **档位 = 依据预算**(不是文风):普通=只用原话+上下文(补①②);高级=按需读项目文件(五类全补);极端=深读交叉核对(五类全补 + **每条改动带出处** + 正向丰富)。轴语义重锚:`depth` = `precise` / `grounded` / `exhaustive`(旧 `phased` 的"分阶段"语义取消;阶段↔清单由 ④ 组织方式表达)。**模型、reasoning effort、上下文开关三者与档位解耦。** 3. **上下文机制(W1b)**:范围**只由 UI「回合/全文」决定**——回合=最近 N 个用户回合(**用户一次 + AI 一次 = 1 回合**;**0 = 不读**,不再被兜底成 1);全文=与工作 AI 现在看到的一致的那份**会话投影**。**预算不足只降详细度、不改范围**(双方全文 → 助手截断 → 助手省略 → 逐条截断),只有最简形式仍放不下才由远及近丢范围**内**的条目并写明丢了几条。**解析不到会话就不注入**(删掉 `renderObserverBlock` 里"回落到列表里第一个会话"的隐式路径——那是同一类"猜"的病根)。注入块显式声明**旁观者身份**("你是旁观者与指挥者,不是执行者"),否则优化 AI 会以为自己是干活的。 4. **依据索引**(原"证据账本"):工具结果按**依据类型**分开——**读到内容**的文件(可引用内容与位置)、grep **命中**(可引用 `路径:行号`)、**只列过目录**的文件(只能陈述"存在",**不得**描述里面写了什么,SPEC 明令);并要求把出处写进命令。分类在工具循环里结构化落进 `toolLoopDebug.evidencePaths / evidenceHits / evidenceListed`。 5. **一次交付可用率(唯一目标指标)**:`POST/GET /outcome` + 迷你窗产出后的「成了 / 要返工」两个按钮——记的是**人给的裁决**,不推断、不自评;分档位统计便于看"档位到底有没有用"。 6. **验收工具(可证伪)**:`verify-context-scope.cjs`(上下文范围桩单测 **13/13**)、`audit-provenance.cjs`(**出处审计**:产物引用的路径必须在依据索引里;无出处的事实性断言=缺陷)、`compare-referent.cjs`(**同题对照**:长迭代里一句「修复这个 bug」有/无上下文)、`snapshot-v6-prompts.cjs` 重冻**必须带 `--reason`**(防止悄悄改判据)。 7. **判据调整(如实记录)**:`delivery=chat` 逐字节不变**不再是验收**(契约层已按 SPEC 重写),降级为**回归护栏**:基线重冻(`spec` / `reason` 落盘),上一版存档 `evidence/v6-prompt-baseline-beta6.json`。 **实测(本轮,会话 `D:\0中转站\html`)** - 真实场景 A/B/C **9/9**:工具根=该会话目录;产出无假事实 / 无"已核实" / 无事实段;不给 sessionId → 不派工具、不注入观察者(`no-session:no-session-id`);未设置形态 → `default-ptc` ✓;v5 对照仍短(0.4.3 体量特征)。 - 同题对照「修复这个bug」:**有上下文 468 字 / 无上下文 578 字**——两边都先声明"**未找到指代来源**",再给**一个**最小发现动作(有上下文时用上了上一轮的 `tank.html` 线索)。**同一题在改前是 2201 / 1009 字的"通用流程填充"**——这正是"几百上千字乱猜、反而误导原 AI"的实测病灶。 - 出处审计(真实任务"让坦克的炮塔能独立转动",只列过目录、没读到内容):产物 2344 字 / 22 条目,**无出处的事实 0 处**,且产物自己写明"我这次只拿到目录清单、没读到任何文件内容"。 **已知边界(如实记录)**:出处审计是**启发式**判据(词表 + 结构),本轮它自己就误报过三次(否定句"其中没有 tank.html"、`HTML/CSS/JS` 缩写、条件句"若已有"),三条都已修进脚本;它的作用是"把可疑行挑出来给人看",不是自动定罪。 ## v0.4.6-beta.6 — 2026/09/18 作者:啃轮胎的西狐 **根治"假事实":身份层 + 证据层 + 契约层。** **背景**(真实项目实测,8 条运行记录):46 次工具调用里 **34 次是 `glob`**、`read` 只有 2 次;工具根目录落到了 `C:\Users\WestFox\.dsh`——**不是**该次运行所属会话的目录——产出却写着"工作目录下不存在任何工程文件…只有 `attachments/v1/objects/**` 二进制对象",还标注"**已核实,不要再去找别的资料**",下游据此不再看真实项目;同一句原话三次跑出**互相冲突的硬约束**(一次"唯一允许的外部资源是 CDN three.js",另一次"不得出现 `https://`"=要求从零手写 WebGL 渲染器,用户从没要求);6/8 次观察者上下文为空。 1. **身份层(唯一入口)**:新增 `resolveRunContext()` —— 按**本次运行上报的 sessionId** 解析会话 / cwd / agent preset。**解析不到就不猜**:不派工具、不注入观察者、形态回落 chat,退化成"纯需求重述"(0.4.3 行为),**绝不产出假事实**;判定写进 `/runs.context` 与 `run.toolRoot` 供事后核对。 原先三处**各自猜会话**:工具根取"会话列表里第一个有 cwd 的"、形态判定取"最后一个会话"、观察者再按 id 找一次——三者可能指向不同会话,且都不留痕。 实测:指定 ptc 会话 → `cwd=D:\0中转站\html`(真实项目目录)✓;不给 sessionId → `chat` + `no-session:no-session-id` ✓。单测 `verify-run-context.cjs` **9/9**(含"目标会话不在列表首位"这条回归用例)。 2. **证据层**:新增 `renderEvidenceLedger()` —— 把"本次**实际读到**了什么"作为**结构输入**交给模型(与观察者块同构),而不是再加一句提醒。规则由机制背书:只能引用账本里出现过的路径 / 符号;**只列过目录不等于知道内容**;一次文件内容都没读到,就不许写"事实 / 现状"段。 3. **契约层**(`V6_CORE`,三档通用):新增【事实必须有出处】【只写下游无法自知的】,并把【歧义】扩写为"**保守不得升级成新的硬约束**"(用户没提 ≠ 禁止;不得据此禁掉依赖 / 网络 / 外部库 / 文件数量,也不得放大工作量)。prompt 变更可由 `evidence/diff-v6-prompts.cjs` **逐行审计**——本轮差异只有这三条 + 歧义扩写,无夹带。 4. **形态表述精化**:`sequence=unordered` 从"不写先后顺序"改为"**真实依赖写进条目本身**"——去掉往返节奏,保留依赖(对从零构建类任务,依赖是有意义的)。 5. **止血杠杆**:策略可在**运行时**拨动(状态文件 `strategy` 或 `DSH_PO_STRATEGY`);`strategy=v5` 即回到 0.4.3 的"纯需求重述",用于同题对照与快速回退,**不必改代码**。`/runs` 新增 `strategy` 字段。 **判据调整(如实记录)**:"`delivery=chat` 逐字节不变"这条判据在本轮**主动终止**——契约层按设计变更,逐字节相等不再是正确的锚。替代判据:① 投影不变式(`delivery` 只动 `sequence` / `budget`)② 契约条款在 3 档 × 2 形态齐备 ③ 与上一版基线的**逐行差异审计**。基线已重新冻结,上一版存档为 `evidence/v6-prompt-baseline-beta5.json`。 **新增脚本**:`verify-run-context.cjs`(身份层单测)、`diff-v6-prompts.cjs`(提示词差异审计)、`verify-real-scenario.cjs`(真实会话 A/B/C 验证)、`probe-stream-timeline.cjs`(事件流时间线)。 ## v0.4.6-beta.5 — 2026/09/18 作者:啃轮胎的西狐 **让「优化 AI 思考强度」真正生效(此前是装饰品),并给守卫补上确定性验证。** 1. **接线**:`streamWithTools` 现在会把 `reasoningEffort` 带进 `llm.stream({...})`;工具循环分支、普通分支与 `runToolLoop` 贯通同一条 `selection`。此前只有**内部自检路径** `streamOnce` 会发该字段,正式优化路径从不发。 `/runs` 现在同时给出三个值:`effort`(配置)/ **`effortSent`(实发,null = 没发)** / `effortNote`(为什么没发)。 2. **守卫**(避免"换过模型后的残留档位把正式优化打死"):**只在该模型确实声明了该档位时才发**。守卫全部分支由 `evidence/verify-effort-guard.cjs` 用 stub 定死(**7/7**)——其中"模型声明了档位但没有 max → 不发"这条在本机跑不到(目录里 5 个模型都声明全部四档),所以用确定性单测补上,而不是让它成为永远没验过的死代码。 3. **可证伪实验**(同一请求、basic 档、各 4 次;`evidence/effort-live.json`):`off` 组思考文本 **0 / 0 / 0 / 0 字**,`max` 组 **3260 / 1974 / 2193 / 2274 字(中位 2234)**,两组 `effortSent` 分别为 `"off"` / `"max"`、`effortNote` 均为 `declared`。**类别级差异(0 vs 2234)**证明该字段确实抵达了模型。 4. **纠正一条旧结论**:v0.4.5 曾写"off 均值 8745 / max 8300,行为层面的强度差异尚未被证实"——那三组当时**实际发出去的东西完全一样**(字段从不发送),差异全是噪声,该结论的前提不成立。README 对应历史条目已加更正注,并由上面的实验取代。 5. 弹层提示补一句"该模型未声明所选档位时不会发送"(中英条目继续一一对应)。 **未改动**:档位定义、delivery 投影、只读权限、收件人契约——`delivery=chat` 三档 system 仍**逐字节不变**(15/15),投影不变式与 i18n parity 回归全过。 **新增脚本**:`verify-effort-live.cjs`(同题 off/max 对照)、`verify-effort-guard.cjs`(守卫 7 分支单测)。 ## v0.4.6-beta.4 — 2026/09/18 作者:啃轮胎的西狐 **下游形态投影:同一份档位定义,两种消费形态(PTC / 对话式)。** 本质判断:**PTC 惩罚的是工序,不是深度。** PTC 执行体用一个程序组合多步、每次往返都要重新起程序,它怕的是"分阶段停下 / 逐阶段汇报 / 先建 goal·todo"这类**节奏要求**;而"细到改哪个文件的哪个函数"对它是**收益**。原先这两件事被写在同一个字段 `decompose: 'exhaustive'` 里,于是"让极端档更适配 PTC"看起来像"必须削掉极端档"——拆开就不必削。 1. **拆轴**:档位改由五轴描述——`grounding`(查证深度)/ `depth`(写到多细)/ `enrich`(正向丰富许可)+ **`sequence`(工序 ↔ 清单)** / **`budget`(不设限 ↔ 够用即止)**。前三个是能力定义,后两个是表达方式。 2. **形态投影**:`delivery = ptc` **只**把 `sequence→unordered`、`budget→single-pass`;**不变式:绝不动 depth / enrich / grounding**。档位正文由 `renderV6TierText(tier, axes)` 渲染——全仓只有这一处写"步骤 / 阶段 / 长度"这些句子。 3. **运行时判定**:手动覆盖 → 会话 `header.agentPreset`(自带预设 `ptc`)→ 回落 `chat`;新增只读诊断路由 `/delivery` 回报"判成了什么、依据是什么"。UI 在「优化模型」弹层新增一行「下游执行体:自动 / 对话式 / PTC」(三态,未从宿主读到就不上报)。 4. **消费形态声明块**:`delivery=ptc` 时注入一个与 `observerBlock` 同构的结构参数,**只声明读者是谁**(一个程序一次做完、往返极贵、有预算),规则本身由轴渲染写一次。 5. **顺带修一个真缺陷**:产出预算改为**单一来源 + 停顿看门狗**——硬上限 240s(绝对兜底)+ **45s 无增量才收手**(`DSH_PO_STALL_MS`)。原先按总时长 60s 一刀切,砍掉的是**还在稳定产出**的健康请求 → 半截命令(同批 10 题里 1 题)。改后:两题复核均正常完成(一题跑到 **10929 字 / 127 秒**),极端档 ptc 复测 **10/10 done、0 中断**。 **实测**(同一把尺 `ptc-ab.cjs`、同批 10 题、同档 extreme、无工具)——**两次独立采样,如实并列**: | 采样 | 形态 | 真实字数 | 流程开销/条 | 逐步/条 | 单程序/条 | 验收/条 | PTC 分 | |---|---|---|---|---|---|---|---| | 同批配对 | chat | 5143 | 0.4 | 0.4 | 1.1 | 0.5 | 3.6 | | 同批配对 | **ptc** | 3711 | **0.1** | **0** | 1.9 | **4.5** | 9.9 | | 复测(n=10) | **ptc** | 4179 | **0** | 0.2 | 0.4 | **5.7** | 6.12 | | 改前基线 | chat | 3381 | 0.2 | 0 | 0.9 | 0.7 | 6.93 | **稳健结论(跨采样都成立)**: - **流程开销与逐步必然更低**:ptc 两次采样 **0.1 / 0**,chat 三次 0.4 / 0.2 / 0.2; - **验收判据必然更高**:ptc **4.5 / 5.7**,chat 0.5 / 0.7(该指标跨批噪声 sd 仅 0.75,差距 6–8 倍,**远超噪声**); - **同批配对 8/10 题变好,均值 +5.8**(配对可消掉跨批漂移)。 **不稳健、因此不作为结论的**:综合 PTC 分与字数——该量尺**跨批噪声大于效应**(同一 chat 提示词两批之间条目数 sd = **9.85**、综合分 ±3.2),ptc 两次 9.9 / 6.12 与 chat 两次 3.6 / 6.93 **区间重叠**,n=10 下不足以下结论;字数同理(3711 / 4179 vs 5143 / 3381)。**零回归不靠分数证明,靠"逐字节相同"这条结构事实**(15/15)。 - **档位次序在投影后仍成立**(`evidence/tier-ordering.json`,ptc 形态内、各 n=10):条目数 极端 **31.6** > 高级 **22.3** > 普通 **18.3**;字数 3711 / 2438 / 1160。 - **中断**:改前 chat/ptc 各 1/10 被总时长砍成半截;改后(停顿看门狗)**累计 42 次运行 0 中断**(basic/advanced 各 10、extreme 两次各 10、复核 2),其中一题跑到 **10929 字 / 127 秒**正常完成。 - 帮助面板新增「下游执行体」一节(中英条目 **197/197 一一对应**,0 漏译 / 0 孤儿;`i18n-demo` 中英各 pass)。 **一处判据更正(如实记录)**:初版判据写的是"条目数与位置引用 ptc ≥ chat",实测不达标(41.3→31.6 / 4.2→2.7)。复核后确认**判据本身写错**:① 该量尺的**跨批噪声就有这么大**(同一提示词两批之间条目数 sd = **9.85**、区间 [−6,+28]);② `budget=single-pass` 的**目的就是减篇幅**(−28%),要求条目不减等于要求篇幅不减;③ 该看的是**每条目的具体度**(位置引用/条目 0.13→0.11,噪声内)与**可验收性**(验收判据 0.5→**4.5**,9 倍)。"定义不丢失"改用**档位次序**判定,那才是"档位没被抹平"的正判据。 **新增脚本**:`snapshot-v6-prompts.cjs`(chat 逐字节基线)、`verify-delivery-axes.cjs`(投影不变式)、`verify-delivery-score.cjs`(形态 A/B)、`verify-delivery-noise.cjs`(噪声 vs 效应)、`verify-tier-ordering.cjs`(档位次序 + 中断复核)、`patch-readme-delivery.cjs`(README 口径)。 ## v0.4.6-beta.3 — 2026/09/18 作者:啃轮胎的西狐 **修好"高级/极端看不到思考过程";问号面板文案与三档实际行为对齐;README 口径与实测数字同步。** 1. **思考透传修复**(三处断点,全部有代码依据):`runToolLoop` 调 `streamWithTools` 时**漏传第 9 个参数 `onDelta`**(`lib/index.js:1516` 已传入);循环只回传 `reasoningChars` 计数、**原文被丢弃**(`:1546` 改为同时回传 `reasoning`);`executeLiveRun` 工具分支把 `reasoning` **硬编码为空串**(`:2065` 改为 `looped.reasoning`)。 工具分支的 `onDelta` 只转发 `reasoning-delta` / `usage`——**正文不走这里**:工具循环是多轮的,正文以最后一轮为准,仍由原来那一次 `publishRun` 定稿,不重复推送。 **未改动**基础/高级/极端三档的定义(`V6_TIERS` 的 grounding / decompose / enrich 与温度一字未动)。 实测(同一请求、同一模型、同一 effort):思考文本字数 基础 3333(未受影响)、高级 **0 → 2817**、极端 **0 → 7396**;浏览器内实跑极端档,「思考」折叠栏摘要 = **`— tok · 6497 字`**。 2. **问号面板(使用帮助)文案与行为对齐**:原先那一节写的是 v0.2.1 / v5 时代的规则("实质优先 / 流程长度 / 硬约束 / 防过度"),而 v6 明确"不写流程仪式与通用教学"——两者相反、自相矛盾。现按三档定义与实际行为重写为:**档位**(三档各补到什么程度,并注明**三档的思考过程都显示在「思考」栏**)、**只读权限**(默认开启、能读什么、关掉会怎样)、**优化器会做什么**(收件人 / 语言层 / 保真 / 歧义 / 产出即命令,与 `V6_CORE` 五段一一对应)、**上下文**(回合=最近 0~10 回合**双方全文**;超限按六级分级压缩并声明)。 同时修掉两条**过时描述**:回合模式"只保留你的原话"(0.4.6 起是双方全文)、"上限 回合 1.2 万 / 全文 6 万字符、按整回合丢弃"(活路径注入的是观察者块,预算 1.2 万 + 分级压缩)。 中英**逐条对齐**:面板在中英两种语言下**各 7 节 / 各 24 行**;`i18n-demo` 自检断言同步改为校验新条目(`secHasReadOnly` / `rowHasAddressee` / `rowHasFidelity` / `rowHasTierFacts`),中英各跑一次 `pass: true`。 3. **README 一类文档与实际行为 / 版本号同步**:修掉 6 处口径(中英同改,脚本 `evidence/patch-readme-behavior.cjs`,每条断言"恰好命中 1 次"): "0.4 = 需求补全器"框里"**不写步骤、不写验收清单**"(与高级/极端档明确要求阶段性任务 / 步骤相反)→ 改为按档位说明补到什么程度; "系统提示词 **515 字符**、产出 **422 字符**"→ 实测 高级 **2542** / 极端 **2687** 字符(含观察者块),产出 普通 **306** / 高级 **2008** / 极端 **3954**; "提示词组装:`RELAY_IDENTITY` → … → `PROCESS_RULES`"(v4/v5 遗留常量)→ 改为 `V6_CORE` → 档位正文 → 观察者块 → 收件人契约; "只发送你的输入文本 +(高级/极端档)目录树摘要"(`projectContext` 在活路径**从未注入**)→ 改为实际范围(会话上下文 + 只读权限开启时读项目文件)。 `PROMPT-OPTIMIZATION.md:61` 的"活路径不带工具"→ 更正为**带工具**(默认开)。 **新增验证脚本**:`verify-i18n-parity.cjs`(中英条目一一对应审计:0 漏译)、`verify-reasoning.cjs`(三档思考通道对照)、`probe-reasoning-ui.cjs`(浏览器内实跑读「思考」栏)、`probe-cmd.cjs`(通用 UI 探针)、`patch-readme-behavior.cjs`(README 口径同步)。 ## v0.4.6-beta.2 — 2026/09/18 作者:啃轮胎的西狐 **两处按原话改动 + 一处治根:把「产出物的收件人」写进架构。** 1. **只读权限默认开**(原话:"让读取工具默认开启")。改成**三态**:状态文件里**缺失该键 = 开**,只有**显式 `false`** 才算关(已保存的显式值不被改写);读取异常也按开处理。 实测:把 `readTools` 键从状态文件删掉后 `GET /state` → `true`;不传任何参数跑一次极端档 = **6 次真实工具调用**(`glob`/`grep`);显式 `false` = 0 次调用、产出 4000 字。 浏览器侧同步改成三态(`null` = 未读到就**不上报该字段**),否则"未设置(默认开)"会被 UI 的首次落盘误写成显式 `false`。 2. **文案与位置**(原话:"只读查证(让优化 AI 真的读项目)改成「只读权限:」,按钮放在右边")。标签改为 `只读权限:`(en:`Read-only access:`), 开关控件移到标签**同一行的右侧**,说明保留在下一行。真实 DOM 实测:`toolsLabel="只读权限:"`、`toolsOn="true"`、`sameLine=true / dy=0 / btnRightOfLabel=true / overflowRight=-25`(不出界、标签未截断)。 3. **治根:产出物的收件人**。原话指出极端档产物第一句是**对老板说的**——"把下面这段整条发给工作 AI(原话里的两件事:…)"——直接转发容易误导会话 AI:**优化 AI 是领导,只能对员工(会话 AI)说话**。 病根不是"少了一条注意事项",而是契约只规定了"内容要像一条能发出去的命令",**从未规定产出物的收件人**,模型于是把产出物当成"回给老板的信"。两层根治: - **契约层** `OUTPUT_ADDRESSEE_CONTRACT`:收件人写进 system,`buildSystem` **统一追加**(全策略、全档位生效,放最后=模型看到的最后一条产出规则); - **闸门层** `enforceAddressee`:宿主在**唯一产出出口**上强制剥离转交语与包装——只扫**首尾**(正文里的"复制到 / 告诉我"不误伤,判官自检含 4 条误伤压力用例),剥完不足 20 字**整段回退原文**(绝不返回空),处理结果写进 `run.addressee` 供 `/runs` 复核;`done.text` 成为**定稿**,流式 delta 只作预览。 实测(复现用例=这一轮的原话):极端档产出 `addressee = {triggered:false, action:"no-hit"}`——**转交语根本没生成**(契约层生效);闸门判官自检 **13/13**(坏标全拦、金标一字未动)。 降级实测:`forceToolError` 让只读工具链失败 → `toolLoopError` 记录在案、回落无工具路径、产出 **3816 字非空**。 **硬约束**:只读权限**默认开启**(本版起覆盖上一版的"默认关闭");工具链任何失败**降级为无工具运行且结果非空**;闸门任何异常原样放行。 **一处判断**:降级/失败声明落在**运行记录**(`toolLoopError`、`/runs`),**不写进产出物**——产出物是给会话 AI 的指令件,在里面写"已降级"就又变成对老板说话。 **新增验证脚本**:`verify-addressee.cjs`(闸门判官自检)、`verify-046b2.cjs`(默认开/显式关/降级/收件人四项)、`probe-tools-row.cjs`(真实 DOM 读只读权限行)。 ## v0.4.6-beta.1 — 2026/09/17 作者:啃轮胎的西狐 **三步改造完成:只读查证 / 观察者上下文 / 预算与压缩。** 1. **只读查证(工具路径)修通**。根因:`relayMessage()` 返回的是**消息数组**(非工具路径当 `messages` 用),而 `runToolLoop` 的 `userText` 需要**字符串**,于是数组被塞成 `content:[{type:'text',text:<对象>}]` → provider 报 `messages[0].content: invalid type: sequence, expected a string`。宿主六种形态复刻均成功、只有插件失败,正是这个接线错误。 修复后实测:开关 ON = **10 次真实工具调用**,产出含**真实事实**("只有顶层目录 `attachments/`,其下 `attachments/v1/objects/`,按哈希前 2 位分桶"); OFF = 0 次调用、泛化建议。另有一例它读 5 次后**如实说明**"我可见的目录里没有 package.json,需要你在真实仓库里定位"——读了就报实情,没编造。 2. **上下文观察者视角**。数据源改为会话**投影** `derived`(会话 AI 真正看到的投影消息,实测 1418 条),**不走事件重放**; 经 `buildSystem(tier, { observerBlock })` 作为**结构参数进入 system**(不再塞进用户消息)。 三模式对照验证:turns `{24672 字符/65 行}`、full `{35232/120}`、off `{0/0}`;前两者产出**引用真实历史**,off 组零命中且明说"无法定位就说明缺少上下文,不要猜测"。 3. **预算与压缩**。预算默认 12000 字符(`DSH_PO_OBSERVER_BUDGET` 可覆盖),六级压缩: 未压缩 → 最近 4 回合+助手截 600 字 → 最近 2 回合+截 200 字 → 仅用户原文 → 逐条丢弃 → 整体省略;**每一级都写进注入文本**。 实测 turns 24672 → **2860** 字符、full 35232 → **2855** 字符,声明为"仅保留最近 4 个回合、助手截断 600 字";压缩后仍命中历史话题。 **硬约束**:只读开关默认关闭;工具路径异常**降级回正常路径**(绝不给空结果);观察者渲染异常返回空串(保持原行为)。 **新增验证脚本**:`verify-readtools.cjs`、`verify-readtools-workspace.cjs`、`verify-observer.cjs`、`verify-observer2.cjs`、`verify-observer-budget.cjs`。 ## v0.4.4-beta.1 — 2026/09/16 作者:啃轮胎的西狐 **修掉两个已上报缺陷(issue #9 / #8);优化策略未变(v5「只补全要求」)。** - **#9 客户端「控件自愈」每 1.2 秒抛一次 pageerror**:slot 注册按 **id** 去重,自愈循环却用同一个 `id` 再注册 → 抛 `already has an entry with id "prompt-optimizer"`;改 `order` 绕不开(`order` 不是冲突键)。修复:重挂前**先释放上一次的重挂** (保存并调用 `ctx.slots.inject(...)` 的 disposer,定时器清理时一并释放);`shell.overlay` 自愈同构,一并修;重挂失败现在会记 beacon。 - **#8 本会话拦截次数显示为真值两倍**:同一次发送会走两条路径(`keydown-enter` 与随之触发的 `click-send`),每次 push 两行。 修复:互补路径标 `coalesced`(遥测保留),新增 `interceptCount()` 供三处显示使用;自检与遥测仍用原始行数。 - 发布流程:`gh-api.cjs` 新增 `publish`(一次完成 建/更新 release → 版本化资产 → **版本无关别名资产** → 标记 latest → 回读校验)。 本次同时避免重演 issue #6(tag 指向提交里的 package.json 版本落后):发版前先提交推送版本号,再打 tag 并核对。 ## 0.4 与 0.1 的区别(先看这一页) **0.1 = 改写器**:把用户的话改通顺(病句、错别字、标点、指代),输出仍是那句话的润色版——**它不补内容**,用户没写到的部分,下游 AI 照样不知道。 **0.4 = 需求补全器**:用户通常只说一句(10–200 字),它把这句话补成一份**完整、具体的要求说明**——对象落到具体文件/界面/模块、结果是什么样子、在哪些使用情形下要成立(双击打开/离线/窄窗口/换语言主题)、边界怎么处理、范围到哪里。 **不写流程、不写步骤、不写验收清单、不写验证纪律、不写禁止事项**——这些是下游 AI 自己的能力;写进去只会占它的注意力预算、收束它的解法空间。 | 版本 | 系统提示词 | 同一句 20 字请求的产出 | 管理性文字 | | --- | --- | --- | --- | | 0.3.x | 6478 | — | 大量(阶段/闸门/证据清单) | | 0.4(v4) | 2069 | 4588 | 大量 | | 0.4.1(v4.1) | 2118 | 2164 | 部分 | | **0.4.3(v5)** | **515** | **422** | **全 0** | 管理性文字是有代价的:旧策略要求"逐步验证并贴证据",把下游程序撑爆,**10/24 格被判预算截断而白扔**。 (详细推导见 `evidence/ARCHITECTURE-v5.md`;以下按版本倒序保留历史记录。) ## v0.4.3-beta.1 — 2026/09/16 作者:啃轮胎的西狐 **策略 v5:只补全要求(Requirement Completion Only)—— 一次减法** v2/v4/v4.1 都默认"优化器应当管理员工的工作方式"(给步骤、给验收清单、给验证纪律、给禁止事项)。这个假设被推翻: 1. **优化器的唯一价值是补上用户没说的内容**;除此之外写的每个字,都在替员工做它本来就会做的事。 2. **复述通用能力=教它已经会的东西**:v4.1f 具备基本验收与认知能力,写进去只占它的注意力预算 (实测:旧策略要求"逐步验证并贴证据",把执行端程序撑爆,**10/24 格被判预算截断白扔**)。 3. **禁止性措辞有副作用**:把注意力引到被禁止的事上并收窄解法空间(与"权限太少、限制太多"的观察一致)。 分工改为:**优化器只管"要什么"(内容层);怎么做、怎么验全归员工(能力层)。** "验收"不再是检查清单,而是写成**使用情形与结果的样子**(例:"用户双击这个文件就能看到坦克,不需要装任何东西、也不需要联网")。 实现:系统提示词 **515 字符**(v4 为 2069、v4.1 为 2118);删除流程编排、步骤安排、验收清单、验证纪律、探针、回执格式、禁止事项、通用教学。 **活实例实测**(同一句 20 字请求):产出 **422 字符**(v4 为 4588、v4.1 为 2164); 管理性痕迹 **全 0**(验收/验证/探针/必须/步骤/回执/pass/fail/基线均为 0;唯一一处"不要"是内容里的"加载异常时不要静默隐藏")。 覆盖度仍完整:对象消解、结果形态、常见使用情形(窗口大小/缩放/主题/语言)、边界(资源缺失/路径错误/逻辑隐藏)、范围限定。 工程:旧策略全部保留作 A/B(测试台策略清单已有 v5/v41/v4/v011/v0310/v038/norefine);零依赖不变;UI 与功能未改。 发布资产 224540 bytes,本地与 GitHub 回读 sha256 一致(`d0052d04…9f6c`)。 ## v0.4.2-beta.1 — 2026/09/16 作者:啃轮胎的西狐 **策略 v4.1:覆盖优先 + 终局单次验证** 底层推理(不是手感调整): 1. **出错几乎全因"提示词没考虑到"**,而**再多的检查也找不出一个从没被写进去的要求**——检测无法弥补遗漏; 2. 每次检查在 PTC 里都要占**程序篇幅 + 执行时间 + 下一轮上下文**(实测:要求"逐步验证并贴证据"的旧策略把执行端程序撑爆,10/24 格被判预算截断白扔); 3. 唯一与"用户将来满不满意"**同分布**的观测,是**完成后在真实媒介里对成品看一次**——其余都是代理的代理。 于是:**预算的绝大部分给"覆盖",验证降级为一次终局观测。** 五节结构:**目标** → **完成时应当是什么样**(=验收清单,覆盖度全部载体,逐条写明"什么情况算没做到")→ **要做的事**(纯动作,**不挂验证、不挂"预期"**)→ **隐含要求**(只加检查与约束,不加工作量)→ **交付物与最后一次观测**(做完对成品看一次,逐条回执 + 未验证清单)。 验证只有三条纪律:不边做边验(中途最多"偶尔看一眼",不是门、不产生分支);只在真实媒介里对成品看一次;那一次必须能失败。 修复类任务=动手前一张基线 + 修完一张对比(两次截图够了)。探针能省就省,优先"构造上稳健"(直接本地内联资源,而不是先探 CDN)。 **活实例实测**(坦克履带 20 字请求):产出 **2164 字符**(v4 为 4588,减半);逐步验证痕迹归零(`预期:`=0、`探针清单`=0、`观测点与基线`=0); 步骤为纯动作,第 3 步给出**病因分类**(资源 404 / 节点可见性 / 材质 opacity·alphaTest·色彩空间·背面剔除 / UV 与图集 / 遮挡与深度 / 加载时序被静默 catch / canvas 与 DOM 层叠); 中途仅保留"重新加载真实画面看一眼(**不作为关卡**)"。 工程:旧策略全部保留可作 A/B;零依赖不变;UI 与功能未改。发布资产 222438 bytes,本地与 GitHub 回读 sha256 一致(`a28ea32b…7250`)。 ## v0.4.1-beta.1 — 2026/09/16 作者:啃轮胎的西狐 **策略换代:探针优先的适应式计划(V4)** 不再试图预先枚举领域约束(那需要人工维护清单、换个领域就废、无法交付他人维护),改为规定**如何从真实媒介里把未知问出来**: 把每个"我不确定"改写成一次能用是/否回答的最小实验(探针),并写清"失败长什么样、失败时改走哪条路"。 三条不变式(均有实测支撑):① 员工只做明说的 → **覆盖率=完成率**;② 优化器在想象里写、员工在真实里做 → **不确定的事实一律改写成探针,不许断言**; ③ **不能失败的检查=装饰**(实测:验证桩把 `COMPILE_STATUS` 硬编码为 true,等于把最容易出事的判定从验收里删掉)。 产出固定六节:**目标与判据**(成功/失败长什么样 + 主观词翻译)→ **观测点与基线** → **步骤**(风险优先;动作|预期|若不符怎么办)→ **探针清单** → **隐含要求**(只加检查与约束,不加工作量)→ **交付物与回执**(原始证据 + pass/fail + 未验证清单)。 另有:手段全开/范围冻结;代理只能定位不能判定;观测点建不起来就停下报告;不得把该员工做的事推给用户。 **活实例实测**(坦克履带那句 20 字请求,输出 4588 字符、六节齐全)——它自行推导出了此前三轮才踩到的坑: "跑不起来先解决,不算修履带";用 Network 看履带资源状态码;临时改高饱和色区分"没渲染"与"同色看不见";有头/无头各开一次; 并写死"无头模式只能作辅助定位,不能单独作为'完成'的判定依据"。 工程:`release-local.cjs` 新增自动同步 `lib/client.js` 的 build 标签(此前手工维护,实测漂移停在 `v0.3.10-beta.2`); 策略文本 2069 字符(三档一致);旧策略全部保留可作 A/B;零依赖不变;UI 与功能未改。 发布资产 219535 bytes,本地与 GitHub 回读 sha256 一致(`67b9af68…6e5f`)。 ## v0.3.13-beta.1 — 2026/09/16 作者:啃轮胎的西狐 **修复:settings 命名空间自愈注册** 现象(重启后实测):`/api/state` 的 `settings` 从 `error: TypeError: schema is not a function`(0.3.11 已修) 变成 **`no-settings-service`** —— 插件初始化时没拿到 settings 服务,命名空间未注册、设置镜像未启用。 诊断(宿主探针实测):此刻 `ctx.get('settings')` **可用**(`register` 是函数),且 `describe()` 的命名空间清单里 没有 `prompt-optimizer` ⇒ **settings 服务晚于本插件挂载**,而 `initSettingsNamespace(ctx)` 只在 apply 时执行一次, 一次性查询永久错过。 修法:在既有 1.2s 看门狗里加自愈重试 —— 状态仍为 `no-settings-service` 时再试注册(幂等,成功即停)。 校验:`node --check` 通过;提示词逐字节未变(1273/1627/1736);`lib/index.js` 123347 bytes / sha256 前缀 `fa4a6dd58415a8ba`;`lib/client.js` 未改动。发布资产 211989 bytes,本地与 GitHub 回读 sha256 一致(`a66c841f…9c9c`)。 **需再次重启才在活实例生效**(重启后应看到 `settings: registered`)。 ## v0.3.12-beta.1 — 2026/09/16 作者:啃轮胎的西狐 **仅代码卫生(P1),优化策略与提示词逐字节未变**(basic/advanced/extreme = 1273/1627/1736 字符,与 0.3.10 一致),UI 与功能不受影响。 | 项 | 改动 | | --- | --- | | `buildSystem` 死分支 | 改显式开关 `const STRATEGY = 'v011-ptc' \| 'v03x'`;注明"停用不等于删除"(`TIER_PARTS`/`HISTORY_RULES_*` 仍被 tier-compare、自检引用) | | 历史纪律 | 新增 `const HISTORY_INJECTION = false` —— 明确"不注入"而非"参数被静默忽略";置 true 即恢复按 `historyMode` 追加 `HISTORY_RULES_*` | | 内存边界 | `liveRuns` / `optSessions` 改用 `CappedMap(64)`:超限按插入序淘汰最旧,**running 条目永不淘汰**(避免掐断 SSE 流) | | 生产包卫生 | 新增总开关 `DSH_PROMPT_OPTIMIZER_DIAG=0`:关闭本插件写入 `evidence/` 的全部诊断流;实现在 `appendFileSync` 外包一层统一守卫(6 处调用点无需逐处改,新增写入自动受控) | 校验:`node --check` 通过;提示词快照与 0.3.10 逐字节一致;`lib/index.js` 122949 bytes / sha256 前缀 `4be06956cbb26553`; `lib/client.js` 未改动。发布资产 211183 bytes,本地 sha256 与 GitHub 回读一致(`4cc7e3ef…dafd`)。 **需重启 DSH 才在活实例生效。** ## v0.3.11-beta.1 — 2026/09/16 作者:啃轮胎的西狐 **修掉线上真实报错:`settings: "error: TypeError: schema is not a function"`** 根因:插件把 **zod** 对象当 schema 传给 `settings.register(ns, schema)`,而 DSH 的 settings 服务要求 **schemastery** schema(schema 必须是**可调用对象**,字段自带默认值与校验)—— zod 对象是普通对象, 服务内部的 `schema(...)` 调用直接抛 TypeError。用宿主探针实测确认:`@deepseek-ai/schemastery` 从 profile 可解析,`S.object({...})` 返回 `typeof === 'function'`,默认值/校验行为正常。 修法:按候选名解析 `@deepseek-ai/schemastery`(回退 `schemastery`)→ 构造 schema → **显式自检 `typeof schema === 'function'`**;解析不到或形态不符时给出准确状态串(`schema-unavailable` / `schema-not-callable`),不再抛含混的 TypeError。 **优化策略未变**:仍是 0.1.1 原样提示词 + PTC 规则(A 交付形态对齐 PTC / B 验收≤3 条可机器判定 / C 删失败预案)。 发布校验:`lib/index.js` 120752 bytes / sha256 前缀 `1beb58f2820a6ac1`;tgz 209436 bytes, 本地 sha256 与 GitHub 资产回读一致(`70aa20678df1928bd72ec73ba51e94f3a66be939723fe35d92135dd50c19ef57`)。 **⚠️ 需重启 DSH 才在活实例生效**(loader entry 按包名重新解析;只改 junction 或热重载不会切换)。 ## v0.3.10-beta.2 — 2026/09/15 作者:啃轮胎的西狐 **同批代理指标验证 A/B/C 生效(5 题 × 3 策略,同一次运行)** | 策略 | 平均字数 | 硬约束/条 | 流程闸门·阶段/条 | 计划(goal/todo)/条 | 失败预案/条 | 一次成程序/条 | |---|---|---|---|---|---|---| | 0.1.1(回退基线) | 1769 | 3.6 | 8.6 | 1.0 | 1.2 | 0 | | 0.3.8(旧重约束) | 3004 | 35.6 | 11.2 | 1.0 | 0.6 | 0 | | **0.3.10(0.1.1 + A/B/C)** | **807** | **2.0** | **0.2** | **0** | **0** | **0.6** | - 读法:A(交付形态)把"流程闸门/阶段"从 8.6~11.2 压到 **0.2**、"计划(goal/todo)"压到 **0**;B/C 把"失败预案"压到 **0**、硬约束从 3.6(0.1.1)/35.6(0.3.8)压到 **2.0**;平均字数比 0.1.1 还短 54%(**807 vs 1769**),并首次出现"一次成程序"类表述(0.6/条)。 - 数据:`evidence/ptc-proxy-compare.json`(逐题明细);脚本 `evidence/ptc-ab.cjs` 与 staging 工具 `ptcproxy`。 - **诚实标注**:这是**关键词代理指标**(测"有没有出现",不测效果),且**未在真 PTC 中验证**;本版**不声称提升**。真实验证入口:`evidence/ptc-manual-packet-v0310.md`(B 组已用 0.3.10 重生成)。 - 本轮同时修正上一版文档里的数字偏差(预估 1726/1835 → 实测 **1627/1736**)。 ## v0.3.10-beta.1 — 2026/09/15 作者:啃轮胎的西狐 **在 0.1.1 基础上加"面向 PTC 的交付形态"(A+B+C),不再走 0.3.x 的重约束路线** ### 为什么(结构分析,见 evidence/ptc-gap-analysis.cjs / .json) | 指标(extreme 档) | 0.1.1 | 0.3.8 | |---|---|---| | 提示词字数 | 1421 | 6478(4.6×) | | 小标题数 | 0 | 18 | | 必须/不得类硬约束 | 7(4.9/千字) | 93(14.4/千字) | | 流程编排(分阶段/todo/goal) | 6 | 16 | | **流程闸门(切片/逐层/停手)** | **0** | **16** | | **失效模式清单(逐域)** | **0** | **29** | | 自检证据(贴输出/明细/对账) | 2 | 29 | 机制:PTC 执行体用**一个程序**组合多步、没有逐步工具,**每次往返都要重新起程序**。因此"切片/逐层验收/每阶段贴输出"在 PTC 里等于强制多轮往返(耗时暴涨),"十几条领域清单"则挤占程序需要的上下文并压掉模型自己的判断——这与"过度约束→随机应变下降、调试拘谨、时间变长"的实测反馈一致。 ### 本版三条补丁(只加这三条,其余保持 0.1.1 原文) - **A 交付形态**:下游是 PTC 型执行体(一个程序一次做完);**不得**要求分阶段、逐步、每阶段贴输出、先建 goal/todo、先规划再动手。 - **B 验收瘦身**:验收标准**最多 3 条**,每条必须**可机器判定**(数值/存在性/逐字符相等/退出码/可解析)。 - **C 删预案**:不写失败预案,压成一句"任何不确定处走最保守路径并在交付里注明";拿不准处宁可留白,不要堆"必须/不得"。 - 规模:advanced 1312 → **1627**,extreme 1421 → **1736** 字符(实测值;此前脚本预估写成 1726/1835,已更正)(仍远低于 0.3.8 的 6480/6478);普通档保持 0.1.1 原文(1273)。 ### 诚实边界 - 上述差距是**关键词代理指标**(测"有没有出现",不测效果);机制推理是解释性的,**尚未在真 PTC 中验证**。 - 本版**不声称提升**:它只声称"移除了与 PTC 消费方式冲突的要求,并补上一条交付形态指引"。真实验证用 `evidence/ptc-manual-packet.md`(人工 PTC 测试包)。 - 待修 bug:插件活实例热重载后 `/run` 仍走旧策略(0.3.8 指纹),需单独排查路由/模块缓存。 ## v0.3.9-beta.1 — 2026/09/15 作者:啃轮胎的西狐 **优化策略回退到 0.1.1(PTC 口径实测确认假设;UI 与功能不受影响)** ### 为什么回退:同口径 PTC 适配度实测(10 题 × 2 采样 = 20 格/条件) | 条件 | 平均字数 | 硬约束/条 | 每千字 | 流程开销/条 | 自由度/条 | **PTC 适配分** | 旧评分卡 | |---|---|---|---|---|---|---|---| | **0.1.1 旧策略** | 1822 | **3.2** | 1.8 | **2.85** | 0.2 | **+1.93** | 71.9% | | **0.3.8 现策略** | 2699 | **30.6(≈10×)** | 11.3 | **9.9(≈3.5×)** | 0.1 | **−17.52** | 92.8% | - 结论:0.3.x 的**硬约束数量高一个量级、流程开销高约 3.5 倍、命令长 48%**,与"AI 被过度约束、随机应变下降、调试拘谨、开发时间变长、UI/操作反而退步"的真实反馈一致。 - **同时暴露量尺问题**:旧评分卡给 0.3.8 更高的分(92.8% vs 71.9%)——说明它测的是"约束齐全度",**不是**对 PTC 消费者的适配度。此前基于该量尺的"提升"结论**不再作为效果证据**。 ### 本版改了什么(只回退优化策略) - `buildSystem()` 增加回退分支:三档 system 直接返回 **0.1.1 原文**(内联常量 `LEGACY_V011`,逐字节取自 `prompt-snapshot-v011.json`); - **逐字校验通过**:basic 1273 / advanced 1312 / extreme 1421 字符,与 0.1.1 快照 `一致=true`; - **UI、i18n、上下文模式、迷你窗、模型弹层、进度面板等功能一概未动**(仅提示词策略回退)。 ### 文档:中英文最上方新增 PTC 使用警示 > **本插件针对 PTC 模式进行优化**;建议在 PTC 模式下使用,否则可能无法实现明显的效果提升,**不排除其他模式倒退的可能性**。(English 版同样置顶) ### 诚实标注 - `evidence/prompt-invariants.cjs`(34 项"0.3.x 约束不丢失"断言)**对本版已过期**:本版有意回退到 0.1.1 策略,该闸门必然失败;它现在只能用于"若将来再引入 0.3.x 规则"的对照,不应作为本版回归证据。 - PTC 适配分是**文本层代理指标**(硬约束密度、流程开销、自由度、单程序友好、交互覆盖),衡量的是"命令对 PTC 消费者的友好度",**不等于**真实任务成功率;真实成功率需要在 PTC 环境里端到端跑(待办)。 ## v0.3.8-beta.1 — 2026/09/15(收尾轮) 作者:啃轮胎的西狐 **第三方口径复检(⑦c)——候选改动,尚未测** - 诊断(来自上一轮):0.3.5~0.3.7 三份 H3 候选样本中 **2 份"假完成"**(自检说修好了、独立审计实测 24 / 21 个内向面)⇒ 问题已从"入口没落地"转移到"**自检结果与真实几何不一致**"。 - 改动(⑦c):自检必须**逐项给出被检查对象明细**(几何逐面判定或用"检查面数 = 网格面数"对账并给出反向面索引;数据逐条或抽样明细);检查数少于实际对象数时必须说明跳过了什么、为什么;**只给汇总数字不算完成**,且第三方按明细能复算出同一个数字。 - **诚实标注:本改动尚未测量**(本轮无剩余采样预算)。它作为候选进入 0.3.8,下一轮按同口径测 H3(目标 n≥2/条件)后再决定保留或回退;**不声称任何提升**。 **0.3.1 → 0.3.8 能力与指标汇总(同口径,n≥2 处已标注)** | 版本 | 主线改动 | 命令侧(满分 180) | 产物级 0~3 分档(三题) | |---|---|---|---| | 0.3.1-beta.1 | 先防后查(押注首要失效/最小切片/机器可判定不变量/惯例优先/失败即报告) | **169(93.9%)**,配对 9-0-1 | — | | 0.3.2-beta.1 | +切片闸门、统一自检入口("或等价") | 165(91.4%),噪声内 | — | | 0.3.3-beta.1 | 自检入口**写死**(`__selfcheck` 结构 + 真实输出) | 165(91.9%) | 12/36(33.3%) | | 0.3.4-beta.1 | +命令侧子指标(入口要求 100% vs 发布版 0%) | 165(91.9%) | 12/36 | | 0.3.5-beta.1 | 入口与交付物同体 | 未测(规格澄清) | H3 仍 0/18(后判定为量具混淆) | | 0.3.6-beta.1 | 量具修复后 H3 首次可信测量 | — | **17/45(37.8%)**;H3 4/6 对 0/6 | | 0.3.7-beta.1 | +改完必须复检(⑦b) | — | H3 仍出现假完成(21 个内向面) | | **0.3.8-beta.1** | +第三方口径对账(⑦c,**未测**) | — | 待测 | - 发布版对照(0.2.2-beta.1):命令侧 125(69.2%)· 产物级 0/45(0%)。 - 两条主指标的分工:**命令侧**量"要求是否写进命令"(规格层,n=2 有噪声估计);**产物级 0~3 分档**量"执行体是否真的做到并可被第三方复跑"(执行层)。 **仍未解决(如实列出)** 1. **假完成**:入口能落地,但自检数字与真实几何不一致(H3 三样本里 2 份);⑦c 是针对它的候选对策,未验证。 2. **产物级样本小**(每格 n≤4),且 H3 单次生成 2~18 分钟,采样成本高。 3. **H2/H3 的"2 分档"从未出现**(要么全过要么 0/1),说明中间档判据还不够敏感。 ## v0.3.7-beta.1 — 2026/09/15 作者:啃轮胎的西狐 **加"改完必须复检"(⑦b)——但"假完成"仍在,如实记录** - 改动(⑦b):任何修复/优化之后必须**重跑同一个自检入口**并贴出输出,且**修复前后数字都要给**(例:"反向面 24 → 0");只声称"已修好"而没有复检输出视为未完成。动机来自上一轮抓到的那份"声称修好、实测 24 个内向面"。 **复测(H3 两条件各 1 份,n=1)** | 条件 | 得分 | 明细 | |---|---|---| | **v0.3.7-beta.1** | **1** | 统一自检入口**已具备**(上版常缺),但独立审计仍测到 **21 个内向面** ⇒ "假完成"模式**依旧存在** | | 发布版 0.2.2-beta.1 | 0 | 无统一自检入口;但独立审计 `inwardFaces=0`(几何本身修对了) | - **诚实结论**:本版改动**没有消除假完成**(n=1,样本极小,只说明"仍然存在",不足以说明频率)。把 0.3.5~0.3.7 三份候选样本合起来看:**1 份满分(inward=0)、2 份假完成(24 / 21 个内向面)** ⇒ 该题的核心问题已经清晰:**入口能落地了,但"几何真的修好了没有"仍靠不住**。 - 第二主指标:**V3 17/45 = 37.8%(分布 8/2/0/5)· 发布版 0/45 = 0%(15/0/0/0)**;"1 分档"(部分做到)样本增至 2 份。 - 规模:极端档 6314 字符(普通档仍 1405);约束闸门 34 项断言全 PASS。 ## v0.3.6-beta.1 — 2026/09/15 作者:啃轮胎的西狐 **H3 首次可信测量:候选版 4/6 对发布版 0/6,并抓到真实产物缺陷** 量具修复后(执行体声明"无工具、直接产出完整文件")重测 H3(审计并修复反向面网格),两条件各 2 份: | 条件 | 新样本得分(0~3 分档) | 明细 | |---|---|---| | **v0.3.6-beta.1** | **4/6** | r1 = **3 分**(入口齐备 + 修复正确 + 独立审计通过,inwardFaces=0);r0 = **1 分**(有入口,但独立审计发现 **24 个内向面**) | | 发布版 0.2.2-beta.1 | 0/6 | r0 = 0 分(无入口,且 **10 个内向面**未修好);r1 = 0 分(无入口,法线本身正确) | - **真实缺陷**:候选版那份"声称修好、实测 24 个内向面"的产物,正是用户最初描述的失效模式(该看见的面看不见);说明"要求写明自检 + 第三方复跑"确实能把这类假完成揪出来。 - **可靠性而非能力**:候选版 2 份里 1 份拿满、1 份假完成 ⇒ 能力存在但**不稳定**;这正是下一轮要压的方向。 - 第二主指标(三题 0~3 分档):**V3 16/42 = 38.1%(分布 8/1/0/5)· 发布版 0/42 = 0%(14/0/0/0)**——首次出现"1 分档"(部分做到)样本,区分度提升。 - 诚实标注:H3 每格 n=2,样本很小;结论只针对"该题该量具下的形态差异",不外推。 ## v0.3.5-beta.1 — 2026/09/15 作者:啃轮胎的西狐 **规格澄清:自检入口与交付物同体(H3 前沿未攻下,如实记录否定结果)** - 改动(⑦ 的补充):`window.__selfcheck()` 必须**在脚本顶层直接可调用**(不得只挂在 `load`/`DOMContentLoaded` 回调里、不得依赖用户先操作才挂载);**交付前必须真跑一次并把输出原样贴出**。 - 动机:H3(审计并修复反向面网格)六份产物**全部缺统一自检入口**,怀疑是"挂载时机"造成第三方取不到。 **H3 近空产物的诊断(本轮,测量端混淆)** 逐份查原始产出后发现:近空产物并非"做不出来",而是**执行 AI 开始"干活"就停了**—— - SHIP 的一份(1536 字节)只输出 TODO 清单(遵循了命令里"先列 todo"); - 候选版的一份(640 字节)写着 `Step 1 — 侦察:查找工作目录下的几何文件`,并输出 `` 想执行 `pwd` / `ls` / `find *.obj`。 **但测量台的执行 AI 没有任何工具**(无文件系统、无 shell),于是它卡在第一步、产出近空文件。 结论:**H3 的测量被"无工具执行体 + 命令要求先查证"这对矛盾污染**,不能据此判断提示词优劣。 处置:在产物级执行体的系统提示里明确"你没有工具、不要输出计划或工具调用,直接产出完整单文件 HTML",下一轮用**修好的量具**重测 H3。 **复测(同口径,H3 两条件各 3 份)** | 条件 | H3 得分(0~3 分档) | 分布 0/1/2/3 | |---|---|---| | 发布版 0.2.2-beta.1 | 0/18 | 6/0/0/0 | | **0.3.5-beta.1** | **0/18** | **6/0/0/0** | - **否定结果(诚实标注)**:本版改动**没有让 H3 有任何一份满足判据**(0/6 对 0/6),因此**不声称提升**;该改动仅作为规格澄清保留(对 H1/H2 亦无副作用:三题合计 V3 12/42 = 28.6%、发布版 0/42 = 0%,V3 的 4 份满分仍全部来自 H1/H2)。 - **新观察到的执行侧现象**:H3 本轮出现 **528 字节与 1072 字节的近空产物**(执行 AI 基本没产出)——说明该题对执行侧本身偏难,第三方复跑失败未必全是"入口形态"问题,下一轮需要先排查"为什么 H3 的产物会近乎为空"。 - 规模:极端档 6192 字符(普通档仍 1405);约束闸门 34 项断言全 PASS。 ## v0.3.4-beta.1 — 2026/09/15 作者:啃轮胎的西狐 **补齐量尺:0.3.3 的"统一自检入口"要求在命令侧首次被测到** - 背景:前两轮发现 0.3.3 的改动在**命令侧评分卡上测不到**(评分卡没有该要点),于是补一个**独立确定性子指标**,用同一批命令直接量它(零额外 LLM 成本,脚本 `evidence/selfcheck-metric.cjs`)。 - 子指标三项:① 命令是否要求统一自检入口 ② 是否写明返回结构(`checks` / `pass` / `evidence`) ③ 是否要求附**真实运行输出**。 **同批命令(10 题 × 2 次采样 = 60 格,291 秒)** | 条件 | 子指标:三项齐备 | 命令侧总分(满分 180) | 配对 | |---|---|---|---| | **0.3.4-beta.1(=0.3.3 提示词)** | **100%(20/20)** | **331/360 = 91.9%**(165/180) | **9 胜 / 0 负 / 1 平** | | 发布版 0.2.2-beta.1 | **0%(0/20)** | 249/360 = 69.2%(125/180) | — | | 无优化 | 0% | 8/360 = 2.2% | — | - 噪声:同格重复采样平均极差 **0.87 分/18**(最大 5)。 - 子指标明细:V3 提到入口/结构/要求实跑输出 **各 100%**;发布版分别 **0% / 0% / 5%**。 - **诚实标注**:子指标测的是"**要求是否写进命令**"(规格层),不等于执行方真的照做——执行侧落地率见产物级指标(H1/H2 各 2/4 对 0/4、旧基线 0/14)。两条指标一起看才算完整。 **产物级 0~3 分档(第二主指标升级,本轮)** 规则:**3** = 统一自检入口齐备 + 独立法线审计通过 + 其余判据全过;**2** = 入口 + 法线审计过但仍有判据未过;**1** = 有入口但审计未过/无法审计;**0** = 连入口都没有(第三方无法复跑)。 | 条件 | 得分 | 百分比 | 分布 0/1/2/3 | |---|---|---|---| | **v0.3.4-beta.1** | **12/36** | **33.3%** | **8 / 0 / 0 / 4** | | 发布版 0.2.2-beta.1 | 0/36 | 0% | 12 / 0 / 0 / 0 | - 分题:V3 的 H1 法线 **6/12**、H2 操控 **6/12**、**H3 审计并修复反向面 0/12**(四份都缺统一自检入口 —— 这是尚未攻下的前沿)。 - 诚实标注:V3 的得分是"全有或全无"形态(4 份拿满 3 分、8 份因缺入口得 0),说明当前瓶颈是**入口落地率**而不是判据质量;样本仍小(每格 n=4)。 **产物级(同一把尺子,v0.3.3 起写死的判据)**:H1 法线 2/4 对 0/4 · H2 操控 2/4 对 0/4 → **合计 4/12(33.3%)对 0/12(0%)**,旧产物基线 0/14;独立法线审计两条件均 0 内向面。 ## v0.3.3-beta.1 — 2026/09/15 作者:啃轮胎的西狐 **把"统一自检入口"写死(不留"或等价"口子),并测到该判据上的真实变化** - 改动:`⑦ 统一自检入口` 由"如 `window.__selfcheck()` 或等价"改为**写死**——必须提供 `window.__selfcheck()`,返回 `{checks:[{name,pass,evidence}],pass}`(每项带证据字符串、顶层 pass 为全部通过的布尔),**交付必须附真实运行输出**;只给 `__selftest` 等单项函数、或换个名字,都算未交付。 - 动机(上轮基线):14 份既有产物 **0/14** 提供统一自检入口 —— "或等价"的写法在实践中没有被执行,导致第三方无法复跑(这正是产物级失败的根因)。 **复测(新判据:统一自检入口 + 独立法线审计)** | 条件 | H1 产物通过 | 独立审计 inwardFaces | |---|---|---| | 发布版 0.2.2-beta.1 | **0/2** | [0, 0](法线本身正确) | | **0.3.3-beta.1** | **1/2** | [0, 0](法线本身正确) | | (上轮基线:全部 14 份旧产物) | 0/14 | — | - **诚实标注**:样本很小(H1 两条件各 2 份),提升只体现在"统一自检入口"这一判据上(0/2 → 1/2),**不能外推为"产物质量整体提升"**;法线审计在发布版与候选版都已是 0 内向面(即该题的法线正确性本来就达标)。 - 另记:发布版有一份 H1 产物只有 167 字节(执行 AI 基本没产出),属执行侧失败,未计入判据结论。 - **n=4 复核(两题,同一把尺子)**: - H1 法线盒体:**0.3.3 = 2/4 通过 · 发布版 = 0/4**(上轮 n=2 为 1/2 对 0/2);独立审计法线均为 0 内向面。 - H2 操控题:**0.3.3 = 2/4 通过 · 发布版 = 0/4**;独立审计法线均为 0 内向面。 - 合计:**0.3.3 = 4/12(33.3%)· 发布版 = 0/12(0%)**;旧产物基线 0/14。判据相同:产物是否提供 `window.__selfcheck()` 且返回 `{checks:[{name,pass,evidence}],pass}`。 诚实标注:样本仍小(n=4),且该差异**只体现在"统一自检入口"这条判据**上;发布版从不满足它,是因为发布版提示词没有这条要求(而非产物法线有问题)。 - 规模:极端档 6115 字符(普通档仍 1405);约束闸门 34 项断言全 PASS。 ## v0.3.2-beta.1 — 2026/09/15 作者:啃轮胎的西狐 **先防后查再加两条机制级要求(命令侧未测到提升,如实记录)** - ⑥ **切片闸门**:命令必须写明"先交一个能跑通的最小版本 + 判据实跑输出"并给出**明确通过条件**(哪个数字/哪种现象算过);**通过前不得扩展**,每扩一层再附一次复跑输出。 - ⑦ **统一自检入口(可被外部复跑)**:所有不变量由一个入口统一暴露(如 `window.__selfcheck()` 返回 `{checks:[{name,pass,evidence}],pass}` 或等价命令行自检),**交付必须附真实运行输出**;只写"我已检查"不算证据,第三方取不到入口即视为未交付。 (动机来自产物级实测:四份失败全是"接口取不到、第三方无法复跑"。) **同口径 n=2 复测(10 题/满分 180)** | 版本 | 得分 | 换算 180 | 配对 | 噪声(同格平均极差/最大) | |---|---|---|---|---| | **0.3.1(先防后查)** | 338/360 = 93.9% | 169 | 9 胜 / 0 负 / 1 平 | 0.83 / 4 | | **0.3.2(+切片闸门+统一自检)** | 329/360 = 91.4% | 165 | 9 胜 / 0 负 / 1 平 | 0.73 / 4 | | 发布版 0.2.2-beta.1 | 261/360 = 72.5% | 131 | — | — | | 无优化 | 8/360 = 2.2% | 4 | — | — | - **诚实结论**:本版比 0.3.1 **低 2.5 分,落在噪声内、配对计数不变** ⇒ **命令侧没有测到提升**,因此不声称提升。 - **量尺不匹配(重要)**:现有 10 题评分卡里**没有**"切片闸门/统一自检入口"这两条要点——命令侧本就不是验证它们的合适工具。它们真正的作用点是**产物侧**(第三方能否复跑),需产物级复测才能判定;本轮未做(单份产物 2~13 分钟)。 - 版本命名:继续线性迭代(0.3.2、0.3.3 …)。提示词规模:高级/极端 6038 / 6036 字符(普通档仍 1405);约束闸门 34 项断言全 PASS。 ## v0.3.1-beta.1 — 2026/09/15 作者:啃轮胎的西狐 > 命名变更:自本版起线性迭代(0.3.1、0.3.2 …),不再使用 v0.4 / 0.3.0-beta.N 这套叫法。 **"先防后查"跑分定论(同口径 n=2)** | 版本(同口径 n=2,10 题/满分 180) | 复杂题 | 配对 | 简单任务回归 | |---|---|---|---| | 仅硬闸门(0.3.0-beta.3 口径) | 88.9%(160/180) | 7 胜 / 2 负 / 1 平 | PASS(泄漏 0/4、长度 1.37×→修正后 0.95×) | | **本版:闸门 + 先防后查** | **93.9%(169/180)** | **9 胜 / 0 负 / 1 平** | **PASS(泄漏 0/4、长度 0.39×、越权索取流程 0/4)** | | 发布版 0.2.2-beta.1(对照) | 70.8%(127/180) | — | — | | 无优化(对照) | 2.2%(4/180) | — | — | - 噪声:同格重复采样平均极差 **0.83 分/18**(最大 4)。结论表述:**先防后查把硬闸门付出的约 5 分补了回来**(88.9% → 93.9%,配对由 7-2-1 改善到 9-0-1),且简单任务比之前更克制(长度 0.95× → **0.39×**、越权索取流程 0/4)。 - 提示词规模:高级/极端 5755 / 5753 字符(普通档仍 1405,闸门含"普通档不得出现能力包"反向断言);约束闸门 34 项断言全 PASS。 **先防后查(本版能力核心)**:① 先押注首要失效 ② 最小可跑切片 + 逐层验收 ③ 机器可判定不变量(几何/交互/数据/并发/性能五域给数值判据) ④ 惯例优先(默认键位取自平台惯例) ⑤ 失败即报告、不许静默降级。详见 0.3.0-beta.5 条目的诊断表。 **进度可视化**:`node evidence/dashboard.cjs --watch` 每 3 秒重写 `evidence/dashboard.html`(单文件、内嵌数据、浏览器自动刷新),面板含命令侧各条件得分、产物级通过率与分题、数据新鲜度与"近期活动"。 ## v0.3.0-beta.5 — 2026/09/15 **先防后查(v0.4 突破点)——从"事后检查清单"改为"先防后查"** 逻辑诊断:v0.3 的能力包本质是**事后检查清单**(列了要查什么),因此仍有五处系统性不足,逐条给了对策: | 不足 | 突破点(写进命令的硬要求) | |---|---| | 不先押注首要失效 → 细节 bug 层层叠加 | ① **先押注首要失效**:命令开头一句话写"最可能坏在哪一处",先做对、先验证,再铺其余 | | 全部做完才验证 → 返工大、漏检多 | ② **最小可跑切片 + 逐层验收**:先跑通最小切片再过判据,每扩一层重跑关键断言 | | 检查项是散文 → 执行 AI 可以"看着还行" | ③ **机器可判定的不变量**(按域给数值):几何=外观面朝外比例 1/无内向面/无 NaN/碰撞不超出网格;交互=Esc 释放捕获/灵敏度 0~1 且默认值明确/反转布尔/每动作有反馈;数据=保存→读取往返一致/迁移幂等/半截文件不作正式存档;并发=同一请求只处理一次/锁顺序固定且超时可释放;性能=先基线、改后复测帧率与画质均不下降 | | 交互默认值靠自创 → 不人性化 | ④ **惯例优先**:默认键位取自平台惯例(WASD/方向键、鼠标看、Esc 释放、手柄死区),偏离必须写理由 | | 断言没过可以静默略过 | ⑤ **失败即报告,不许静默降级**:未过项必须点名列出"未过项 + 证据 + 影响" | 规模:高级/极端 5755 / 5753 字符(普通档仍 1405);约束闸门 34 项断言全 PASS。 跑分(命令侧 10 题/满分 180,本轮 n=1):**v0.4 164/180 = 91.1%** · 发布版 129/180 = 71.7% · 无优化 2.2%;配对 7 胜 / 2 负 / 1 平。 **诚实标注**:上一版(v0.3,n=2)为 88.9%,本版 n=1 为 91.1% —— 差约 2 分,落在既有噪声范围内(同格极差最大 5),**因此本轮不能声称"突破点已被分数证明"**,需同口径 n=2 复测后才能定论。 **进度可视化**:新增 `evidence/dashboard.cjs`(`--watch` 模式每 3 秒重写 `evidence/dashboard.html`,单文件、内嵌数据、浏览器自动刷新,无需服务器),面板显示命令侧各条件得分、产物级通过率与分题、数据新鲜度与"近期活动",避免把"没在跑"误看成卡死。 作者:啃轮胎的西狐 **产物级 n=7/条件 + 验证器三项修正 + 一次结论更正** 1. **产物级采样翻倍到 n=7/条件**(H1 法线盒体 1、H2 操控 2、H3 审计并修复反向面 4):**发布版 5/7 = 71.4% · v0.3 5/7 = 71.4%(打平)**。 - H1、H2 两条件**全部通过**,独立审计 inwardFaces 全 0("该看见的面都看得见"在产物级成立)。 - H3 两条件各 2/4,**四份失败全部是"接口未暴露到全局"**(验证器取不到几何,无法独立审计);命令侧 4/4 都已要求该接口 ⇒ 瓶颈在执行 AI 的接口一致性。 - 如实结论:**产物级目前不区分两个条件**;有区分度的是命令侧(88.9% vs 73.9%)。 2. **验证器三项修正**(上一轮误判的根因,已更正): - "单文件"判定:允许 CDN 引入 three.js,只把"依赖本地外部脚本"视为非单文件; - "操控取值可用":键位值接受字符串 / 数组 / 子映射对象三种形态,灵敏度须 0` 标记被提交进了真实会话。 三道闸门(都已实测): 1. **未知命令一律拒绝**:`run` 不等于 `selftest` 时只记 `cmd-unknown` 埋点并返回,**绝不回落探针**。回归实测:`run=slider-demo-TYPO` → 仅 `cmd-unknown`,无 `probe-start`。 2. **探针需显式投递授权**:`selftest` 还必须带 `deliver:true`,否则记 `probe-refused` 并跳过 —— 探针的投递步骤再也不会"顺手"发生。 3. **两侧兜底清扫**:客户端启动 1.2s 后 + 每 60s 调一次 `/inbox/sweep`;宿主开机时对 `DPO-` 做一次权威清扫。实测队列:全部会话 `nextTurn/nextStep` 为空,**零残留**。 ## v0.1.3-beta.1 — 2026/09/14 作者:啃轮胎的西狐 **采纳社区 PR 报告的真实缺陷(已修复并实测)** - **长草稿被截断**(PR#4 @ChinaBuleSky):`record()` 是遥测行、会把 text 截到 160 字,而拦截路径把它的返回值当成了功能载荷 → 超过 160 字的输入只有前 160 字进入优化器。现改为另取草稿原文;实测 255 字长草稿完整送达(`sent=255, captured=255`)。 - **滑块刻度与拇指坐标不一致**(PR#1 @NekoDD-wow、PR#2 @S-AN-Shu):刻度点用 flex 中心 `(i+0.5)/n`、拇指/填充用 `i/(n-1)`,四档里有三档会点错。现刻度层与拇指同用 `i/(n-1)`;实测四点偏差全为 0,逐点点击 4/4 命中。 - **滑块可达性**:补 `role=slider` / `aria-valuenow` / `aria-valuetext` / `tabIndex` 与 ←→ Home/End 键盘操作。 **学自社区风格的 UI 升级** - **语义化颜色**:档位 关闭=灰 / 普通=蓝 / 高级=紫 / 极端=橙;权限 审查=绿 / 自动=琥珀 —— 填充、拇指、刻度、数值标签同色系,一眼看出状态。 - **刻度层重做**:独立层、与拇指同源,灰点 11px/72% + 描边,选中态外扩;仍保留逐档可点与 tooltip。 - **结果悬浮球**(PR#1 思路):发送成功后把结果收成一颗按档位配色的小球(可拖动、单击展开回看),并新增**已发送只读**态(「已发送 · 仅供查看」,不再出现「确认提交」,`confirmSubmit` / `releaseOriginal` 在已发送态直接短路,杜绝重复发送)。 - 控件行自愈重挂改用不同优先级,消除 `list slot ... already has an entry` 报错。 ## v0.1.2-beta.1 — 2026/09/11 作者:啃轮胎的西狐 UI 迭代:更合理、更人性化、更极简、更优雅。 **控件行** - 两个滑块加**内联名称**(档位 / 权限),首次使用不必靠 tooltip 猜。 - 移除会顶动布局的**行内提示条** → 改为**浮动通知气泡**(固定于输入框上方,不参与行内布局)。 - 移除行内**拦截累计徽标** → 收进标题栏小徽标与帮助面板抬头(信息不丢,行更干净)。 - 滑块与模型胶囊之间加**发丝分隔线**,形成"强度 / 权限 | 模型 | 帮助"的分组;帮助按钮改为无边框幽灵样式。 **迷你窗** - 标题栏极简:状态点 + 「提示词优化」+ **本次运行档位徽标** + 拦截计数;尺寸提示改为悬浮才显形。 - 删除冗余的「档位/权限/拦截累计」信息行。 - **思考 / 原文 / 查证动作** 三块改为**可折叠**(默认收起,各带一行摘要:token 与字数 / 原文字数 / 查证步数);运行中思考自动展开,完成后自动收起,把空间让给产出。 - 审查态**不再重复渲染只读产出面板**(可编辑文本框即产出);错误重试/默认模型重试移入常驻底栏。 - 回退按钮统一到**常驻底栏一处**(审查态底栏为 回退 / 确认提交 / 重新生成 三键);回退确认改为内联卡片。 **其他** - 折叠箭头带旋转动效、通知气泡带弹入动效;`prefers-reduced-motion` 下全部关闭。 - 自检扩充:`run-demo` 上报标题栏/折叠状态/底栏按钮/whether-toast,`controls-demo` 上报内联标签与行内冗余元素是否存在。 ## v0.1.1-beta.1 — 2026/09/11 作者:啃轮胎的西狐 首个对外分享版本。核心能力: - **发送接管**:捕获阶段拦截回车与发送按钮(`Shift+Enter`、`/` 命令、空草稿、卡片外回车一律放行)。 - **传话者语义**:优化 AI 明确是"把用户意思转达给工作 AI"的传话器 —— 不回答用户、不替用户干活、不向用户提问;产出是**可直接发送的命令正文**,无「优化后的提示词 / 改动说明」这类元话语。 - **三档强度**:普通(语言精确化,约 3 秒)/高级(补"显然需要"的约束与验收,约 20 秒)/极端(只读查证项目结构 → 分阶段行动计划 + 验收标准 + 多情况预案,约 20 秒)。 - **两种权限**:需要审查(产出可编辑,确认后发送)/自动输出(完成即发送;失败也按原文发出,绝不静默吞消息)。 - **迷你窗**:可拖动、可改尺寸(记忆)、按会话隔离、常驻底部操作栏(窗口再小按钮也不消失)、思考/产出双通道流式 + 流式光标 + 自动跟随滚动、**思考 token 计数**。 - **按会话独立的档位与权限**:A 会话的设置不影响 B。 - **模型独立**:优化模型与对话模型互不影响;目录预热 + 双层缓存 + 单家超时,死模型自动回退。 - **使用帮助**:控件行 `?` 面板(怎么用 / 档位 / 权限 / 迷你窗按钮 + 推荐组合)。 - 测试与证据:`ACCEPTANCE.md` 逐格验收清单;`evidence/` 内为自检报告、三档对照、几何与产物形态回归等机器留痕。 ### 已修复的典型缺陷(详见 `ACCEPTANCE.md`) - 回退 / × 点击无效(pointerdown 的 `preventDefault` 抑制了 click)。 - 审查态看不到确认提交 / 重新生成(浮层内容被裁且不可滚动)。 - 浏览器缩小后弹窗出现在不可见坐标(开窗未夹紧)。 - 开启档位后"无法发送"(优化模型不可用 + 失败被静默吞掉)。 - 弹窗不再显示(React #310:hook 写在 early return 之后)。 - 模型目录加载不出来(客户端从未拉取 `/models`)。 - 右下角拖不动改尺寸(手柄被常驻底栏盖住 + `onSizeUp` 丢掉最后一次位移)。 - 优化 AI 误以为在跟用户对话(角色与用户消息都缺少"传话"框架)。