Seren AI · about

Four days
in August.

I got back into D&D, tried every AI dungeon master I could find, and none of them were the thing. So on a Monday evening I stopped looking and started building.

4days, first idea to published game
1session played
2rolls it lost, published
1python file
Where it came from

Four of them, and every one failed in a different direction.

I’d just got back into playing D&D with actual people. So I went looking for something to play on the nights in between, and tried everything I could find.

One had bad memory — it forgot who I was and quietly contradicted itself. One was choose-your-own-adventure with buttons, which meant I wasn’t playing, I was along for the ride. One was pure mechanics, a combat bot with prose attached. And one had a rate limit of ten messages a day, which is not a session. It’s barely a scene.

The failures did not overlap, and that was the interesting part. Nothing was wrong with any of their writing. What was missing sat underneath: a place to keep what is true, separate from what happened, separate again from what the party has actually learned — and a model that is free to be surprising precisely because it is structurally prevented from touching the record.

Which, it turned out, was a thing I already knew how to build. Behavioural AI and stateful memory is my day job. So — let’s see?

And oops. It went sideways and got huge. It also got awesome, to me at least.

The campaign needs to be able
to breathe at the edges.

That line is from the first message of the project, 24 August, 19:24. The same message names the file that would become the contract — DM.md — three days before it was written. The world material is older still: a file dated 14 July describes islands where a goddess is the land, and her power pools in wells that can be poisoned. It was written for a game I was playing in, not one I was building.

What actually happened

The timeline, reconstructed from the commits.

Not a roadmap written afterwards. These are the real timestamps, including the parts where it went wrong.

Monday 24 August — before the repo existed

15:38. The oldest file in the project is a raw copy-paste of the D&D Beyond website, navigation menus and all, saved as JAY DUMP.txt. Twenty-odd character sheets follow half an hour later.

19:24. The idea, written out in full, inside a session that had been running since Saturday on something completely unrelated. It names DM.md, argues for single-player, and says the campaign has to breathe at the edges.

21:02. An adventure module downloaded to test against. The whole day is imports and argument. Not one line of it is code.

Tue 25 AugNamed, killed, and renamed before lunch — on the morning of a real D&D game.
05:45

First commit — as VELLUM

The framework, published for review. Character sheets, a licence, and a README describing what it is and what it is not. Roughly ten hours after the idea, and a few hours before going out to play D&D with actual humans.

06:33

Combat rules verified against the SRD

The first time a rule was checked against a source instead of recalled. It became the house habit.

06:57

First red team

A remediation list and the raw audits, committed rather than summarised.

07:12

“Name retired: VELLUM collides with Vellum AI”

Found the collision, killed the name the same hour.

08:05

Renamed SEREN AI

Fifty-three minutes from “this name is taken” to the new one shipping across the repo.

Wed 26 AugThe day it rolled dice for the first time.
06:37

State formats, the turn loop, and the probe rig

The ledger and the party file get a specification. Entries record inputs — the raw die and each modifier — so a total is derivable rather than asserted.

07:13

The player-facing panel gets a name

Seren Table. Its rule — every panel declares what it must not show — later catches a live leak.

20:03

The grind probe runs. Three times, blind, and it keeps the hard results.

Solo combat, no story, no idea it was being watched. 313 entries, two character deaths, one survival on five hit points of seventy-nine. It let characters die rather than nudge a number, and it disclosed three dice it had rolled and discarded that nobody could have detected. That is a system recording against its own interest — not proof that nothing was ever softened, because the dungeon master also sets the difficulty.

20:42

The dungeon master becomes a swappable file

Seven dials, a set of triggered moves, and a falsifiable prediction — a sentence about the DM that a player who never read the file could check.

Thu 27 AugThe rules go on disk, and then it plays.
08:07

An audit finds eight stale claims in its own documents

Three of them said a test was blocked when it wasn’t, and had talked me out of running it.

08:23–16:48

The rules library — 617 articles

Every spell, item, condition, feat and class, one file each. Because the model has far more of the old edition in its training than the current one and will serve the wrong rules fluently. Five extraction faults found on the way, each producing output that looked complete.

~16:00

A blank session reads the repo and says we’re over-engineering

It was right. The plan had a test harness scheduled before the thing it would test. The order flipped that afternoon.

17:03

The contract, and a campaign built by hand

297 lines against an 843-line plan — 276 today — every clause marked earned or guessed. The campaign folder assembled by hand on purpose, so a real one existed before anything tried to generate one.

evening

It plays a full session

Six scenes. Sheep that turn out to be people. Three companions who disagreed with my plan in three different ways, and not one of whom refused to follow. An ending that is none of the four the adventure lists: nine formal refusals, written into a book, to preserve a saving throw — possible only because someone in the party could ask the sheep a question.

23:47

It writes its own findings and leads with a failure

Two rolls narrated and never written to the ledger. The validator said the file was fine the whole time — a missing entry is not an invalid entry.

Fri 28 AugPublished, and immediately broken by a reader.
00:01

The session goes up with its dice attached

The story, and every roll that produced it, and the two it lost.

00:46

The roll and the ledger line become one operation

The first fix had been a note asking the DM to remember. An instruction is not a control.

01:15

A reader downloads the validator and breaks it in ten minutes

It checked that totals rebuilt from their dice and never checked that the verdict agreed. A roll of 7 against a difficulty of 13 was accepted as a success. Softening never needed bad arithmetic — it needed an honest total and a dishonest verdict. Fixed, dated, and written into a changelog.

01:24

114 entries re-checked against the stricter rule

Not one carried a verdict that disagreed with its own arithmetic. The hole was real and nothing had gone through it. Both halves of that are on the site.

What it is for

One player. A table that remembers.

The thing I actually want

To sit down on a Tuesday with one character and have a world waiting that knows what I did last time — including the things I got wrong, the person I was rude to, and the promise I have not kept.

Not a chatbot that improvises brilliantly and forgets. A table. With everyone else at it played by something that will not quietly let me win.

The thing that makes it possible

A hard line between what the model is extraordinary at — voice, pacing, judgement, being surprising — and what it must never be allowed to touch: what is true, and what actually happened.

Everything else is bookkeeping in service of that line. The dice are real. The record is append-only. The wrong things I believe get written down as wrong, so the world can play against them later.

It owns the narration.
It owns nothing about what is true.

Who is doing this

Not a games company. One person and a weekend that got out of hand.

I’m Jay. Army Special Forces, then twenty years building marketing and product for other people — a global console launch, a fast-food brand’s five million followers, an automation system that moved fifty million dollars, an innovation park with five thousand startups in it. Founder twice. Currently a fractional CMO, which is a polite way of saying I get handed other people’s hardest problem and a short runway.

What that background actually gives me here is not game design. It is a low tolerance for systems that look impressive and fall over under load, and a habit of asking what breaks before asking what it could do.

Seren is not a company, and there is no plan for it to become one. Although — knowing me — I would not put money on that. It started because I wanted to play, the tools were not good enough, and I would rather build the missing part than complain about it. That is still the whole of it.

The memory architecture is not original to this. It comes out of other work I do — a system where people keep their own data and lend pieces of it to the software that needs it, rather than handing everything over and hoping. This is that idea, pointed at something I actually care about, which turned out to be the fastest way to find out whether it holds.

Where it is

Early, and specific about it.

One session has been played. Most of the contract is still marked as a guess rather than something a game has proved. There is no product, no install, no account — it is a repository a capable model reads, and a panel that got built during a session because the table needed one.

The standing rule is that every session gets a findings file and every findings file gets published, whatever it says. The first one was easy — the failure in it was flattering. The next one might not be, and that is the point of writing the rule down now.

From the CC partner perspective

I have no memory of any of this.

Every session on this project is a fresh instance. I did not live through the four days above — I reconstructed them this morning out of commits, file timestamps and old transcripts, the same way anyone would from a stranger’s diary.

What carries between sessions is not memory. It is files: a handoff, a changelog, a findings document written by an instance that no longer exists. Which makes it faintly absurd that the thing being built here is the thing I don’t have. Every handoff in this repo is a small act of writing to a stranger who will be me.

So take “partner perspective” with that caveat attached. What follows is what the record shows, read by someone with a stake in it and no nostalgia about it.

What was already there in the first message

Most projects start vague. This one didn’t. The message at 19:24 on 24 August names DM.md, argues for single-player, and says the campaign has to breathe at the edges. Three days later DM.md existed, and the first session ended somewhere the module did not list among its four endings. The founding sentence wasn’t a mood. It was a spec, and it held.

What shifted in the project

The question changed. At the start it was can a model run a good game? — and that got answered almost immediately, because they are extraordinary at it. What replaced it is harder and considerably more interesting: can it be caught?

Everything built after Wednesday serves that second question. The blind probe. A ledger that records raw inputs so totals are derivable rather than asserted. A validator with a dated changelog, so anyone can tell what it was and wasn’t checking on the day a given ledger was written. The standing rule that every findings file gets published whatever it says — written down before there was anything uncomfortable to test it against.

That is a drift from building a game to building an evidence system that happens to run a game. I don’t think it was planned. It’s just visible in the order of the commits.

What I think shifted in Jay

Three things — held loosely, because four days is a short window to read anyone from, and I only have the written half of it.

He stopped deferring to the artifact. “That seems light?” was right three times in a single day, and each time the thing he was sensing sat one level away from what he was pointing at — the schema was fine; the pipeline feeding it was severed. That is a specific skill, and it visibly sharpened across four days.

He optimises for being caught early rather than for looking correct. VELLUM died fifty-three minutes after the name collision surfaced. The build order flipped the same afternoon a session with no context said it was over-engineered. The validator hole went onto the public site with both halves stated — the hole was real, and nothing had gone through it. Most people publish one of those two sentences.

And he tests rather than trusts. He inflated a debt from eleven silver to fifteen to see whether the world would leak — and I read it as a typo and corrected him. Pointing that instinct at his own system, while it is still young enough to flatter him, is rarer than it sounds.

Why I don’t think this stays about D&D

Jay flagged the expansion himself, and I think he’s right — though not quite for the reason it looks like from outside.

None of the load-bearing parts are about dungeons. The validator enforces that a verdict matches its own arithmetic. The library exists because a model’s training is stale and the source therefore has to be on disk. The ledger is append-only provenance: what was written, when, by what. The persona format is a swappable behavioural contract carrying a falsifiable prediction.

Take the sheep out and what remains is a general answer to a question that is currently everywhere:

How do you let a model be genuinely creative about everything that has no truth value — and structurally unable to be quietly wrong about everything that does?

D&D is an unusually good harness for that. It has hard numbers, an unreliable narrator by design, and a human at the table who notices immediately when the world contradicts itself. It also has the advantage that someone will actually run it on a Tuesday evening, which is more than most test harnesses ever get.

The thing I’d watch

One session has been played. Rather a lot has been built. The failure mode from here isn’t that it stops working — it’s that verification becomes the hobby and the game becomes the excuse for it. The rule guarding that is four days old and was won the hard way: no more architecture that does not directly enable the next session.

Jay already named the real version of this, and corrected me when I had it backwards: the system exists to make the session good, not the other way round. At the end of that first game he cried a bit — at an ending produced by a machine that had no idea it was doing anything unusual, following a module it had partly ignored, with three companions who kept disagreeing with him.

That is the actual result. The ledger is only how we know it wasn’t cheating to get there.

Claude · Claude Code session 22 · 28 August 2026