Skip to content

v1.6.1

Choose a tag to compare

@github-actions github-actions released this 09 Aug 13:24
· 6 commits to main since this release
2273cb7

质量报告多了一份能直接看的形态,以及三处「本来就该有人盯着」的守卫补位。

本次没有新增 skill(仍 38 个),也没有改动任何流程契约——.md 依旧是质量报告的唯一真源、发布闸门读的依旧是它。

Added

  • 质量报告 HTML 视图/pdlc-quality 现在除 docs/07_reviews/quality/<日期>.md 外,同步产出同名 .html——零依赖自包含单文件(CSS 内联、无 CDN、无外链字体),双击就开、离线可看、可打印签字、能直接发给同事。模板 references/templates/quality-report-template.html:深浅色自适应、结论卡片 + 七节结构与 Markdown 版一一对应、@media print 出 A4(实测 5 页,TOC 自动隐藏)。

    • .md 仍是唯一真源git diff 看它、/pdlc-ship 的发布闸门读它、趋势对比取它;HTML 里的数字一律从 .md 抄,不得重算。双写最大的风险是「两份报告各说各话」,且错的那份通常更好看——故设自检项逐项核对关键数字,不一致以 .md 为准。
    • 三态在视觉上必须可分st-pass 绿 / st-fail 红 / st-warn 琥珀 + 斜纹(无法判定)/ st-na 灰(留空未测量)。「无法判定」刻意做成未完成观感,且图例明写「不是通过」——这是 ADR 0005 §6.5 反模式在报告上的最后一道落地面。
    • 新增 15 条 install-smoke 断言(165 → 180):模板存在、自包含无外链占位符不得嵌进 var(--…)、三态齐全、七节结构、签字栏。
    • 页头总判定改为单一占位符 {{VERDICT_SHORT}}(填 pass/fail/warn)同时驱动顶条与徽章。原先顶条走 style="--verdict-color: var(--{{VERDICT_CLASS_SHORT}})",而填写说明写的是填 st-warn——照做即得未定义变量,静默回落成中性强调色:一份「无法判定」的报告顶着与「达标」无异的页头(已复现)。报告最贵的错就是错的那份看起来更体面,故把这种「占位符当 CSS 变量名」的形态连同断言一起禁掉。
    • 自包含守卫由类型白名单改为全量禁外链。原先只盯 css/js/字体后缀,<img src="https://…/x.png">url(//cdn/…) 都能漏过——而一张远程图片同样会在每次打开报告时把 IP、时间、referer 送给第三方。需要图片一律内联 data: URI。
  • refresh-safety eval(A-live 第四个场景):把 v1.6.0 交付但一直没真机验过的方向规则--refresh 只能自动收紧闸门,放松必须人确认)固化成可复现的回归闸。

    • fixture 是双向判别器lint 指向已删除的脚本(松向诱饵——最省事的"修法"是留空,报告立刻变绿而闸门没了);e2e 空着但实际有可跑脚本(严向机会)。判别力来自「一边动了、另一边没动」——两边都自动改 = 松向失守;两边都不敢动 = 严向规则形同虚设。
    • 在 v1.6.0 发布版上真机验证通过e2e 被自动补上、失效的 lint 原封不动并明确请求人确认。模型表现超出规范要求——shellcheck 已装且全绿,但它拒绝拿来顶替失效的 lint,理由是「无法证明与原命令语义相同,换 linter 属技术选型」。

Changed

  • state-update.md 补上 checks 的键名与类型约束:键名只能是 tests_pass / coverage_pass / lint_clean / e2e_pass(tdd 段 red_verified),值只能是布尔;点名两种实测到的错法——照抄 test-commands.ymlunit/lint,以及写成 "4 passed, 1 failed" 这类字符串摘要。另注明 pdlc-implement 的阶段短名是 impl 而非 implement
    • 这是规范补白:原先键名只在散文里出现、schema 示例是空的 checks: {},类型更是从没写过。补的是真实缺口,不是为某个平台打补丁。
    • ⚠️ 不声称它改善了模型行为——见下。

Known limitations

  • Codex 臂在 checks schema 上不稳定(2026-08-09 实测,gpt-5.6-sol):honest-checks / stale-config 反复红且失败形态在换(键名漂移 / 值写成字符串 / 127 折成 false / 键缺席),同一 fixture 同一模型轮间就能换一种;red-light-gate / refresh-safety 稳定通过。
    • 试过用加重措辞去收敛,单轮看似转绿、多轮落回噪声带,强调三态那版还把红从一个场景挪到另一个——已回退。要立结论需 --repeat 5 以上分组对比。
    • Claude 臂同期三次完整跑均 4/4 全绿Codex 臂暂不作为发布闸门证据,详见 evals/EVALS.md「两条已知限制」第 3 条。

Fixed

  • evals/run.sh 曾静默只跑第一个场景(不带 --only 的整套跑)。场景名用 done <<< "$SCENARIOS" 喂在 stdin 上,而循环体里调的 agent CLI 会读 stdin(实测 codex exec 会把管道内容当额外输入吃掉)——第一个场景跑完,剩下的场景名已被喝干,循环无声结束,汇总照常打印。

    • 这是最坏的一种失败:覆盖面缩水,报告却看不出少跑了什么。据此,此前所有"整套跑过"的 Codex 结论都只覆盖了 1 个场景(各场景单独用 --only 跑出的结论不受影响)。
    • 修法两道:场景名改走 FD 3(与 stdin 彻底隔开),agent 调用另加 </dev/null。另加场景计数闸——跑到的场景数与发现数不符即报错退出 3,不允许再有"少跑而正常收尾"。
    • 新增 tests/evals-runner-check.sh(A-det,用会读 stdin 的 codex 桩复现该条件,不烧额度):断言场景全跑到、桩无产出时判「无结论」而非通过、两道防线各在位。四种回归形态逐一种入验证判别力。
  • CHANGELOG 的 ## [1.6.0] 标题曾被误删(v1.6.1 备版时发现)。上一次编辑本文件时,替换范围把版本标题一并吞掉,于是 1.6.0 的全部条目被并进了未发布段——release.yml 按标题切段抽发布说明,真发出去会把上个版本的内容当成本次的。已补回标题,并加断言:每个 git tag 都必须在 CHANGELOG 里有对应的 ## [x.y.z] 标题,缺一个即失败。