batch-health
Post-batch audit — checks whether all enabled scheduled skills fired in their expected window, alerts on silent misses, files issues on batch-level outages
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Post-batch audit — checks whether all enabled scheduled skills fired in their expected window, alerts on silent misses, files issues on batch-level outages
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Audit every enabled skill's upstream file dependencies for staleness — flags chained skills about to consume yesterday's article or a long-dead topic file
Validate skill outputs against assertions, diff vs prior eval to flag regressions, file issues for new failures, and queue concrete fixes
Compare current progress against goals with quantified status, velocity, trend, and a concrete next action per goal
First-touch review of newly opened PRs on [REPLACE: WATCHED_REPO] — verdict + welcoming comment + label
Summary of the [REPLACE: CHANNEL_PLATFORM] channel [REPLACE: CHANNEL_NAME] — top [REPLACE: TOP_N_THREADS] threads + open questions
Price and volume tracker for [REPLACE: TOKEN_SYMBOL] with anomaly alerts above [REPLACE: ALERT_THRESHOLD_PCT]% movement
| name | batch-health |
| category | meta |
| description | Post-batch audit — checks whether all enabled scheduled skills fired in their expected window, alerts on silent misses, files issues on batch-level outages |
| tags | ["meta","reliability"] |
Today is ${today}. Cross-reference what was scheduled to run this morning against what actually ran.
frequency-guard catches skills running too often. Nothing catches when they go silent (example: a historical batch outage where multiple even-day skills missed the morning window and no alert fired). 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 |
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.