Repository navigation
Description
What changes, and when
rainlanguage/rainix#392 adds a
codegen witness to the rainix-copy-artifacts reusable workflow. This repo's
.github/workflows/git-clean.yaml calls that workflow at @main, so the check
arrives the moment #392 merges — not when this repo chooses to adopt it. The
next push after that merge fails until a manifest is committed.
Why the check exists
rainix-copy-artifacts currency-checks committed generated sources by re-running
the codegen hooks and then git diff --exit-code. That proves the committed
content is current, but it is structurally blind to a generator that has
stopped emitting a file: the committed copy is already correct, so nothing is
rewritten, nothing differs, and the job is green over a dead emitter. Reproduced
with a control in
rainlanguage/rain.factory.deploy#35.
Seeing that needs an independent statement of which committed files are
generated. That is script/codegen-manifest.txt: one repo-relative path per line,
# comments and blank lines ignored. The witness marks every git-tracked file's
mtime before the first hook and verifys after the last, calling a file
written when it exists and its mtime moved. Any declared path nothing wrote
fails the job by name.
Why this repo is affected
Hook present: script/Build.sol. No script/codegen-manifest.txt today.
What to add
script/codegen-manifest.txt:
src/generated/RainlangReferenceExternPointers.sol
How that was derived
script/Build.sol here is a plain Script (not BuildScript): its run() makes
one LibFs.buildFileForContract(vm, address(extern), "RainlangReferenceExternPointers", ...)
call and nothing else. That is the single file the hook writes, and it is committed
today.
A one-line manifest looks thin, and that is the point: this repo has exactly one
live emitter, so the check's whole job here is to notice if that one call ever
disappears.
Deliberately excluded
src/generated/0_1_9/{Rainlang,RainlangExpressionDeployer,RainlangInterpreter,RainlangParser,RainlangStore}.sol
— committed under src/generated/ but written by nothing in this repo.
script/Build.sol emits only the pointers file; these five are frozen release
snapshots of the deploy side, and the emitters that produce that shape live in
rain.deploy/rainlang.deploy, not here. Declaring them would fail every run.
Worth a look while you are here
script/BuildAuthoringMeta.sol exists, but rainix-copy-artifacts runs only
script/build-meta.sh / script/Build.sol / script/CopyArtifacts.sol /
script/build.sh, and this repo has neither build-meta.sh nor build.sh. So
meta/RainlangReferenceExternAuthoringMeta.rain.meta and
meta/RainlangReferenceExtern.rain.meta are committed but never regenerated in CI,
and nothing currency-checks them today. They are left out of the manifest above
(declaring them would fail every run); whether they should be brought under a
build-meta.sh hook is a separate question from this one.
Reconciling against the job
The failing verify step prints the manifest that run would justify — the set
of git-tracked files the hooks actually wrote in CI. Treat that printout as the
oracle and the list above as a cross-check derived by reading the hooks. A
difference either way is information, not noise:
- listed above, absent from the printout — that emitter may already be dead, or
the file is generated by something the copy-artifacts job does not run. - printed, absent from above — an incidental write inside the witness window
(forge buildis in there), or a generated file this reading missed.
Undeclared-but-written paths are a printed note, never a failure — the check is
a subset assertion, not set equality — so a conservative first manifest is safe and
an over-eager one is not.
Adoption
One commit adding script/codegen-manifest.txt. No workflow edit and no
RAINIX_SHA bump: #392 wires the witness as a composite action resolved at
@main, so nothing in this repo pins the check's version.
Filed while tracking the org-wide adoption cost of rainlanguage/rainix#392. The
paths above were derived by reading this repo's own hooks and committed tree, not
by running the job.
Activity
thedavidmeister commentedon Oct 21, 2026
Not planned: rainlanguage/rainix#392 was reworked. Generators now declare the paths they own and wrote on stdout, so no repo commits a
script/codegen-manifest.txtand none goes red on merge.