| name | pai-statusline-banner |
| description | Daily digest of PAI ecosystem state pushed to mobile at 18:00 — Claude 5h/7d usage, pending proposals, doctor failures, leak detector flags, mood/git/learning signals from PAI Algorithm. Mirrors PAI canonical statusline visible-section into single message. Use when user says daily summary, what happened today, banner, digest, brief me. |
pai-statusline-banner skill
What it provides
PAI canonical statusline shows on EVERY Claude Code render (Greeting → Wielding → Git → Learning → Signal → Context → Quote). Beautiful in Claude Code session. Invisible in Hermes TUI (different renderer) and invisible when not at desk.
This skill aggregates the same signals into a single text message pushed via pai-pulse to mobile at 18:00 daily. You get the PAI statusline vibe via voice + Pulse mobile UI, even when away from terminal.
When to use
User intent:
- "daily summary", "brief me", "digest"
- Cron-driven 18:00 daily — see
cron/README.md (Hermes jobs.json registration)
- On-demand "what happened today"
Composed message structure
PAI digest — Friday May 16, 18:00 UTC
Usage:
5h Claude: 42% (resets 21:00)
7d Claude: 38% (Opus 55%, Sonnet 22%)
API spend month: $12.40
Ecosystem:
doctor: 23 pass / 2 fail (arecord_present, whisper_model_present)
proposals pending: 2 (omc abc1234, pai-anywhere def5678)
leak detector: clean (no new ANTHROPIC_API_KEY call-sites)
Activity (PAI Algorithm signal):
commits today: 7
skills used today: ralph, science, telos
mood: + 4 ~ 2 - 1
learning entries: 3
Top quote: "<from PAI Quote rotation>"
Algorithm
- Read PAI usage cache → format 5h/7d.
- Run doctor probe: execute
pai-anywhere doctor on Linux VPS (this IS the pai-doctor implementation; prefer --json, else parse the final Summary: N pass, M warn, K fail, … line). If the binary is missing/errors, run a minimal fallback: HTTP 200 on Pulse loopback + write test on $PAI_PROPOSALS_DIR. Report pass/warn/fail in the composed message.
- List proposals from
$PAI_PROPOSALS_DIR/*.json where .status=="pending".
- Read PAI CostTracker latest entry: try files in order —
~/.claude/PAI/MEMORY/OBSERVABILITY/anthropic-cost.jsonl, ~/.claude/MEMORY/STATE/anthropic-cost.jsonl, ~/.local/state/pai-hermes/cost-tracker.jsonl. If all absent, report API spend month as n/a and leak detector as n/a.
- Read PAI MEMORY signals with graceful fallbacks:
- git commits today: scan
$PAI_PROJET_ROOT and $HOME/projects, git -C <repo> log --pretty=format:%H --since <today-ISO>, dedup by SHA across repos.
- skills_used today: scan for
skills_used.jsonl under ~/.claude and project dirs; if absent, none detected.
- mood: run
bun ~/.claude/PAI/TOOLS/DAGrowth.ts summary, parse via substring Mood breakdown: then split (zero-state emits extra spaces); if absent, n/a.
- learning entries: count lines in
~/.claude/PAI/ALGORITHM/learning.jsonl or ~/.claude/learning.jsonl; if absent, 0.
- Pick quote from PAI canonical Quote pool (
~/.claude/PAI/.quote-cache): first non-empty line. If empty/absent, omit.
- Compose plaintext message. Omit sections that are n/a to keep it tight.
- POST via
pai-pulse-send: "$PAI_HERMES_ROOT/bin/pai-pulse-send" (from pai-hermes.env), else command -v pai-pulse-send.
Field-name and parsing quirks (usage-cache utilization, DAGrowth spacing, ledger paths) are in references/data-schemas.md — read it before parsing.
Inputs (env)
| Env var | Default | Purpose |
|---|
PAI_USAGE_CACHE | ~/.claude/MEMORY/STATE/usage-cache.json | usage source |
PAI_PROPOSALS_DIR | ${XDG_STATE_HOME:-$HOME/.local/state}/pai-hermes/proposals | proposals dir (shared with pai-watch; set in $HERMES_HOME/pai-hermes.env by install.sh) |
PAI_ALGO_MEMORY | ~/.claude/PAI/ALGORITHM/ | algorithm dir; mood via DAGrowth.ts in ~/.claude/PAI/TOOLS/ |
PAI_QUOTES_FILE | ~/.claude/PAI/.quote-cache | quote pool (fallback if no jsonl) |
PAI_BANNER_TIME | 18:00 | daily schedule (override via Hermes config) |
Cron entry
Register via Hermes — see cron/README.md. Job is stored in ~/.hermes/cron/jobs.json:
{ "name": "pai-statusline-banner", "schedule": { "kind": "cron", "expr": "0 18 * * *" }, "skill": "pai-statusline-banner" }
Output
JSON (returned to Hermes context if invoked on-demand; cron invocation returns nothing — just posts + logs):
{ "schema": "pai-hermes.banner.v1", "ts": "2026-05-16T18:00:00Z", "message": "<composed plaintext>",
"sent_via": ["pulse-notify", "telegram"], "alerts_inline": ["five_hour at 82%"] }
Coordination with other skills
- Calls
pai-doctor for fail count.
- Calls
pai-cost-tracker for usage % (without re-fetching cache).
- Calls
pai-pulse for delivery.
Skill chain pattern: banner is composer, others are providers.
Caveats
- 18:00 default may not match user timezone — read
TZ env or Hermes config.
- Mobile push relies on Pulse
/notify reaching mobile via Tailscale — verify with pai-doctor before scheduling.
- Quote pool from PAI canonical may not exist on fresh install — fallback to empty quote section.
- DAGrowth.ts mood may be macOS-only — gracefully skip if file absent.
PAI_PROPOSALS_DIR is set in $HERMES_HOME/pai-hermes.env by install.sh. PAI_ALGO_MEMORY/PAI_QUOTES_FILE are operator-set, read as-is (recommend under ~/.claude/).
pai-doctor has no standalone script — it runs pai-anywhere doctor (add --post-install for install-integrity), which emits Summary: N pass, M warn, K fail, … plus per-check PASS/WARN/FAIL/INFO lines (or --json). Parse that.
pai-pulse-send is not on PATH by default: resolve "$PAI_HERMES_ROOT/bin/pai-pulse-send" from pai-hermes.env, else command -v. If still missing, fall back to Hermes native TTS or Telegram via the gateway.
- If
terminal returns pending_approval / pattern_key: "tirith:unknown", run git log, file reads, and pai-pulse-send via execute_code (subprocess) instead of retrying terminal.
References
references/data-schemas.md — verified field names for usage cache, DAGrowth output, and CostTracker ledger paths.
Cost
ZERO AI cost. Aggregation + Pulse POST. ElevenLabs cost = single short TTS synthesis (~$0.001).
Triggers in Hermes natural language
- "brief me" → on-demand banner
- "daily summary now" → on-demand banner
- "what happened today" → banner with extended commits + skills list
- Cron-fired at 18:00 — silent in TUI, lands on mobile