Every agent product that launched this year has the same quiet problem: the model is great at the current turn and useless at the next one. You tell it "ship the release", it says "sure, I'll cut it once CI passes", and then nothing happens. The turn ended. There is no one left in the room to notice CI went green.
Muse, Dots, Grok Bot, OpenClaw and Hermes all solve this with the same two ideas: a goal (what must be true when we are done) and a heartbeat (something that wakes the agent up and asks "are we there yet?"). They differ in where the goal comes from and who owns the clock. This post is a plain-English comparison, then a concrete fix I shipped to Hermes.
Muse has one agent per user, not one per conversation. That one agent wakes up on a timer, roughly every 30 minutes, plus whenever an event fires (new message, calendar change, webhook). It is not heartbeating every chat thread; it heartbeats itself and then looks at a single Goals ledger.
goal.get(), goal.create(objective, token_budget) and goal.complete(). The model decides mid-turn to call goal.create; there is no "inference step" after the first message. Simple requests get no goal at all.goal.complete() is gated by a completion audit; the model saying "done" does nothing.NO_REPLY and the user never sees them.Why it works: one clock, one ledger, one judge. The goal lives outside any chat thread, so a dead thread does not kill the work.
Dots (the Codex personal agent) is the most explicit about separating "the thing I promised" from "the conversation where I promised it".
Why it works: the schedule and the acceptance check are data the harness enforces, so the model cannot drift or forget.