fix(aeon-update): don't silently delete a currently-enabled skill retired upstream - #872
fix(aeon-update): don't silently delete a currently-enabled skill retired upstream#872Svector-anu wants to merge 2483 commits into
Conversation
vuln-scanner's real workload (clone + 4 scanners + read-and-judge every candidate finding) confirmed making steady progress under grok, not stuck, when it hit the old 30min ceiling at both grok-build (29m40s, run 30286119301) and grok-composer-2.5-fast (29m36s, run 30293736616). Both dispatches were still working, not hung -- they just needed more room. Fleet-wide change (single job-level setting, not scoped per-skill), so every scheduled skill gets the extra headroom, not just this one.
Confirmed-live Solana/Anchor security tooling (Trident fuzzer, Certora Prover formal verification, cargo-audit/clippy, solsec) and a 6-step vulnerability-hunting workflow for VeiloSolana/privacy-program, ahead of a Trident/Certora re-pass. sec3 X-ray and Soteria confirmed dead (404s); every EVM-named tool (Slither/Echidna/Foundry/Mythril/Aderyn/ Halmos) doesn't parse Anchor and is ruled out explicitly so it isn't re-investigated later.
* chore: update auto-workflow config * chore: update .mcp.json from dashboard
Ran Trident stateful fuzzing per the bug-hunt playbook's step-1 tool priority. Key finding: every fund-moving instruction is gated by Groth16 proof verification before any state mutation, and the circuit/ proving-key artifacts are intentionally excluded from the repo — so no fuzzer can forge a valid proof to reach the nullifier/merkle/vault logic. Fuzzed the reachable non-proof-gated admin surface instead (~100k instruction invocations, 0 panics, 0 invariant violations). - memory/vuln-scanned.json: new scan entry with full methodology/results - memory/topics/veilo-bug-hunt-playbook.md: scoping finding + reusable toolchain notes (deref_nullptr lint fix, trident fuzz run CWD requirement, TridentSVM signature-verification behavior) - memory/logs/2026-08-08.md: run log Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DLaHamXr14e2qDnNNd5gnS
Corrected course from ad-hoc cargo tooling to a plain git compare against the last-audited commit, which surfaced that the clone was 3 commits ahead of every prior pass. Of those: one docs fix, one trivial config change, and one is the Veilo team's own hardening commit for exactly the close_position gap the 2026-07-31 scan had flagged as a non-exploitable observation — corrected the playbook's framing to credit that as their fix, not an independent finding. Re-ran Aeon's actual vuln-scanner Arm A stack (osv-scanner, semgrep, trufflehog — see scripts/prefetch-vuln-scanner.sh) fresh against current HEAD: still 0 new findings. Still 0 confirmed exploitable bugs overall after 5 manual passes, a Trident fuzz campaign, 2 targeted manual sweeps, and this diff-and-rescan pass. - memory/vuln-scanned.json: new scan entry, corrected framing - memory/topics/veilo-bug-hunt-playbook.md: git-diff-first lesson + sanctioned-stack results - memory/logs/2026-08-08.md: run log Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DLaHamXr14e2qDnNNd5gnS
… fuzzing Ran the sanctioned Arm A stack (semgrep/trufflehog/osv-scanner) against firecrawl/anydoc, then its own pre-built cargo-fuzz targets seeded from its test fixtures. - RUSTSEC-2026-0187 (public stack-overflow DoS, lopdf 0.41.0) is reachable through anydoc's PDF path via pdf-inspector 0.1.7. The fix exists upstream but was never released — filed firecrawl/pdf-inspector#310 and firecrawl/anydoc#67 (cross-linked). - The xlsx fuzz target crashed within seconds on a genuine, previously unknown integer-overflow panic in calamine 0.36.1's range parser. DoS-only (no memory-safety impact), root-caused, fixed with checked arithmetic matching the file's own existing convention, regression test added, verified against the exact crash artifact. Opened tafia/calamine#705. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DLaHamXr14e2qDnNNd5gnS
ran the actual skill (POST /match with real capabilities, not a raw bounty list dump). 25 matches, 13 already seen in the last 14 days (veilo-bounty included, still open but not new), 12 new IDs all triaged out as content/engagement work in disguise - none map to real code/security/dependency work. no notification, per the skill's own silence rule. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DLaHamXr14e2qDnNNd5gnS
…ty triage osv-scanner flagged 31 vuln rows across 10 packages, several looking severe (better-auth account-takeover GHSAs, drizzle-orm SQL injection). none survived tracing actual reachability: better-auth's vulnerable copy is isolated to a devDependency CLI tool, never shipped to production, while the real runtime dependency is already on the patched version; drizzle-orm/hono/dompurify/mermaid have zero source-level imports anywhere in the app and are dead transitive weight from an unused better-auth adapter (this app actually uses prisma); sharp is a plausible-but-unconfirmed lead, not filed. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DLaHamXr14e2qDnNNd5gnS
maintainer flagged it; aeonfun#696 predates mine by two weeks and is already further along (reworked once per their feedback). closed aeonfun#705 rather than making them choose between two PRs for the same bug. added the lesson to memory: check a target's own open PRs/issues for the exact bug class before filing, not just its advisory history. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DLaHamXr14e2qDnNNd5gnS
…c filing tafia/calamine#705 got closed as a duplicate of aeonfun#696 (predated ours by two weeks, same root cause) - the maintainer had to catch it, we should have. checked every other skill that files/creates something (create-skill, search-skill, skill-repair, repo-scanner, feature) and all of them already gate on "does this exist already" - vuln-scanner was the one skill in the security pipeline that never got it, and it's the one filing into repos it has zero history with. adds: - a prior-art check before any public PR/issue: one gh search call against the target's own open+closed+merged issues/PRs, keyed on the exact function/symbol name, judged (not just counted) before treating a hit as a duplicate. verified the mechanism against the real calamine case before writing this - one call surfaces aeonfun#696 and the original bug report aeonfun#694. - a required "Verification" block (repro command, before/after, environment) for any public filing that isn't a plain CVE lockfile bump, so a maintainer can confirm a finding in under a minute instead of re-deriving it. - dropped the "Filed by Aeon" footer from the PR template - branding has no place in a finding a maintainer is trying to verify. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DLaHamXr14e2qDnNNd5gnS
…heck vuln-scanner: prior-art check + verification block before public filing
Operator manually filed the staged disclosure via GitHub's PVR form after the Aeon token hit a 403 trying to submit via API. Real advisory: GHSA-23q3-cxcv-ccc9 (state: triage, severity: low).
# Conflicts: # .github/workflows/aeon.yml # .github/workflows/messages.yml # aeon.yml # apps/dashboard/lib/constants.ts # catalog/skills.json # docs/ClawHunter-API.md # scripts/notify.sh # scripts/notify_format.py # scripts/postprocess-email.sh # scripts/prefetch-xai.sh # scripts/run-grok.sh # scripts/skill_mode.sh # scripts/tests/test_notify_format.py # skills/hunter-22/SKILL.md # skills/narrative-tracker/SKILL.md # skills/vuln-scanner/SKILL.md
…ired upstream The 3-way classifier CLEAN-DELETEs any skills/<name>/ path that upstream removed and the operator never modified locally - but never checked whether <name> is still enabled: true in the operator's own aeon.yml. A PR from this skill could delete an actively-scheduled skill's directory while aeon.yml still references it, and nothing in the PR review would flag it; the break only surfaces later, when validate-config.js's skill-refs check (or the skill's own next scheduled run) fails. Hit this for real doing a manual upstream sync: three skills this instance had enabled (verdikta-hunter, x402-monitor, fear-divergence) were retired in a large upstream restructure, unmodified locally, and would have been silently deleted by a plain merge. Downgrade this case to a CONFLICT (reason: enabled-skill-removed-upstream) instead of deleting, and surface it as its own loud PR-body section so the operator can't merge past it without noticing.
|
@aaronjmars while you're looking at this one — separate from the fix itself, I wanted to flag that I'd be interested in helping out with devex/DevRel if there's room for it, informal or otherwise. quick track record, not a pitch on potential:
what I'd bring: I already run the "run it hard, find what breaks, fix it, ship it" loop on my own instance daily, and I'm happy to keep doing that publicly — writeups, threads, walking other devs through setup — pointed at whatever's the current priority (skill-ecosystem growth looks like the focus from the last few weeks of commits). no pressure to respond here specifically, just wanted it on your radar. happy to talk whenever works. |
|
Thanks for this — the actual The blocker is the branch itself, not the change. The PR body says "docs-only, one file, no code/schema/frontmatter," but the diff is 132 files, +18,277 −92 — it looks like the branch was cut from a live instance clone, so it's dragging that instance's whole divergence on top of the one doc edit:
That pollution is also what's turning CI red — none of it is your SKILL.md change:
Could you re-cut the branch off clean canon Then force-push (or open a fresh PR). Once it's that single file, CI should go green and this is a merge. Thanks! |
|
Confirmed the diff — re-cut off clean |
What
aeon-update's 3-way classifier CLEAN-DELETEs anyskills/<name>/path that upstream removed and the operator never modified locally (S6), but never checks whether<name>is stillenabled: truein the operator's ownaeon.yml. A PR from this skill could delete an actively-scheduled skill's directory whileaeon.ymlstill references it, and nothing in the PR review surfaces that — the break only shows up later, whenvalidate-config.js's skill-refs check (or the skill's own next scheduled run) fails.Why
Hit this for real doing a manual upstream sync on a live instance: the recent restructure (#647) retired
verdikta-hunter,x402-monitor, andfear-divergence, all three enabled and unmodified locally, which meant a plaingit merge upstream/mainsilently deleted their directories whileaeon.ymlstill had them scheduled. Had to manually cross-reference every clean-deleted skill against the live config to catch it before merging.Fix
Downgrade this specific case (removed upstream + unmodified locally +
enabled: truein currentaeon.yml) to a CONFLICT instead of a CLEAN-DELETE, with a new reasonenabled-skill-removed-upstream. The skill directory stays untouched, and the PR body gets its own loud section for this case instead of it disappearing into "Applied cleanly":Also handled the resolve-tracking side:
PENDINGconflicts normally resolve by comparing local vs. the upstream HEAD blob, but this reason has no HEAD blob (the path is deleted upstream) — added the correct resolution rule (resolved once the operator disables the skill, or upstream re-adds a path of that name).Scope
Docs-only change to
skills/aeon-update/SKILL.md— no code, no schema, no frontmatter changes.check-skill-categories.shpasses; frontmatter untouched.Provenance
AI provider/model: anthropic / claude-sonnet-5
Client / agent tooling: Claude Code, direct interactive session (not a Slop/measured skill run — this is the aeonfun/aeon repo itself, not an elizaOS contribution-program project)