Skip to content

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

Description

@thedavidmeister

What is wrong

.soldeerignore still names foundry.lock, .gitmodules and /lib — none of which exists here. It is residue from the submodule → soldeer migration.

Everything dangling in this repo

Submodule paths that no longer exist

  • .soldeerignore line 10 — .gitmodules. There is no .gitmodules in the tree and git ls-files --stage reports zero gitlinks.
  • .soldeerignore line 21 — /foundry.lock. There is no foundry.lock; it was deleted here already.
  • .soldeerignore line 23 — /lib. There is no lib/ directory. foundry.toml sets libs = ['dependencies'], so forge resolves everything under dependencies/ and never creates lib/.

foundry.lock is Foundry's git submodule lockfile — it records the commit each dependency vendored under lib/ is pinned to, so forge install / forge update can restore identical submodule revisions. It is only meaningful in a repo that vendors dependencies as git submodules, and this repo does not: soldeer.lock is the live lockfile and everything lands under dependencies/.

None of it can come back. rainix CI runs a no-submodules check that fails on a root .gitmodules or any committed gitlink.

Checked and clean. REUSE.toml is clean here — every annotated path resolves, including .cargo/**/, .coderabbit.yaml, .devcontainer.json, .envrc and .prettierignore, all of which dangle in sibling repos that copied the same template without the files. CLAUDE.md contains no stale claim that dependencies are git submodules under lib/. Leave both alone.

Deliberately not in scope. .soldeerignore also names .DS_Store, .pre-commit-config.yaml and the build/publish outputs (/out, /cache, /dependencies, /deployments). Those are absent from a clean checkout by design — OS junk, local developer files, or artifacts generated at forge soldeer install / forge build time and therefore present when soldeer push runs. They are correct ignores and must stay.

Nothing else references any of it. .github/workflows/, flake.nix, foundry.toml, Cargo.toml, crates/, remappings.txt, .gitignore, script/, meta/, README.md, TESTING.md and the rest of the tree were grepped and are clean.

Why only these three lines go

.soldeerignore is a publish filter, not a description of the tree. An entry naming an absent path is a forward-looking rule: it is the thing that keeps that path out of the published package if anyone ever adds it. So the test for deleting an entry is impossible, not absent — an entry may only go if the path it names can never exist again.

These three pass that test, and they pass it structurally rather than by observation: rainix CI's no-submodules check fails the build on a root .gitmodules or any committed gitlink, /lib is that same vendored-submodule directory, and foundry.lock is only ever written for lib/ submodule dependencies. While that check stands none of the three can be recreated, so their filter entries can never match anything again. They are genuinely dead, and they are the only lines this issue removes.

Every other entry — .cargo, .coderabbit.yaml, .devcontainer.json, .envrc, .prettierignore, and the rest — is either matching something today or merely not yet added. Deleting one of those cleans nothing up; it arms a leak, so that the day someone adds the file it ships inside the published soldeer package. Proved live in rain.lib.memkv — dropping the /soldeer.lock line took forge soldeer push --dry-run from 14 entries to 15, with soldeer.lock now inside the package.

Nothing catches an over-deletion. No CI job reads .soldeerignore, so the mistake goes green and only surfaces later, when someone adds the file and it silently publishes.

(REUSE.toml is the opposite case: its annotations describe files that exist, so a dangling path there is residue and does go. Nothing dangles here — see above.)

Context

This is the tail of an unfinished migration, not a convention.

Across the repos that consume rain.solmem via soldeer, nine have already dropped foundry.lock (raindex, rain.verify, rain.tofu.erc20-decimals, rain.flare, rain.dia, rain.erc4626.words, rainlang, rain.merkle, S01-Issuer/st0x.deploy) and eight still carry one (rain.solmem, rainlang.interface, rain.extrospection, rain.math.float, rain.string, rain.lib.memkv, rain.intorastring, rain.datacontract), each with its own issue.

Deleting the file was never the whole job — every one of those nine left dangling .gitmodules and/or lib/ references behind. This issue covers rainlang only.

The same residue exists in a further 17 rainlanguage repos outside that consumer set, 10 of which also still carry a dead foundry.lock. They are out of scope here. flow and rain.tier.interface genuinely still use git submodules, so their .gitmodules and lib/ entries are correct and must be left alone.

Done when

  • .soldeerignore lines 10, 21 and 23 removed
  • every other .soldeerignore line left exactly as it is
  • no reference to .gitmodules, lib/ or foundry.lock remains anywhere in the tree outside dependencies/
  • CI green (rainix-sol test / static / legal)

Metadata

Metadata

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