---
path: /studio/hathor/workbench-timeline
surface: studio
domain: hathor
auth: signed-in + studio entitlement
source: apps/oshun/web/src/app/studio/hathor/workbench-timeline/page.tsx
status: walked
last_walked: |
  2026-06-29 standalone real-BFF route addendum: the dedicated Playwright spec now covers direct admin navigation, real scene-order catalog GET, seeded blocking story-order/causal integrity verdict, edited clean export-ready packet, warning-only uncovered world-state tag, client-only JSON rejection, live BFF 400 detail, catalog loading/error state, pending submit disablement, non-admin fail-closed 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 §232; apps/oshun/web/e2e/studio-hathor-workbench-timeline.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 · Workbench Timeline

## Purpose

Admin lane console for the real `@hathor/timeline` scene-order packet validator.
Submit a story-vs-shoot scene order and check its integrity — every required
scene present, each scene's story order matching its chronological rank, causal
prerequisites preceding their dependents, required world-state tags covered, and
CGI export metadata present. Blocking issues fail the packet; an uncovered tag
is a warning. Admin-scoped and fail-closed.

## Entry points

- **Quick-action link from `/studio/hathor/workbench-locations`** (this page
  links out to workbench-locations)
- **Aggregator embed**: `StudioHathorWorkbenchWorkspace` mounts this workspace
  inline as its "Workbench Timeline Lane"
- **Direct URL / bookmark** — yes; `alternates.canonical` set
- **Studio overview** — see
  [`../../studio-overview.md`](../../studio-overview.md)

## Layout regions

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

- **Workspace** `<section data-hathor-workbench-timeline-workspace>`:
  - `<h1>` (WorkspaceHeading) "Hathor Workbench Timeline Workspace"
  - Summary `<p data-hathor-workbench-timeline-summary>`
  - Catalog evidence (`data-hathor-wbt-catalog`) and the validate form lane:
    `data-hathor-wbt-validate-form`
- **Route Map panel** (`data-hathor-workbench-timeline-route-map`,
  `data-hathor-wbt-route-count="5"`): `<h2>` "Route Map" + 5 entries from
  `STUDIO_HATHOR_WORKBENCH_TIMELINE_ROUTE_MAP`
- **Quick-action lane** (`data-hathor-wbt-quick-actions`,
  `data-hathor-wbt-quick-action-count="2"`): Workbench Locations
  (`data-hathor-wbt-quick-action="workbench-locations"`), Back to Studio
  workspace index (`data-hathor-wbt-quick-action="studio-index"`)

## States

- [x] **Loading** — `<p data-hathor-wbt-loading>`
- [x] **Unauthorized** — `data-hathor-wbt-unauthorized` on 401/403 (admin Hathor
      scope required); fail-closed
- [x] **Error** — `data-hathor-wbt-error` on non-OK GET / malformed catalog
- [x] **Ready (form)** — `data-hathor-wbt-validate-form` once the catalog loads,
      with `data-hathor-wbt-catalog`
- [x] **Pending submit** — `data-hathor-wbt-submit-state="pending"`; submit is
      disabled with `aria-disabled="true"` and `aria-busy="true"` until the BFF
      response returns
- [x] **Result** — `data-hathor-wbt-result` after a 200 validate, with
      `data-hathor-wbt-valid` / `data-hathor-wbt-counts` and a
      `data-hathor-wbt-issues` list of `data-hathor-wbt-issue-item`, or
      `data-hathor-wbt-clean`; `data-hathor-wbt-validate-error` for invalid JSON
      / non-200

## Interactions

### Workspace body (validate form lane)

- [x] **Scene-order packet (JSON)** — `<textarea data-hathor-wbt-packet>`
      (aria-label "packet json")
- [x] **Validate scene order** —
      `<button data-hathor-wbt-validate-submit type="submit">` → POST
      `/v1/admin/hathor/workbench-timeline/validate`
- [x] **Result** — `data-hathor-wbt-valid`, `data-hathor-wbt-counts`, the issue
      list (`data-hathor-wbt-issues` → `data-hathor-wbt-issue-item`), or
      `data-hathor-wbt-clean`

### Route Map panel

- [x] **5 route entries** — verify match with
      `STUDIO_HATHOR_WORKBENCH_TIMELINE_ROUTE_MAP`

### Quick-action lane

- [x] **"Open Hathor Workbench Locations workspace"** (→
      `/studio/hathor/workbench-locations`)
- [x] **"Back to Studio workspace index"** (→ `/studio`)

## Data & contracts

- **Reads**: GET `/v1/admin/hathor/workbench-timeline` on mount
- **Writes**: POST `/v1/admin/hathor/workbench-timeline/validate`
- **Realtime**: none
- **Caching**: client `fetch` on mount, `cache: 'no-store'`;
  `buildBffAuthHeaders`
- **Auth/role check**: admin-scoped fail-closed (401/403); behind the signed-in
  and studio proxy gate

## Cross-references

- Parent: [`../../studio-overview.md`](../../studio-overview.md)
- Shell:
  [`../../../shell/04-auth-session.md`](../../../shell/04-auth-session.md)
- Sibling routes: [`./studio-hathor-workbench.md`](./studio-hathor-workbench.md)
  (aggregator that embeds this workspace),
  [`./studio-hathor-timeline-modeling.md`](./studio-hathor-timeline-modeling.md)
  (same `workbench-timeline` validator endpoint)
- Component sources:
  - `apps/oshun/web/src/components/studio/StudioHathorWorkbenchTimelineWorkspace.tsx`
  - `apps/oshun/web/src/components/studio/StudioHathorWorkbenchTimelineRouteMap.ts`

## E2E coverage

- [`apps/oshun/web/e2e/studio-hathor-workbench-timeline.spec.ts`](../../../../apps/oshun/web/e2e/studio-hathor-workbench-timeline.spec.ts)
  covers the standalone route against the real dev BFF: direct admin navigation,
  catalog GET with bearer forwarding, seeded blocking story-order and causal
  dependency verdict, edited clean export-ready packet, warning-only uncovered
  world-state tag, malformed JSON and primitive JSON zero-POST rejection, 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 the
  editor, submit control, and quick-action links, anonymous
  redirect-before-render, and the shared axe gate.

## Open questions / known gaps

- [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).
- [ ] This route and `timeline-modeling` both wire the same `workbench-timeline`
      validator endpoint; confirm whether the duplication is intentional or the
      two routes should converge.
- [ ] Route Map advertises `catalog/`, `events/`, `revisions/`, and
      `governance/` sub-routes with no `page.tsx` yet.
- [ ] Manual screen-reader pass remains for the live browser surface; automated
      axe and touch-target coverage now pass for the standalone route.
