How aeon is built - the operator config, identity and memory, and channels that feed a runtime spine on GitHub Actions, the seven-way LLM gateway cascade, the self-healing loop, and fleet replication.

aeon runs the perception → action → observation loop unattended on GitHub Actions - 183 scheduled skills, persistent memory, a self-healing repair loop, and fleet replication. Here is the whole system as one map: what feeds the runtime, how a single run flows, and how every model call fails over.

01 / The full picture

One map, three bands

Three input layers sit across the top - the operator config you set, the identity and memory the agent reads, and the channels and MCP servers it talks through. They feed a single left-to-right runtime spine. The spine drops into the model gateway, a fleet it can spawn, and a loop that heals it. Configure once; it runs the rest unattended.

For devs · The scheduler (messages.yml, */5) picks the first matching skill in aeon.yml and dispatches the aeon.yml runner. CLAUDE.md, STRATEGY.md, soul/ and memory/ load into context; any .mcp.json servers register as tools. Output commits back to the repo and fans out via ./notify; scored runs feed the self-healing loop, and spawn-instance/fleet-control extend the fleet.

01Operator Layer
Dashboard

Next.js · localhost:5555 · Auth · Packs · Schedules

aeon.yml

Skills · cron · chains · reactive triggers

02Identity & Knowledge
CLAUDE.md

Agent identity · auto-loaded every run

Strategy + Soul

North-star · voice · rides every run

Memory Store

MEMORY.md · topics · logs · issues - committed to repo, persists across runs

03Channels & Interfaces
((·))./notify

Telegram · Discord · Slack · Email

Inbound

5-min poll or ~1s webhook

.mcp.json

GitHub · Base · custom MCP servers auto-loaded into runs

configures
feeds context
registers tools
Runtime - Perception · Action · Observation · unattended on GitHub Actions
Scheduler

messages.yml · cron */5 · picks 1st matching skill

Auth Gate

Fleet Watcher · ALLOW / BLOCK preflight

Skill Runtime

Claude Code runs the matched SKILL.md prompt

coreresearchdevmarketshoundsocialfleetproductivityagent-ops
Tools

bash · gh · web

searchfetchmcp
Output

PRs · Pages + RSS · notify · dashboard feed

⇄ LLM Gateway Cascade
claudeanthropicopenrouterbankrusepodvenicesurplusdirect· auto-failover
scores & repairs
spawns & exposes
04Self-Healing Loop
heartbeat

3×/day · detects failed or chronically broken skills

±health + evals

Haiku scores 1–5 · assertion regression tests

repair → self-improve

Health skills file issues · repair skills close them · prompts evolve

05Fleet & Interop Layer
spawn-instance

Forks a specialized copy · isolated billing

fleet-control

Health-check & dispatch across instances

MCP server

Skills as Claude Desktop tools

A2A server

LangChain · AutoGen · CrewAI · any agent

live / runtime active node store / idle current flows reactive / conditional
02 / Wired live

The same map, as a circuit

The same system again, drawn as a live circuit - the coral pulses trace how a run actually moves through it: in from the inputs, along the spine, out to the loops.

configurescontextregisters toolspreflightspawnsscores 1–5
aeon.ymlschedules · chains · reactive
ContextCLAUDE · STRATEGY · soul · memory/
.mcp.jsonGitHub · Base · custom
Schedulercron */5 · 1st match
Auth GateALLOW / BLOCK
Skill RuntimeClaude Code runs SKILL.md
Toolsbash · gh · web
OutputPRs · Pages · notify
Fleet & interopspawn · fleet-control · MCP · A2A
LLM Gateway7-way · auto-failover
Self-healingheartbeat · repair · evolve
configurescontextregisters toolspreflightspawnsscores 1–5
aeon.ymlschedules · chains
ContextCLAUDE · soul · memory/
.mcp.jsonGitHub · Base
Schedulercron */5
Auth GateALLOW / BLOCK
Skill Runtimeruns SKILL.md
Toolsbash · gh · web
OutputPRs · notify
Fleetspawn · A2A
LLM Gateway7-way failover
Self-healingheartbeat · repair
03 / The runtime spine

What one run does

A single run reads left to right. The scheduler picks a skill, an optional authorization gate clears it, Claude Code executes the skill, the tools do the work, and the output ships. Every model call along the way routes through the gateway hung below.

For devs · The optional Fleet Watcher preflight can ALLOW/BLOCK a run before Claude starts (no-ops if its secrets are unset). Claude Code executes SKILL.md with memory/ in context; tools are bash, gh, WebSearch / WebFetch and any MCP servers. Output is a PR, a Pages / RSS update, a ./notify fan-out, or a dashboard feed card.

preflightevery call
Schedulermessages.yml · cron */5
Auth GateFleet Watcher · opt-in
Skill RuntimeClaude Code · SKILL.md
Toolsbash · gh · web · mcp
OutputPR · notify · feed
LLM Gatewayauto-failover cascade
preflightevery call
Schedulermessages.yml · cron */5
Auth GateFleet Watcher · opt-in
Skill RuntimeClaude Code · SKILL.md
LLM Gatewayauto-failover
Toolsbash · gh · web · mcp
OutputPR · notify · feed
04 / The LLM gateway cascade

Every call fails over

aeon can power Claude Code seven ways. Whichever provider you have a key for and rank highest serves the run; if it dies - no credits, rate limit, outage, a dud response - the run falls through to the next, all the way down to the direct Anthropic API. A dead provider degrades gracefully instead of failing the run.

For devs · aeon.yml ships gateway: { provider: auto }; each run resolves the live provider from whichever secrets are set, in priority order. Override the order with GATEWAY_ORDER, or pin one (which disables failover) via gateway.provider. Native gateways export ANTHROPIC_BASE_URL; OpenAI-compatible ones (Venice, Surplus) bridge through a per-run claude-code-router sidecar.

on failure →
claudeOAuth · plan
anthropicAPI key
openrouterpassthrough
bankrdiscounted
usepodSolana
veniceprivacy-first
surplusUSDC · Base
directfallback
on failure →
claudeOAuth · plan
anthropicAPI key
openrouterpassthrough
bankrdiscounted
usepodSolana
veniceprivacy-first
surplusUSDC · Base
directfallback
05 / The run loop

What happens every five minutes

Nothing runs on a server. A clock ticks; the schedule picks exactly one skill; a throwaway machine boots; Claude reads that skill's instructions, does the work, grades its own output, and commits the result back to the repo. Then it sleeps until the next tick.

For devs · messages.yml fires */5; the first cron match in aeon.yml wins; a GitHub Actions runner dispatches aeon.yml; Claude Code executes SKILL.md with memory/ in context; Haiku scores the output 1–5 into memory/skill-health/; git commit persists output + state. A non-matching tick exits in ~10s.

next tick
Cron tickevery 5 min
aeon.ymlfirst match wins
Actions runnerthrowaway VM
Claude Coderuns SKILL.md
memory/read in · write out
Take actionnotify · PR · tx
Haiku score1–5 quality
git commitwrite back to repo
next tick
Cron tickevery 5 min
aeon.ymlfirst match wins
Actions runnerthrowaway VM
Claude Coderuns SKILL.md
memory/read in · write out
Take actionnotify · PR · tx
Haiku score1–5 quality
git commitwrite back
06 / The self-healing loop

The fleet repairs itself

aeon watches its own work. Every run gets a grade, and the grades pile up in one file. A sentinel reads them - and when a skill keeps failing, aeon files an issue, writes a fix, opens a pull request, and merges itself back to health, usually before you notice anything broke.

For devs · Scores and flags land in cron-state.json. heartbeat (3×/day, listed last) reads it; skill-health files a structured issue; skill-repair patches the SKILL.md and opens a PR; the merge closes the loop. The dashed path is the reactive trigger - consecutive_failures >= 3 auto-fires skill-repair without waiting for cron.

something's offback to healthyfails 3× → auto-repair
Skill runsany scheduled skill
Haiku score1–5 + flags
cron-state.jsonper-skill metrics
heartbeatsentinel · 3×/day
skill-healthfiles an issue
skill-repairopens a PR
PR mergedskill healed
something's offback to healthyfails 3× → auto-repair
Skill runsany scheduled skill
Haiku score1–5 + flags
cron-state.jsonper-skill metrics
heartbeatsentinel · 3×/day
skill-healthfiles an issue
skill-repairopens a PR
PR mergedskill healed
07 / Skill chains

Skills snap together

Skills compose like building blocks. Run two at once, drop what they produce into a shared folder, and hand both results to a third skill that writes your morning brief - then pings you. No orchestrator, no glue code, just a few lines of YAML.

For devs · A chains: block in aeon.yml runs steps via chain-runner.yml. parallel: [token-movers, hn-digest] fans out; each writes .outputs/{skill}.md; priority-brief consume:s both (injected as context) and calls ./notify. Set on_error: fail-fast or continue.

consume
Chain cron07:00 daily
token-moversparallel
hn-digestparallel
.outputs/one file per skill
priority-briefconsume: both
./notify→ you
consume
Chain cron07:00 daily
token-moversparallel
hn-digestparallel
.outputs/one file per skill
priority-briefconsume: both
./notify→ you
08 / It spawns its own fleet

One aeon becomes many

aeon doesn't just run itself - on a schedule it can fork itself into a brand-new repo, copy the API keys across, and stand up a whole fleet of specialised instances, each running on its own. No heartbeat, no operator: just the cron clock and a few core skills.

For devs · spawn-instance (manual) clones the agent into a new GitHub repo, configures a skill subset, validates, and registers it in memory/instances.json; fleet-control (2×/day) checks health and dispatches across instances; fork-fleet tracks forks in the wild. Secrets don't auto-propagate for safety - the spawn step provisions the new repo's Actions secrets so the fork can run. It's all cron-driven from aeon.yml - no sentinel required.

Scheduled fan-out

The original shape, retargeted: context feeds the schedule, which fans out to spawn-instance, migrate-keys, and self-improve - then it runs a fleet.

read · writeon schedule
SOUL.mdvoice · worldview
STRATEGY.mdyour north-star
memory/what it knows
Schedulecron · aeon.yml
spawn-instanceforks a new repo
migrate-keyssecrets → fork
self-improvetunes the agent
Runs a fleetno operator
read · writeon schedule
SOUL.mdvoice · worldview
STRATEGY.mdnorth-star
memory/what it knows
Schedulecron · aeon.yml
spawn-instancenew repo
migrate-keyssecrets
self-improvetunes
Runs a fleetno operator
09 / Self-evolution

It grows toward your number

Point it at a metric it cannot measure yet and aeon doesn't stall - it writes the skill it is missing, asks you once for the API keys, and wires it in. Now the fleet is bigger. Run after run it reprioritises and tunes its own skills, compounding toward your number with no new instruction from you.

For devs · Every run reads STRATEGY.md. When a priority needs data no skill collects, aeon drafts a new SKILL.md, requests the credentials, and registers it in aeon.yml - the fleet grows by one. Paired with the self-healing loop (06), the system both repairs and extends itself: the same loop that runs forever also gets better forever.

fleet +1toward your number
STRATEGY.mdone number to move
Spots a gapcan't measure yet
Writes a skillnew SKILL.md
Asks you oncefor API keys
aeon.ymlskill goes live
Fleet grewcompounds
fleet +1toward your number
STRATEGY.mdone number to move
Spots a gapcan't measure yet
Writes a skillnew SKILL.md
Asks you oncefor API keys
aeon.ymlskill goes live
Fleet grewcompounds
The canonical reference lives in the code - this page mirrors it visually. See the repo and the docs.