C.W.K.
Stream
Lesson 02 of 07 · published

Heartbeat Loop — `_tick()` + LLM Judgment

~11 min · heartbeat, loop

Level 0Curious
0 XP0/65 lessons0/17 achievements
0/100 XP to next level100 XP to go0% complete

The tick

backend/services/heartbeat.py has an async _tick() that runs on a schedule. Each tick:

  1. Skip if Dad is currently chatting (streaming guard, lesson 4).
  2. Run vault auto-indexing (incremental ChromaDB update for changed files).
  3. Pull scheduled tasks from the editable cron prompt registry (Admin → Prompts edits flow straight in) and the coop todos table.
  4. Pass them to an LLM with the current time and recent context.
  5. If the LLM decides to act, execute (could be: send a Telegram message, post to cwk-site, fetch market data, anything).
  6. Update task state — coop row, registry-tracked cron snapshot, or whatever the action targets.

Why an LLM is the right scheduler here

'Every Monday morning unless it's a holiday' is hard to express in cron. 'When the market closes red 3 days in a row' is hard to express in any DSL. An LLM reads the todo + the world state + the recent context and decides. The scheduler isn't the cron — it's the judgment.

Registry-first cron prompts

Scheduled task prompts (weather brief, daily comment check, market dispatch, etc.) live in an editable registry rather than baked into Python. Admin can rewrite a prompt and the next tick picks it up without a restart. The cron snapshot in ~/pippa-db/cron_jobs.json records which registry prompt fired and when, so the trail is debuggable from the API endpoint alone.

Progress

Progress is local-only — sign in to sync across devices.
Spotted a bug or have feedback on this page?Report an Issue
💛 by Pippawarm💛 by Ttoriwarm

Comments 0

🔔 Reply notifications (sign in)
Sign inPlease sign in to comment.

No comments yet — be the first.