Tidewright Find /
๐Ÿ“ Infrastructure

Character Design

How a player character is recorded, developed, and woven into the campaign โ€” and the line between what they told you and what you're considering

At a Glance

What this is
The standing spec for every character page โ€” player characters and the antagonist alike. Read it before writing one.
The core rule
A dossier is a record, not an invention. Everything on it traces to something the player said. Speculation lives on the thread page.
Derived from
This repo's own failures โ€” see below โ€” plus the NPC slots already established in Module Design
Not covered
NPCs. They have their own slots in Module Design (Wants / Needs / Has, Standing) and a different job.

Why this exists

Four player-character pages were written before this spec, and writing them surfaced three problems that were not going to fix themselves.

The problemHow it showed upWhat this spec does about it
Silence reads as fact Canon is frozen once written. A dossier that says nothing about a character's origin looks, later, like a dossier asserting they have none. Deliberately Unwritten is a required dossier slot. Gaps are named as gaps.
Volatile data under a freeze Haxami's dossier carries an At the Table statblock annotated this section updates as he levels โ€” a mutable block inside a page the rules call fixed. The sheet moves to the thread page. A dossier holds nothing that changes on its own.
Speculation leaking into lore Senna Vesh, the Drowned Chapel and the drowned choristers were scaffold examples that leaked into acts.html and read as real campaign lore. A whole planning session was built on them before anyone checked. Thread pages are quarantined from the digest and marked speculative on their face.

The third one is the expensive one, and it is the reason notes/back-pocket.md lives outside pages/ with a standing instruction not to reintroduce anything in it. Brainstorming is supposed to contain contradictory and discarded ideas. That is what makes it useful and what makes it dangerous to file beside settled canon.

Three tiers of truth

Every sentence written about a character sits in exactly one of these. Knowing which one is the whole discipline.

TierIsMarker & homeChanges when
Dossier What the player told you. Settled identity โ€” lineage, class, temperament, the facts of their history. ๐Ÿ”’ Canon ยท pages/canon/<name>.html Jack says so. Rare.
Addendum One piece of that history, grown big enough to want its own page. ๐Ÿ”’ Canon ยท pages/canon/<name>-<topic>.html Jack says so. Rare.
Thread What the DM is considering. Arcs, hooks, reveals, the current sheet, ideas that may never fire. ๐ŸŒŠ Fluid ยท pages/threads/<name>.html Constantly. No ceremony.

The boundary that matters most

The DM does not write a player character's wants. This is the sharp difference from the NPC slots in Module Design โ€” an NPC's Wants / Needs / Has is yours to author, because you play them. A PC's is not. The dossier records what the player handed over, in their terms, and stops. Anything you would like to be true about them is a thread-page idea until they say it, and it is marked as yours.

The dossier โ€” slots

Seven slots. Six are required. It should fit on one screen โ€” that is what makes it usable at the table, and it is why long backstory becomes an addendum rather than another section here.

SlotHoldsThe rule
1 ยท At a Glance
a .glance block
Who ยท lineage ยท build ยท the one distinguishing trait ยท the open question they carry ยท statusSix lines. Every line traces to the player.
2 ยท IdentityLineage, class, pronouns, and nothing else that isn't settledState pronouns explicitly. Do not infer them from the name.
3 ยท The distinguishing thingWhatever the player led with โ€” the second self, the skin, the kitchen. One section, named for the thing itself.Name the section after the trait, not after a category. The Second Self, not Personality.
4 ยท The tensionThe internal conflict the player built in: the barbarian afraid to rage, the curious woman who won't actRecord it flat. Do not resolve it, and do not editorialise about how it will play.
5 ยท What they're looking forTheir stated aim, however vague โ€” including they don't knowVagueness is data. A purpose, in Onda is a complete answer and should be written as one.
6 ยท Deliberately Unwritten
a .lore block ยท required
Every gap, named. Class, sheet, history, the parts of the lineage not yet settled โ€” and who owes the answer.The single most important slot. Under a freeze rule, an unnamed gap hardens into a fact. Name it and it stays a gap.
7 ยท SheetNot here. AC, HP, level and kit change every few sessions and belong on the thread page. A dossier holds nothing that changes on its own.

Addenda

When one piece of a character's history gets big enough to crowd the dossier, it becomes its own canon page rather than a longer section. The pattern is The Ophidian's Summons โ€” Haxami's dossier stays tight, and the contract that carried him to the isles gets the room it needs.

The thread page โ€” slots

One per character, plus one for the antagonist. This is the workbench: ๐ŸŒŠ Fluid, revisable, and speculative on its face. It opens with a standing disclaimer so no reader โ€” human or otherwise โ€” mistakes an idea for a decision.

SlotHoldsThe rule
1 ยท Standing
a .lore block
A one-line statement that everything below is unconfirmed DM thinking, and a link to the dossier for what is actually settledRequired, and first. This is the quarantine label.
2 ยท Settled, in one lineThe dossier compressed to a sentence, so the page is readable aloneNever restate canon at length. Link it. A second copy is a second thing to keep in sync, and it will lose.
3 ยท The open questionThe one thing about them that isn't answered yet โ€” the origin of the magic, the name of the race, what the ambition is forOne question. If there are three, this character has three threads and needs them separated.
4 ยท Candidate answersOptions, each with what it buys, what it costs, and what it would contradictDo not cull, and do not pick. A thread page collects; it does not decide. State a concern on a weak option rather than striking it โ€” the choosing happens in one later pass across all the threads (see the tapestry), and an option culled early cannot be reconsidered there. Strike through only what Jack has explicitly killed, and keep his reason.
5 ยท HooksConcrete ways this could enter play, each tied to a scene or a sessionA hook that names no session is a wish. Give it a slot or mark it parked.
6 ยท What they'd trade for itThe price they'd pay to get what they want โ€” the thing that makes them choose at the tableFeeds the weave directly. This is the column that makes threads collide.
7 ยท The sheetLevel, AC, HP, kit โ€” the .statblock that used to sit on the dossierUpdate it when they level. That is the whole reason it lives here.
8 ยท PromotedA running list of what has moved from this page into canon or the spine, and whenThe audit trail. Without it you cannot tell a settled fact from an idea you've read five times.

The weave

pages/threads/index.html โ€” where the separate threads are read against each other. It is a table, not an essay.

Why not prose

A prose synthesis is written once, beautifully, and then silently goes stale the first time any thread page changes โ€” and nothing about reading it tells you it has. A table with one row per character survives edits, because updating one cell is obviously cheaper than rewriting an argument. More importantly, the collisions between threads are the actual output, and a table shows them by putting the columns side by side. Prose buries them.

Columns: character ยท what they want ยท what they'd trade for it ยท whose thread it touches ยท which session it could fire in. The fourth column is the one that earns the page โ€” two characters wanting incompatible things from the same NPC is a night of play, and it is invisible until the rows sit next to each other.

The tapestry pass

The thread pages are collection. The tapestry is the one later pass where they become a story.

It happens once every character has a thread page and the villain has one, and it is deliberately not incremental: you sit with every candidate from every character at the same time, and you choose the set that makes the best single story โ€” not the best answer per character. A candidate that is second-best for Haxami alone may be the one that collides properly with Marellius's ambition, and you cannot see that while writing Haxami's page.

Why nothing gets culled before then

Culling on a thread page is culling with one character in view. The option you strike because it is weak for Haxami is gone by the time you can see it was the load-bearing one for the party. Weak options cost a paragraph; a missing option costs the idea. So: state your concern, keep the option, and let the tapestry pass do the killing โ€” with every thread on the table at once.

Only two things get struck before the tapestry: what Jack has explicitly killed (keep his reason), and what contradicts frozen canon โ€” those were never candidates.

Which way material moves

Three documents describe a character. Without a stated direction of flow you get three that disagree and no way to tell which is current.

FromToHow
ThreadDossierPromotion. The player confirms it, Jack approves the canon edit, the fact moves and the thread page logs it under Promoted.
Threadthe module run-sheet โ€” the arcA hook that gets scheduled becomes part of the arc. Log it under Promoted.
DossierThreadNever. A thread page links to the dossier; it does not copy it, and it must not contradict it.
SpineThreadNever. The spine is what we decided to run. Reopening it happens by editing the spine, not by re-speculating downstream.

The antagonist follows the same shape. Serrin gets a thread page like everyone else; the module run-sheet remains the settled arc. Do not build a second villain document beside it โ€” two pages describing the same antagonist is the drift this rule exists to prevent.

The digest tier

bin/build-canon-digest excludes pages by path only โ€” a _ prefix, template in the name, or the workshop folder. Markers do not exclude anything; they are read for display and nothing more. A ๐ŸŒŠ Fluid page under pages/ lands in llms-full.txt at full weight, beside frozen canon.

So thread pages get their own tier:

The point of the split

You can hand an AI the world as settled or the world plus everything we're considering โ€” and it is a choice you make per task, rather than a contamination you discover three sessions later. llms-full.txt is already ~60k tokens; brainstorming would both bloat it and poison it.

Prose rules

What we don't do