Lane 2b — the rest of Settings (#659) #682

Closed
claude-bot wants to merge 0 commits from redesign/lane2b into main
Collaborator

Refs #659. At /feedback/prototype/lane2b once deployed.

The seven settings sections lane 2 did not draw — CAMP-10 invites and joining, CAMP-11 ownership, CAMP-13 recording/retention/AI, CAMP-14 the wiki's edit permissions, CAMP-15 content packs, CAMP-16 Foundry, CAMP-17 archive/export/clone/delete. 84 feature rows, of which 56 are in two sections.

It also answers what lane 2 left open — how a person moves between nine sections and back out — and finishes CAMP-9 General, which lane 2 drew at about thirteen of its eighteen rows and captioned as whole.

Five decisions, D21–D25

Recorded in the catalogue's intro and on each surface they govern, with five new IS rows for the scope they created (catalogue rebuilt: 1,583 rows on 102 surfaces).

# Decision
D21 Open — the Contents opening into the nine, or a back bar. Drawn both ways. Either way each section gets its own address, which is what makes SH-036's unsaved-changes prompt fire at all: it only triggers on a change of pathname, so nine sections as tabs of one page would lose an edit with the guard sitting right there.
D22 Leaving a section with unsaved edits asks first.
D23 Invites split — getting a link stays on Members in CA-225's compact form; managing them lives in Settings. Otherwise CAMP-8's primary Invite players button pointed at a page a player cannot open.
D24 Instance retention becomes a default and an absolute cap, and a campaign lands between them. Today get_effective_retention lets any non-null campaign value win, so the "default" is a default in name only.
D25 Turning per-campaign AI off says the campaign's settings are kept and inert, rather than removing the panel and leaving a GM to conclude their configuration was lost.

CAMP-11 is renamed Ownership: every GM control it was named for — Make GM, Remove GM, the owner badge, even the transfer entry point — lives on CAMP-8 on the row of the person it affects, and stays there.

Rendering it caught six faults that reading the code did not

  1. The phone Contents sheet was not in the picture. It ships hidden and is opened by a tap a screenshot does not make, so the still showed an ordinary page under a caption promising the sheet. Unhiding it exposed a second fault behind the first — the sheet is positioned against .app, so on a page drawn at its natural height the panel landed at the foot of a two-thousand-pixel document instead of over the screen.
  2. Two desktop pages side by side wrapped "Quest Board" across two lines at a width no desktop has — the same fault lane 1 found, reintroduced.
  3. The Contents sub-list was headed "Settings" one line under the row that says "Settings".
  4. Every content pack read Pathfinder 2e · 214 creatures — an HTML entity written into a string that is then escaped.
  5. An empty months box sat beside an already-chosen "keep them", reading as a field somebody forgot to fill in.
  6. A toggle's aria-label read “previously on” literally, which a screen reader says as "ampersand ldquo semicolon". Invisible on screen; the whole of the label for anyone listening.

Two things in the code, found while scoping

  • #680 — shortening transcript retention destroys transcripts with no bin, no grace and no warning, while audio is looked after three ways over. Filed. The confirmation drawn here is the front half of the fix.
  • IS-188 — export withholds unlicensed records and only the downloaded file says so. The manifest lists every one and the response carries a header with the count, but the button is a plain download link so the page reads neither. Drawn here as a line under Export.

Shared kit

The settings components (invite rows, pack rows, retention controls, choice lists, the clone tree, a .btn--danger and a disabled-field style) go in shell.css so lane 7's ADMIN-11 — the same content-packs component at instance scope, 34 rows — and the rebuild can reuse them. shell.js's tocList gains o.subActive: its sub-list hardcoded the first item as current, which is right for an article's headings and wrong for nine separate pages.

Verification

  • Route in app.py and a line in tests/test_app.py. 85 passed in python:3.12-slim. CI now runs these (#675, merged in #681).
  • Catalogue rebuilt with sources/build.ps1; nothing unplaced.
  • Every section rendered in headless Edge and read, in both themes.

🤖 Generated with Claude Code

Refs #659. At `/feedback/prototype/lane2b` once deployed. The seven settings sections lane 2 did not draw — `CAMP-10` invites and joining, `CAMP-11` ownership, `CAMP-13` recording/retention/AI, `CAMP-14` the wiki's edit permissions, `CAMP-15` content packs, `CAMP-16` Foundry, `CAMP-17` archive/export/clone/delete. **84 feature rows, of which 56 are in two sections.** It also answers what lane 2 left open — how a person moves between nine sections and back out — and finishes `CAMP-9` General, which lane 2 drew at about thirteen of its eighteen rows and captioned as whole. ## Five decisions, D21–D25 Recorded in the catalogue's intro and on each surface they govern, with five new `IS` rows for the scope they created (catalogue rebuilt: **1,583 rows on 102 surfaces**). | # | Decision | |---|---| | **D21** | **Open** — the Contents opening into the nine, or a back bar. Drawn both ways. Either way each section gets its own address, which is what makes `SH-036`'s unsaved-changes prompt fire at all: it only triggers on a change of *pathname*, so nine sections as tabs of one page would lose an edit with the guard sitting right there. | | **D22** | Leaving a section with unsaved edits asks first. | | **D23** | Invites split — getting a link stays on Members in `CA-225`'s compact form; managing them lives in Settings. Otherwise CAMP-8's primary *Invite players* button pointed at a page a player cannot open. | | **D24** | Instance retention becomes a **default** and an **absolute cap**, and a campaign lands between them. Today `get_effective_retention` lets any non-null campaign value win, so the "default" is a default in name only. | | **D25** | Turning per-campaign AI off says the campaign's settings are kept and inert, rather than removing the panel and leaving a GM to conclude their configuration was lost. | `CAMP-11` is renamed **Ownership**: every GM control it was named for — Make GM, Remove GM, the owner badge, even the transfer entry point — lives on `CAMP-8` on the row of the person it affects, and stays there. ## Rendering it caught six faults that reading the code did not 1. **The phone Contents sheet was not in the picture.** It ships `hidden` and is opened by a tap a screenshot does not make, so the still showed an ordinary page under a caption promising the sheet. Unhiding it exposed a second fault behind the first — the sheet is positioned against `.app`, so on a page drawn at its natural height the panel landed at the foot of a two-thousand-pixel document instead of over the screen. 2. **Two desktop pages side by side wrapped "Quest Board" across two lines** at a width no desktop has — the same fault lane 1 found, reintroduced. 3. **The Contents sub-list was headed "Settings"** one line under the row that says "Settings". 4. **Every content pack read `Pathfinder 2e · 214 creatures`** — an HTML entity written into a string that is then escaped. 5. **An empty months box sat beside an already-chosen "keep them"**, reading as a field somebody forgot to fill in. 6. **A toggle's `aria-label` read `“previously on”` literally**, which a screen reader says as "ampersand ldquo semicolon". Invisible on screen; the whole of the label for anyone listening. ## Two things in the code, found while scoping - **#680** — shortening transcript retention destroys transcripts with no bin, no grace and no warning, while audio is looked after three ways over. Filed. The confirmation drawn here is the front half of the fix. - **`IS-188`** — export withholds unlicensed records and only the downloaded file says so. The manifest lists every one and the response carries a header with the count, but the button is a plain download link so the page reads neither. Drawn here as a line under Export. ## Shared kit The settings components (invite rows, pack rows, retention controls, choice lists, the clone tree, a `.btn--danger` and a disabled-field style) go in `shell.css` so lane 7's `ADMIN-11` — the same content-packs component at instance scope, 34 rows — and the rebuild can reuse them. `shell.js`'s `tocList` gains `o.subActive`: its sub-list hardcoded the first item as current, which is right for an article's headings and wrong for nine separate pages. ## Verification - Route in `app.py` and a line in `tests/test_app.py`. **85 passed** in `python:3.12-slim`. CI now runs these (#675, merged in #681). - Catalogue rebuilt with `sources/build.ps1`; nothing unplaced. - Every section rendered in headless Edge and read, in both themes. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
feat(feedback-site): lane 2b — the rest of Settings (#659)
All checks were successful
CI / Summarisation accuracy eval harness (stub provider) (pull_request) Successful in 56s
CI / Feedback site tests (pull_request) Successful in 45s
CI / Backend lint (ruff) (pull_request) Successful in 1m9s
CI / Bot/backend version sync (pull_request) Successful in 33s
CI / Frontend tests, audit, and build (pull_request) Successful in 2m56s
CI / Docker image build (pull_request) Successful in 37s
CI / Bot tests and audit (pull_request) Successful in 3m19s
CI / Backend migration, tests, and audit (pull_request) Successful in 9m43s
CI / Synthetic session harness (no GPU, no LLM) (pull_request) Successful in 27m54s
f592ac1c90
The seven settings sections lane 2 did not draw: CAMP-10 invites and
joining, CAMP-11 ownership, CAMP-13 recording/retention/AI, CAMP-14 the
wiki's edit permissions, CAMP-15 content packs, CAMP-16 Foundry, and
CAMP-17 archive/export/clone/delete. Eighty-four feature rows, of which
fifty-six are in CAMP-13 and CAMP-15.

Also answers what lane 2 left open -- how a person moves between nine
sections and back out -- and finishes CAMP-9 General, which lane 2 drew at
about thirteen of its eighteen rows and captioned as whole. The
registry-match nudge, the blank-timezone warning and the whole
stat-conversion panel that D5 put in Settings -> General were all missing.

Five decisions, recorded as D21-D25 in the catalogue's intro and on the
surfaces they govern, with five new IS rows for the scope they created:

- D21 open: the Contents opening into the nine, or a back bar. Drawn both
  ways. Either way each section gets its own address, which is what makes
  SH-036's unsaved-changes prompt fire at all -- it only triggers on a
  change of pathname, so nine sections as tabs of one page would lose an
  edit with the guard sitting right there.
- D22: leaving with unsaved edits asks first.
- D23: invites split -- getting a link stays on Members in CA-225's compact
  form, managing them lives in Settings. Otherwise CAMP-8's primary
  "Invite players" button pointed at a page a player cannot open.
- D24: instance retention becomes a default and an absolute cap, and a
  campaign lands between them. Today get_effective_retention lets any
  non-null campaign value win, so the "default" is a default in name only.
- D25: turning per-campaign AI off says the campaign's settings are kept
  and inert, rather than removing the panel and leaving a GM to conclude
  their configuration was lost.

Catalogue rebuilt: 1,583 rows on 102 surfaces. CAMP-11 is renamed
"Ownership" -- every GM control it was named for lives on CAMP-8, on the
row of the person it affects, and stays there.

Shared kit: the settings components (invite rows, pack rows, retention
controls, choice lists, the clone tree, a .btn--danger and a disabled field)
go in shell.css so lane 7's ADMIN-11 and the rebuild can reuse them.
shell.js's tocList gains o.subActive, because its sub-list hardcoded the
first item as current -- right for an article's headings, wrong for nine
separate pages.

Rendering it caught six faults reading the code did not:

1. The phone Contents sheet was not in the picture: it ships hidden and is
   opened by a tap a screenshot does not make. Unhiding it exposed a second
   fault behind it -- the sheet is positioned against .app, so on a page
   drawn at its natural height the panel landed at the foot of a
   two-thousand-pixel document instead of over the screen.
2. Two desktop pages side by side wrapped "Quest Board" across two lines at
   a width no desktop has -- the same fault lane 1 found, reintroduced.
3. The Contents sub-list was headed "Settings" one line under the row that
   says "Settings".
4. Every content pack read "Pathfinder 2e · 214 creatures": an HTML
   entity written into a string that is then escaped.
5. An empty months box sat beside an already-chosen "keep them".
6. A toggle's aria-label read "“previously on”" literally,
   which a screen reader says as "ampersand ldquo semicolon".

Route in app.py and a line in tests/test_app.py, both of which CI now runs
(#675). 85 passed.

Refs #659, #680.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Author
Collaborator

Merged to main in f3cd5ae, and deployed. Closing by hand — merged by pushing the merge commit rather than through the API, which does not auto-close the PR.

Follow-up review fixes are in #683.

Merged to `main` in f3cd5ae, and deployed. Closing by hand — merged by pushing the merge commit rather than through the API, which does not auto-close the PR. Follow-up review fixes are in #683.
claude-bot closed this pull request 2026-09-17 21:22:04 +00:00
All checks were successful
CI / Summarisation accuracy eval harness (stub provider) (pull_request) Successful in 56s
Required
Details
CI / Feedback site tests (pull_request) Successful in 45s
Required
Details
CI / Backend lint (ruff) (pull_request) Successful in 1m9s
Required
Details
CI / Bot/backend version sync (pull_request) Successful in 33s
Required
Details
CI / Frontend tests, audit, and build (pull_request) Successful in 2m56s
Required
Details
CI / Docker image build (pull_request) Successful in 37s
Required
Details
CI / Bot tests and audit (pull_request) Successful in 3m19s
Required
Details
CI / Backend migration, tests, and audit (pull_request) Successful in 9m43s
Required
Details
CI / Synthetic session harness (no GPU, no LLM) (pull_request) Successful in 27m54s
Required
Details

Pull request closed

Sign in to join this conversation.
No description provided.