Skip to content

IR-0006 GAP: 证据账本独立 verify_evidence.py 与月度 checkpoint 脚本不在仓 #469

Description

@randypanding

背景(独立验收发现)

IR-0006 AC-3 与 BEH-02 明确要求两项独立可执行的机器锚点:

  1. 独立验证脚本(AC-3 then 段):

    hash 链头与月度 checkpoint 可由独立脚本复算验证(链断=红);
    运行时证据 = checkpoint 验证 run 的 JSONL 日志。

    IR-0006 验收报告 specs/IR-0006/acceptance.md 第 3 条回探行明确写了:

    本轮实测scripts/verify_evidence.py 独立复算 OK(3 条链完整 + checkpoint×1 对账一致)。

  2. 月度 checkpoint 执行(BEH-02):

    每月末对判定层做 checkpoint(链头 hash+当月汇总)提交 git;
    独立验证脚本可从任意旧 blob 复算整链。

实际代码证据(本轮独立核对)

GAP 2A:scripts/verify_evidence.py 根本不存在

Glob **/*verify*evidence* → 0 结果

仓库侧实际存在的验链入口只有:

文件 作用域 能否独立从 archive 仓远端证据账本复算?
governance/evidence_shadow.py verify 本仓 .github/ 本地影子文件的 append/verify/relink ❌ 只吃本地 JSONL 文件路径,无远端 archive 证据目录拉取逻辑
governance/evidence-query.sh 7 源统一查询 + 逐源验链 ⚠️ 验链但只输出查询结果,不产出 checkpoint JSONL,也不对比 checkpoints/YYYY-MM.json 链头
standards/evidence/README.md 文档描述 checkpoint 格式 ❌ 不可执行

验收报告提到的 scripts/verify_evidence.py 名称与「archive evidence/ledger.jsonl → checkpoints/2026-08.json」对账断言在本仓找不到可执行对应物。如果脚本实际位于 archive 仓 scripts/ 目录而不是 .github 仓,那:

  • 应该在 specs/IR-0006/spec.md AC-3 的 blastRadius 或 IFACE-01 行显式标注"脚本居 archive 仓 scripts/"——但没有;
  • 独立验收者按 acceptance.md 给出的相对路径在本仓跑会失败(本轮复现就是如此)。

GAP 2B:checkpoint 生成 / 调度脚本缺失

Glob **/*checkpoint* → 0 结果
  • governance/ 脚本目录下没有 checkpoint.sh / checkpoint.py / 任何以 checkpoint 命名的文件。
  • .github/workflows/ 16 个 yaml 逐一过:butler-ledger.ymlgovernance-drift.ymlbutler-reconcile.yml 等——没有任何 workflow 声明「每月末(或任一月度 cadence)对 archive evidence/ 生成 checkpoint 并提交 git」
  • standards/evidence/README.md L53-54 只描述了产物形态 evidence/checkpoints/YYYY-MM.json 和校验要求,但:
    • 没有生成脚本;
    • 没有调度 cron;
    • 没有「checkpoint 缺失 = 红」的 fail-closed 门禁。

佐证:PyYAML 依赖(非 bug,备注)

先前 wave_schema.py / elevation.py 本地沙箱报错"budget 块须为 YAML 映射""缺 PyYAML",根因为沙箱环境没装依赖。安装 PyYAML 后:

  • test-wave-schema.sh 15/15 PASS(包括 budget/capabilities 解析、hard-stop超限 exit 4)
  • test-elevation.sh 17/17 PASS(HO 场景 3 缺 reason/spec 必拒、grant 正向、sweep/open-check AC-9d)
  • test-evidence-shadow.sh 28/28 PASS
  • .github/requirements-gate.txt 已 pin pyyaml==6.0.3 --hash=...,CI 侧 gate 环境正确装包。PyYAML 不是 GAP,排除在本 issue 外。

影响面

  1. AC-3 T-15 回探证据不可复现:独立验收者按 acceptance.md 指引运行 scripts/verify_evidence.py → 文件不存在。治理仓"可回放"承诺受损。
  2. BEH-02 月度节奏无机器守卫:没脚本没 cron,checkpoint 靠人工或靠别的仓;一旦人忘记,账本的月度 hash 锚点断档——篡改历史的检测窗口从"1 个月"拉长到"下次有人手工跑"。
  3. fail-closed 边界不闭合:即使未来补 checkpoint,如果没 CI 工作流断言"新 checkpoint 必须在上月 1 号 + N 天窗口内出现",缺失也不会红。

建议交付

2A — 独立验证脚本(建议居 .githubscripts/verify_evidence.py,或验收报告显式改路径)

选型二选一,但必须有其一

  • (A) 在本仓新增 scripts/verify_evidence.py,支持 --repo Cloudbird-Software/archive --branch main --dir evidence/ --checkpoint checkpoints/2026-08.json,输出 JSONL 日志记录每条链的验证结果,链断=exit 3。
  • (B) 若脚本实际居 archive 仓,补齐本仓两处引用导航:specs/IR-0006/spec.md blastRadiusarchive: scripts/verify_evidence.pyacceptance.md 回探 3 改为 archive/scripts/verify_evidence.py,并在 docs/NAVIGATION.md 登记(防 test-navigation.sh 断链红)。

2B — checkpoint 生成 + 调度

  • 新增 governance/evidence-checkpoint.sh(或同名 py):拉取 archive evidence/ 月末最新链头 + 月聚合行数/字节数,写 checkpoints/YYYY-MM.json
  • 新增 .github/workflows/evidence-checkpoint.ymlschedule: cron: "33 7 1 * *"(每月 1 号 UTC 07:33)调用脚本,以 cloudbrid-agent 身份向 archive 仓开 PR(或直接提,如果工作流 token 有 archive 写权 via dispatch)。
  • 在 gate.yml(或红队路径)加一个最小断言:checkpoint 缺失超过 40 天=红(防止月度跑飞)。

关联意图

  • IR-0006 AC-3(独立脚本 + checkpoint)/ BEH-02(月度节奏)
  • ADR-0062 hash 链平移(链断=红的 fail-closed)

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions