Built in practice. Shown in public. Not for sale as software.

Judgment can't be downloaded. It can be shown.

From Greek εὐβουλία — good deliberation. Twenty-five years in steering groups, then three years with LLMs that held the programme as chat, not as a register. Conversations become structured memory: risks classified, decisions versioned, stakeholders mapped. This is the workspace I built for my own practice, shown here on HORIZON, a fictional case.

See it in action Follow the build

Working reference implementation · Built in EU · Not a product — a practice

The problem

Four AIs on your desk.
They remember. Not as a register.

You use ChatGPT, Claude, Copilot, and Gemini every day. They remember now — but as prose, not as a register. A meeting summary is not a classified risk. And when something has to land in the register, you still copy-paste it yourself. You are the glue.

ChatGPT remembers in prose
Who Anna is, what the legacy system does, why Q3 matters — remembered as notes on Anthropic's, OpenAI's, or Google's servers, not in a record you keep.
They write summaries, not a register
They summarize the meeting transcript. They don't extract risks, classify them, link them to decisions, or version them when reality changes. The structured graph never builds up.
Vendor memory stays with the vendor
Memory lives at the vendor. When prices change, when models drift, when a client says "no Anthropic" — the memory stays there.
Domain ignorance
A fat-tail risk, a reference-class forecast, a decision option, a stakeholder map — generic AIs don't know what these are as structures. They write them as paragraphs, not as entities.
HORIZON — a fictional case

Not mockups. The working system.

A walkthrough of HORIZON — a fictional but fully worked engagement (PE-backed insurance core modernization, 420 MDKK, 36 months, 4 fat-tail risks). Every screen below is the actual workspace running on that case. Nothing is staged beyond the case itself.

Build note

Four opponents and a judge

The wargame panel: four personas attack the plan in parallel — the Flyvbjerg economist, the Repenning systems thinker, the Taleb skeptic, the Lean advocate. A judge cross-examines each attack (confirmed, weakened, or refuted), finds consensus attacks, and returns a verdict. The panel writes a draft artifact. It does not write the register. Run on the fictional HORIZON case.

Eubulia document extraction on the fictional HORIZON case: a Q3 board deck open beside proposed entities — risks, concerns, decisions, goals and milestones — each classified and awaiting approval
01 · From a HORIZON board pack to structure. A Q3 board deck proposes 71 entities — 13 risks, 7 concerns, 3 decisions, 5 goals, 11 milestones — classified by uncertainty type and fat-tail exposure. Nothing enters the register without approval. Fictional case.
Eubulia risk register on the fictional HORIZON case: risks with area, context, source document reference, dimension scoring, status and project columns
02 · A register that remembers where everything came from. Each risk carries its source document, its 5-dimension scoring profile and its status — versioned in a bitemporal graph. HORIZON, fictional.
Eubulia chat running a programme review of the fictional HORIZON case next to the risk register
03 · Chat against the register. A programme review returns state from structured data: 7 of 11 milestones on plan, 12 MDKK reserve remaining, three concerns flagged with reasoning — not a model's recollection. HORIZON, fictional.
Eubulia settings: model choice with Claude, Mistral EU, OpenAI and Gemini, an allowlist, GDPR mode and web-search controls
04 · The model is interchangeable. Claude, Mistral (EU), GPT or Gemini under one router. A GDPR setting can restrict routing to EU-deployed models when a client requires it. That is a setting, not a guarantee that every call stays in the EU.
Eubulia wargame panel on the fictional HORIZON case: consensus attacks from adversarial personas, with a note that two personas failed mid-run
05 · Krigsspillet. Fire adversarielle personaer angriber planen; en dommer krydsforhører. To fejlede undervejs. HORIZON, fiktiv case.
Why this exists

Why I built a register, not a longer prompt

Not a feature list. What I needed that a chat and a wiki could not hold as one register.

01
A chat is not a register.
Summaries stayed as summaries. Risks stayed as paragraphs. I needed worrying facts kept separate from classified risks — and a human commit before anything became the record.
02
Vendor memory is not a programme memory.
When the model or the price changed, the history stayed with the vendor. I put the record in Postgres, hosted in the EU, and let the model be interchangeable.
03
Frameworks as slides are not frameworks applied.
I needed Wardley, SWOT, and the rest run against the actual programme record and kept as artifacts — not described in a reply in a thread.
What is in the workspace
What I built. Not a catalogue of things nothing else does.
01
Frameworks applied
Wardley Maps, SWOT, Engagement Strategy, Repenning Systems Lens, Three-Groups Benefits — run against the programme record. Output persists as canvas views and slides.
WardleySWOTRepenningThree-Groups
02
Two-layer risk
Worrying facts (observable) kept separate from risks (classified by uncertainty type, epistemic confidence, fat-tail, prerequisite). Scored on five scenario dimensions.
worrying facts5 dimensionsfat-tail
03
Scenario landscape
Decision options compared on those five dimensions. Export as branded PowerPoint, PDF, or HTML.
optionsslide export
04
Wargame panel
Four personas attack in parallel; a judge cross-examines. Output is a draft artifact — it does not write the register.
FlyvbjergRepenningTalebLean
How it is built

Design choices, not promises to a reader without a login.

These are reasons I built it this way. They are not a product offering.

Hosted in the EU
The application runs on EU infrastructure (Render Frankfurt, Supabase EU). LLM calls go to the provider that is selected. EU-only routing is a setting, not the default for every call.
Chat threads as Markdown
A chat thread can be exported as Markdown. That is not a full export of the register or the graph.
No training on this data
I do not train models on the data in this workspace.
Notes
Build noteswhen there is something to show
Build notes when there is something to show — no cadence, no newsletter. Eubulia is a working reference implementation I build and use in real programme work, shown publicly on the fictional HORIZON case.

  • Build notes — decisions, trade-offs, and dead ends from building it
  • The HORIZON case — a fictional programme run through structured AI, in the open
  • Judgment, not hype — where AI helps programme leaders, and where it cannot replace experience
Questions

The questions other consultants ask first.

Is Eubulia for sale?
No. It is a working reference implementation I build and use in my own programme work. What you see here is the fictional HORIZON case. Follow the build notes if you want the research. hello@eubulia.eu
Why is the model interchangeable?
The record lives in Postgres, not in a vendor chat. LiteLLM routes Claude, GPT, Mistral, or Gemini. Switching models does not move the memory. EU-only routing is a setting, used when a client requires it — not the default for every call.
Why Postgres in the EU, not the vendor's chat history?
I needed a versioned record independent of which model I used that week. Structured entities sit in Postgres in the EU (Frankfurt). Chat threads can be exported as Markdown. That is not a full export of the graph.
What broke when I tried to run a programme in a chat window?
Those tools store memory at the vendor as loose notes on their servers. A summary of the meeting was not a risk in a register. When the model changed, the memory did not come with it. I was the glue: copy-pasting into the register. Eubulia stores memory as structured, versioned entities.
What “EU by default” actually means here.
The application runs on EU infrastructure (Render Frankfurt, Supabase EU). LLM calls go to the provider that is selected. A GDPR setting can restrict routing to EU-deployed models. Hosting in the EU is not the same as every model call staying in the EU.

Judgment can't be downloaded. It can be shown.

Eubulia is what AI-supported judgment looks like when someone with 25 years in steering groups builds it for their own practice. Follow the research and build notes — what works, what breaks, and what it means for how consulting changes.

Follow the build See it in action

The software is not for sale. The practice is. hello@eubulia.eu

Working reference implementation · Built in EU · Not a product — a practice