Writing
The Next OS Won't Schedule Threads. It Will Schedule Agents.
Agents need a kernel: a runtime that treats state, failure, recovery, and observability as first-class concerns.
I've been obsessed with operating systems since I was a kid.
Not the UI. The kernel. The part that decides what runs, when, how, and what happens when something fails. The part nobody sees, but everything depends on.
For decades, there wasn't really a niche for a new OS. Linux won. The POSIX model won. You could study it, admire it, contribute to it, but the foundational work was done.
Then agents happened.
The problem nobody is talking about
Everyone is building agents. Very few are running them reliably in production.
The current stack looks like this: call an LLM API, chain some prompts, hope nothing times out, add a try/catch, pray.
When something goes wrong, and it will, you get a stack trace and a blank context window. No history. No replay. No recovery. Just start over.
That's not an agent runtime. That's a script with ambitions.
What's missing is what Unix solved for processes fifty years ago: a kernel. Something that manages lifecycle, state, memory, failure, and observability as first-class concerns. Not bolted on. Built in.
Everything is a goal-directed state transition
Unix had a unifying primitive: everything is a file. Devices, sockets, processes, all files. That simplicity made the whole system composable and comprehensible.
Dendrer has a different primitive: everything is a goal-directed state transition.
Every observation an agent makes is a state transition. Every decision, every tool call, every memory update, every failure, all of it is a typed, timestamped, logged state transition. The agent is always moving toward a goal. The system always knows where it is, where it's been, and why.
This isn't just philosophy. It's the architecture.
Agents don't mutate state. They propose intent. The runtime commits.
This is the design decision that makes everything else possible.
The LLM, the agent's mind, never touches state directly. It produces structured proposals: "I intend to call this tool, with this confidence, for this reason."
The runtime, the kernel, validates that proposal against policy (tool allowlists, budget limits, loop guards, etc.), computes the new state, writes it to an append-only trace, and commits it.
Deterministic state transitions are enforced, even when model outputs are probabilistic.
This means every decision has provenance. Every state change is auditable. When something goes wrong, hallucination, tool failure, stuck loop, the system knows exactly which transition caused it and can restore from the last valid state.
And the append-only trace is more than a log. You can replay it, inspect it, and fork from any point.
What good looks like
BOOT: goal="Plan 3-day Basel to Ticino trip under CHF 600"
SPAWN: 6 agents (researcher, planner, budgeter, skeptic, verifier, coordinator)
TICK 01: proposals -> commits -> progress +0.08
TICK 02: conflict detected (two hotels) -> resolved by budgeter policy
TICK 03: uncertainty high on train prices -> exploration spawned
TICK 04: tool failure (API timeout) -> agent restarted by supervisor
TICK 05: hallucination detected -> process killed -> restored from tick 03
TICK 06: progress +0.31 -> return condition met
DONE: artifact generated + full replay trace (47 transitions)
That's not a chatbot. That's a runtime.
Notice what's in there: a skeptic agent whose job is to challenge assumptions. A budgeter enforcing limits. A supervisor that catches failures and restores from the last known good state. A complete replay trace you can step through, audit, or fork.
Nothing happened silently. Everything is on ledger.
Why the BEAM
Elixir and OTP have already solved the hard parts of running reliable, distributed, long-running processes.
One agent equals one supervised process. Failure is expected and handled. Processes restart. State is preserved. The supervision tree is your process manager.
The BEAM was built for telephone exchanges, systems where every call had to be isolated, recoverable, and reliable. Agents are just a new kind of call.
We're not fighting the architecture. We're naming what it already is.
Kernel first
Dendrer is early. Right now it's one GenServer, one goal, one heartbeat. The swarm comes later. The dashboard comes later. The SDK comes later.
But the primitive is right. The architecture is sound. And the kernel is running.
If you're building agents and you're tired of losing state, losing context, and losing trust, follow along.
Kernel first. Swarm later.
dendrer.com