quickchr's CI was refactored end-to-end in tikoci/quickchr#29 (2026-07). Since centrs's scheme descends from quickchr's old one, a few of the new ideas may be worth adopting here. Filed for consideration — none is urgent.
1. PR freshness gate instead of per-PR CHR smoke
quickchr PRs no longer boot any CHR. Instead a required Integration freshness check (~5s) asserts the latest completed integration run on main is green — a red main visibly blocks all PRs until fixed, and merges never wait ~20 min. Verdict logic is a small unit-tested Bun script (scripts/ci-freshness.ts: skips cancelled runs, 404 = bootstrap hint, in-flight note when main tip is ahead). Could replace or downgrade chr-smoke in centrs's ci.yaml.
2. Single cross-OS matrix job instead of per-platform job bodies
quickchr's integration.yml collapses five copy-pasted platform jobs into one plan job (platform table → matrix JSON, unknown ids fail the plan — no empty-matrix false greens) + one matrix job with per-OS conditional install/cache steps. qa.yaml's 364 lines carry a lot of bespoke YAML that could shrink the same way.
3. Per-run files on the data branch instead of rebase-retry-heavy commits
quickchr's ci-data branch takes one runs/<run_id>-<platform>.ndjson per job — filenames never collide, so the push-retry loop only matters for the small shared tested-versions.json rollup. qa-history's contention window shrinks a lot with this shape.
4. No continue-on-error anywhere ("green should be green")
TCG platforms default to a curated smoke subset that reliably completes instead of being green-washed; a red is a real red. Sweep-style broad runs live in a separate workflow file from the PR-gating signal so a flaky TCG leg can't block merges but also can't hide.
5. One-click release via workflow_dispatch
release.yml: version-bump choice + dry-run → gates (freshness green, CHANGELOG [Unreleased] non-empty) → unit-tested release-prep.ts does the bump + CHANGELOG rollover → commit/tag/GitHub Release/npm publish --provenance. No local tag pushing; CHANGELOG can't go stale because the release refuses an empty [Unreleased].
Reference implementation: https://github.com/tikoci/quickchr/tree/main/.github/workflows + .github/instructions/ci.instructions.md.
🤖 Generated with Claude Code
quickchr's CI was refactored end-to-end in tikoci/quickchr#29 (2026-07). Since centrs's scheme descends from quickchr's old one, a few of the new ideas may be worth adopting here. Filed for consideration — none is urgent.
1. PR freshness gate instead of per-PR CHR smoke
quickchr PRs no longer boot any CHR. Instead a required
Integration freshnesscheck (~5s) asserts the latest completed integration run onmainis green — a red main visibly blocks all PRs until fixed, and merges never wait ~20 min. Verdict logic is a small unit-tested Bun script (scripts/ci-freshness.ts: skips cancelled runs, 404 = bootstrap hint, in-flight note when main tip is ahead). Could replace or downgradechr-smokein centrs'sci.yaml.2. Single cross-OS matrix job instead of per-platform job bodies
quickchr's
integration.ymlcollapses five copy-pasted platform jobs into oneplanjob (platform table → matrix JSON, unknown ids fail the plan — no empty-matrix false greens) + one matrix job with per-OS conditional install/cache steps. qa.yaml's 364 lines carry a lot of bespoke YAML that could shrink the same way.3. Per-run files on the data branch instead of rebase-retry-heavy commits
quickchr's
ci-databranch takes oneruns/<run_id>-<platform>.ndjsonper job — filenames never collide, so the push-retry loop only matters for the small sharedtested-versions.jsonrollup. qa-history's contention window shrinks a lot with this shape.4. No
continue-on-erroranywhere ("green should be green")TCG platforms default to a curated smoke subset that reliably completes instead of being green-washed; a red is a real red. Sweep-style broad runs live in a separate workflow file from the PR-gating signal so a flaky TCG leg can't block merges but also can't hide.
5. One-click release via workflow_dispatch
release.yml: version-bump choice + dry-run → gates (freshness green, CHANGELOG [Unreleased] non-empty) → unit-testedrelease-prep.tsdoes the bump + CHANGELOG rollover → commit/tag/GitHub Release/npm publish --provenance. No local tag pushing; CHANGELOG can't go stale because the release refuses an empty [Unreleased].Reference implementation: https://github.com/tikoci/quickchr/tree/main/.github/workflows +
.github/instructions/ci.instructions.md.🤖 Generated with Claude Code