Lane 10 PR 7b: the email landing pages, the grid's DM column, the installed app (#736) #900

Merged
claude-bot merged 5 commits from build/lane10-7b-email-pages into main 2026-09-28 04:24:55 +00:00
Collaborator

Part of #736 (lane 10). Frontend only, on main.

What it builds

  • /email/stop and /email/answer (D154, D155, D224). These are public pages outside sign-in, like /join, built on PR 3's existing routes.

    • Stop:
      • it describes what will stop; the GET never acts;
      • "Stop these emails", then "Stopped", with Undo.
    • Answer:
      • opens with the email's own answer already picked;
      • Confirm records it through the same RSVP path as the web.
    • Both show one clear dead-link state for any bad, expired or used token, and never show more than the token names. That means no email address and no other session.
  • The notification grid (HOME-6):

    • the star-and-wish row is an indented sub-row under Sessions, with "On Home" in the in-app column (D225, D232);
    • a "Discord can't reach you" banner appears when the server reports a DM failure.
  • The installed app:

    • D13's quiet "Quest Board has been updated" notice with Reload. The PWA now uses registerType: "prompt" and no longer forces skipWaiting;
    • an offline banner;
    • orientation is dropped from the manifest.

    Both banners sit in the signed-in frame.

Departures (the API doesn't carry what the drawing shows)

  1. The DM warning is one server sentence, not the drawing's two ("closed" and "no shared server").
  2. The answer page doesn't link "Open Session N". The lookup returns a number but no session id.
  3. Neither page names the recipient's address. That also keeps the privacy rule.
  4. One dead-link state per page, not three. The API returns one 404 for each.

These are filed as a backend follow-up.

Checks

  • vitest: 201 files, 2650 passed. eslint: 0 errors.
  • New tests: both landing pages (dead link, reveals nothing extra, stop and undo, pre-picked answer), the grid sub-row and warning, and the status banners.
  • Render check: the landing pages at 2560, 1440 and 1024, in light and dark, signed out. I looked at them against the drawing myself. One fault was fixed: a doubled eyebrow on Stop.
    • At 390 it's not confirmed: headless Edge on Windows clamps and crops below about 500 px. The pages use the existing PublicPage shell.
    • The banners weren't painted live. They need a signed-in stack; jsdom tests cover them.
  • coverage/lane8.py: unclassified: none.
  • No journey changes: J0b and J2 don't assert these pages. Lane 10 PR 8 covers them.

🤖 Generated with Claude Code

Part of #736 (lane 10). Frontend only, on main. ## What it builds - **`/email/stop` and `/email/answer`** (D154, D155, D224). These are public pages outside sign-in, like `/join`, built on PR 3's existing routes. - **Stop:** - it describes what will stop; the GET never acts; - "Stop these emails", then "Stopped", with Undo. - **Answer:** - opens with the email's own answer already picked; - Confirm records it through the same RSVP path as the web. - **Both** show one clear dead-link state for any bad, expired or used token, and **never show more than the token names**. That means no email address and no other session. - **The notification grid** (HOME-6): - the star-and-wish row is an indented sub-row under Sessions, with "On Home" in the in-app column (D225, D232); - a **"Discord can't reach you"** banner appears when the server reports a DM failure. - **The installed app:** - D13's quiet **"Quest Board has been updated"** notice with Reload. The PWA now uses `registerType: "prompt"` and no longer forces `skipWaiting`; - an **offline banner**; - `orientation` is dropped from the manifest. Both banners sit in the signed-in frame. ## Departures (the API doesn't carry what the drawing shows) 1. **The DM warning is one server sentence,** not the drawing's two ("closed" and "no shared server"). 2. **The answer page doesn't link "Open Session N".** The lookup returns a number but no session id. 3. **Neither page names the recipient's address.** That also keeps the privacy rule. 4. **One dead-link state per page,** not three. The API returns one 404 for each. These are filed as a backend follow-up. ## Checks - **vitest:** 201 files, 2650 passed. **eslint:** 0 errors. - **New tests:** both landing pages (dead link, reveals nothing extra, stop and undo, pre-picked answer), the grid sub-row and warning, and the status banners. - **Render check:** the landing pages at 2560, 1440 and 1024, in light and dark, signed out. I looked at them against the drawing myself. One fault was fixed: a doubled eyebrow on Stop. - **At 390 it's not confirmed:** headless Edge on Windows clamps and crops below about 500 px. The pages use the existing `PublicPage` shell. - **The banners weren't painted live.** They need a signed-in stack; jsdom tests cover them. - `coverage/lane8.py`: unclassified: none. - **No journey changes:** J0b and J2 don't assert these pages. Lane 10 PR 8 covers them. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
WIP checkpoint: /email/stop and /email/answer, NotifyGrid's sub-row and
custom in-app label support (D232, D225), the DM warning banner (HOME-6),
the installed app's update notice and offline banner (D13), and dropping
manifest orientation. Render check and coverage still to confirm.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
fix(webapp): drop the redundant eyebrow on the Stop-emails page (#736)
Some checks failed
CI / Summarisation accuracy eval harness (stub provider) (pull_request) Successful in 1m1s
CI / Backend lint (ruff) (pull_request) Successful in 31s
CI / Feedback site tests (pull_request) Successful in 50s
CI / Bot/backend version sync (pull_request) Successful in 27s
CI / Does this change touch the recording path? (pull_request) Successful in 19s
CI / Synthetic session harness (no GPU, no LLM) (pull_request) Has been skipped
CI / Docker image build (pull_request) Successful in 2m42s
CI / Bot tests and audit (pull_request) Successful in 5m24s
CI / Backend migration, tests, and audit (pull_request) Successful in 18m9s
CI / Frontend tests, audit, and build (pull_request) Has been cancelled
CI / End-to-end journeys (desktop, phone, keyboard-only) (pull_request) Has been cancelled
0b78311aeb
The crumb already reads "Emails from Quest Board"; render-checking the
page against the drawing showed the eyebrow repeating it right above a
different, more specific h1, unlike the other public pages (Login,
JoinCampaign) that only repeat crumb text in an h1, not twice over.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
fix(webapp): NotifyGrid's narrow-screen note now names the star-and-wish exception
Some checks failed
CI / Summarisation accuracy eval harness (stub provider) (pull_request) Successful in 1m0s
CI / Backend lint (ruff) (pull_request) Successful in 30s
CI / Feedback site tests (pull_request) Successful in 38s
CI / Bot tests and audit (pull_request) Successful in 2m0s
CI / Bot/backend version sync (pull_request) Successful in 22s
CI / Docker image build (pull_request) Successful in 24s
CI / Does this change touch the recording path? (pull_request) Successful in 20s
CI / Synthetic session harness (no GPU, no LLM) (pull_request) Has been skipped
CI / Frontend tests, audit, and build (pull_request) Successful in 23m20s
CI / Backend migration, tests, and audit (pull_request) Successful in 47m12s
CI / End-to-end journeys (desktop, phone, keyboard-only) (pull_request) Failing after 23m57s
ba3445c5ff
The phone-width render check (D232's sub-row) found that the "In Quest
Board" column's hidden-on-phone summary note unconditionally said
"Everything also comes to the bell in Quest Board, always" — but the
star-and-wish row this PR adds shows "On Home" instead of "Always" in
the desktop column, and the narrow layout hides that per-row column in
favour of the one blanket sentence. A phone reader was told something
false about a row on the same page.

The default note is now computed from the rows: any row whose `inApp`
is a string (the "On Home" case) is named as an exception. An explicit
`note` prop still wins.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Author
Collaborator

The phone check is done, on a real seeded stack, at a true 390×844 and at 1440, in light and dark. It covered:

  • the email landings, both with bad tokens and with real minted tokens, signed out;
  • the notifications grid, signed in;
  • the offline banner, painted live via setOffline.

Every shot passes scrollWidth <= innerWidth, and I looked at them myself.

One fault fixed (ba3445c5): on a phone, the grid hides the per-row "In Quest Board" column behind one blanket sentence ("Everything also comes to the bell, always"). That became false once the star-and-wish row read "On Home". The note is now computed from the rows: "…except One star, one wish (On Home)". Tests were added, and vitest passes (2651).

**The phone check is done, on a real seeded stack,** at a true 390×844 and at 1440, in light and dark. It covered: - the email landings, both with bad tokens and with **real minted tokens**, signed out; - the notifications grid, signed in; - the offline banner, painted live via `setOffline`. Every shot passes `scrollWidth <= innerWidth`, and I looked at them myself. **One fault fixed (ba3445c5):** on a phone, the grid hides the per-row "In Quest Board" column behind one blanket sentence ("Everything also comes to the bell, always"). That became false once the star-and-wish row read "On Home". The note is now computed from the rows: "…except One star, one wish (On Home)". Tests were added, and vitest passes (2651).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Merge main into build/lane10-7b-email-pages
All checks were successful
CI / Summarisation accuracy eval harness (stub provider) (pull_request) Successful in 2m32s
CI / Backend lint (ruff) (pull_request) Successful in 1m8s
CI / Feedback site tests (pull_request) Successful in 2m2s
CI / Bot tests and audit (pull_request) Successful in 5m2s
CI / Bot/backend version sync (pull_request) Successful in 1m0s
CI / Does this change touch the recording path? (pull_request) Successful in 28s
CI / Synthetic session harness (no GPU, no LLM) (pull_request) Has been skipped
CI / Docker image build (pull_request) Successful in 1m12s
CI / Frontend tests, audit, and build (pull_request) Successful in 22m50s
CI / End-to-end journeys (desktop, phone, keyboard-only) (pull_request) Successful in 19m0s
CI / Backend migration, tests, and audit (pull_request) Successful in 47m38s
f855c1ff0a
Sign in to join this conversation.
No description provided.