---
path: /studio/hathor/unified-validation-dashboard
surface: studio
domain: hathor
auth: signed-in + studio entitlement
source: apps/oshun/web/src/app/studio/hathor/unified-validation-dashboard/page.tsx
status: walked
last_walked: >-
  2026-06-29 standalone real-BFF route addendum — the dedicated Playwright spec
  now covers direct admin navigation, the real suite catalog GET, seeded and
  clean validation POSTs, client-only validation errors, live BFF 400 detail,
  pending submit disablement, non-admin fail-closed state, catalog loading/error
  state, route-map and quick-action affordances, 44px touch checks, shared axe,
  and anonymous redirect. Evidence:
  WALKTHROUGH/results/v1-real-infra-run-2026-06-22.md §229;
  apps/oshun/web/e2e/studio-hathor-unified-validation-dashboard.spec.ts.
  Embedded hub coverage remains recorded in §228 through
  apps/oshun/web/e2e/studio-hathor-validation.spec.ts. 2026-05-29 automated
  runtime walk evidence: WALKTHROUGH/results/runtime-sweep-2026-05-29.md; body
  re-derived 2026-06-03 from current source (lane-console architecture)
---

# Studio Hathor · Unified Validation Dashboard

## Purpose

Admin lane console that runs the full `@hathor/validation` suite — Timeline,
Causality, and Taxonomy — over a single worldbuilding payload (events + eras)
and reports each validator's verdict, an overall pass/fail, and the combined
error and warning totals. The operator's one-stop consistency gate before
release. Admin-scoped and fail-closed.

## Entry points

- **Direct URL / bookmark** — `/studio/hathor/unified-validation-dashboard`;
  `alternates.canonical` is set.
- **Quick-action from siblings** — the Lore Compilation lane links here; this
  page links to Lore Validation Contradictions.
- **Studio overview** — see
  [`../../studio-overview.md`](../../studio-overview.md).

## Layout regions

`page.tsx` renders inside `<ShellLayout active="studio">`:

- **Workspace** (`StudioHathorUnifiedValidationDashboardWorkspace`,
  `data-hathor-unified-validation-dashboard-workspace`):
  - `<h1>` `WorkspaceHeading` — "Hathor Unified Validation Dashboard Workspace"
  - Summary `<p data-hathor-unified-validation-dashboard-summary>`
  - The catalog state (`data-hathor-uvd-catalog`), then the events + eras form
    (`data-hathor-uvd-validate-form` with `data-hathor-uvd-form-state`), pending
    submit state, validation errors, and the verdicts result.
- **Route Map panel**
  (`<section data-hathor-unified-validation-dashboard-route-map>`,
  `data-hathor-uvd-route-count="5"`, `<h2>Route Map</h2>`): 5 entries from
  `STUDIO_HATHOR_UNIFIED_VALIDATION_DASHBOARD_ROUTE_MAP` (path + purpose).
- **Quick-action lane** (`<section data-hathor-uvd-quick-actions>`,
  `data-hathor-uvd-quick-action-count="2"`): Lore Validation Contradictions
  (`data-hathor-uvd-quick-action="lore-validation-contradictions"`), Back to
  Studio workspace index (`data-hathor-uvd-quick-action="studio-index"`).

## States

- [x] **Loading** — `<p data-hathor-uvd-loading>` "Loading validation suite…".
- [x] **Unauthorized** — `data-hathor-uvd-unauthorized` on 401/403
      (admin-scope).
- [x] **Error** — `data-hathor-uvd-error` on a non-OK catalog response or
      network failure.
- [x] **Ready (form)** — `data-hathor-uvd-catalog` plus
      `data-hathor-uvd-validate-form` with `data-hathor-uvd-form-state="idle"`,
      the events textarea, and the eras textarea.
- [x] **Pending submit** — `data-hathor-uvd-form-state="validating"` and
      `data-hathor-uvd-submit-state="validating"`; submit is disabled with
      `aria-disabled="true"` and `aria-busy="true"` until the BFF response
      returns.
- [x] **Result** — `data-hathor-uvd-result` with `data-hathor-uvd-overall`
      (consistent/inconsistent + total errors/warnings) and
      `data-hathor-uvd-verdicts` rows (`data-hathor-uvd-verdict-item` per
      validator).
- [x] **Validation error** — `data-hathor-uvd-validate-error` for malformed
      JSON, non-array inputs, empty inputs, or a failed POST.

## Interactions

- [x] **`data-hathor-uvd-events`** (textarea, `aria-label="events json"`) — the
      events JSON array (`{ id, name, year, causes?, effects? }`).
- [x] **`data-hathor-uvd-eras`** (textarea, `aria-label="eras json"`) — the eras
      JSON array (`{ id, name, type, parentEra? }`).
- [x] **`data-hathor-uvd-validate-submit`** ("Run validation suite") — parses
      both arrays, requires at least one entry, then POSTs `{ events, eras }`;
      on 200 with a valid `result` renders the per-validator verdicts and
      overall gate.
- [x] **Route Map entries** — verify against
      `STUDIO_HATHOR_UNIFIED_VALIDATION_DASHBOARD_ROUTE_MAP` (5 entries).
- [x] **Quick-action links** — Lore Validation Contradictions
      (`/studio/hathor/lore-validation-contradictions`), Back to Studio
      (`/studio`).

## Data & contracts

- **Reads**: `GET /v1/admin/hathor/unified-validation-dashboard` (catalog:
  `validators`), rendered as `data-hathor-uvd-catalog`.
- **Writes**: `POST /v1/admin/hathor/unified-validation-dashboard/validate` with
  `{ events, eras }`.
- **Realtime**: none.
- **Caching**: client fetch on mount, `cache: 'no-store'`,
  `buildBffAuthHeaders()`, `AbortController` on unmount.
- **Auth**: admin-scoped, fail-closed (401/403 → unauthorized); route is behind
  the signed-in + studio proxy gate.

## Cross-references

- Parent: [`../../studio-overview.md`](../../studio-overview.md)
- Component sources:
  - `apps/oshun/web/src/components/studio/StudioHathorUnifiedValidationDashboardWorkspace.tsx`
  - `apps/oshun/web/src/components/studio/StudioHathorUnifiedValidationDashboardRouteMap.ts`
- Per-validator siblings:
  [`./studio-hathor-lore-validation-timeline.md`](./studio-hathor-lore-validation-timeline.md),
  [`./studio-hathor-lore-validation-causality.md`](./studio-hathor-lore-validation-causality.md),
  [`./studio-hathor-lore-validation-taxonomy.md`](./studio-hathor-lore-validation-taxonomy.md),
  [`./studio-hathor-lore-validation-contradictions.md`](./studio-hathor-lore-validation-contradictions.md)

## E2E coverage

- [`apps/oshun/web/e2e/studio-hathor-unified-validation-dashboard.spec.ts`](../../../../apps/oshun/web/e2e/studio-hathor-unified-validation-dashboard.spec.ts)
  covers the standalone route against the real dev BFF: direct admin navigation,
  catalog GET with bearer forwarding, seeded inconsistent validation POST,
  edited clean validation POST, malformed JSON / non-array / empty zero-POST
  branches, live BFF 400 detail, catalog loading/error state, pending submit
  lockout, non-admin fail-closed state, route-map and quick-action affordances,
  44px checks for editable controls and quick-action links, anonymous
  redirect-before-render, and the shared axe gate.
- [`apps/oshun/web/e2e/studio-hathor-validation.spec.ts`](../../../../apps/oshun/web/e2e/studio-hathor-validation.spec.ts)
  covers this dashboard workspace while embedded in the parent validation hub:
  real BFF catalog GET, seeded inconsistent validation POST, edited clean
  payload POST, malformed JSON / non-array / empty zero-POST branches, pending
  submit lockout, catalog-error state, non-admin fail-closed state, automated
  44px check for the submit control, and the shared axe gate.

## Open questions / known gaps

- [ ] The suite runs Timeline + Causality + Taxonomy but not Contradictions;
      confirm whether the contradictions validator should join this combined
      gate.
- [x] Hathor is confirmed in V1 per `WALKTHROUGH/matrix/routes.csv` and
      `WALKTHROUGH/matrix/coverage.md` (product-owner confirmation recorded
      2026-05-29 for Bellona / Hathor / Neith).
- [ ] Manual screen-reader pass remains for the live browser surface; automated
      axe and touch-target coverage now pass for the standalone route, and
      embedded workspace coverage remains green through the validation hub.
