brain-channels-audit — 2026-04-18
Pod 42. Inventory of every surface the brain uses to talk back to the operator. This exists because Robert asked: "how do we communicate it through the system right this is like an AGI brain we are trying to make here." Today the channels are real but scattered — this audit documents them and motivates the new insights channel built in the same commit.
Channel inventory (8 rows)
| # | Channel | What it carries | Trigger | Operator discovery | Populated? |
|---|---|---|---|---|---|
| 1 | Byline (statusline) | Live ops heartbeat: running agents, broken/overdue, named p0/p1, followups, Ray draft, next-fire | Every Claude-Code turn (hook renders state/bin/statusline.sh) | Always visible at the top of every terminal Claude Code window | ✅ live (12 tracked agents) |
| 2 | TUI tabs (byline/tui.sh) | Full picture: agents, skills, loops, settings. Press a hotkey to drill. | Operator launches explicitly | Paste-ready slash command on byline rows routes them here | ✅ 2007-line impl |
| 3 | notify.ndjson | Per-agent run-complete events (sent or skipped by channel) | Every cron agent tail-calls byline/notify.sh | Telegram (if notify=1 in settings.tsv) + NDJSON audit; byline does NOT read this | ✅ 109 rows |
| 4 | morning-brief (state/log/briefs/<date>.md) | Dedup'd ranked list of items awaiting Robert (sweep + krisp) | Operator says "morning brief" (skill is prose) | Opens today's .md file — operator-pulled, not pushed | ✅ skill page wired, eval auto |
| 5 | agents-dashboard (state/bin/agents-dashboard.sh) | Per-agent status grid, cadence, last run | Operator launches explicitly | Mirrors byline but scroll-back instead of one line | ✅ |
| 6 | statusline (the file that powers #1) | Composes three lenses: LIVE / ISSUES / NEXT | Called on every prompt | Byline rendering | ✅ |
| 7 | dispatches.ndjson | Cheap-labor dispatch audit (model, cost, latency) | Every dispatch.ts call | Cost audit — no operator-facing surface | ✅ 28 rows |
| 8 | frictions.ndjson | Defects blocking runs — p0/p1 severity | Agents that hit friction | Byline row 🚨 N open issues → /snappy-fix | ✅ (surfaced via byline) |
Gap Pod 42 identified
Every channel above is either transactional (a single run happened, here's the result) or reactive (the operator asked, here's the answer). None of them carry "the brain just got better at something you didn't ask about." Examples that have no home today:
- A new skill just graduated from
prose→graduated. The operator
never hears about it unless they grep the frontmatter.
- The fixer auto-added a
## Known Pitfallto a loader. That rule now
rides with every turn mentioning that skill — but the operator was not told the rule exists.
parity.ndjsonshows Codex climbed from 0.00 to 0.40 over 24h. Big
news (runtime parity is the measured thesis metric) — surfaces nowhere.
The byline is the right front door for this, but the existing lenses (LIVE / ISSUES / NEXT) don't leave a seam for proactive findings. The byline is "what is happening right now"; insights are "what changed about you that you should know."
Solution shipped in this commit
New additive channel:
state/log/insights.ndjson— append-only row per detected insight.state/bin/brain/insights.ts— deterministic detector (no LLM), three
kinds: capability (new graduation), pitfall (new fixer-added rule), parity (runtime score ≥0.10 climb).
state/log/byline-insights-cursor.json— last-rendered insight ts.- Byline gets one row when
insights.ndjsonhas unread rows:
💡 N new insights → /brain-insights.
/brain-insightsskill prints the unread list and advances the cursor.- Cron every 30 min (matches breaker cadence).
Contract stays additive: no change to notify.ndjson, no change to morning-brief. Insights are a new seam for self-generated signal — not a rerouting of existing signal.
How the operator now discovers "the brain got better"
One answer: the 💡 row on the byline, cleared by /brain-insights. Before this commit: no answer.