Repository navigation
panic-attack estate sweep — 2026-05-26 #32
Copy link
Copy link
Closed
Description
panic-attack estate sweep — 2026-05-26
Owner: @hyperpolymath
Scope: 284-repo estate at ~/developer/repos/
Driver: panic-attack assemblyline + per-repo panic-attack assail --headless + manual triage
Summary
Estate-wide panic-attack scan run on 2026-05-26 using canonical panic-attack v2.5.0 binary. Findings turned into narrow per-(repo × file × category) PRs.
- Generic modes (everywhere):
assail(static analysis, 49 langs, PA001–PA025),assault(where binary materialises). - Specialised modes (case-by-case):
bridge triage --offline(Cargo.lock repos),signatures(C/C++/Rust unsafe-heavy),temporal(where prior snapshots exist). - Proof repos (13): assail-only first pass; proof-file fixes go through DRAFT PR + local rebuild verification.
Guardrails honoured
- ❌
features/panic-attacker/stub dirs untouched (references to canonical tool, not separate copies). - ❌
vcl-ut/_wt-vclut*worktrees untouched (parallel session). - ❌
hypatia/.claude/worktrees/agent-*untouched (locked agent sessions). - ❌ ephapax
_wt-eph-*worktrees untouched (proof-debt parallel work). - ❌ Known parked debts NOT refiled (ephapax preservation
formal/Semantics.v:3327, betlangsubstTop_preserves_typing, boj-server class-J primitives). - ✅ Honour each repo's
audits/assail-classifications.a2ml. - ✅ All commits GPG-signed; no auto-merge; base=main; SSH remote for
.github/workflows/edits.
Baseline (2026-04-12 system-image)
- 303 repos scanned
- 15,554 weak points (1,898 critical)
- 29.7M lines / 21,018 files
This sweep
Filled in after Pass 1 completes.
- Repos scanned: …
- Repos with findings: …
- Total weak points: …
- Critical: …
- High: …
PRs filed
Updated after each batch.
| # | Repo | PR | Category | File / Module | Status |
|---|---|---|---|---|---|
| 1 |
Issues filed (findings requiring redesign / human judgement)
| # | Repo | Issue | Category | Notes |
|---|---|---|---|---|
| 1 |
Proof-aware PRs (DRAFT until rebuild passes)
| # | Repo | PR | Proof file | Rebuild status |
|---|---|---|---|---|
| 1 |
Findings parked (already tracked elsewhere)
- ephapax preservation (Semantics.v:3327) →
ephapax-preservation-closure-plan - betlang substTop_preserves_typing → discharge recipe in betlang#27
- boj-server class-J primitive axioms →
boj-server-backend-assurance-harness
Related work proposed
- panic-attack: complete VeriSimDB hexad persistence (issue to be filed). The current campaign hits the JSON ceiling —
AssemblylineReport.results[].reportis#[serde(skip)]so per-finding detail needs a second pass; cross-run PR-state has no native datastore. Finishing the VeriSimDB integration (60% → 100%) would make this kind of campaign cheaper to run next time.
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels
Activity
hyperpolymath commentedon May 26, 2026
panic-attack estate sweep — 2026-05-26 (status update)
Owner: @hyperpolymath
Scan tool:
panic-attackv2.5.0 built 2026-05-26Driver: per-repo
panic-attack assail --headless --output <repo>.jsonwith 90s timeoutScan results
audits/assail-classifications.a2ml)PRs filed (this session)
Total this session: 7 PRs, 194 findings classified.
Remaining work — next-session queue
Track A — legitimate-FFI classifications (high-confidence, batch-able)
cartridges/*samples/is reference code; classificationimpl/rust-cli/src/Track B — real bug fixes (need code edits, not classification)
The triage bucketed 457 "autofix" candidates but most are actually legitimate-FFI. After Track A's classifications land, the true real-defect remainder is likely <50 findings. These are:
Triage script bucket distribution needs re-run after Track A to see what's left.
Track C — issue-only findings (1,777)
Will be filed as GitHub issues, not PRs (need human judgement):
Track D — proof-aware PRs (243)
DRAFT PRs with local proof-rebuild verification, 13 proof repos:
Track E — assault (dynamic) + specialised modes
Not run this session. Per plan:
assaultper repo with binary-build attempt (cargo/go/idris2/agda/coq/lean/dune)bridge triage --offlinefor repos with Cargo.locksignaturesfor C/C++/Rust/unsafe-heavy repostemporalwhere prior VeriSimDB snapshots existSkipped repos (19, no further action)
Most are content-only repos (lists, archives, docs).
repos-monorepodid time out (likely proof-heavy or huge); revisit with longer timeout.Guardrails honoured this session
Gstatus)--no-verify/--no-gpg-signfeatures/panic-attacker/stub dirs untouched (canonical-tool references)gossamer/main(workflow hardening, unpushed) preserved by branching fromorigin/mainCampaign workspace
/tmp/panic-attack-campaign-2026-05-26//tmp/panic-attack-campaign-2026-05-26/per-repo/*.json/tmp/panic-attack-campaign-2026-05-26/02-plan.jsonaudit: extend cartridge bundle to subsume backend FFI (#153)
audit: extend bindings classification to PA009 + PA003 false positive…
hyperpolymath commentedon May 26, 2026
panic-attack estate sweep — 2026-05-26 (session 2 update)
Owner: @hyperpolymath
Scope this session: Tracks A, B, and C from the next-session queue.
Session 2 output summary
Jwt.verifyJwtskips signature verification — critical)Track A (FFI / systems unsafe classifications)
Track A skipped:
polystack(repo archived, read-only).Track B (real-bug remainder)
Jwt.verifyJwtclaims to verify but skips signature check;AuthMiddlewarebypass on both OIDC and no-OIDC pathsAfter Track A classifications drained ~497 UnsafeCode/UnsafeFFI findings as legitimate FFI/fixtures, and Track B classifications drained ~21 more on proven's PA009 + PA003 (false positives), and idaptik#98 covered 12 game fixtures, the genuine real-bug remainder shrunk much smaller than estimated. The remaining real bugs need human design judgement and are tracked via Track C tracking issues (per repo).
Track C (per-repo human-triage tracking issues)
35+ issues filed. Each lists Critical/High findings by category (excluding PA001/PA007 covered by Track A; excluding ProofDrift covered by Track D).
Track C skipped repos:
julia.jlsub-repos (Julia chapter closed per project memory — covered viajulia-ecosystemcontainer issue chore(deps): bump colored from 2.2.0 to 3.1.1 #6)hypatia(active working tree with 280+ untracked files; would require careful out-of-tree handling)polystack(archived on remote)linguist,rescript,HOL(issues disabled on the GH repos — they're forks)hyperpolymath-archive,standards-as-port(repo deleted on GH; local-only or worktree)Track D (proof-aware tracking issues)
Filed lightweight tracking issues rather than DRAFT-fix PRs (the proof-rebuild-per-finding cost is too high for one session).
Track D not filed:
ephapax(parked debt: preservationSemantics.v:3327, per memory)boj-serverSafetyLemmas.idr5 believe_me's (parked class-J primitive axioms)agda-stdlib(upstream agda/agda-stdlib clone, nohyperpolymath/fork)proven(proof-file findings already classified via PR chore(ci): replace secret-scanner.yml with reusable wrapper #67)echo-types,kategoria,frayed-knot-toolkit,zerostep,burble,ochrance(0 active ProofDrift)Track E (assault + specialised modes)
Not started this session. Deferred to follow-up. Per the campaign plan, this involves:
assaultper repo with binary-build attempt (cargo / go / idris2 / agda / coq / lean / dune)bridge triage --offlinefor repos with Cargo.locksignaturesfor C/C++/Rust/unsafe-heavy repostemporal diffwhere prior.verisimdb/snapshots existExpected output: another wave of dynamic/runtime findings layered on top of the static
assailview.Guardrails honoured this session
Gstatus verified per repo)--no-verify/--no-gpg-signfeatures/panic-attacker/stub dirs untouched_wt-vclut*, hypatia.claude/worktrees/agent-*, ephapax_wt-eph-*— all untouchedSemantics.v:3327), betlangsubstTop_preserves_typing, boj-server class-J — not refiled.jlissues filed; container-onlyorigin/mainOutstanding follow-ups
Campaign workspace
/tmp/panic-attack-campaign-2026-05-26/per-repo/*.json/tmp/panic-attack-campaign-2026-05-26/02-plan.json00-per-repo.sh,00b-nested.sh,01-triage.ts,file-ffi-pr-v2.shhyperpolymath commentedon May 26, 2026
panic-attack estate sweep — 2026-05-26 (session 2 — Track E update)
Track E (assault + specialised modes) ran after Tracks A/B/C/D in this same session.
Track E summary
bridge triage(CVE + reachability)signatures(use-after-free / deadlock)temporal diff.verisimdb/directories in the estate contain verisimdb-service deployment configs, not temporal-snapshot data (verisimdb-data/temporal-index.jsondoesn't exist). Real temporal coverage depends on panic-attack#33 (VeriSimDB hexad persistence) landing.assault(dynamic)Bridge triage CVE issues (24)
(Some rows merged for brevity — full table is 29 entries.)
Recommended follow-up actions
Most bridge findings are phantom-imports (deps declared in
Cargo.tomlbut never imported in any.rsfile). The recommended action per finding isRemove unused dependency— a low-risk no-behaviour-change Cargo.toml edit. Highest-impact next step:phantom-classification CVE: open a small PR removing the unused dep fromCargo.toml. This is mechanical and could potentially be batched estate-wide.reachable-classification CVEs (the actually-dangerous ones): bump the dep version inCargo.tomlandCargo.lockto thefixed_versions[0].Campaign workspace addendum
/tmp/panic-attack-campaign-2026-05-26/bridge/*.jsonEnd-of-session summary (across all 5 tracks)
All five tracks substantially closed-out for this campaign. Carry-forward queue:
hyperpolymath commentedon May 26, 2026
panic-attack estate sweep — 2026-05-26 (Phase 5 closure)
Phase 5 / Track D conclusion
All 7 ProofDrift findings across the 3 proof-aware repos triaged. Zero require actual proof discharge — each is either a legitimate axiom with inline justification or a panic-attack PA021 detector false positive.
\<open>...\</close>and@{text ...}comment antiquotationsTrack D tracking issues closed: echidna#105, tropical-resource-typing#3, standards#181 — superseded by the classification PRs.
Side product: detector bug filed upstream
panic-attack#43 — PA021 false-positive bug: the Isabelle detector counts
sorry/oopsinside\<open>...\</close>and@{text ...}markup. Fix sketch: skip those antiquotations andtext \<open>...\</close>declarations. The same blind spot probably affects Agda/Coq/Idris docstring-mentions of the equivalent keywords and warrants a re-audit of the corresponding detector cases.Mid-session correction noted
The first echidna PR commit accidentally overwrote 14 pre-existing FFI-boundary classification entries on
audits/assail-classifications.a2ml. Fixed in a follow-up commit (fix: restore pre-existing FFI-boundary classifications); the PR now sits at 16 entries (14 original + 2 new PA021). Future per-repo classification PRs shouldgit show origin/main:audits/assail-classifications.a2mlbefore truncating.Tracks status summary
audit: classify 4 PA021 ProofDrift comment-text false positives (#4)
audit: classify 2 PA021 legitimate mathematical axioms (funext + Conf…
hyperpolymath commentedon May 26, 2026
panic-attack estate sweep — 2026-05-26 (Lanes 1–3 closure)
After the Phase 5 closure I continued through the three lanes in the user's stated order: 2 → 1 → 3.
Lane 2 — svalinn JWT verification fix (done)
svalinn#14 — wires real
crypto.subtle.verifyagainst the kid-resolved JWK, builds the signing input viaTextEncoderfrom the raw base64url segments, with an algorithm allow-list (RS{256,384,512}/PS{256,384,512}/ES{256,384,512}/EdDSA; rejectsnoneand anything unrecognised).Test results: 29/29 auth tests pass (was 17/12 split on main).
Surprise discovery during implementation: the original
verifyJwtdid not silently accept forged tokens — its compiled JS referenced undefined variables (decoded,header) because ReScript's%rawblocks are opaque to its optimiser. Every call threwReferenceError. The middleware's catch-block turned that intoauthenticated: false, so JWT auth was fail-closed by accident, not by design. The same%raw-opaqueness pitfall was present in:base64UrlDecode(bound_i,%rawreferencedi)OAuth2.generateState(arrayvar elided)OAuth2.URLSearchParams(module placeholder shadowed the global constructor in compiled JS)All four fixed in one PR. Posted reassessment comment on svalinn#12.
Lane 1 — phantom-import deletion PRs (pivoted)
Planned: open small no-behaviour-change PRs removing unused deps from
Cargo.tomlfor the 157 phantom-classified bridge findings.What happened: all 28 phantoms in a 6-repo sample turned out to be transitive deps (pulled in by upstream crates, never declared in any local
Cargo.toml).bridge triage's"Remove unused dependency from Cargo.toml"action assumes direct dependency and is wrong for transitive cases.cargo updatedoesn't help — the bad versions are at the latest crates.io constraint upstream allows.Filed panic-attack#47 documenting the misclassification with a fix sketch (detect direct vs transitive via Cargo.toml-key check; emit a different action for transitives).
Net: the underlying classification (
informational+phantom= code unreachable) is correct; the recommended action is just misleading. No PR work to do; findings are already documented as informational in the Track E tracking issues.Lane 3 — assault + specialised modes (mostly N/A)
bridge triagesignaturestemporalverisimdb-data/temporal-index.jsonexists anywhere in the estate (the 4.verisimdb/dirs found are verisimdb-service deployment configs, not snapshot data)assault--helpreturn 100% robustness because attacks never land. Not estate-wide automatable; each target is its own session. Triedpanic-attackself-assault as a smoke test (light intensity, 5s/axis, cpu+memory): 0 crashes, 0 signatures, 100% robustness — as expected for a fast-exit CLI.Bugs filed upstream this session
All tasks status
The campaign is now bounded by owner-side throughput (review/merge the 18 open classification + fix PRs, triage the 60+ tracking issues, decide on the open panic-attack design and bug issues).
docs(campaigns): add 2026-05-26 estate sweep report (human + machine)
docs(campaigns): add 2026-05-26 driver scripts + README
hyperpolymath commentedon May 26, 2026
Estate sweep campaign — close-out
The 2026-05-26 estate sweep is now documented, committed, and pushed end-to-end.
Documentation
docs/campaigns/2026-05-26.md— human-readable summary (178 lines)docs/campaigns/2026-05-26.a2ml— machine-readable A2ML (379 lines,campaign-report v1.0.0schema)docs/campaigns/2026-05-26/— driver scripts (00-per-repo.sh,00b-nested.sh,01-triage.ts,file-ffi-pr-v2.sh) + README explaining gotchas and re-run procedureFinal tally across both sessions
%raw-opacity bugs; 29/29 auth tests pass)Upstream bugs filed against panic-attack
sorry/oopsinside Isabelle docstring antiquotationsbridge triage"Remove unused dependency" action wrong for transitive depsLocal state
docs/campaigns/2026-05-26/).fix/idris-lang-chapel-not-c(PA021 Isabelle detector fix in progress) preserved in a labelled stash on that branch.What remains (owner-side)
fix/idris-lang-chapel-not-c).Issue #32 is safe to close once this campaign-report PR (#48) lands — no further agent-side work is queued against it.
audit: classify 6 FFI/systems unsafe findings as legitimate (PA001/PA…
audit: classify 8 FFI/systems unsafe findings as legitimate (PA001/PA…
audit: classify FFI binding unsafe blocks as legitimate (PA001/PA007,…
9 remaining items
audit: classify 10 FFI/systems unsafe findings as legitimate (PA001/P…
feat(bridge): split phantom into phantom-declared vs phantom-transiti…
audit: classify Track C panic-attack findings (#155) (#175)
audit: classify Track C panic-attack findings (#138) (#271)
audit: classify Track C residuals + pin flake (closes #33) (#52)
docs(audits): FFI boundary §§9-11 (FLINT + Zig bridges + Zig overlay) —
chore(security): classify panic-attack assail dogfood fixtures + test…
security: triage Track C panic-attack findings (#68) — fix stubs.c, c…
fix(panicbot): pass --headless and strip banner so panic-attack >= 2.…
audit: record verified panic-attack 2.5.5 scan results (follow-up to #…
fix(panicbot): pass --headless and strip banner so panic-attack ≥ 2.5…
fix(assail): null-check-aware UncheckedAllocation + precise eval dete…
docs: record assail precision fixes in CHANGELOG + STATE.a2ml (#149)
audit: classify 24 FFI unsafe findings as legitimate (PA001/PA007) (#127