You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Lesson Add deep-review skill for iterative code review #5 applied: orchestrator ran cargo-audit directly. Clean vs CI ignore list. Zero agent needed. (Crates.io 403 on yank-check was harmless — vuln scan completed exit 0.)
F2 root-cause matched [GEN-07] All UI action handlers swallow errors with no toast / log #350's class. Sibling issues across closed-fix-scope mismatches keep surfacing — last run's AUD-2 was that pattern (sec-authperm scope-gate forgotten in read_resource). This run: handlers.rs got warn_and_toast but components/ was missed. Pattern: closing an issue against one file leaves siblings in adjacent files.
What didn't
F2 only surfaced because I ran a final "swallowed errors in new code" sweep. The standard sweep set (unsafe/dbg/eval/anyhow/lock-ok/Vec caps) wouldn't have caught it; let _ = h.<method>().await is a UX/observability pattern, not a security one. Add to standard sweep grep set.
No sub-issue linking step in the skill — I had to call mcp__github__sub_issue_write manually after creating issues. Worth codifying.
No verification of "did the fix in PR X actually resolve the open issue" step. Audit skill currently treats closed issues as fixed; but PRs sometimes close issues with partial fixes (e.g. [DEP-12] Deploy step does not pin trunk version (cargo install trunk --locked) #319 closed with deploy.yml-only fix, leaving Docker pipeline scope unaddressed → F1 today). Sibling-of-closed pattern needs explicit hunting.
Cargo-audit registry 403 noise. Crates.io yank-check fails offline / behind proxy; main scan still works. Already using -n (--no-fetch) helps but doesn't suppress yank-check 403s. Consider documenting "ignore yank-check noise" or adding flag.
Suggested edits to .claude/skills/general-audit/SKILL.md
Add let _ = .<method>().await to the standard sweep grep set. Specifically: rg "let _ = [a-z_]+\.[a-z_]+\(.*\)\.await" crates/web/src/components/. F2 wasn't in the prior sweep list. .ok(); ([TD-04] .ok() silently swallows ~16 errors in listeners.rs event-pump hot loop #253-class) is already there; let _ = await is a sibling and should be too.
Add an explicit "sibling-of-closed" pass. Before declaring synthesis complete, look at issues closed since the last audit master and check whether the fix scope was narrower than the bug class. Pattern: gh pr list --state merged --base main --json number,title,closingIssuesReferences, then for each closed issue, scan the codebase for siblings of the original symptom outside the fix scope. F1 (deploy.yml fix didn't cover Docker) and F2 (handlers.rs fix didn't cover components/) both fit.
Codify mcp__github__sub_issue_write linking as a numbered step. Currently the skill says "master issue + child issue per finding" but doesn't tell the orchestrator to wire them as GitHub sub-issues. Sub-issue linking surfaces children in master's UI panel.
Update threshold from general-audit lessons: 2026-04-27 (run 2) #438's "<50 files" suggestion. Today's run was 52 files (just over) and orchestrator-direct still worked. Bump to "<100 files" or "<2000 LOC diff" — the real bottleneck is finding density per file, not file count.
Sweep templates in skill body. Lessons accumulate but the actual sweep commands live in the orchestrator's head. Move the standard rg/grep sweep set into SKILL.md as a concrete checklist:
Lessons from
/general-auditrun @958e1ec(#474). Built on lessons #426 + #438.What worked (from #438 suggestions, now validated again)
TopicAnnounce.topics: Vec<String>has no element-count cap; enables relay CPU amplification + topic-slot exhaustion #235, SEC-V-07 [SEC-V-07]RotateChannelKey.encrypted_keys+Event.depsvectors have no element caps #236, DEP-02 [DEP-02] Docker images use unpinnedrust:latest/rust:slim/nginx:alpinetags #313, all cargo-audit warnings).read_resource). This run: handlers.rs gotwarn_and_toastbut components/ was missed. Pattern: closing an issue against one file leaves siblings in adjacent files.What didn't
let _ = h.<method>().awaitis a UX/observability pattern, not a security one. Add to standard sweep grep set.mcp__github__sub_issue_writemanually after creating issues. Worth codifying.trunkversion (cargo install trunk --locked) #319 closed with deploy.yml-only fix, leaving Docker pipeline scope unaddressed → F1 today). Sibling-of-closed pattern needs explicit hunting.-n(--no-fetch) helps but doesn't suppress yank-check 403s. Consider documenting "ignore yank-check noise" or adding flag.networkcrate critically under-tested for transport-layer code #340 [TEST-03]relaycrate thinly tested for a network-exposed component #341) cover prior gaps. Felt right; not rigorous.Suggested edits to
.claude/skills/general-audit/SKILL.mdAdd
let _ = .<method>().awaitto the standard sweep grep set. Specifically:rg "let _ = [a-z_]+\.[a-z_]+\(.*\)\.await" crates/web/src/components/. F2 wasn't in the prior sweep list..ok();([TD-04].ok()silently swallows ~16 errors inlisteners.rsevent-pump hot loop #253-class) is already there;let _ =await is a sibling and should be too.Add an explicit "sibling-of-closed" pass. Before declaring synthesis complete, look at issues closed since the last audit master and check whether the fix scope was narrower than the bug class. Pattern:
gh pr list --state merged --base main --json number,title,closingIssuesReferences, then for each closed issue, scan the codebase for siblings of the original symptom outside the fix scope. F1 (deploy.yml fix didn't cover Docker) and F2 (handlers.rs fix didn't cover components/) both fit.Codify
mcp__github__sub_issue_writelinking as a numbered step. Currently the skill says "master issue + child issue per finding" but doesn't tell the orchestrator to wire them as GitHub sub-issues. Sub-issue linking surfaces children in master's UI panel.Drop or fold the "8-agent fan-out" example block from SKILL.md. Three runs in a row (general-audit: main @ 401e2fc (2026-04-27) #413 8-agent failure, general-audit: main @ 00aa515 (2026-04-27) #437 0-agent success, general-audit: main @ 958e1ec (2026-04-28) #474 0-agent success) confirm orchestrator-direct is the new default. Lessons general-audit lessons: 2026-04-27 #426/general-audit lessons: 2026-04-27 (run 2) #438/general-audit: main @ 958e1ec (2026-04-28) #474 all suggest this. Time to stop coaching the failed pattern.
Update threshold from general-audit lessons: 2026-04-27 (run 2) #438's "<50 files" suggestion. Today's run was 52 files (just over) and orchestrator-direct still worked. Bump to "<100 files" or "<2000 LOC diff" — the real bottleneck is finding density per file, not file count.
Sweep templates in skill body. Lessons accumulate but the actual sweep commands live in the orchestrator's head. Move the standard rg/grep sweep set into SKILL.md as a concrete checklist:
This makes the audit reproducible across runs without orchestrator memory.
Numbers
postMessagepayload accepted withoutkind/ origin check #244 (3a230c5/sw bridge extract)Action
Human (or follow-up routine) to fold suggested edits into
.claude/skills/general-audit/SKILL.md. Highest leverage: edits #1 (sweep grep set), #2 (sibling-of-closed pass), #6 (sweep template).