Skip to content

Remove false agency and the metaphorical carry from the three held-back pages - #141

Merged
mmacy merged 2 commits into
mainfrom
chunk/prose-agency-2
Sep 15, 2026
Merged

mmacy merged 2 commits into
mainfrom
chunk/prose-agency-2

Conversation

@mmacy

@mmacy mmacy commented Sep 15, 2026

Copy link
Copy Markdown
Owner

Summary

The three pages held back from #138 get the same pass, now that the typed referee view has landed in them. The defects are the ones #72 names: a narrative block that carries a field, triggers and quests that play themselves, a journal entry that speaks, a result envelope that picks events up off the log, a finished quest that leaves the list, command handlers that know what a fetch quest is, and the sentence #72 quotes directly, a hand-issued completion "that expects the payout to follow on its own". The LLM referee page also held the register problems: every em dash and semicolon left in the hand-written docs was on it, along with an evaluative opening and a sentence that described the page instead of the subject.

37 changes across 3 pages, in two commits: the pass itself and the four sentence corrections review asked for. 19 apply the agency, carry, and reference rules from #72; 18 apply the house prose rules the maintainer asked for in the same pass. Where one sentence had both, the row names both and the change is counted under #72's rule. The two guides needed few changes (7 of the 37) because they were already close; the LLM referee page took the rest.

No headings changed, no code identifiers, field names, rejection codes, message codes, or content ids changed, nothing inside a fenced block changed, and every line number is the same before and after.

docs/adaptations.md is still outstanding, held until the magic-phase chunk editing it merges.

Verification

  • uv run mkdocs build --strict passes.
  • uv run pytest tests/test_docs_gates.py tests/test_docs_examples.py tests/test_docs_site.py -q: 377 passed, 73 skipped.
  • The full gate: ruff format --check (160 files already formatted), ruff check (all checks passed), pyright (0 errors), uv run pytest -q (2930 passed, 146 skipped, 6 xfailed).
  • No CHANGELOG.md entry: prose corrections are not behavior changes.

Review table

File and line Before After Reason
docs/guides/views-and-visibility.md:26 the view also carries that weapon's qualities and missile_ranges the view also includes that weapon's qualities and missile_ranges Metaphorical carry, on a page where a party member literally carries an item.
docs/guides/views-and-visibility.md:26 such as a staff of striking still reading "a staff", carries neither field such as a staff of striking still reading "a staff", includes neither field The same carry, two clauses later.
docs/guides/views-and-visibility.md:59 a finished quest leaves the list, because its record is the journal a finished quest is no longer in PlayerView.quests, because its record is the journal A quest cannot leave a projection. The same correction review asked for on the TUI crawler page in #138. The projection is named outright because "it" had two nearer nouns to point at.
docs/guides/listeners-and-flags.md:3 They don't know what a fetch quest is, what a lever in a guard room does, or what your game's win condition looks like They have no rule for a fetch quest, for a lever in a guard room, or for your game's win condition Cognition given to command handlers.
docs/guides/listeners-and-flags.md:31 the journal entry that recorded it the journal entry that recorded the opening "It" could point at the move or at the portcullis. The same fix #138 made to sessions-commands-events.md:11, which is the same sentence.
docs/guides/listeners-and-flags.md:71 the result envelope picks those up from the log execute folds those into the result from the log An envelope picks nothing up. Line 31 of the same page already says execute folds the log into the result.
docs/guides/listeners-and-flags.md:77 because everything a quest needs is on this page's surface: a listener that watches events because this page's surface is all it takes: a listener that watches events A quest cannot need anything.
docs/front-ends/llm-referees.md:3 An LLM-driven referee — a model that reads the game and decides what happens next — is a first-class consumer of osrlib, not an afterthought An LLM-driven referee (a model that reads the game and decides what happens next) is one of the consumers osrlib is built for Em-dash pair, an evaluative adjective, and a contrast with an alternative nobody proposed. The index already lists an LLM referee among the kinds of consumer osrlib is designed for.
docs/front-ends/llm-referees.md:3 Everything such an agent would consume ships today Everything such an agent consumes ships with the library "Today" dates the sentence.
docs/front-ends/llm-referees.md:3 This page assembles the pieces: … every fragment along the way is an excerpt of it … every snippet along the way comes from it The page describing itself, and "excerpt" for a snippet. The wording now matches the other guides.
docs/front-ends/llm-referees.md:7 events.json — the complete command and event surfaces as discriminated-union JSON Schemas, keyed on command_type and event_type events.json. The command surface is a discriminated-union JSON Schema keyed on command_type, and the event surface is one keyed on event_type Em dash. The two surfaces and their two discriminator fields are now paired one to one in the sentence rather than left to the reader to distribute.
docs/front-ends/llm-referees.md:7 accept and emit**;** [the command schema reference] accept and emit**.** [The command schema reference] Semicolon.
docs/front-ends/llm-referees.md:9 The same unions are importable — AnyCommand and AnyEvent — so a Python agent The same unions are importable as AnyCommand and AnyEvent, so a Python agent Em-dash pair.
docs/front-ends/llm-referees.md:24 The whole command surface and the whole event surface, one discriminator field each — an agent framework The whole command surface and the whole event surface have one discriminator field each**.** An agent framework Em dash joining two independent clauses.
docs/front-ends/llm-referees.md:37 the full session state — party internals, monster hit points, session flags, door states, the complete event log — with exactly two things withheld, the RNG internals and the master seed (those live only in the save document) the full session state (party internals, monster hit points, session flags, door states, the complete event log) with exactly two things withheld, the RNG internals and the master seed**, which live only in the save document** An em-dash pair around a five-item list, with a parenthesis immediately after it.
docs/front-ends/llm-referees.md:37 an enumerated whitelist**;** [Views and visibility] draws the line precisely an enumerated whitelist**.** [Views and visibility] draws the line precisely Semicolon.
docs/front-ends/llm-referees.md:48 The event stream carries the same privilege The event stream is unfiltered for the same reason Metaphorical carry. The replacement states the mechanism rather than attributing a privilege to a stream.
docs/front-ends/llm-referees.md:48 referee-visibility events carry the hidden rolls — surprise, reaction, secret-door detection — that a player-facing front end must strip at its wire (as [the FastAPI pattern] does) referee-visibility events include the hidden rolls (surprise, reaction, secret-door detection) that a player-facing front end must strip at its wire**, as [the FastAPI pattern] does** Metaphorical carry, an em-dash pair, and a parenthesis right after it.
docs/front-ends/llm-referees.md:48 An in-process referee agent reads them all**;** they are its perception An in-process referee agent reads them all**.** They are its perception Semicolon.
docs/front-ends/llm-referees.md:59 Player commands let the model drive the party's turn**;** referee commands let it run the table Player commands let the model drive the party's turn**.** Referee commands let it run the table Semicolon.
docs/front-ends/llm-referees.md:59 They ride the same envelope and the same rejection discipline as everything else — no separate API, just more entries in the union They use the same envelope and the same rejection discipline as everything else**:** no separate API, only more entries in the union Commands do not ride an envelope. Em dash, minimizer.
docs/front-ends/llm-referees.md:61-67 seven referee-command bullets, each [Command][…] — gloss each [Command][…] - gloss The em dash inside a list item.
docs/front-ends/llm-referees.md:61 that listeners and later narration can react to**; see** [Listeners and flags] that listeners and later narration can react to**. See** [Listeners and flags] Semicolon.
docs/front-ends/llm-referees.md:66 a journal entry speaks to the players and ships in their view a journal entry is written for the players and ships in their view An entry does not speak. "A journal beat is written for the table" is how the views guide states the same fact.
docs/front-ends/llm-referees.md:67 advance authored quest state by hand, with one sharp edge: CompleteQuest pays nothing. Whoever completes a quest issues its rewards afterwards — the interpreter does exactly that — so a hand-issued completion that expects the payout to follow on its own will strand the party unpaid advance authored quest state by hand**. CompleteQuest pays nothing: whoever** completes a quest issues its rewards afterwards**, as the interpreter does,** so a hand-issued completion leaves the party unpaid unless the agent issues the rewards too The sentence #72 quotes: a completion cannot expect anything. Also a stock word, an em-dash pair, and a vague "one sharp edge" for a fact the next clause states outright.
docs/front-ends/llm-referees.md:80 Events never carry engine-baked prose. Each carries a stable message code — a compact fact like session.monsters.spawned — plus typed fields**;** [the message code reference] lists Events never include engine-baked prose. Each has a stable message code (a compact fact like session.monsters.spawned) plus typed fields**. [The message code reference]** lists Two metaphorical carries, an em-dash pair, a semicolon.
docs/front-ends/llm-referees.md:80 The one kind of English an event does carry is authored narrative — a beat the adventure's author wrote, riding a structured field, which the next section teaches the narrator to treat differently from its own words The one kind of English an event does include is authored narrative**,** a beat the adventure's author wrote in a structured field, which Narrating authored content below treats separately from the model's own words Metaphorical carry, text that cannot ride, an em dash, and a forward pointer that now links to the section it means.
docs/front-ends/llm-referees.md:88 keeps the model's creativity in the telling — the dice already decided what happened keeps the model's creativity in the telling**.** The dice already decided what happened Em dash. The dice stay the actor: that idiom is the docs' own.
docs/front-ends/llm-referees.md:94 the triggers, the quests, the fired-marks, and the rewards all play themselves as ordinary logged commands. The agent referees**;** the adventure runs its own wiring the interpreter plays the triggers, the quests, the fired-marks, and the rewards as ordinary logged commands. The agent referees**, and the interpreter runs the adventure's wiring** Authored content cannot play itself and an adventure cannot run anything. Semicolon.
docs/front-ends/llm-referees.md:96 NarrativeBlock carries a guidance field on any authored object … — the TUI barrow's first level reads NarrativeBlock has a guidance field on any authored object … . The TUI barrow's first level reads Metaphorical carry, em dash.
docs/front-ends/llm-referees.md:102 never prints them verbatim — the same trust posture as an area's description prose never prints them verbatim**,** the same trust posture as an area's description prose Em dash.
docs/front-ends/llm-referees.md:102 No event carries guidance and no view ships it**;** it is the author talking to the narrator No event includes guidance and no view ships it**.** It is the author talking to the narrator Metaphorical carry, semicolon.
docs/front-ends/llm-referees.md:106 an agent that stamps its own referee commands — or simply leaves them unstamped — leaves a log an agent that stamps its own referee commands**, or leaves them unstamped,** leaves a log Em-dash pair, minimizer.
docs/front-ends/llm-referees.md:110 a trajectory — the seed and the list of commands the model chose — is a complete, reproducible record a trajectory (the seed and the list of commands the model chose) is a complete, reproducible record Em-dash pair.
docs/front-ends/llm-referees.md:110 the same events to score**;** change a prompt and replay the same seeds**;** diff two models on identical dungeons the same events to score**. Change** a prompt and replay the same seeds**. Diff** two models on identical dungeons Two semicolons stacking three independent clauses.
docs/front-ends/llm-referees.md:217-221 five "Where next" bullets, each [link] — gloss each [link] - gloss The em dash inside a list item.
docs/front-ends/llm-referees.md:221 every code an event can carry, with its default English template every code an event can have, with its default English template Metaphorical carry in the gloss.

Open questions

1. Second person and contractions on the LLM referee page. The page has almost no "you" and no contractions, and it is the only page in this chunk still outside the house numbers (2 of 16 fingerprints). The reason is structural: it describes what an agent does rather than addressing the person building one. Turning it around is a rewrite for the reader, which the edit-in-place instruction rules out, so I left it and am naming it instead.

2. Dice and rolls as actors. views-and-visibility.md:3 ("the reaction roll that decides whether they attack or flee") and llm-referees.md:88 ("The dice already decided what happened"). Left alone, the same call osr-editor#65 made: the docs treat the dice and the SRD as agents, and a roll deciding an outcome is that idiom rather than an inert thing acting.

3. "Owns" again. listeners-and-flags.md:57 ("engine-owned session state") and :122 ("when your own systems own the objective"). Left, for the reason given in #138: #72 protects software acting and "engine-owned" is the established term.

4. "Needs" where the subject is code or a model. listeners-and-flags.md:51 ("the bookkeeping an authored trigger or quest layer needs"), :73 ("needs one because its trigger condition can look unsatisfied"), views-and-visibility.md:59 ("ObjectiveView.state needs only \"incomplete\" and \"complete\""). These are requirements of code and schemas rather than wants of authored things, so they stay. The one I did change, listeners-and-flags.md:77, had a quest doing the needing.

5. "The routes authored words take to a player." views-and-visibility.md:11. Words do not travel, but the sentence names all three routes in the two sentences after it and the metaphor is what makes the count legible. Left.

6. "Story". llm-referees.md:3 ("the authored-content story") and the heading "Determinism is the eval story" at :108, which :106 refers back to. The heading is an anchor target, so the body use stays consistent with it.

7. Two instances of the defect survive inside fenced code comments. docs/front-ends/llm-referees.md:40 and :200 are the same comment, "# The referee view is full state — flags, monster internals — minus RNG state and the seed", and :32 reads "# rejected? that's feedback — the model reads why and retries". All three are em-dash splices inside fenced blocks that tests/test_docs_examples.py covers, so they are out of bounds for this pass. Review named these as :36 and :44; the three above are where they sit in the file as it stands.

8. The two guides were already close. views-and-visibility.md and listeners-and-flags.md both scored clean before this pass and account for 7 of the 38 changes. The LLM referee page went from 7 fingerprint misses to 2.

Undefined jargon found

Location and term only. Nothing here was changed.

  • beat - docs/guides/views-and-visibility.md:11; docs/guides/listeners-and-flags.md:54. Defined in the index's vocabulary table, not on either page.
  • fired-mark - docs/guides/listeners-and-flags.md:49 (the heading), :55, :72, :73; docs/guides/views-and-visibility.md:30.
  • the referee's own margin - docs/guides/listeners-and-flags.md:55; docs/front-ends/llm-referees.md:66.
  • re-entrancy guard - docs/guides/listeners-and-flags.md:33, :73, :118.
  • map memory - docs/guides/views-and-visibility.md:28.
  • enumerated whitelist - docs/guides/views-and-visibility.md:24; docs/front-ends/llm-referees.md:37.
  • speaker attribution - docs/guides/views-and-visibility.md:32; docs/front-ends/llm-referees.md:104.
  • trajectory - docs/front-ends/llm-referees.md:110. Defined in the same sentence, flagged because the eval sense is not the movement sense.
  • the eval story - docs/front-ends/llm-referees.md:106, :108.

Vocabulary decisions for the owner

1. "Carrier". Unchanged, as in #138. None of these three pages uses it; the decision stays open in docs/spec.md:207 and :209.

2. "Beat". Same decision as #138: a beat is authored narrative text, and these pages use it that way throughout. Nothing here needed changing.

3. "Story", in "the authored-content story" and "Determinism is the eval story". The heading is an anchor target and the body use follows it, so a rename is yours to make if you want one.

4. "Privileged", my replacement for "the event stream carries the same privilege". I wrote "The event stream is privileged the same way". If you would rather the page not attribute a privilege to a stream at all, "The event stream is unfiltered for the same reason" states the mechanism instead.

Cross-repository effects

1. The same gate docstring. src/osrlib/crawl/gates.py:108 still reads "so a door that swings shut needs another key", and "needs" is on #72's own list. The docstring half of the issue still owns that sentence, and it reaches osr-editor through the generated types and that editor's gate condition builder help text until osrlib's docstrings are corrected and osr-editor's osrlib pin moves.

2. Nothing else propagates. No schema, no code identifier, and no generated page changes here, so osr-forge and osr-editor see nothing from this pull request.

3. What is left of #72's Markdown half. docs/adaptations.md alone, held until the magic-phase chunk editing it merges. docs/reference/rejection-codes.md and docs/reference/message-codes.md are generated at build time and have no file to edit.

Part of #72.

https://claude.ai/code/session_01NmCezTw8hKKujkaEZ3YGAs

The referee and listener guides and the LLM referee page get the pass
the rest of the hand-written docs had: a narrative block no longer
carries a field, triggers and quests no longer play themselves, a
journal entry no longer speaks, a result envelope no longer picks
events up, a finished quest no longer leaves the list, and command
handlers no longer know what a fetch quest is. The LLM referee page
also carried the em dashes and semicolons, and a hand-issued
completion that "expects the payout to follow" now says what the agent
has to do instead.

Part of #72.

Claude-Session: https://claude.ai/code/session_01NmCezTw8hKKujkaEZ3YGAs
"It" had two nearer nouns to point at, so the quest projection is named
outright. The schema sentence lost the pairing of each surface with its
own discriminator field, which it now states one to one. The event
stream is unfiltered for the same reason rather than privileged the
same way, and a rejected command explains itself again: a command is
one of the things that act.

Part of #72.

Claude-Session: https://claude.ai/code/session_01NmCezTw8hKKujkaEZ3YGAs
@mmacy
mmacy merged commit 781d7f3 into main Sep 15, 2026
5 checks passed
@mmacy
mmacy deleted the chunk/prose-agency-2 branch September 15, 2026 05:11
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant