Fill it in: roll a page's facts and the pages they point to, and roll a whole company (#1328) #1379

Open
claude-bot wants to merge 12 commits from feat/1328-fill-it-in into main
Collaborator

Slice 2 of Fill it in, for v4.8.0. The contract is docs/design/fill-it-in.md; decisions D346–D350 record the owner's answers (CG1, Q255–Q258).

Data fixes (on the feedback site's engine, the source of truth, ported word for word):

  • "& Sons" and "& Daughters" become "& Kin" or "& Family", and a family-named company always has a blood relative (D346). Gendered names follow in #1376.
  • In-laws get their own surname.
  • A company's two what-it-does lines are never near-repeats.
  • 136,750 engine rolls with 0 failures.

Backend (app/fill/, no migration):

  • fill_data.json is exported from fill-data.js and checked for drift.
  • The company roll is ported line by line, plus single-fact rolls and Roll the rest.
  • POST …/wiki/fill/{roll,company} write nothing.
  • POST …/fill/save writes every page and link in one savepoint:
    • an up-front clash check returns 409 (D72);
    • the page's audience, pronouns and timeline are applied inside the savepoint, with the same checks as a hand-made page;
    • a player under players-suggest gets proposals (202).
  • Choices follow the policy in app/fill/policy.py:
    • name styles from the game system (D347);
    • an AI summary only for pages with body text (D348);
    • magic where the system sells it (D349);
    • lines, secrets and rumours by audience (D350).

Frontend (from the lane 6k drawing):

  • a die on each empty rollable fact, and Roll the rest;
  • "This will also make", with Keep and Drop;
  • Save and Discard, including the clash choices;
  • the company template on a new Business page.

The strings are wording part "ae". A test fails if the editor's copy of the rollable facts or trades drifts from the engine.

Checks:

  • Feedback site: engine 136,750 rolls, 0 failures; suite 217 passed.
  • Backend: tests/fill and tests/wiki, 2,183 passed.
  • Frontend: 874 passed; lint 0 errors; the prod build works.
  • Security reviews: an audience applied after create, with its error swallowed, was fixed by moving it into the savepoint.

Before merge: CI, the render check, and wording part "ae".

🤖 Generated with Claude Code

Slice 2 of Fill it in, for v4.8.0. The contract is `docs/design/fill-it-in.md`; decisions D346–D350 record the owner's answers (CG1, Q255–Q258). **Data fixes** (on the feedback site's engine, the source of truth, ported word for word): - "& Sons" and "& Daughters" become "& Kin" or "& Family", and a family-named company always has a blood relative (D346). Gendered names follow in #1376. - In-laws get their own surname. - A company's two what-it-does lines are never near-repeats. - 136,750 engine rolls with 0 failures. **Backend** (`app/fill/`, no migration): - `fill_data.json` is exported from `fill-data.js` and checked for drift. - The company roll is ported line by line, plus single-fact rolls and Roll the rest. - `POST …/wiki/fill/{roll,company}` write nothing. - `POST …/fill/save` writes every page and link in one savepoint: - an up-front clash check returns 409 (D72); - the page's audience, pronouns and timeline are applied inside the savepoint, with the same checks as a hand-made page; - a player under players-suggest gets proposals (202). - Choices follow the policy in `app/fill/policy.py`: - name styles from the game system (D347); - an AI summary only for pages with body text (D348); - magic where the system sells it (D349); - lines, secrets and rumours by audience (D350). **Frontend** (from the lane 6k drawing): - a die on each empty rollable fact, and Roll the rest; - "This will also make", with Keep and Drop; - Save and Discard, including the clash choices; - the company template on a new Business page. The strings are wording part "ae". A test fails if the editor's copy of the rollable facts or trades drifts from the engine. **Checks:** - **Feedback site:** engine 136,750 rolls, 0 failures; suite 217 passed. - **Backend:** `tests/fill` and `tests/wiki`, 2,183 passed. - **Frontend:** 874 passed; lint 0 errors; the prod build works. - **Security reviews:** an audience applied after create, with its error swallowed, was fixed by moving it into the savepoint. **Before merge:** CI, the render check, and wording part "ae". 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
app/fill: fill-data.js exported word for word to fill_data.json (with
a drift check), the company roll ported line by line with the three
data fixes, and new roll_value / roll_fact / roll_page for the editor's
dice and Roll the rest. Three routes under /campaigns/{id}/wiki/fill:
roll and company write nothing; save writes every page and link in one
savepoint after an up-front clash check (409 with the clashing keys,
D72). Whoever may make pages may roll; a player under players-suggest
gets proposals (202, as a hand-made suggestion). The four open questions
(Q255-Q258) are built to the recommended answers in app/fill/policy.py.
create_lore_entry now goes through a non-committing
create_lore_entry_draft. No migration.

Built by a delegate; squashed here.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
test: the editor's copy of what can be rolled must match the engine (#1328)
Some checks failed
CI / Summarisation accuracy eval harness (stub provider) (pull_request) Successful in 1m1s
CI / Bot/backend version sync (pull_request) Successful in 27s
CI / Backend lint (ruff) (pull_request) Successful in 34s
CI / Which journeys does this change need? (pull_request) Successful in 23s
CI / Does this change touch the recording path? (pull_request) Successful in 24s
CI / Synthetic session harness (no GPU, no LLM) (pull_request) Has been skipped
CI / Feedback site tests (pull_request) Successful in 1m55s
CI / Bot tests and audit (pull_request) Successful in 2m15s
CI / Docker image build (pull_request) Successful in 5m33s
CI / Frontend (shard 2/2) (pull_request) Successful in 9m16s
CI / Frontend (shard 1/2) (pull_request) Failing after 10m48s
CI / End-to-end journeys (desktop) (pull_request) Successful in 13m12s
CI / Backend migration, tests, and audit (pull_request) Has been cancelled
75f7aa2560
fillData.js is a copy of the engine's answer (no route says which facts
are rollable yet); this fails if it drifts in either direction, or if
its trades or magic systems stop matching the data and policy.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
fix(webapp): the editor keeps its draft when a save has no answer, and the test mocks the page the server returns (#1328)
Some checks failed
CI / Bot/backend version sync (pull_request) Successful in 29s
CI / Backend lint (ruff) (pull_request) Successful in 34s
CI / Which journeys does this change need? (pull_request) Successful in 17s
CI / Does this change touch the recording path? (pull_request) Successful in 17s
CI / Synthetic session harness (no GPU, no LLM) (pull_request) Has been skipped
CI / Summarisation accuracy eval harness (stub provider) (pull_request) Successful in 1m0s
CI / Feedback site tests (pull_request) Successful in 1m49s
CI / Bot tests and audit (pull_request) Successful in 2m14s
CI / Docker image build (pull_request) Successful in 3m12s
CI / Frontend (shard 2/2) (pull_request) Successful in 8m40s
CI / Frontend (shard 1/2) (pull_request) Successful in 10m28s
CI / End-to-end journeys (desktop) (pull_request) Successful in 11m27s
CI / Backend migration, tests, and audit (pull_request) Has been cancelled
22b3021db6
CI: an unhandled draftFrom(undefined) in Editor.jsx after a Fill it in
save on an existing page, because the test's page update returned
nothing. A real server always returns the page; the editor now guards
the empty case anyway.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
fix(webapp): Fill it in rows fit a tablet, the company card's title is ink on paper and an h2 (#1328)
Some checks failed
CI / Does this change touch the recording path? (pull_request) Successful in 23s
CI / Which journeys does this change need? (pull_request) Successful in 25s
CI / Synthetic session harness (no GPU, no LLM) (pull_request) Has been skipped
CI / Docker image build (pull_request) Successful in 28s
CI / Bot/backend version sync (pull_request) Successful in 28s
CI / Backend lint (ruff) (pull_request) Successful in 1m9s
CI / Summarisation accuracy eval harness (stub provider) (pull_request) Successful in 2m3s
CI / Feedback site tests (pull_request) Successful in 2m48s
CI / Bot tests and audit (pull_request) Successful in 3m12s
CI / Frontend (shard 1/2) (pull_request) Successful in 10m9s
CI / Frontend (shard 2/2) (pull_request) Successful in 10m32s
CI / End-to-end journeys (desktop) (pull_request) Successful in 11m4s
CI / Backend migration, tests, and audit (pull_request) Has been cancelled
c01960d06f
Render check: at 820 px the rolled fact rows' hard minimums (8rem, 10rem,
9rem plus the die and Remove) overran the facts column beside the rail
and cut Remove off; only Who sees it keeps a 7rem floor now. The card's
solid accent bar read as a bright banner in the dark theme; it's the
page's ink on raised paper with an accent rule. Its title was an h3
straight under the page's h1 (axe heading-order); it's an h2.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
fix(webapp): rolled fact rows follow the facts box, not the window (#1328)
All checks were successful
CI / Does this change touch the recording path? (pull_request) Successful in 27s
CI / Which journeys does this change need? (pull_request) Successful in 28s
CI / Synthetic session harness (no GPU, no LLM) (pull_request) Has been skipped
CI / Bot/backend version sync (pull_request) Successful in 44s
CI / Backend lint (ruff) (pull_request) Successful in 48s
CI / Summarisation accuracy eval harness (stub provider) (pull_request) Successful in 1m2s
CI / Bot tests and audit (pull_request) Successful in 2m13s
CI / Feedback site tests (pull_request) Successful in 2m17s
CI / Docker image build (pull_request) Successful in 3m33s
CI / Frontend (shard 2/2) (pull_request) Successful in 8m27s
CI / Frontend (shard 1/2) (pull_request) Successful in 10m11s
CI / End-to-end journeys (desktop) (pull_request) Successful in 14m19s
CI / Backend migration, tests, and audit (pull_request) Successful in 39m17s
e85b299dc7
Render check at 820 px: with the hard minimums the rows overran the
facts column beside the rail; without them the names and values were
squeezed and cut off. The facts box is now a size container, and a
rolled row takes the three-row phone layout whenever the box is under
40rem, whatever the window; the comfortable minimums are back for a
wide box.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
All checks were successful
CI / Does this change touch the recording path? (pull_request) Successful in 27s
Required
Details
CI / Which journeys does this change need? (pull_request) Successful in 28s
Required
Details
CI / Synthetic session harness (no GPU, no LLM) (pull_request) Has been skipped
Required
Details
CI / Bot/backend version sync (pull_request) Successful in 44s
Required
Details
CI / Backend lint (ruff) (pull_request) Successful in 48s
Required
Details
CI / Summarisation accuracy eval harness (stub provider) (pull_request) Successful in 1m2s
Required
Details
CI / Bot tests and audit (pull_request) Successful in 2m13s
Required
Details
CI / Feedback site tests (pull_request) Successful in 2m17s
Required
Details
CI / Docker image build (pull_request) Successful in 3m33s
Required
Details
CI / Frontend (shard 2/2) (pull_request) Successful in 8m27s
Required
Details
CI / Frontend (shard 1/2) (pull_request) Successful in 10m11s
Required
Details
CI / End-to-end journeys (desktop) (pull_request) Successful in 14m19s
Required
Details
CI / Backend migration, tests, and audit (pull_request) Successful in 39m17s
Required
Details
This pull request can be merged automatically.
You are not authorized to merge this pull request.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin feat/1328-fill-it-in:feat/1328-fill-it-in
git switch feat/1328-fill-it-in
Sign in to join this conversation.
No description provided.