Skip to content

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-chain run had merged the 6b backbone + UI PRs branch-to-branch without ever landing them on main (and so without CI gating); the work was recovered onto main via 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' main CI 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.role enum value adminorg_admin (authority bounded to own org: org users, branding, defaults, API keys).
  • Add boolean users.is_platform_admin for 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:

  • #310CLOSED. 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' main CI green (backbone CI + SDK smoke; UI CI + E2E smoke).
  • Outstanding (live verification, not code): a manual docker compose --profile fullstack up walk 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 on main. Recommended as the Phase 6b closeout check before Phase 7.