feat(admin): cockpit quick wins, six admin portal fixes (R5 G1 E3 R2 G3 C1) #101

Merged
alee merged 6 commits from feat/cockpit-quick-wins into main 2026-09-26 07:09:47 +00:00

6 Commits

Author SHA1 Message Date
adlee-was-taken
2e9d086808 feat(admin): one knob table merges runtime and persisted state 2026-09-26 03:03:30 -04:00
adlee-was-taken
7347629529 fix(admin): warning dismissals key on digit-normalized text and severity 2026-09-26 03:03:30 -04:00
adlee-was-taken
515fcf5fce fix(admin): decisions tile reports route decisions and client outcomes
Backend:
- metrics.decision_outcome_summary(conn, since_days=7): route_decisions
  count in 7d window + verifications kind='client_outcome' counts
  (total / succeeded / failed), parameterized like verdict_mix.
- admin_snapshot exposes it as "decision_outcomes" (zeros on empty DB).

Frontend (renderBoard Decisions tile):
- One guarded local `dout` (|| defaults) so a stale tab without the
  snapshot key cannot throw and blank the board.
- Headline = decisions in 7 days; qualifier "routed in 7 days".
- Client-outcome line when client_reports > 0:
  "<n> client reports (P%): <ok> ok, <failed> failed" where P is
  guarded against decisions===0 (percent omitted, counts kept) and the
  failed count gets the warn colour when failed/reports > 0.10
  (matching the Signal card's >10% threshold), guarded against
  client_reports===0.
- "no client reports in 7 days" when client_reports===0.
- The word "verified" no longer appears in the tile; renderLive keeps
  verdict_mix untouched.

Tests: unit tests for the summary (window exclusions, client_outcome
scoping, structural verdicts excluded), exhaustive snapshot key +
zeros assertion, top-level key list, and static renderBoard/renderLive
regex locks. Append-only.
2026-09-26 03:03:30 -04:00
adlee-was-taken
f92387a369 feat(admin): decisions filters read and write the URL 2026-09-26 03:03:06 -04:00
adlee-was-taken
b196333656 refactor(admin): render nav links from navbar.js instead of eight copies 2026-09-26 03:03:06 -04:00
adlee-was-taken
ae1fcced51 fix(admin): classifier card renders a loading state until config loads 2026-09-26 03:03:06 -04:00