Uh oh!
There was an error while loading. Please reload this page.
Hold .soldeerignore against the repo root, and stop shipping .audit/ - #133
Conversation
…cumentation `.vscode` and `/docs` matched nothing and never have; `.audit/` was at the root and unexcluded, so its run stamps shipped in the package. Closes#91 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Running the suite leaves an empty `meta/` at the root, which nothing excluded, so it would ship in any package built after a test run. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Warning Review limit reached
Next review available in:17 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 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. 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. Comment |
Delete `test/package/SoldeerIgnore.t.sol` and revert the repo-root
`{ access = "read", path = "./" }` fs_permissions grant, returning
`fs_permissions` to its base three entries.
The `.soldeerignore` and `.gitignore` changes stay: `.audit/` stops shipping and
`meta/` can no longer leak.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>meta/<name>.rain.meta is what LibCodeGen.describedByMetaHashConstantString reads. Those files are committed inputs to codegen, so gitignoring the directory makes committing them impossible. There are none committed today; that is a data gap to fill by adding files, not one to enshrine by ignoring the path. Costs nothing: LibCodeGenDescribedByMetaHashConstantStringTest removes every fixture it writes, so the directory the suite leaves at the root is empty and git does not see it. Verified: git status is clean after a full run with the line gone. /meta stays in .soldeerignore. What git tracks and what the published package ships are different questions. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Ruled 2026-08-17: "for 133 meta needs to be in soldeer published
packages". .soldeerignore lists what is stripped from the package, so
`/meta` is removed. meta/ is absent from that list on main, so this
restores main's behaviour for that path and the published package
carries whatever meta/ holds.
This is the second half of the pair. The first ruling put meta/ in git
("in 133 meta should be committed, so it can't be in gitignore"); this
one puts it in the package. Committed and published, both.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>Uh oh!
There was an error while loading. Please reload this page.
Closes#91
No test guards this change, and it can regress silently
This PR ships no forge test. The check it used to carry —
test/package/SoldeerIgnore.t.sol, which listed the repo root and held.soldeerignoreagainst it in both directions — has been deleted, and therepo-root
{ access = "read", path = "./" }fs_permissionsgrant it needed hasbeen reverted, so
fs_permissionsis back to its base three entries.That means: nothing in this repo will notice if this regresses. A new
top-level path can start shipping in the soldeer package because nobody added it
to
.soldeerignore, and a.soldeerignoreentry can go dead — matching nothing,exactly the
.vscodeand/docsdefect this PR fixes — and the suite will staygreen through either. There is no test to strengthen and no assertion to read;
the only thing standing between the package and the next leak is someone editing
.soldeerignoreby hand, correctly, at the same time they add a root path.The check is being rehomed to rainlanguage/rainix#317 — "Six repos' worth of
static analysis is being hand-rolled in Solidity because
rainix-statichas nohome for repo-wide lint checks". It is a repo-root packaging rule, not a
statement about any Solidity in
src/, and it belongs in shared static analysisthat every rain repo gets, not in one repo's
forge testreading its owndirectory listing through a cheatcode. Until that lands, this is unguarded.
Why the test was here at all
The fixer brief that produced this PR said every fix ships a test and
verify-by-hand is never acceptable, with no exemption for changes that have no
behaviour. That was wrong and has been corrected.
.soldeerignoreis aconfiguration file with no Solidity behaviour, and the test written to satisfy
that brief was hand-rolled static analysis in Solidity: 174 lines whose subject
was a directory listing and two text files, with two of its four tests asserting
only against its own hardcoded
shipped()set — itself a hand-maintained seconddefinition of the package, which is the same class of defect as the
.soldeerignoredrift it was written to catch.What ships here
.soldeerignore, and nothing else: two dead entries out, one real exclusion in.The change with the real consequence is that
.audit/stops shipping.Dead entries, the finding as filed.
.vscodeand/docsmatched nothing andnever have —
git log --all -- .vscodeandgit log --all -- docsare bothempty. Removed.
.audit/was shipping. The audit stamp commit added.audit/runs.jsonland.audit/scope.jsonat the root..soldeerignoreexcluded/auditbut not.audit, so both files are inside the published package. Confirmed against theregistry rather than inferred —
unzip -Z1on the current0.1.25zip pulledfrom
api.soldeer.xyzlists:Now excluded via
/.audit.The issue's note about keeping
.DS_Storeis right and the entry is untouched:nothing here produces it and git is not told about it, but macOS writes it into
any directory it browses.
meta/is committed input: in git, and in the packageTwo rulings, 2026-08-17, settle
meta/in both directions:An earlier revision of this PR contradicted both — it added
metato.gitignoreand/metato.soldeerignore, on the premise that the directoryis test scratch like
cache,dependenciesandout. That premise is wrong andboth lines are gone.
meta/<name>.rain.metais a committed input to codegen — it is the fileLibCodeGen.describedByMetaHashConstantStringhashes into a consumer'sDESCRIBED_BY_META_HASH. Gitignoring the directory makes committing oneimpossible. That none are committed in this repo today is a data gap to be filled
by adding files, never one to be enshrined by ignoring the path — and the same
holds for the published package, which is why
/metais not in.soldeerignoreeither.
meta/is absent from.soldeerignoreonmain, so this PR leaves thatpath exactly as
mainhas it: whatever is committed undermeta/ships.Dropping both lines costs nothing, which is the point:
LibCodeGenDescribedByMetaHashConstantStringTestremoves every fixture itwrites, so the directory a full run leaves at the root is empty, and git does
not track empty directories.
git status --porcelainis clean afterforge teston this branch — verified, not assumed.
Where the issue's proposed fix was incomplete
The issue said "delete lines 8 and 12" and it was right about those two lines. It
did not name
.audit, and that entry would not have been found by reading thelist — it needed the published zip. It is the same defect the issue describes, so
it is fixed here.
Interaction with #121
#121 (issue #84) removed
.gas-snapshotand its.soldeerignoreentry; it hassince merged and is in the
origin/mainthis branch merges. No conflict, textualor semantic. With no test in this repo holding the list against the root, nothing
forces whichever change lands next to do both halves — dropping a file without
its entry, or an entry without its file, is silent in both directions. That is a
concrete instance of the regression this PR is unguarded against.
QA
Re-run on the current merge commit (
origin/main=c816251, merged in — merge,not rebase):
nix develop -c forge test—Ran 23 test suites: 155 tests passed, 0 failed, 0 skipped (155 total tests). This PR touches no Solidity, so it must not movethe count, and it does not.
nix develop -c forge fmt --check— clean, no diff.nix develop -c reuse lint— compliant; 51/51 files carry copyright andlicense information.
git status --porcelain— empty after a fullforge testrun. Themeta/directory the suite leaves at the root holds no files, so git does not see it.
git diff origin/mainis.soldeerignorealone: 1 insertion, 2 deletions.foundry.tomlis byte-identical toorigin/main.unzip -Z1over the0.1.25zip fetched fromapi.soldeer.xyzgives theactual shipped file list, and
.audit/runs.jsonland.audit/scope.jsonarein it, which is the leak. For the dead entries the oracle is
git log --all -- .vscodeandgit log --all -- docs, both empty, so neitherpath has ever existed here.