Tick-driven orchestration for long, autonomous agent runs. A deterministic Stage A reads settled reality and wakes the expensive LLM Stage B only when there's real work — then verifies at behavioral gates (refute, don't confirm). A domain-agnostic method with pluggable adapters (code + docs). Event-sourced; two runtimes (node + Python) at parity.
README
HeartBeat is a proof-driven development method: work is accepted only when its claims are backed by executable evidence and survive an adversarial attempt to refute them. Lifecycle: claim → implementation → executable proof → adversarial refutation → acceptance.
The non-determinism lives inside an agent's tasks; the gaps between them are deterministic. HeartBeat drops a cheap Stage A (bash/Python) observation into that gap — it reads settled reality and wakes the expensive Stage B (an LLM) only when there's real work — then verifies the result at a gate instead of trusting it.
Developer docs (source of truth): dev-plugin.md · dev-python.md · dev-tests.md. Concept: heartbeat.md · heartbeat-py.md. Architecture: adapters.md (making the method code- and docs-aware — two shipped domain adapters, in both runtimes node ≡ python — without giving up its generality). How-to guides (runnable): docs/howto/.
HeartBeat lets an agent drive a long, multi-phase project autonomously without supervision, without losing the thread, and without burning tokens idling. The project is described as a DAG: phases → tasks → dependencies → quality gates.
tick.sh (every 15–30 min) ← Stage A: pure bash, priority checks, ~0 tokens
│
├─ wakeAgent: false → nothing to do, sleep
└─ wakeAgent: true → the LLM is invoked ← Stage B: only when needed
Three things keep a multi-hour run honest. State is computed, not remembered —
events.jsonl is the append-only source of truth and state.json is a projection of
it, so a crashed session is rebuilt from the log and continues. Progress is verified,
not trusted — a phase advances only when its behavioral gate passes (does the thing
work, not does a file exist), and sensitive g