A pre-merge CI job that builds and validates
SPEC-135 D4 makes refrakt validate the pre-merge gate rather than the build. This item is the gate.
SPEC-135 D4 makes refrakt validate the pre-merge gate rather than the build. This item is the gate.
Tracking started Sep 18 — check back for trends.
2fd77d8format.yml runs on pull_request: and establishes it: checkout → actions/setup-node@v4 (node 24) → npm ci → one check command. This job follows it with one addition — npm run build.
format.yml escapes it only because Biome reads source.fixture-corpus.test.ts imports ../src/index.js, so it needs no build within one package. Validating site content needs the assembled tag set across runes, nine plugins and content, which resolves through node_modules to dist.release.yml confirms the ordering: npm ci → npm run build → npm test.Nothing builds the monorepo on a PR today. The first build happens on push to main, inside the release job — so a type error merges clean and breaks the release. This job gates validation and that, which is most of its justification.
The cost is ours, not users': in a consumer project the CLI is installed from npm and starts instantly. The monorepo's build time must not be allowed to shape the command's design.
pull_request: and on push to main, mirroring format.yml's triggers and concurrency groupnpm ci → npm run build → refrakt validate --format jsonrefrakt plan validate, so the repository's own workflow documents the pairing SPEC-135 D11 declines to build into the CLInpm ci uses setup-node's cache; build output caching is added only if the job turns out slow enough to warrant itpaths: filter — a rune schema change can invalidate content anywhere, so the filter would have to include packages/**Copy format.yml, add the build step, swap the check command. The only real decision is whether this is a new validate.yml beside it or whether both fold into a ci.yml with two jobs.
Prefer a separate file unless folding is trivially clean: format.yml is cheap and fast, and keeping it independent means a formatting failure still reports in seconds rather than behind a build.
This is also where WORK-582's duplicate-ID check earns its keep: plan validate --against origin/main catches a colliding ID while resolution is still unambiguous, which is only useful if something runs it pre-merge.
.github/workflows/format.yml — the shape to copy.github/workflows/release.yml — the npm ci → build → test ordering