# METHODOLOGY — thincoder-suite 工程工作流 本文件是仓库的工程方法论,供设计评审(advisor)与实现(eng_coder)对照的单一标准。 ## 目标 以「设计先于代码、评审独立于实现、验证先于交付」的纪律维护本插件: 评审收敛、设计 token 门禁、引用验真、响应表对账是质量底线,任何改动不得削弱。 ## 工作流(四步 + 门禁) 1. **澄清** —— 需求未清晰前不写设计;用户确认后才落文档。 2. **设计** —— 设计文档写 `docs/`(问题陈述 / 方案 / 受影响文件 / 可验证验收标准 / UI 决策); 需求分三层:总体目标 / 功能用户故事 / 非功能标准。 3. **评审** —— 设计评审由**用户发起**(`advisor type="design"`,documents 显式列出); 评审发现问题时,逐项由用户决策后修订,不自循环。 4. **实现** —— 仅经 `eng_coder`(携带设计 token)实施;交付后自动执行: 分歧审计(explore subagent)→ 交付 code review(`advisor type="code"`)→ 验证测试通过。 实现者不修改未列入设计文档的文件。 ## 评审标准(advisor 对照维度) - **需求覆盖**:设计是否覆盖全部用户故事与决策记录; - **可行性**:方案在宿主(DSH cordis 生态、纯 JS 零依赖约束)下可实施; - **方法论合规**:是否遵循本文件与文档纪律; - **清晰度**:受影响文件、接口、数据流是否具体到可实施; - **验收标准**:是否可验证、覆盖正常/边界/错误路径; - **范围**:无范围蔓延,YAGNI 边界明确。 ## 文档纪律 - 用户在设计讨论中做出的决策,当日写入相关文档(「讨论过但没落盘」等于没决策); - UI/交互决策必须落入设计文档,并在 eng_coder 任务中复述或引用其章节。 ### 文档更新纪律 D1–D7 > 改编自上游 `src/prompts/discipline-engineering.md:103-111`(as-of 上游 v0.12.61);**上游漂移不自动跟**。 > 本节只写**规定**,不写「我们做到哪了」——现状标定见批 11 设计档 §10(as-of 快照)。 **D1 写权矩阵** —— 每类文档有唯一写入者,同一区域同时只有一个写入者: 批次文档(需求/设计/纪要/**交接**)= 主代理 · `lib/**` 与 `test/**` = eng_coder(凭 design token)· **常设标准档**(`METHODOLOGY.md`,含本节)= 主代理定内容、eng_coder 凭任务书指名落笔 · 提示词 = 主代理定内容、eng_coder 落笔 · **登记面**(`docs/test-lifecycle.md`:§三 / `docs/2026-09-05-defect-registry.md` / `docs/2026-09-12-absorption-inventory.md`:§6 / 条目状态变更)= 主代理(**收口时唯一自报点**,R-19)· `docs/README.md` 文档地图 = **建档者随建随登**。 **例外**:eng_coder 在其任务书显式指名的**文本块**上落笔(凭 design token)—— 含**登记行/收口行**,也含**常设标准档中由设计固定内容的新子节**; 此时一律归主代理定内容、eng_coder 落笔——与提示词同一分工形式。 **D2 单一权威源** —— 一条机制只在一处详述,其余处只引用不重述。 **D3 计数·枚举纪律** —— 声明「N 项/N 处/N 条」时,计数与列表必须在**同一次编辑**内同改; 计数须来自**当次实测**,不得抄自记忆或旧档;一个数只设一个权威自报点,他处用指针。 未被机械检查覆盖的面,明确标注为**人工核对**。 **D4 指针纪律** —— 引用本仓文档用「**档名:§节**」;**禁**「见上/见该节」式相对指针; 行号只作 **as-of** 括注,不承诺永久有效。 **D5 冻结窗口** —— 评审在途**不得**改被审对象;对象变了即按既有机制判该评审陈旧。 (机制锚:守卫 E 的文档冻结窗口,见 `test/guard-e.test.mjs`——本句只指位置,不陈述状态) **D6 回读核对** —— 任何写入/编辑报成功后,**必须用读工具回读被改区域**, 确认三点再报完成:① 预期改动在回读内容中;② U+FFFD 计数为 0; ③ 行数变化与本次改动的**预期增删**一致(意外塌缩 = 异常)。 **回读不得使用刚执行写入的同一条 shell 管道**。 **结构性改档一律用编辑工具,禁 shell 单行脚本整档重写。** 回读未见改动 = 写入静默失败 ⇒ 按失败路径报告,**不得重报成功**。 **D7 变更留痕** —— 每批收口须留下可追的变更记录(吸收清单 §6 变更理由行 / CHANGELOG / 本档文档历史表)。 > 上游 D7 另含「核销同步」半条——**不吸收**(R-20 已废除该名词)。其意图由收口对账面覆盖: > 台账 §三等值(T-LC2)· 登记表/吸收清单计数(ledger-parity)· 状态行与变更记录(批 10 AC-H1 形态)。 ### 写作立场纪律 W1–W3(**本仓加法** · 2026-09-17 批 18 立 · 出处 [`consult-minutes/2026-09-17-consult-12-rulings.md`](./consult-minutes/2026-09-17-consult-12-rulings.md)) > **★ 为什么另立小节而不编成 D8–D10**:**上面那块 D1–D7 是上游定长区间的改编**(§35 的块头已声明「上游漂移不自动跟」)——**本地加法混进去会污染上游对照契约**。**W 系是本仓自己的,与 D 系是家族关系而非并列关系**(血缘见每条括注)。 **★ 为什么立这三条**:本会话「**同一可数事实在两处取不同值**」复发了 **21 次**,**绝大多数住在散文里**。而**两次独立实测判死了「让机器去读散文」这条路**(62% 误报 · `AC N` 文法 1.3% 精度 · 版本文法换分母后仍 63 处),**⇒ 结论是「法律追认惯例」**:**机器不分辨立场,作者声明立场。** | # | 条款 | 血缘 | 判定句 | |---|---|---|---| | **W1** | **裸写即现状** | **新律**(D1–D7 无任何一条覆盖「散文里裸数的**含义**」——D3 管的是**写入时的计数新鲜度**,不管裸写的语义) | **在「未密封区」内、且未带 as-of 括注、且命中注册文法、且权威可重算** ⇒ **该裸数即对现状的断言**,**必须等于权威值**。**★ 未密封区 = 不在任何 `## [x.y.z]` 版本节之下、且非日期前缀的历史批次档**——**这是必要的限定语**:按字面读,W1 会 condemn 每一份历史 CHANGELOG 节与每一个日期前缀批档(**它们全是「写成时是现状」的裸值**)——**那正是「规范自己打自己」的形态,故限定语与条款同时生效** | | **W2** | **指针优先** | **D2**(单一权威源「只引用不重述」)**从机制推广到可数事实**;**D3 第三句**(「一个数只设一个权威自报点,他处用指针」)**同族** | **同一事实在同一作用域只有一个数值书写位**,其余位置**一律指针**。**⇒ 红线落在「引用值」轴上而非「引用位置」轴**(写在位置轴 = D4 的复述);**⇒ 具体禁令:禁复制数值** | | **W3** | **历史值必带 as-of** | **D4**(「行号只作 as-of 括注」)**从行号推广到时点值**——**同族同构**(行号因编辑而腐,时点值因后续批次而腐);**批 11 的 D11-2**(「快照带 as-of ⇒ 只会老、不会漂」)**是同构先例** | **凡时点值(「N 行」「N 条」「vX.Y.Z」等会随批次变化的事实)必须带 as-of 括注**(时点 / 版本 / 批次)。**⇒ D4 对行号的限制仍**有效**,W3 补充的是**数值、计数与状态**的历史定位要求**——**两条并存,非替换** | **★ 这三条是「把既有实践成文化」而非新造律**:仓内 **85+ 处 as-of 括注**已在用(「as-of 批 5 交付后」「as-of `0c15c69` / v0.18.0」),`CHANGELOG.md` 的批 16 条目自己也写着「**该分项不写作 `本批 N`,因为解析器取本节首例,两处写法会互相矛盾**」——**那是 W2 的手工版**。 **★ 本条的边界(不许把 W 系说得比它做的多)**:**W1–W3 是写作纪律,不是谓词**。**它们不判任何东西**——**违反它们的唯一发现通道是评审与人眼**(除批 18 交付的那条窄腿,它只覆盖 CHANGELOG 内的令牌值一致)。**⇒ 若把它们当成「已经机器化了」,那正是本仓反复犯的「宣言比机制大」。** ### 设计文档的成文流程与必备章节(2026-09-12 用户裁定,**所有批次适用**) **流程**:每个批次先**会诊**取方案 → **汇总会诊结果**(含分歧与父侧裁定)→ 再写需求档 + 设计档。 **设计档必备章节**(缺一即视为未成文,评审可据此判不通过): | 章节 | 内容 | |---|---| | 背景 | 这件事从哪来(用户实测痛 / 上游决策未跟 / 能力缺口) | | 问题 | 现象 + **根因**(带 `file:line` 证据,不得推测) | | 目标 | 做完之后什么变了;**明确的非目标**(本批不做什么) | | 决策与理由 | 每个关键取舍:选定方案 + **为什么** + **被否决的备选及否决理由** | | 方案 | 怎么解决,分交付单元(FR-x)逐个说明 | | 机制伪代码 | 关键函数的伪代码或签名 + 前置/后置条件 | | 状态与 schema | 新增/变更的状态字段、持久化结构、以及**谁写谁读** | | 防偏离 | 该设计怎么被机械验证(验收标准、负向断言、锚测试) | | 边界 | 空集 / 畸形输入 / 并发 / 重启 / 升级 / 失败方向(fail-open 还是 fail-closed) | **图示要求**:涉及**流程、状态迁移、数据流、时序**的批次,设计档必须配图 (mermaid flowchart / stateDiagram / sequenceDiagram 均可);文字与图冲突时以文字为准并修图。 ## 测试纪律 - 单元测试:`node --test`(零依赖,node 内置);stub `ctx.llm.stream` 收集 opts; - 每个用户故事至少映射一个测试用例(正常/边界/错误); - 冒烟测试:真实调用一次评审(小文档)验证路由与超时行为; - 交付无测试覆盖 = 评审不通过。 ## 文档历史 | 日期 | 变更 | |---|---| | 2026-09-01 | 创建(随 advisor 可配置分层路由设计建立) | | 2026-09-01 | 记录已接受的流程偏离:F8(评审通过判定修复)作为 hotfix 直接修改 `lib/advisor.mjs`,经用户批准先行实施、由 T16 回归,偏离四步工作流但作为既有先例登记在案(见设计文档 §3.8) | | 2026-09-02 | 一期交付记录:eng_coder 交付(8 文件 + 20 测试全绿)→ 分歧审计(功能 clean,D1–D6 已处理/记录)→ 交付 code review | | 2026-09-02 | 二期交付记录:eng_coder 交付(DSH 设置页「Thincoder」:config-store/config API/client 10 文件,新增 21 用例)→ 分歧审计(近似 clean:D1 client 池保存丢失 / D2 cwdHint 形态,均已修 + 回归)→ 交付 code review round 1(11 项修复全落地)→ round 2 因收敛轮 300s 预算多次超时,改以分歧审计 + 50/50 全量测试核销——convergence 预算校准至 600s 记录在案(300s 对多文件评审不足,纯配置校准) | | 2026-09-02 | UI 打磨记录(v0.5):设置页样式 token 化与交互优化经真实 GUI 反馈迭代(玻璃透明样式 → 宿主语义 token;文案/交互友好性)——收尾提交推送 | | 2026-09-05 | R0 立项记录:全插件 thorough 审计(子代理)→ 缺陷登记表 D-01…D-24 落盘(`e4aae98`,thorough 级证据行号)+ 需求三层文档(12 用户故事 / 7 非功能标准 + 三项用户裁决 D-裁决-1/2/3)+ 本分轮设计(四轮结构,四轮设计评审收敛后定稿)——基线 `f5b7ed7`(125/125 绿)先行入库,版本锚定顺延至 R1 chore | | 2026-09-05 | R1 交付记录:诊断与校验层(effort 最近支持档/等距向上取 + codex catalog resolver + 6 漏点接线 + 流观测/空响应分类 + dsh 预算钳制 + maxOutputTokens 三面配置化——155/155,`95af758`)→ 分歧审计 → 交付 code review 折入 R2 | | 2026-09-05 | R2 交付记录:执行架构与进程生命周期(escalate/eng codex jobs 迁移 + 簿记 done 成功分支 + 复合键单飞 + 代际检查 + 并发上限 + 启动清扫 + DP-1 dsh 钳制——185/185,`dbbb6c9`)→ 分歧审计 → 交付 code review 折入 R3 | | 2026-09-05 | R3 交付记录(含补丁轮):回落封顶硬停(D-07 连败 2 次)+ 空响应重试一次(D-裁决-1)+ prior 纯净化(D-19)+ 三机制全入口单飞(D-06 扩展,设计 §5.5 勘误后 escalate/eng 随补丁轮补齐——205/205,`4d33cf8`+`7222811`)→ 分歧审计 → 交付 code review(收尾四项折入 R4) | | 2026-09-05 | R4 交付记录:一致性与 UX 收口(D-12 保存竞态:busy 全表单禁用 + 触碰字段保留 + 提示条;D-13 runner 三面同步 + 持久化往返;R3 code review 收尾四项;R1 审计 🔵 收口:fail-open 接线级用例 ×2 + discoverCodexModels 缓存语义注释 + D-18 措辞核对〔收窄前提与代码不符,维持如实措辞〕;版本 0.8.0;登记表 24 条终态核对——211/215 微修复轮〔D-25 token-secret 加固〕后全绿,`b2b3ff5`+`47617c8`)| | 2026-09-06 | 真机验证收口记录:advisor/eng_coder/consult 全链 + 受害场景②活体治愈(flash+low → 最近档回落+note)+ D-15 测量完成(3 次 high-effort 最大静默间隙 50.1s << 240s,维持 300s 默认)+ D-24 eng.mjs 评审补跑通过(发现转 D-26)+ 真机验证记录入登记表(`9593b50`)| | 2026-09-06 | **R5 立项记录**:用户裁定 DP-1 修订终裁 = 方案 B 全量三路径 dsh 后台化(不改平台默认,插件自建后台机制)——advisor dsh 自动按 timeoutMs 判定、escalate/eng 显式 background 参数 + dshBackgroundTimeoutMs 兜底;D-27 登记(生产复现:900s 预算被 D-17 钳制的告警)。五次设计评审通过(4🟡+6🔵 折入,`2d39c91` 后补折入提交)——待实施 | | 2026-09-06 | **R5 交付记录(微轮 1+2 合并)**:advisor dsh 自动后台派发与 `dshBackgroundTimeoutMs` 三面配置先行;微轮 2 完成 escalate/eng dsh `background` 参数、`escalate-dsh`/`eng-dsh` jobs、run() 内子代理执行、兜底 abort、cancel 传播、成功分支单次簿记、单飞槽位与两段式降级告警;同步默认路径保持不变。微轮 1 继承中断轮半成品审计,并修复真缺陷(代际失配分支误调 `finalize` 等);全量 node --test 验证通过,版本 0.9.0。 | | 2026-09-07 | **R6 维护轮交付记录**:D-26 十项一致性打磨全部收口(codex 配置告警、engineeringToggle 签名清理、单飞/空输出/F10 文案统一、eng dsh 簿记单一实现、后台超时 ABORTED 信封、escalate 线程清理及兜底句读);全量 node --test 验证通过,版本 0.9.1。 | | 2026-09-11 | **D-29 配置面(批 1)**:`consultTimeoutMs` / `engTokenTtlMs` 进 user 层白名单(三面同步:config-store 常量与 merge ⊕ index.mjs PUT 校验 ⊕ 设置页表单字段)+ 4 新增用例;base `consultTimeoutMs` 600000 → 1800000。 | | 2026-09-11 | **D-30 交付记录(批 2)**:design token 生命周期——续期路径 + 精确切除签名腿。**设计输入 = 会诊 id 3**(4 模型仅 glm-5.3 交付、其余 3 超时;其两条范围缺口 G1/G2 经父侧回代码实证后采纳)→ 需求三层文档(`docs/2026-09-11-token-lifecycle-requirements.md`:解耦总目标 / 8 用户故事 / 7 非功能标准)→ 设计档(`docs/2026-09-11-token-lifecycle-design.md`:FR-T1…T9 + 27 验收 AC-1…AC-27 + 决策 D1…D11 + 3 遗留风险)→ 设计评审通过后由 `eng_coder` 实施(**交付形态如实记录,不写成一次干净的「分阶段实施」**:首轮 242/242 全绿但新增用例实为**零**,经分歧审计用 `git grep -c "^test("` 硬证据揭穿〔HEAD 245 / 工作树 242〕,再由 3 个 AC 用例修复轮 + 1 个极小收尾轮补足;七轮实测记录见设计档 §5.2):① 两段化 `uuid:expiresAt` + 删密钥链(`advisor.mjs` 的 crypto 面只剩 `randomUUID`)+ 审批码改 `sha256(uuid).slice(0,8)`;② 新建 `lib/doc-hash.mjs`(文档集指纹单点实现:路径+内容双绑)与铸造时**历轮文档集并集**快照;③ `eng.mjs` 过期子分支扩为四路判定 + 续期(同 uuid 顺延 + 回传新令牌串)+ 四条文案 + 有效期日期显示;④ token-store 保存路径补字段 + 清扫五分支规则(保留「过期但有指纹」的记录);⑤ `main.md` 会诊口径修正 + README/CHANGELOG/登记表/package.json/cordis.patch.yml(base TTL → 7d,决策 D11);⑥ 验收面收敛为 **26 条专用用例**(AC-1…AC-27 共 27 条中)+ **AC-12 由 AC-13 的无 `docHash` 记录路径实质覆盖**(交付代码评审原话确认)+ 全量回归 **274/274 绿**。遗留风险如实登记(R1 磁盘记录是重启后唯一授权来源、依赖流程纪律;R2 多进程 last-writer-wins;R3 指纹计算需读全部被审文档)。 | | 2026-09-12 | **吸收清单落盘 + 设计文档成文规则(用户裁定,所有批次适用)**:① 吸收面单一事实源冻结为 `docs/2026-09-12-absorption-inventory.md`(43 批次档全量;来源 = 会诊 id 1,4 模型 2 份有效回复 + 父侧逐条回代码核验——核验中**抓到并纠正 1 处误报**〔`isProductCode` 被判可绕过,实测为真阳性;该条改记入「反转/陷阱」栏〕)。② 用户裁定设计文档**成文流程**:每批先会诊取方案 → 汇总(含分歧与父侧裁定)→ 再写需求/设计档;设计档必备九章节(背景/问题/目标/决策与理由/方案/机制伪代码/状态与 schema/防偏离/边界)+ 涉及流程与数据流者必须配图。已写入本档「文档纪律」节。 | | 2026-09-13 | **批 3 收口 + 批 5 立项**:批 3(评审协议增强 + FR-6 守卫)已交付(`b915344` + `d9fc805`,全量 304/304 绿)。批 5 = 评审上下文预算跟随模型窗口 + 估算器 CJK 加权:**设计输入 = 会诊 id 1**(glm-5.3 / deepseek-v4-pro / kimi-k3 交付,gpt-6-astra 超时)+ 父侧只读勘察(**发现运行时权威通道 `ctx.llm.resolveModelInfo().context.contextWindow`,且本插件已在为 effort 调同一方法**——两家会诊主张的 settings.yaml 直读与内置模型表据此否决)→ 需求档(`docs/2026-09-13-context-budget-requirements.md`:6 用户故事 / 6 非功能标准 / 4 登记面)+ 设计档(`docs/2026-09-13-context-budget-design.md`:九节 + 两图 + 决策 D-CB1…D-CB11 + 验收 AC-CB1…AC-CB9)。 | | 2026-09-13 | **用户授权(当夜自动交付,限本轮)**:用户原话「我睡觉了,授权给你:目标,实现所有批交付」——据此,**当夜各批的设计评审发起权与实施批准权由父代理代签**(`2026-08-24` 那条「评审与开发不得由代理自行发起」的规则**在本授权范围内被显式覆盖**,不是被推翻)。约束:① 每批仍走全会诊 → 需求/设计档 → 设计评审 → 实施 → 分歧审计 → 交付代码评审 → 全量验证 → 提交的完整链路,逐批留痕;② 评审发现逐条落处置表(Fixed / Dispatched / Not an issue / Deferred),**未决 🔴 不许静默收口**;③ 遇必须用户裁定的阻塞 → 写清阻塞点并停下,不猜。 | | 2026-09-13 | **批 5 交付记录**(v0.11.0 / `c1966f8`):上下文预算跟随模型窗口 + 估算器 CJK 加权。会诊 id 1(3/4 交付)+ **父侧只读勘察**(发现运行时权威通道 `ctx.llm.resolveModelInfo().context.contextWindow`,**且本插件早已为 effort 在调它**——两家会诊主张的 settings.yaml 直读与内置模型表据此否决)→ 需求/设计档 → 设计评审 PASS(7 条同链处置)→ 实施 → **独立分歧审计抓到 1🔴「假锁」**(CJK 判据全部打在测试档**本地副本**上 ⇒ 改错权重仍 319/319 全绿)→ 修复轮走**生产路径**锁死(`"中"×300000` ⇒ 逐字 `300007` 判死;红→绿两次实测)→ 交付代码评审 PASS(2🔵 已修)→ **320/320**。 | | 2026-09-13 | **批 4 交付记录**(v0.12.0 / `2e6ca8b`):设计评审豁免 5 轮上限 + 三振结算护栏(**成对吸收**)+ **D-35 折入**。会诊 id 2(**2/4 交付——另两份随 DSH 崩溃不可复得**,如实登记)→ 需求/设计档 → **D-35 现场复现并折入**(首次设计评审因链是会话级而**串台**成批 5 的收敛轮、并据此铸了一枚「声称覆盖未评审文档」的令牌 ⇒ 父侧判该评审**无效、令牌不予采用**,缺陷登记 🔴 后并入本批)→ 有效 round-1 评审 PASS(12 条同链处置)→ 实施 → **独立分歧审计 2🟡/1🔵**(工具层预检「摘除即红」不成立 · **codex 用户中断被计振**的真 bug · stale 对失败 job 记账)→ 修复轮三条全修 + 各做「还原即红」→ 交付代码评审 PASS(1🟡/4🔵:**设计层排序隐患**「非法文档集会先摧毁在途链」已修)→ **342/342**。 | | 2026-09-13 | **批 6 交付记录**(v0.13.0 / `a5f9551`+`aa9f257`+`9205bc8`):死亡可诊断(守卫 D 判定换血 + 四家族 abort 溯源 + 裸 abort 灭绝)。会诊 id 1(**2/2 交付**,且两份**独立纠正了父侧勘察的两处前提错误**:per-call 硬墙**早已存在**、家族是 4 不是 5)→ 需求/设计档 → **设计评审轮次 1 = FAIL**(🔴 = 父侧设计档自相矛盾:超时尾「追加」与「替换 + 逐处改断言」三处打架,而零改面纪律禁止改断言——**评审员判得对**)→ 修正为纯追加 → 轮次 2 PASS → 实施 → **独立分歧审计 1🔴/4🟡/3🔵**(🔴 = consult 两构造的判据打在**手搓等价物**上且生产死亡行**无消费者**)→ 修复轮**接了真实消费面**并给出「删生产站点即红」实测;另修宿主面层映射(job_kill 误报 `unknown@agent` → `cancel@settle`)、环内 error 站补接线、矩阵补六站、两处不可持久的锚(**D-37**)改历史事实锚 → **360/360**。**过程事故留痕**:实现者的变异验证中 `lib/eng.mjs` 被 PowerShell 往返写成双编码乱码(与批 3 父侧同类事故**同因**),已重建并逐行修复,父侧独立核验 `U+FFFD`=0 / mojibake=0 / diff 恰 37 行。 | | 2026-09-13 | **交接与新会话**:用户裁定「做完批 6 告诉一声,先收尾一波再开新会话」。落 [`docs/2026-09-13-handoff.md`](docs/2026-09-13-handoff.md)(新会话入口:进度 / 纪律 / 环境事实 / 未决缺陷 / **已就绪的设计输入** / 第一小时建议)并登记文档地图;**同日 DSH 因资源耗尽非正常结束三次**(01:49 / 11:27 / 18:41,均为原生失败 + 「虚拟内存/系统资源不足」),三次各吃掉在飞 job 与 1.5–2 小时墙钟——纪律建议:**批次之间的空档重启 DSH**。 | | 2026-09-13 | **批 6b 交付记录**(v0.14.0):守卫 E(在途窗口冻结 + 预闸拦截 + 结算侧指纹兜底)——**闭合 F17 型漏洞**(令牌指纹 = 派发前快照、签发时不复检 ⇒ 窗口内编辑必然换来一枚「声称审过」的令牌)。会诊 id 1(**4/4 交付**:v4-pro / glm-5.3 / gpt-6-astra / kimi-k3)→ **五处分歧父侧裁定**(闭包捕获 vs 读活 state · 子代理拦不拦 · **失配是否计三振** · fail 朝向扁平 vs 分层 · 其余三处)→ 需求/设计档(九节 + 图 1/图 2)→ **设计评审轮次 1 = FAIL**(🔴 = 真空豁免无 AC——纪要 §4 栽点 2 已明令「FR + AC」,**评审员判得对**)→ 修 12 条 → 轮次 2 PASS → 实施(6 stages)→ **独立分歧审计 🔴0 🟡1 🔵5**(审计用 **10 组变异实验**自证:M8 删 `.slice()` / M10 删空集跳过各自 **22/22 存活** ⇒ 两条已规定不变式零覆盖)→ 修复轮(`T-E22`/`T-E23`,**变异自证可失败**:M8→23/1 唯红 T-E22、M10→23/1 唯红 T-E23)→ 交付代码评审 **PASS**(🔴0 🟡1 🔵4)→ **384/384**(既有 360 原样全绿)。**本批两次父侧自身缺陷落档**(§12.3 / §12.6):① 派发任务书 stage 1 的 check 写成**不存在的** `test/in-flight.test.mjs`(实现者按纪律换等价自检、未造文件、如实上报)② **设计档 §6.1 伪代码把 `const` 画在块内却又要求块外消费——按字面不可运行**(判定为**设计文本缺陷**,正文冻结不改、以裁定为准)——两者都属「凭形状推测而不回代码核验」,与批 6 §0.2 同族。**新提炼的纪律**:设计档的**捕获形态**类判据(「闭包捕获 vs 读活 state」)即便当前等价也一律取捕获——读活版的失效是**静默**的(退化成自比恒真且无测试会红),而捕获可落机器验锚。 | | 2026-09-13 | **批 7 交付记录**(v0.15.0):可移植性三件(METHODOLOGY 从产品提示词退役 / 产品提示词去本仓指涉 / 判据单一权威)。会诊 id 2(**4/4 交付**)→ **三家独立指出父侧会诊任务书的四条前提错误**(父侧回盘实测并落档:`isProductCode("docs/x.mjs")` 方向反了 · 根级 `README.md` 实为文档 · 「`docs/` 两谓词语义相反」不成立 · 16K 截断归因错)→ **两轮只读勘察**又纠正父侧两处(配置面是 **7 个面**不是「四面管道」;T-E19 的测试档清单闸 ⇒ 新增测试档会被拦,需用户裁定「按登记制扩展」)→ 需求/设计档 → **设计评审轮次 1 = FAIL(🔴5 🟡5 🔵4),其中 4 条 🔴 是我违反了自己刚写下的裁定**(J8 地图机制被静默丢弃 · J11 未实现 · 纪要 §3-③ 卫生锁缺失 · 我规定的字串含禁词撞自己的闸)→ 修 → **轮次 2 PASS**(残留 7 条全是「同一件事在文档里有第二个落点」)→ 实施(同步派发被 540s 内部截止 abort 且零输出 ⇒ 改**后台**一次通过)→ **独立分歧审计 🔴1 🟡2 🔵2**(🔴 = AC-P13 的静态锁**自称六子点、实测只证 4 个且一条断言 tautological**——**代码全部合规,是锁缺陷**)→ 修复轮(**11 次变异全部「删/插被保护行 ⇒ 目标用例红、不误伤**」;393→399)→ 交付代码评审 **PASS**(🔵2)→ 收尾修复轮 → **399/399**(既有 384 原样全绿)。**本批沉淀四条纪律**:① **裁定写进纪要 ≠ 设计档兑现**——设计档交付前必须逐条回读本批纪要的裁定清单做交叉自检;② **改了引用点,却没改被引用的副本**——每次改一个约定必须全库检索其所有出现点并一起改(该 `grep` 级纪律原先只当**代码面**纪律用,**文档面同样适用**);③ **不许用「不可达」当免验理由**——「不可达」本身是需要证明的断言,本轮我那条证明就是错的;④ **当一条闸的谓词与它的意图不等价时,修的是谓词,不是被闸的东西**——本批两度命中(锚 B6「切片不含 engineering」vs「门不由模式决定」;以及**代码评审建议本身**带同款病,故**评审的话也要回盘核验**)。**另记一条流程事实**:本批量级(10 文件 × 7 stage)**必须走后台派发**(同步路径 540s 内部截止会 abort 且零输出)。 | | 2026-09-13 | **批 8 交付记录**(v0.16.0):提示词公共层(裁减版)——**判定契约从「碰运气不漂移」变成「由 spec + 双向锁钉死」**。会诊 id 3(**4/4 交付**)→ 父侧实测(可逐字节抽取的只有 **4 行**;四档块 11/10/10/17 行;**`AC-V13` 锁的是裸档字节**)→ **用户裁定形态 = 零改面**(四档提示词与 `lib/prompts.mjs` 零字节改动;**否决组装层**——收益仅 12 行,代价是启动期失败面 + 必须改写本仓最安全相关的两个测试 + 破坏零构建)。交付 = `lib/prompts/verdict-contract.md`(契约 spec:字面 / **ID 化差异哨兵** / 四档逐字快照 / 出现点地图 / 漂移登记)+ `test/prompt-contract.test.mjs`(**两组件闸** + 四条不变式 + 负向锁)。**设计评审轮次 1 = FAIL(🔴1)**:纪要写明闸有两组件(双向一致 **+ 内容指纹**),设计档只落前者且无裁定记录——**这是批 7 第一课的第五次命中**。修复后**审计员独立复现 M3**:协同改「提示词 + spec 快照」⇒ 组件① 绿、**组件②(`sha256` 指纹)红**。轮次 2 `PASS`(残留 7 条含一条**尾换行不对称会让 AC 恒红**的真缺陷,父侧全修)→ 实施(后台一次通过,**18 次变异自证**)→ **独立分歧审计 `🔴0 🟡2 🔵2`**(核心主张经**字节级**核验为真)→ 修复轮 → **413/413**。**本批两条新纪律**:① **交付文档面必须回读本批纪要的裁定清单做交叉自检**(批 7/8 共 5 次命中同族缺陷,已从「教训」升级为「可执行动作」);② **在 `core.autocrlf=true` 的机器上,「零改动」不能只靠 `git diff` 证明**——git 会在 diff 前归一 EOL,「只改行尾」的编辑会被吞掉,必须**另用字节级读取佐证**(审计员提出并示范)。本批还暴露出**父侧一处设计前提错误**:`AC-9b` 原断言「全 CRLF」实为**本机 checkout 配置的投影**(本仓无 `.gitattributes`、blob 是 LF),在默认配置的克隆上会让**字节未改的仓库**变红 ⇒ 已改为**环境无关**的 EOL 契约并以「模拟全 LF 克隆」验证。**另记一次父侧事故**:本轮父侧用 shell 单行脚本重排本表两行时谓词误命中表头 ⇒ **文件被截断为 1 行**(`git checkout --` 即时恢复,无损失)——与批 6「PowerShell 往返双编码」同族,纪律再加一条:**结构性改档一律用编辑工具,不用 shell 单行脚本**。 | | 2026-09-13 | **批 9 交付记录**(v0.17.0):测试生命周期三层 + 发布门 + `verify` 宿主侧门禁——**给「只进不出」的套件立规矩,给 git tag 发布装一道会真的被跑的体检**。会诊 id 1(**3/4 交付**;codex `PROCESS_ERROR` 如实登记不补位)→ 摸底盘出三件事:**批 9 在本仓没有详细条目**(只有两行摘要,且「批 9」是**两套编号混用**)、三项**均零落地**、与批 3–8 **零重叠**;父侧又回盘核实了**两条上游引用**(工程模式被排除在机械完成侧守卫之外:`completion.mjs:70-74`/`:118-122`)。**用户裁定**:三项全做 · R-13 不根治 · tag 带 `v`。**设计评审轮次 1 = FAIL(🔴2)**:① 台账覆盖面自相矛盾(三处写死 14 而本批新增 3 档 ⇒ 交付时 17,照文实施必红);② **我静默改写了自己纪要里的裁定**(纪要把版本一致性列入常驻断言、设计档写不做且无留痕——**这是批 7 第一课的第 6 次命中,而且发生在我写下该纪律之后**);评审员还**反驳了我的时序理由**并判其成立(交付时点两者同为上一版本、是一致的)。修 12 条 → 轮次 2 `PASS` → 实施(8 stages,**23 次变异**)→ **独立分歧审计 `🔴1 🔵5`**(🔴 = **一条永不失败的断言**:R0 门锁用**裸档名**比 `AP_TEST_AUTHORIZED` 的**仓库相对路径** ⇒ 恒真;而**同档注释自己就写着「按裸档名比对必然全 miss」**——**一个专门用来消灭假锁的档案里出现了假锁**)→ 修复轮 → **交付代码评审轮次 1 = FAIL(🔴1)**:**G6 复跑预案结构性死代码**——复跑**只在第一跑红时触发**,而 G2/G3 已按第一跑固化、复跑成功**只打印不回写** ⇒ **「放行」永远不可达,US-12 的核心承诺是实现不了的**(评审员靠推理链算出,现有测试全绿)→ 修复轮 → 轮次 2 `PASS`(🔴0)→ 收尾修复轮 → **434/434**。**本批沉淀三条纪律**:① **设计档交付前把本批纪要的裁定清单逐条 `grep` 进正文做交叉自检**——**只能靠机械检索,自述一律不可信**(该纪律首次执行时立刻又抓出一条「我自称已改而实际没改」的);② **新写的锁必须立刻做变异自证,而且变异值要取自「实现/配置的真实形态」,不是取自断言自己的写法**(🔴#1 正是实现者构造变异时下意识用了与断言一致的口径而漏掉);③ **台账的用例数与 fs 实测是等值锁 ⇒ 任何新增用例都必须同时改台账**(实现者实测撞到并**正确地没越界**,改把断言并入既有用例——台账作为「第三把元锁」在起作用)。**另记两条流程事实**:① 本批两次撞 **T-AP9**(基线 10 档的 M/D 全锁死)⇒ **退役在本仓天然是授权制动作**,这正是把「taxonomy 住台账、不住文件系统」定为形态的理由;② **重启后用原令牌值重发 `eng_coder` 成功**(未报 no design token)⇒ D-36 登记的**磁盘回填路径实测有效**,不必为换令牌去跑一次设计评审。 | | 2026-09-13 | **批 10 交付记录**(v0.18.0):台账纪律(可落地版)+ D-31 + D-36 + 文档卫生——**让计数由机器算、让登记项指得出落点、堵死一条静默清空配置的数据丢失路径、消掉重启后写门禁的纯摩擦**。会诊 id 1(**3/4 交付**;codex **第二次** `PROCESS_ERROR`,如实登记不补位)→ 摸底挖出:**「台账纪律」在吸收清单三处互相矛盾**(§2 记批 11 且含「老化」与「机检」· §6 记批 10 且含「核销清单」· §5:126 把「机检三件套」**明文列为不吸收**),且**四个词全仓从未被定义**、**批 7 的卫生锁正在禁止那两个检查器** ⇒ 用户裁定**只做可落地版**(计数有据 + 指针/触发字段),老化与机检不做。会诊又独立挖出**两条改变裁定的事实**:① **嵌套未知键今天就是报错**(三处测试在案)⇒ 顶层是全函数**唯一的例外分支**,D-31 的修复**不是引入新严格性而是恢复一致性**;② **D-31 的真实严重度被登记低估**——未知键经「整体替换写盘」会**静默清空整层 user 配置**并报「已保存」,是**数据丢失**而非单字段未落盘。**设计评审轮次 1 = `PASS`(🔴0 · 🟡6 · 🔵3)**,而评审员的**第一句评语**是本批最该记的事:**「好几条意见恰恰落在本批要消灭的那类缺陷里(自报计数与枚举漂移)」**。→ 实施 8 stages(**23 次变异**,一个后台 job 撞 30 分钟兜底超时 abort 但工作已落地)→ **独立分歧审计 `🔴0 🟡3 🔵7`**(审计员在**临时副本**上**独立复现**全部 M 锚的红,确认 **27 条 AC 与 15 个锚零恒真锁**;🟡3 = **本批自己把状态行订正成 `342/342` 而正史是 `340/340`** + 需求档「10 处」未随设计档订正 + **`WRITE_GATE_FIXTURE` 重新基线 ≈50 行未自白**)→ 两轮修复轮 → 交付代码评审轮次 1 **`PASS`**(🔴0 · 🟡0 · 🔵5;**首次 900s 超时**,上调至 2400s 后通过)→ 收尾修复轮 → **449/449**。**本批沉淀三条纪律**:① **「自报计数漂移」在本会话累计 11 次命中,其中 6 次发生在批 10 自己身上**——而这一批的立论正是「自报计数会漂、要机检它」。它的机械闸**只罩两个面**(缺陷登记表 + 吸收清单 §2),**其余十个面仍是人工**(交接页是**刻意的人眼闸**,`release-check` G7 MANUAL);⇒ **「哪些面已机检、哪些仍是人工」必须明确写进交接页**,否则下个会话会误以为全覆盖——**这条比机检本身更重要**。② **锁住「函数体全文含注释」的元锁有真实维护代价**:`WRITE_GATE_FIXTURE` 逐字节锁 `makeWriteGate` ⇒ **一次注释改动也要重新基线**(本批**三次**:代码→注释→代码,**每次都自白**;**第一次未自白正是审计 #3 的病灶**)⇒ 「缩小锁面(只锁可执行行)」登记为将来方向。③ **实现者的 self-report 也要回盘核**:收尾轮自报「legacy 令牌在两条路径措辞可能不一致」,父侧逐行走代码后判**不成立**(`gateExp` 对内存态取 `tokenExpiryMs(该令牌)`,而 legacy 的第二段是**可解析的过去时间戳**)⇒ 两路径对 legacy **一致**;**父侧当时已采信并准备按「必须收口」派单,自己走完代码才推翻**。**另记两条流程事实**:① **写门禁按设计工作**——父侧派单时把 `designToken` 打错一个字符,`eng_coder` **直接拒绝**并给出正确诊断(令牌走参数、逐字比对);② **阶段门(批 9 立)在本批两次实战触发**,报告均被标 `UNDECLARED`(两次都是**误报**——报告确以阶段状态表开头而引擎的头部扫描未认),**但门是活的**这点已确认;判定精确度的改进属另一议题(改它要动 brief 字节 ⇒ 撞 T9 夹具),**不在本批**。 | | 2026-09-13 | **批 11 交付记录**(v0.19.0):**D1–D7 文档纪律成文 + 上游失败路径语义 + DOC-HYGIENE 提示词级纪律**——把三条**只在上游或只在我们脑子里**的纪律落到本仓,且形态**自含可判**。会诊 id 2(**4/4 交付**;codex 在连续两次 `PROCESS_ERROR` 后**首次回话**)→ 摸底挖出:**「D1–D7」在本仓被引用 22 处、零内容**(真内容只活在上游),逐条现状 = **D1 完全缺席** · D2 已有 · D3 部分机检 · D4 部分 · **D5 已实现为机制、未写为纪律** · D6 部分 · D7 一半(**核销同步已在批 10 明文废除**)。**会诊四家一致反驳父侧任务书的一条前提**:改 `lib/prompts/engineering.md` **不触动 T9**(T9 测 `buildCoderBrief` 的 **stages 缺省**输出,persona 与工程模式主提示**都不在该路径上**)⇒ **用户预接受的 T9 重基线本批零成本**;两家更进一步:今天连改也改不了(授权面口径锁要求 `.test.mjs` 而夹具是 `.txt`)。**设计评审五轮**(FAIL ×4 → **PASS**),**四轮的 🔴 全是同一类**:D1 vs 本设计自己的实施域 · 规范块 vs 自身 V2 · **V4 的锚引原句而 §6.1 冻结的是改写** · **V11② 的锚被加粗星号切断**;**交付期又出现第五次**(**V5 把 `METHODOLOGY.md` 列进六串负向清单,而该档全文含 3 处 `/methodology/i` ⇒ 按字面执行必然红;而真正的检查 T-PK15 只扫 `lib/**` ⇒ 测试全绿 = 一条「写着但没人能执行」的判据**)。→ 实施 9 stages(**实现者零交付报告就消失了**,父侧**完全独立复核**)→ 独立分歧审计 → 交付代码评审 → **453/453**。**★ 本批的元教训是本会话最重的一条**:**「规范/判据自己打自己」累计命中六次**(批 8 一次 · 批 10 一次 · **批 11 五次**),**同一根因贯穿全部六次——靠「看起来对」代替「机械核一遍」**。对策已落三条:① **stage 0 第 ⑥ 项「锚串存在性自检」**(对每条字面锚 grep 验证其在冻结文本中真的命中);② **该自检必须在设计交付评审之前跑**(本批是在缺陷出现后才跑的);③ **判据的覆盖面与谓词必须一起自检**——「清单里的每个档,是否**可能**通过该谓词」(V5 那次把一个**含有被禁串的档**列进禁串清单,一眼可见的荒谬,却躲过五轮评审)。**另记四条流程事实**:① **本批的 `eng_coder` job 零报告消失**(job 从队列消失、未发通知,工作已落地)⇒ **全部核验由父侧独立完成**,可信度反而高于自报,且 **stage 0 的六项勘察结论未被任何人落档**,父侧从代码**逐点读出全部 17 个返回点**补进设计档 §14.6.3;② **父侧三次「假阴性」自证**(EOL 未归一误判「逐字交付三项全不匹配」· `Select-String` 单匹配取 `.LineNumber` 得 null 致区间塌缩误判 V3 不成立 · 自检脚本分不清「判据」与「对判据的讨论」),**三次都当场推翻、没写进结论**——**批 8 的「EOL 不能只靠 git diff」纪律今天又救了一次场**;③ **一个变异是「假红」**(给预检点挂 `failStop` ⇒ ReferenceError 打崩整档 ⇒ 红,**非断言抓住**)⇒ 如实记录,**防将来把假红当变异通过收下**;④ **实现者主动报了一条它无权裁的发现**(V5 那处自相矛盾,写进交接页标「待父侧裁定」,并**按权威判据实现而不擅改 §6.1**)——**这条纪律执行得很对**,但它的交接页行**同时留了一处陈旧指针**(「§14.6」应为 §14.7)⇒ **D4 要治的病,出现在同一批的交付物里**,父侧订正。 | | 2026-09-15 | **批 12 交付记录**(v0.20.0):**`WRITE_GATE_FIXTURE` 锁面收窄**——把「改一行注释就要重新基线 **79 行 / 4821 字符**」的元锁收窄为「**只锁可执行行**」(**47 行 / 2677 字符**,字节与顺序仍逐字节锁死)。会诊 id 1(**4/4 交付**)→ **★ 四家在一个关键点上给了相反答案,父侧逐条实测裁决**:剥离会留下**注释骨架**(32 个仅缩进的伪空行 + 1 个尾空格)⇒ **只去注释则四种纯注释改动全部仍红**(`rtrim` + 丢空行才是兑现用户裁定的必要条件);反对丢空行的两家其理由**在事实层面不成立** ⇒ **glm 对**。**设计评审轮次 1 即 `PASS`**(🔴0;对比批 11 五轮)→ 实施 **17 变异** → **独立分歧审计 🔴1 🟡3 🔵4** → **设计修订** → 修复轮 **25 变异** → 交付代码复评 **`VERDICT: PASS`** → **453/453**。**★★ 本批最重要的一件事:审计抓到一条本批亲手引入的真漏洞**——`stripComments` 的行注释规则 `(^|[^:])\/\/[^\n]*` **只认 LF**,而 JS 的 **LineTerminator 是 LF \| CR \| U+2028 \| U+2029** ⇒ 在 `//` 后插 CR/LS/PS 时**解析器认为注释在其处结束(后面跑真代码)、剥离器把整行吃掉** ⇒ **代码在锁眼里消失、写门禁实际 fail-open,而 A2 全组保持绿**;**收窄前的逐字节锁对任何字节改动必然红 ⇒ 这个缝是收窄带来的**。修法 = **先统一四个行终止符再剥离**,父侧**先验后改**(三种终止符 假绿→红 · 整片 CRLF 不误伤 · **归一态逐字节不变 ⇒ 夹具无需重推**)。**★ 而设计档里恰好写着一句为它背书的话**:§9 边界-3 原文「**该弱点在 A 下只可能误红、不可能假绿**」——**被我自己的推理写下的、并被一个具体变异证伪**:我的推理**只覆盖了「字符串里含 `//`」这一形态**,**完全没想到行终止符这一维** ⇒ **元教训:对「某个弱点不可能造成 X」的断言,本身就是最需要被对抗性测试的一句。** **本批另修掉两条被证伪的判据**:① **AC-6** 原写「先剥后切 ⇒ 该断言红」——实测不可能(该变异下 `wgEnd = −1`,**先撞边界断言**,顺序锁根本到不了);② **AC-9 的幂等自检是 present-but-inert**(`norm` 恒在 `normalizeExec` 的像集里 ⇒ 等值断言必然先红,**7 种夹具污染下它的消息从未出现**)⇒ 改成三条**直接判定夹具原始文本**且**全部排在等值断言之前**。**三个一行守卫堵三个「今天就已经存在」的缺口**:顺序锁(`wgEnd` 的标记**本身是注释**,原始 `indexOf` 15722 / 剥离后 **−1**,而该顺序此前**无断言守着**)· 域自检(剥离器自述「对字符串含 `//` 的场合足够」,**升格为等值参与者后该陈述承重相等正确性**)· **合并签名正则**(`"frozen".includes("designFreezeSet")` 是 **false**(freeze **无 n**)⇒ **旧断言从没拦过「把预闸函数拖进写门禁」这类合并**)。**登记面**:新增 **D-38**——`lib/eng.mjs:471-472` 的活注释**把锁归给一把不存在的锁**(与 `:52` 的「措辞过宽」性质不同),两处受 N-1 冻结 ⇒ **触发条件 = 下一次触碰 `lib/eng.mjs`**。**三条本会话新长的纪律**:① **收窄一个锁就是在给攻击面搬家**——旧锁的「对任何字节改动必然红」**本身就是一种强度**,收窄必须**重新论证逃逸面**,**而论证要实测、不能推理**(我就推理错了);② **「修正一处错指针」这个动作本身会引入新错**——我在改正 §13.2.2 时把 `WRITE_GATE_FIXTURE` 的区间写成了它并不覆盖的那一段;③ **一个会诊结论可以有对的结论 + 错的机理**(v4-pro 的「预剥离夹具」结论对、逃逸机理错;kimi 的「零反引号」事实错)⇒ **会诊/审计也要逐条回盘**。**另记两条**:① **批 10 建的 `ledger-parity` 锁连续三次拦下父侧自己的编辑事故**(切坏相邻行致表 37→36 而自报写 37 · 列数错 · 指针形态不可解析)——**且父侧前两次把列数问题诊断错了**,最后靠**逐字复制测试自己的解析器**才定位(此前把切分产生的首尾空串也数成列);**这是本会话第一次,既有机锁在同一问题上连续三次拦住父侧**。② **实现者自曝一次事故并修复**:变异首跑时截断 PowerShell 管道把 node 杀在中途,`lib/eng.mjs` 一度处于变异态;它用 `git cat-file` + node 显式 utf8 写回(因 `core.autocrlf` 会让 `git checkout` 写 CRLF)⇒ **父侧独立核字节确认干净**(74326 字节 · **0 CRLF** · sha256 与会话起始值一致 · 零 diff)。 | | 2026-09-15 | **批 13 交付记录**(v0.21.0):**登记面与判据面余项**——七条老登记回盘核 + **D-38 清偿**。**★ 本批的第一件事不是写代码,是把登记逐条回盘**(登记表是**快照**,它的家只有人眼闸 G7)⇒ **三条描述是错的、两条范围比登记大得多、一条比登记更便宜**:**O-E5 说反了**(登记写「评审传相对、写传绝对 ⇒ 预闸 miss」;**实测不成立**——`normalizeDocPath` 的 `resolve()` 本就把相对转绝对,三形态归一为同一串,两向查找都命中。**真实的是基分叉下的错根锚定**:基错时 **hash 侧 fail-closed**(不绑文档集 ⇒ 续期恒拒,可用性损伤、方向安全)而 **冻结侧 fail-open**(冻结集锚在错根 ⇒ 预闸对真实绝对路径写**静默放行** ⇒ **在飞窗口的文档冻结失效 = 保护性损伤**)⇒ **比登记的「miss」更坏**)· **R-9 实测缺 4 项 / 2 个文件**(非 1 键 1 文件;还漏了**组字段 `runner`**(早于批 5)与 **`README.md` 的同构第二份清单**)· **R-4a 是 3 处同类**(非 1 处)· **外加父侧自己的简报也有一条错的**(「6 维句 design 与 code 都发」——**四家会诊模型全部独立指出**,源码裁决确认它们对)⇒ **「登记文本订正」被列为与代码修订同级的交付物**。**本批最重的一次自纠**:**R-4a 初版容忍条件只看 `status === 128`** ⇒ 父侧与独立审计**各自实测**证实 `git show HEAD:` 在**两种**情形下都退 128(① 不在仓库内 ② **在仓库内但该 path 在该 revision 不存在**)⇒ **只看 status 会把 ② 这种真回归(文件被改名/删除)从「红」降级成「静默 warn」——比本条要治的原问题更糟** ⇒ **收紧为同时匹配 stderr `/not a git repository/`**;**审计比父侧更准的一条**:**只有 T-AP7 使用 `HEAD:` 语法**是唯一暴露于该危险路径的,另两处的 git 语法对不存在的 path **返 exit 0**。**其余六件**:**R-5**(系统提示 7 维 vs design 专属用户消息 6 维 ⇒ **原地追加第 7 维 + 负向锚**把 design-only 边界锁死)· **R-6**(新增**独立**键 `advisor.criteriaDoc` 六面接通 + `loadAdvisorMd` 升三态;**legacy 链逐字节保留** ⇒ 存量用户零行为变更)· **R-25**(登记完备机检落 `doc-hygiene` **并入既有块** ⇒ 台账零改;**带四腿自证**)· **R-4b / R-8 / D-38**。**★★ 本批的元教训:「枚举/规格不追列表」这个病,四层评审各抓住本批一次**——① **设计评审 #1** 抓到 G9 的验收面漏 **AC-22**;② **独立审计 F3** 证伪 §9 边界 10 的「`PK_KEYS` 加一键 ⇒ T-PK14 家族四面自动扩」(**T-PK14d 不吃 `PK_KEYS`**,而它是 **AC-13 的唯一覆盖点** ⇒ 第三键 merge 行为**零测试 = present-but-inert**);③ **交付代码复评轮次 1 = `VERDICT: FAIL`(🔴1)**——收紧后的谓词有**四处副本**没同步(含**父侧自己的需求档 US-3**)⇒ **同一机制两套互斥规格**;④ **复评轮次 2 #6**——**第五处副本**藏在 **§6.3 的代码块**里(前四次扫描都只看表格,**这类副本形状不同、扫描要换维度**)。⇒ **专门治它的批次,被它抓了四次。** **★ 另一条本批长出的纪律**:**R-25 建成的当晚就抓住了本批自己**——父侧提交那三档时漏登记 `docs/README`,**V8 谓词当场报红**(那三个未登记档就是我刚写的)。⇒ **「读」的可靠性不如「数」**:本批父侧编辑事故 **六次**(行锚替换吞掉相邻行/尾),**六次全部由「程序数一遍」发现,零次由父侧读出来发现**。**对策因此是机械的**:每次行锚替换后立刻跑计数(本批已用四次:D13 编号 1..20、§12 行数、D13-18 补回、审计条目对表)。**另**:`CHANGELOG` 的**计数行可推导式闸**在本批与批 12 **各栽一次**,**同一个坑**——行文里写「**基线 10 档**」会让解析器 `基线\s*(\d+)` 抓到 10 ⇒ **对策 = 计数句里只允许出现 `基线 <真值>` 一处,其余说「那十档基线档」**。**零改面**:`lib/**` 只有注释改动 · `test/fixtures/**` 零触碰 · 批 6 那十档基线档里只有 `design-review-guard.test.mjs` 被改(已在授权面)· **不新增测试档 / 不新增顶层 `test(`** ⇒ 台账 §三零改 · 六串零命中 · `failStop(` 恒 18 · **453/453**。**新增登记**:R-33…R-36 · **R-38** · R-39 · **R-37 已撤回**(父侧误登「设置页没有 `budgetCapMs` 输入框」——实测该输入框在 `client.js` 里,label 还写着「须低于 `run_code` maxWallMs」)· **D-38 → 已修**。 | | 2026-09-16 | **批 16 交付记录**(v0.24.0 / `71368af`):**文档形状谓词**——把「文档形状缺陷」(**计数不追列表** · **同一事实两处取不同值** · **引用不存在** · **该有锚的 AC 没锚**)从**靠人眼 / 靠用户质问**变成**机器自己红**。**四条腿**并入 `test/doc-hygiene.test.mjs`:① **计数 ↔ 列表** ② **同一事实多处一致** ③ **引用可解析** ④ **AC ↔ 锚互引(含反向孤儿锚腿)**。**立项证据 = 本会话实测的缺陷分布:父侧文档 45 条 vs 实施者代码 2 条,而 45 条里唯一可靠的发现手段是「用户质问」;用户由此指出「靠我的记忆来要求工作流程是不合理的」** ⇒ **本批是把该闸机械化的第一次尝试**(**若四条腿之后仍有同类逃逸,那是「腿不够」而不是「机制错」**)。**★ 形态由两条摸底否证决定**:**① 正则猜中文「N 项」误报 62%**(24 处判不等 15 处;根因 = **中文量词无词边界**,`17处` 匹配到「改 17 处」里的数字)· **② 追溯存量会造大量历史红**(20 份设计档里可被谓词定位到 AC 表的只有 4 份,而其中 2 份就有空洞)⇒ **只认显式标记** + **前向生效**(D16-1/D16-2)。**★ 交付本身合格**:四条腿语义 · **九道闸**(含修复轮补的**闸 0「行被吞」**与**零数据行闸**)· **八条负控构造 / 8 条顶层 `test()`**(全部真红 + 阴性对照,审计逐条复放)· `scanned >= 1` 防零扫描恒真 · **谓词面全 fail-closed / 存量档 fail-open(53 档跳过)** · **只报不改** · **零域外改动** · **464/464**。**★★ 而本批最有价值的产出是它的失败统计**:**「任何『改了两处之一』都不算修好」这条规矩由本批自己立,而它在父侧手里复发了五次**——① 批 14 设计评审轮 2 #1(只改 AC-10 行、**A10 锚行未动却宣称已改**)· ② 分歧审计 F1(订正语**留在列表格里** ⇒ 机器读到的仍是字面 token)· ③ 分歧审计 F3 + 代码评审 #1(**US-5 与 §7/§10.1 漏改**)· ④ 代码评审第 2 轮 #1(**修复轮漏改 `CHANGELOG.md`**,零留痕)· ⑤ **收口时**(计数行**一节之内两处推导式**:写「基线 456 + 本批 5」而实为 **456 + 8 = 464** ⇒ **`G-常驻3` 红**)。**⇒ 五次全部由独立评审或既有解析器发现,父侧自查 0 次;而五处都不在本批谓词的作用域内**(谓词只看「声明的锚表 / AC 表」)——**这正是分歧审计那句结论:「谓词不是错的——是它的作用域与它的宣言不匹配。」** ⇒ **行动已登记为下一批题目:让谓词也能看见 §7 / §10.1 / §11 / CHANGELOG 这类登记面的计数与枚举**。**★ 交付过程共 9 轮评审/审计(如实记)**:**设计评审 3 轮**(轮 1 FAIL 🔴3 · 轮 2 FAIL 🔴2 · **轮 3 PASS**)· **用户裁定的专项自查 1 轮**(9 条规则 8 通过 0 失败;**抓出第 3 条真缺陷:AC-12 从 T1 行删除后未加入 T2 行 ⇒ 在分层表里整个消失**;**自查自身报过 2 条假警报**——正则跨档 · 列号取错——**父侧修的是探针而非档**)· **分歧审计 1 轮 + 修复轮 2 轮**(**F9 `shapeTable` 静默丢行 = 恒真入口 2.0**:3 行表只见 2 行而判绿)· **代码评审 3 轮**(轮 1 FAIL 🔴1 · 轮 2 FAIL 🔴1 · **轮 3 PASS**)。**★ 两次从产物重建交付**:**实施者在 1800s 兜底被硬中断**(无报告)与 **DSH 重启清空 job store**(两个修复轮的报告丢失)⇒ **父侧两次改从盘上逐点测量,未依赖任何报告**。**★ 一条由交付者反向纠正父侧的自白**:**父侧把 F10 的「代码形态缺陷」误描述成「可复现的二次误报」**,而**该因果在本谓词形态下不可观察** ⇒ 负控腿 7 据实钉在「残缺失效行的零丢失」上。**⇒ 这是本会话第一次由交付者纠正父侧的错误描述并留档。** | | 2026-09-17 | **批 18 交付记录**(v0.26.0 / `60688bb`):**唯一窄腿 + 写作纪律 + 一个永久否决**——**这是本会话里唯一一批以「否定」为主要产出的**。**立项**:本会话「同一可数事实两处取不同值」复发 **21 次**,**绝大多数住在散文里**,而批 16/17 的谓词**只认显式标记**。**原计划**:做一个「散文立场谓词」(让机器分辨「陈述现状」vs「历史引用」)。**★ 两轮会诊三家独立判死它**(**`kimi-k3` 原话:「第三次尝试只是烧预算」**;**`glm-5.3`:「这个难题是提法本身造出来的——机器不分辨,作者声明」**),**而父侧的 stage-0 实测又砍掉了两个替代品**:**① 版本文法换分母**(只在「未密封作用域」内数)**仍是 134→63 处**——**根因是父侧发现的**:`README.md` 与 `docs/README.md` 是**版本历史表**,既无日期前缀也不在 `## [` 节下 ⇒ **「密封性」这个新判据对它们失效**;**② `AC N` 文法在未密封档散文区 79 处命中 / 1 处真缺陷 ≈ 1.3% 精度**。**⇒ 批形退回最小形态**:**① METHODOLOGY 新增 W1–W3 写作纪律**(**裸写即现状(带未密封区限定)· 指针优先 · 历史值必带 as-of**——**独立小节,不编 D8–D10,因为 D1–D7 块是上游定长区间改编,本地加法混入会污染上游对照契约**;**W2/W3 是 D2/D3/D4 的同族推广,W1 是新律**)· **② 批 17 §9.4 残差 #2 拆 2a/2b**(**2a「散文里的计数」判为永久否决**,附三条实测;**2b 改归纪律面**)· **③ 唯一窄腿 = CHANGELOG 绑定区域内令牌值一致**。**★★ 而 #13 四家一致指出我那条腿的初版措辞会「第三次踩同一颗雷」**:**「只读首节 · 各恰 1 处」**——**而批 17 弃它的理由就写在我自己的 §9.4 残差 #6 括号里**(「要改写批 16 条目 ⇒ 超范围」)。**⇒ 改基为「FR-5 绑定源内令牌值一致 + span 掩码 + 边界不确定则 fail-closed 不回退」**;**判据从「基数唯一」改为「值一致」**——**因为批 16 条目刻意复述推导式是有文档价值的写法,按前者两态皆红、按后者两态皆绿**。**★ 实施者抓到两处父侧问题**:**① 裁定层真空**——**docs 侧对等值写死于批 17 的交付值,任何下一批的新计数行都会撞**(**两轮会诊都没写「谁每批更新」**)⇒ 今明确「住设计档 §11 · 主代理 · 与改 CHANGELOG 首节计数行同一次编辑」;**② 我的行锚事故吞了批 17 实施行的行首**(从 git 逐字重建)。**★ 交付过程**:**会诊 2 轮**(#12 3/4 · #13 **4/4**——`codex-cli` 连败两轮后成功)· **stage-0 实测 3 条** · **无分歧审计与代码评审**(**本批只加一条腿,父侧裁定按最小形态收口**)。**★★ 本批的物种统计**:**我的同族失误 5 次**(裸引 98% · 计划行替换留尾 3 次 · §11 行锚吞行 · 腿措辞第三次踩同一雷 · 登记遗漏)——**5/5 全部由机械或他人发现,自查 0 次**。**⇒ 一句话**:**批 18 交付的是一条腿 + 三条纪律 + 一个永久否决,而它最值钱的部分是「哪条路不该走」现在有出处了。** | | 2026-09-17 | **批 17 交付记录**(v0.25.0 / `7156850`):**谓词作用域与宣言对齐**——批 16 的谓词**能工作**但**只扫两处**(档内声明的锚表与 AC 表),**而六次逃逸全在它的作用域之外**。立项来源 = 批 16 分歧审计的结论「**谓词不是错的——是它的作用域与它的宣言不匹配**」。**本批把判据从「某张表内部自洽」升为「同一可数事实的每一处出现彼此同值」**:**事实 id**(全枚举形 `(N 量词 id=X:a · b…)` · 裸引用形 `(N 量词 id=X)`)**跨档分组**;`require-facts: id@N` 锁**出现次数**(**堵「id 笔误 ⇒ 静默裂成两个单例组 ⇒ 自洽判绿」这条 fail-open 缝**);`bind=<源>.<槽>` 把 **CHANGELOG 拉进比对**(**两态定位器**:交付时点新条目在「死区」、收口后在首节)。**★ 三条会诊提案被实测/原则否掉并留痕**:**① 头号想法「腿 1/腿 3 全档常开」被父侧干跑 62 档实测否掉**(腿 3 常开 ⇒ 存量档红 26–34 处裸模块名 ⇒ **= N-2「不追溯存量」被从后门违反**)⇒ **增量只剩事实 id 腿,而它根本不需要常开**(逃逸口由**日期切点强制声明**关掉);**② 类型槽未实现** ⇒ 据实改为「**类型由标记形态自动判定**」;**③ 双向登记锁因与 D16-3 正面相撞被否决** ⇒ 改用**预算常数**(**「白名单长一行」变成「改一个带注释的常量」**)。**★ 顺带修三处既有正确性缺陷**:**深度感知闭括号**(`(§3)` 式引注曾截断列表)· **围栏掩码**(围栏内示例曾裸奔)· **掩码改「非空白占位符」**(项整体住在代码 span 里曾被掩成空格 ⇒ `actual=0` 假红,**而本仓文风必然把文件名写成反引号**)。**★ 双模式真值表**:声明档保持批 16 严格语义(N-3 不退化)· 未声明档加三条宽松约束。**★ §9 是最大的一节**(会诊三家一致要求):**七个反例 + 五条保守约束 + 八条归一化的失败形态 + 六条诚实残差 + 威胁模型**——**残差第一条即「P-1『宣称已改而锚行未动』抓不到」,因为那是「留痕 vs git diff」族、不是可数事实**。**★★ 本批最有价值的产出是「机制在自己身上生效」的实证**:**设计档一旦按 A12 带上声明,腿 4 当场红在两处真实缺陷上**(**§8.2 的 A4 行格内有一个未转义的字面竖线** ⇒ 该行多一列、**且它在任何 Markdown 渲染里都会切列**;**A4 是孤儿锚**)⇒ **交付者按纪律 STOP 上报,父侧一行修完 ⇒ 476/476**。**★ 交付过程共 4 轮**:**设计评审 2 轮**(轮 1 FAIL 🔴1「会诊采纳的第二层堵口被静默丢弃而图 4 仍宣称它」→ 轮 2 **PASS**)· **独立分歧审计 1 轮**(**14 条全折入**;**它复算那个 34 ⇒ 得 26**,**父侧两种掩码各跑一遍都得 26 ⇒ 差量未归因,据实登记为「未归因」而非选一个对自己有利的解释**)· **代码评审 1 轮**(**`VERDICT: PASS`**,🔴0;**7 条里前 4 条全同一形态:「处置表宣称 Fixed 而主文未落地」——正是本批要治的物种**)。**★★ 本批的物种统计**:**「同一可数事实两处取不同值」在本批复发了 20 次**,**全部由「逐行数 / 按分隔符切 / 列 id 出来数」发现,零次由「读」发现**——**包括第十次发生在我写下第九次的那一段里**(**我写「AC 15」而实为 16,成因是我自己更早一次漏掉 `AC-4c` 的正则计数**)。**⇒ 结论:本批交付的机器看不见「散文里的数」,而我的错误绝大多数住在散文里**——**那正是 §9.4 残差第 2 条,本批已明示登记,不假装堵住**。**⇒ 而它同时说明批 16 那句「若四条腿之后仍有同类逃逸,那是腿不够而不是机制错」是对的**:**本批加了腿,逃逸仍发生,因为新腿的作用域依旧是「标记」,而错误住在「散文」。** |——把「文档形状缺陷」(**计数不追列表** · **同一事实两处取不同值** · **引用不存在** · **该有锚的 AC 没锚**)从**靠人眼 / 靠用户质问**变成**机器自己红**。**四条腿**并入 `test/doc-hygiene.test.mjs`:① **计数 ↔ 列表** ② **同一事实多处一致** ③ **引用可解析** ④ **AC ↔ 锚互引(含反向孤儿锚腿)**。**立项证据 = 本会话实测的缺陷分布:父侧文档 45 条 vs 实施者代码 2 条,而 45 条里唯一可靠的发现手段是「用户质问」;用户由此指出「靠我的记忆来要求工作流程是不合理的」** ⇒ **本批是把该闸机械化的第一次尝试**(**若四条腿之后仍有同类逃逸,那是「腿不够」而不是「机制错」**)。**★ 形态由两条摸底否证决定**:**① 正则猜中文「N 项」误报 62%**(24 处判不等 15 处;根因 = **中文量词无词边界**,`17处` 匹配到「改 17 处」里的数字)· **② 追溯存量会造大量历史红**(20 份设计档里可被谓词定位到 AC 表的只有 4 份,而其中 2 份就有空洞)⇒ **只认显式标记** + **前向生效**(D16-1/D16-2)。**★ 交付本身合格**:四条腿语义 · **九道闸**(含修复轮补的**闸 0「行被吞」**与**零数据行闸**)· **八条负控构造 / 8 条顶层 `test()`**(全部真红 + 阴性对照,审计逐条复放)· `scanned >= 1` 防零扫描恒真 · **谓词面全 fail-closed / 存量档 fail-open(53 档跳过)** · **只报不改** · **零域外改动** · **464/464**。**★★ 而本批最有价值的产出是它的失败统计**:**「任何『改了两处之一』都不算修好」这条规矩由本批自己立,而它在父侧手里复发了五次**——① 批 14 设计评审轮 2 #1(只改 AC-10 行、**A10 锚行未动却宣称已改**)· ② 分歧审计 F1(订正语**留在列表格里** ⇒ 机器读到的仍是字面 token)· ③ 分歧审计 F3 + 代码评审 #1(**US-5 与 §7/§10.1 漏改**)· ④ 代码评审第 2 轮 #1(**修复轮漏改 `CHANGELOG.md`**,零留痕)· ⑤ **收口时**(计数行**一节之内两处推导式**:写「基线 456 + 本批 5」而实为 **456 + 8 = 464** ⇒ **`G-常驻3` 红**)。**⇒ 五次全部由独立评审或既有解析器发现,父侧自查 0 次;而五处都不在本批谓词的作用域内**(谓词只看「声明的锚表 / AC 表」)——**这正是分歧审计那句结论:「谓词不是错的——是它的作用域与它的宣言不匹配。」** ⇒ **行动已登记为下一批题目:让谓词也能看见 §7 / §10.1 / §11 / CHANGELOG 这类登记面的计数与枚举**。**★ 交付过程共 9 轮评审/审计(如实记)**:**设计评审 3 轮**(轮 1 FAIL 🔴3 · 轮 2 FAIL 🔴2 · **轮 3 PASS**)· **用户裁定的专项自查 1 轮**(9 条规则 8 通过 0 失败;**抓出第 3 条真缺陷:AC-12 从 T1 行删除后未加入 T2 行 ⇒ 在分层表里整个消失**;**自查自身报过 2 条假警报**——正则跨档 · 列号取错——**父侧修的是探针而非档**)· **分歧审计 1 轮 + 修复轮 2 轮**(**F9 `shapeTable` 静默丢行 = 恒真入口 2.0**:3 行表只见 2 行而判绿)· **代码评审 3 轮**(轮 1 FAIL 🔴1 · 轮 2 FAIL 🔴1 · **轮 3 PASS**)。**★ 两次从产物重建交付**:**实施者在 1800s 兜底被硬中断**(无报告)与 **DSH 重启清空 job store**(两个修复轮的报告丢失)⇒ **父侧两次改从盘上逐点测量,未依赖任何报告**。**★ 一条由交付者反向纠正父侧的自白**:**父侧把 F10 的「代码形态缺陷」误描述成「可复现的二次误报」**,而**该因果在本谓词形态下不可观察** ⇒ 负控腿 7 据实钉在「残缺失效行的零丢失」上。**⇒ 这是本会话第一次由交付者纠正父侧的错误描述并留档。** | | 2026-09-16 | **批 14 交付记录**(v0.23.0 / `b065ed3`):**配置面与描述面同步**——六项一个物种:**「插件自己的契约」与「它对外声称的契约」**。① `engCoderEffort` 默认值 `low`→**`medium`**,且**回落目标与初值同源一个常量**(旧形态的 `else` 分支**不赋值** ⇒ 靠初始化值隐式回落 ⇒ **改初始化值会静默改回落语义**);**`low` 是唯一在一切非退化支持集上都可能被 `nearestEffort` 静默落到 `off` 的程度档**(**推理全关且无提示**),**而本部署实测形状 `{off,high,max}` 恰是中招形状**,**出厂示例(`README:249` · `cordis.patch.yml:43`)都写 `low`** ⇒ **新部署照抄即中招**。② 白名单散文**立常设谓词**(三轴 **`TOP` 8 · `ADV_SUB` 6 · `GROUPS` 2 · `GROUP_FORM` 5 = 21**;**逐文件各一条 + 先钉基数 + 双向**);**谓词与 `config-store.mjs:19` 补 `runner` 同一 stage**(先出谓词则必红,且那个红与「其他项未完成」混淆)。③ F8 遗留**两分支都治**(ENOENT ⇒ 打**新写的准确话**;128 ⇒ 维持既有的准确的;`:992` 的 else **只在两分支都未命中时触发**——那时那句才是真的)。⑤ 到点文案三处第一字面补 `codexCli.` 前缀(**顶层根本没有 `budgetCapMs`,真键在 `codexCli` 节下**——**另一台机器的用户正是被引偏**)+ **前置告警仅 dsh 同步路径**(后台无墙钟问题,错告即噪声)。⑥ **`lib/**` 十处 / 七档悬空引用删指针**(`DESIGN-dsh-port.md` 7 + **`DESIGN-advisor-token-protocol-fix.md` 3**——**两份档从未进过 git、全盘零命中**)⇒ **只删不重指**(仓内无对应的 DSH 适配档;重指 `portability-design.md` 会造**新假指针**)。**★ 本批交付方式异常(如实登记,且这是一条流程教训)**:**`eng_coder` 在 `dshBackgroundTimeoutMs=1800s` 兜底被硬中断、未留下任何报告**(无 stage 表 / 无自证 / 无自白);工作区留下看起来完整的实现(16 档、456/456 绿)。**父侧未重派实施,改为「审计即验证」**——派独立分歧审计**代产实施者没写的自证**:**锚 A1–A12 12/12 可跑且通过**(**A3 的删键负控是真负控**)· **变异 5/5 全真红 + byte-exact 还原 + sha256 前=后** · **八项零改面 6 项干净** · **AC 21/25 达成**(3 条不可判定是设计**如实降层**)。**⇒ 流程教训:「实施 + 自证」压在一个 1800s 窗口里是设计错配**(收口 stage 要做「全量 + 12 锚 + 5 变异 + A↔AC 表」,本身就接近 30 分钟)⇒ **今后拆 stage 应把自证单独留给审计轮**。**★ 而审计抓出的 9 条里 3 条 🔴 是父侧的设计措辞问题**:① **§11.4 写的「A1–A12 与 AC-1…AC-25 为满射」当场为假**(程序生成的 A↔AC 表实证 **5 条 AC 无锚**)⇒ 补两条(AC-16→A10 · AC-20→A3·A4)**并把不变量改分层**(**T1/T2 必须有锚;T3 与「连 T3 都不是」免锚**——**给它们编锚才是超卖**);**而设计自己要求「用程序验」的那条谓词从未落地**。② **设计说「台账 §三零改 · 不新增顶层 `test(`」而交付的动作就是「在三个既有档内各加 1 个用例并同步台账三行」** ⇒ **AC-17 曾是一条假绿** ⇒ **改设计而非改交付**(**规则的真正边界是「禁新增测试档/测试层」,在既有档内增用例是允许的,条件是台账计数同批同步**——**回退会为了口径漂亮而拆掉真覆盖**)。③ **`docs/test-lifecycle.md` 被改而它既不在实施域、又在父侧写得过窄的禁改措辞里**(`T-LC2` 是**等值锁**,不同步套件必红)⇒ 列入实施域 + 澄清禁改面。**★ 另有两处父侧反复犯的**:**A4/AC-6 的轴计数写成「8/8/5」而代码钉的是「8/6/2/5」**(**父侧把「8」贴错了轴**;恒等式 21 一直成立);**§6.2 的伪代码在函数体内切段而实现是调用点先切**——**而那一处上一轮复审 #10 就提过,父侧只改了 JSDoc、没改函数体** ⇒ **同一缺陷第二层**。**★ 补腿轮**:审计点名唯一一条真代码缺口——**「改坏提取器 ⇒ 空集 ⇒ 必红」此前只是声明、没有任何腿证**(既有腿断言的是「喂整档 ⇒ 多抓」,而防恒真的 `assert.ok(keys.size >= 1)` **自身没有负控**)⇒ 补法 = **把内联三次的护栏抽成 `assertDocKeysNonEmpty` 单点**(**复制品会漂而漂了没人知道 = 本批物种**)+ **两条互补变异**(一条证构造真出空集、**一条证护栏被削弱时会红**——**单条只能证其一**)。**零改面**:`test/fixtures/**` 零 diff · **20 档进 20 档出** · **六串零命中** · **`failStop(` 18** · **第二字面仍 2 次** · `lib/advisor.mjs` **只改 1 行注释**。**发布门 6/6**。**新增候选批次(两项,均已裁定另立)**:**`nearestEffort` 根修**(把 `off` 排除出回落候选——**四机制共享面;批 15 与批 14 的会诊独立同结论:应单独立项**)· **`writeFileAtomic` 硬化**(Windows rename 重试——**批 15 实测的偶发指向真健壮性缺口;加 flake 条目等于把真缺陷记成已知**)。 | | 2026-09-16 | **批 15 交付记录**(v0.22.0 / `97605ef`):**会诊结果的投递与消化**——把 consult 从「发起后靠调用方记得回来轮询」改成「**结束时自动经平台 job 投递、回来后停在必须向用户汇报的断点、处置结果默认落档**」。**★ 本批的第一件事实是「本仓落后上游六天」**:上游在 `3e1234b`(2026-09-07)退役 `consult_check`、改 digest 自动注入,而**本仓首个提交 `aeffdf7` 是 2026-09-01** ⇒ **本仓抄的是 `3e1234b^`(pre-R17),且从未记录这次分叉**。**★ 而平台的投递与唤醒早已具备**:`dsh-tool-jobs` 的 `onJobDone` 逐字「delivers **unreported** completions … **injected into a busy owner's next step, or opening a turn on an idle one** under the default `wakeup` delivery, bounded per owner」(`completionDelivery ?? wakeup` · `maxConsecutiveWakes ?? 3` · **用户回合重置预算**)⇒ **本批不照搬上游自造的 `_pendingAsyncResults`,只把 consult 接上去**。**本批的两处有意偏离**:① **`stopped` 会话必须产墓碑 digest**——上游 `T-R17c` 在轮询协议里成立,但**退役 check 后 digest 是唯一消费通道** ⇒ stop 无 digest = **已收到的回复整批蒸发 + 打穿批 6 的「死亡行必须经生产消费面可见」裁定**;② **`jobs` 缺失 ⇒ 拒发,不回落同步**——先例的前提是工作量适配 600s,而 consult 是**并行 + 自带 10 分钟看门狗**,回落会起一个**永远无人能读**的会话。**★ 本批最重的缺陷是父侧自己的**:设计 §7 ④ 规定的纪要落点(会话 cwd 的 `docs/` **顶层**)**撞 R-25 谓词**(顶层每个 `*.md` 必须登记在 `docs/README.md`)⇒ **真机跑一次会诊后下一次 `node --test` 会红**;**独立分歧审计双侧实跑验实**(加合成档 ⇒ 谓词返回它 ⇒ `doc-hygiene` 1 fail),并判定**代码忠实于设计、缺陷在设计里,且设计自己的 V8 锚在交付时看不到它(文件还不存在)** ⇒ **用户裁定改子目录**(`doc-hygiene.test.mjs:122` 明文子目录在域外)⇒ 落点改 `docs/consult-minutes/`,**修复轮双向实证**(顶层反证打红 / 子目录正证放行)。**★ 而交付代码评审抓到两处审计与我都没看到的真缺陷,都在修复轮自己的新代码里**:① **stop-竞速早退漏 `clearTimeout(watchdog)`**(定时器滞留 `consultTimeoutMs`)——**而同文件 30 行外的注释记录过这个同一物种**;② **三类终结事件(`disposed` / 失败信封 `settled` / `stopped`)缺 `sessionId`** ⇒ 被孤儿扫描按会话过滤**系统性丢弃** ⇒ **一次被拒发的会诊,后续每次 `consult_start` 都会报「可能因重启丢失」的幽灵提示**。**★ 本批的账**:**实施者的代码零设计违背**(审计判定 `FAITHFUL`),**而父侧的文档被审计抓出 7 处、被评审批出 4 处**——其中 **W4(AC-13 说「方向四值」而表里有 7 个)与 W5(§11.2 只列 26 条 AC 而共 28 条)是同一个病的两次**:**「枚举不追列表」——本批立项要治的病,出现在本批自己的档里**。**⇒ 本会话的瓶颈明确在文档侧**。**诚实降层**:`goal`/`authorized` 两档豁免**只有提示词承载、零机制** ⇒ **如实降 T3**(补机制属新设计,另立批次)。**零改面**:`test/fixtures/**` 零触碰 · **20 档进 20 档出** · 顶层 `test(` **453→453** · 六串零命中 · `failStop(` 18 · `lib/advisor.mjs` 零 diff · 平台包零改动 · `docs/` 顶层既有 9 份纪要零触碰 · **发布门 6/6**。**新增登记**:**R-46**(「纪要裁定未落进实施域/验收面」——评审 15 条里 5 条是这个形状 ⇒ **会诊白问**)· **R-47**(行锚编辑事故**十一次**,**十一次全由「程序数一遍」发现、零次由父侧读出** ⇒ 对策必须机械)· 两条 Deferred(ack 弱绑定 · `README:148` 陈旧机制描述)。 | | 2026-09-17 | **批 19 交付记录**(v0.27.0 / `1b84609`):**effort 回落的开关语义**——`off` 是**关闭开关**不是力度档,而 `nearestEffort` 让它在**同一把距离尺**上参与竞争 ⇒ **用户要「低推理」、拿到的是「推理全关」**。**触发条件实测**:`requested = low` ∧ `medium ∉ supported` ∧ `off ∈ supported`;穷尽 dsh 梯子 **31 个非空支持集**,`low` 落 `off` 的**恰 4 组**(退化集 + `{off,high}` / `{off,max}` / `{off,high,max}`);**本部署 20 个模型条目里 8 个是该形状**,而 profile base 的 convergence 组恰是 `glm-5.3-flash` + `low`(只因 user 层覆盖才未中招)。**★ 用户裁定的两条语义**(本批不自行拍定):① 回落**禁止**落到 `off`,**仅当支持集里根本没有力度档时才用**它(退化兜底 + 专属告警);② 显式请求 `off` 而模型**不支持** ⇒ **改为省略 `reasoningEffort`**(`effort: null`,交还提供方默认)。**★ 会诊三家独立抓到第二个形状**(父侧实测复现):显式 `off` 而不被支持时旧代码把它**改到力度档**(`{low,high}`→`low`)——**用户明确要求关推理,却被打开** ⇒ 裁定 ② 一并修掉。**实现全部住在 dsh 调用点**:**`nearestEffort` 函数体与 codex 调用点逐字零改动**(父侧**逐字节核验**:函数体 464 字节、两侧 sha256 前缀同为 `c14714a9d601d0e8`)⇒ codex 的零连带是**结构性**的、不是论证出来的;候选池**按名**分层(`!== DSH_EFFORT_OFF`;**禁按梯子下标**——codex 梯子 `[0]` 是 `low`,按下标会真打穿);**退化判定 = `degrees` 空且 `cands` 非空**(**不是**「`nearest` 返回 `null`」——后者把 `{off, xhigh}` 判成非退化 ⇒ **透传已知不被支持的值 ⇒ 秒死路径**);命中检查仍**先于**一切分层。**★ 核心可证性质:改动差集恒等于 3 组**(口径 = **`effort` 值面**):`{off,high}`→`high` · `{off,max}`→`max` · `{off,high,max}`→`high`,其余 28 个非空集与退化集 `{off}` 的**值**逐字不变。**三条 note 措辞互斥分叉**(退化支专属子串「退化兜底」· 显式-off 支含「未能关闭推理」且不含普通回落句 · 普通回落句逐字保留)——**退化支的值与改前相同 ⇒ 判别力全在措辞上,只钉值会恒真**。**八条新验收用例**(含**接线级 `null` 出口 × 五个 dsh 消费点**,断言钉**键缺席** `!("reasoningEffort" in agentOptions)`——「键在、值错」才是该病灶形态)+ **五处现役断言翻预期**。**★ 交付方式异常(如实登记,本仓第二次)**:**`eng_coder` 在 `dshBackgroundTimeoutMs=1800s` 兜底被硬中断、零报告**(工作树留下看起来完整的实现)⇒ **父侧不重派实施,改为「审计即验证」**(**批 14 先例**):从盘上逐点测量 + 穷尽复算 + 负控复现(**旧实现下恰 13 条断言红 = 5 翻预期 + 8 新用例,零其他失败**)。**★ 语义代价(如实登记)**:`effort: null` **不代表「无推理」**,是「**交还提供方默认**」——对推理强制型模型可能**比最低受支持档更贵**;「改落最低受支持档」的备选**已被否决并写明理由**,代价登记为设计档 §9.4 残差 #5。**★ 九条诚实残差**逐条见 §9.4(含「新调用点若忘记分层会退回旧行为」——`nearestEffort` 仍是纯距离函数)。**★ 顺手清偿的两处**:① **夜班计划 trap 12 的 EOL 声明两半都错**(实测 `docs/*.md` 60 LF / 2 CRLF · `test/**` **4 档 CRLF** · `lib/**` 19 CRLF / 11 LF)⇒ 订正为「**改前逐档实测,不得按目录假设**」;② **`git -c core.autocrlf=true` 是发布提交的必需参数**(本机 checkout 是 `i/lf w/crlf`,不加它提交会带 **6400+ 行 CR 幻影**并把两档 blob 永久翻成 CRLF——**已在仓外副本上端到端干跑验证**;**而 `git status` 的干净是 stat-cache 的投影,不是字节相等**)。全量 `node --test` **485/485**(基线 477 + 本批 8)· 发布门 **6/6 机械闸通过**。 | | 2026-09-17 | **批 20 交付记录**(v0.28.0 / `33b1bdc`):**原子写的可重试与失败可见** + **并入已知 flake `R-13`**。**立项形态**:`R-13` 与 `R-51` **实测同源**——「时序 flake」是**误诊**(失败原文恰是「写落地前」的文件内容,而失败被 store 的 `catch → warn` 吞掉、测试断言的是文件内容)。**★ 会诊三家一致「只做重试就是超卖」⇒ 两条腿落地**:**有界重试**(`renameSyncWithRetry`:8 × 平铺 30ms · 按 `e.code` 白名单 · `ENOENT` 特判重铸 · 耗尽重抛原对象 + 遥测)+ **失败可见**(遥测 + **`DELETE /config` 那句「面向用户的谎」被修**)。`writeFileAtomic` 重排(`mkdir` 环外 · 写与 rename 同入环内 `try` · 孤儿清扫 ≥10min)· `clearUserConfig` 并入原语 + TOCTOU 幂等 · **三个 store 契约零改动**。**全量 `node --test` 497/497**(基线 485 + 本批 12)· 发布门 **6/6** · 设计评审**两轮**(轮 1 FAIL 2 🔴 → 轮 2 PASS)· **分歧审计 10 条**(1 🔴 = **父侧收窄派发漏派 stage 3**)· 交付代码评审 **PASS**(7 条)。**★ 带未决项(如实登记,不静默收口)**:**疗效门槛未达标**——全量 ×10 = **9/10**(一条**身份未知**的偶发;父侧脚本只记计数、未捕获失败项名 = **测量设计失误**;追加 20 轮 0 复现)· 单档 ×20 = **20/20** ⇒ **`R-13` 不宣告「已根治」**,台账 §五 **保留该行**(**审计已实证**:删行 ⇒ 门测试 pass 7 / fail 2 + `release-check` 报 **G6 FAIL** ⇒ 「不删行」的裁定**有机械后果为据**)。**★ 过程如实记录(本批最可复用的三条)**:**① 环境的 1800s 派发窗口 ≈ 一个文件一档**——实施跨 **6 次派发**(1 次零产出(全烧在从四份文档重新推导设计)· 2 次兜底留半成品 · 3 次成功),**收窄成「一档一文件 + 把缝的调用形态直接写进任务书」后才稳定成功**;**② 独立分歧审计抓到 2 条 🟡 是「我自己设计的负控写着但没人能执行」**(N4 实测红在 A7+A8 而非 A9 · N7 零红)⇒ **负控必须真的跑一遍**;**③ 「新断言在旧实现下必红」对「新档」不成立**(旧 rev 不导出新符号 ⇒ 整档 `SyntaxError` = 本仓自己定义的**假红**)⇒ 对新档要用**逐条变异**而非「退回旧实现」。 | | 2026-09-18 | **批 21 交付记录**(v0.29.0 / 实现提交 `e131c10` · 测试提交 `4dd254a`):**长任务默认走后台**——`eng_coder` 与 `escalate` 的 **dsh 子代理路径三态语义**(省略 ⇒ 后台 · `false` ⇒ 强制同步 · `true` ⇒ 后台),**零新配置键**。**四处手术**:两处判定 `=== true` → `!== false` · 两处 schema 删 `default: false`(宿主该注解是**非校验**的)· **`lib/index.mjs` 的 escalate 透传 `=== true` → 三态透传(★ 不改则 escalate 的翻转**静默失效**——父侧漏看、会诊抓到)**。**配套三件**:**① 跨机制护栏**(默认后台后父代理不再阻塞 ⇒ 可能在交付落地前跑 code 评审,看到陈旧 scope/prior;护栏 = code 型评审查 eng/escalate 槽位,在飞则拒并指向 job id)· **② 回落告警随工具返回可见**(此前只 `console.warn` ⇒ 会变成「父代理傻等一个不会来的通知」的**静默失败**)· **③ 描述面六处 + 提示词过渡态/隔离期纪律**。**不动**:codex 路径判定(零漂移)· `budgetCapMs` 缺省 540s · 五个未授权基线档。**全量 509/509**(基线 497 + 12)· 设计评审两轮(轮 1 FAIL 🔴2 ⇒ 轮 2 PASS)· **分歧审计 5 条**(**1 🔴 是父侧收口欠项**:交接页缺本批重启行;**2 🟡 都出在「记录/负控」面**:设计档自己写的 N9 负控**字面形态与原实现语义全等 ⇒ 恒绿**(改意图形态后才恰红)· **5 行既有断言被翻转而三处记录都没写**)· **交付代码评审 PASS**(🟡1 🔵3,**全是注释/描述层滞后、零行为缺陷**)。**★ 本批最值得记的一条(真根因)**:**原痛点「长任务超时」的主因是 `ctx.jobs` 在运行时可取不到**——证据是**显式 `background: true` 也走同步路径**;⇒ **默认翻转只有在该服务可用之后才真正生效**,而本批的 **FR-3(回落告警进工具返回)正是把这条静默失败面照亮**的那一步。**★ 过程如实登记**:实施跨 **4 次派发**、其中 **2 次以 `error` 零产出**(同根因)。 |