# Phase 10: Admin Role & Settings - Discussion Log > **Audit trail only.** Do not use as input to planning, research, or execution agents. > Decisions are captured in CONTEXT.md — this log preserves the alternatives considered. **Date:** 2026-06-12 **Phase:** 10-admin-role-settings **Areas discussed:** Admin bootstrap, Admin UI entry, App-password/credential scope, Shared-calendar designation, Provider scope, Credential ownership --- ## Admin bootstrap | Option | Description | Selected | |--------|-------------|----------| | Env-pinned OIDC sub | `ADMIN_OIDC_SUB` marks operator identity as admin | | | First-login-wins | First user to log in is auto-admin | ✓ | | Everyone admin for now | Flag all members admin, defer gating | | | Manual DB seed | Keep setting `is_admin` by hand | | **User's choice:** First-login-wins **Notes:** Chosen because Phase 12's setup wizard precedes it — the first login *after setup completes* becomes admin. Must stay member-count-agnostic. --- ## Admin UI entry | Option | Description | Selected | |--------|-------------|----------| | Extend SettingsSheet | Add an Admin section to the existing avatar sheet | | | New /admin route | Dedicated gated route, redirect non-admins | ✓ | | Settings route + sheet stays | Separate gated /admin, keep notifications sheet | | **User's choice:** New /admin route **Notes:** Existing notifications `SettingsSheet` stays; `/admin` gives Phase 12's wizard room on the same surface. --- ## App-password / credential scope | Option | Description | Selected | |--------|-------------|----------| | Per-member rows, admin edits any | Per-user credentials, admin rotates any | (see provider redirect) | | Per-member, self-only + admin override | Members manage own; admin overrides | | | Single shared credential | One household credential | | **User's choice:** Redirected — "treat Fastmail like a provider; design generically enough to plug in Gmail/other providers later." Resolved in the Provider-scope and Credential-ownership follow-ups below. **Notes:** Ties into backlog 999.1 (treat-fastmail-as-a-provider). --- ## Shared-calendar designation | Option | Description | Selected | |--------|-------------|----------| | Exclusive single-select | Pick exactly one shared calendar; clears prior | ✓ | | Multi-select toggles | Mark multiple calendars shared | | **User's choice:** Exclusive single-select **Notes:** Matches the "one shared family calendar" core value. --- ## Provider scope (follow-up) | Option | Description | Selected | |--------|-------------|----------| | Generic shape, Fastmail-only impl | Add provider field + generic UI; implement only Fastmail/CalDAV | ✓ | | Fastmail-only, refactor later | Narrow build now, full refactor in 999.1 | | | Full provider abstraction now | Build pluggable layer + 2nd provider | | **User's choice:** Generic shape, Fastmail-only impl **Notes:** Gmail/others = wiring left for backlog 999.1. Keeps Phase 10 shippable without scope creep. --- ## Credential ownership (follow-up) | Option | Description | Selected | |--------|-------------|----------| | Per-member provider credential | Per-user rows + provider field, N-member ready | ✓ | | Household-level credential | One record for the household | | **User's choice:** Per-member provider credential **Notes:** Today both rows hold the same shared Fastmail account (D-16) but model stays N-member/N-provider ready; admin can rotate any member's. --- ## Claude's Discretion - Migration packaging — ship the full v1.1 bundle (`is_admin`, `app_config`, `reminder_lead_minutes`) in one Phase-10 migration (generate+migrate, not push). - `app_config` table shape — create with at least `setup_complete`; add keys as needed. - `/api/admin/*` route layout and the `requireAdmin` server middleware shape. - How the dev-bypass user (id 1) acquires `is_admin` for local verification. ## Deferred Ideas - Full multi-provider support (Gmail/other) — backlog 999.1. - Self-service credential onboarding — backlog 999.5. - Admin audit log / health dashboard / user CRUD — out of scope (REQUIREMENTS.md). - Multiple reminders per event — v1.2 stretch.