Lane 11 PR 14: seams, Admin and the demo seed, wave A (#737) #986

Merged
claude-bot merged 9 commits from build/lane11-14-seams into main 2026-10-01 15:02:29 +00:00
Collaborator

Part of #737 (lane 11, stat blocks and character sheets). Contract: docs/design/lane11-build-contract.md §4, PR 14.

What it does

  • Admin → Content packs (ADMIN-11, IS-430). Lists every sheet definition on the instance (route #21) with version, active/deprecated, how many sheets are on it and how its fixtures did. Loading a pack that carries definitions shows the validator's report per definition: activated or not, each error, each warning, which fixtures failed and why. One bad definition stops only itself.
  • Rules & bestiary (WIKI-15, IS-433). An open rules result has Add to a sheet ▾, from the new route #13 GET /campaigns/{id}/sheets/editable?kind=. A reader with nothing to edit gets no menu.
  • Prep (PREP-2, IS-432). Instant NPC can Save as a page, with a block (route #20): a new NPC page plus a drafted block that waits in Suggested wiki updates.
  • Members & characters (CAMP-8). The members list names each character's sheet_id (additive). Open the sheet itself reads the page's own sheet, the one source PR 15 already put on main, so there is a single rule for when it shows.
  • Demo seed, wave A. Seven Amberwake PF2e characters, ten blocks, a rules creature card with its own HP on a shelf, and a thin 5e campaign, Hollow & Ash, with Tam Ridley and four more. Every sheet is made through the sheet services the routes call.
  • Coverage. IS-463 and IS-464 (built in PRs 10 and 15) are classified in lane9.py, and in lane2.py and lane6b.py, which also failed on them.

No migration. The bot API is untouched.

Render-check fixes in this PR

  • The definitions table at phone width is a keyboard-focusable scroll region instead of widening the page.
  • The "saved as a page" sentence reads as one line of text.
  • A menu opened near the foot of the page scrolls fully into view.

Checked

  • Backend: full suite, 6547 passed, 14 skipped (synthetic deselected, as CI does).
  • Frontend: vitest 3540 passed, 1 skipped; eslint 0 errors.
  • ruff 0.4.4 format --check and check over webapp/backend/, scripts/, webapp/frontend/e2e/.
  • scripts/changelog.py check, scripts/check_version_sync.py, and every coverage/lane*.py.
  • Rendered in an e2e stack at 390×844 (touch) and 1440, light and dark: the definitions list and both upload reports, Add to a sheet (menu and done), Save as a page with a block, and Members.

Known

  • Seed caveats, to revisit with PR 17: PF2e XP reads 0 in the seed until PR 16 lands; converted public legacy blocks come out with the table audience rather than party.

🤖 Generated with Claude Code

Part of #737 (lane 11, stat blocks and character sheets). Contract: `docs/design/lane11-build-contract.md` §4, PR 14. ## What it does - **Admin → Content packs (ADMIN-11, IS-430).** Lists every sheet definition on the instance (route #21) with version, active/deprecated, how many sheets are on it and how its fixtures did. Loading a pack that carries definitions shows the validator's report per definition: activated or not, each error, each warning, which fixtures failed and why. One bad definition stops only itself. - **Rules & bestiary (WIKI-15, IS-433).** An open rules result has **Add to a sheet ▾**, from the new route #13 `GET /campaigns/{id}/sheets/editable?kind=`. A reader with nothing to edit gets no menu. - **Prep (PREP-2, IS-432).** Instant NPC can **Save as a page, with a block** (route #20): a new NPC page plus a drafted block that waits in Suggested wiki updates. - **Members & characters (CAMP-8).** The members list names each character's `sheet_id` (additive). **Open the sheet** itself reads the page's own sheet, the one source PR 15 already put on main, so there is a single rule for when it shows. - **Demo seed, wave A.** Seven Amberwake PF2e characters, ten blocks, a rules creature card with its own HP on a shelf, and a thin 5e campaign, Hollow & Ash, with Tam Ridley and four more. Every sheet is made through the sheet services the routes call. - **Coverage.** IS-463 and IS-464 (built in PRs 10 and 15) are classified in `lane9.py`, and in `lane2.py` and `lane6b.py`, which also failed on them. No migration. The bot API is untouched. ## Render-check fixes in this PR - The definitions table at phone width is a keyboard-focusable scroll region instead of widening the page. - The "saved as a page" sentence reads as one line of text. - A menu opened near the foot of the page scrolls fully into view. ## Checked - Backend: full suite, 6547 passed, 14 skipped (synthetic deselected, as CI does). - Frontend: vitest 3540 passed, 1 skipped; eslint 0 errors. - ruff 0.4.4 `format --check` and `check` over `webapp/backend/`, `scripts/`, `webapp/frontend/e2e/`. - `scripts/changelog.py check`, `scripts/check_version_sync.py`, and every `coverage/lane*.py`. - Rendered in an e2e stack at 390×844 (touch) and 1440, light and dark: the definitions list and both upload reports, Add to a sheet (menu and done), Save as a page with a block, and Members. ## Known - Seed caveats, to revisit with PR 17: PF2e XP reads 0 in the seed until PR 16 lands; converted public legacy blocks come out with the `table` audience rather than `party`. 🤖 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>
ADMIN-11 (IS-430): Admin -> Content packs lists every sheet definition
(route #21) with version, status, source, sheets on it and fixtures; a pack
row names its own definitions and the sheets still on an older version; the
shared load form shows the validator's report per definition (errors with
did-you-mean, warnings, fixture failures; a campaign pack's 'not used' note).
The import report entry gains field_count.

WIKI-15 (IS-433): route #13 GET /campaigns/{cid}/sheets/editable?kind= lists
the sheets the reader may edit with a list taking that kind; an open rules
result has Add to a sheet, which appends through route #6; no menu when
there is nothing to edit.

PREP-2 (IS-432): Instant NPC's Save as a page, with a block makes the NPC
page and drafts its block through route #20; hidden for the generic sheet.

CAMP-8: the members list names each character's sheet_id; Members & characters
has Open the sheet where the page has a finished sheet.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Every sheet is made through the sheet services the routes call
(create_sheet, patch_sheet, apply_resources, convert_legacy_page,
make_sheet, sheet_reveal.show), with request bodies parsed by the
routes' own schemas, from the mini character packs loaded as campaign
packs. Stable ids: while the seed writes sheets, a before_insert hook
gives each sheet its page's id, each version its sheet's and number,
and each entry row its place, so --reset still rebuilds identically.

The Amberwake Accord (and its GM copy): Ossian exactly as drawn (bulk
4.9), Wren with spells and focus, Bastian, Quill, the owner's Hollis
(GM-locked Level & XP, "just you and the GM" campaign notes, a gone row
from the disabled Salt Crown pack), retired Aldous and Hesper's old
sheet; conditions and hurt HP on Wren and Bastian; every old stat block
converted (D205), Odile filled out to the drawing, the sexton partly
shown, the Tidewright wholly the GMs', Hesper's sheet projected into an
NPC block; a rules creature on Session 24's shelf with its own HP
(D207); histories of 3 to 6 versions.

Hollow & Ash (D248): a thin 5e campaign Tomás runs, the owner playing
Tam Ridley (HP rolls 8 and 7 -> 31), four more characters, two blocks.

README moves character sheets to Seeded; test_demo_seed checks the new
data, and every seeded sheet validates and reads for its GM, its player
and another member.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Members keeps PR 15's CharacterLine group and startHref, and one source for
Open the sheet (the page's own sheet); coverage names IS-463 and IS-464 (#737)

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Lane 11 PR 14: drop an eslint-disable the Table no longer needs (#737)
All checks were successful
CI / Does this change touch the recording path? (pull_request) Successful in 51s
CI / Synthetic session harness (no GPU, no LLM) (pull_request) Has been skipped
CI / Bot/backend version sync (pull_request) Successful in 1m9s
CI / Backend lint (ruff) (pull_request) Successful in 1m12s
CI / Docker image build (pull_request) Successful in 1m17s
CI / Summarisation accuracy eval harness (stub provider) (pull_request) Successful in 1m26s
CI / Feedback site tests (pull_request) Successful in 1m47s
CI / Bot tests and audit (pull_request) Successful in 2m29s
CI / Frontend (shard 2/2) (pull_request) Successful in 6m43s
CI / Frontend (shard 1/2) (pull_request) Successful in 8m9s
CI / End-to-end journeys (desktop) (pull_request) Successful in 10m14s
CI / End-to-end journeys (phone) (pull_request) Successful in 15m10s
CI / End-to-end journeys (keyboard) (pull_request) Successful in 16m50s
CI / Backend migration, tests, and audit (pull_request) Successful in 18m35s
b05615a618
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Sign in to join this conversation.
No description provided.