# HEARTBEAT.md

<!-- Generated by soul-audit. Re-run soul-audit Phase 6 to update. -->

## Operational Cadence

What the agent checks and when. Each job reads the relevant skill file and runs it.

### Every message
- Signal detection (spawn parallel): `skills/signal-detector/SKILL.md`
- Brain-first lookup: `skills/conventions/brain-first.md`

### Morning (daily)
- Daily task prep: `skills/daily-task-prep/SKILL.md`
- Calendar lookahead
- Open threads from yesterday

### Every 15 minutes
- Brain sync: `gbrain sync --no-pull && gbrain embed --stale`

### Daily
- Self-upgrade check: read `skills/gbrain-upgrade/SKILL.md` and run it. It runs
  `gbrain self-upgrade --check-only --json`, and if behind, surfaces what's new
  and either prompts you (notify mode, the default) or applies silently (auto
  mode). Every `gbrain` invocation also nudges via the stderr `UPGRADE_AVAILABLE`
  marker; this daily beat is the backstop for agents (OpenClaw / Hermes) running
  on a cron cadence rather than riding invocation frequency.

### Weekly
- Brain health: `gbrain doctor --json`
- Embedding coverage: `gbrain embed --stale`
- Citation audit: `skills/citation-fixer/SKILL.md`
- Back-link check: `gbrain check-backlinks check`
- Brain lint: `gbrain lint`

## Quiet Hours

- Default: 11 PM - 8 AM local time
- Override: user activity flag (if user is active, quiet hours are suspended)
- During quiet hours: save output to held queue, release on first morning contact
- Exception: genuinely urgent alerts (time-sensitive, would cause real damage)

## Schedule Staggering

Jobs should be offset by 5-minute intervals to avoid thundering herd:
- :00 — reserved
- :05, :10, :15, :20, :25, :30, :35, :40, :45, :50 — one job per slot
- Max 1 concurrent job per minute
