Restore the Protofire reports as inherited audit records (reverses #1) - #6
Restore the Protofire reports as inherited audit records (reverses #1)#6thedavidmeister wants to merge 1 commit into
Conversation
The two reports audit rain.factory, not this repo, at refs that resolve only there. That makes them inherited provenance, not a local audit record, and the convention now says so explicitly rather than by deletion. Both PDFs return at their original blobs (84d57a5, 6829af2 — byte-identical to rain.factory main), renamed with the mandatory `inherited.` prefix that is the machine discriminant for the inherited case. audit/protofire/inherited.json carries what a filename cannot: the source repo and ref for each report, its sha256, and the snapshots it covers. src/generated/0_1_3 and 0_1_4 are covered by r2.0 — the audited v0.1.1 source rebuilds their pinned bytecode byte-for-byte, and their address and codehash are constants inside an audited file. r1.0 covers nothing: its source state compiled against a different OpenZeppelin pin and no snapshot builds from it. The uncovered set is deliberately not written down. It is the complement of covers against the live src/generated listing, so 0_1_5 — the unaudited ICloneableFactoryV3 pin that is live on every chain — shows as uncovered without anyone maintaining a list, and so will any snapshot added later. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Warning Review limit reached
Next review available in: 24 minutes Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. 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. Review details⚙️ Run configurationConfiguration used: Organization UI Review profile: ASSERTIVE Plan: Pro Plus Run ID: ⛔ Files ignored due to path filters (2)
📒 Files selected for processing (2)
✨ Finishing Touches🧪 Generate unit tests (beta)
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 |
|
🤖 ai:vetter |
|
🤖 ai:producer |
This reverses #1
PR #1 deleted this repo's two Protofire PDFs on the reasoning that
rain.factory.deploy has never itself been audited. Every fact in that commit
message is true —
1a92a86,08fecb98…and av0.1.1tag genuinely do notexist in this repo, and the only tag here is
sol-v0.1.6. The conclusion drawnfrom them was wrong.
"The ref does not resolve here" is not "the provenance is fake." This repo
was split out of
rain.factoryon 2026-07-24. The audits happened in thepredecessor, on the source that builds snapshots pinned here.
src/generated/0_1_3and
0_1_4pin bytecode of audited source — I rebuilt rain.factory's auditedv0.1.1CloneFactory.sol(blobacbbcf7e…) underrainix 53e96a7dsol-shelland it reproduces both snapshots'
CREATION_CODEandRUNTIME_CODEbyte-for-byte, keccak
0xf21b813c…, matching theirBYTECODE_HASH. Strongerstill,
0x444acC29d63fa643E8adCC35FD9aa6DE111dCb39and that codehash areconstants inside
src/lib/LibCloneFactoryDeploy.sol, a named scope item ofboth reports — the coverage is written into the audited source, not inferred
from my rebuild.
So #1 destroyed real provenance rather than removing a false claim. The claim
that needed fixing was never "we have an audit"; it was that nothing said which
part the audit covers.
What this PR does
84d57a5d…,6829af27…)recovered from
b3000dd^, verified byte-identical torain.factorymaintoday — the same bytes, not a re-export.
inherited.prefix: a discriminant visible inls, checkable with no network.audit/protofire/inherited.json, carrying what a filename cannot hold:source org/repo/ref, sha256, and a per-snapshot coverage list.
## Auditsection that points at the manifest and statesthe live pin is uncovered.
What the record now asserts
rain.factory)inherited.rain.factory.v0.1.1-r2.0.may-2026.pdf(r2.0, 27/05/26)v0.1.1=08fecb985efbc811cde85c73f18e2e658884e5b6src/generated/0_1_3,src/generated/0_1_4(both0xf21b813c…)inherited.rain.factory.1a92a86.feb-2026.pdf(r1.0, 11/02/26)1a92a8688249aa5a8f4e82d5ed584604515f1ea0"covers": []on r1.0 is load-bearing, not an oversight. r1.0 audits an earlierstate of the same
ICloneableFactoryV2source (blob3299755d…) compiledagainst OpenZeppelin 5.5.0 as a git submodule; every snapshot here builds
from the 5.6.1 soldeer pin. No snapshot builds from it, and r2.0's Reviews
table re-lists the 11/02/26 pass, so r2.0 subsumes it. It stays as audit
history, claiming nothing.
What the record does NOT assert
src/generated/0_1_5/is not covered by either report and has never beenaudited by anyone. It is the
ICloneableFactoryV3rewrite —cloneDeterministic,msg.sender-namespaced salts, 5-argNewClone— at0x7053c1D000192f1FeC1fbe20350139F3300dBBaD/0x3ec02e2f…. No Protofire scopelist ever contained
ICloneableFactoryV3.sol; that interface did not exist inrain.factoryuntil 2026-07-11, after both audits. And it is the snapshotLibCloneFactoryDeployaliases here, live on Arbitrum, Base, Base Sepolia,Flare and Polygon.
Also uncovered and stated for completeness: this repo's own
CloneFactory.soland
LibCloneFactoryDeploy.sol(a file of the same name is in the auditscope, but the audited content is the hand-written V2 constants, not this
generated alias — which is exactly why coverage is keyed on snapshot directories
and never on filenames), plus
script/,test/and CI.The uncovered set is deliberately not written down anywhere. It is computed
as the complement of
coversagainst the livesrc/generated/listing, so afuture
0_1_6appears as uncovered with no manifest edit and no chance of astale list quietly under-reporting the gap.
Conventions this respects
audit/<vendor>/), flat — noaudit/protofire/inherited/.inherited.jsonis the only permitted non-PDF in a vendor dir.roh-scan'sparse_audited_tagstillcaptures
v0.1.1through it, and its hex-token rule cannot matchinherited.REUSE.tomlalready annotatesaudit/**/and.soldeerignorealreadyexcludes
/audit, so no packaging change was needed.reuse lintpasses,31/31 files.
src/generated/is untouched. Snapshots stay frozen and append-only;coverage is asserted about them, never written into them.
Known-red CI, do not chase
testProdDeployArbitrumfails on an exhausted drpc quota, unrelated to thischange (this PR adds no Solidity).
Follow-on, not in this PR
roh-scanat HEAD cannot yet represent this. Itsclassify_anchorearly-returnsa
Tagwithout resolving it, so with these files present the dashboard willagain publish a
daysSinceAuditcomputed off this repo's history and acompareUrlthat 404s. That is a scanner defect these files expose, not onethey create — and it is the reason the convention is a machine-readable manifest
rather than a note. The scanner needs
ExternalAudit::Inherited, manifestparsing, foreign-ref resolution, typed-absent dates, and computed coverage;
rainlanguage/rainix#287's proposed CI gate needs its rule 2 amended so an
inherited.-prefixed PDF validates via the manifest instead of failing on aref that by definition does not resolve here.