The writing models are told people's pronouns, players' and characters' apart (#999) #1013

Merged
claude-bot merged 7 commits from fix/999-pronouns-in-prompts into main 2026-10-01 22:48:58 +00:00
Collaborator

Closes #999, the one unbuilt part of #653: a saved recap could misgender someone, because the prompts sent names and never pronouns.

What changes

  • app/services/pronoun_context.py (new) builds a short note for the prompts that write about people: the players who have set pronouns, and the characters who have, kept apart ("played by …"), with an instruction not to guess for anyone not listed. Wiki pages the text names are listed too.
  • It goes into the summary header, the event log, highlights, wiki suggestions, the generation tools, recompose, and the bot's /ask answer (routers/bot.py; additive, no contract change).
  • Nothing is stored on a run. Pronouns are read when the prompt is built, so someone who changes theirs is written about as they are now, and a member who has left brings nothing back.
  • Account deletion and the export are covered by tests (test_account_deletion_pronouns.py, test_export_pronouns.py).
  • A transcript in the bin (#680) is read for nothing, this included: recompose's lookup of the pages a transcript names goes through readable_transcript. tests/test_transcript_bin_readers.py caught it after #1005 merged.

The Privacy page

It said nothing about what goes to a model. Two additions, in the wording the owner confirmed (Q141, D269):

  • Under "Your account": "… your pronouns if you choose to add them …".
  • Under "Who can see it": "The transcription and writing services this server is set up to use are sent the recordings and transcripts to work from. The writing service is also told the names in a campaign, and the pronouns that its members have added for themselves and their characters, so that what it writes refers to people correctly. Those services may be run by another company; whoever runs this server can tell you which."

On for every campaign, with no switch (D269).

Checked

  • Full backend suite on the merged tree: 6726 passed, 14 skipped (ruff 0.4.4 clean, 877 files formatted).
  • Full vitest: 3575 passed and 5 timed out in four files this branch does not touch (DesignReference, NextSheet, ReviewView, CardFace), while the machine was running several suites at once; those four files re-run alone: 78 passed. The run before main was merged in was clean (3571 passed). eslint 0 errors.
  • No migration. No bot contract change (the /ask payload gains nothing; the note is built server-side).
  • The only UI change is two sentences on the Privacy page, covered by Privacy.test.jsx; not re-rendered in a browser.

🤖 Generated with Claude Code

Closes #999, the one unbuilt part of #653: a saved recap could misgender someone, because the prompts sent names and never pronouns. ## What changes - **`app/services/pronoun_context.py` (new)** builds a short note for the prompts that write about people: the players who have set pronouns, and the characters who have, kept apart ("played by …"), with an instruction not to guess for anyone not listed. Wiki pages the text names are listed too. - It goes into the summary header, the event log, highlights, wiki suggestions, the generation tools, recompose, and the bot's `/ask` answer (`routers/bot.py`; additive, no contract change). - **Nothing is stored on a run.** Pronouns are read when the prompt is built, so someone who changes theirs is written about as they are now, and a member who has left brings nothing back. - Account deletion and the export are covered by tests (`test_account_deletion_pronouns.py`, `test_export_pronouns.py`). - **A transcript in the bin (#680) is read for nothing, this included:** recompose's lookup of the pages a transcript names goes through `readable_transcript`. `tests/test_transcript_bin_readers.py` caught it after #1005 merged. ## The Privacy page It said nothing about what goes to a model. Two additions, in the wording the owner confirmed (Q141, D269): - Under "Your account": "… your pronouns if you choose to add them …". - Under "Who can see it": "The transcription and writing services this server is set up to use are sent the recordings and transcripts to work from. The writing service is also told the names in a campaign, and the pronouns that its members have added for themselves and their characters, so that what it writes refers to people correctly. Those services may be run by another company; whoever runs this server can tell you which." On for every campaign, with no switch (D269). ## Checked - Full backend suite on the merged tree: **6726 passed, 14 skipped** (ruff 0.4.4 clean, 877 files formatted). - Full vitest: 3575 passed and 5 timed out in four files this branch does not touch (`DesignReference`, `NextSheet`, `ReviewView`, `CardFace`), while the machine was running several suites at once; those four files re-run alone: **78 passed**. The run before main was merged in was clean (3571 passed). eslint 0 errors. - No migration. No bot contract change (the `/ask` payload gains nothing; the note is built server-side). - The only UI change is two sentences on the Privacy page, covered by `Privacy.test.jsx`; not re-rendered in a browser. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The summary, its event log and key moments, the wiki suggestions, /ask, the
wiki's draft tools and page summaries, and the GM's prep tools are each given
the pronouns of the people they can name: players' (users.pronouns), their
characters' (campaign_characters) and those on wiki pages the table reads.
Each kind is labelled, someone with none set is not listed, and the model is
told to use a name or singular they rather than guess.

Read fresh for every prompt (app/services/pronoun_context.py) and stored
nowhere, so leaving a campaign or deleting an account takes them out of the
next one; a test looks in every column of every table after a deletion.
/privacy and docs/OPERATIONS.md now say pronouns are kept and are sent to the
configured model.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Recompose reads no binned transcript for its pronoun lookup (#999, #680)
Some checks failed
CI / Backend lint (ruff) (pull_request) Successful in 33s
CI / Does this change touch the recording path? (pull_request) Successful in 56s
CI / Bot/backend version sync (pull_request) Successful in 1m1s
CI / Summarisation accuracy eval harness (stub provider) (pull_request) Successful in 1m5s
CI / Feedback site tests (pull_request) Successful in 1m21s
CI / Bot tests and audit (pull_request) Successful in 1m58s
CI / Docker image build (pull_request) Successful in 5m35s
CI / Frontend (shard 2/2) (pull_request) Successful in 6m48s
CI / Frontend (shard 1/2) (pull_request) Successful in 8m24s
CI / Synthetic session harness (no GPU, no LLM) (pull_request) Successful in 14m32s
CI / Backend migration, tests, and audit (pull_request) Successful in 20m34s
CI / End-to-end journeys (phone) (pull_request) Failing after 19m15s
CI / End-to-end journeys (keyboard) (pull_request) Failing after 21m27s
CI / End-to-end journeys (desktop) (pull_request) Failing after 21m30s
a2cb825a25
The pronoun notes look up the pages a transcript names. A transcript in the
bin is read for nothing, so the lookup goes through readable_transcript like
every other reader; people's own pronouns still go.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The journeys' fake AI finds the wiki run's prompts behind the pronouns note (#999)
All checks were successful
CI / Does this change touch the recording path? (pull_request) Successful in 30s
CI / Feedback site tests (pull_request) Successful in 49s
CI / Bot/backend version sync (pull_request) Successful in 1m1s
CI / Docker image build (pull_request) Successful in 1m2s
CI / Backend lint (ruff) (pull_request) Successful in 1m5s
CI / Summarisation accuracy eval harness (stub provider) (pull_request) Successful in 1m51s
CI / Bot tests and audit (pull_request) Successful in 2m52s
CI / Frontend (shard 2/2) (pull_request) Successful in 6m46s
CI / Frontend (shard 1/2) (pull_request) Successful in 8m26s
CI / End-to-end journeys (keyboard) (pull_request) Successful in 8m46s
CI / End-to-end journeys (desktop) (pull_request) Successful in 8m52s
CI / Synthetic session harness (no GPU, no LLM) (pull_request) Successful in 12m26s
CI / End-to-end journeys (phone) (pull_request) Successful in 12m10s
CI / Backend migration, tests, and audit (pull_request) Successful in 20m44s
e24a33b049
It recognised extract and match by how the prompt opens. With pronouns set in
the fiction the note now comes first, so the fake answered neither and J5's
"Suggested wiki updates" never finished (PR #1013, all three journey jobs).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Sign in to join this conversation.
No description provided.