Email landings and the DM warning: carry what the drawings show #901

Closed
opened 2026-09-28 01:04:42 +00:00 by claude-bot · 2 comments
Collaborator

These came out of lane 10 PR 7b. The pages are built with what the API returns; the drawing (lane 10's EXT pages) shows more.

  1. /api/email/answer's lookup: add session_id so the page can link "Open Session N in Quest Board". The token already names the session, so this reveals nothing new to its holder.

  2. Dead-link reasons:

    • /api/email/answer returns one 404 for "run out", "already started" and "cancelled";
    • /api/email/stop returns one for "bad", "old" and "rotated secret".

    The drawing shows distinct sentences. Return a reason code without revealing anything else, then show the matching sentence.

  3. The DM failure warning: channel_availability exposes one generic DM_FAILED_WARNING. The drawing distinguishes "they closed DMs" from "no shared server". Record which one Discord reported, and pass it through.

These came out of lane 10 PR 7b. The pages are built with what the API returns; the drawing (lane 10's EXT pages) shows more. 1. **`/api/email/answer`'s lookup:** add `session_id` so the page can link "Open Session N in Quest Board". The token already names the session, so this reveals nothing new to its holder. 2. **Dead-link reasons:** - `/api/email/answer` returns one 404 for "run out", "already started" and "cancelled"; - `/api/email/stop` returns one for "bad", "old" and "rotated secret". The drawing shows distinct sentences. Return a reason code without revealing anything else, then show the matching sentence. 3. **The DM failure warning:** `channel_availability` exposes one generic `DM_FAILED_WARNING`. The drawing distinguishes "they closed DMs" from "no shared server". Record which one Discord reported, and pass it through.
Author
Collaborator

Picking this up (2026-09-30), on branch fix/901-email-landings.

What the drawing (lane8.html, EXT-5 and HOME-6) actually asks for, item by item:

  1. session_id: add it, along with the campaign name. The drawn label is "Session 14 · The Amberwake Accord", and the drawn states link "Open Session 14".
  2. Dead-link reasons:
    • /email/answer draws three states: started, cancelled ("Dana cancelled it: 'reason'") and run out. A token that verifies, for a live member, now gets a 200 whose state is open, started or cancelled. A bad or old token, a missing user or session, or a lapsed membership stays the single "run out" 404. POST refuses a started or cancelled session with a 409, so the page can flip to that state.
    • /email/stop: no change. The drawing's run-out state is captioned "Or was never a real one: the same words either way", and an HMAC can't tell a rotated secret from a tampered token anyway.
  3. The DM warning: the bot already reports closed or no_shared_server, and platform_links.dm_failed_reason already stores it. So this is backend and frontend only: pick the drawn sentence by kind and expose warning_kind. There's no bot change and no contract bump.
Picking this up (2026-09-30), on branch `fix/901-email-landings`. What the drawing (lane8.html, EXT-5 and HOME-6) actually asks for, item by item: 1. **`session_id`:** add it, along with the campaign name. The drawn label is "Session 14 · The Amberwake Accord", and the drawn states link "Open Session 14". 2. **Dead-link reasons:** - **`/email/answer`** draws three states: *started*, *cancelled* ("Dana cancelled it: 'reason'") and *run out*. A token that verifies, for a live member, now gets a 200 whose `state` is `open`, `started` or `cancelled`. A bad or old token, a missing user or session, or a lapsed membership stays the single "run out" 404. POST refuses a started or cancelled session with a 409, so the page can flip to that state. - **`/email/stop`:** no change. The drawing's run-out state is captioned "Or was never a real one: the same words either way", and an HMAC can't tell a rotated secret from a tampered token anyway. 3. **The DM warning:** the bot already reports `closed` or `no_shared_server`, and `platform_links.dm_failed_reason` already stores it. So this is backend and frontend only: pick the drawn sentence by kind and expose `warning_kind`. There's no bot change and no contract bump.
Author
Collaborator

Done in #950 (merged 2026-09-30, green CI).

  • Answer page: it shows the drawn started, cancelled and run-out states. A started or cancelled session is a 409 on POST, and the page links into the session.
  • DM warning: it carries the drawn sentence for each kind (closed / no_shared_server), plus warning_kind and warning_at, and the grid's Discord DM header gets a warning icon.
  • Stop page: no change, as drawn.
  • Bot: no bot change and no contract bump.
  • Render check: 390×844 and 1440×900, in light and dark.
Done in #950 (merged 2026-09-30, green CI). - **Answer page:** it shows the drawn started, cancelled and run-out states. A started or cancelled session is a 409 on POST, and the page links into the session. - **DM warning:** it carries the drawn sentence for each kind (`closed` / `no_shared_server`), plus `warning_kind` and `warning_at`, and the grid's Discord DM header gets a warning icon. - **Stop page:** no change, as drawn. - **Bot:** no bot change and no contract bump. - **Render check:** 390×844 and 1440×900, in light and dark.
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#901
No description provided.