Context. surface studio · domain isis · route /studio/isis/retention-policies · auth signed-in + studio entitlement (NOT AAA-gated) · source apps/oshun/web/src/app/studio/isis/retention-policies/page.tsx
Last walked. 2026-05-29 automated runtime walk (Playwright headless) — render, /v1 data (2xx), console/page-errors, expected content, screenshot verified; live screen-reader, touch, offline, and telemetry-delivery checks pending a manual AT pass. Evidence: WALKTHROUGH/results/runtime-sweep-2026-05-29.md; body re-derived 2026-06-03 from current source (lane-console architecture); 2026-06-30 addendum: studio-isis-retention-policies.spec.ts proved the direct route remains hard-blocked by the Studio Isis boundary, then drove the localhost-only lane-bypass route against the real local BFF, including policy catalog, seeded records, exported-customer and legal-hold evaluations, scan endpoint, duplicate/pending/loading/empty/error/unauthorized/anonymous states, route-map articles, and sibling quick-actions.
Purpose#
Admin lane console for the artifact retention/deletion policy. The operator
evaluates a 3D model artifact (kind, created date, export and legal-hold flags)
against the retention policy; the engine returns the keep/delete decision and
the governing rule. Reads the policy and evaluates via
/v1/admin/isis/retention-policies; admin-scoped and fail-closed.
Entry points#
- Embedded as the "Retention Policies Lane" inside
/studio/isis/outputs - Sibling quick-action from
/studio/isis/lineage-graph - Studio index (
/studio) - Direct URL / bookmark
Layout regions#
page.tsx mounts <ShellLayout active="studio"> (no breadcrumb panel) and
three panels: the workspace, the Route Map, and sibling quick-actions.
- Header: shell header
- Workspace panel (
data-isis-retention-policies-workspace):<h1>(WorkspaceHeading) "Isis Retention Policies Workspace"- Summary paragraph (
data-retention-summary) - Policy (
data-retention-policy,data-retention-rule) - Evaluate form (
data-retention-form) - Evaluated records (
data-retention-records,data-retention-record=<id>withdata-retention-decision/data-retention-verdict); empty statedata-retention-records-empty
- Route Map panel (
data-isis-retention-policies-route-map):<h2>Route Map</h2>over the route map (5 entries) - Sibling quick-actions panel:
/studio/isis/lineage-graph,/studio
States#
- Loading —
data-retention-loading - Unauthorized — 401/403 admin-scope fail-closed;
data-retention-unauthorized - Error — non-OK / malformed;
data-retention-error - Ready (form) — policy + evaluate form render
- Empty — no artifacts evaluated yet;
data-retention-records-empty - Result —
data-retention-result(data-retention-status) after evaluating
Interactions#
Evaluate form (data-retention-form)#
- Artifact id (
data-retention-artifactid, input) - Label (
data-retention-label, input) - Kind (
data-retention-kind,<select>) - Created (date) (
data-retention-created, input) - Exported to customer (
data-retention-exported, checkbox) - Legal hold (
data-retention-legalhold, checkbox) - Evaluate (
data-retention-evaluate,type="button") —POST /v1/admin/isis/retention-policies
Route Map#
- Route-map articles ×5
Sibling quick-actions#
- Open Isis Lineage Graph workspace →
/studio/isis/lineage-graph - Back to Studio workspace index →
/studio
Data & contracts#
- Reads:
GET /v1/admin/isis/retention-policies(policy + rules + evaluated records) - Writes:
POST /v1/admin/isis/retention-policies(evaluate an artifact) - Maintenance scan:
POST /v1/admin/isis/retention-policies/scan(continuous deletion-sweep over stored artifacts) - Realtime: none
- Caching: client fetch on mount,
cache: 'no-store',buildBffAuthHeaders() - Auth/role check: admin-scoped, fail-closed (401/403); route signed-in + studio entitlement (not AAA-gated)
- Component sources:
apps/oshun/web/src/components/studio/StudioIsisRetentionPoliciesWorkspace.tsxapps/oshun/web/src/components/studio/StudioIsisRetentionPoliciesRouteMap.ts
E2E coverage#
apps/oshun/web/e2e/studio-isis-retention-policies.spec.ts— proves direct/studio/isis/retention-policiesis still hard-blocked by the Studio Isis boundary, then drives the localhost-only?__oshunStudioIsisLaneE2E=1lane bypass in the real Next shell with browser requests forwarded to the real local BFF. Covered paths:- Admin direct navigation loads the active policy windows, seeded records
(
art-recent-render,art-stale-upload,art-legal-hold), form defaults, route-map articles, and sibling quick-actions. - The real BFF scan endpoint returns the deletion-due stale upload and blocking legal hold while excluding the in-window recent render at the seed clock.
- Exported-customer evaluation persists an
ALLOWrecord with the customer-export retention window (retain until 2027-01-01); legal-hold evaluation persists aDENYrecord with no delete date and legal-hold reason. - Required-field disabled state, pending
"Evaluating..."label/lockout, duplicate seeded id rejection, loading, empty, 503 error, malformed catalog, non-admin unauthorized, and anonymous redirect-before-render are asserted.
- Admin direct navigation loads the active policy windows, seeded records
(
Cross-references#
- Studio overview:
../../studio-overview.md - Also embedded in:
studio-isis-outputs.md - Sibling routes:
Open questions / known gaps#
- No breadcrumb on this route — navigation via sibling quick-actions
- Also embedded as a lane inside the Outputs aggregator
- Route-map sub-paths are declared but not yet implemented as separate pages
- Live screen-reader, touch-device, offline/PWA-cache, and telemetry-delivery passes still need a manual or dedicated-device run; automated coverage includes Playwright role/locator checks and the suite-wide axe pass.