# riotpiao — Task Board (Next.js portfolio, mock-backed)

This repo is scoped to the Next.js portfolio frontend only. Anything requiring `kubectl`, a real cluster, a Go
backend, or infra-side config (Cloudflare, deployment pipelines, RBAC) has been moved to [REQUIREMENTS.md](REQUIREMENTS.md) —
a handoff spec for whoever builds the real `atlas` backend service. The four cluster-visualization surfaces
(topology, delivery, terminal, chat) run against mock `/api/*` Next.js route handlers backed by
[lib/clusterMock.ts](../lib/clusterMock.ts) fixture data.

Source of truth: [docs/PLAN-atlas.md](../docs/PLAN-atlas.md), [docs/adr/ADR-0001-atlas-cluster-visualization.md](../docs/adr/ADR-0001-atlas-cluster-visualization.md)

Rules carried from the ADR (frontend-relevant subset):
- I2: browser never talks to an internal API directly — all cluster data flows through this app's own `/api/*` routes (mock today, real atlas later)
- I3: redaction is allowlist-only — the mock fixture already excludes denied fields, keep it that way when replacing with real data
- TDD: RED (tests named before code) -> GREEN (minimal code) -> REFACTOR, per phase
- Playwright e2e is a hard requirement for every UI-shipping phase (2, 3, 4, 5) — no surface merges without a passing spec

## 0 — Setup

| Task | Description |
|---|---|
| [0.6](0.6-vitest-setup.md) | Add Vitest + Testing Library + msw |
| [0.6a](0.6a-playwright-setup.md) | Add Playwright (hard requirement) |

## 2 — Topology (Surface B)

| Task | Description |
|---|---|
| [2.2](2.2-topology-component-test.md) | topology.test.tsx (RED) |
| [2.3](2.3-topology-e2e.md) | topology.e2e.ts (RED, Playwright — hard requirement) |
| [2.4](2.4-api-topology.md) | GET /api/topology (mock, GREEN) — done |
| [2.5](2.5-api-stream.md) | GET /api/stream (mock, GREEN) — done |
| [2.6](2.6-frontend-react-flow.md) | Frontend: React Flow topology graph (GREEN) |
| [2.7](2.7-security-headers.md) | Security headers (GREEN) |
| [2.9](2.9-simplify-pass.md) | simplify skill pass (REFACTOR) |

## 3 — Delivery Tree (Surface E)

| Task | Description |
|---|---|
| [3.2](3.2-delivery-component-test.md) | delivery.test.tsx (RED) |
| [3.3](3.3-delivery-e2e.md) | delivery.e2e.ts (RED, Playwright — hard requirement) |
| [3.4](3.4-api-delivery.md) | GET /api/delivery (mock, GREEN) — done |
| [3.5](3.5-api-delivery-resources.md) | GET /api/delivery/{app}/resources (mock, GREEN) — done |
| [3.6](3.6-frontend-wave-columns.md) | Frontend: wave columns + resource tree (GREEN) |
| [3.7](3.7-live-sync-animation.md) | Live deploy-status animation (mock, GREEN) |
| [3.9](3.9-simplify-pass.md) | simplify skill pass (REFACTOR) |
| [3.10](3.10-landing-page-cleanup.md) | Landing page: remove fabricated stats and dead links (GREEN) |

## 4 — Terminal (Surface C)

| Task | Description |
|---|---|
| [4.3](4.3-terminal-e2e.md) | terminal.e2e.ts (RED, Playwright — hard requirement) |
| [4.4](4.4-api-exec.md) | POST /api/exec (mock, GREEN) — done |
| [4.5](4.5-command-set.md) | Command set (GREEN) |
| [4.6](4.6-namespace-validation.md) | Namespace/resource-name validation by fixture membership (GREEN) — done |
| [4.8](4.8-frontend-terminal-wiring.md) | Frontend: wire terminal page to /api/exec (GREEN) |
| [4.9](4.9-structured-logging.md) | Log rejected /api/exec input (GREEN) — done |
| [4.10](4.10-simplify-pass.md) | simplify skill pass (REFACTOR) |

## 5 — Chat + Rate Limiter (Surface D)

| Task | Description |
|---|---|
| [5.6](5.6-chat-e2e.md) | chat.e2e.ts (RED, Playwright — hard requirement) |
| [5.7](5.7-api-chat.md) | POST /api/chat (mock, GREEN) — done |
| [5.9](5.9-queue-position-sse.md) | Queue position streamed as SSE (mock, GREEN) — done |
| [5.12](5.12-chat-sse-events.md) | Chat SSE event types (mock, GREEN) — done |
| [5.13](5.13-frontend-chat-component.md) | Frontend: wire chat page to /api/chat (GREEN) |
| [5.16](5.16-audit-ci-gate.md) | pnpm audit CI gate (GREEN) |
| [5.17](5.17-simplify-pass.md) | simplify skill pass (REFACTOR) |

## Progress

Status as of 2026-08-19: mock API layer implemented (`app/api/topology`, `/api/stream`, `/api/delivery`,
`/api/delivery/[app]/resources`, `/api/exec`, `/api/chat`) — all `[x]`-marked GREEN tasks above are done.
Remaining work is wiring the four page components to fetch from these routes instead of importing
`clusterMock` directly (2.6, 3.6, 4.8, 5.13), plus the RED (Playwright/Vitest) specs and REFACTOR passes.

Everything cluster/backend/infra-related that used to block this board now lives in
[REQUIREMENTS.md](REQUIREMENTS.md) and does not gate any task here.
