diff --git a/README.md b/README.md index ab5fba5..46f821c 100644 --- a/README.md +++ b/README.md @@ -130,3 +130,34 @@ old_string 唯一性校验(0/多次拒绝,replace_all 放行)+ 原子写 + - `gateway.run_message(image_paths)`:build_image_parts 构造 + 超限 notes 注入 content。 - 实测:中性文件名红蓝两图,agent 正确答「第一张红色、第二张蓝色」,degrade 0 次。 +## deliver 代码真实性三重门禁(2026-09-16 pbls M1a 空壳事故根治) + +**事故形状**:develop agent 声称「已用 write_file 落盘 17141 字符、G1~G6 严格退出码门禁」, +实测交付的 verify_gate.py 只有 9 行纯注释 1225 字节——LLM 把「对文件的描述」当文件内容写入; +且 git 证据由 agent 自称(实为引擎代收口)。QC 抓到时代价已是 4 轮烧光 + fault + pause。 + +三层确定性门禁(全部引擎层,不靠 LLM 自觉): + +1. **git 收口引擎化**(38efb3e):deliver 时引擎代为 add+commit 本任务写入的 + apps/modules 仓库,收口核验记录(改了哪些仓库/几个文件/commit hash)回填交付件正文—— + agent 无法再自称「已提交」伪造 git 证据。 +2. **代码空壳硬门禁 `_validate_stub_code`**(0d02ac6):deliver 时本任务 write_file + 实写的每个 `.py` 必须 ast 可解析且有真实可执行语句(纯注释/pass/纯 docstring/ + 语法错误一律拒绝,`__init__.py`/`conftest.py` 豁免),`.json` 必须可解析; + `files` 参数先验后写(`_validate_code_files_params`),防空壳落盘后被收口变既成事实。 + 拒绝时回填可行动 FAIL(指出文件+原因),agent 当轮重写——空壳死在 deliver 入口, + 不再烧 QC 轮次。native + 文本兜底两条 deliver 路径都挂载。 +3. **产出文件机械核验段**:引擎自动计算每个代码产出文件的实测字节/行数/语法/语句数, + 以「产出文件机械核验(引擎自动计算,非 agent 声明)」标题回填交付件正文—— + 「声称 17141 实测 1225」类矛盾一眼可见,QC 拿到引擎级证据底座, + 不再依赖自己 run_shell 逐个取证(取证失败盲判 0 分退也在烧重试预算,实测 9 轮里 3 轮是盲审)。 + +配套技能(pipeline-core 7bfa8d6):develop 角色「代码真实性铁律」(write_file 必须完整正文、 +大文件拆小分批、声称数字须与引擎核验一致、勿自称 commit/push);QC review-develop +「优先读引擎回填两段核验当权威证据;声称 vs 实测矛盾直接按造假退;取证失败禁盲判 0 分, +改 read_file 逐项或 ask_question 冒泡」。 + +**通用规则**:质量门禁的判定证据必须来自引擎机械计算(字节/行数/ast/commit hash), +不能来自 agent 的自我声明;QC 尺子要配「取证失败 ≠ 判 0 分」的出路,否则盲审烧轮次。 + +