Skip to content

IR-0006 独立实证:evidence-query metering 源 KeyError(AC-4 未满足)+ test-feedback-edge.sh 稳定红(W6-M2 自测被 CI 掩盖) #471

Description

@randypanding

摘要

对 IR-0006(#402,state:done)做独立实证验收(不看 acceptance.md 结论、以实际代码与运行结果为准)时,发现 2 个真实未收口问题:① evidence-query.sh 的 metering 源存在确定性 KeyError bug,导致 AC-4「三源统一查询」的 metering 源永远取不到已有数据;② governance/tests/test-feedback-edge.sh 稳定红(2 项断言失败),且 gate CI 因 for 循环退出码语义将其失败掩盖。其余 8 项 AC 均以代码+运行实证通过。

问题 1:evidence-query.sh 的 metering 源拉取 KeyError(AC-4 未完整满足)

  • 位置:governance/evidence-query.sh 第 66-75 行(引入自 feat: butler/drill 影子双写 + 三源统一查询(W1-B2 后半,IR-0006) #430,W1-B2 三源对齐)
  • 现象:bash governance/evidence-query.sh --json 退出 0,但 stderr 报 KeyError: 'content',输出统一 JSONL 中 metering=0 条
  • 根因:对 repos/Cloudbird-Software/CI-Workflows/contents?ref=metering-ledger目录列表拉取,GitHub 目录列表条目不含 content 字段,但代码对匹配 shadow-evidence-*.jsonl 的条目执行 base64.b64decode(ent["content"]) → 必然 KeyError。即便 metering-ledger 分支根目录真实存在 shadow-evidence-2026-W35.jsonl(1 条含 tenant 的记录),也永远取不到。
  • 复现:
    curl -s -H "Authorization: token $GH_TOKEN" "https://api.github.com/repos/Cloudbird-Software/CI-Workflows/contents?ref=metering-ledger" | python3 -c '
    import base64,json,sys
    for ent in json.load(sys.stdin):
        if ent["type"]=="file" and ent["name"].startswith("shadow-evidence-"):
            base64.b64decode(ent["content"])   # KeyError: "content"
    '
    
  • 影响:AC-4「三源新事件可按同一 schema 查询」只对 drill(1 条)成立;metering 有数据但查询不到。同时 butler 源=0.github 仓无 butler-ledger 分支,governance/butler/shadow-evidence.jsonl 404;butler-reconcile 近期 run #33274629909/#33263640232 均在 checkout 步失败,未落过影子)。「七源一条命令」实为 5 源有数据。
  • 建议修复:目录列表条目改经 download_url/逐文件 contents/<path>?ref= 拉取正文,或改用 git tree 递归取 blob sha 再 git blob 取内容。

问题 2:test-feedback-edge.sh 稳定红(W6-M2 #424 自测失败且被 CI 掩盖)

  • 位置:governance/tests/test-feedback-edge.shfeat: R3→R1 反馈边骨架——运行信号自动生成候选 spec 入 backlog(IR-0006 W6-M2) #462 引入,W6-M2 反馈边)
  • 现象:bash governance/tests/test-feedback-edge.sh 退出 1,稳定 2 项断言 FAIL:pending 字串误判用量越阈漏检(多次重跑稳定复现)。
  • 根因:测试脚本第 3 行 set -uo pipefail + 对 python3 feedback-edge.py ... | grep -q "..." 的用法。grep -q 命中后立即关闭读端,上游 feedback-edge.py 后续仍大量输出(CANDIDATE 正文等)触发 SIGPIPE,进程非零退出;pipefail 使整条管道退出码非零 → 断言误报 FAIL。feature 本身输出正确(tee 留存流含 PENDING needs-human-p90-stopSIGNAL per-ir-cost value=80.5 gt 60.0,对文件 grep 均匹配;去掉 pipefail 后管道判定 PASS)。
  • 掩盖机制:gate.yml「治理脚本自测」步骤用 for t in ...; do bash "$t"; done 且未 set -e,退出码=最后一个测试(test-wave-schema.sh 绿)→ 该步整体 success,test-feedback-edge 的红被吞掉。gate CI 显示绿是假象。
  • 建议修复:① 测试内管道改 ... | tee file | grep -q 前先落文件再 grep,或 grep -q -m1 前加 SIGPIPE 容错、或去掉 pipefail 对管道的误伤(如 set +o pipefail 包裹);② gate 步骤加 set -e / 逐测试判定,让任何单测红都使 gate 红。

已实证通过的部分(供对照,非本 issue 范围)

  • AC-1:absorption-map.md 18 行落位表+词汇归并;spec PR spec: IR-0006 治理总纲吸收——三面分离/证据账本统一/云内网入图(ADR-0103) #403 merged;IR-0006: 治理战略总纲吸收——三面分离治理架构、证据账本统一与云内网入图(六波次总图) #402 带 adversary:survived
  • AC-2:archive/adr/ADR-0103 + INDEX.yaml 条目 103(content_sha256 与正本一致);宪法 §5 逐字未动
  • AC-3:evidence/ledger.jsonl 3 条链完整,verify_evidence.py 复算 OK(链尾 841c63dcaab5);payload>4KB 拒写、缺 tenant 拒写、篡改记录复算必红(均实测)
  • AC-5:providers.yaml self-cloud-pool/vault;env-defs 仓 environments/dev-self.yaml 等;REPOS.yaml 申报
  • AC-6:scripts/gh-app-token.sh(单仓 1h TTL);elevation-ledger 含 TTL 到期 revoke 记录
  • AC-7:feishu-sync.py label 真源+drop&rebuild+漂移告警;feishu-ledger 10 条影子
  • AC-8:env-drift.py+env-drift.yml;sli-weekly.yml;docs/slo-boundary.md(SLO/值班/破线/break-glass)
  • AC-9:card.yml budget/capabilities/evidence;wave_schema.py;cost-check.sh 波次预算通道;test-cost-wave-channel 绿
  • AC-10:eval-gate.py 非劣性 15/15 绿;waves.yaml W5-OPT-1;holdout entries/HO-0008.json 四元组 pin;decisions/ledger.jsonl 链验证 OK
  • IR-0006 spec suite:run-suite.sh 14/14 绿

结论

IR-0006 意图主体已开发完成且大部分可实证通过,但 AC-4 的 metering 源查询、W6-M2 的自测两处未收口,与 acceptance.md「十条全绿」的表述不符。建议修复后重跑 evidence-query.sh(metering 应有记录)与 test-feedback-edge.sh(应全绿),并让 gate 对单测失败真正 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

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions