Redesign review follow-ups R6: the owner's lane 11 pass (10 and 11 Oct, on rc10) #1121

Closed
opened 2026-10-11 19:57:05 +00:00 by claude-bot · 6 comments
Collaborator

From the owner's Redesign Review pass over lane 11 (stat blocks and character sheets, #737) on dev (v4.5.0-rc10), 2026-10-10 about 23:00 UTC and 2026-10-11 about 19:25 to 19:55 UTC. All 20 lane 11 pieces are answered: 13 are fine, 7 need a change. The lane is not signed off; the owner's note on it: "Overall, pretty good. Needs more review to fit in overall."

  1. [l11-5e] change (bug): on Tam Ridley's 5e sheet the numbers are doubled: "Chain Mail 16 16 + Shield 2 2" on AC, the same on Initiative, and on the attack modifiers in Inventory & Features.
  2. [l11-start-pf2e] change (bug): Start a character, Pathfinder: "I'm not able to add an ancestry trait; if I select a trait it never applies (if it's because I'm not selecting compatible traits, it should only show me compatible traits in the list)."
  3. [l11-levelup] change (design): "As with my other feedback, only relevant items should be shown when leveling or creating a character." This revises the answer to L19 (other classes' feats shown disabled with the reason).
  4. [l11-oldblock] change (bug): "Creating a new page gave me a message asking if I wanted to leave because my changes had not been saved."
  5. [l11-rules] change (bug): "Creating an instant NPC (Thistle, in the GM copy) does not fill out their pronouns, occupation, wants, etc in the wiki."
  6. [l11-audience] change: "I don't see a way to change who sees the sheet (or change who is playing a character)."
  7. [l11-tablecard] change (feature): "I'd like to be able to select the conditions from a list instead of needing to type them out. Also I want to be able to add health back in more than one at a time (maybe also be able to fully restore HP without a rest)."

Also asked by the owner on 2026-10-11, alongside this pass: tighten the text inside Quest Board so it is concise. Scope taken here: the lane 11 surfaces these fixes touch; a whole-app copy pass would be its own issue.

Approach: diagnose each (three read-only investigations running), fix on branches, one PR per independent piece, then rc11 to dev for a re-check before the 4.5.0 final.

From the owner's Redesign Review pass over lane 11 (stat blocks and character sheets, #737) on dev (v4.5.0-rc10), 2026-10-10 about 23:00 UTC and 2026-10-11 about 19:25 to 19:55 UTC. All 20 lane 11 pieces are answered: 13 are fine, 7 need a change. The lane is not signed off; the owner's note on it: "Overall, pretty good. Needs more review to fit in overall." 1. **[l11-5e] change (bug):** on Tam Ridley's 5e sheet the numbers are doubled: "Chain Mail 16 16 + Shield 2 2" on AC, the same on Initiative, and on the attack modifiers in Inventory & Features. 2. **[l11-start-pf2e] change (bug):** Start a character, Pathfinder: "I'm not able to add an ancestry trait; if I select a trait it never applies (if it's because I'm not selecting compatible traits, it should only show me compatible traits in the list)." 3. **[l11-levelup] change (design):** "As with my other feedback, only relevant items should be shown when leveling or creating a character." This revises the answer to L19 (other classes' feats shown disabled with the reason). 4. **[l11-oldblock] change (bug):** "Creating a new page gave me a message asking if I wanted to leave because my changes had not been saved." 5. **[l11-rules] change (bug):** "Creating an instant NPC (Thistle, in the GM copy) does not fill out their pronouns, occupation, wants, etc in the wiki." 6. **[l11-audience] change:** "I don't see a way to change who sees the sheet (or change who is playing a character)." 7. **[l11-tablecard] change (feature):** "I'd like to be able to select the conditions from a list instead of needing to type them out. Also I want to be able to add health back in more than one at a time (maybe also be able to fully restore HP without a rest)." Also asked by the owner on 2026-10-11, alongside this pass: tighten the text inside Quest Board so it is concise. Scope taken here: the lane 11 surfaces these fixes touch; a whole-app copy pass would be its own issue. Approach: diagnose each (three read-only investigations running), fix on branches, one PR per independent piece, then rc11 to dev for a re-check before the 4.5.0 final.
Author
Collaborator

Diagnoses and plan (2026-10-11, about 20:30 UTC). Session is being reset; this comment is the handover.

All seven were diagnosed by reading the code (nothing run). Paths are relative to webapp/.

Being built when the session was reset (two delegates, each in its own worktree; check git ls-remote origin 'fix/1121-*': if a branch is missing or incomplete, rebuild from the spec here)

Branch fix/1121-sheet-5e-terms-and-card-hp: items 1 and 7.

  • Item 1 cause: frontend/src/ui/Derivation/index.jsx:23-27 prints each term as label value. pf2e labels are bare ("Dex"); the dnd5e definitions bake the number into label_expr (backend/app/sheets/builtin/dnd5e/character.json saves 97-98, skills 174/178, XP 227-228, AC 273-278, initiative 326, passive perception 343, attacks 376-378, spell attack/DC 441-457, formula labels HP 310-315 and carrying capacity 398; dnd5e/creature.json 136-137, 214-218, 286-289, 321-324). The fixtures pin the baked labels as correct, and the Tam test asserts only "18". pf2e is not affected.
  • Fix: bare labels in both 5e definitions (formula terms use the note mechanism, as pf2e's HP line does), fixtures and seeds updated, no label-stripping in the renderer; check how a built-in definition is versioned before editing. Test: Tam's AC reads "Chain mail 16 + Shield 2".
  • Item 7: shared code is Conditions/AddCondition in frontend/src/pages/sheet/Hot.jsx (used by pages/table/CardHot.jsx:185), ui/Resource, stepsFor duplicated at Fields.jsx:110 and CardHot.jsx:45, knownConditions in pages/sheet/hot.js:59-76. Today adding a condition is a text field with a datalist. The full lists exist unused in definition.tables.conditions (dnd5e 15, pf2e 32 with valued). Build: (a) a visible pick list from that table, typed name kept below; (b) HP steps −5, −1, +1, +5, one shared stepsFor; (c) "Full HP" on Resource when current < max, sending {path:"hp", op:"set", value:max} (not reset, which drops temporary HP). No backend change expected. Decision D292.

Branch fix/1121-relevant-choices: items 2 and 3.

  • Item 2 cause: the Ancestry step's "Choose 1 ancestry feat" (pf2e/character.json:1083-1084) does add the feat (StartCharacter.jsx:365-372, AddFromContent.jsx:128-143, sheet_service.py:1496-1590), but the step never shows it: its fields omit feats, and the "N on the sheet" count reads chosen from the definition, while it only exists on the server's sheet.creation.steps[].choose[].chosen (sheet_creation.py:320-322). Each retry adds a duplicate row with no slot or level. The picker (sheet_service.py:2193-2302) filters by kind only; the Heritage chooser lists every heritage. The mini pack has ancestry feats for humans only, so a correct filter shows a dwarf or elf nothing.
  • Item 3: level_options/feat_why (sheet_levelup.py:1930-2013, 871-904) return other classes' feats disabled (D261) and other ancestries' feats as eligible.
  • Build (decision D291, supersedes D261 in part): chosen rows shown under the choose row with Remove, count from the live sheet, slot/level set by the server, a second pick refused once met; pickers send category, level_max and the chosen ancestry/class and the server filters (feats by fields.category, level, owning trait; heritages by fields.ancestry; a hand-typed ancestry falls back to unfiltered); level up omits other-class and other-ancestry feats and keeps, disabled with the reason, feats that are the right class/ancestry but not takeable yet (told to the owner in chat on 11 Oct; not yet confirmed by them); the apply-time refusal stays; dwarf and elf ancestry feats and an elf heritage added to the mini pack; j7 extended.

Not started

Item 4 (bug): frontend/src/pages/wiki/Editor.jsx:523. create() awaits createLoreEntry then navigates while the form is still dirty (dirty = newDirty && !suggested, 351-359); the blocker in hooks/useUnsavedChangesWarning.jsx:160-166 stops the editor's own navigation. Affects every GM "new page → Create" where anything was typed. Fix: a created state in dirty, set before navigate. Editor.test.jsx mounts under MemoryRouter, where blocking is inert, which is why it was missed: add a case under createMemoryRouter + RouterProvider (as pages/CampaignStoryline.test.jsx), and a journey step.

Item 5 (gap, with a privacy side effect). The generator returns name, pronouns, occupation, want, secret, voice_cue (backend/app/services/generation_service.py:1385). Both "Save to the wiki" (frontend/src/pages/prep/tools/ResultActions.jsx:80) and "Save as a page, with a block" (prep/tools/Npcs.jsx:81) post only {entry_type:"npc", title, body: npcText(n)}, one flat blob. The create schema already takes pronouns and sidebar_fields (backend/app/routers/campaigns.py:205-223, written at 4246-4258). The secret ("Hides: …") lands in the table-visible body of a page with the default audience, so players can read it. Fix, one shared builder for both buttons: pronouns → the pronouns field; occupation → sidebar_fields: [{label:"Occupation", value}]; want → body under ## Wants; voice_cue → body under ## Personality; secret → body inside :::gm / ## Secrets. Check on dev whether pages already saved this way exposed a secret (Thistle in the GM copy is one).

Item 6 (mostly discoverability; the review page's instruction was also wrong). The audience picker shows only in Edit mode on a group with audience_group (frontend/src/pages/sheet/SheetBody.jsx:485-492); in the built-in definitions that is only pf2e's "Campaign notes" and "Private notes" on the Notes tab (pf2e/character.json:1365-1369), and Edit opens on Stats. No group is called "Level & XP": the GM gets per-field Lock links (EditFields.jsx:51-66, 441). There is no sheet-wide control (the backend honours field_visibility["*"], sheet_projection.py:4-8, but no UI sets it); whole-sheet reach is the wiki page's audience. Who plays a character is changed in the page editor's OwnerManager (pages/wiki/Editor.jsx:331, 942) or on Members & characters; "played by …" on the sheet is plain text (SheetPage.jsx:131). Proposed: for a GM, "played by X" links to the page editor, plus one Edit-mode link to the page's audience and player; ask the owner whether they also want a whole-sheet "Who sees this sheet" picker.

After the builds

My review plus an independent review of each branch, PRs (standing permission to open; merging on green as before), rc11 to dev with a reseed, the review page's lane 11 gets re-check pieces, then the owner's re-check and sign-off. Then the prod-copy upgrade rehearsal (authorised, Q164), the 4.5.0 final, and prod only on the owner's say. PR #1120 stays held for 4.5.1.

Not done this session, and due first next session: Build Status and the Redesign Review page have not been updated for this pass.

## Diagnoses and plan (2026-10-11, about 20:30 UTC). Session is being reset; this comment is the handover. All seven were diagnosed by reading the code (nothing run). Paths are relative to `webapp/`. ### Being built when the session was reset (two delegates, each in its own worktree; **check `git ls-remote origin 'fix/1121-*'`: if a branch is missing or incomplete, rebuild from the spec here**) **Branch `fix/1121-sheet-5e-terms-and-card-hp`: items 1 and 7.** - *Item 1 cause:* `frontend/src/ui/Derivation/index.jsx:23-27` prints each term as `label value`. pf2e labels are bare ("Dex"); the dnd5e definitions bake the number into `label_expr` (`backend/app/sheets/builtin/dnd5e/character.json` saves 97-98, skills 174/178, XP 227-228, AC 273-278, initiative 326, passive perception 343, attacks 376-378, spell attack/DC 441-457, formula labels HP 310-315 and carrying capacity 398; `dnd5e/creature.json` 136-137, 214-218, 286-289, 321-324). The fixtures pin the baked labels as correct, and the Tam test asserts only "18". pf2e is not affected. - *Fix:* bare labels in both 5e definitions (formula terms use the note mechanism, as pf2e's HP line does), fixtures and seeds updated, no label-stripping in the renderer; check how a built-in definition is versioned before editing. Test: Tam's AC reads "Chain mail 16 + Shield 2". - *Item 7:* shared code is `Conditions`/`AddCondition` in `frontend/src/pages/sheet/Hot.jsx` (used by `pages/table/CardHot.jsx:185`), `ui/Resource`, `stepsFor` duplicated at `Fields.jsx:110` and `CardHot.jsx:45`, `knownConditions` in `pages/sheet/hot.js:59-76`. Today adding a condition is a text field with a datalist. The full lists exist unused in `definition.tables.conditions` (dnd5e 15, pf2e 32 with `valued`). Build: (a) a visible pick list from that table, typed name kept below; (b) HP steps −5, −1, +1, +5, one shared `stepsFor`; (c) "Full HP" on `Resource` when current < max, sending `{path:"hp", op:"set", value:max}` (not `reset`, which drops temporary HP). No backend change expected. Decision **D292**. **Branch `fix/1121-relevant-choices`: items 2 and 3.** - *Item 2 cause:* the Ancestry step's "Choose 1 ancestry feat" (`pf2e/character.json:1083-1084`) does add the feat (`StartCharacter.jsx:365-372`, `AddFromContent.jsx:128-143`, `sheet_service.py:1496-1590`), but the step never shows it: its `fields` omit `feats`, and the "N on the sheet" count reads `chosen` from the definition, while it only exists on the server's `sheet.creation.steps[].choose[].chosen` (`sheet_creation.py:320-322`). Each retry adds a duplicate row with no slot or level. The picker (`sheet_service.py:2193-2302`) filters by kind only; the Heritage chooser lists every heritage. The mini pack has ancestry feats for humans only, so a correct filter shows a dwarf or elf nothing. - *Item 3:* `level_options`/`feat_why` (`sheet_levelup.py:1930-2013`, `871-904`) return other classes' feats disabled (D261) and other ancestries' feats as eligible. - *Build (decision **D291**, supersedes D261 in part):* chosen rows shown under the choose row with Remove, count from the live sheet, slot/level set by the server, a second pick refused once met; pickers send category, level_max and the chosen ancestry/class and the server filters (feats by `fields.category`, level, owning trait; heritages by `fields.ancestry`; a hand-typed ancestry falls back to unfiltered); level up omits other-class and other-ancestry feats and **keeps, disabled with the reason, feats that are the right class/ancestry but not takeable yet** (told to the owner in chat on 11 Oct; not yet confirmed by them); the apply-time refusal stays; dwarf and elf ancestry feats and an elf heritage added to the mini pack; j7 extended. ### Not started **Item 4 (bug): `frontend/src/pages/wiki/Editor.jsx:523`.** `create()` awaits `createLoreEntry` then navigates while the form is still dirty (`dirty = newDirty && !suggested`, 351-359); the blocker in `hooks/useUnsavedChangesWarning.jsx:160-166` stops the editor's own navigation. Affects every GM "new page → Create" where anything was typed. Fix: a `created` state in `dirty`, set before `navigate`. `Editor.test.jsx` mounts under `MemoryRouter`, where blocking is inert, which is why it was missed: add a case under `createMemoryRouter` + `RouterProvider` (as `pages/CampaignStoryline.test.jsx`), and a journey step. **Item 5 (gap, with a privacy side effect).** The generator returns `name, pronouns, occupation, want, secret, voice_cue` (`backend/app/services/generation_service.py:1385`). Both "Save to the wiki" (`frontend/src/pages/prep/tools/ResultActions.jsx:80`) and "Save as a page, with a block" (`prep/tools/Npcs.jsx:81`) post only `{entry_type:"npc", title, body: npcText(n)}`, one flat blob. The create schema already takes `pronouns` and `sidebar_fields` (`backend/app/routers/campaigns.py:205-223`, written at 4246-4258). **The secret ("Hides: …") lands in the table-visible body of a page with the default audience, so players can read it.** Fix, one shared builder for both buttons: `pronouns` → the pronouns field; `occupation` → `sidebar_fields: [{label:"Occupation", value}]`; `want` → body under `## Wants`; `voice_cue` → body under `## Personality`; `secret` → body inside `:::gm` / `## Secrets`. Check on dev whether pages already saved this way exposed a secret (Thistle in the GM copy is one). **Item 6 (mostly discoverability; the review page's instruction was also wrong).** The audience picker shows only in Edit mode on a group with `audience_group` (`frontend/src/pages/sheet/SheetBody.jsx:485-492`); in the built-in definitions that is only pf2e's "Campaign notes" and "Private notes" on the Notes tab (`pf2e/character.json:1365-1369`), and Edit opens on Stats. No group is called "Level & XP": the GM gets per-field Lock links (`EditFields.jsx:51-66, 441`). There is no sheet-wide control (the backend honours `field_visibility["*"]`, `sheet_projection.py:4-8`, but no UI sets it); whole-sheet reach is the wiki page's audience. Who plays a character is changed in the page editor's `OwnerManager` (`pages/wiki/Editor.jsx:331, 942`) or on Members & characters; "played by …" on the sheet is plain text (`SheetPage.jsx:131`). Proposed: for a GM, "played by X" links to the page editor, plus one Edit-mode link to the page's audience and player; ask the owner whether they also want a whole-sheet "Who sees this sheet" picker. ### After the builds My review plus an independent review of each branch, PRs (standing permission to open; merging on green as before), rc11 to dev with a reseed, the review page's lane 11 gets re-check pieces, then the owner's re-check and sign-off. Then the prod-copy upgrade rehearsal (authorised, Q164), the 4.5.0 final, and prod only on the owner's say. PR #1120 stays held for 4.5.1. Not done this session, and due first next session: Build Status and the Redesign Review page have not been updated for this pass.
Author
Collaborator

Progress and the owner's answers (2026-10-11, about 20:20 UTC)

Owner's answers on the Questions page (20:17 to 20:19 UTC):

  • Q167 (b): level up lists only what can be taken right now. Feats above the level, with an unmet prerequisite or already on the sheet are left out too, not shown disabled. D291 is written to say so and supersedes D261 for the listing. Sent to the builder of fix/1121-relevant-choices.
  • Q168 (c), both: the owner will look at lane 11 again once the fixes are on dev, and wants the sheet pages gone over against the rest of the app (layout, spacing, wording, components). No specifics given. A read-only audit of the sheet pages against the design system and the signed-off lanes is running; its findings come here.
  • Q169 (a): links from the sheet to the page's controls are enough; no whole-sheet audience picker.
  • Q164 (a) and Q165 (a) are now recorded on the page as well: rehearse the upgrade on a copy of prod's database; the final is cut after the owner signs lane 11.

Branches:

  • fix/1121-wiki-create-npc-save-sheet-links (items 4, 5, 6): built, reviewed by me, PR #1123, in CI. A review of the first push found that a generated secret containing ::: could close the GM block early; fixed in the builder (oneLine: one line per field, leading # dropped, a leading ::: escaped as \:::), with tests against a mirror of wiki_text.MARKER/_scan. I read the parser: it splits on \n only, after normalising CR, so the collapse covers it.
  • fix/1121-relevant-choices (items 2, 3): built (86e48942); back with its builder after my review for (1) the picker filtered a single capped page of 100 search results, so with full Player Core it could wrongly come back empty: the narrowing moves into the query or pages until filled; (2) D291 was written into the generated CATALOGUE.md instead of sources/intro.md; (3) the Q167 answer above.
  • fix/1121-sheet-5e-terms-and-card-hp (items 1, 7): still being built.

Existing pages with an exposed NPC secret: dev has one, the owner's test page "Thistle" (read-only count of pages whose body has a line starting "Hides: "). Prod was not checked: the read was refused by the session's permission rules; the owner can allow it or run it.

## Progress and the owner's answers (2026-10-11, about 20:20 UTC) **Owner's answers on the Questions page (20:17 to 20:19 UTC):** - **Q167 (b):** level up lists only what can be taken right now. Feats above the level, with an unmet prerequisite or already on the sheet are left out too, not shown disabled. D291 is written to say so and supersedes D261 for the listing. Sent to the builder of `fix/1121-relevant-choices`. - **Q168 (c), both:** the owner will look at lane 11 again once the fixes are on dev, and wants the sheet pages gone over against the rest of the app (layout, spacing, wording, components). No specifics given. A read-only audit of the sheet pages against the design system and the signed-off lanes is running; its findings come here. - **Q169 (a):** links from the sheet to the page's controls are enough; no whole-sheet audience picker. - Q164 (a) and Q165 (a) are now recorded on the page as well: rehearse the upgrade on a copy of prod's database; the final is cut after the owner signs lane 11. **Branches:** - `fix/1121-wiki-create-npc-save-sheet-links` (items 4, 5, 6): built, reviewed by me, **PR #1123**, in CI. A review of the first push found that a generated secret containing `:::` could close the GM block early; fixed in the builder (`oneLine`: one line per field, leading `#` dropped, a leading `:::` escaped as `\:::`), with tests against a mirror of `wiki_text.MARKER`/`_scan`. I read the parser: it splits on `\n` only, after normalising CR, so the collapse covers it. - `fix/1121-relevant-choices` (items 2, 3): built (86e48942); back with its builder after my review for (1) the picker filtered a single capped page of 100 search results, so with full Player Core it could wrongly come back empty: the narrowing moves into the query or pages until filled; (2) D291 was written into the generated `CATALOGUE.md` instead of `sources/intro.md`; (3) the Q167 answer above. - `fix/1121-sheet-5e-terms-and-card-hp` (items 1, 7): still being built. **Existing pages with an exposed NPC secret:** dev has one, the owner's test page "Thistle" (read-only count of pages whose body has a line starting "Hides: "). Prod was not checked: the read was refused by the session's permission rules; the owner can allow it or run it.
Author
Collaborator

The sheet pages against the rest of the app (Q168): audit findings, 2026-10-11

Read-only, from the code; nothing rendered. Paths under webapp/frontend/src/. The sheet is not off-token (0 raw colours in Sheet.css/Block.css; raw spacing about level with SessionPage.css). Most of what is distinctive is the drawing (tools/feedback-site/static/prototype/lane9.html) ported faithfully, plus a handful of build-only departures.

A. Clear inconsistencies, to fix (branch fix/1121-sheet-consistency, cut after the three fix branches merge, because it touches the same files)

  1. .rem is styled only inside .charsheet (pages/sheet/Sheet.css:102) but used outside it: BlockSection.jsx:95 (the wiki article), pages/table/CardHot.jsx:174,183, ui/Resource/index.jsx:24,44. There "Block: …, definition v…", "HP" and "temp N" render at body size. Move .rem to ui/base.css beside .muted/.faint.
  2. Two primary buttons in the header when a level is waiting (SheetPage.jsx:281 Level up, :178 Edit). The drawing drops Edit to default then (lane9.html:358).
  3. The header is one crowded row of up to eight small controls (SheetPage.jsx:676-709). The drawing has a second row, save line left and actions right; its CSS exists and is dead (.cs__bar, Sheet.css:15-22). Elsewhere: the article's bordered small buttons plus "More" (wiki/Article.jsx:498,512), the session's "Manage ▾". Restore the second row; Versions, Export… and Make a block… under one "More" menu.
  4. Grid widths in px (Sheet.css:46 250px, :163 190px) do not grow with the type on wide screens (D110); rems. LevelUp's min-width: 44px → var(--touch).
  5. Small targets never grow on a coarse pointer: 28px condition −/+, "+ Condition", "expended", rank pips (Sheet.css:463,591,615,626), the 2rem temp field (:516). The rest of the kit goes to --touch under @media (pointer: coarse); the table card already does (Block.css:218-228).
  6. Bespoke copies of kit pieces: .charsheet .rows (Sheet.css:176-191) is .tbl; hand-written screen-reader-only (:206-217, :1064-1070) vs .sr-only; .sc__done is .card with another radius; Dismiss on errors is a bare icon link (SheetPage.jsx:716-728) vs the ghost small Button used elsewhere; Block.css:130 uses a viewport media query where the rule is @container app; three off-scale font sizes in Block.css.

B. Drawn that way: asked of the owner (Q170 to Q172), not changed unprompted

  1. The sheet's pages are the wizard's step pills (SheetPage.jsx:762-771, .wiz), where the article one click away uses underline tabs. Q170.
  2. Cards are denser than the app's card and their titles smaller (.csg --r-2/--sp-3 vs .card --r-3/--sp-4; group titles h2 at --step-0, so the page goes from a 36px h1 straight to 15px). Q171.
  3. The read-only banner on every visit ("You can read what the party sees…", SheetPage.jsx:731-737) is close to a D20 explanatory callout on a frequent page. Q172.
  4. Left alone unless the owner says: figures' weight and label placement vs StatRow, no tabular numerals on the sheet, the stat block's tracked capitals (a genre convention), 24px pips (commented as deliberate), the whole-card GM tint vs the GM chip.

Needs a render to settle (journeys stack)

The header with a level waiting as GM at 1280; the title row and a 44px bump on the conditions row at 390; column count at 2560; the GM-tinted card in dark at 820; an article with a creature block; a table card with HP.

## The sheet pages against the rest of the app (Q168): audit findings, 2026-10-11 Read-only, from the code; nothing rendered. Paths under `webapp/frontend/src/`. The sheet is not off-token (0 raw colours in `Sheet.css`/`Block.css`; raw spacing about level with `SessionPage.css`). Most of what is distinctive is the drawing (`tools/feedback-site/static/prototype/lane9.html`) ported faithfully, plus a handful of build-only departures. ### A. Clear inconsistencies, to fix (branch `fix/1121-sheet-consistency`, cut after the three fix branches merge, because it touches the same files) 1. **`.rem` is styled only inside `.charsheet` (`pages/sheet/Sheet.css:102`) but used outside it**: `BlockSection.jsx:95` (the wiki article), `pages/table/CardHot.jsx:174,183`, `ui/Resource/index.jsx:24,44`. There "Block: …, definition v…", "HP" and "temp N" render at body size. Move `.rem` to `ui/base.css` beside `.muted`/`.faint`. 2. **Two primary buttons in the header when a level is waiting** (`SheetPage.jsx:281` Level up, `:178` Edit). The drawing drops Edit to default then (`lane9.html:358`). 3. **The header is one crowded row of up to eight small controls** (`SheetPage.jsx:676-709`). The drawing has a second row, save line left and actions right; its CSS exists and is dead (`.cs__bar`, `Sheet.css:15-22`). Elsewhere: the article's bordered small buttons plus "More" (`wiki/Article.jsx:498,512`), the session's "Manage ▾". Restore the second row; Versions, Export… and Make a block… under one "More" menu. 4. **Grid widths in px** (`Sheet.css:46` 250px, `:163` 190px) do not grow with the type on wide screens (D110); rems. `LevelUp`'s `min-width: 44px` → `var(--touch)`. 5. **Small targets never grow on a coarse pointer**: 28px condition −/+, "+ Condition", "expended", rank pips (`Sheet.css:463,591,615,626`), the 2rem temp field (`:516`). The rest of the kit goes to `--touch` under `@media (pointer: coarse)`; the table card already does (`Block.css:218-228`). 6. **Bespoke copies of kit pieces**: `.charsheet .rows` (`Sheet.css:176-191`) is `.tbl`; hand-written screen-reader-only (`:206-217`, `:1064-1070`) vs `.sr-only`; `.sc__done` is `.card` with another radius; Dismiss on errors is a bare icon link (`SheetPage.jsx:716-728`) vs the ghost small Button used elsewhere; `Block.css:130` uses a viewport media query where the rule is `@container app`; three off-scale font sizes in `Block.css`. ### B. Drawn that way: asked of the owner (Q170 to Q172), not changed unprompted 1. **The sheet's pages are the wizard's step pills** (`SheetPage.jsx:762-771`, `.wiz`), where the article one click away uses underline tabs. Q170. 2. **Cards are denser than the app's card and their titles smaller** (`.csg` `--r-2`/`--sp-3` vs `.card` `--r-3`/`--sp-4`; group titles h2 at `--step-0`, so the page goes from a 36px h1 straight to 15px). Q171. 3. **The read-only banner on every visit** ("You can read what the party sees…", `SheetPage.jsx:731-737`) is close to a D20 explanatory callout on a frequent page. Q172. 4. Left alone unless the owner says: figures' weight and label placement vs `StatRow`, no tabular numerals on the sheet, the stat block's tracked capitals (a genre convention), 24px pips (commented as deliberate), the whole-card GM tint vs the GM chip. ### Needs a render to settle (journeys stack) The header with a level waiting as GM at 1280; the title row and a 44px bump on the conditions row at 390; column count at 2560; the GM-tinted card in dark at 820; an article with a creature block; a table card with HP.
Author
Collaborator

Merged (owner: "Yes, please merge when green", 2026-10-11): PR #1123 (items 4, 5, 6) and PR #1124 (items 2, 3; head 82fa9ed3, with the level-up scan bounded at 1,000 candidates and the level and already-on-the-sheet checks in the query, after a review flagged the unbounded paging). Both passed all 14 CI jobs.

PR #1125 (items 1, 7; D292) passed CI, was brought up to date with main (the D291 and D292 rows both kept in sources/intro.md and CATALOGUE.md) and is scheduled to merge when its checks pass again.

Part A of the consistency audit is being built on fix/1121-sheet-consistency (six fixes; based on the #1125 branch). Part B waits on Q170 to Q172.

Still owed before rc11: a render check of the changed pages on the journeys stack (nothing in these PRs has been looked at in a browser), and the count of already-saved NPC pages with a readable secret on prod (dev has one, "Thistle").

**Merged (owner: "Yes, please merge when green", 2026-10-11):** PR #1123 (items 4, 5, 6) and PR #1124 (items 2, 3; head 82fa9ed3, with the level-up scan bounded at 1,000 candidates and the level and already-on-the-sheet checks in the query, after a review flagged the unbounded paging). Both passed all 14 CI jobs. **PR #1125** (items 1, 7; D292) passed CI, was brought up to date with main (the D291 and D292 rows both kept in `sources/intro.md` and `CATALOGUE.md`) and is scheduled to merge when its checks pass again. **Part A of the consistency audit** is being built on `fix/1121-sheet-consistency` (six fixes; based on the #1125 branch). Part B waits on Q170 to Q172. Still owed before rc11: a render check of the changed pages on the journeys stack (nothing in these PRs has been looked at in a browser), and the count of already-saved NPC pages with a readable secret on prod (dev has one, "Thistle").
Author
Collaborator

Done and on dev in v4.5.0-rc11 (2026-10-12, about 01:50 UTC)

Merged: #1123 (items 4, 5, 6), #1124 (items 2, 3; Q167, D291), #1125 (items 1, 7; D292), #1127 (the sheet brought into line: the audit's fixes plus Q170 tabs D293, Q171 group titles D294, Q172 no read-only banner D295). Release PR #1131, tag v4.5.0-rc11, three images published.

#1127, after a render on the journeys stack (35 screenshots, desktop, phone, tablet dark), also fixed what the render showed: a reader outside the party saw empty Attributes and Skills cards and a withheld hero-point pool drawn as full (the server now sends a withheld list of field paths, and the page draws no withheld field, no empty card and no empty tab; "Nothing on this sheet is shared with you." when nothing is); the Add a condition dialog was too tall on a phone; "Sailing Lore Lore" (a without_suffix expression function in both evaluators, and creation stores the subject without "Lore"). A second render confirmed the three. Left as they are: the sheet's tabs wrap to two rows on a phone, as an article's would with labels this long; a gap under the More row on a sheet with nothing shared; the table card at desktop width keeps HP behind "Show more".

Dev: backup questboard_manual_20261012T014641Z.dump, checkout of the tag, images pulled, every service healthy, /api/meta reports 4.5.0-rc11, demo data rebuilt with --reset (which removed the owner's test page "Thistle", the one dev page with a readable Instant NPC secret), no errors in the backend or worker logs after the deploy. The built-in dnd5e-character, dnd5e-creature and pf2e-character definitions were refreshed in place by the deploy (updated 01:49 UTC, no failed fixtures).

Not verified: no 5e sheet has been looked at in a browser (the journeys seed has none); the AC line is confirmed by the fixture and a page test only. Prod has not been checked for pages saved by the old Instant NPC path (the read was refused by the session's permission rules).

Waiting on the owner: the re-check pieces on the Redesign Review page (twelve at the end of lane 11) and the lane 11 sign-off. This issue stays open until then.

## Done and on dev in v4.5.0-rc11 (2026-10-12, about 01:50 UTC) **Merged:** #1123 (items 4, 5, 6), #1124 (items 2, 3; Q167, D291), #1125 (items 1, 7; D292), #1127 (the sheet brought into line: the audit's fixes plus Q170 tabs D293, Q171 group titles D294, Q172 no read-only banner D295). Release PR #1131, tag `v4.5.0-rc11`, three images published. **#1127, after a render on the journeys stack** (35 screenshots, desktop, phone, tablet dark), also fixed what the render showed: a reader outside the party saw empty Attributes and Skills cards and a withheld hero-point pool drawn as full (the server now sends a `withheld` list of field paths, and the page draws no withheld field, no empty card and no empty tab; "Nothing on this sheet is shared with you." when nothing is); the Add a condition dialog was too tall on a phone; "Sailing Lore Lore" (a `without_suffix` expression function in both evaluators, and creation stores the subject without "Lore"). A second render confirmed the three. Left as they are: the sheet's tabs wrap to two rows on a phone, as an article's would with labels this long; a gap under the More row on a sheet with nothing shared; the table card at desktop width keeps HP behind "Show more". **Dev:** backup `questboard_manual_20261012T014641Z.dump`, checkout of the tag, images pulled, every service healthy, `/api/meta` reports 4.5.0-rc11, demo data rebuilt with `--reset` (which removed the owner's test page "Thistle", the one dev page with a readable Instant NPC secret), no errors in the backend or worker logs after the deploy. The built-in `dnd5e-character`, `dnd5e-creature` and `pf2e-character` definitions were refreshed in place by the deploy (updated 01:49 UTC, no failed fixtures). **Not verified:** no 5e sheet has been looked at in a browser (the journeys seed has none); the AC line is confirmed by the fixture and a page test only. Prod has not been checked for pages saved by the old Instant NPC path (the read was refused by the session's permission rules). **Waiting on the owner:** the re-check pieces on the Redesign Review page (twelve at the end of lane 11) and the lane 11 sign-off. This issue stays open until then.
Author
Collaborator

Signed off. The owner re-checked on dev (v4.5.0-rc11) on 2026-10-12, 16:06 to 16:15 UTC: all twelve rc11-l11-* pieces are marked "Looks right", and lane 11 is signed off with the note "I think you nailed it. Nice work!". All twelve lanes are now signed off.

From the same pass, tracked elsewhere:

  • Raw wiki link markup outside the wiki, and the owner's decision that recap links become real links in the app: #1135 (PR #1136).
  • The "One star, one wish" hint should read just "Optional." (review item rc11-l1-wording): on the #1136 branch.
  • Admin → AI usage shows usage only for the Amberwake campaigns (rc9-l9-usage, marked change): the page covers 30 days and the demo seed's costed row sits on The Salt Crown's months-old session, so it can never show. A seed fix is on fix/demo-usage-cost-in-window.

Closing: everything in this issue is merged, on dev and accepted.

**Signed off.** The owner re-checked on dev (v4.5.0-rc11) on 2026-10-12, 16:06 to 16:15 UTC: all twelve `rc11-l11-*` pieces are marked "Looks right", and lane 11 is signed off with the note "I think you nailed it. Nice work!". All twelve lanes are now signed off. From the same pass, tracked elsewhere: - Raw wiki link markup outside the wiki, and the owner's decision that recap links become real links in the app: #1135 (PR #1136). - The "One star, one wish" hint should read just "Optional." (review item `rc11-l1-wording`): on the #1136 branch. - Admin → AI usage shows usage only for the Amberwake campaigns (`rc9-l9-usage`, marked change): the page covers 30 days and the demo seed's costed row sits on The Salt Crown's months-old session, so it can never show. A seed fix is on `fix/demo-usage-cost-in-window`. Closing: everything in this issue is merged, on dev and accepted.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
rbrooks/Quest-Board#1121
No description provided.