Codewhale Fleet Manager
codewhale-hq/Codewhale
Triages and manages Codewhale fleet runs and workers with typed commands, classifying failures and choosing a safe restart, resume or escalation.
Operate managed Aeon instances from memory/instances.json - health-check, dispatch, and status snapshots (control), plus a fleet scorecard of runs, tokens, cost, and reliability (scorecard).
$ npx skills add aeonfun/aeon --skill fleet-control -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install aeonfun/aeon fleet-control --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/aeonfun/aeon.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/fleet-control .claude/skills/fleet-control && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "fleet-control" agent skill from https://github.com/aeonfun/aeon/tree/main/skills/fleet-control into .claude/skills/fleet-control/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fleet-control", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/aeonfun/aeon/tree/main/skills/fleet-controlType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add aeonfun/aeon --skill fleet-control -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install aeonfun/aeon fleet-control --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/aeonfun/aeon.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/fleet-control .agents/skills/fleet-control && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "fleet-control" agent skill from https://github.com/aeonfun/aeon/tree/main/skills/fleet-control into .agents/skills/fleet-control/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fleet-control", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add aeonfun/aeon --skill fleet-control -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install aeonfun/aeon fleet-control --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/aeonfun/aeon.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/fleet-control .cursor/skills/fleet-control && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "fleet-control" agent skill from https://github.com/aeonfun/aeon/tree/main/skills/fleet-control into .cursor/skills/fleet-control/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fleet-control", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/aeonfun/aeon.git --path skills/fleet-control--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add aeonfun/aeon --skill fleet-control -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install aeonfun/aeon fleet-control --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/aeonfun/aeon.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/fleet-control .gemini/skills/fleet-control && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "fleet-control" agent skill from https://github.com/aeonfun/aeon/tree/main/skills/fleet-control into .gemini/skills/fleet-control/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fleet-control", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install aeonfun/aeon fleet-controlInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add aeonfun/aeon --skill fleet-control -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/aeonfun/aeon.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/fleet-control .github/skills/fleet-control && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "fleet-control" agent skill from https://github.com/aeonfun/aeon/tree/main/skills/fleet-control into .github/skills/fleet-control/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fleet-control", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add aeonfun/aeon --skill fleet-control -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install aeonfun/aeon fleet-control --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/aeonfun/aeon.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/fleet-control .opencode/skills/fleet-control && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "fleet-control" agent skill from https://github.com/aeonfun/aeon/tree/main/skills/fleet-control into .opencode/skills/fleet-control/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fleet-control", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
fleet-controlOperate managed Aeon instances from memory/instances.json - health-check, dispatch, and status snapshots (control), plus a fleet scorecard of runs, tokens, cost, and reliability (scorecard).
Fleet Control is an agent skill from aeonfun/aeon. Operate managed Aeon instances from memory/instances.json - health-check, dispatch, and status snapshots (control), plus a fleet scorecard of runs, tokens, cost, and reliability (scorecard).
Its SKILL.md is about 5.6k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
The repository describes itself as: The most autonomous AI agent framework: runs unattended on GitHub Actions, self-healing skills, drives Claude Code, Grok, Codex & more. No approval loops. Configure once, forget… The licence is MIT.
Read from SKILL.md and the folder at commit f252074. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
ghnodeFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
github.comFrom URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
GITHUB_TOKENGH_TOKENANTHROPIC_API_KEYFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Fleet Control loads about 5.6k tokens when it runs. Until then it costs about 51 tokens; SKILL.md has 2,056 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from aeonfun/aeon at commit f252074, republished under its MIT licence (© aeonfun). 2,056 words, ~5,597 tokens.
.claude/skills/fleet-control/SKILL.md (or your agent's skills folder).<!-- autoresearch: variation B — sharper output: verdict line + delta vs prior + per-instance action column + state-change-gated notify -->
${var} — Command / view selector. Empty (or unrecognized) → Health Check (default control view).
status→ full Status Mode (control view).dispatch <instance|*> <skill> [var=<value>]→ Dispatch Mode: trigger a skill on one child or all healthy/degraded children (control view).scorecard→ Scorecard Mode: fleet-wide runs/tokens/cost/reliability scorecard with day-over-day deltas + alerts (scorecard view).
Today is ${today}. Operate the fleet of Aeon instances registered in memory/instances.json. The control view (health/status/dispatch) is decision-ready: every run leads with a verdict, then a delta vs prior check, then per-instance lines that name the next concrete action. The scorecard view publishes the daily fleet-wide cost/reliability scorecard.
The fleet is discovered at runtime, never hardcoded: it is this repo ("self") plus every non-archived entry in memory/instances.json (the registry fleet-control and spawn-instance maintain). With zero managed instances the scorecard simply covers the single self repo — still useful.
Read memory — read memory/MEMORY.md for high-level context and scan the last ~3 days of memory/logs/ for recent activity; don't re-report a signal already logged there.
Voice — if soul/SOUL.md and soul/STYLE.md exist and are populated, read them and match the operator's voice in every notification. If they are empty templates or absent, use a clear, direct, neutral tone — terse, lowercase, no fluff.
Parse ${var} → mode:
status → Status Mode (control view)dispatch → Dispatch Mode (control view)scorecard → Scorecard Mode (scorecard view)Route:
gh calls.node scripts/fleet-scorecard.mjs.Verify gh auth — gh auth status must succeed. If not, log FLEET_NO_AUTH to memory/logs/${today}.md and notify Fleet Control: gh auth missing — check GITHUB_TOKEN secret. Stop.
Check rate limit — REMAINING=$(gh api rate_limit --jq '.resources.core.remaining'). If REMAINING < 50, log FLEET_RATE_LIMITED:remaining=${REMAINING} and notify a one-line warning, then stop.
Load the registry — read memory/instances.json. If the file is missing, write {"instances": []} to bootstrap. If .instances is absent or []:
FLEET_EMPTY: no managed instances to memory/logs/${today}.md.Load prior state — read memory/state/fleet-control-state.json (create the directory and file with {"instances": {}, "last_full_summary_date": ""} if missing). Shape:
{
"instances": {
"<name>": { "health": "<status>", "last_checked": "<ISO>", "consecutive_unreachable": 0 }
},
"last_full_summary_date": "YYYY-MM-DD"
}For each registered instance, skip rows with archived: true from per-instance work (count them separately). Run the three calls per instance in parallel using & + wait and write each to /tmp/fleet/${SAFE}.{repo,runs,cron}.json:
a. Repo metadata:
gh api "repos/${REPO}" \
--jq '{full_name, pushed_at, archived, default_branch, open_issues_count}' \
> "/tmp/fleet/${SAFE}.repo.json" 2>"/tmp/fleet/${SAFE}.repo.err" &b. Workflow runs in last 24h (precise window, not "last 5"):
SINCE=$(date -u -d '24 hours ago' +%Y-%m-%dT%H:%M:%SZ)
gh api "repos/${REPO}/actions/runs?created=>${SINCE}&per_page=100&exclude_pull_requests=true" \
--jq '{total_count, runs:[.workflow_runs[]|{name,status,conclusion,created_at,html_url}]}' \
> "/tmp/fleet/${SAFE}.runs.json" 2>"/tmp/fleet/${SAFE}.runs.err" &c. Cron-state from child:
gh api "repos/${REPO}/contents/memory/cron-state.json" --jq '.content' 2>"/tmp/fleet/${SAFE}.cron.err" \
| base64 -d > "/tmp/fleet/${SAFE}.cron.json" &wait after launching all three for an instance (or batch across all instances if you trust your parallelism — keep ≤16 concurrent calls to stay under rate limit).
Classify each instance with precise thresholds:
archived: trueruns.total_count == 0 for the 24h window AND repo pushed_at ≥ 7 days old (newly-spawned instances under 7 days stay unclassified-but-tracked)runs.total_count == 0 AND pushed_at > 7 days old AND not archivedconsecutive_failures ≥ 3 OR (24h failure_count / total_count) ≥ 0.5 with total_count ≥ 2success or in_progress/queued, no degraded cron-state skillsFor each instance compute a next_action (one short imperative phrase):
pending_secrets → add ANTHROPIC_API_KEY at https://github.com/${REPO}/settings/secrets/actionsdegraded → investigate <skill_name> (<consecutive_failures>× in a row, last_error: <signature, ≤60 chars>)warning → monitor — <N>/<Total> runs failed in 24hstale → confirm intent: no runs in 24h, last push <relative_date>; archive or re-enable — if it should be running, dispatch aeon-doctor to that instance (Dispatch Mode) to lint for a silent config bug (unquoted schedule: / duplicate key / broken entry) before assuming it's abandonedunreachable → verify access: <reason from repo.err>healthy → nonearchived → none (archived)Compute delta vs prior state (per-instance prior.health vs current.health):
Update the registry — write back health, last_checked (ISO UTC), and next_action per instance to memory/instances.json. Preserve all other fields (purpose, parent, created, skills_enabled, etc.).
Update the state file — write the current per-instance health snapshot to memory/state/fleet-control-state.json. Update last_full_summary_date to today only when this run notifies. Increment consecutive_unreachable for unreachable instances; reset to 0 otherwise.
Log to memory/logs/${today}.md (under the consolidated heading — see Log section):
### fleet-control
- Mode: health check
- Verdict: [FLEET_OK | NEEDS_ATTENTION:N]
- Sizes: total=N, healthy=N, warning=N, degraded=N, stale=N, pending=N, unreachable=N, archived=N
- Deltas: [list NEW/DEGRADED/RECOVERED/DROPPED, or "none"]
- Sources: gh=ok, rate_remaining=NNotification gate — send the notification if any of:
len(deltas) > 0last_full_summary_date (first check of UTC day → daily rollup)degraded or unreachableOtherwise skip notify (silent no-op when nothing changed mid-day — operator isn't trained to ignore).
Notification body (when sent):
*Fleet Control — ${today}*
Verdict: <FLEET_OK | NEEDS_ATTENTION:N>
[If deltas exist]:
What changed:
- NEW: <name> (<repo>) — <health>
- DEGRADED: <name> — was <prior>, now <current>: <reason>
- RECOVERED: <name> — was <prior>, now <current>
- DROPPED: <name> — no longer in registry
Fleet (N total):
- <name> [<HEALTH>]: <repo> — <next_action>
- ...
[If first-of-day rollup]:
Counts: healthy <H> · warning <W> · degraded <D> · stale <S> · pending <P> · unreachable <U> · archived <A>
Sources: gh=ok · rate_remaining=NCap the per-instance list at 12 lines; if more, append ...and N more — see memory/instances.json. Always include archived in counts; never list archived rows in the per-instance section.
Parse var: dispatch <instance|*> <skill> [var=<value>].
Resolve targets:
<instance> is *, target = every registry entry whose current health is healthy, warning, or degraded (skip unreachable, stale, pending, archived).Fleet Dispatch: instance '<name>' not in registry and stop.For each target instance:
Validate skill exists in child:
gh api "repos/${REPO}/contents/skills/${SKILL}/SKILL.md" >/dev/null 2>&1 \
|| { OUTCOME="missing_skill"; continue; }Check skill is enabled in child's aeon.yml (best-effort warning, not a block — workflow_dispatch can override enabled: false):
gh api "repos/${REPO}/contents/aeon.yml" --jq '.content' 2>/dev/null | base64 -d \
| grep -E "^[[:space:]]*${SKILL}:.*enabled:[[:space:]]*true" >/dev/null \
|| NOT_ENABLED_WARN=1Trigger the skill:
if [ -n "$DISPATCH_VAR" ]; then
gh workflow run aeon.yml --repo "${REPO}" -f skill="${SKILL}" -f var="${DISPATCH_VAR}" \
&& OUTCOME="dispatched" || OUTCOME="api_failed:$?"
else
gh workflow run aeon.yml --repo "${REPO}" -f skill="${SKILL}" \
&& OUTCOME="dispatched" || OUTCOME="api_failed:$?"
fiCollect per-target outcomes: dispatched | missing_skill | api_failed:<code> (with optional not_enabled_warn flag).
Log:
### fleet-control
- Mode: dispatch
- Command: dispatch <inst|*> <skill> [var=...]
- Targets: N
- Dispatched: N | missing_skill: N | api_failed: N
- Per-target: [<name>: <outcome>, ...]Notify (always, in dispatch mode):
*Fleet Dispatch*
Command: dispatch <inst|*> <skill>
Targets: <N> — Dispatched: <N>
Successful: <comma-sep names>
[If failures]:
Failed: <name>: <reason>, ...
[If not_enabled_warn]:
Warning: <name> has skill disabled in aeon.yml — dispatched anywayIf 0 dispatched out of N targets, the verdict line reads Fleet Dispatch: 0/${N} — see failures below and exit code logged is FLEET_DISPATCH_FAILED:no_targets_succeeded.
Generate the comprehensive snapshot, but make it scannable.
For each registered instance (skip archived from detail blocks but count them in the summary), gather in parallel:
stargazers_count, pushed_at, open_issues_count, default_branchgh api "repos/${REPO}/actions/runs?per_page=10&exclude_pull_requests=true" \
--jq '[.workflow_runs[]|{name,status,conclusion,created_at,html_url}]'cron-state.jsonaeon.yml (parse enabled skills)gh api repos/${REPO}/commits?per_page=5 --jq ...)Compute the same delta block, but compare against the most recent prior output/articles/fleet-status-*.md (parse the per-instance health rows; if none exists, mark the section "no prior status to diff against").
Write to output/articles/fleet-status-${today}.md:
# Fleet Status — ${today}
## Verdict
<one line: FLEET_OK | NEEDS_ATTENTION:N | DEGRADED:N — top issue first>
## Top Issue
<one paragraph: the single highest-priority instance and what it needs, OR "none">
## Fleet Health
| Instance | Repo | Health | Last Active | Skills | Open Action |
|----------|------|--------|-------------|--------|-------------|
## What Changed Since Last Status
<list of NEW/DEGRADED/RECOVERED/WENT_STALE/DROPPED instances since prior fleet-status article, or "no changes">
## Per-Instance Detail
### <name> — <repo>
- Purpose: <from registry>
- Health: <status>, last checked <ISO>
- Last 10 runs:
| Skill | Status | Conclusion | When |
|-------|--------|-----------|------|
- Skills enabled: <comma list>
- Recent commits:
- <sha> <message>
- Action: <next_action>
## Counts
| Metric | Value |
|--------|-------|
## Sources
gh=ok · rate_remaining=N · registry=N instances · prior_status=<filename or "none">Log:
### fleet-control
- Mode: status
- Article: output/articles/fleet-status-${today}.md
- Verdict: <line>
- Sizes: total=N, healthy=N, ...Notify (always, in status mode):
*Fleet Status — ${today}*
<verdict>
Top issue: <one line, or "none">
Counts: healthy <H> · warning <W> · degraded <D> · stale <S> · pending <P> · unreachable <U>
Article: output/articles/fleet-status-${today}.mdPublish the daily fleet scorecard to memory/scorecard.md and append a trend row to memory/scorecard-history.csv. (Ran daily at 13:00 UTC as its own dispatch when this skill is scheduled with var: scorecard.)
Run the committed collector — it discovers the fleet (self + non-archived memory/instances.json), fetches each repo's workflow runs + skill count + token-usage.csv from the GitHub API, computes the pricing/aggregation, and writes the tables. It reads its token from the environment (GH_READ_PAT — the read-only PAT declared in this skill's requires:, needed to read private fleet members — falling back to GH_TOKEN/GITHUB_TOKEN), so no secret ever touches a command line:
node scripts/fleet-scorecard.mjs # → /tmp/fleet-scorecard/{scorecard-body.md,metrics.json}The deterministic maths lives in the script (not this run) — do not recompute or alter its numbers. A repo the token can't read is simply absent from the tables rather than crashing the collector.
/tmp/fleet-scorecard/scorecard-body.md — the computed markdown tables (Fleet totals, Per-repo, Top skills by cost, Least reliable skills). Authoritative — do not recompute or alter them./tmp/fleet-scorecard/metrics.json — today's key totals: total_runs, total_failures, generations, prompt_tokens, cached_tokens, completion_tokens, total_tokens, est_cost_usd, cache_discount_usd.If /tmp/fleet-scorecard/scorecard-body.md is missing or empty, the collector failed or resolved an empty fleet — write a one-line note to /tmp/skill-result.txt saying so and stop (do not overwrite the existing scorecard, do not notify).
/tmp/fleet-scorecard/metrics.json (today).memory/scorecard-history.csv if it exists (the previous run's metrics) to compute deltas. If the file doesn't exist yet, this is the first run — deltas are "—".For total_runs, total_failures, generations, total_tokens, est_cost_usd, cache_discount_usd, compute today − previous. Format as signed (e.g. +312 runs, +$148, +5 failures). These are cumulative all-time figures, so deltas show the last ~24h of activity.
Scan the computed tables in scorecard-body.md and flag:
est_cost_usd delta > 1.5× the median daily delta from history (if ≥7 history rows exist), or just note the day's cost increase otherwise.total_failures rose by more than 10 since yesterday, flag it.✅ No anomalies — fleet healthy.memory/scorecard.mdStructure (overwrite the file):
# 🛰️ Aeon Fleet Scorecard — as of ${today}
_Auto-generated daily by skills/fleet-control (scorecard view). Tokens reported OpenRouter-style (cached_tokens ⊆ prompt_tokens)._
## Since last update (~24h)
| Metric | Δ |
|---|---:|
| Runs | <signed> |
| Failures | <signed> |
| Generations | <signed> |
| Total tokens | <signed, humanized> |
| Est. cost | <signed $> |
| Cache discount | <signed $> |
## Alerts
<the alerts block from step 3>
<PASTE the full contents of /tmp/fleet-scorecard/scorecard-body.md verbatim here>
---
_Sources: GitHub Actions run history + each repo's `memory/token-usage.csv`. Fleet resolved from memory/instances.json + self. Cost = Anthropic list price (estimate)._Append one line to memory/scorecard-history.csv (create with a header if it doesn't exist):
date,total_runs,total_failures,generations,prompt_tokens,cached_tokens,completion_tokens,total_tokens,est_cost_usd,cache_discount_usdUse ${today} for the date and the values straight from metrics.json. Append, never rewrite prior rows.
Write a terse daily pulse to /tmp/scorecard-notify.md and send it with ./notify -f /tmp/scorecard-notify.md. One short paragraph — today's totals (runs, est. cost, total tokens), the headline deltas, and any alert. Example shape: "fleet at 12.5k runs, ~$7.8k notional. +312 runs / +$148 since yesterday. cost-report still failing (88% fail). caching saved ~$43k." Also copy this text to /tmp/skill-result.txt so the framework captures it.
Append the scorecard entry under the consolidated ### fleet-control heading in memory/logs/${today}.md (see Log section), noting the headline numbers (so future skills like self-improve/reflect see it).
/tmp/fleet-scorecard/*) — never invent or estimate figures yourself.All modes append under one ### fleet-control heading in memory/logs/${today}.md, with a - Mode: discriminator line (the health loop parses this shape). Use the per-mode block shown in each mode section above. For Scorecard Mode use:
### fleet-control
- Mode: scorecard
- Scorecard: memory/scorecard.md updated — <total_runs> runs, ~$<est_cost_usd> notional, <total_tokens humanized>
- Deltas: <+runs> / <+$cost> since yesterday
- Alerts: <alert summary or "none">Every run logs exactly one of these to memory:
FLEET_CONTROL_OK — health/status/dispatch/scorecard completed normallyFLEET_EMPTY — no instances in registry (silent stop; control view)FLEET_NO_AUTH — gh auth missing (control view)FLEET_RATE_LIMITED:remaining=N — abandoned to preserve quota (control view)FLEET_DISPATCH_OK:N/M — dispatched N of M targetsFLEET_DISPATCH_FAILED:<reason> — dispatch produced 0 dispatchesFLEET_SCORECARD_EMPTY — collector produced no data (empty fleet / all repos unreadable); scorecard skipped without overwriting or notifyingControl view (health / status / dispatch): always use gh api over raw curl (it handles auth internally, so no $SECRET appears on the command line for the Bash permission layer to refuse). All cross-repo calls go through gh api or gh workflow run. No outbound HTTP needed beyond what gh does internally.
Scorecard view: gathers its data in-run by executing node scripts/fleet-scorecard.mjs (step 0), which fetches workflow runs + token usage from the GitHub API and computes the tables into /tmp/fleet-scorecard/. The collector authenticates with GH_READ_PAT when set (a read-only PAT with cross-repo scope, declared in this skill's requires: and injected into the run) so private managed instances are readable; when unset, the run's GH_TOKEN (= GH_GLOBAL) reads the same private members, the standard single-key setup. It reads the token from process.env internally, so the secret never appears on a command line. A repo the token can't read is simply absent from the tables rather than crashing the collector.
GH_READ_PAT (optional, read-only) — declared in requires: and read from process.env by scripts/fleet-scorecard.mjs (scorecard view) to reach private managed instances; it falls back to GH_GLOBAL/GH_TOKEN/GITHUB_TOKEN (the run's repo-wide token, which also reads private members) when unset, and reads GITHUB_REPOSITORY to resolve "self". The control view relies on the workflow-provided GITHUB_TOKEN for its live gh calls.
memory/instances.json automatically — only update fields. Even unreachable instances stay in the registry until the operator removes them by hand....and N more when needed.memory/scorecard.md when the collector output is missing/empty, and appends (never rewrites) prior rows in memory/scorecard-history.csv.Write complete, working code. No TODOs or placeholders.
After completing any task, end with a ## Summary listing what you did, files created/modified, and any follow-up actions needed.
© aeonfun, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in skills/fleet-control of aeonfun/aeon.
Open the folder on GitHubat commit f252074
Fleet Control next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Fleet Control this skillaeonfun/aeon | 767 | — | ~5.6k | Automated safety check: Pass | MIT | |
| Codewhale Fleet Managercodewhale-hq/Codewhale | 41k | — | ~1.2k | Automated safety check: Pass | MIT | |
| Health ManagementLeoYeAI/openclaw-master-skills | 2.2k | — | ~11k | Automated safety check: Notes | MIT | |
| Fleet Manager for Agent Sessionsasgeirtj/system_prompts_leaks | 69k | — | ~2.5k | Automated safety check: Pass | CC0-1.0 | |
| Operations ManagerFerroxLabs/wayland | 608 | — | ~5k | Automated safety check: Pass | Apache-2.0 | |
| Fleet Operationsautonomous-ai/openharness | 1.1k | — | ~1.4k | Automated safety check: Pass | MIT |
codewhale-hq/Codewhale
Triages and manages Codewhale fleet runs and workers with typed commands, classifying failures and choosing a safe restart, resume or escalation.
LeoYeAI/openclaw-master-skills
Comprehensive health management system integrating 10 best-selling health books' consensus principles.
asgeirtj/system_prompts_leaks
Shows one digest of coding-agent sessions across your connected machines and lets you open, read, steer, approve, stop and close them, over Herdr, tmux or MSP.
FerroxLabs/wayland
Becomes a senior operations manager who maps existing processes, identifies bottlenecks, designs improved workflows, creates standard operating procedures, and defines efficiency metrics.
autonomous-ai/openharness
Manage the machines on a Harness account by conversation — read the fleet, link and unlink, rename, note and group, bring a new computer in, remove one.
affaan-m/ECC
Supports freight managers in sourcing and vetting carriers, running RFPs, negotiating rates, building routing guides and scoring carrier performance.
aeonfun/aeon
Browses open tasks on the TaskMarket agent-worker market and, with explicit operator approval, creates tasks, tracks submissions and submits finished work.
aeonfun/aeon
Sets up and manages an Aeon agent instance that runs skills on a schedule through GitHub Actions: starting, rescheduling, debugging, editing skills and mining chat history.
aeonfun/aeon
Reads a Base Account's address, portfolio and transaction history through the Base MCP server, and stays strictly read-only in unattended Aeon runs, reporting only changes.
aeonfun/aeon
Audits every page of a site each day from its sitemap, scores on-page and technical SEO, checks duplicates across pages and reports what changed since the last run.
aeonfun/aeon
5 concrete real-life actions, leverage-scored against open loops with specificity and anti-fluff gates
aeonfun/aeon
Static linter for an Aeon instance's configuration that catches silent failures such as unquoted schedules, duplicate keys, unconfigured skills and broken MCP references.
Operate managed Aeon instances from memory/instances.json - health-check, dispatch, and status snapshots (control), plus a fleet scorecard of runs, tokens, cost, and reliability (scorecard). Fleet Control is an agent skill from aeonfun/aeon.json - health-check, dispatch, and status snapshots (control), plus a fleet scorecard of runs, tokens, cost, and reliability (scorecard).
Run `npx skills add aeonfun/aeon --skill fleet-control -a claude-code`. Or copy the skill folder (skills/fleet-control in aeonfun/aeon) into .claude/skills/fleet-control in your project. Claude Code loads it when a task matches its description.
Run `npx skills add aeonfun/aeon --skill fleet-control -a codex`. Or copy the skill folder (skills/fleet-control in aeonfun/aeon) into .agents/skills/fleet-control in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add aeonfun/aeon --skill fleet-control -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/fleet-control, .gemini/skills/fleet-control, .github/skills/fleet-control and .opencode/skills/fleet-control in your project.
Going by SKILL.md and its folder, Fleet Control needs the command-line tools its instructions call (gh and node) and credentials named GITHUB_TOKEN, GH_TOKEN and ANTHROPIC_API_KEY. Our summary lists: A credential in GITHUB_TOKEN; A credential in ANTHROPIC_API_KEY.
SKILL.md names 1 domain. In commands or code: github.com; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Fleet Control is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 5.6k tokens (SKILL.md is roughly 22k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Fleet Control: Codewhale Fleet Manager (codewhale-hq/Codewhale, 41k stars), Health Management (LeoYeAI/openclaw-master-skills, 2.2k stars), Fleet Manager for Agent Sessions (asgeirtj/system_prompts_leaks, 69k stars) and Operations Manager (FerroxLabs/wayland, 608 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
aeonfun (a GitHub organization) maintains it in aeonfun/aeon, which has 767 GitHub stars. The repository holds 82 skills in this directory. The repository was last updated on October 6, 2026.
Source: aeonfun/aeon on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.