Skip to content

Remove the dead submodule-era entries from .soldeerignore - #209

Open
thedavidmeister wants to merge 2 commits into
mainfrom
208-remove-submodule-era-residue
Open

Remove the dead submodule-era entries from .soldeerignore#209
thedavidmeister wants to merge 2 commits into
mainfrom
208-remove-submodule-era-residue

Conversation

@thedavidmeister

@thedavidmeister thedavidmeister commented Aug 15, 2026

Copy link
Copy Markdown
Collaborator

Closes #208

What changed

Three lines removed from .soldeerignore, and nothing else in the tree:

  • .gitmodules — there is no .gitmodules here, and git ls-files --stage | grep ^160000 is empty, so there are zero committed gitlinks. It cannot come back either: rainix CI runs a no-submodules check in the static job that fails on a root .gitmodules or any gitlink.
  • /foundry.lock — Foundry's git submodule lockfile, recording the commit each dependency vendored under lib/ is pinned to, so forge install / forge update can restore identical submodule revisions. Meaningful only in a repo that vendors dependencies as submodules. Already deleted here.
  • /libfoundry.toml sets libs = ['dependencies'], so forge resolves everything under dependencies/ and never creates lib/.

Why only three, when the issue lists ten

The issue also nominated seven template-copied entries (.cargo, .coderabbit.yaml, .devcontainer.json, .envrc, .prettierignore, /audit, /deployments) on the grounds that those paths do not exist here. That reasoning does not hold, and they are kept.

.soldeerignore is a publish filter, not a description of the files that exist. An entry naming an absent path is a forward-looking rule, not residue: delete it and that file gets published into the soldeer package the moment anyone adds it. Absence is therefore not evidence for removal — the only entries genuinely dead are the ones tied to a mechanism this repo can no longer use, and submodules are exactly that.

The seven kept entries all name real, correctly spelled filenames, so each still does its job if the file ever appears. Verified against repos that actually have them rather than from memory — .cargo, .coderabbit.yaml, .devcontainer.json, .envrc and .prettierignore all exist verbatim at the root of rainlanguage/raindex and rainlanguage/rainlang. No entry in this file is misspelled, so there was nothing to correct in place either.

The issue's own out-of-scope list (.DS_Store, .vscode, .pre-commit-config.yaml, /out, /cache, /dependencies, /remappings.txt) is untouched for the same reason, plus its stated one.

CLAUDE.md:15 already reads "Soldeer (not git submodules)" — correct, explicitly out of scope, left alone. REUSE.toml is the opposite kind of file (its annotations describe files that must actually exist) but needs no change here: it annotates .soldeerignore, which still exists, so no annotation was removed and reuse lint has nothing new to resolve.

After this, the only remaining mention of .gitmodules / foundry.lock / lib/ outside dependencies/ is that one correct CLAUDE.md sentence.

Branch history has two commits — the first implemented the issue as filed, the second restores the seven after the filter-vs-description correction. Net diff is exactly three deletions.

QA

  • Discriminating tests: soldeerignore-diff.sh — a behavioural differential, not a grep. It mirrors the real post-forge soldeer install, post-forge build tree (1634 paths, symlinks included — exactly the state soldeer push packages from) into a throwaway git repo and evaluates both .soldeerignore revisions under gitignore semantics, which is what soldeer's ignore crate implements. Result: 1566 paths excluded under origin/main, 1566 under this branch, diff empty. So removing the three lines provably changes nothing about what gets published today. It fails on base in the only sense a no-op change permits — point it at a revision that drops a live entry and the diff is non-empty, which is the mutation ledger below.

  • Mutations applied: negctl.sh drops each kept entry one at a time and re-evaluates, proving the differential can see a real change rather than being a zero-match filter that always says "identical":

    mutant excluded delta verdict
    baseline 1566
    drop /dependencies 297 −1269 KILLED
    drop /out 1291 −275 KILLED
    drop /cache 1565 −1 KILLED
    drop /remappings.txt 1565 −1 KILLED
    drop .pre-commit-config.yaml 1565 −1 KILLED
    drop .vscode 1566 0 survives — path absent in this checkout
    drop .DS_Store 1566 0 survives — path absent in this checkout

    The two survivors are the point of this PR's scope correction, not a gap: a .soldeerignore entry whose path is absent is unobservable by construction, which is precisely why survivorship cannot be used as evidence for deleting one. .vscode and .DS_Store are absent on a CI checkout but present on a real developer machine at soldeer push time. The same is true of all seven entries the issue asked to delete, and it is why they are kept.

    Harness honesty note: the first run reported .pre-commit-config.yaml as SURVIVED. That was a lying harness, not a finding — find -type f skipped it because git-hooks.nix installs it as a symlink into the nix store. Fixed to \( -type f -o -type l \), after which it kills; every count above is post-fix.

  • Oracle: the filesystem, foundry.toml, and other repos' actual contents — all independent of the .soldeerignore text being edited. Each of the three removed paths was checked for existence, for a .gitignore entry that could produce it, and for any producer at all: libs = ['dependencies'] for /lib; zero gitlinks from git ls-files --stage | grep ^160000 plus rainix's no-submodules gate for .gitmodules. A positive control closes the loop the other way — each removed pattern was re-added alone against a probe tree that does contain its path, and all three correctly excluded it, so "diff empty" is caused by path absence and not by a dead evaluator. The keep decision's oracle is the GitHub contents API for raindex and rainlang, which is what establishes the seven filenames are real and correctly spelled.

  • Category check: the issue asks for lines 10, 21, 23 (submodule-era) and 2, 3, 4, 5, 12, 16, 29 (template-copied). Covered 10, 21, 23. Deliberately not covered: 2, 3, 4, 5, 12, 16, 29 — the premise behind that half of the issue (absent path ⇒ dead entry) is wrong for a publish filter, reasoned above; deleting them would silently widen what soldeer push publishes. The issue's "no reference to .gitmodules, lib/ or foundry.lock outside dependencies/" is met — grep leaves only CLAUDE.md:15, which the issue itself rules correct. CI green below. The issue should be closed as done on the submodule half and the template half retracted; if the maintainer disagrees, this is the line to push back on.

CI

Full rainix-sol suite run locally in nix develop github:rainlanguage/rainix/53e96a7d0a97d7c7c75c3b2412521324776fdac6#sol-shell — the exact RAINIX_SHA the reusable workflows pin — all green on the final tree:

job command result
legal reuse lint compliant with REUSE 3.3, exit 0
static slither . 92 contracts, 98 detectors, 0 results, exit 0
static forge fmt --check exit 0
static rainix-sol-single-contract exit 0
test forge test 16 suites, 85 passed, 0 failed, 0 skipped

legal is the job at risk from touching this repo's metadata files and it is clean. FLARE_RPC_URL was supplied so the fork suites (FlareInterfacesProd, LibFtsoV2LTS, LibSceptreStakedFlare, LibDineroFlrEth, LibOpFtsoCurrentPricePair, …) actually ran against Flare rather than erroring out — the 85 includes them.

🤖 Generated with Claude Code

Summary by CodeRabbit

  • Chores
    • Updated project tracking configuration so previously ignored dependency and lock files can now be included.

thedavidmeister and others added 2 commits August 15, 2026 07:40
`.soldeerignore` named ten paths that do not exist in this repo.

Submodule-era residue from the submodule -> soldeer migration:

- `.gitmodules` — not in the tree, and `git ls-files --stage` reports zero
  gitlinks. rainix CI's `no-submodules` check fails on either, so it cannot
  come back.
- `/foundry.lock` — Foundry's git submodule lockfile, already deleted here.
- `/lib` — `foundry.toml` sets `libs = ['dependencies']`, so forge resolves
  under `dependencies/` and never creates `lib/`.

Template copied in from a larger Rust/JS-shaped repo, for paths this repo
neither has nor gitignores:

- `.cargo`, `.coderabbit.yaml`, `.devcontainer.json`, `.envrc`,
  `.prettierignore`, `/audit`, `/deployments`

The remaining entries stay: `.DS_Store`, `.vscode`, `.pre-commit-config.yaml`
and the build/publish outputs (`/out`, `/cache`, `/dependencies`,
`/remappings.txt`) are absent from a clean checkout by design but present
when `soldeer push` runs.

Closes #208

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The previous commit removed too much. `.soldeerignore` is a publish FILTER,
not a description of the files that exist. An entry naming a path that is
absent today is a forward-looking rule: delete it and that file gets
published into the soldeer package if anyone adds it later.

So absence is not evidence for removal. Only entries tied to a mechanism this
repo can no longer use are dead, which is the three submodule-era ones alone:
`.gitmodules`, `/foundry.lock` and `/lib`. Those stay removed.

This restores the seven that were wrongly dropped — `.cargo`,
`.coderabbit.yaml`, `.devcontainer.json`, `.envrc`, `.prettierignore`,
`/audit` and `/deployments`. Each names a real, correctly spelled filename
(`.cargo`, `.coderabbit.yaml`, `.devcontainer.json`, `.envrc` and
`.prettierignore` all exist verbatim in raindex and rainlang), so each still
protects the package if that file ever appears here.

Net effect of the branch is now exactly three deletions.

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

coderabbitai Bot commented Aug 15, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 8aa0dd97-fff6-4514-a077-0ff4843e6da7

📥 Commits

Reviewing files that changed from the base of the PR and between b634aad and fc81ab1.

📒 Files selected for processing (1)
  • .soldeerignore
💤 Files with no reviewable changes (1)
  • .soldeerignore

Walkthrough

The change updates .soldeerignore by removing obsolete /foundry.lock and /lib entries. /foundry.toml remains ignored.

Changes

Soldeer ignore cleanup

Layer / File(s) Summary
Update ignored paths
.soldeerignore
Removed /foundry.lock and /lib from the ignored paths. /foundry.toml remains ignored.

Estimated code review effort: 1 (Trivial) | ~2 minutes

Merge Risk: ⚪ Minimal · up to fc81a

This change removes obsolete submodule-era ignore rules without changing the current Soldeer package contents, so no actionable merge-blocking risk remains after normal checks and review.

Possibly related issues

  • rainlanguage/rainlang#553 — Removes the same obsolete submodule-era entries from .soldeerignore.
  • rainlanguage/raindex#2834 — Addresses the same cleanup pattern for .soldeerignore.
  • rainlanguage/rain.tofu.erc20-decimals#30 — Removes stale submodule-related ignore entries after migration to Soldeer.
  • rainlanguage/rain.datacontract#26 — Targets the same obsolete .soldeerignore references.
  • rainlanguage/rain.intorastring#20 — Removes obsolete .soldeerignore entries for submodule-era paths.
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Linked Issues check ⚠️ Warning The PR removes the three submodule-era entries but leaves the seven template-derived paths required by issue #208. Remove the seven template-derived entries listed in issue #208, then verify the required reference checks and CI checks pass.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly describes the removal of the three obsolete submodule-era entries from .soldeerignore.
Out of Scope Changes check ✅ Passed The changes are limited to removing obsolete entries from .soldeerignore, which matches the linked issue scope.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch 208-remove-submodule-era-residue

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.

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.

Remove the submodule-era residue — .soldeerignore still names foundry.lock, .gitmodules and /lib

1 participant