feat(feedback-site): lane 1, round two — the owner's decisions (#659) #670

Merged
claude-bot merged 1 commit from feat/lane1-round2-659 into main 2026-09-16 04:09:11 +00:00
Collaborator

Six answers from the owner's review of lane 1, plus two things the review turned up.

Settled

Question Answer
Phone bar A real search box inside a campaign, at the cost of the wordmark and the page title. Outside a campaign there is nothing to search, so the title comes back. The icon version stays drawn, for the record.
Search results Grouped by kind. The standing "searching this campaign only" line is gone — the scope is what anyone would assume, so repeating it above every result was noise.
A footer Yes: version, Help, Accessibility, Licences & notices. Not shown in Table mode.
Phone account menu The whole menu, in the Contents sheet's "You" group, on every sheet.
Lore icon Keeps the star.

The footer's justification is worth stating, since "should there be one?" was a real question: PUB-10 (accessibility statement, decision D4) and PUB-6 (rules licences and notices, #553) are both catalogued pages with no door anywhere in the app, and neither belongs in the Contents. The version is there because this is software people run themselves and "what version?" is the first thing any bug report needs.

Because the phone sheet now carries the full menu, the desktop rail drops its own half-copy — the identity disc is on every page, and two partial copies of the account menu is one more thing to keep in step than it is worth.

Two fixes

The bell panel ran past the bottom of the screen, so "Notification settings" could not be reached at all — reported by the owner. A panel now caps its height and is a flex column: the head and the foot stay put, the middle scrolls. Search does the same, for the same reason.

Settings is gone from a player's Contents. The owner asked whether players need it; I checked rather than assumed:

  • Every entry point to the Edit Campaign form is gated on isGm (CampaignDetail.jsx:1726, :784, :808).
  • The server refuses a player's write too: PATCH /campaigns/{id} is Depends(require_gm) (campaigns.py:976-982).
  • No per-member preference hides under it — a member's email and calendar opt-ins live on the user profile (user.py:55,60), and CampaignMember has only campaign_id, user_id, role, joined_at (models/campaign.py:255-290).

So a player was being shown a door that only says no.

One thing raised, not changed

Analytics is the opposite case and stays for players — the endpoint is require_campaign_member (campaigns.py:2549-2556), and every member can open it today. But it shows every member by name with their attendance and vote-participation rates, colour-coded green/yellow/red (analytics_service.py:141-170, no viewer argument, so no per-viewer filtering).

Nobody chose that; it is what the page happens to do. It is raised on the lane page as a decision for the owner, with a recommendation (keep the page for everyone, show a player the campaign-wide numbers and their own row), rather than changed unilaterally here.

A self-inflicted fault, found by rendering

The "You" group was drawn on chrome-coloured ground, but .sheet__panel is a paper panel — so the group's own text came out near-invisible. Now drawn on the ground it will really sit on, measured at 17.4:1. Reading the code would not have caught it.

Tests: 77 passed. Rendered at 1500px, no console output, no page errors, and all three anchored panels verified to sit inside their box rather than overflowing it.

🤖 Generated with Claude Code

Six answers from the owner's review of lane 1, plus two things the review turned up. ## Settled | Question | Answer | |---|---| | Phone bar | A **real search box** inside a campaign, at the cost of the wordmark and the page title. Outside a campaign there is nothing to search, so the title comes back. The icon version stays drawn, for the record. | | Search results | **Grouped by kind.** The standing "searching this campaign only" line is gone — the scope is what anyone would assume, so repeating it above every result was noise. | | A footer | **Yes**: version, Help, Accessibility, Licences & notices. Not shown in Table mode. | | Phone account menu | The whole menu, in the Contents sheet's **"You" group**, on *every* sheet. | | Lore icon | Keeps the star. | The footer's justification is worth stating, since "should there be one?" was a real question: `PUB-10` (accessibility statement, decision D4) and `PUB-6` (rules licences and notices, #553) are both catalogued pages with **no door anywhere in the app**, and neither belongs in the Contents. The version is there because this is software people run themselves and "what version?" is the first thing any bug report needs. Because the phone sheet now carries the full menu, the **desktop rail drops its own half-copy** — the identity disc is on every page, and two partial copies of the account menu is one more thing to keep in step than it is worth. ## Two fixes **The bell panel ran past the bottom of the screen**, so "Notification settings" could not be reached at all — reported by the owner. A panel now caps its height and is a flex column: the head and the foot stay put, the middle scrolls. Search does the same, for the same reason. **Settings is gone from a player's Contents.** The owner asked whether players need it; I checked rather than assumed: - Every entry point to the Edit Campaign form is gated on `isGm` (`CampaignDetail.jsx:1726`, `:784`, `:808`). - The server refuses a player's write too: `PATCH /campaigns/{id}` is `Depends(require_gm)` (`campaigns.py:976-982`). - No per-member preference hides under it — a member's email and calendar opt-ins live on the **user profile** (`user.py:55,60`), and `CampaignMember` has only `campaign_id`, `user_id`, `role`, `joined_at` (`models/campaign.py:255-290`). So a player was being shown a door that only says no. ## One thing raised, not changed **Analytics is the opposite case and stays for players** — the endpoint is `require_campaign_member` (`campaigns.py:2549-2556`), and every member can open it today. But it shows **every member by name with their attendance and vote-participation rates**, colour-coded green/yellow/red (`analytics_service.py:141-170`, no viewer argument, so no per-viewer filtering). Nobody chose that; it is what the page happens to do. It is raised on the lane page as a decision for the owner, with a recommendation (keep the page for everyone, show a player the campaign-wide numbers and their own row), rather than changed unilaterally here. ## A self-inflicted fault, found by rendering The "You" group was drawn on chrome-coloured ground, but `.sheet__panel` is a **paper** panel — so the group's own text came out near-invisible. Now drawn on the ground it will really sit on, measured at 17.4:1. Reading the code would not have caught it. Tests: 77 passed. Rendered at 1500px, no console output, no page errors, and all three anchored panels verified to sit inside their box rather than overflowing it. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
feat(feedback-site): lane 1, round two — the owner's decisions (#659)
All checks were successful
CI / Backend lint (ruff) (pull_request) Successful in 1m16s
CI / Docker image build (pull_request) Successful in 31s
CI / Bot/backend version sync (pull_request) Successful in 1m12s
CI / Summarisation accuracy eval harness (stub provider) (pull_request) Successful in 2m41s
CI / Bot tests and audit (pull_request) Successful in 4m4s
CI / Frontend tests, audit, and build (pull_request) Successful in 4m34s
CI / Backend migration, tests, and audit (pull_request) Successful in 16m48s
CI / Synthetic session harness (no GPU, no LLM) (pull_request) Successful in 20m25s
289f7e32e9
Six answers from the review, plus two things the review turned up.

Settled:
- Phone bar carries a real search box inside a campaign, at the cost of
  the wordmark and the page title. Outside a campaign there is nothing
  to search, so the title comes back. The icon version stays drawn, for
  the record.
- Search results group by kind, and the standing "searching this
  campaign only" line is gone: the scope is what anyone would assume,
  so saying it above every result was noise. The nothing-found message
  still names the campaign, where the name is the useful part.
- There is a footer: version, Help, Accessibility, Licences & notices.
  The case for it is that PUB-10 and PUB-6 are catalogued pages with no
  door anywhere in the app, and the version is what any bug report
  needs first. Not shown in Table mode.
- The phone Contents sheet carries the whole account menu in a "You"
  group, on every sheet rather than only Home's — otherwise signing out
  from inside a campaign means going Home first. The desktop rail
  therefore drops its own half-copy: the identity disc is right there.
- The Lore icon keeps its star.

Fixed, both reported or asked by the owner:
- The bell panel ran past the bottom of the screen, so "Notification
  settings" could not be reached at all. A panel now caps its height and
  is a column: head and foot stay put, the middle scrolls. Search does
  the same, for the same reason.
- Settings is gone from a player's Contents. Checked rather than
  assumed: every entry point to the Edit Campaign form is gated on
  isGm, PATCH /campaigns/{id} is require_gm, and no per-member
  preference hides under it — a member's email and calendar opt-ins are
  on the user profile. A player was being shown a door that only says
  no.

Analytics is the opposite and stays for players: the endpoint asks only
for campaign membership. But it shows every member by name with their
attendance and vote-participation rates, colour-coded, to everyone.
Nobody chose that. Raised on the page as a decision for the owner, with
a recommendation, rather than changed here.

One self-inflicted fault found by rendering: the "You" group was drawn
on chrome-coloured ground, but the phone sheet is a paper panel, so its
own text came out near-invisible. Now drawn on the ground it will
really sit on, at 17.4:1.

Tests: 77 passed.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
claude-bot scheduled this pull request to auto merge when all checks succeed 2026-09-16 03:46:53 +00:00
claude-bot deleted branch feat/lane1-round2-659 2026-09-16 04:09:11 +00:00
Sign in to join this conversation.
No description provided.