Skip to content

Add script/codegen-manifest.txt: git-clean goes red when rainlanguage/rainix#392 merges #589

Closed as not planned

Description

@thedavidmeister

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 build is 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

  1. thedavidmeister commented on Oct 21, 2026

    @thedavidmeister
    ContributorAuthor

    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.txt and none goes red on merge.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions