원클릭으로
batch-health
// Daily post-batch audit — checks whether all enabled scheduled skills fired in their expected morning window, alerts on silent misses, files issues on batch-level outages
// Daily post-batch audit — checks whether all enabled scheduled skills fired in their expected morning window, alerts on silent misses, files issues on batch-level outages
5 concrete real-life actions for today based on everything known about Aaron
Top 10 tweets by influence mentioning AI agents or OpenClaw
Weekly tracker of AI agent substitution signals — which roles, companies, and industries show real headcount displacement. Named roles + real deployments only. Closes topic-momentum "agent substitution" gap.
Cross-domain market pulse from AIXBT's free grounding endpoint — crypto, macro, tradfi, geopolitics. Refreshes taxonomy references (clusters, chains) as a bonus.
Research a trending topic in Aaron's interest areas and write an opinionated article in his voice
Analyze a URL and generate a tailored aeon.yml schedule with skill suggestions
| name | batch-health |
| description | Daily post-batch audit — checks whether all enabled scheduled skills fired in their expected morning window, alerts on silent misses, files issues on batch-level outages |
| var | |
| tags | ["meta","reliability"] |
Today is ${today}. Cross-reference what was scheduled to run this morning against what actually ran.
run-frequency-guard catches skills running too often. Nothing catches when they go silent. ISS-021 (2026-05-06 — 8 even-day skills missed the 06:30–07:25 UTC window, no alert fired) is the canonical example. This skill closes that gap.
Runs at 08:00 UTC daily — after the 06:00–07:30 UTC batch window completes. Skills scheduled at 07:31+ are excluded from the expected list (transient cron drift could leave them in flight when we audit). Output: OK if everything ran, WARN for 1-2 isolated misses, OUTAGE for 3+ missing skills.
Read aeon.yml. For each skill with enabled: true, check its schedule field against today's context.
Parse today's date ${today} (YYYY-MM-DD):
Include a skill in the expected list if ALL of:
enabled: true6 (any minute 0–59) → in window7 AND minute ≤ 30 → in window7 AND minute > 30 → exclude (too close to the 08:00 audit; transient cron drift could leave it in flight when we check)7,19 → counts as hour 7 for the AM window (apply the same minute rule)* * * or any-day pattern → always included1/2 * * in DOM field → odd days only2/2 * * in DOM field → even days only*/N * * step in DOM field → include if (DOM - 1) % N == 0. Vixie-cron expands */N to 1-31/N → DOMs 1, 1+N, 1+2N, … For */3: DOMs 1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31. Do not blanket-include — that false-WARNs ~2/3 of days.* * N) → include only if today's weekday matchesExclude: disabled skills, skills firing outside the 06:00–07:30 UTC window (e.g., schedule: "30 9 * * *" at 09:30, schedule: "40 7 * * *" at 07:40 — both out of scope for this audit).
Try the skill-runs script:
./scripts/skill-runs --json --hours 26
From the JSON output, extract the .skills[] array — each entry has a skill name and last_conclusion. A skill that appears here (any conclusion) means the GHA cron fired.
Fallback if skill-runs fails (sandbox network block or gh api error):
Parse memory/logs/${today}.md:
cat memory/logs/${today}.md 2>/dev/null
Look for ## SkillName headers or *_OK / *_SKIP / *_FAIL markers. Any skill that logged means it ran. Note: fallback gives partial coverage only — missing from the log doesn't mean it didn't run.
For each skill in the expected list:
failure conclusion — scheduler fired, skill errored (tracked by skill-health, not our concern here)Tally: N_expected, N_ok, N_failed, N_missing.
| Missing count | Severity |
|---|---|
| 0 | OK — no notification needed |
| 1–2 | WARN — isolated hiccup, possible transient cron delay |
| 3+ | OUTAGE — batch-level failure (ISS-021 pattern) |
If 3+ missing, check whether today's outage is already tracked:
memory/issues/INDEX.md — scan open issues for one matching today's date and "batch" keyword. If found, skip filing.memory/issues/ISS-*.md files, take highest N + 1.memory/issues/ISS-{NNN}.md:---
id: ISS-{NNN}
title: Batch outage — {N} skills missed morning window {today}
status: open
severity: medium
category: unknown
detected_by: batch-health
detected_at: {today}T08:00:00Z
resolved_at: null
affected_skills: [{comma-separated skill names}]
root_cause: null
fix_pr: null
---
# ISS-{NNN}: Batch Outage {today}
{N} enabled skills never triggered in the 06:00–07:30 UTC window on {today}.
## Missing Skills
{list each missing skill and its aeon.yml schedule}
## Context
Detected by `batch-health` at 08:00 UTC. The GHA scheduler fired for daily-promoted skills but the batch window was silent.
## Next Steps
- Check GitHub Actions for {today} around 06:00–07:30 UTC for cron delivery failures
- If one-off: likely GHA infrastructure delay (documented pattern)
- If recurring: investigate aeon.yml schedule changes or GHA Actions billing limits
memory/issues/INDEX.md open table:| ISS-{NNN} | medium | Batch outage — {N} skills missed morning window {today} | {today} | batch-health |
memory/MEMORY.md issue tracker summary if the issue changes the open count.Write to .pending-notify-temp/batch-health-${today}.md (create dir if needed), then send.
OUTAGE format:
batch outage — ${today}
${N} skills never triggered (06:00–07:30 UTC):
${list each missing skill with its schedule}
ISS-${NNN} filed. check GHA cron status.
WARN format:
batch gap — ${today}
${N} scheduled skills didn't run:
${list each}
isolated miss — transient cron delay likely. monitoring.
Send: ./notify -f .pending-notify-temp/batch-health-${today}.md
Append to memory/logs/${today}.md:
## Batch Health
- **Expected:** ${N} skills in 06:00–07:30 UTC window
- **Expected list:** ${comma-separated skill names}
- **OK:** ${N_ok}
- **Failed:** ${N_failed} (${list or "none"})
- **Missing:** ${N_missing} (${list or "none"})
- **Status:** OK / WARN / OUTAGE
- **Issue filed:** ISS-${NNN} / n/a
- **Notification:** sent / skipped (OK)
- BATCH_HEALTH_OK
./scripts/skill-runs --json calls gh api which is authenticated via GITHUB_TOKEN in GitHub Actions — no extra setup needed. If the script errors, fall back to parsing memory/logs/${today}.md for log markers. Local fallback is less precise: treat any skill with a log header or *_OK marker as "ran", but note the data source in the log entry.
None. gh api uses GITHUB_TOKEN provided automatically by GitHub Actions.