Build lane 9: Admin (ADMIN-1 to ADMIN-15) #735

Closed
opened 2026-09-22 00:12:26 +00:00 by claude-bot · 7 comments
Collaborator

Build lane 9 of the v4.5.0 redesign. The brief is docs/design/v4.5.0-brief.md (§9, the lanes in order); the build plan is docs/design/v4.5.0-build-plan.md (the rollout rule, the design-system mapping, the journeys as tests). Umbrella: #366. Goes after lane 8.

Scope

Surfaces: ADMIN-1 to ADMIN-15: the server's users, campaigns, AI models, bot settings, content packs, backups, audit, plans & entitlements, About this server.
The drawing: /feedback/prototype/lane7 — the page the build must match, still by still.
Decisions: the brief §7, and each surface's header in redesign-surfaces/sources/headers.md.

Server changes it needs (in this lane or an earlier one)

  • the server owner (IS-397, D68); About this server (ADMIN-15); Campaigns (#437's screen); prices as instance settings (IS-398, D71)
  • the bot identity check and the removal of the fallback webhook (D67); backups' media volume (IS-396); audit filters by name

Acceptance

  • Every placement coverage/lane7.py classifies as drawn or replaced is built as the prototype draws it; the script is the checklist. Rows it marks behaviour are tested, not drawn.
  • J1 (the parts of first-run setup that are Admin's) pass on desktop, on a phone and keyboard-only in the journeys suite (#726), with the axe scan clean (WCAG 2.2 AA, #367).
  • The brief's vocabulary (§5) throughout, from vocabulary.js; no page-level error destroys rendered content; every async operation shows progress and a next action on failure; disabled controls say why.
  • Main stays deployable after every PR of the lane: the new shell carries the old pages until each is replaced (the rollout rule).
  • The surfaces' headers in redesign-surfaces/sources/headers.md (Decided lines and the owner's review notes) are honoured; a departure is a decision change on #659 first.

🤖 Generated with Claude Code

**Build lane 9 of the v4.5.0 redesign.** The brief is `docs/design/v4.5.0-brief.md` (§9, the lanes in order); the build plan is `docs/design/v4.5.0-build-plan.md` (the rollout rule, the design-system mapping, the journeys as tests). Umbrella: #366. Goes after lane 8. ## Scope **Surfaces:** ADMIN-1 to ADMIN-15: the server's users, campaigns, AI models, bot settings, content packs, backups, audit, plans & entitlements, About this server. **The drawing:** `/feedback/prototype/lane7` — the page the build must match, still by still. **Decisions:** the brief §7, and each surface's header in `redesign-surfaces/sources/headers.md`. ## Server changes it needs (in this lane or an earlier one) - the server owner (`IS-397`, D68); About this server (ADMIN-15); Campaigns (#437's screen); prices as instance settings (`IS-398`, D71) - the bot identity check and the removal of the fallback webhook (D67); backups' media volume (`IS-396`); audit filters by name ## Acceptance - [ ] Every placement `coverage/lane7.py` classifies as **drawn** or **replaced** is built as the prototype draws it; the script is the checklist. Rows it marks **behaviour** are tested, not drawn. - [ ] J1 (the parts of first-run setup that are Admin's) pass on desktop, on a phone and keyboard-only in the journeys suite (#726), with the axe scan clean (WCAG 2.2 AA, #367). - [ ] The brief's vocabulary (§5) throughout, from `vocabulary.js`; no page-level error destroys rendered content; every async operation shows progress and a next action on failure; disabled controls say why. - [ ] Main stays deployable after every PR of the lane: the new shell carries the old pages until each is replaced (the rollout rule). - [ ] The surfaces' headers in `redesign-surfaces/sources/headers.md` (Decided lines and the owner's review notes) are honoured; a departure is a decision change on #659 first. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Author
Collaborator

Inherited: backup credential hygiene and the audio archive's path, #795

Owner, 2026-09-24: this lane builds it, server change first, since this lane rebuilds the admin backups surface anyway.

  • Off-site credentials become write-only, like the per-campaign AI keys, instead of going back to the admin's browser.
  • Redaction scrubs known secret values, so it no longer depends on rclone repeating the remote verbatim.
  • The backup row records where the audio archive went.

Details are in #795. The read-back and the two worse bugs (fresh dumps deleted by retention, credentials leaking through redaction) were already fixed in #790.

🤖 Generated with Claude Code

## Inherited: backup credential hygiene and the audio archive's path, #795 **Owner, 2026-09-24: this lane builds it**, server change first, since this lane rebuilds the admin backups surface anyway. - Off-site credentials become **write-only**, like the per-campaign AI keys, instead of going back to the admin's browser. - Redaction scrubs **known secret values**, so it no longer depends on rclone repeating the remote verbatim. - The backup row records **where the audio archive went**. Details are in #795. The read-back and the two worse bugs (fresh dumps deleted by retention, credentials leaking through redaction) were already fixed in #790. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Author
Collaborator

A note for when this lane starts (2026-09-26). The legacy Admin page fails WCAG 2.2 AA contrast. Its Tailwind action links are the problem: text-red-500 on #f9fafb is 3.64:1, and text-indigo-400 is 2.99:1. J1 now scans only the setup banner on Admin, to keep the journeys green (#823). Once the rebuilt Admin lands, J1's axe({ include: '[role="alert"]' }) in the finished-setup branch should go back to scanning the whole page.

Also found by the D110 render sweep: Admin's tab bar overflows sideways by 101px at 1024 wide and by 499px at 390.

**A note for when this lane starts (2026-09-26).** The legacy Admin page fails WCAG 2.2 AA contrast. Its Tailwind action links are the problem: `text-red-500` on `#f9fafb` is 3.64:1, and `text-indigo-400` is 2.99:1. J1 now scans only the setup banner on Admin, to keep the journeys green (#823). Once the rebuilt Admin lands, J1's `axe({ include: '[role="alert"]' })` in the finished-setup branch should go back to scanning the whole page. Also found by the D110 render sweep: Admin's tab bar overflows sideways by 101px at 1024 wide and by 499px at 390.
Author
Collaborator

Picking up lane 9's server slices that don't wait on A1–A11 (2026-09-26):

  • B1 (build/lane9-b1-d67-identity):
    • removes D67's instance webhook fallbacks: the stored fallback, the DEFAULT_DISCORD_WEBHOOK_URL env var and the admin test-notify;
    • adds the bot's authenticated GET /identity and GET /api/admin/settings/bot/identity, so "Connected" proves the bot has this server's key (headline 3).
    • The Admin token field is left alone until A2 is answered.
  • C (build/lane9-c-backups-audit):
    • #795 (1)–(3): write-only off-site credentials, redaction by known values, and the audio archive path, in migration a2c4e6f8b0d1;
    • the missing audit events (headline 10).
    • Uploaded images in the backup wait for A6.

Both merge on green. Pages 4a–4d, server PR A (owner/D68) and A1's retention wait for the owner's answers.

**Picking up lane 9's server slices that don't wait on A1–A11 (2026-09-26):** - **B1** (`build/lane9-b1-d67-identity`): - removes D67's instance webhook fallbacks: the stored fallback, the `DEFAULT_DISCORD_WEBHOOK_URL` env var and the admin test-notify; - adds the bot's authenticated `GET /identity` and `GET /api/admin/settings/bot/identity`, so "Connected" proves the bot has this server's key (headline 3). - The Admin token field is left alone until A2 is answered. - **C** (`build/lane9-c-backups-audit`): - #795 (1)–(3): write-only off-site credentials, redaction by known values, and the audio archive path, in migration `a2c4e6f8b0d1`; - the missing audit events (headline 10). - Uploaded images in the backup wait for A6. Both merge on green. Pages 4a–4d, server PR A (owner/D68) and A1's retention wait for the owner's answers.
Author
Collaborator

Merged 2026-09-26:

  • #848, slice C: #795's three items, plus the eight missing audit events.
  • #849, slice B1: D67's fallbacks removed; the bot's /identity and GET /api/admin/settings/bot/identity.

Main's alembic head is now c4e6a8b0d2f1, via e5f7 → a2c4e6f8b0d1 → c4e6a8b0d2f1.

Still waiting on the owner:

  • server PR A: the owner and offers (A3/A4), plus About, overview and the audit name filters;
  • the rest of B: A1's retention semantics, A2's token, A10's typed Tests, and A7's prices;
  • C's media archive (A6);
  • pages 4a–4d, J1's Admin leg and the seed (A8).
**Merged 2026-09-26:** - **#848, slice C:** #795's three items, plus the eight missing audit events. - **#849, slice B1:** D67's fallbacks removed; the bot's `/identity` and `GET /api/admin/settings/bot/identity`. Main's alembic head is now `c4e6a8b0d2f1`, via `e5f7 → a2c4e6f8b0d1 → c4e6a8b0d2f1`. **Still waiting on the owner:** - server PR A: the owner and offers (A3/A4), plus About, overview and the audit name filters; - the rest of B: A1's retention semantics, A2's token, A10's typed Tests, and A7's prices; - C's media archive (A6); - pages 4a–4d, J1's Admin leg and the seed (A8).
Author
Collaborator

Picking up lane 9 PR 5, J1's Admin leg (2026-09-29), on branch build/lane9-5-j1-admin. It covers:

  • the /admin/* addresses, with the ?tab=backup redirect kept as a contract;
  • the leftovers list and the Backup leg (saved on desktop, conditional on phone and keyboard);
  • full axe scans instead of the alert-only scan;
  • the keyboard route through Contents;
  • phone overflow;
  • IS-377's non-admin page.
Picking up **lane 9 PR 5, J1's Admin leg** (2026-09-29), on branch `build/lane9-5-j1-admin`. It covers: - the `/admin/*` addresses, with the `?tab=backup` redirect kept as a contract; - the leftovers list and the Backup leg (saved on desktop, conditional on phone and keyboard); - full axe scans instead of the alert-only scan; - the keyboard route through Contents; - phone overflow; - IS-377's non-admin page.
Author
Collaborator

Lane 9 PR 5, J1's Admin leg, merged as #944 (2026-09-29, green CI).

  • J1 now walks Admin's part in all three projects:
    • the leftovers list, from GET /api/setup/state's skipped;
    • Backup settled (a click on desktop, Enter on keyboard);
    • the leftover gone afterwards;
    • the phone's back link and no sideways scroll;
    • full axe scans;
    • IS-377's non-admin stop.
  • App fix: the first person to sign in to a new server is now its owner as well as its administrator (D68). Before, only the migration's backfill did this, for servers that already existed.

This was the last PR in lane 9's series: server slices B1/C (#848, #849), pages 4a–4d (#873, #881, #886), the seed (#889) and J1 (#944). The build is complete. I'm leaving this open for the owner's review of the lane, as with lane 1's #727.

**Lane 9 PR 5, J1's Admin leg, merged as #944 (2026-09-29, green CI).** - J1 now walks Admin's part in all three projects: - the leftovers list, from `GET /api/setup/state`'s `skipped`; - Backup settled (a click on desktop, Enter on keyboard); - the leftover gone afterwards; - the phone's back link and no sideways scroll; - full axe scans; - IS-377's non-admin stop. - **App fix:** the first person to sign in to a *new* server is now its owner as well as its administrator (D68). Before, only the migration's backfill did this, for servers that already existed. **This was the last PR in lane 9's series:** server slices B1/C (#848, #849), pages 4a–4d (#873, #881, #886), the seed (#889) and J1 (#944). The build is complete. I'm leaving this open for the owner's review of the lane, as with lane 1's #727.
Author
Collaborator

Closing with the v4.5.0 milestone (owner, 17 Oct 2026). The owner signed this lane off on 5 Oct, and it shipped in 4.5.0 on 12 Oct; fixes found on prod since went into 4.5.1 to 4.5.3.

Closing with the v4.5.0 milestone (owner, 17 Oct 2026). The owner signed this lane off on 5 Oct, and it shipped in 4.5.0 on 12 Oct; fixes found on prod since went into 4.5.1 to 4.5.3.
Sign in to join this conversation.
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#735
No description provided.