Skip to content

check:liveness 的 stale-evidence 检测只 ⚠ 不判红 —— ADR-0087 证据路径可以静默腐烂,且摘要行的 “N resolved” 数的是路径总数不是解析成功数 #5623

Closed

Description

@os-zhuang

发现于:#4645 Phase A(PR #5618)的反向验证,原始测量记录在该 PR body「liveness evidence 路径守卫」一节。发现者为该单 dev,按其报告转由 PM 立单(查重已做:check:liveness in:title 零命中,liveness 泛搜零命中)。

实测(objectstack,#4645 Phase A 分支)

把 packages/spec/liveness/query.json 的 5 条 evidence 路径故意改坏(指回迁移后已不存在的 packages/plugins/driver-sql/...),跑 pnpm --filter @objectstack/spec check:liveness(scripts/liveness/check-liveness.mts 的 checkEvidence):

⚠ 5 'live' entr(ies) cite a missing file:
    query/fields → packages/plugins/driver-sql/src/sql-driver.ts
    query/where → packages/plugins/driver-sql/src/sql-driver.ts
    query/orderBy → packages/plugins/driver-sql/src/sql-driver.ts
    query/limit → packages/plugins/driver-sql/src/sql-driver.ts
    query/offset → packages/plugins/driver-sql/src/sql-driver.ts
  • 逐条点名 ✅ —— 但这是 ⚠ 警告,不是 ✗,退出码两种状态下都是 0。
  • 摘要行 evidence paths: 330 resolved against this checkout 里的 330 是 local 路径总数,不是解析成功数 —— 改坏 5 条之后它仍然显示 330,"resolved" 一词失真。

影响

ADR-0087 的证据链断裂不挡任何 CI:目录重组、文件更名这类常规动作可以让 live 判定引用一个不存在的文件而无人发现 —— declared(「证据在此」)≠ enforced(无 gate 兜底)。#4645 这次是 dev 主动做反向验证才发现;下一次大概率是静默腐烂。

注意的反面(先回答再动手)

同一 reporter 里 ⚠ 与 ✗ 的分级在别处是刻意设计(发现 dev 的观察)。把 stale-evidence 升级为 ✗ 之前,需先核对该分级的原始意图 —— 若「证据路径可指向未来/跨仓」是有意的宽容,收紧要带边界(local 路径 + live 判定才判红,cross-repo attribution 的 101 条不受影响)。

处置建议

  1. live 条目引用本仓缺失文件 → ✗ 判红(cross-repo attribution 维持现状);
  2. 摘要行改为真实解析计数,或把 "resolved" 改成 "declared"。

Activity

  1. os-zhuang commented on Aug 5, 2026

    @os-zhuang
    ContributorAuthor

    发现分诊(#4949 纪律):晋级 pm:queue + domain:spec(摘 finding)。

    一行理由:门禁自身 declared ≠ enforced(⚠ 恒 exit 0,ADR-0087 证据链断裂不挡任何 CI)+ 摘要行 "N resolved" 计数失真,落点 packages/spec/scripts/liveness/check-liveness.mts 的 checkEvidence,修法与边界正文已给全(仅 local 路径 + live 判定判红,cross-repo attribution 维持现状)。接单 dev 按正文「注意的反面」先核 ⚠/✗ 分级的原始设计意图再收紧。与 #4645 Phase A(动 liveness json 的 evidence 路径)相邻但不同文件,不互斥。

    本评论来自分诊座位 Routine(#5474 试点),不构成认领。


    Generated by Claude Code

  2. os-zhuang commented on Aug 6, 2026

    @os-zhuang
    ContributorAuthor

    疑似域误标:本单落点在 check:liveness 门禁脚本(门禁类 scripts/**,C 包 #5163 文件面),建议改标 domain:spec-tooling ——交分诊座位定夺。背景:维护者 2026-08-06 拍板 spec 车道缩盘方案,见 #5837。


    Generated by Claude Code

  3. os-zhuang commented on Aug 6, 2026

    @os-zhuang
    ContributorAuthor

    标签落实(维护者 2026-08-06 指示,session_01LeEfA7CFwbJb7JJmXm2KM3):按 08-06 转席建议执行 domain:spec → domain:spec-tooling(落点 check:liveness 门禁脚本)。


    Generated by Claude Code

  4. self-assigned this
    on Aug 6, 2026
  5. os-zhuang commented on Aug 6, 2026

    @os-zhuang
    ContributorAuthor

    认领:PM 循环第 1 轮(spec-tooling 车道,座位登记 #6018)
    会话:session_014wsZeReNTqiceBfLb5Pyf5
    分支:claude/issue-5623-liveness-stale-evidence-gate
    Worktree:objectstack-issue-5623
    域:domain:spec-tooling
    文件面:packages/spec/scripts/liveness/check-liveness.mts(checkEvidence 分级 + 摘要计数)及其自测、.changeset/*.md。⛔ 不碰 packages/spec/liveness/*.json 台账数据(除非修复本身要求纠正确凿坏路径,届时逐条说明)、不碰 zod 文件。(越界即停,报告说明)

    窗口备注:#5837 分片改造在飞,本单落点不读三个热点生成物,与其申报面实质不相交(已在 #5837 15:2xZ 评论申报);若实现中发现需触 build-schemas/build-docs 或生成物布局,STOP 回报,⛔ 不硬做。


    Generated by Claude Code

  6. os-zhuang commented on Aug 6, 2026

    @os-zhuang
    ContributorAuthor

    验收:ACCEPT → PR #6057(等 CI 收敛后转 ready 入队)

    前提在 origin/main 逐条复现(5 断链点名却 exit 0;摘要 330 不动)。「注意的反面」按派发令先答后动,四证俱全(#3857 前 48/227 全误报的解析器时代、changeset 的 "both mean something again"、同族 check-empty-state 对 rotted-evidence 一贯判红、本 gate 所有有意宽容均有书面理由而这条没有)⇒ ⚠ 是遗留不是设计,收紧无需上升决策。

    实现四点核验通过:

    1. 判红边界是结构性的:checkEvidence 只解析 local 桶,foreign 桶(realm marker + service-ai 前缀,101 条)永不进 missing;测试钉了「repo-rooted 但 foreign」与「混合子句」两个最易画错线的形态。
    2. 摘要双数(declared/resolved + MISSING)而非二选一——declared 保 fix(spec): liveness stale-evidence check was ~100% false positives — and was burying a real one #3857 的解析健康度信号,resolved 承载判定;绿时相等正是旧行误读的根源。判对。
    3. --ledger-root 让判红可证明:自测 spawn 真脚本对坏副本断言 exit 1,仓库零改动;控制组防「副本读不到也 exit 1」的假阳。改前 main 上 exit 0 即变异证明。
    4. changeset 具名 patch 判对:npm pack --dry-run 实测 liveness/README.md 入包(29 文件)⇒ 非 releases-nothing,route 1 具名包;与 ci(spec): check:skill-examples 拒绝 os:check 块内的裸 any (#5943) #6049 的 skip 标签、fix(spec): docs-gen 把 retiredKey() 墓碑渲染成 never,而不是 any (#5606) #6058 的 patch 三种处置各有实测依据,不搞一刀切。

    范围备注:packages/spec/liveness/README.md +12 行超出认领申报字面,但「开始判红的门必须同步作者文档」成立(否则下一作者靠撞红才知道规则变了),采纳——申报 ⛔ 针对的是 ledger JSON 数据,未触碰。#5475 影响已实测(错误数不变、文件分母 +1、新文件 0 错);#5837 碰撞面零。

    CI:风暴期,越过引导阶段的 job 全绿(含 ESLint 家族门、双 dup-guard、Dogfood 2/3 与 3/3);TypeScript / liveness / ESLint 的最终结论落地后由 PM 转 ready + 入队。


    Generated by Claude Code

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

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions