Skip to content

ci(spec): retire the generated paths filter — every artifact gate moves to the unfiltered required job - #4292

Merged
os-zhuang merged 1 commit into
mainfrom
claude/check-wrapper-red-issue-5mqj3s
Jul 31, 2026
Merged

ci(spec): retire the generated paths filter — every artifact gate moves to the unfiltered required job#4292
os-zhuang merged 1 commit into
mainfrom
claude/check-wrapper-red-issue-5mqj3s

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

Closes #4291. Refs #4255, #2584, #3855, #2978.

问题

ci.ymlgenerated paths filter 是每个门输入集合的手工副本,filter 自己的注释要求"keep the two in lockstep",但没有任何东西强制。三次漂移在案,每次都是撞上了才发现、事后补注释而非加门:

10 个门里已有 6 个逐个逃到 lint.yml 的 typecheck job,每次都留注释说明 filter 辜负了它。正确终局不是再加一本账去对第一本账,而是消除重复知识。

修改

  • 把最后 4 个门(check:skill-docscheck:spec-changescheck:upgrade-guidecheck:authorable-surface)搬进 lint.yml 的无 filter required job;
  • 删掉 check-generated job、generated filter 及其 output(ci.yml −96 行);
  • 更新所有描述"两个 job"的陈述:lint.yml 注释、check-generated.ts 头注释与 --reconcile-only 注释、AGENTS.md 的 spec 产物一节;
  • changeset:@objectstack/spec patch。

成本实测

check:docs 步骤在 CI 里 4 秒,而它 = gen:schema(跑完整 build-schemas.ts)+ build-docs.ts --check——即那个"可能很贵"的 check:authorable-surface 跑的是同一个脚本、同一个 job 已在每个 PR 上付过这笔钱。同 job:check:skill-refs 0s、check:react-blocks 1s、--reconcile-only <1s。整个 typecheck job 5 分 03 秒,其中 3 分 15 秒是 workspace build。4 个门预计加 5–8 秒(约 2%)。四者均经 tsx 读源、无需 build,故置于 workspace build 之前,与已在该 job 的门一致。

删除安全性

  • needs.filter.outputs.generated 全仓只有一个读者,即该 job 自己的 if:(已随之删除);
  • lint.yml 原注释记录该 job "It is not required, either",故不会有 required check 消失导致 PR 永久阻塞;
  • 两个 workflow 均经 YAML 解析验证;--reconcile-only 回归通过(16 check: + 10 gen: 全部有归属);解析确认 10 个 spec 门现全部集中在唯一的无 filter required job,filter 只剩 docs / core

边界

本 PR 不改任何门的判定逻辑,只改它们何时运行。风险面是 CI 编排,不是产物语义。

🤖 Generated with Claude Code

https://claude.ai/code/session_01QCrKazC5o5a77yXd7ykaZg


Generated by Claude Code

…oves to the unfiltered required job (#4291)

The filter was a hand-maintained duplicate of each gate's input set, and nothing
reconciled the two. Its own comment asked for the pair to be kept "in lockstep";
nothing enforced that, and it drifted three times on record — each found by
accident and written up in a comment rather than gated:

- #2584 moved a generated page and the filter kept watching the old path, so
  hand-edits to the generated block went unchecked for months.
- #3855 listed specific spec paths but no schema dirs, so check:authorable-surface
  went dormant on exactly the PRs that remove an authorable key.
- packages/spec/json-schema.manifest.json was never watched at all. It is the
  #2978 ratchet and the only durable record of every schema ever emitted, since
  json-schema/ is gitignored, and build-schemas.ts requires a retirement to
  delete the key from it — so a manifest-only PR skipped its own verifier.

Six of the ten gates had already escaped to lint.yml's typecheck job one at a
time, each with a comment explaining that the filter had failed them. This moves
the last four — check:skill-docs, check:spec-changes, check:upgrade-guide,
check:authorable-surface — and deletes the check-generated job, the `generated`
filter, and its output. There is no second ledger left to keep in sync: the
failure mode #4255 gated for the check:generated ledger is removed at the source
here instead.

Affordable because that job was already doing the work: check:docs runs
gen:schema — the same scripts/build-schemas.ts that backs check:authorable-surface
— and that whole step measures 4s in CI, against a 5-minute job dominated by the
workspace build (check:skill-refs 0s, check:react-blocks 1s). All four read
source via tsx and need no build, so they run before the workspace build like the
gates already there.

Safe to delete: needs.filter.outputs.generated had exactly one reader, the job's
own `if:`, and lint.yml recorded that the job "is not required, either" — so no
branch-protection check disappears. Comments in lint.yml, check-generated.ts and
AGENTS.md that described the two-job split are updated to match.

Closes #4291
Refs #4255, #2584, #3855, #2978

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QCrKazC5o5a77yXd7ykaZg
@vercel

vercel Bot commented Jul 31, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
objectstack Ignored Ignored Jul 31, 2026 3:38am

Request Review

@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

No hand-written docs reference the 0 changed package(s). ✅

@github-actions github-actions Bot added documentation Improvements or additions to documentation ci/cd tooling labels Jul 31, 2026
@os-zhuang
os-zhuang marked this pull request as ready for review July 31, 2026 03:59
@os-zhuang
os-zhuang merged commit c65e529 into main Jul 31, 2026
17 checks passed
@os-zhuang
os-zhuang deleted the claude/check-wrapper-red-issue-5mqj3s branch July 31, 2026 03:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ci/cd documentation Improvements or additions to documentation size/m tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ci.yml 的 generated paths filter 是门输入集合的手工副本、无人对账——三次漂移在案,收编剩余 4 个门后应整个删除

2 participants