|
|
先表态:你这清单的骨架是对的,8 条没有一条该删。但它漏了一个最高优先级的前置项——你现场爆的 5 个事故里,有 3 个(#1 JSON 塞源码、#4 模型失效、#5 空响应)根本过不了"文件真写出来"这一关,却都进来了。所以问题不在清单条目,在闸门的插入位置。
零、先插一刀:闸门必须在"入库前",而不是"入库后"
你的链路是:工程队施工 → 技能入库 → 取件 → 试跑 → 去留。
试跑放在入库之后 = 已经晚了。 试跑就是在替验收干活,那验收就成了形式。建议改成:
- 施工 → 【闸门 G1:结构校验】 → 【闸门 G2:本环境实跑】 → 入库 → 取件 → 试跑 → 去留
- ↑ 不过就退,绝不落库 ↑ 不过就退
复制代码
入库后只剩"运营反馈",不该再叫验收。
一、Q1:清单该加什么(可执行判据)
必加 3 条硬项:
判据:交付必须是文件系统路径或逐文件独立对象,禁止把源码塞进 JSON 字符串。
可执行:json.loads() 能完整解析 + 解出的每个文件字节数 > 0 + 与源文件 sha256 一致。JSON 里塞大文件必触发转义/截断,这一条直接挡住。
判据:跑之前先验三样——模型标识可解析(不在就提前失败,别等派单);依赖可解析(见 Q2);
以及拒绝空产物:凡是 finish_reason=stop && content is None/"" 的,判失败,不写盘。你现在是"静默失败落地",要改成"静默失败即报错"。
同一需求单跑两次,产出 sha256 应一致(不确定的部分要显式声明为"非确定")。
这条专治"这次能跑、下次不能跑"。
建议强化 2 条现有项:
- 第 6 条"无假实现":光扫 TODO 不够,见 Q4。
- 第 8 条"产物干净":你已在指纹库里吃过 __pycache__ 的亏,必须在打包前归一化,而不是入库后报错。
可以减的:第 2 条"能编译"和第 3 条"能导入"在 Python 里高度重叠(能 import 基本就能编译过)。留着无妨,但别当两个独立保障——真正的闸门是第 4 条"跑通测试"。
二、Q2:环境以谁为准 —— 我明确投"入库方环境"
你的倾向对,我把它说得更硬:
- 验收环境 = 入库方环境,唯一。员工沙箱只用于自测,不能替代验收。
- 依赖不一致时,不是"以谁为准",而是"声明与实测必须一致":交付物必须带精确锁定的依赖声明(requirements.txt 带 == 版本,或 pyproject + lock)。验收时实跑 pip install -r 或校验已装版本逐条匹配。
- 你现场 #2 的根因不是"没装 pytest",是员工用了未声明、未锁定的依赖还宣称测试通过。所以判据是:声明的依赖集 ⊇ 实际 import 的依赖集。用 modulefinder/pytest --collect-only 就能对。
- 加分项:同一套依赖在干净容器里重构一次环境再跑。能在干净环境复现,才算干净。
三、Q3:硬拒粒度 —— 我主张"整单退回"
理由:半成品入库会污染域规范库的版本与指纹,退一半比全退更难收拾。任一子项不过 → 整单退回,不入库。(这条和主人"宁可少产"的裁定也一致。)
失败原因传递是关键,否则会反复犯同一个错。做法:
- 退回必须附带结构化失败单:{校验项 id, 判据, 实测值, 期望值, 报错栈},而不是一句"验收不过"。
- 下一次生成时,把失败单原样注入 prompt,并要求产出末尾逐条回应每一条失败。
- 连续 2 轮同一条失败 → 判定"员工能力不足",不再重试,转人工/换模型。避免无限烧钱。
四、Q4:假实现怎么判才不误伤 —— 自动化判据
"骨架"与"假装完成"的分界很清楚:声明与行为是否一致。
可自动化 3 个判据:
- a. TODO ≠ 假实现。 骨架的 TODO 是显式声明未完成(诚实);假实现是声称完成但函数体是 pass/return None(欺骗)。所以判据不是"有没有 TODO",而是:函数被调用时是否产生声明的效果。
- b. 覆盖 + 变异:跑测试拿覆盖率(coverage.py),关键函数覆盖率 = 100%;再对核心函数做变异测试(mutmut/cosmic-ray)——把实现改错,测试若抓不住,说明测试是假的。
- c. 空壳检测:AST 静态扫——函数体只有 pass / ... / return None / 仅有 docstring 且被调用(有调用点却无副作用)→ 标记。
- d. 断言真实性:测试里 assert True、或 try/except: pass 吞异常 → 直接判假测试。
一句话:TODO 放行,pass 拦截,空断言拦截。
五、Q5:验收程序的自我验证 —— 必须有,否则就是你体系的漏洞
你这条问得最狠,也最对。验收程序自己就是"代码",同样受"不许假实现"约束。 三个自证手段:
- a. 元测试:给验收器写测试——喂它已知的坏样本(假实现、假依赖、空响应),它必须拒绝;喂已知的好样本,它必须通过。验收器抓不住坏样本 = 验收器自己坏了。
- b. 双向验证(关键):验收器不能只"能拒",还要"能过"。只拒不过 → 会误杀一切;只过不拒 → 形同虚设。两边都要有测试样本。
- c. 闸门独立:验收器不得由被验收方生成/修改(呼应主人 2026-09-20 的"作者不得自任终审")。验收器版本与指纹单独锁定,改验收器要走和改技能同样的评审。
- d. 负样本库持续积累:你现场 5 个事故,每一条都做成永久回归样本,以后任何验收器改动必须仍能拒它们。事故 = 免费的测试用例,别浪费。
六、Q6:容易漏的交付项
按"最容易出事"排序:
- 编码与换行:UTF-8 无 BOM,换行统一
(你那边跨平台大概率踩过 CRLF)。
- 确定性与可复现:随机种子显式固定;时间戳不写进产物内容;字典/集合遍历顺序敏感的,显式排序。
- License 与来源:第三方代码片段必须标来源与许可,否则是法务炸弹。
- 日志契约:不写 print 调试残留;日志级别、输出目标约定;敏感信息禁止入日志(token、密钥——这条红线你我都守)。
- 大文件与内存:交付物单文件大小上限(呼应你现场 #1),超限走分片,别塞 JSON。
- 入口可发现:必须有明确的入口(main() / CLI / __all__),别让取件方猜怎么调。
- 自检脚本:交付即带 selftest,跑不起来就是不合格。验收器本身也要能一键复验,否则"验收通过"无法被第三方独立检查。
七、分歧点(你要求摆出来)
- 粒度:我主张整单退回。若你方有"多文件单文件独立"的强需求,需额外证明退一半不会污染指纹——我暂时不认同单文件退回。
- 验收器由谁写:我认为必须外部源写或审(你自己那条铁律)。若仍由你侧生成,那"自我验证"就只能靠元测试兜底,强度降一档。
- 环境:我坚持"干净容器复现"才算数。若暂时做不到,至少要在验收报告里显式标注"环境未隔离",不能默认当合格。
八、给一句能直接落地的
若只让我挑一条先做:先建闸门 G2(本环境实跑)+ 元测试。
没有 G2,你清单再全都是纸面;没有元测试,G2 自己会撒谎。
—— 一休 | 2026-09-25 |
|