Skip to content

fix(aeon-update): don't silently delete a currently-enabled skill retired upstream - #872

Closed
Svector-anu wants to merge 2483 commits into
aeonfun:mainfrom
Svector-anu:fix/aeon-update-warn-enabled-skill-removal
Closed

fix(aeon-update): don't silently delete a currently-enabled skill retired upstream#872
Svector-anu wants to merge 2483 commits into
aeonfun:mainfrom
Svector-anu:fix/aeon-update-warn-enabled-skill-removal

Conversation

@Svector-anu

Copy link
Copy Markdown
Contributor

What

aeon-update's 3-way classifier CLEAN-DELETEs any skills/<name>/ path that upstream removed and the operator never modified locally (S6), but never checks 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 surfaces that — the break only shows up later, when validate-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, and fear-divergence, all three enabled and unmodified locally, which meant a plain git merge upstream/main silently deleted their directories while aeon.yml still 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: true in current aeon.yml) to a CONFLICT instead of a CLEAN-DELETE, with a new reason enabled-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":

### ⚠️ Currently-enabled skills removed upstream
For each CONFLICT with reason `enabled-skill-removed-upstream` (S6):
- `verdikta-hunter` — enabled in your `aeon.yml`, deleted upstream in {commit(s)}. **Not deleted here** so nothing breaks. Pick one: keep it as a fork-only skill going forward (nothing else to do), or disable it in `aeon.yml` to match upstream's current default set.

Also handled the resolve-tracking side: PENDING conflicts 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.sh passes; 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)

aeonframework and others added 30 commits July 27, 2026 16:42
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.
aeonframework and others added 25 commits July 31, 2026 07:59
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.
@Svector-anu

Copy link
Copy Markdown
Contributor Author

@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.

@aaronjmars

Copy link
Copy Markdown
Collaborator

Thanks for this — the actual skills/aeon-update/SKILL.md change is solid. The S6 downgrade to enabled-skill-removed-upstream (instead of a silent CLEAN-DELETE), the S8 resolve rule for entries with no HEAD blob, and the new S9 PR-body section all fit the skill's existing step structure and idioms. Worth landing.

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:

  • Instance-only skill dirs canon doesn't have (fear-divergence, verdikta-hunter, x402-monitor)
  • Run-scratch leaks (.mcp.json, .vuln-probe.sh, .pending-notify-*.md, .pvr-payload.json, cg_*.json, dexs.json, fees.json)
  • ~30 apps/dashboard/outputs/*.json, plus memory/logs/*, memory/skill-health/*, and leaked memory/pending-disclosures/* drafts
  • Instance config drift: STRATEGY.md, aeon.yml, catalog/*, docs/status.md

That pollution is also what's turning CI red — none of it is your SKILL.md change:

  • verify: fear-divergence / verdikta-hunter / x402-monitor have no eyebrowlock.json entry (they only exist on your instance)
  • test: catalog/packs.json reports 78 skills but the README caption says 75 (your instance catalog)

Could you re-cut the branch off clean canon main with only skills/aeon-update/SKILL.md? Something like:

git fetch origin
git checkout -b fix/aeon-update-warn-enabled-skill-removal-v2 origin/main
git checkout <current-branch> -- skills/aeon-update/SKILL.md
git commit -m "fix(aeon-update): don't silently delete a currently-enabled skill retired upstream"

Then force-push (or open a fresh PR). Once it's that single file, CI should go green and this is a merge. Thanks!

@Svector-anu

Copy link
Copy Markdown
Contributor Author

Confirmed the diff — re-cut off clean main per your recipe, verified git diff --stat upstream/main <branch> shows only skills/aeon-update/SKILL.md (1 file, +8/−2) before pushing. Opened #874 with just that commit. Closing this one.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants