Skip to content

docs: stop the README narrating rainix's workflow internals - #140

Merged
thedavidmeister merged 1 commit into
mainfrom
2026-08-17-issue-139
Aug 17, 2026
Merged

docs: stop the README narrating rainix's workflow internals#140
thedavidmeister merged 1 commit into
mainfrom
2026-08-17-issue-139

Conversation

@thedavidmeister

Copy link
Copy Markdown
Contributor

Closes #139.

The README restated how rainix's reusable workflows behave in four places. Each
was a second copy of a fact rainix owns, drifting independently of the thing it
described, with nothing in this repo's CI able to catch the drift. This cuts
each instance to the consequence a consumer must act on, plus a link to the
workflow that owns the mechanism.

The rule applied is the property #139 filed, 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.
Same rule that closed PR #117
and issue #82 for soldeer's install semantics.

Clause by clause

Instance 1 — the build-script path (README:14-18)

Clause Whose fact Action
"A consumer drives this library from a build script" this repo kept
"the path of that script is not a free choice" consumer constraint kept
"it must be script/Build.sol" consumer constraint kept (was implicit in the rainix sentence, now stated directly)
"rainix's rainix-copy-artifacts.yaml reusable regenerates from script/Build.sol exactly" rainix cut, replaced by a link
"hard-fails any repo that commits src/generated/ without one" rainix — its exact failure condition cut
"A consumer that names its script anything else gets no regeneration and no currency check" rainix — describes what its workflow does not do, and is already only conditionally true cut, reduced to "Any other path is an unsupported layout"

Instance 2 — formatter requirements (README:38-42)

Clause Whose fact Action
"LibCodeGen wraps the declarations it emits itself, deciding against MAX_LINE_LENGTH and NEWLINE_DUE_TO_MAX_LENGTH" this repo kept (untouched)
"Those two encode forge fmt's line_length and tab_width, which this repo states in [fmt] of foundry.toml rather than inheriting" this repo kept (untouched)
"A consuming repo whose [fmt] disagrees gets generated sources its own forge fmt reflows" this repo's emitted output vs the consumer's formatter kept, sharpened to "reflows away from what this library emits"
"rainix-copy-artifacts regenerates, runs forge fmt, then git diff --exit-code" rainix — a step-by-step of the reusable cut
"so that reflow is committed as the new baseline instead of being reported" rainix — a consequence of rainix's step order, which is what drifts cut
"Consumers therefore need line_length = 120 and tab_width = 4" consumer requirement kept verbatim

No link added here: rainix-copy-artifacts.yaml is already linked once, at instance 1. Per #139, a reader who needs rainix's internals is sent to rainix in one link, once.

Instance 3 — the six static gates (README:76-80)

Clause Whose fact Action
"[rainix.yaml] is what runs all four in CI" this repo's workflow file kept
"via rainix's rainix-sol.yaml" this repo's own uses: line kept — it can only drift if this repo changes its own workflow
"It also applies org-wide gates that none of the four covers" consequence, at the altitude a consumer acts on kept
"no ignored tests, no git submodules, an agent context cap, append-only frozen snapshots, no custom NatSpec, and one contract per .sol file" rainix — a transcription of rainix-sol-static.yaml, wrong the day rainix adds a seventh gate, drops one or renames one cut, replaced by a link to rainix-sol-static.yaml
"so a green local run is necessary but not sufficient" the actionable consequence kept verbatim

Instance 4 — publish (README:86-94)

Clause Whose fact Action
"Publishing is merge-driven, not tag-driven" this repo's package-release.yaml trigger kept
"[Package Release] calls rainix's rainix-autopublish.yaml reusable on every push to main" this repo's workflow file kept
"passing the package name explicitly as soldeer-package: rain-sol-codegen" this repo kept verbatim
"When the source content differs from the latest published revision, that workflow pushes [package].version to Soldeer" rainix — its change gate and publish step cut
"tags sol-v<x.y.z>" rainix — its tag naming convention cut
"and bumps [package].version to the next version" rainix cut
"[package].version in foundry.toml is therefore the next, unpublished version rather than the last published one" this repo's foundry.toml — what a reader editing it needs kept
"Neither the version nor the tag is set by hand" consequence kept, rephrased as "That workflow owns both the version and the release tag, so neither is set by hand" so the "therefore" still has an antecedent once the mechanism is gone

#139's "must survive" list, and where each now lives

Must survive Where
Consumers need line_length = 120 and tab_width = 4, because LibCodeGen wraps against MAX_LINE_LENGTH / NEWLINE_DUE_TO_MAX_LENGTH stated in [fmt] "Formatter requirements", both paragraphs
A consumer's build script must live at script/Build.sol intro, now stated as the constraint rather than inferred from rainix's behaviour
[package].version is the next, unpublished version; neither version nor tag set by hand "Publish", second paragraph
This repo passes soldeer-package: rain-sol-codegen explicitly "Publish", first paragraph
The four local checks, and that CI also runs them "Develop", the bullet list and the rainix.yaml paragraph
src/generated/ and meta/ are test scratch, created on demand, committed empty-handed "Develop", untouched

Also untouched and still present: the rainlanguage/rain.deploy worked-example pointer and the statement that this repo carries no example of its own.

Links made absolute

The README ships in the published soldeer package, where .soldeerignore strips
.github/ — so a repo-relative link into .github/workflows/ resolves to
nothing for the reader who actually has the package. That is the defect #95
recorded (measured against the published 0.1.11 zip). Both relative links in
the rewritten clauses are now full https://github.com/... URLs rather than
being carried over as-is:

  • .github/workflows/rainix.yaml
  • .github/workflows/package-release.yaml

LICENSES/LicenseRef-DCL-1.0.txt stays relative: that file does ship in the
package, so the link resolves.

QA

  • Discriminating tests: n/a — docs-only diff, no executable behaviour changes,
    so there is no assertion a test could carry. The claim under test is
    "every sentence still corresponds to something true", which is checked by
    reading the source of truth, below.
  • Mutations applied: n/a — no source lines to mutate. The equivalent evidence
    for a docs diff is that each retained claim was checked against the file that
    owns it: foundry.toml [fmt] really is line_length = 120 /
    tab_width = 4; this repo's rainix.yaml really does
    uses: rainlanguage/rainix/.github/workflows/rainix-sol.yaml@main; this
    repo's package-release.yaml really is on: push: branches: [main] with
    soldeer-package: rain-sol-codegen; rainix 7f223b4's
    rainix-copy-artifacts.yaml really does match script/Build.sol exactly and
    hard-fail a committed src/generated/ without it, and its
    rainix-autopublish.yaml really does own the version bump and the sol-v
    tag. Every claim removed is one whose owning file is now linked instead.
  • Oracle: issue The README narrates rainix's workflow internals in four places, so it drifts whenever rainix changes and nothing here can catch it #139's "What is genuinely this repo's, and must survive" list,
    plus the two upstream workflow files fetched from
    raw.githubusercontent.com/rainlanguage/rainix/main at HEAD 7f223b4 — read
    independently of the README's account of them, which is the account under
    suspicion.
  • Category check: The README narrates rainix's workflow internals in four places, so it drifts whenever rainix changes and nothing here can catch it #139 asks for the property (README does not restate
    third-party behaviour), illustrated by four instances. All four cut; the whole
    file was then re-read for further instances and none remain — the surviving
    third-party mentions are the nix/soldeer/rainix names this repo depends on
    and its own uses: values, not accounts of their behaviour.

Verification

  • nix develop -c reuse lint — compliant, 47/47 files.
  • nix develop -c forge fmt --check — clean.
  • nix develop -c forge test — 147 passed, 0 failed.
  • Every link in the file fetched, all HTTP 200: the four rainix workflows
    (rainix-copy-artifacts.yaml, rainix-sol.yaml target rainix-sol-static.yaml,
    rainix-autopublish.yaml), both rain.sol.codegen workflow files,
    rain.deploy and its script/Build.sol, soldeer.xyz, nixos.org,
    opensource.org CAL-1.0, reuse.software 3.3. LICENSES/LicenseRef-DCL-1.0.txt
    confirmed present in the tree.

Only README.md changes.

The README restated how rainix's reusable workflows behave in four places:
rainix-copy-artifacts' regeneration and hard-fail conditions, its
regenerate/fmt/diff step order, a six-item transcription of
rainix-sol-static.yaml's gates, and rainix-autopublish's publish/tag/bump
sequence. Each was a second copy of a fact rainix owns, drifting independently
of it with nothing here able to catch the drift.

Cut each to the consequence a consumer must act on, plus a link to the workflow
that owns the mechanism. The consumer-facing facts are unchanged: the build
script must be script/Build.sol, consumers need line_length = 120 and
tab_width = 4, [package].version is the next unpublished version and neither it
nor the tag is set by hand, this repo passes soldeer-package explicitly, and
local green is necessary but not sufficient.

The two rewritten clauses that linked into .github/workflows/ now use full
github.com URLs. .soldeerignore strips .github from the published package, so a
repo-relative path there resolves to nothing for a reader holding the package.

Closes #139

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@thedavidmeister thedavidmeister self-assigned this Aug 17, 2026
@coderabbitai

coderabbitai Bot commented Aug 17, 2026

Copy link
Copy Markdown

Warning

Review limit reached

@thedavidmeister, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 45 minutes

Limit details: You’ve used all 1 included review currently available under your plan.

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 88cf8477-6990-4bd6-a3b8-d689896a250c

📥 Commits

Reviewing files that changed from the base of the PR and between ed5ecdd and 3759a18.

📒 Files selected for processing (1)
  • README.md

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@thedavidmeister
thedavidmeister merged commit 7ffe997 into main Aug 17, 2026
4 checks passed
thedavidmeister pushed a commit that referenced this pull request Aug 17, 2026
The paragraph this branch added documented a `max-codegen-passes` bound, a
default of 5 and a `did not reach a fixed point` failure. None of them exist:
rainix at HEAD 7f223b4 runs `forge script ./script/Build.sol` exactly once
inside an `if [ -f ... ]` guard, `max-codegen-passes` has 0 hits across the
whole repo, and the only failure that step emits is `Committed artifacts are
stale`. rainlanguage/rainix#319, which would add the bound, is still open.

State what is true instead: the loop is unbounded, nothing iterates it, and the
operator regenerates until the working tree stops changing.

Written in the register #140 established for this README (closing #139):
the consequence for someone working in a consuming repo plus one link to the
workflow that owns it, not a transcription of what that workflow does.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
thedavidmeister added a commit that referenced this pull request Aug 17, 2026
Re-sites the orphaned-artifact refusal onto main's current `LibFs`:

- `buildFileForContract` is now the six-arg call applied to `GENERATED_DIR`
  over a seven-arg `dir` overload (#112), builds the whole file content
  before touching disk (#100), and unlinks in a `while` loop (#127). The
  check goes into the shared body, after `vm.createDir` because it is a read
  of that directory, and before the unlink so a refusal leaves the existing
  artifact where it found it.
- `requireNoOrphanedArtifact(vm, contractName)` is that check applied to
  `GENERATED_DIR`, over a private `requireNoOrphanedArtifactIn`, mirroring
  `pathForContract` / `pathForContractIn`. The overload reads the directory
  it writes into rather than always `GENERATED_DIR`.
- The test moves from `test/lib/` to `test/src/lib/` (#56), and its calls
  carry the licence and copyright `filePrefix` now takes (#135).
- `InvalidContractName` / `isContractNameSlow` are `InvalidIdentifier` /
  `isIdentifierSlow`, and forge-std is 1.16.2.
- The README's "Generated paths" section anchors ahead of "Formatter
  requirements": the worked-example section it sat under is gone (#138) and
  the publish section it appended to was rewritten (#140).

Drops the hand-set `[package].version = "0.2.0"` and the README paragraph
that justified it. Autopublish owns the version.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

The README narrates rainix's workflow internals in four places, so it drifts whenever rainix changes and nothing here can catch it

1 participant