The owner's one place to read, listen to and decide on the game (owner, 2026-10-25: review items go
here, never into HumanToDo.md). Started 2026-10-16 as a one-off review of the chain story -> chapters
-> story modes -> shots (plans/story-review-chain.md, retired 2026-10-25, CHANGES #155; in git
history); it has since become the standing review workflow.
.venv/Scripts/python design/research/story-chain/serve.py
Then open http://localhost:8766 (#p1, #machine etc. open a tab). There are two pages (owner, 2026-11-02,
CHANGES #212):
review.html (tools/story/final_review.py): only what's in the game, each item once,final: + the backup's key forbackup.html at http://localhost:8766/backup.html (tools/story/chain_review.py): the designserve.py rebuilds a page from its sources each time it's loaded and saves every click to answers.json at
once. Both committed copies must stay current: generate_docs.py rebuilds both, and tests/test_chain_review.py
fails while either is stale; it also checks the final page shows every selected item (each screen, kept music
track, light show and callouts sound) exactly once and no workshop item. Restart serve.py after changing
serve.py itself.
| Tabs | Content | Sources |
|---|---|---|
| All game, Period 1-5, The Fall, Endings, Wheatley, Co-op, Attract | the story, the rules, the callouts with a sound list, the per-chapter shot tables, what's built | design/STORY.md, rule-sheets.md, callouts.md, the mode configs, the registry |
| GLaDOS, Cave, Caroline, Rattmann | every passage about the character, in story order | the same three docs |
| Choices, Time-outs | every choice and time-out as a card | design/choice-tree.yaml, design/timeouts.yaml (summaries of the story docs) |
| Attract (pages), Screens | every screen as rendered, with a review | the newest render in design/research/screen-review/ (tools/display/screen_review.py) |
| Sound library | every song and effect of the rip, IN USE badges, the famous bites | assets/sounds/, design/sounds/missing-bites.yaml, every doc that names a sound |
| Decisions | the open decisions, options side by side | options.md (picked ones move to decided-options.md) |
Each story block shows a plain-words summary first (plain.yaml: no codes, no file references,
context first), with the design text folded under it. A summary whose source changed shows as stale;
chain_review.py --plain-todo <file> lists those, and they're refreshed in the same pass as the
change. Each tab opens with an "In plain words" box (explainers.md).
answers.json without a done mark.done note on each one.options.md to decided-options.md.CHANGES.md entry.A sound row's answer key includes its callouts row's moment text. Put a note in the row's text cell,
never in the moment column, or the owner's answer comes loose. Struck-through files (~~...~~) get no
row.
serve.py: the local server.review.html: the final review page; backup.html: the workshop page (both generated).answers.json: every answer (with an archive of reset ones).options.md / decided-options.md: open and decided cards.plain.yaml, explainers.md: the plain-words texts.scoring-benchmark.md, music-plan.md, critics-meter-memory.md: background the cards cite.screenshots/: captures of the page itself.