Review R4, the wiki and threads: room on an article, the party's history, the missing chapters, unread posts (#1020) #1022

Merged
claude-bot merged 10 commits from fix/1020-wiki-article-party into main 2026-10-02 02:05:12 +00:00
Collaborator

Part of #1020, the owner's 1 October review. Four items, in their words.

"Player view needs a little extra buffer at the top of the article… The GM's view also needs some buffer." (l8-article)

The Read / Talk / History tab strip had margin-bottom: 0 and nothing gave the Read tab space under it; the drawing has --sp-4. The Read tab now has that gap (16px), for a player and a GM at every width, and History's empty line gets it too. Talk already had it.

The party page shows the XP and gold figures with a small History button beside each; the entries are in an ordinary modal ("XP history" / "Gold history"), newest first, with a GM's Remove and Undo working inside it. Award XP and Add gold stay on the page. No button when there is no history. Loot is untouched. Drawn in lane6d.html; catalogue row IS-480.

"I'm noticing some categories seem to be missing in the wiki." (l8-audience)

  • The front page's Browse by group had no Quests row (the drawing lists it): added, with a count, linking to the quest log.
  • The Contents listed People, Places, Groups and Things but not Events or Lore, which the drawing had left out. Both are now in the Contents and the phone's Contents sheet, and a sheet of those kinds highlights its own chapter. The prototype pages' Contents are updated to match.
  • "Lore appear as the GMs write them." now reads "Lore appears as the GMs write it."

"Pages are IDs so I can't navigate to a page I don't know the ID of as a player": nothing to build. The review item asked for something a player cannot do. What a player gets at an unshared page's address is covered by test_the_not_shared_answer_says_nothing_about_the_page and Article.test.jsx ("says the page isn't shared, and nothing else about it").

"I didn't see any indicator of which posts were unread." (l7-thread)

There was none: the thread page had no unread flag, and the API marked the thread read as it built the view. Now:

  • GET /api/discussions/{id} returns is_new on each post and read_through on the thread, worked out against the reader's position before it advances (additive).
  • Posts that were unread as the thread opened carry a dot and the word New (real text, not colour alone), with a line "New since you were last here" above the first. They stay marked for that visit. A thread never opened before gets the marks and no line. Nothing scrolls on its own (D237).
  • Drawn in lane6.html; catalogue row IS-481.

Found on the way

A page that reaches a player only as a handout (#916) logged a console error: the page's map-markers request was refused although the page itself opened. GET …/lore/{id}/markers now answers for a reader the page is revealed to (with the markers they may see, usually none); a page neither visible nor revealed is still a 404.

Checked

  • Full backend suite: 6728 passed, 14 skipped; full vitest: 3605 passed, 1 skipped (at 4cb2656d); eslint 0 errors, ruff 0.4.4 clean. After the small follow-ups and merging main: the touched vitest files (42 passed), the handout and maps tests (39 passed), discussions, level-waiting and notifications (159 passed); every coverage/lane*.py, the changelog check and the single migration head pass.
  • Rendered in an e2e stack at 390×844 (touch) and 1440×900, light and dark, as a player and as the GM, and looked at: the 16px gap on Read and Talk; the party figures, both History modals (Escape and Close return focus to the button; Remove then Undo inside the modal); Browse by group ending in Quests; the Contents with Events and Lore, each highlighted on its own page; a thread with two unread posts marked and the line above them, gone after a reload, and a never-opened thread with marks and no line. No sideways scroll.
  • No migration, no bot API change. J6's selectors are unaffected.

🤖 Generated with Claude Code

Part of #1020, the owner's 1 October review. Four items, in their words. ## "Player view needs a little extra buffer at the top of the article… The GM's view also needs some buffer." (l8-article) The Read / Talk / History tab strip had `margin-bottom: 0` and nothing gave the Read tab space under it; the drawing has `--sp-4`. The Read tab now has that gap (16px), for a player and a GM at every width, and History's empty line gets it too. Talk already had it. ## "The history of XP and gold can be truncated, with only the current numbers shown and maybe a small history link that pops up a full history." (l8-party) The party page shows the XP and gold figures with a small **History** button beside each; the entries are in an ordinary modal ("XP history" / "Gold history"), newest first, with a GM's Remove and Undo working inside it. Award XP and Add gold stay on the page. No button when there is no history. Loot is untouched. Drawn in `lane6d.html`; catalogue row IS-480. ## "I'm noticing some categories seem to be missing in the wiki." (l8-audience) - The front page's Browse by group had no **Quests** row (the drawing lists it): added, with a count, linking to the quest log. - The Contents listed People, Places, Groups and Things but not **Events** or **Lore**, which the drawing had left out. Both are now in the Contents and the phone's Contents sheet, and a sheet of those kinds highlights its own chapter. The prototype pages' Contents are updated to match. - "Lore appear as the GMs write them." now reads "Lore appears as the GMs write it." "Pages are IDs so I can't navigate to a page I don't know the ID of as a player": nothing to build. The review item asked for something a player cannot do. What a player gets at an unshared page's address is covered by `test_the_not_shared_answer_says_nothing_about_the_page` and `Article.test.jsx` ("says the page isn't shared, and nothing else about it"). ## "I didn't see any indicator of which posts were unread." (l7-thread) There was none: the thread page had no unread flag, and the API marked the thread read as it built the view. Now: - `GET /api/discussions/{id}` returns `is_new` on each post and `read_through` on the thread, worked out against the reader's position **before** it advances (additive). - Posts that were unread as the thread opened carry a dot and the word **New** (real text, not colour alone), with a line "New since you were last here" above the first. They stay marked for that visit. A thread never opened before gets the marks and no line. Nothing scrolls on its own (D237). - Drawn in `lane6.html`; catalogue row IS-481. ## Found on the way A page that reaches a player only as a handout (#916) logged a console error: the page's map-markers request was refused although the page itself opened. `GET …/lore/{id}/markers` now answers for a reader the page is revealed to (with the markers they may see, usually none); a page neither visible nor revealed is still a 404. ## Checked - Full backend suite: **6728 passed, 14 skipped**; full vitest: **3605 passed, 1 skipped** (at 4cb2656d); eslint 0 errors, ruff 0.4.4 clean. After the small follow-ups and merging main: the touched vitest files (42 passed), the handout and maps tests (39 passed), discussions, level-waiting and notifications (159 passed); every `coverage/lane*.py`, the changelog check and the single migration head pass. - Rendered in an e2e stack at 390×844 (touch) and 1440×900, light and dark, as a player and as the GM, and looked at: the 16px gap on Read and Talk; the party figures, both History modals (Escape and Close return focus to the button; Remove then Undo inside the modal); Browse by group ending in Quests; the Contents with Events and Lore, each highlighted on its own page; a thread with two unread posts marked and the line above them, gone after a reload, and a never-opened thread with marks and no line. No sideways scroll. - No migration, no bot API change. J6's selectors are unaffected. 🤖 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>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The read answer now says which posts were new (is_new) and where the
reader's position was (read_through); the page marks them with a dot and
the word New, and a line above the first, and keeps them marked for the
visit.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Merge main: the ledger keeps both branches' rows (#1020)
Some checks failed
CI / Does this change touch the recording path? (pull_request) Successful in 21s
CI / Synthetic session harness (no GPU, no LLM) (pull_request) Has been skipped
CI / Bot/backend version sync (pull_request) Successful in 31s
CI / Backend lint (ruff) (pull_request) Successful in 37s
CI / Feedback site tests (pull_request) Successful in 51s
CI / Bot tests and audit (pull_request) Successful in 1m57s
CI / Docker image build (pull_request) Successful in 2m21s
CI / Summarisation accuracy eval harness (stub provider) (pull_request) Successful in 2m54s
CI / Frontend (shard 1/2) (pull_request) Has been cancelled
CI / End-to-end journeys (desktop) (pull_request) Has been cancelled
CI / Backend migration, tests, and audit (pull_request) Has been cancelled
CI / End-to-end journeys (phone) (pull_request) Has been cancelled
CI / Frontend (shard 2/2) (pull_request) Has been cancelled
CI / End-to-end journeys (keyboard) (pull_request) Has been cancelled
abb8fafa2a
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Merge main; the catalogue ledgers merge by union (#1020)
Some checks failed
CI / Backend lint (ruff) (pull_request) Has been cancelled
CI / Feedback site tests (pull_request) Has been cancelled
CI / Bot/backend version sync (pull_request) Has been cancelled
CI / Docker image build (pull_request) Has been cancelled
CI / Does this change touch the recording path? (pull_request) Has been cancelled
CI / Synthetic session harness (no GPU, no LLM) (pull_request) Has been cancelled
CI / End-to-end journeys (desktop) (pull_request) Has been cancelled
CI / End-to-end journeys (keyboard) (pull_request) Has been cancelled
CI / End-to-end journeys (phone) (pull_request) Has been cancelled
CI / Bot tests and audit (pull_request) Has been cancelled
CI / Frontend (shard 1/2) (pull_request) Has been cancelled
CI / Summarisation accuracy eval harness (stub provider) (pull_request) Has been cancelled
CI / Frontend (shard 2/2) (pull_request) Has been cancelled
CI / Backend migration, tests, and audit (pull_request) Has been cancelled
e0a4453dcd
Every PR that adds a state appends a ledger row at the same place, so two open
PRs always conflicted there.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Say only what is known in the ledger merge note (#1020)
All checks were successful
CI / Bot/backend version sync (pull_request) Successful in 36s
CI / Summarisation accuracy eval harness (stub provider) (pull_request) Successful in 1m12s
CI / Docker image build (pull_request) Successful in 41s
CI / Backend lint (ruff) (pull_request) Successful in 1m7s
CI / Feedback site tests (pull_request) Successful in 1m0s
CI / Does this change touch the recording path? (pull_request) Successful in 29s
CI / Synthetic session harness (no GPU, no LLM) (pull_request) Has been skipped
CI / Bot tests and audit (pull_request) Successful in 4m18s
CI / Frontend (shard 2/2) (pull_request) Successful in 8m10s
CI / Frontend (shard 1/2) (pull_request) Successful in 11m2s
CI / End-to-end journeys (phone) (pull_request) Successful in 11m4s
CI / End-to-end journeys (keyboard) (pull_request) Successful in 11m44s
CI / End-to-end journeys (desktop) (pull_request) Successful in 22m50s
CI / Backend migration, tests, and audit (pull_request) Successful in 53m27s
e8c7b0faa3
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Sign in to join this conversation.
No description provided.