The README restates how rainix's reusable workflows behave, in four places. Each
is a second copy of a fact rainix owns, and a copy that drifts independently of
the thing it describes.
This is filed as a property, not a list of four edits: the README documents
this package's own facts and choices; it does not restate the behaviour of the
third-party systems it uses. The four below are the instances that exist
today, not the boundary of the rule. A fifth added tomorrow is the same defect.
Precedent, same rule applied elsewhere in the org: shared CI lives in rainix's
reusables rather than being re-implemented per consumer; the mutation-scan
ledger format lives in the skill that writes it
(rainlanguage/adversarial-mutation-test#25) rather
than in each repo holding a ledger. PR #117 and issue #82 were closed under this
same rule for soldeer's install semantics — how soldeer resolves dependencies,
what remappings it writes and how a missing prefix fails are soldeer's to
document, identical for every package it serves.
The instances
1. README.md:14-18 — "rainix's rainix-copy-artifacts.yaml reusable
regenerates from script/Build.sol exactly, and hard-fails any repo that
commits src/generated/ without one."
2. README.md:38-42 — "rainix-copy-artifacts regenerates, runs
forge fmt, then git diff --exit-code, so that reflow is committed as the new
baseline instead of being reported." A step-by-step of the reusable's internals.
3. README.md:76-80 — the acute one. It enumerates rainix-sol.yaml's
fan-out and names six specific gates out of rainix-sol-static.yaml: no ignored
tests, no git submodules, an agent context cap, append-only frozen snapshots, no
custom NatSpec, one contract per .sol file. That is a transcription of another
repo's workflow file, and it is wrong the day rainix adds a seventh, drops one,
or renames one. (Landed by PR #120, which was correct against rainix at the time
— the problem is structural, not a defect in that PR's accuracy.)
4. README.md:86-94 — the Publish section's account of what
rainix-autopublish.yaml does: pushes the version to Soldeer, tags
sol-v<x.y.z>, bumps [package].version.
This is already biting
rainlanguage/rainix HEAD 7f223b4: rainix-copy-artifacts.yaml runs
forge script ./script/Build.sol exactly once, inside a plain
if [ -f ... ] guard. There is no loop, no max-codegen-passes input (0 hits
for the string across the whole rainix repo), no default of 5 and no
did not reach a fixed point failure — the only failure it can emit is
Committed artifacts are stale. rainlanguage/rainix#319, which would add the
bound, is still open.
Open PR #136 documents that bound in this README as though it exists. It is not
a careless PR; it is what this pattern produces. A README that narrates another
repo's CI will eventually narrate a version of it that is not deployed, and
nothing in this repo's CI can catch it — there is no check that any sentence
here still matches rainix.
What is genuinely this repo's, and must survive
Do not strip these while cutting. Each is a fact about this package or a
consequence a consumer must act on:
- Consumers need
line_length = 120 and tab_width = 4, because LibCodeGen
wraps against MAX_LINE_LENGTH / NEWLINE_DUE_TO_MAX_LENGTH and this repo
states those in [fmt] rather than inheriting them. The requirement is
this repo's; the account of how rainix-copy-artifacts enforces it is not.
- A consumer's build script must live at
script/Build.sol. The constraint on
the consumer is worth stating; the description of what the reusable does with
it is not.
[package].version in foundry.toml is the next, unpublished version
rather than the last published one, and neither version nor tag is set by
hand. That is surprising, it is about this repo's foundry.toml, and a reader
editing that file needs it.
- This repo passes
soldeer-package: rain-sol-codegen explicitly.
- The four local checks (
forge test, forge fmt --check, slither .,
reuse lint) and that CI also runs them.
src/generated/ and meta/ are test scratch here, created on demand and
committed empty-handed.
Proposed fix
For each instance, keep the consequence and drop the mechanism, linking to the
workflow that owns it rather than transcribing it. A reader who needs rainix's
internals should be sent to rainix, in one link, once.
Concretely for instance 3, something of the shape: rainix.yaml runs the four
checks above in CI via rainix's rainix-sol.yaml, and adds org-wide gates with
no local equivalent — see
rainix-sol-static.yaml
— so a green local run is necessary but not sufficient. The reader gets the
actionable fact (local green is not enough) and the authoritative source, and
the six-item list stops being this repo's to maintain.
The same treatment for 1, 2 and 4: state the requirement or the consequence,
link the workflow, delete the narration.
Related
The README restates how rainix's reusable workflows behave, in four places. Each
is a second copy of a fact rainix owns, and a copy that drifts independently of
the thing it describes.
This is filed as a property, not a list of four edits: the README documents
this package's own facts and choices; it does not restate the behaviour of the
third-party systems it uses. The four below are the instances that exist
today, not the boundary of the rule. A fifth added tomorrow is the same defect.
Precedent, same rule applied elsewhere in the org: shared CI lives in rainix's
reusables rather than being re-implemented per consumer; the mutation-scan
ledger format lives in the skill that writes it
(rainlanguage/adversarial-mutation-test#25) rather
than in each repo holding a ledger. PR #117 and issue #82 were closed under this
same rule for soldeer's install semantics — how soldeer resolves dependencies,
what remappings it writes and how a missing prefix fails are soldeer's to
document, identical for every package it serves.
The instances
1.
README.md:14-18— "rainix'srainix-copy-artifacts.yamlreusableregenerates from
script/Build.solexactly, and hard-fails any repo thatcommits
src/generated/without one."2.
README.md:38-42— "rainix-copy-artifactsregenerates, runsforge fmt, thengit diff --exit-code, so that reflow is committed as the newbaseline instead of being reported." A step-by-step of the reusable's internals.
3.
README.md:76-80— the acute one. It enumeratesrainix-sol.yaml'sfan-out and names six specific gates out of
rainix-sol-static.yaml: no ignoredtests, no git submodules, an agent context cap, append-only frozen snapshots, no
custom NatSpec, one contract per
.solfile. That is a transcription of anotherrepo's workflow file, and it is wrong the day rainix adds a seventh, drops one,
or renames one. (Landed by PR #120, which was correct against rainix at the time
— the problem is structural, not a defect in that PR's accuracy.)
4.
README.md:86-94— the Publish section's account of whatrainix-autopublish.yamldoes: pushes the version to Soldeer, tagssol-v<x.y.z>, bumps[package].version.This is already biting
rainlanguage/rainixHEAD7f223b4:rainix-copy-artifacts.yamlrunsforge script ./script/Build.solexactly once, inside a plainif [ -f ... ]guard. There is no loop, nomax-codegen-passesinput (0 hitsfor the string across the whole rainix repo), no default of 5 and no
did not reach a fixed pointfailure — the only failure it can emit isCommitted artifacts are stale.rainlanguage/rainix#319, which would add thebound, is still open.
Open PR #136 documents that bound in this README as though it exists. It is not
a careless PR; it is what this pattern produces. A README that narrates another
repo's CI will eventually narrate a version of it that is not deployed, and
nothing in this repo's CI can catch it — there is no check that any sentence
here still matches rainix.
What is genuinely this repo's, and must survive
Do not strip these while cutting. Each is a fact about this package or a
consequence a consumer must act on:
line_length = 120andtab_width = 4, becauseLibCodeGenwraps against
MAX_LINE_LENGTH/NEWLINE_DUE_TO_MAX_LENGTHand this repostates those in
[fmt]rather than inheriting them. The requirement isthis repo's; the account of how
rainix-copy-artifactsenforces it is not.script/Build.sol. The constraint onthe consumer is worth stating; the description of what the reusable does with
it is not.
[package].versioninfoundry.tomlis the next, unpublished versionrather than the last published one, and neither version nor tag is set by
hand. That is surprising, it is about this repo's
foundry.toml, and a readerediting that file needs it.
soldeer-package: rain-sol-codegenexplicitly.forge test,forge fmt --check,slither .,reuse lint) and that CI also runs them.src/generated/andmeta/are test scratch here, created on demand andcommitted empty-handed.
Proposed fix
For each instance, keep the consequence and drop the mechanism, linking to the
workflow that owns it rather than transcribing it. A reader who needs rainix's
internals should be sent to rainix, in one link, once.
Concretely for instance 3, something of the shape:
rainix.yamlruns the fourchecks above in CI via rainix's
rainix-sol.yaml, and adds org-wide gates withno local equivalent — see
rainix-sol-static.yaml— so a green local run is necessary but not sufficient. The reader gets the
actionable fact (local green is not enough) and the authoritative source, and
the six-item list stops being this repo's to maintain.
The same treatment for 1, 2 and 4: state the requirement or the consequence,
link the workflow, delete the narration.
Related
merged as-is.
still live.