Agent Health — user-facing cron agents
Measured 2026-04-18. Source of truth is state/log/evals.ndjson plus the artifact files listed below. This page covers the two most visible agents in the byline (inbox-sweep, content-mine) plus their health dependencies.
Summary table
| Agent | Status | Last OK ts (UTC) | Evals 7d | Mean score | Artifact produced |
|---|---|---|---|---|---|
| inbox-sweep | healthy | 2026-04-18T21:00:14Z | 8 (all 2026-04-18) | 1.000 | state/log/sweep-snapshots/2026-04-18T22-19-inbox.json (4 items: 3 Gmail threads + 1 LinkedIn DM) |
| content-mine | healthy | 2026-04-18T22:25:24Z | 24 (2026-04-17/18) | 1.000 | state/log/content_atoms-9afe08db-96.ndjson (2 kept atoms at robert_signal 0.9–0.95) |
inbox-sweep
- Skill:
state/skills/inbox-sweep.md—sweepAll()fanout (Slack/Gmail/LinkedIn/Skool). - Execution path: agent sessions spawned by
state/bin/agents/tick.sh(every 10 min) callfetchLinkedInDMs+ upstreamsweepAll(). Snapshots land instate/log/sweep-snapshots/<ts>-inbox.json. - Evals 7d: 8 rows, all
score=1, verbfetchLinkedInDMs. Latest 21:00 UTC. - Sample artifact (
2026-04-18T22-19-inbox.json): 3 Gmail threads (Beautiful Life Studios re: Photographer Update; Dimitris Goudis re: State Change Mastermind; Neary re: Thank you for your time) + 1 LinkedIn Offer promo DM. Allawaiting_reply: false. No errors object populated. - Known issues:
- Byline
rate_for_label()case for__sweep__searched for"skill":"linkedin-sweep"; evals write"skill":"inbox-sweep". Fixed in this audit — patchedstate/bin/byline/tui.shto match the real skill name so next-run ETA renders instead of-. - Byline catalog row
swpinstate/bin/byline/agents.shstill points at missing~/.claude/skills/snappy-inbox-sweep/linkedin-sweep-cron.sh(only backup copies exist under.claude/_backups/). Agent is NOT blocked — production pathway isstate/bin/agents/tick.shwhich callssweepAll()directly — but/snappy-run inbox-sweepfrom byline would fail. Replacement command:cd $HOME/projects/snappy-os && npx tsx state/lib/sweep.ts sweep. Not applied (owner reverted a prior attempt); flagging as open question rather than defect. - Known artifacts not fixed:
~/.claude/logs/linkedin-sweep.logshows "LinkedIn auth expired" entries through 2026-04-18T02:53Z, then only tick-exit lines. That log belongs to the dead cron pathway; the production pathway writes tostate/log/sweep-snapshots/andstate/log/evals.ndjson, which are healthy. - Open questions: is the dead linkedin-sweep-cron.sh pathway actually dead or just dormant? If an old cron entry re-activates, it will fail. Worth grepping for it next sweep.
content-mine
- Skill:
state/skills/content-mine.md— graduated, sidecar atstate/bin/content-mine/tick.ts. - Execution path:
claude-cron.sh content-mineevery hour, runsstate/bin/content-mine/tick.tswhich extracts commits since the last run, gates viarequireCitations(), scores viadispatch({model:"gemini"}), keeps atoms at robert_signal ≥ 0.6, writes tostate/log/content_atoms-<run_id>.ndjson, appends tostate/log/evals.ndjson. - Evals 7d: 24 rows, mean 1.000. The one 0.0 row on 2026-04-17T16:18Z (
signal-dispatch-failed) was the gemini quota cap before fallback-to-heuristic was added. - Sample artifact (
content_atoms-9afe08db-96.ndjson@ 21:56Z): 2 commits since the prior tick, both kept. Example line:
{"run_id":"9afe08db-96","sha":"d4e604d2","subject":"pod-26: lint cleanup — sidecars + SYNC_ALLOW + cli.js autopilot verb","robert_signal":0.9,"kept":true}
- Recent recovery: cron log
claude-cron-content-mine.20260418-141500.logrecorded a P1 friction — the then-currenttick.tshad../lib/voice.tsimports that resolved to a non-existentstate/bin/lib/. Convention is../../lib/. The current sidecar uses the correct path (lines 7–8) so the friction is closed. Post-17:17Z ticks all recordedsignal_mode:"dispatch"and produced atoms. - Manual verification: I ran
npx tsx state/bin/content-mine/tick.tsin this session — printed{run_id:"e1d4418a-23", raw:50, cited:50, kept:50, signal_mode:"dispatch"}. - Open questions: sidecar still imports
dispatchwithtools:[]per kernel contract; confirm gemini quota headroom for the next 24h so we don't fall back to the 0.7 heuristic.
Fixes shipped in this audit
state/bin/byline/tui.sh—__sweep__pattern matches"skill":"inbox-sweep"(the actual written name); prior"linkedin-sweep"never matched any eval row so the byline ETA displayed-.
No functional changes to either agent's execution path. Both were already running; byline visibility of inbox-sweep was broken because the skill-name pattern was stale.
Open items
- Reconcile
state/bin/byline/agents.shswprow with reality — it references a script that only exists under.claude/_backups/. Either restore the script or point the row atnpx tsx state/lib/sweep.ts sweepso/snappy-run inbox-sweepfrom byline works. - Decide whether
~/.claude/logs/linkedin-sweep.logshould be retired or repurposed — it is referenced aslive_logby the byline row but is no longer written by the active pathway.