Audit event opens as pane
## Original requirement (verbatim, epic body)
> "Break long pages into subtabs across the entire system."
> "Important and first hand stuff needs to be on the first page(s), then less important, logs, runs, etc"
Operator decision D7: "Replace side panels with tabbed forms - same as tasks".
## Scope (Architecture K8: C3 row 3)
- New route `/audit/events/:eventId`, registered in `lib/listDetail.ts` with `list: '/audit'`, guarded exactly as `/audit` (`RequireFeature anyOf={['audit:view', …]}` in `App.tsx`).
- New `pages/audit/AuditEventPage.tsx` on `DetailPage`. Tabs (`idPrefix="audit-event"`): `event` Event · `request` Request · `subject` Subject · `payload` Payload — tabs with no data are filtered out (one surviving → no strip). Section bodies move from `pages/audit/AuditDrawer.tsx` unchanged; DELETE `AuditDrawer.tsx`.
- Opened from `pages/audit/UsersTab.tsx` rows (~133/502) via `navigate(path, { state: { row } })` — a list page, so no `from`.
- Data: `getAuditEvent(eventId)` (from the GET-routes child) via `useQuery`; seeded from `state.row` → `initialData`.
### Pinned tab pattern (C1)
Header above strip; one surviving tab → no strip; all panels mounted; first tab = bare URL via `useUrlTab`; one-word labels; full labels at 390 px.
## Acceptance criteria (verbatim, PRD R4 — audit)
- **AC4.1** AuditDrawer stops opening as an overlay drawer. It opens as an addressable editor in the list/detail split pane the way `/tasks/:id` does: its own URL; registered in `lib/listDetail.ts`; a full page below the dock width; expand and close buttons; Back works.
- **AC4.2** A converted panel that is long gets `?tab=` subtabs by the priority rule. Audit event: Event · Request · Subject · Payload.
- **AC4.3** Every row that opened a drawer still opens the same record, and the parent list keeps its filters and scroll, per the `ListDetail` background rule.
- **AC6.1** ON by default on dev, no feature flag.
Credentials & reach: `gmind/skynet/dev-orgb` — tenant org admin on `https://app.dev.jaah.ai` — **verified**. `jaah/debug/main/operator-login` — **verified** (MFA risk: ask once if it reappears, else defer with reason). Dev console `https://app.dev.jaah.ai/` — **verified**. Do NOT use `gmind/skynet/dev`. Local oracles: none beyond the worktree.
Out of scope: Do NOT touch `apps/api`, `apps/jaahd`, migrations. Do NOT fork `Tabs`/`useUrlTab`/`ListDetail`. Do NOT change audit list filters/columns or event content (move only). No feature flag.
Done means:
- AC4.1 — on dev click an audit row: URL becomes `/audit/events/<id>` and it opens in the pane; copy URL to new tab — same event opens. `AuditDrawer.tsx` deleted, no imports remain.
- AC4.2 — component test: full event strip "Event, Request, Subject, Payload"; an event lacking request/payload data drops those tabs; `?tab=payload` works.
- AC4.3 — on dev filter the audit list, scroll, open an event, close: filter + scroll kept.
- Playwright 390 px / 1440 px — labels in full.
- AC6.1 — after the PR's Jaah Deploy succeeds, walk it on app.dev.jaah.ai.
- `./dc check quick` green; PR merged to develop.
Outcome
Audit event now opens as a tabbed list/detail pane at /audit/events/:id (Event·Request·Subject·Payload); AuditDrawer deleted. PR #5107 merged, Jaah Deploy green, walked on dev. Full gate green bar 2 pre-existing develop docs failures. UI follow-ups in report.
Artifacts
Activity
- Draft
- Ready
- Runner started
- Runner ended (done)