Version. 0.1
Date. 2026-04-28
Author. Marvin Percival (DUNIN7), prepared via Claude.
Target. /Users/dunin7/loomworks (substrate, Step 0) and /Users/dunin7/loomworks-ui (frontend, Steps 1–5). DUNIN7-M4 (MacMini).
Priority. Standard.
Confidential. Internal.
Companion to. Phase 22 scoping note v0.1, Phase 10 CR v0.1 (Render substrate), Phase 9 CR v0.3 (Shaping substrate), candidate seed v0.5, methodology v0.19.
Status. First draft. Addresses eight scoping decisions (S1–S8).
Phase 22 builds the Rendering room — the fourth and final methodology room in the UI. After this phase, the full pipeline (Memory → Manifestation → Shaping → Rendering) is live and navigable.
The room is organized by DeclaredRenderType from the seed, grouped into two categories matching the seed's structure: Build (11 render types) and Commons (2 render types). Each declared render type is a subsection; Renders produced for that type appear as metadata cards within. The Operator can request a Render against a confirmed Shape, retire a Render, and see invalidated Renders. Render content is not displayed inline (renders can be full documents); a content viewer is future work.
Step 0 registers the five DeclaredShapeTypes from candidate seed v0.5 in the Loomworks engagement, unblocking the Shaping room's sections. Step 0 also performs display-readiness pre-flight on Rendering response schemas and files amendments if needed, following the Phase 21 §3A pattern.
Layer 1 — Methodology document v0.19. Render produces the consumer-facing artifact from a Shaping. The Shaping has selected, recast, foregrounded, traversed, and filtered; Render produces the document, the application, the audio file, the conversation — whatever the consumer actually receives. Render configuration pinning records the full configuration so output can be reasoned about later.
Layer 2 — Reference Design v0.1.2. S-3 (render delivery): the Rendering room is where the Operator sees produced Renders and their lineage back through Shaping to Memory.
Layer 3 — Playground Specification v0.10. Sec-C.1 R-C3 (Render production), Sec-C.4 R-C10 (Render confirmation via Shape layer), R-C13 (Render indexing).
phase-21-shaping-room-ui on main. 1134 tests, 2 skips. Full Render layer from Phase 10.phase-21-shaping-room-ui on main. Lint + tsc + build + test clean. Twelve surfaces. 55 component tests, 1 E2E test.CC confirms before Step 1 (after Step 0 substrate work):
npm run test passes.POST /renders/ (explicit_request)GET /render-jobs/{jobid}GET /renders/ with filtersGET /renders/{object_id}POST /renders/{object_id}/retireGET /renders/candidatesRoomSwitcher component, EngagementRoomLayout, and Shaping room page are identified as templates.Endpoint path note. The exact substrate endpoint paths may differ from Phase 10 CR specifications. CC confirms at pre-flight and wires proxy routes accordingly. If any endpoint is missing or returns unexpected shapes, stop and reconcile before Step 1.
Archive this CR to docs/phase-crs/phase-22-cr-rendering-room-ui-v0_1.md in the substrate repo at Step 0. Archive candidate seed v0.5 to docs/seeds/loomworks-candidate-seed-v0_5.md.
Three substrate tasks before frontend work begins.
Register five DeclaredShapeTypes in the Loomworks engagement (ID 00000000-0000-0000-0000-000000000002) from candidate seed v0.5. Each registration writes a declared_shape_type_added event to memory_events following the Phase 9 pattern.
The five shape types:
| Shape type name | Consumer | Source for render-types | |----------------|----------|------------------------| | Phase execution context | Claude (CR drafter), CC (executor), Operator (reviewer) | Phase CR, scoping note, handoff, implementation notes | | Project state | Fresh Claude chats, Operator | Manifest, standing note, infrastructure CR, engagement seed | | Methodology narrative | Anyone understanding what DUNIN7 builds | Methodology document, philosophy/architecture document | | Discovery trajectory | Future methodology revisions, Operator | Discovery record | | Commons education | Every person in the system | Concept reference, contributor guide |
Each DeclaredShapeType carries:
shape_type_name — as listed above.consumer_declaration — from the seed v0.5 consumer descriptions.selection_criterion — from the seed v0.5 selection descriptions.shaping_instructions — initial instructions derived from the seed v0.5 descriptions. CC drafts reasonable initial instructions; the Operator can amend later via the Shaping room.state — "active".After registration: the Shaping room shows five DeclaredShapeType sections instead of the dead-end message.
CC checks Rendering response schemas against this CR's display requirements. Likely gaps (based on Phase 21 precedent):
RenderEventResponse.render_specialist_ref may use ActorRefSchema (no display_name) instead of ActorRefResponse. Same pattern as Phase 21 Amendment A.RenderEventResponse.triggered_by may lack display_name.declared_render_type_ref (object_id + version) without the resolved name.confirmed_shape_event_ref without resolved Shaping context.RenderEventResponse may or may not carry produced_at or equivalent.CC identifies actual gaps at pre-flight. For each gap found, CC applies the same Step 0 amendment pattern as Phase 21: schema change, router population, migration if needed, tests. Accept null for pre-amendment rows where applicable.
If no gaps are found, Step 0 is registration + archival only.
docs/phase-crs/phase-22-cr-rendering-room-ui-v0_1.md.docs/seeds/loomworks-candidate-seed-v0_5.md.
Commit (substrate repo): Phase 22 step 0: CR archival, seed v0.5, DeclaredShapeType registration, display-readiness amendments.
Page at /engagement/[id]/rendering. Wrapped in EngagementRoomLayout. Environment tint: env-rendering (#E6DCCA, cream).
Room header: "Rendering" in {typography.h2}. Subtitle in {typography.body} with {colors.ink-faint}:
> Renders are consumer-facing artifacts produced from confirmed Shapes. Each Render records what specialist produced it, what Shape it drew from, and what configuration was in force.
The page fetches the engagement's DeclaredRenderTypes and Renders on load. Three states:
DeclaredRenderTypes are grouped into two top-level sections matching the seed's structure:
{typography.h3}. Contains the eleven build render types.{typography.h3}. Contains the two commons render types.CC determines the grouping by inspecting the seed's DeclaredRenderType metadata. If the seed carries a category or group field, use it. If not, CC can infer from the consumer_declaration or the DeclaredRenderType names (the eleven build types have build-team consumers; the two commons types have "every person" consumers). If inference is ambiguous, fall back to a flat list without grouping.
Within each group, each DeclaredRenderType is a subsection.
Subsection heading: the render type's name in {typography.body-em}.
Subsection metadata in {typography.caption} with {colors.ink-faint}:
.md, .docx).Active Renders for this type appear as cards within the subsection (§7). If no Renders exist:
> No Renders have been produced for this type yet.
With a "Request Render" primary button if at least one confirmed Shape exists for the source shape type. Without the button if no confirmed Shapes exist (nothing to render against).
Each produced Render is a card ({components.card}) within its DeclaredRenderType subsection.
Card content:
{colors.state-attest} dot. "Retired" with {colors.ink-faint} dot. "Invalidated" with {colors.state-amend} dot.{typography.mono}.{typography.caption}. Resolved from the confirmed_shape_event_ref. If resolution is unavailable, show "From Shape [id-prefix]".{typography.caption}. Resolved from render_specialist_ref. If display_name unavailable, show "Specialist: [id-prefix]".{typography.caption}.{typography.caption}.Action buttons (produced Renders only):
{components.button-ghost}. Confirmation flow (§9).Per "only show what is available" — no action buttons on retired or invalidated Renders.
Trigger: "Request Render" button on a DeclaredRenderType subsection.
Modal content:
{typography.caption}.{typography.h3}.{components.button-ghost}.{components.button-primary}.
On request: calls POST /renders/ with confirmed_shape_event_ref and declared_render_type_ref. Returns 202 with render_job_id. Modal closes. Async production begins (§11).
Clicking "Retire" on a produced Render shows an inline confirmation (same pattern as Shaping retirement — not a modal, an inline expansion):
> Retire this Render? It will no longer be current. The Render content is preserved for reference.
Reason — text input. Required.
"Confirm retirement" — {components.button-ghost}. "Cancel" — text link.
On success: the Render moves to the retired section (§12). State badge changes to "Retired" with {colors.ink-faint} dot.
Invalidated Renders are system-driven — the substrate's drift detection (Phase 10's Check A' and Check B') invalidated them. The UI displays them but offers no actions.
Invalidated Render card additions:
{colors.state-amend} dot (iron-oxide — invalidation is consequential).{typography.caption} with {colors.ink-faint}: "Rule conformance drift" or "Translation drift" based on the triggering_reason if available in the response metadata. If not available, show "Invalidated by drift detection".Invalidated Renders appear in the invalidated collapsible section (§12).
The POST /renders/ endpoint returns 202 with { render_job_id, render_event_object_id }. The UI enters a polling state.
Poll GET /render-jobs/{jobid} at 3-second intervals. During polling:
On job completion (success): the new Render card appears in the subsection. Polling stops.
On job completion (failure): an error message appears inline in the subsection. Polling stops.
If polling exceeds 120 seconds without completion, stop polling and show: "Render production is taking longer than expected. Refresh the page to check for results." This handles the case where the specialist takes a long time or the job stalls.
Within each DeclaredRenderType subsection, below active Renders:
Toggles appear only when the count is non-zero. Per "only show what is available."
The Rendering entry becomes clickable and navigable: link to /engagement/[id]/rendering.
All four room entries are now clickable. The room switcher is complete.
The count displayed: number of produced (active) Renders, or "0" if none exist.
The Rendering room badge becomes a clickable link to the Rendering room. All four lobby badges now link to rooms.
New proxy routes (CC confirms exact substrate paths):
| Frontend route | Substrate endpoint |
|----------------|-------------------|
| GET /api/engagements/[id]/declared-render-types | List DeclaredRenderTypes |
| POST /api/engagements/[id]/renders | Request Render (explicit_request) |
| GET /api/engagements/[id]/render-jobs/[jobid] | Poll render job status |
| GET /api/engagements/[id]/renders | List Renders |
| GET /api/engagements/[id]/renders/[rid] | Get Render by ID |
| POST /api/engagements/[id]/renders/[rid]/retire | Retire Render |
| GET /api/engagements/[id]/renders/candidates | List render candidates |
Some routes may already exist as proxy routes from earlier phases. "Do not duplicate" applies. CC confirms exact substrate paths and adjusts.
Auto-mode posture: Step 0 auto. Steps 1–3 auto, Checkpoint A. Steps 4–5 auto, Checkpoint B (final).
Step 0 — CR archival, seed archival, DeclaredShapeType registration, display-readiness amendments, pre-flight.
docs/phase-crs/phase-22-cr-rendering-room-ui-v0_1.md.docs/seeds/loomworks-candidate-seed-v0_5.md.
Commit (substrate repo): Phase 22 step 0: CR archival, seed v0.5, DeclaredShapeType registration, display-readiness amendments.
Step 1 — Rendering room page, DeclaredRenderType groups and sections, proxy routes.
Create the page at /engagement/[id]/rendering wrapped in EngagementRoomLayout. Implement group structure (Build/Commons) and DeclaredRenderType subsections (§6). Create proxy routes (§14). Handle three conditional states (§5.3).
Verification: lint + tsc + build clean. Room renders with grouped DeclaredRenderType headings.
Commit (frontend repo): Phase 22 step 1: rendering room page and declared render type sections.
Step 2 — Render cards, Request Render modal, retire flow.
Implement Render cards (§7). Request Render modal (§8). Retire flow (§9). Invalidated Render display (§10). Retired and invalidated collapsible sections (§12).
Verification: lint + tsc + build + test clean.
Commit (frontend repo): Phase 22 step 2: render cards, request modal, retire flow.
Step 3 — Async production, job polling.
Implement async production with job polling (§11). Loading states, timeout handling, error display.
Verification: lint + tsc + build + test clean. Operator can request a Render and see it appear after polling.
Commit (frontend repo): Phase 22 step 3: async render production and job polling.
Checkpoint A — Rendering room functional. All operations work. Operator confirms before wiring and final steps.
Step 4 — Room switcher, lobby wiring, component tests.
Room switcher Rendering entry becomes clickable (§13). All four rooms navigable. Lobby badge links to room. Write component tests for Render cards and key interactions.
Verification: lint + tsc + build + test clean.
Commit (frontend repo): Phase 22 step 4: room switcher wiring and component tests.
Step 5 — Implementation notes and tagging.
Create docs/phase-impl-notes/phase-22-implementation-notes-v0_1.md.
Commit (substrate repo): Phase 22 step 5: implementation notes.
Checkpoint B — Final. Both repos green. Tag both repos as phase-22-rendering-room-ui.
Phase 22 is accepted when:
/engagement/[id]/rendering.
On acceptance: tag both repos as phase-22-rendering-room-ui. Write implementation notes.
/engagement/[id]/rendering live.
> Read the Change Request document at the path I supply below. This is
> CR-2026-036 v0.1, the Phase 22 Change Request. You are the executing
> agent named in the CR.
>
> CR path: ~/Downloads/phase-22-cr-rendering-room-ui-v0_1.md
>
> Also read the candidate seed v0.5:
> ~/Downloads/loomworks-candidate-seed-v0_5.md
>
> Phase 22 builds the Rendering room — the fourth and final methodology
> room. After this phase, the full pipeline is live.
>
> Step 0 carries three substrate tasks:
> 1. Archive CR and seed v0.5.
> 2. Register five DeclaredShapeTypes from seed v0.5 in the Loomworks
> engagement (see §4.1 for the table).
> 3. Display-readiness pre-flight on Rendering response schemas
> (see §4.2). Apply amendments if gaps found, same pattern as
> Phase 21 §3A.
> 4. Full substrate test suite green.
> 5. Pre-flight checks per §3.2.
>
> Code baseline: substrate at tag phase-21-shaping-room-ui (1134 tests,
> 2 skips). Frontend at tag phase-21-shaping-room-ui (lint + tsc +
> build + test clean, 55 component tests, 1 E2E).
>
> Steps 1–3 auto, Checkpoint A halts for smoke-test.
> Steps 4–5 auto, Checkpoint B halts for tagging.
>
> Brand enforcement: four environment tints must be consistent across
> all surfaces. Memory #E4E6E8, Manifestation #DCE3DB, Shaping #E6D4C5,
> Rendering #E6DCCA. Audit before tagging.
>
> Implementation notes at Step 5:
> docs/phase-impl-notes/phase-22-implementation-notes-v0_1.md
DUNIN7 — Done In Seven LLC — Miami, Florida Phase 22: Rendering Room UI — CR v0.1 — 2026-04-28