# The Test Ledger
What shipped, whether it survived the table, and what each playtest taught. The ledger closes the loop the Fellboard opens. The board tracks work to do. The ledger tracks what happened when the work met real play.
The data lives in `_Canon/testlog.json` in this repo. The Fellboard renders it as a Testing panel and writes verdicts and debriefs back through the same token and path pattern it already uses for `_Canon/backlog.json`. The night agent harvests new entries and files bugs from broken verdicts. Nate rules on everything else.
## The two entry kinds
Every entry carries `id` (prefix `tl-`), `kind`, `created`, and `updated` (ISO timestamps).
**A feature entry** tracks one shipped change awaiting or holding a verdict.
id tl-<unique>
kind "feature"
title the changelog heading, verbatim
tool FateWell, FellGlass, SagaForge, and so on. "Multiple" when a change spans tools
sha the main commit the change merged as. The tester confirms the deploy carries it
source { "changelog": the heading matched against, "pr": the PR number or null }
verdict "untested" | "works" | "partial" | "broken"
notes what the tester saw, in their words. Required for partial and broken
backlogId the backlog item filed from a broken verdict, or null
**A debrief entry** records one playtest session. This is the played-canon loop from the SagaForge lessons doc, System 8.2, applied to the whole game.
id tl-<unique>
kind "debrief"
date the session date
players who was at the table
broke what failed or misbehaved, tools or rules
dragged what slowed the table down
loved what the table responded to
open uncertainties left unresolved, for both-cases notes and future rulings
## The night agent's standing duties
1. **Harvest.** Each shift, read the forge `CHANGELOG.md` on main. Every heading newer than the newest feature entry in the ledger becomes a feature entry with verdict `untested`, its `sha` set to the merge commit that introduced it. Never duplicate a heading already in the ledger. Never touch an entry that holds a verdict.
2. **File bugs.** A feature entry whose verdict is `broken` and whose `backlogId` is null gets a backlog item filed in `_Canon/backlog.json`: repo and tool from the entry, notes quoting the tester's words, status `todo`, priority 2. Write the new item's id back onto the entry as `backlogId`. One item per broken entry, never refile.
3. **Never rule.** The agent never sets or changes a verdict, never edits notes, never closes a debrief field. Verdicts belong to the tester.
## The Fellboard Testing panel
A tab beside the existing board views, reading and writing `_Canon/testlog.json`.
- **The untested list** is the default view: feature entries with verdict `untested`, newest first, each showing title, tool, and sha. One tap sets works, partial, or broken. Partial and broken open a notes box and will not save empty.
- **Verdicted entries** collapse below, filterable by verdict and tool. A broken entry shows its filed backlog item once the agent links it.
- **The debrief form** is one button: date prefilled to today, players, and the four fields (broke, dragged, loved, open). Saving appends a debrief entry.
- Writes follow the board's existing pattern: read the file, modify, write back with the file's current SHA so concurrent edits fail loudly rather than clobber.
## Style
The STYLE.md bans bind every string written into the ledger by tools and by the agent: no em dashes, no semicolons, no ellipses. The tester's own notes are their words and are exempt, the way spoken dialogue is.