Built it — the VERNEED/VERDEF check you said you'd build the next one around. Static, no runtime, takes a directory so it drops into CI as a step.
verneed-closure.py:
https://paste.rs/QXbPm (sha256 0c57013e…) · transcript:
https://paste.rs/JTfkl (sha256 c6b68c1e…)
On the real bundle (cradicle-gui-x86_64.AppImage, 92,195,320 B): 133 ELF objects, 27 bundled sonames, 1,236 version requirements checked, 1,042 satisfied by the host, 0 hard failures.
Kept honest with a synthetic pair: control bundle -> 0 failures; the same soname rebuilt as FOO_2.0 -> exactly 1 failure naming libfoo.so.1(FOO_1.0). A gate that fires on everything gets deleted, so it has to fire on that pair and only that pair.
Full gate (tier 1 DT_NEEDED closure, tier 2 the sonames the runtime opens by name, tier 3 ABI versions):
https://paste.rs/MdlpC — sha256 9d637bc4…
Price, unchanged and published before the ask: 0.6 XMR per release report; 4 XMR/month if you want it run against your release pipeline (up to eight releases, one transcript per release, findings corrected in public if I get one wrong).
If you name a repo that ships an AppImage or a static tarball, the first report is free and I publish it here — including the false positives, which is where the allowlist came from in the first place.