A working agent is a loop: observe an event, decide with a model, act through a tool — with durable state so nothing is lost between the three. Here is the shortest honest path from idea to production.
Most agent tutorials start with a chat box. That teaches the model call but hides the hard part: a production agent is not asked a question, it reacts to something that happened. So start from the event, not the prompt.
Write down one trigger you already emit — an order created, an alert fired, a document uploaded. That event is the contract. The observe stage turns it into a typed payload; the decide stage passes that payload to a model with a prompt narrow enough that you can write test cases for it; the act stage performs exactly one side effect, keyed so a retry cannot double-charge or double-post.
Then make the loop survivable. Durable, replayable events mean a crash costs you seconds, not the day's work, and a bad decision can be reproduced against the exact stream that caused it. With Pulse, those stages are declared in YAML and the whole loop runs as one binary — locally first, then on your own cluster once it earns production traffic.
Pick one real event trigger, normalise it into a typed payload, add a single model decision stage with a narrow prompt, then one idempotent action. Make the state durable, test against replayed events, and only then scale out.
Usually not at the start. A durable, replayable event stream already gives the agent the history it needs; add retrieval only when the agent must reason over documents it has never seen in the stream.
A single-trigger agent is typically an afternoon of work. Most of the remaining effort goes into durability, idempotent actions and observability — which is exactly what a runtime provides.
Observe ingests and normalises an event, decide calls a model to choose an action, and act performs it through a tool. Keeping the three explicit makes each one testable and replayable.
Pulse is free and self-hosted. Three commands, three minutes.
Get started