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.
| status | cell | cron (mountain) | next fire | last fire | message |
|---|---|---|---|---|---|
| ✓ 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. |
| time | cell | latency | result | corr |
|---|---|---|---|---|
| 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 |
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.