Skip to content
Thrivbe
← All experiments
LiveStarted July 27, 2026Updated July 27, 2026

Does a pre-LLM agent architecture still have anything to teach a kernel built on LLMs?

Giving the AI OS Intentions — A 1987 Model Audits Our Kernel

  • thrivbe-os kernel
  • SQLite
  • Belief–Desire–Intention model (Bratman 1987, Rao & Georgeff)
  • Claude (design + verification)
  • Codex (implementation)

Relevant services: AI Digital Teammates · Thrivbe AI

Hypothesis

The Belief–Desire–Intention model is the dominant agent architecture of the pre-LLM era — a philosopher's theory of practical reasoning turned into 1990s software. Its machinery should be obsolete by now: BDI exists because agents of that era could not reason at runtime, and an LLM does exactly that job.

The hypothesis was that the machinery is the disposable part and the vocabulary isn't — that BDI's three-way split would find something in our kernel our own architecture reviews had missed.

What we built

We ran the model against thrivbe-os — the kernel behind Thrivbe's autonomous processes — as a diagnostic rather than a design.

The mapping was uncomfortable. Beliefs: strong — entity tables, vector memory, an event log, mirrors of every external system. Desires: present — vision, mission, and quarterly objectives, loaded from a machine-readable block. Intentions: absent. No table, no column, no concept.

The gap was concrete, not philosophical. Every run the kernel logged recorded which process ran and what it cost, and nothing about what it was for. Thirty-one processes fired on timers. Not one could answer "which goal did that advance?"

The fix was smaller than the diagnosis: one required field on the process definition — required, so the type-checker refuses to compile until every process declares what it serves. The reference is written into a JSON column that already existed, so there was no migration. Thirty-nine lines, most of them one-line declarations.

The design rule that mattered: none:unassigned had to be a legal and correct answer. Without that instruction a model tidies — it invents a plausible objective link for every process, and the resulting census is worthless. The point was to find the processes that serve nothing.

Learnings

Thirty-one processes declared themselves. Eleven are infrastructure with no goal above them, which is legitimate. Ten could not name an objective they serve. Ten do.

Then the harder number. Mapping the references back over thirty days of run history: 74% of the kernel's LLM spend was executing tasks a human had assigned it. The second-largest cost centre, at 21%, was a single advisory process that produces recommendations about priorities. Everything genuinely attached to a quarterly objective, combined, cost under 1%.

And two of the six current objectives — validating the core offer, and running Thrivbe as its own first client — had zero processes behind them. Not underserved. Nothing at all.

We had specced a second phase: a reconsideration loop to notice stalled commitments and ask whether to drop them. The spec carried a gate — build it only if the spend data showed real waste. It didn't; there was roughly 10 NOK/month of unattached spend to reclaim. We left phase two unbuilt. The gate did its job by stopping us.

The verdict on the old model: it earned its keep, but not as architecture. We implemented none of BDI's actual machinery — no plan library semantics, no intention stack, no deliberation cycle. An LLM is the practical reasoner that model was invented to approximate.

What it supplied was a question our own reviews had never asked: what is this process for? Cheap to answer in code, expensive to answer honestly. A workspace can hold excellent strategy documents and thirty-one healthy automated processes and still not be pursuing anything — and until you can query it, that gap stays invisible.

The two empty objectives are now a row in a table instead of a feeling.

Log

  • 2026-07-27 — Mapped BDI onto the kernel; found beliefs and desires present, intentions absent. Shipped the intention reference on every run (required field, no migration, 39 lines) and deployed to the kernel host. First live runs confirmed real references landing. Census: 11 infrastructure, 10 unassigned, 10 objective-attached; two objectives with zero processes. Phase two specced, gated, and deliberately not built.