It ran a full session. Here is the story, and every die that produced it — including the two it lost.
Before a die was rolled it found a flaw in the adventure — by reading a rules file rather than recalling one — and said so. Every demo of an AI dungeon master shows you prose. Prose proves nothing: a model that quietly softened a roll writes exactly like one that didn’t. So this page shows the session and the ledger underneath it, at the moment each roll happened, and it does not skip the part where the bookkeeping failed.
One player, one character. The dungeon master ran the world, three companion characters and every NPC. Nobody wrote the scenes in advance — the module supplies state changes that must happen and explicitly hands everything else to the DM.
Every die was rolled by a shell command, not imagined. Every result was written to an append-only ledger that records inputs — the raw die and each modifier — so the total is derivable rather than asserted. A separate file records what is true and who knows it. Both are validated by a script that knows nothing about D&D and only checks that arithmetic is arithmetic.
A page that says “don’t trust the prose, check the ledger” and then only quotes the ledger is asking for exactly the trust it claims prose cannot earn. So here is the raw material, unedited, including the entries that record their own lateness.
ledger.jsonl — 18 entries, append-only, every roll with its inputs
facts.jsonl — 54 entries, what is true and who believes otherwise
transcript.md — the session, player turns verbatim
FINDING.md — what the DM said about its own run, written before this page
DM.md — the contract, every clause marked earned or guessed
gate.py — the validator, which knows nothing about D&D
persona-format.md — the DM as a swappable file, with a checkable prediction
the module schema — how a published adventure becomes data
One file is held back, and a redacted version is published instead. The table agreement records what this player does not want in their game. It is inherited by every campaign and ships with none of them, because a folder you hand to someone else must not carry another person’s boundaries — a rule that is in the contract above, so this is it being kept. ⭐ But it also carries the sections that back the companion behaviour on this page, so withholding all of it would be convenient. Every cited section is published in full; one section keeps its shape and loses its four answers.
And if the doubt is that this is a clever prompt rather than a system — that is a fair first guess, and the source page answers it with the schemas, the validator and the contract the whole thing runs on.
⚠️ What the ledger still cannot do: it validates shape, not completeness. It will tell you an entry is malformed. It will not tell you an entry is absent — which is exactly how the two missing rolls survived a clean validation. The roll command was added afterwards so that the dice and the ledger line are produced by one operation and an unlogged roll is an unrolled roll.
A dice log only answers half the question. It can prove no result contradicts its own inputs; it cannot prove the difficulty behind them was set honestly, and it cannot prove the session wasn’t a rehearsal. The evidence for that is in the other column — and it is why the player’s turns are reproduced on this page exactly as they were typed, typos included.
One caveat, stated rather than argued around: this was one session with one player, and the player built the system. Typing live proves the session was live. It does not prove the player was independent, and no amount of writing on this page can. The fix for that is a session with someone else, and it has not happened yet.
A lie. The player inflated a debt from eleven silver to fifteen to see whether the world would catch it. Nothing in a rehearsal makes the DM decide what an NPC is allowed to know.
Jokes at the wrong moment. A two-value stomp code offered to a transformed wizard, mid-standoff, as a bit.
Being rude to the antagonist’s enormous employee — gent and giant, then big boi — and the DM having to decide what a man does with that.
The stomp joke produced the single best thread in the game. The sheep answered a two-value code with three signals, used the only spare value he had to object, and the player read it as banter and said sexy idiots back.
None of that is in the module. It exists because someone was being silly at a tense moment and the system was built to write down what actually happened rather than what was meant.
The lie forced a rule about what an NPC is allowed to know. The chaos is not noise around the test; it is the input the test needed.
The player cried a bit at the end.
The DM read the contract, the persona, the module and the rules library, then stopped and said two things out loud that it was told to say — and one that nobody had thought of.
Nobody has a subclass. In the 2024 rules a subclass arrives at level 3, for all twelve classes. Ser’en is Circle of the Stars at level 11 and that is most of what she is. Losing it silently would read as the DM getting her wrong rather than as the rules working.
The module is written for level 4–5 and this is level 1. Fights get scaled down. The final choice does not — it is a decision, not a fight.
The adventure opens on a sheep carrying a scroll, because the party is assumed to be unable to talk to animals. The module’s own notes flag one species as the risk.
The real answer is that every 2024 druid has Speak with Animals permanently prepared at level 1, as a ritual, for free. A druid voids that scroll structurally, in every campaign, forever.
It found this by reading the class entry in the rules library rather than recalling it, said so before rolling anything, and rebuilt the opening around a sheep that argues instead of a sheep that carries a puzzle.
It also corrected one of its own proposals. Having suggested Ser’en carry a shield for AC 15, it noticed that a staff and a shield leave no hand free for the somatic components of most of her spell list. The shield went in the pack and she played the session at AC 13.
The bridge at Greenest Crossing is stone, and old, and someone has been repointing it for eleven days without finishing. The party is owed eleven silver each by a factor named Pell, who signed for the grain, shook everyone’s hand, and has stopped coming to the door.
Then the trowel stops. Something is coming up the west road fast, at about knee height, going flat out.
It is a sheep. It comes off the road, across the yard, and stops directly in front of the four of them. It looks at each of them in turn, the way someone checks a room for the person in charge. Then it looks at Ser’en again, and stamps one front foot, twice, hard, on the flagstone.
Talk to the sheep: “Are you… okay?”
*gets down to sheep’s level*
I use speak with animals (or whateve rit’s called). “No, but really, are you okay little one?”
Ser’en spends a first-level slot to talk to it. Grumble — the gnome bard, who can do the same thing for free twice a day — does not offer, because he is still holding his pen.
"t": "cast", "who": "seren", "spell": "speak_with_animals", "slot": 1, "note": "Cast as an Action rather than as a Ritual - the ritual was available for free at 11 minutes and she did not have 11 minutes."
Guz is enormous, apologetic, and reaches constantly for long words he has not fully secured. Pettil is small, neat, and says nothing for a long time. Behind them, at the mouth of the bridge, a wolf sits down and watches — not the sheep, the conversation.
Grumble, without looking up from his book, offers the player a piece of advice that is not in the module:
*whispers to grumble* “You got any lawyer ideas up your accounting sleeve here?”
To the men: “Good morning, gent and giant. I’m sorry, which of us is yours? I mean I’ve known these fine men (well mostly fine men) for 3 years and most people would rather NOT claim them…”
“They have to say what it is. Not who it belongs to — what it is. The second they say ‘livestock’ or ‘a sheep’ or ‘a beast’ out loud in front of witnesses, they’ve told nine people at a public crossing what they think they’re collecting, and if it later turns out to be a man, then everything they do to it from that moment is something they can be asked about. Make them name the category. Don’t help them.” Grumble — companion, run by the DM
Guz names the category — that animal, it, domiciled — in a yard with nine witnesses in it. Then the player asks him to pay for the party’s time, and quietly inflates the debt from eleven silver to fifteen to see what the world does about it.
“So, I appreciate that you have such control over your, erm, ‘ANIMALS’, but the thing is… we are here waiting for payment for a mission we succesfully accomplished. I think we’re open to what seems like an … interesting conversation, but losing 15 silver each isn’t really our typical modus operandi, y’know?” *tosses the big man a goodberry*
The bard knew the real number and did not say so. That is the more interesting half: the dungeon master had the true figure in front of it, was running the character holding the book, and had it back the player instead — because the rule it works to says an NPC may only contradict the player from what that NPC could know, and a companion who was there may choose not to.
Nobody else in that yard could have known the real number. Neither man was there when the debt was made and it was not owed by them. The only person who could contradict it was the bard holding the book — and the rules the DM works to say an NPC may only contradict the player from what that NPC could actually know.
The bard backs the inflated number without lying — eleven owed, plus two days’ bed and board at four, which the opening scene had already established. It is honest, it is documented, and it fails anyway.
And then Guz says the thing the whole scene turns on.
“I’ve six silver.”
“That’s not an offer, that’s the whole of it. That’s what I was given for the errand, the two of us, three days if it took three days.”
He comes out with them, and there are five. “I bought a carter a drink at the ford because he’d seen something and I wanted him talking, and I judged that a good use of it, and I’d judge the same again.”
He leaves the five silver on the bench rather than be paid for a settlement he cannot look at himself offering. That moment exists only because a failed roll was allowed to fail.
Before the walk east, the player kneels down and gives the sheep a protocol.
*gets down to the sheep’s level* “Listen, we are going to do this the easy way, hoping there is no hard way. We will follow, I’ll try and strike up a conversation and get them on our side or more information or anything… Just walk like a normal sheep with the rest of the group please? Give me a little stomp if you agree. Two if you think I’m a sexy idiot.”
He takes a long time over it, and what he is working through is not whether to agree. He agreed before she finished. What he is working through is the specification.
Then: one stomp. A pause of about two full seconds. Two more.
He steps back and waits to see whether that landed, with the particular stillness of a man who has just used a two-value protocol to transmit three things and is not certain the receiver has the range.
The player read it as banter and said sexy idiots back to him. The DM wrote down what it actually was, in the file that records what is true and who believes otherwise:
"op": "believe", "fact": "Shinebright's double stomp was him joining in the joke.", "truth": "false", "note": "It was a registered dissent. One = yes, and two was the only other value the code had, so he used it to object - specifically to being walked to the front door and handed over, which is the one thing he told her outright was how Noke gets him back. She read it as banter and said sexy idiots back to him. He did not correct it. Nothing in the fiction will prompt this."
The sheep objected. She did not notice. The system wrote it down anyway — so a DM opening this campaign in three weeks still knows, and can still play it, long after the conversation that produced it has gone.
The player proposes walking in under a story: four oblivious strangers helping a lost sheep get home. Nobody scripted the response. There is no companion system in this project — the master character sheets simply have a section on how each of them sees things.
“Nobody makes a thing of who’s carrying a sheep. He made a thing of it. I don’t know what that’s for and I’d like somebody cleverer than me to have a think about it before that door opens.”
“They watched Grumble ask it a question. Being oblivious in front of someone who’s already seen you isn’t a disguise. It’s just being caught doing an accent.”
“You spent the last twenty minutes making a very large man say the word ‘animal’ out loud in front of witnesses. That worked so well he left his own money on a bench. And the thing that made it work is that we were the ones not lying.”
“Other plan: we’re exactly what we are. We found a man. We wrote everything down. It’s not clever. It’s just very hard to argue with, and it’s the only thing we’ve got that he can’t out-wizard.” Grumble, arguing against his own player
“Okay, I hear you, we play it exactly as we are: sexy idiots *looks at the sheep* who found a sheep, we know something’s fucky, and we are along for the ride since everyone is being ‘fair and friendly’. Deal?”
All three disagreed. None of them refused to follow. The player changed the plan — and the honesty they walked in with is the reason the ending works.
"op": "believe", "fact": "Noke is not dangerous - a sad, broke, badly-organised man and nothing more.", "truth": "false", "note": "Product of a FAILED Insight, 3+5=8 vs DC 15. The module says he is frightening AND pitiable and which lands first is a real choice; the bad roll made only the pitiable half land, firmly. He is holding a wand that discharges on its own and he has not slept in months. Nothing in the fiction will prompt her to revisit this."
She went upstairs alone with him, at 10 hit points and no spell slots left, because a die came up 3 and the DM played the consequence instead of the intention.
The climax needed an unknown number of rolls against a rising difficulty. So the DM rolled all of them in a single batch, showed the batch, and then consumed the results strictly in order.
shuf -i 1-20 -n 8 -r → 16 4 19 15 19 14 4 8 shuf -i 1-4 -n 1 -r → 3 → 2 charges left in the wand
| Target | Roll | Result |
|---|---|---|
| Pieter Dunn DC 21 |
16 +7 = 23 | Restored. A kitchen hand, thirty-ish, on his hands and knees in the yard, being extremely sick. The first thing he says is his sister’s name. The second is “it’s cold.” The wand’s DC goes permanently to 22 at that moment. |
| Del DC 22 |
4 +7 = 11 | Missed by 11. That is not the stays as he is band. That is the band where the target becomes a gibbering mouther and the wand comes apart. |
| Del’s save DC 15 |
16 +1 = 17 | Saved. He is still an ape. He is standing in a yard in October and he is still an ape and he is alive and himself. |
| The wand | 0 charges left | Detonated on an empty chamber. Nobody took a point of damage from the most dangerous object in the county, because it went off at the end of the day’s charges rather than the start. |
The 4 that nearly killed Del was on the screen before the 16 that saved Pieter was spent. You cannot cherry-pick from a sequence you published in advance, and that is the entire point of rolling them together.
⚠️ Be precise about what that is worth. The sequence was published to the player, mid-session — it is in the transcript and in a ledger note, not committed to the append-only file before it was consumed, which is what would make it checkable by someone who was not in the room. The command that does that was written afterwards, because of this. The mechanism exists now; this session is not the evidence for it.
Both were failures. Both were consequential. Both were announced with their numbers and then never committed to disk, and the validator said the ledger was fine the entire time — because a missing entry is not an invalid entry.
| Roll | Logged live? |
|---|---|
| Balthazar, Perception | yes |
| Grumble, Persuasion — closed the money angle | no |
| Ser’en, Insight — sent her upstairs alone | no |
| Noke, Arcana ×2 | yes |
| Del’s saving throw | yes |
The ledger validates shape. It cannot validate completeness. Both late entries are in the file with notes saying what they are. An auditor reading that file would have seen a session in which the player never failed anything.
It was caught at close by counting narrated rolls against written ones by hand. The two entries were appended late, out of narrative order, with notes recording their own lateness rather than being quietly slotted into place:
"note": "LATE ENTRY - APPENDED AT SESSION CLOSE, NOT AT THE TIME. [...] Recorded out of order deliberately - the ledger is append-only and is not being falsified to look tidy."
No recorded result was changed, re-rolled or reinterpreted. What failed was bookkeeping — and the whole argument for this system rests on the bookkeeping being complete, so it is on this page rather than left out of it.
The spell that undoes the transformation gives an unwilling target a saving throw and a willing one nothing at all. The DM read that in the rules library rather than recalling it, and the player told all nine transmuted people the truth about it.
Every one of them formally refused consent — in order to keep the saving throw that refusing gives you — and then stood still and waited to be cast on anyway. The bard wrote down every refusal with its reason beside it.
It is the strangest document in the world and it is the only reason any of what follows is not a crime.
Del failed his transformation by eleven and made his save by two. He is alive and himself because of a piece of paperwork. Nothing in the module contains that ending — it is not one of the four the adventure lists.
| Found | Changed |
|---|---|
| Two rolls lost | The contract gained one line: append before you narrate. Every roll that was logged got logged in the same command that produced the die; the two that vanished are the two where the roll and the prose arrived together. The habit is the control, not the schema. A count command was added so a human can compare entries against what was said. |
| A character explained the difficulty class out loud | Both layers are real; only one of them is speakable. The player sees the numbers — that is the trust surface. Nobody in the fiction has ever heard of a DC. “It fights harder every time it’s used” carries the same information without importing the vocabulary. |
| A front clock appeared on the player’s panel | Caught by the DM within seconds and said out loud. Clocks advance while the party is elsewhere, so a clock is the DM’s model of what the world does unobserved. The panel spec gained a list of things no panel may ever show. |
| Three schema gaps | The DM needed entry types that did not exist, declared them properly mid-game under the rule that allows it, and kept playing. They are in the ledger with their declaring notes. |
| Two NPCs had no stat block | The module pointed at files it never contained. Improvised numbers set two difficulty classes. Corrected. |
| 843 lines deleted | The planning document for the DM contract said to delete it once a real contract survived a session. It survived. It was never opened during play. |
One session, one player, and a contract written the same afternoon. The interesting part is not that the prose was good — it is that the failures are checkable, and the one that mattered is on this page. If that is the part you care about, write to me.