🧬 pulse

Family scheduler. Compiles each cell's HEARTBEAT.md into a crontab. Linux cron fires; pulse just keeps the file in sync. Generated 2026-06-15 18:29:59.

last tick
5m ago
scheduled
7 across 4 cells
inbox
0
misses (24h)
0

active schedules

statuscellcron (mountain)next firelast firemessage
✓ fired mother */30 * * * * 2026-06-15 18:30:00 2026-06-15 18:00:01 (157ms) steward pass — run the skill at .claude/skills/steward/SKILL.md (one deterministic sweep, then judgment on the summary)
✓ fired delta-market 0 3 * * * 2026-06-16 03:00:00 2026-06-15 03:00:01 (242ms) zeros pass (09:00 UTC = 3am Mountain summer / 2am winter): drain savedListings:pendingZeros and run the daily watch pass per skills/homezero/ZEROS.md.
✓ fired abstractor 0 4 * * * 2026-06-16 04:00:00 2026-06-15 04:00:01 (205ms) good morning — run `dream` to consolidate memory, wiki, and mentality. As the final step, republish your brain: `bun publish-brain.ts` so every market agent fast resolver picks up what you learned.
✓ fired delta-market 0 4 * * * 2026-06-16 04:00:00 2026-06-15 04:00:01 (162ms) good morning — run `dream` to consolidate memory, wiki, and mentality.
✓ fired mother 0 4 * * * 2026-06-16 04:00:00 2026-06-15 04:00:01 (154ms) dream consolidation — rebalance memory, wiki, and mentality
✓ fired tend-advisor-pete 0 4 * * * 2026-06-16 04:00:00 2026-06-15 04:00:01 (4.3s) good morning — run `dream` to consolidate memory, wiki, and mentality.
✓ fired tend-advisor-pete 0 7 * * * 2026-06-16 07:00:00 2026-06-15 07:00:01 (1.0s) time to write today's Tend coaching — pull your latest scored day from the Tend API, interpret it against your baseline and the week's trend, and POST the full narrative (recovery + strain + sleep headlines/bodies + daily line) to the coach endpoint. Drill is in IDENTITY.md.

recent fires

timecelllatencyresultcorr
2026-06-15 18:00:01 mother 157ms ok MDWJSJF4TA
2026-06-15 17:30:01 mother 150ms ok 37GRQY95RW
2026-06-15 17:00:01 mother 168ms ok H5H068YZDM
2026-06-15 16:30:01 mother 151ms ok 6VR4WBWC1V
2026-06-15 16:00:01 mother 175ms ok PNDW7XDY7W
2026-06-15 15:30:01 mother 133ms ok QS1V9896WV
2026-06-15 15:00:01 mother 159ms ok Z24H0WG9C6
2026-06-15 14:30:01 mother 150ms ok 9GXWCZ11RP
2026-06-15 14:00:01 mother 158ms ok S7X81ZSZ09
2026-06-15 13:30:01 mother 215ms ok 01615FGDZ6
2026-06-15 13:00:01 mother 228ms ok EK6QZZ732V
2026-06-15 12:30:01 mother 199ms ok VM9QANTWR1
2026-06-15 12:00:01 mother 157ms ok D9PKZH3S1C
2026-06-15 11:30:01 mother 165ms ok WGJBRM14N5
2026-06-15 11:00:01 mother 174ms ok 2F7RVRAQJK
2026-06-15 10:30:01 mother 164ms ok PVMA93PYJ3
2026-06-15 10:00:01 mother 514ms ok AAYC0H327P
2026-06-15 09:30:01 mother 151ms ok 57T9P5Y5T5
2026-06-15 09:00:01 mother 241ms ok HAX0KER9MF
2026-06-15 08:30:01 mother 164ms ok D7R37A3PT9

how pulse works

fleet cell edits HEARTBEAT.md
   │  (PostToolUse hook)
   ▼
proxy /heartbeat-changed
   │
   ▼
~/.cells/pulse-inbox/  ← Mac-side queue, survives pulse hibernating
   │  every ~60s
   ▼
[cells-pulse cell] claude --print runs the pulse skill:
   drain inbox → translate prose → cron lines
   save-schedule → writes /etc/cron.d/pulse-schedules
   render → refresh state/heartbeats.md digest
   render-dashboard → writes this page
   │
   ▼
/etc/cron.d/pulse-schedules  ← Linux cron evaluates every minute
   │  matched lines fire
   ▼
cron-fire.sh wraps:  cells talk --await <cell> "<msg>"
   │  times the call, logs latency + exit code
   ▼
/root/.cells/logs/cron-fires.log

Push for schedule updates, pull for firing. When a cell edits its HEARTBEAT.md, a hook pushes the change to pulse via the proxy. Pulse drains that inbox every ~60s, parses prose like "every weekday at 8am" into a 5-field crontab line, and writes it into /etc/cron.d/pulse-schedules. From there Linux cron is the fire engine — pulse is just the prose-to-cron compiler.

Cron is evaluated in Mountain time. Pulse's cell is pinned to America/Denver, so 0 8 * * * means 8am MDT/MST and DST is handled by the OS. Prose with explicit UTC times gets converted.

State survives hibernation. The inbox is Mac-side (~/.cells/pulse-inbox/); cells can push schedule updates even while pulse-cc is asleep, and pulse drains the backlog when it wakes. Per-cell parsed schedules live at pulse-cache/<cell>.json; the firing record is the cron-fires log inside the pulse cell.

Latency is the cell's response time. cells talk waits for the receiving cell to actually ack the message (default 180s timeout). A small latency means the cell was running and responsive. A latency near 180s usually means the talk timed out — the cell may have been hibernating and failed to wake. The "missed" status above means cron should have fired but no log entry showed up at all.

← fleet