← app v3.5 prototypes
relay-ui-overhaul · RCTX-409 / RCTX-410 · SPEC.manifest.md

The Root Manifest

One ground truth, many lenses. The manifest is the per-user entry vertex of your object graph — a derived, pointers-only index over your Streams, Series, Sessions and Relays. The same projection engine renders it for the agent at boot, the Overview home, and the Graph Map, so the three surfaces can never drift.

What it is

Derived, not authored

A materialized view, computed on read. No write API — it can’t drift because it’s never the source of truth.

Pointers only

Type · id · name · state · weight · workspace · how-it-arrived. Never content bodies — discovery, not retrieval.

One root per user

Computed under your identity + active org. Filters, never grants — an unevaluable node is dropped, not leaked.

An accelerator

Fail-open: no manifest → the normal home. Held snapshot_hash makes re-checks cheap.

One engine, three lenses
Root Manifestowner projection · top-N + counts
Streams Series Sessions Relays Resources
services/projection.py — one ranker, one visibility guard
Agent at boot

The compact columnar skeleton in relay_context — the map an agent lands with instead of discovering objects piecemeal.

H2A · deployed · flag-dark
Overview home

The list-density projection: Streams with attention meters, Series, open Sessions, recent Relays with provenance. This page’s home.

RCTX-409/410
Graph Map

The canvas-density view: the same nodes at higher N, drawn as shapes with typed edges. One renderer, two densities.

RCTX-385 · live
Across the key pages
/overviewOverviewFull projection
The home is the owner projection — every section rendered from the manifest through the gc-* kit. Streams carry an attention-share health meter; relays carry a read-only provenance line.
Relay UI overhaul34%
Q3 roadmap briefDO@danaokafor · via QR7K2M
/graphGraph MapSame nodes · higher N
The spatial twin. Same GraphObject model and shape alphabet as the home, so a Stream is a circle in both. Tap-through neighborhoods via /objects/:type/:id/related.
/transfers · /series · /sessionsList screensA filtered lens
Each list screen is one type’s slice of the same graph. The manifest feeds the counts (decide enumerate vs. summarize) and every relay’s edge becomes the “how it got here” byline — the same social treatment as the home.
LVYU4MPulse to stream sweepReceived
LF@lenafischer5h 31m ago
bootAgent sessionCompact skeleton
Off-screen, the same projection ships to an agent at session boot as a ~2KB columnar skeleton — no bodies, hash-guarded for no-op re-pulls. The human sees cards; the agent sees rows; both read the one map.
{"v":1,"hash":"3a50…","cols":["type","id","name","state"],
"rows":[["stream","pc_ab12","Relay UI overhaul","open"], …]}
The node vocabulary — type is shape, never colour

A locked law (RZBE4Q / YA8GSA): every node is a neutral glyph tile, identical background for every type — the shape carries the type, the same alphabet the canvas draws. Colour stays a state channel (teal), never a type channel.

Stream circle Series rounded-rect Session diamond Relay rect Resource hexagon
Ship status · as-built 2026-07

Steps 1–5 are built and deployed to production (relay-platform PR #1755, green) — but every surface ships dark behind a flag until turned on. Nothing is user-visible yet; flip a flag to light each surface.

Boot skeleton

root_manifest feature flag — off globally (@relayctx.com on by default). Flip it → every session boot carries the map. Verified off for non-internal accounts.

HTTP read plane

RELAY_NODE_ENABLED env — off (endpoint 404s). Flip it → the Overview home + Map can read /api/user/v1/manifest.

Signing

RELAY_MANIFEST_SIGNINGoff, held behind the disclosure gate until the provisional files. Opaque, canonical form only.

Graph Map is live now, and both backfill passes have run (2026-07-13). Pass A (structural: parent_id→derived-from) supplies the manifest's lineage in object_edges. Pass B (--refs, @-ref text edges) ran to 0 edges — no un-mirrored @-refs in envelope text; standalone sends dominate (real usage shape). The graph is fully backfilled; the references layer fills naturally via dual-write from here.
Provenance nuance: the compact boot skeleton carries edge.origin (created/claimed/forwarded) but not via_code — lineage rides the canonical/HTTP form only. Open call: add via_code as a compact column if agents need provenance at boot (additive — appends to cols).
Mobile: the ~2KB columnar skeleton is a mobile-first win — hold snapshot_hash for no-op re-pulls, use counts to summarise-not-enumerate on small screens, lazy-fetch node bodies on tap. See concepts/map-mobile-concept.html.
The recurring callout

Wherever manifest-fed content appears, one quiet marker signals it’s a live projection — a status dot, the truncated snapshot_hash, and a jump to the same data as a map.

Live projection· sha256-3a50ae8d · View as map →
Contract: GET /api/user/v1/manifest → { manifest | null } (404 while RELAY_NODE_ENABLED is dark; fail-open). Nodes: type · id · name · state · weight_pct · workspace · visibility · last_activity · edge + counts + snapshot_hash. One engine: services/projection.py. Rendered through the shared gc-* kit (concepts/src/graph/components.ts) so the home and the Map never diverge.
Refs: SPEC.manifest.md §3/§5/§8 · RCTX-409 (home) · RCTX-410 (provenance) · RCTX-385 (Map) · RCTX-414 (endpoint) · RCTX-415 (signing) · RCTX-320 (/graph) · RCTX-396 (kit) · turn-on series 42KXS4.