# Requests board on Astryx — decision registration and build plan

audience: AI coding agents first.

status: IDLE
task IDs: —
source request: 2026-08-14 owner supplied an approved layout mockup for the new plans page and ordered: use this layout with our design tokens; build the new plans page with facebook/astryx primitives; platform-modules ui-primitives are retired for NEW overdeck pages — existing pages port to Astryx slowly. Owner separately confirmed (2026-08-14 thread) the live request-status store direction: status rows in the collector, hook-written, one cross-project board; markdown plan registry keeps specs, its status column retires when the board is live.

## Decisions registered (owner rulings — do not re-litigate)

1. **UI primitives for overdeck: facebook/astryx** (`@astryxdesign/core`, `@astryxdesign/lab`,
   StyleX). Every NEW overdeck page is built with Astryx; `@platform-modules/ui-primitives` is
   retired for overdeck and existing pages migrate gradually. Overdeck design tokens, both themes.
2. **Route: the board lives at `/requests` — a NEW page, top of the sidebar; `/plans` is retired
   and is NOT reused.** The board is the owner-approved "Requests" layout (mockup registered
   2026-08-14, session f7206ccd): four columns — Asked (intake queue with line positions and wait
   reasons), In flight (lane-capped, per-request stage chips spec→build→verify→land→deploy→live),
   Blocked — needs you (the ONLY column requiring owner action), Shipped (grouped by day, each with
   an "Open proof" link); right-hand detail drawer with plain-language "What's happening", activity
   story, inline diffs, links out (spec/branch/landing/proof), repeated-asks history, and actions
   (Answer / Bump priority / Cancel / Mark not what I meant — every action journaled); project
   filter chips across the top; deliveries timeline strip at the bottom. Plain language for the
   owner, no jargon; honest data only.
3. **Duplicate-ask detection is a feature of the board**: each card carries "similar to #N";
   session-start and intake check the live store and surface overlapping work before starting.
4. **Status store**: collector-owned table(s), written by hooks at intake/landing/deploy — the
   consolidation registered in `2026-08-12-ci-cd-incremental-delivery.md` S5 attribution notes and
   the owner-request-recovery / task-registry-reconciliation / flow-first plans, which this board
   supersedes as their owner-facing surface.

## Prior art — MUST integrate, never rebuild

- Owner asked for Astryx adoption on 2026-08-09 01:46 ("can you use these instead of building from
  scratch?"). Work exists UNLANDED: `.worktrees/factory-ui`, branch `wt/factory-ui`, 10 commits —
  factory run-transcript view on Astryx + StyleX (`apps/web/src/components/factory/*`,
  `apps/web/src/styles/factory-astryx.css`, deps in `apps/web/package.json`), security-reviewed
  2026-08-09. First executable action below triages and lands it; it is the Astryx integration
  pattern for apps/web (package deps, css wiring, Astro island usage).
- Agent activity story (DONE 2026-08-14, `2026-08-14-agent-activity-story.md`) supplies the story
  feed + DiffViewer the detail drawer needs.

## Drag & drop

Astryx ships a kanban board template with drag-and-drop cards — use it before any third-party
library. Fallback if it proves insufficient: Atlassian Pragmatic drag-and-drop or dnd-kit (both
FOSS). The board's v1 does not require DnD (columns are pipeline states moved by the system, not by
hand); treat DnD as polish, not a blocker.

## Route rulings (owner, 2026-08-14 — previously stated but never registered; NEVER re-litigate)

- **`/plans` is RETIRED.** Owner retired it verbally long ago (including an explicit ask to remove
  it from the sidebar that was swallowed by the unrecovered task backlog); the 2026-08-14
  agent-story work landed onto it only because no record existed. The route is replaced by the
  Requests board.
- **Immediate slice, independent of the board build: remove `/plans` from the sidebar/nav.** The
  route may keep serving deep links until the board replaces it, but it stops being advertised.
- The landed agent-story + DiffViewer work is NOT wasted and NOT plans-page-bound: it is component
  inventory (drawer content) for the Requests board and the `/factory` transcript. Never cite the
  `/plans` route to the owner as a destination surface.
- `/factory` remains the factory-run surface; the rescued Astryx transcript lands there.

## Constraints

- `od-ui-dev` and repo `CLAUDE.md` currently mandate platform-modules primitives — they contradict
  ruling 1 and MUST be updated (via `agent-doc-authoring`) before any page build, or every agent
  will fight the decision.
- Honest data, both themes, tokens only, gallery/tests obligations continue to apply in Astryx form.
- Never fabricate board values; a metric without a source renders as an explicit gap state.

## Execution order

1. Triage + land `wt/factory-ui` (existing Astryx WIP; do not let it rot further).
2. Update `CLAUDE.md` UI section + `od-ui-dev` to register Astryx as the primitive source for new
   pages (agent-doc-authoring pass).
3. Collector status table + hook writes (intake/land/deploy) — data before pixels.
4. Requests board page per the mockup, Astryx primitives, our tokens; replace `/plans` list surface.
5. Retire the INDEX status column in favor of the live board (separate deliberate change).

## Current receipt

2026-08-14: decisions registered; astryx prior art located and pinned (`wt/factory-ui`, 10 unlanded
commits); no implementation started under this plan.
