DUNIN7 · LOOMWORKS · RECORD
record.dunin7.com
Status Current
Path phases/phase-27-rendering-room-redesign/phase-27-cr-rendering-room-redesign-v0_1.md

DUNIN7-M4 — INFRASTRUCTURE CHANGE REQUEST

CR-2026-040 — Phase 27: Rendering Room Redesign (v0.1)

Version. 0.1 Date. 2026-04-30 Author. Marvin Percival (DUNIN7), prepared via Claude. Target. /Users/dunin7/loomworks-ui (frontend only). DUNIN7-M4 (MacMini). Priority. Standard. Confidential. Internal. Companion to. Phase 27 scoping note v0.1, Phase 23 CR v0.1 (Shaping Room Redesign — the template), Phase 22 CR v0.1 (Rendering Room original build), methodology v0.19. Status. First draft. Six scoping decisions (S1–S6). Three design questions resolved (N1–N3).


Contents


1. Executive summary

Phase 27 redesigns the Rendering room from flat sections to a status-first card layout — the same treatment Phase 23 applied to the Shaping room. The current layout (Phase 22) presents thirteen DeclaredRenderTypes as subsections within Build and Commons groups. Thirteen subsections with heading, metadata, and render cards is verbose and hard to scan. The redesign replaces flat subsections with compact expandable cards under retained group headings, letting the Operator scan all render types at a glance and drill into detail on demand.

This is a frontend-only phase. No substrate changes. The Rendering room data is already served by existing endpoints. All existing functionality — Request Render, inline content viewer, retire confirmation, invalidation display, retired/invalidated collapsible toggles, async production with job polling — is preserved. Only visual placement changes.


2. Grounding

Layer 1 — Methodology document v0.19. Rendering produces the final artifact that the reader receives. The room's job is to make the Operator's relationship with Renders clear: what is produced, for whom, from what source, and what is the current state.

Layer 2 — Phase 23 CR v0.1. The card-layout template. Collapsed/expanded states, typography hierarchy, brand enforcement, "What is shaping?" toggle, "What is this?" on empty cards. This CR adapts the same pattern to the Rendering room's different structure (thirteen types in two groups, content viewer, format badges).

Layer 3 — Phase 22 CR v0.1. The current Rendering room. Group structure, DeclaredRenderType subsections, Render cards with metadata, Request Render modal, retire/invalidate flows, async production and job polling, content viewer.

Design decisions resolved in scoping. N1: group headings carry a count ("Build · 11 render types"). N2: all cards collapse on each page load (no localStorage persistence, matching Phase 23). N3: empty groups are hidden per "only show what is available."


3. Prerequisites

3.1 Baseline

3.2 No substrate changes

Phase 27 is frontend-only. The substrate is unchanged. All data the card layout needs is already served by existing endpoints (DeclaredRenderType list, Render list, render jobs, retire).


4. Step 0 — CR archival

Archive this CR to docs/phase-crs/phase-27-cr-rendering-room-redesign-v0_1.md in the substrate repo.

Commit (substrate repo): Phase 27 step 0: CR archival.


5. Card layout — the core redesign

5.1 What replaces what

The current Rendering room layout:

Replaced by:

5.2 Card stack

Cards within each group stack vertically with {spacing.s-4} (1rem) gap. The order follows the DeclaredRenderTypes as they appear in the engagement's seed within each group.

5.3 Environment tint

The room page background remains env-rendering (#E6DCCA). Cards sit on {colors.bleached} (#FFFCF5) — raised above the room's atmospheric ground per the brand's paper hierarchy. Render rows inside expanded cards sit on {colors.cartridge} (#F2EDE0).


6. Group headings

6.1 Group structure

DeclaredRenderTypes are grouped by their category metadata from the seed. The Loomworks engagement has two groups: Build (eleven render types) and Commons (two render types).

Each group heading appears as {typography.h3} with a count suffix: "Build · 11 render types" and "Commons · 2 render types" in {colors.ink-faint} for the count portion. The count is dynamic — it reflects the actual number of DeclaredRenderTypes in the group.

Spacing between the group heading and its first card: {spacing.s-3} (0.75rem). Spacing between groups: {spacing.s-6} (1.5rem).

6.2 Empty group handling

If a group has zero DeclaredRenderTypes, its heading does not appear. Per "only show what is available." The component filters groups before rendering — only groups with at least one DeclaredRenderType produce output.

6.3 No-category fallback

If a future engagement's DeclaredRenderTypes carry no category metadata, the room falls back to a flat card list with no group headings. The card layout itself is unchanged — only the grouping layer is absent.


7. Render type cards — collapsed state

Each DeclaredRenderType is a card ({components.card}) in the collapsed state by default.

Layout: two-column. Left column (flex: 1) carries the content. Right column (flex-shrink: 0, right-aligned) carries the status.

Left column content:

Right column content:

Interaction: the entire card is clickable. Cursor pointer. On hover, subtle elevation change per {components.card} hover state.


8. Render type cards — expanded state

Clicking a collapsed card expands it. Clicking again collapses it. Only one card per group may be expanded at a time — expanding a card in a group collapses any other expanded card in that group.

The expanded card retains the collapsed header content at the top. Below it, a divider ({colors.rule}, 1px), then the card body containing Render rows (§9).

All cards default to collapsed on page load. No localStorage persistence (matching Phase 23).


9. Render rows inside expanded cards

9.1 Active Render rows

Each active (produced) Render is a row on {colors.cartridge} (#F2EDE0) background with {spacing.s-3} padding and {spacing.s-2} gap between rows.

Row content:

Action button (produced Renders only):

9.2 Row ordering

Active Renders appear first, newest at top. This matches Phase 22's ordering within subsections.

9.3 Retire confirmation

Unchanged from Phase 22. Clicking "Retire" on a produced Render row expands an inline confirmation below the row (not a modal):

> 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. State dot changes.

9.4 Retired and invalidated sections

Below active Render rows, within the expanded card:

Collapsible toggles are absent when their count is zero (not "Show retired · 0" — the toggle does not appear).

9.5 Action row

At the bottom of the expanded card, below Render rows and retired/invalidated sections:

The button is absent when no confirmed Shapes exist for the source shape type. Per "only show what is available."


10. Action button visibility on cartridge ground

Render rows sit on {colors.cartridge} (#F2EDE0). The Phase 23 contextual color rules apply:

These rules ensure buttons remain visible against the warm cartridge tone — the same problem Phase 23 solved for Shaping rows.


11. Empty-state cards

A DeclaredRenderType card with no Renders (active, retired, or invalidated) shows in collapsed state:

> No Renders have been produced for this type.


12. Room explanation toggle

"What is rendering?" expandable toggle positioned between the room header and the first group heading.

Collapsed state (default): a single clickable line — "What is rendering?" in {typography.body} with {colors.brass}, styled as a toggle with a chevron indicator.

Expanded state: the full explanation text on {colors.bleached} background with {spacing.s-4} padding. The text is derived from assertion #15 (the Rendering room explanation contributed in the operational work):

> Rendering produces the final artifact that the reader actually receives. > > Memory accumulates knowledge. Manifestation organizes it. Shaping selects and arranges it for a specific reader. Rendering produces the thing they hold in their hands — the document, the report, the guide, the reference, whatever form the reader needs. > > The distinction from Shaping: a Shaping says "here is the knowledge this reader needs, organized for them." A Render says "here is the actual document, in the actual format, ready to use." The Shaping is the organized material; the Render is the produced artifact. > > A render specialist produces the Render. The specialist knows how to turn shaped material into the right format — a methodology document, a contributor guide, a change request, a concept reference. Different specialists produce different formats from the same shaped material. > > Every Render records what it was produced from: which Shape, which specialist, what configuration was in force. If the specialist's instructions change, or the Shape changes, or the underlying Memory grows and a new Manifestation is derived, the lineage is visible. The Operator can always see what any Render was built from. > > Rendering is the end of the pipeline. Memory is knowledge. Manifestation is organization. Shaping is selection. Rendering is production. The reader receives the Render.

This is static text. Phase 28 replaces it with the live explains assertion from Memory.

The toggle collapses the explanation on second click.


13. "What is this?" on render type cards

DeclaredRenderType cards with no Renders show a "What is this?" expandable link inside the expanded card body, below the empty-state message.

Collapsed state: "What is this?" as a text link in {typography.caption} with {colors.brass}.

Expanded state: the DeclaredRenderType's consumer_declaration field, rendered in {typography.body} with {colors.ink-faint}.

When the explains pattern extends to DeclaredRenderTypes (Phase 28), this link reads from Memory instead of the consumer_declaration field.

The toggle collapses on second click.


14. Async production within cards

The Phase 22 async production flow (§11 of that CR) is preserved, repositioned into the card layout:

14.1 During production

After a Render is requested via the modal:

14.2 Polling

Poll GET /render-jobs/{jobid} at 3-second intervals. Unchanged from Phase 22.

14.3 Completion

On success: the new Render row appears in the card body. The collapsed card's status badge updates ("N PRODUCED" increments). Polling stops.

On failure: an error message appears inline in the card body. Polling stops.

14.4 Timeout

If polling exceeds 120 seconds, stop polling and show: "Render production is taking longer than expected. Refresh the page to check for results." Unchanged from Phase 22.


15. Component tests

Update existing Rendering room component tests to reflect the new layout. CC writes or updates tests to cover:

Existing modal tests (Request Render) should still pass — the modal is unchanged.


16. Order of operations (steps with checkpoints)

Auto-mode posture: Step 0 auto. Steps 1–2 auto, Checkpoint A. Steps 3–4 auto, Checkpoint B (final).

Step 0 — CR archival.

Archive this CR to docs/phase-crs/phase-27-cr-rendering-room-redesign-v0_1.md.

Commit (substrate repo): Phase 27 step 0: CR archival.

Step 1 — Group headings, card layout, collapsed state.

Replace the flat-section layout with grouped card stacks. Implement group headings with count (§6). Implement collapsed card state (§7) with name, consumer declaration, source line, format badge, status badge, latest timestamp. Remove the old subsection-based components.

Verification: lint + tsc + build clean. Room renders with two groups and thirteen cards in collapsed state.

Commit (frontend repo): Phase 27 step 1: group headings and collapsed card state.

Step 2 — Expanded state, Render rows, action buttons, empty state, async production.

Implement expanded card state (§8). Render rows (§9) with content viewer toggle, retire confirmation, retired/invalidated collapsible sections. Action button contextual color rules (§10). Empty-state cards (§11). Async production within cards (§14). "Request render" button in action row with candidate-existence gate.

Verification: lint + tsc + build + test clean. Operator can expand cards, see Renders, retire, request new Renders.

Commit (frontend repo): Phase 27 step 2: expanded state, render rows, actions, async production.

Checkpoint A — Card layout functional. All existing operations work. Content viewer works within Render rows. Action buttons visible on cartridge ground. Operator confirms before explanation toggles and tests.

Step 3 — Room explanation toggle, "What is this?" toggle, component tests.

Implement "What is rendering?" toggle (§12). Implement "What is this?" on empty cards (§13). Write/update component tests (§15).

Verification: lint + tsc + build + test clean.

Commit (frontend repo): Phase 27 step 3: explanation toggles and component tests.

Step 4 — Implementation notes and tagging.

Create docs/phase-impl-notes/phase-27-implementation-notes-v0_1.md.

Commit (substrate repo): Phase 27 step 4: implementation notes.

Checkpoint B — Final. Both repos green. Tag both repos as phase-27-rendering-room-redesign.


17. Acceptance gate

Phase 27 is accepted when:

  1. Substrate: all tests pass (1170, 2 skips). No substrate changes — test count unchanged.
  2. Frontend: lint + tsc + build + test clean.
  3. The Rendering room displays two groups (Build, Commons) with card count on each heading.
  4. Thirteen render type cards appear in their respective groups.
  5. Each collapsed card shows: name (serif), consumer declaration (italic), source line, format badge, status badge, latest timestamp.
  6. Cards expand on click to show Render rows within.
  7. Expanding a card collapses any other expanded card in the same group.
  8. Render rows show state dot, specialist, source reference, trigger, timestamp.
  9. "Show content" toggle on Render rows expands the MarkdownPanel content viewer.
  10. "Retire" on produced Render rows triggers inline confirmation with reason.
  11. Retired and invalidated collapsible sections work within expanded cards.
  12. Action buttons on cartridge ground are clearly visible: secondary buttons have type-metal border, ghost buttons have type-metal text.
  13. "Request render" button appears only when confirmed Shapes exist. Triggers the existing modal.
  14. Async production shows loading state within cards and completes correctly.
  15. Empty-state cards show message and "What is this?" link.
  16. "What is rendering?" toggle expands to show the room explanation.
  17. "What is this?" on empty cards expands to show the consumer declaration.
  18. Empty groups are hidden (verified by test, not visually in Loomworks — both groups have DeclaredRenderTypes).
  19. Component tests cover the new layout.
  20. Brand: env-rendering (#E6DCCA) on outer frame. Bleached (#FFFCF5) card backgrounds. Cartridge (#F2EDE0) Render rows. No pure white. IBM Plex Serif for card names and room heading. Inter for body. IBM Plex Mono for labels, status badges, and format badges.

On acceptance: tag both repos as phase-27-rendering-room-redesign. Write implementation notes.


18. Post-CR state


19. What this CR does not specify


20. Kickoff prompt for the Claude Code session


Read the Change Request document at the path I supply below. This is
CR-2026-040 v0.1, the Phase 27 Change Request. You are the executing
agent named in the CR.

CR path: ~/Downloads/phase-27-cr-rendering-room-redesign-v0_1.md

Phase 27 redesigns the Rendering room from flat sections to a
status-first card layout. Same treatment as Phase 23 (Shaping room),
adapted for the Rendering room's structure (13 render types in 2
groups, content viewer, format badges).

Key design requirements:
  - Each DeclaredRenderType is a compact card, not a subsection.
  - Cards are grouped under Build and Commons headings with count
    ("Build · 11 render types").
  - Cards expand on click to show Render rows within.
  - Render rows sit on cartridge ground. Action button contextual
    color rules per §10: secondary buttons get type-metal border,
    ghost buttons get type-metal text.
  - "Show content" toggle on Render rows (existing MarkdownPanel
    viewer, repositioned).
  - "Request render" button in expanded card action row — only when
    confirmed Shapes exist for the source shape type.
  - All cards collapse on page load (no localStorage persistence).
  - Empty groups hidden. Format badge on collapsed cards.
  - "What is rendering?" expandable toggle below room heading.
  - "What is this?" expandable link on empty cards.

Frontend-only. No substrate changes. Substrate baseline: 1170 tests,
2 skips. Frontend baseline: 113 component tests, 6 E2E (1 skip).

Run Step 0: archive CR in substrate repo.

Steps 1–2 auto, Checkpoint A halts for smoke-test.
Steps 3–4 auto, Checkpoint B halts for tagging.

Brand enforcement: env-rendering (#E6DCCA) on outer frame. Bleached
(#FFFCF5) card backgrounds. Cartridge (#F2EDE0) Render rows.
No pure white. IBM Plex Serif for card names and room heading.
Inter for body. IBM Plex Mono for labels, status badges, format
badges. Audit before tagging.

Implementation notes at Step 4:
docs/phase-impl-notes/phase-27-implementation-notes-v0_1.md

DUNIN7 — Done In Seven LLC — Miami, Florida Phase 27: Rendering Room Redesign — CR v0.1 — 2026-04-30