Phase 6b — Admin panel UX¶
Status: Closed 2026-06-11 (opened 2026-06-09 via the Phase 6 mid-review split). Predecessor: Phase 6a — Backbone admin/ops + ingest (closed 2026-06-09). Successor: Phase 7 — Extensibility + reports (next, planned). Origin: created by splitting the original Phase 6 per mid-review-phase-6.md Option 2. The backbone/ops half shipped and closed as 6a; this phase owned the UI-bearing and cross-stack work that never started.
Closeout note (2026-06-11). All items below shipped across both repos. A
/build-chainrun had merged the 6b backbone + UI PRs branch-to-branch without ever landing them onmain(and so without CI gating); the work was recovered ontomainvia salvage PRs #346 + #348 (backbone) and climate-lama-ui#62 (UI), the colliding Alembic migration was renumbered (0049→0052), and the SDK smoke was fixed to build images from PR source (#352). Both repos'mainCI is green.
Why this phase exists¶
The original Phase 6 front-loaded 14 work items. The build pipeline shipped the 6 that were single-repo, well-specified, and backbone-only (6.6, 6.7, 6.9, 6.11, 6.13, 6.14). The 8 UI-bearing / cross-stack items — the actual thematic anchor of the phase ("an admin panel a self-hoster can operate without shell access") — never began. The mid-review caught this as the framework's "front-loaded planning + back-loaded review" anti-pattern and recommended the split. This phase is the corrective.
Item zero — role model (#271) — DECIDED 2026-06-09¶
#271 "rethink the role model — who is 'admin'?" was the hard blocker for the admin-shell work. Decision: option (a-lite) — flag + rename:
- Rename
User.roleenum valueadmin→org_admin(authority bounded to own org: org users, branding, defaults, API keys). - Add boolean
users.is_platform_adminfor platform-maintainer / cross-org operations. Role enum stays three values:viewer | analyst | org_admin.
Rationale: one Alembic migration, no five-role taxonomy threaded through every
guard, clean customer-vs-platform separation; forward-compatible with promoting
a full staff/superadmin taxonomy later if needed.
Implemented by #325 (6b.0 — role-model migration), the head of the backbone chain. The adjacent Settings discussions #270 and #269 can be resolved alongside the admin shell.
Scope — all delivered¶
Every item shipped across both repos. Backbone issues are in climate-lama;
UI issues (ui#) in climate-lama-ui.
| Item | Tracking issue | Backbone | UI | Status |
|---|---|---|---|---|
| 6b.0 | #325 Role-model migration | #325/#327 | — | ✅ done |
| 6b.1 | #316 Admin panel shell | (#325 gate) | ui#45 | ✅ done |
| 6b.2 | #317 Users + orgs management | #340 | ui#56 | ✅ done |
| 6b.3 | #318 Datasets surface | #338 | ui#49 | ✅ done |
| 6b.4 | #319 Audit log | #334 | ui#52 | ✅ done |
| 6b.5 | #320 Catalog admin curation | #339 | ui#53 | ✅ done |
| 6b.8 | #321 External dataset polling | #336 + #342 (API) + #343 (pipeline) | ui#55 | ✅ done |
| 6b.10 | #322 In-app notifications | #335 | ui#50 | ✅ done |
| 6b.12 | #323 Measures catalog UX | #333 | ui#44 | ✅ done |
| — | Ingest-chord watchdog (#326) | #337 | — | ✅ done |
Full acceptance criteria for each item live in the issue body (copied from the original phase-6-admin-ops.md §Scope 6.1–6.12).
Sequencing (see mid-review chaining analysis)¶
Two independent tracks, parallelizable:
- Track A — backbone-first, no #271 dependency: 6b.4 backbone → 6b.10 backbone → 6b.8 backbone → 6b.3 backbone → 6b.5 backbone. These are single-repo, well-specified, and unblocked; they stack cleanly.
- Track B — admin-panel UI, gated on #271: resolve #271 → 6b.1 shell → 6b.2 / 6b.4-UI / 6b.5-UI / 6b.8-UI tabs hang off the shell. Do not start before #271 closes.
- Standalone: 6b.12 (measures UX) and 6b.3-UI / 6b.10-UI touch their own routes and can land any time their backbone half exists.
Carried-over follow-ups (not part of 6b scope; backlog)¶
Surfaced by the mid-review; tracked independently of the closed 6b work:
- #310 — CLOSED. SDK smoke fixed (auth + seed); smoke now builds API/worker from PR source (#352).
- #291 — open. Result-cache beat process not deployed in any compose profile (6a debt).
- #287 — open. Release pipeline follow-up (smoke, arm64, signing, SBOM, Helm) (6a debt).
- #285 — open. Pick hosted secrets backend, ADR-034 follow-up (6a debt).
- #273 — open. Onboarding "Try the demo →" CTA (Phase 5 carryover).
- #270 / #269 — open. Settings Organization / My-preferences tab discussions.
Exit criteria — met (code), with one live-walk verification outstanding¶
- ✅ #271 resolved (flag + rename); admin panel ships users, orgs, datasets, ingest jobs/review, audit log, catalog curation, notifications — no shell access needed for common ops.
- ✅ Admin-panel bundle lazy-loaded (Vite admin chunk; verified in ui#45).
- ✅ Admin-gating side-check is now real (RBAC gate + 403 page; covered by
AdminPanel.test.tsx). - ✅ Both repos'
mainCI green (backbone CI + SDK smoke; UI CI + E2E smoke). - ⏳ Outstanding (live verification, not code): a manual
docker compose --profile fullstack upwalk of the admin panes against a running backbone, and the 3-dataset catalog → ingest → appear-in-catalog round-trip. The pieces are merged and unit/integration-tested, but the full end-to-end walk against live services has not been performed since both halves landed onmain. Recommended as the Phase 6b closeout check before Phase 7.