Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions docs/ROOM-PIPELINE-RUNBOOK.md
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,18 @@ models. Route each prop through the kind that matches its true silhouette (cylin
→ tree, box → crate/rubble/masonry) — the generator-export converter (`tools/dungen_to_fixtures.py`)
applies the same shape→kind rule for generator-sourced props (see step 8a).

**ENCLOSED ROOMS need a CUTAWAY greybox (tavern finding, PR #1531; codified from the CRYPT-RICH
cold-agent run, PR #1538):** full-height near walls poison the interior's depth/lighting read (NCC
collapses, the frame goes mostly black). Author enclosed interiors with `wall_height ≈ 5` on the
near/south walls (the camera-facing side stays open, the back walls keep height). Two artifacts to
Comment on lines +85 to +88

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Pass the cutaway height in the render examples

With this new requirement, the runnable commands in step 3 still render qa/greybox_render_headless.py ... and qa/greybox_sidecars_headless.py ... without --wall-height; those CLIs default wall_height to 9.0, so an enclosed-room agent following the runbook for crypt/tavern will produce the full-height near-wall/black-frame base this paragraph says to avoid. Please make the examples include --wall-height 5 or add an explicit enclosed-room branch so the documented cutaway is actually exercised.

Useful? React with 👍 / 👎.

avoid, both measured in #1538's panels:
- **Crenellation:** authoring wall bands as PER-CELL boxes gives the depth map toothed/castellated
wall-tops → the depth-CN paints a "tiled/gamey" motif panels penalize. Author each wall run as
ONE CONTINUOUS box spanning its cells, not a stack of cell-sized boxes.
Comment on lines +90 to +92

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Define continuous walls in a supported form

This tells authors to avoid per-cell wall boxes, but the geometry contract immediately below still represents walls as cells, and the current headless renderer turns every geo["walls"] cell into its own 1-cell box. A cold agent using tools/author_room_geometry.py for an enclosed perimeter will therefore still generate the crenellated control image unless the runbook says to model these runs as multi-cell wall props (or the renderer is changed to coalesce wall cells).

Useful? React with 👍 / 👎.

- **Over-dark frames:** a cutaway that still leaves >~40% of the canvas as unlit wall/void reads
as a black-margin defect at panel time — check `visual_pregate.py`'s frame-lit gate on the BASE,
not just the styled result.
Comment on lines +94 to +95

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Use a gate that detects black margins

For the >40% black-margin case described here, G1_frame_lit is the wrong check: qa/visual_pregate.py::gate_frame_lit only fails near-black mean luminance, blown-out mean luminance, or flat variance, so a base with large black borders plus a lit interior can still PASS. That lets the exact over-dark artifact reach the panel; point agents at a margin/near-black coverage check (or add one) instead of treating G1 as sufficient.

Useful? React with 👍 / 👎.


**Geometry schema** (mirrors `qa/export_scene_grid.py`):
```
{cols, rows, material, cell_default_walkable, walls, props:[{id, kind, cells}],
Expand Down Expand Up @@ -177,6 +189,12 @@ actor stood on the authored impassable cell while the painted prop was elsewhere

Run it against every registered candidate before it goes to the panel.

**Scope note (from the #1538 cold-agent run):** this gate is a *diagnostic instrument*, not the
promotion floor — `promote.py`'s panel-delta gate is the floor. Organic/legacy-styled incumbents
Comment on lines +192 to +193

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Don't reduce promotion to the panel delta

promote.py::evaluate_visual_gate also fails a visual nomination when the deterministic pre-gate record is missing/failing or the registered control is out of band before it checks candidate-vs-control delta. Calling the panel delta “the floor” here can make agents treat a good delta as promotable even when the pre-gate/control requirements are absent; say the coherence gate is diagnostic, but keep the documented pre-gate + control + delta promotion floors intact.

Useful? React with 👍 / 👎.

(including the deployed 8.0 crypt) fail cells of this gate identically; a cold agent should not
read a coherence FLAG on the candidate as blocking when the incumbent FLAGs the same cells. What
IS blocking: the candidate regressing coherence on cells the incumbent passes.

### 6. Style pass — the reference-images LAW + structure/dimetric locks

**Gemini instruction-edit** (`model_google-gemini-3-1-flash`) over the flux depth-CN base, with two
Expand Down Expand Up @@ -215,6 +233,12 @@ A `STRUCTURE-LOCK EXCEPTION` clause is the sanctioned escape hatch for a specifi
region (e.g. an unwanted concentric-ring pattern in ground texture) that the general lock would
otherwise force Gemini to preserve — scope it tightly to the one region, never generally.

**Clarification (from the #1538 cold-agent run):** the LAW governs *external anchors*. Gemini
img2img mechanically requires the image being edited in `referenceImages[0]` — passing the
registered BASE you are styling (which was minted from this room's own greybox) is the sanctioned,
required case, not a violation. "No referenceImages" means: no SECOND image, no external style
anchor, no other room's plate.
Comment on lines +236 to +240

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Keep the edit input out of referenceImages

This redefines “no referenceImages” to still put the registered base in referenceImages[0], but the wired Gemini edit path in generate_room.py::_run_gemini_pass sends the image being edited as image, and the camp-armB evidence literally used a style pass WITHOUT referenceImages to avoid content hijack. Following this clarification sends cold agents back through the content-anchor field for no-anchor rooms; keep the base as the edit image and reserve referenceImages for actual anchors.

Useful? React with 👍 / 👎.


**Registration gate:** edge-recall ≥0.95 for hard-edge/masonry rooms; for organic rooms edge-recall
is ADVISORY (content-blind and class-dependent — issue #1491) — use the greybox-edge overlay as
primary evidence instead.
Expand Down
Loading