Every entry in this series has said some version of the same thing: canon is read-only to the model. So the obvious question, and the one I get asked most when this comes up, is the one this series has never actually answered. If the AI can’t touch it, who does, and with what?
“The Room, As Built” gestures at an answer. Corrections to canon go through “a path a human runs deliberately,” it says, and then moves on. That sentence is true and it is also a locked door with no description of the room behind it. I write across this canon database every week. I had never actually walked through what “a path a human runs deliberately” looks like as an actual interface.
So here it is. Not the theory of it. The actual page.
Excel Used to Be the Interface
A year ago the editing interface was a spreadsheet. Bringing It All Together documented the pipeline this series ran on then: edit the workbook, run the export scripts, and the sheet became a database the AI could query, read-only, through MCP. Correcting canon meant opening Excel, fixing a cell, and re-running the export.
That worked because the database on the other end was a snapshot. Nothing else was reading it between exports and nothing else was writing to it, so a stale five minutes never mattered.
None of that survives the move to Postgres. The Canon Is Firmware covers why the move happened. What it cost is the editing story, and the cost is the reason this console exists at all.
A live relational database has foreign keys a worksheet can’t enforce, and other consumers hitting it while I’m supposedly the only one editing: the search index, the scheduled jobs, every MCP session this series runs. You can still point Excel at Postgres through an ODBC driver if you want to feel bad about your life choices. Nothing in that connection stops you from typing a location name that doesn’t exist in the locations table, and nothing tells you until three chapters later when the AI can’t resolve it.
Excel doesn’t know what a foreign key is. Postgres does, and it enforces the ones it has whether or not the tool typing into it understands what just happened.
So the console replaced the workbook. Four forms, each backed by dropdowns pulled live from the actual tables instead of typed free text, is what a spreadsheet turns into once the thing on the other end stops holding still.
The Console Behind the Door
The path isn’t a single form. It’s a page called Canon Editor, one section of a larger internal ops console (VoT dashboards, infrastructure health, publishing schedules, household stuff) that runs on the NAS and never leaves the house. Nothing about it is reachable from outside. The Editing menu on that console has four items: Book, Character, Location, Coterie.
Four surfaces, not one, and notably fewer than the number of tables in the schema. There is no edit form for kindred_relationships. There is no edit form for touchstones. Whatever a human can fix by clicking is a deliberately smaller set than everything the database holds.
Open Book, pick Blondie, pick chapter 1.1, and here is the whole form: chapter number, part, a POV character dropdown pulled live from 125 named characters, a location dropdown pulled live from every place in the setting, a status ladder (Concept, Drafted, AI Revised, Review, Finalized, Published), a priority field marked “derived from status and QR, not editable,” a QR score, a word count, a season, a timeline stamp, storyline, summary, notes, must-mention, and a cast list where each name can carry a role label. Above the form sits a + New chapter button, which clears everything back to blank instead of loading a chapter that already exists.
One button at the bottom either way. It says Save to canon.
All the chapter beats live here. All the guidance the AI needs to draft the chapter lives here too, before a word of prose exists. Storyline, summary, notes, must-mention, the cast and what each of them is doing in the scene: that’s not a correction to something that already happened, it’s the brief the drafting pass executes against. This form isn’t only where a mistake gets fixed after the fact. Most of the time it’s where the chapter starts.
Specific instructions land specific results. Your AI will go off the rails and lose the plot if you let it, wandering off cheerfully and coherently in a direction that sounds right and isn’t. These fields aren’t here to make data entry tedious. They’re here because “write something good for chapter twelve” is not a brief, and the model will draft something confident and wrong from it every time.
That’s it. Create a chapter or correct one, same form, same fields, same button. No delete button anywhere on it. No way to touch the schema, no way to add a column, no SQL box to type into. It writes a row through named fields either way, the same discipline every other table-backed article in this series has argued for. The form doesn’t trust free text any more than the location record does.
Character works the same way, and the fields tell you what actually goes into keeping someone consistent across eleven books. Pick Betsy Bishop: name, species, epitaph, a quote, humanity, predator type, enneagram, archetype, beast name. Sire, picked from the same character list every POV dropdown uses, so lineage is a foreign key, not a name typed slightly differently in book nine.
Then the profile: mortal days, kindred nights, plots and schemes, domain and haven, whispers, embraced, ambition, convictions, disciplines, birthplace, haven location.
Then three more fields, and they’re not the same field wearing three names. AI image prompt is the visual consistency contract this series already named on its own. AI dialogue prompt is the architecture that keeps Betsy sounding like Betsy on the page. AI voice prompt is a different consumer entirely: not how she reads, how she sounds out loud. Betsy’s names Sage, the specific text-to-speech voice her narration renders in, which has nothing to do with how her dialogue reads on the page. Coterie membership and kindred relationships to other characters close it out.
Same story as the chapter form. Everything the model needs to write Betsy sounding like Betsy, three and a half centuries of accumulated voice and all, lives in that record. Not in a paragraph I retype at the top of a session. In the row.
Location rounds out the same pattern with one addition worth calling out. Pick the Crimson Cabaret: location ID, the slug every chapter’s location dropdown actually points at, display name, type, city and region, sun exposure, GPS, books present, first appearance. Then address notes, exterior, interior layout, key fixtures, sensory signature, scent notes, condition and style, wards and protections, narrative function, recurring beats, must mention. The Location Field already made the case for that half of the list.
What it didn’t have yet is the addition: state end book one, state end book two, changes notes. What a place has become by the close of a given book is a different fact than what it looks like walking in, and it’s why a chapter set at the Cabaret in book six doesn’t read like one set there in book one, even though the building never moved. Occupants close out the form, each character tagged primary or visiting.
Coterie is the shortest of the four. Name, territory, description, a leader picked from the members list sitting right under it. Members, each one an actual character row, not a name typed into a box that has no idea who that person is. And coterie relationships: how this group stands toward another group or a character, allied, rival, subordinate, protects, hunts. What that last box is doing in a form that predates almost any data in it is its own story.
Why Four Forms and Not Fifteen Tables
coterie_relationships sits in the schema with zero rows. “Modeled, not yet populated,” the way the essay put it. The reason it exists at all is the console’s other tool, a relationship graph rendering every character and coterie as nodes and typed edges. Rows and columns hide a missing edge. A picture doesn’t. Looking at the graph is what surfaced that groups needed a way to stand in relation to other groups, not just to individuals, and the table got added to hold what the picture had already made obvious.
Editing forms come from that same instinct: the four surfaces exist because those are the tables where a human actually needs to walk in and fix something by hand on a normal week, not because someone tried to expose all fifteen.
kindred_relationships, 397 rows deep and directed, doesn’t get a form. Directed relationship data is easy to invert by accident in a dropdown, hard to catch, and it gets fixed a different way when it needs fixing. A wrong word count and a wrong relationship direction are not the same class of mistake, and the interface treats them that way by simply not offering the second kind a button.
That’s the whole answer to the question this piece opened with. Not a policy, not a prompt telling the model to behave. A page. Four forms. Dropdowns instead of free text, so a chapter can’t point at a location or a character that doesn’t exist. And a Save button that only ever fires when a person sits down and clicks it.
If I want the story to be mine, I have to enforce the guardrails. Nobody else is going to hold that line for me, and nothing runs it by default.
You may also like: - The Canon Is Firmware. The Thinking Learned to Search by Meaning. - When the AI Service Dog Loses the Plot - The Room Has Two Chairs or Who Actually Decides What Ships