From c2bbe3319fae67b61202fac78871b167223c9aa0 Mon Sep 17 00:00:00 2001 From: Dave Date: Mon, 21 Sep 2026 12:58:56 +0200 Subject: [PATCH] docs(phase-9): tighten picker description, swap owner labels MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Spec changes from feedback: 1. §5.1 — the picker description was written as if the user could see the rendered HTML. Replaced with an ASCII sketch and a stronger 'no internal concepts reach the rendered surface' line. 2. §7 — added a binding label-mapping table for every owner-facing term. The internal names stay (in the DB, in code, in the spec); only rendered text changes. Soft-language variants: intake_links -> 'Request link' Mint a link -> 'New request link' Per-link daily cap -> 'Daily cap' Revoke -> 'Pause' Re-activate -> 'Resume' show_in_intake -> 'List on request page' --- ...-intake-links-and-project-picker-design.md | 55 +++++++++++++++---- 1 file changed, 44 insertions(+), 11 deletions(-) diff --git a/docs/superpowers/specs/2026-09-21-phase-9-per-client-intake-links-and-project-picker-design.md b/docs/superpowers/specs/2026-09-21-phase-9-per-client-intake-links-and-project-picker-design.md index 20e86fe..3e35d12 100644 --- a/docs/superpowers/specs/2026-09-21-phase-9-per-client-intake-links-and-project-picker-design.md +++ b/docs/superpowers/specs/2026-09-21-phase-9-per-client-intake-links-and-project-picker-design.md @@ -237,7 +237,25 @@ as Phase 8 — it does not care whether the row carries `project` or `client`). On unknown/revoked/expired, **404 with the same wording as the wizard** so a hostile body cannot probe. -On success, renders a project picker: +On success, renders a project picker. The user's experience is +intentionally minimal — they see plain project names, click one, and +the wizard starts. No mention of phases, tokens, or any other internal +concept ever reaches the rendered HTML. A rough sketch: + +``` +┌─────────────────────────────────────────────┐ +│ Acme — let's talk │ +│ │ +│ Tell us which project you have a question │ +│ about: │ +│ │ +│ ▸ Acme Site Redesign │ +│ ▸ Acme POS │ +│ ▸ Acme Rebrand │ +└─────────────────────────────────────────────┘ +``` + +Mechanics: - Reads every project on the link's client with `active = true AND show_in_intake = true`. @@ -325,24 +343,38 @@ with both tokens and project ids on the wire. ## 7. Owner UI +The owner-facing surface uses natural-language labels. Internal names +(`intake_links`, `show_in_intake`) live in the database, in the code, +and in this spec — never in the rendered HTML. The mapping below is +binding for every button, header, and tooltip in Phase 9. + +| Internal code name | Owner-facing label | +|---|---| +| `intake_links` row | **Request link** | +| "Mint a link" button | **New request link** | +| "Per-link daily cap" | **Daily cap** | +| "Revoke" | **Pause** | +| "Re-activate" | **Resume** | +| `projects.show_in_intake` toggle | **List on request page** | +| "Per-project intake count" | "Submissions today" | + ### 7.1 Client admin page (new) -`/admin/clients/[clientId]` currently exists? (No — Phase 8 only added -links at the project level.) Phase 9 adds: +`/admin/clients/[clientId]` did not exist before Phase 9 — Phase 8 only +added request links at the project level. Phase 9 adds: - A new route `/admin/clients/[clientId]` (server component, owner-only via the existing admin layout). - Reads the client plus the active projects on it (the owner's view of what's deployable for intake purposes). - Renders three panels stacked: - 1. **Public intake links** — the same `` from + 1. **Request links** — the same `` shape from Phase 8, but now `link.project` is always empty on new rows. - Mint / rotate / revoke / per-link daily cap. + New request link / rotate / pause / resume / daily cap. 2. **Projects** — a list of the client's projects with a small - `` next to each (one toggle calls one new - Server Action per project). Disabled + active styled. Toggling - `show_in_intake` is two clicks, not three. - 3. *(Future)* a "client URL" badge — a copyable URL of the form + `` (rendered as "List on request page") next + to each. One toggle calls one new Server Action per project. + 3. *(Future)* a "Client URL" badge — a copyable URL of the form `https:///intake/` — landed on the page when at least one active link and at least one opted-in project exist. @@ -355,10 +387,11 @@ needed here. - A new `` rendered in the existing admin page, just above the - ``. It calls a new Server Action + ``. The toggle is labelled "List on request page" + in the rendered UI. It calls a new Server Action `setProjectShowInIntakeAction({ projectId, show })`. Owner-only. -The Public-intake-links section on the project page stays (Phase 8 +The "Request links" section on the project page stays (Phase 8 shape: a per-project link can still be minted). It just becomes the "legacy / experimental" path; the new client-level link is the default.