Skip to content

check:generated 的双向对账从不在 CI 上执行——#4203 关闭次日即被 #4232 原样复现,main 的本地 wrapper 又红了 #4255

Description

@os-zhuang

#4203 修的是症状(check:variant-docs 缺分类),没修机制。机制性缺口是:台账的双向对账只在聚合入口 check:generated 里跑,而 CI 从不跑聚合入口——ci.ymlcheck-generated job 逐个跑单门。于是"新增 check:/gen: 脚本而不改 check-generated.ts"这一形态的 PR 永远 CI 全绿、落地后 main 上的本地 wrapper 立刻红(对账阶段退出,一个门都不跑)。

已复现第二次。 #4232(19365b7,昨天)新增 check:strictness-ledger,未分类。此刻在 main 上:

✗ check:generated ledger is out of sync with package.json:

  `check:strictness-ledger` exists in package.json but is in neither GATED nor NO_GENERATOR.
    Classify it: does it compare a checked-in artifact against a generator, or audit source?

即 AGENTS.md 要求每个 spec 改动者本地必跑的入口,在 #4203 关闭约一天后再次在 main 上不可用。上次是靠 #4194 恰好也要加脚本、撞上同一堵墙才顺手修掉的——没有门,靠运气。

为什么把对账加进 ci.ymlcheck-generated job 是无效的:该 job 由 generated paths filter 门控,filter 的 15 条路径里没有 packages/spec/package.json——而这恰是每个此形态 PR 必改的文件。实测 #4177#4232 的改动面(changeset + spec-liveness-check.yml + package.json + 脚本 + 文档)对 filter 一条都不命中,两个肇事 PR 都整体跳过了这个 job。

修法(与 check:docs/check:skill-refs/check:react-blocks 的既有先例同构——"unfiltered required job 里放不能休眠的门"):

  1. check-generated.ts--reconcile-only 模式:只跑 reconcileLedger 即退出,不跑 8 个门。只读 package.json 与脚本内数组,无需 build,亚秒级。
  2. lint.yml 的 required "TypeScript Type Check" job 加一步 pnpm --filter @objectstack/spec check:generated --reconcile-only
  3. 顺手把 feat(spec): 让 #4001 严格性账本接受机器校验(首次运行抓到 11 处漂移) #4232check:strictness-ledger 分类进 NO_GENERATOR(它审计手写的 strictness ledger 文档,无 generator 可登记),让 main 的 wrapper 恢复绿。

对账是双向的,此门同时覆盖另一侧:删除/重命名脚本但台账仍点名 → 同样在 PR 上红,而不是留下悬空引用。

Refs #4203, #4177, #4183, #4194, #4232

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions