Chapter 17: Making room for beauty Frozen 25 September 2026. PLAN ONLY: acceptance lines are targets, not measured results. Original source terminology is preserved. SOURCE: artifacts/beautify-0925/report.md 1: # PixelPunk: how to make it more beautiful (art direction, 25 Sep 2026 build) 2: 3: This is based on 13 fresh captures in `artifacts/beautify-0925/cap/`, seven lens reviews and a skeptic pass on each finding. I also spot-checked the key lines myself: `foliage.gdshader:87-88`, `water.gdshader:79` against `water_footprint.gd:37`, `architecture.gd:3735-3743`, `surface_body.gdshaderinc:84`, `backdrop.gdshader:89`, `world_view.gd:2846` and `tree_growth.gd:960/1907`. Nothing was run in Godot. Every "acceptance" line is a target, not a measured result. **Inferred** marks a cause that was reasoned out but not isolated. 4: 5: Item key: **Cap** = capture(s) · **Files** · **Effort** S/M/L · **Payoff** 1–5 · **Perf** = frame-cost risk · **Looks** = N night / G golden / D day / Gl glade / P photo. 6: 7: --- 8: 9: ## What already works (protect these) 10: 11: - **The core night look:** warm windows against cool stone, and HDR neon that burns white in the core (BAR, FISH MARKET) with fairy-light strings. This is the look's identity (quarter-night, lane-night). 12: - **The canal mirror:** the depth-march reflection, broken into wobbling pixel rows, with amber, pink and cyan streaks under the boat and the quay (quarter-night, lower left). It is the closest match to `artreference.png`. Any sky or water change should feed it, not cover it. 13: - **The pixel presentation:** pixel size 2 with nearest-neighbour upscale, the restrained 1-px iron railings and mullions, and the white roof verge and ridge trims. 14: - **The best skies:** the authored 05:45 blue-hour and 20:45 sunset anchors (`lighting_profile.gd`). A Night retune must not flatten them. 15: - **Masonry details:** the metric masonry contract, the arris ring, and arched openings with voussoirs. 16: - **Trees:** crowns lit as one mass (`crown_normals`), the silhouette of the new conifer, the blossom parasol, and T4b growth. Fix the gloss on top of these; do not revert the normals. 17: - **Existing motion:** the C3a lamplighter dusk, the A2 build sweep, creature reactions and deterministic captures. Every new motion must freeze under the automation hold. 18: - **Glade's separate path:** soft AgX, pixel size 1, no bloom. Canal and Glade must stay clearly different. 19: - **Day readability:** clear front, side and roof planes, with turquoise water mirroring the island (harbour-day). 20: 21: --- 22: 23: ## Fix first: defects 24: 25: **1. Camouflage blotches on every crown and shrub when it rains.** 26: - **Cap:** quarter-golden (tan discs, x280-360 y200-290), quarter-day (grey-green), quarter-night (teal), photo-golden. The discs are absent in quarter-dry and grove-day, which have no rain. 27: - **Cause (confirmed):** `foliage.gdshader:87-88` adds a hard `step(0.94, N·H)` gloss in the light's colour, times `rain*0.2`. Today's `crown_normals` turned one glint per shell into one continuous cap per crown. Pass 12 judged it only at rain 0. The "filmic toe" explanation in the review is wrong; the plate comes from an additive term on dark albedo. 28: - **Fix:** sparse per-cell glints tinted by the leaf. Hash a cell sized from `fwidth`, jitter the normal per cell by ±0.25, `step(0.75,gh)*step(0.97,N2·H)`, and scale directional ×0.12 and lamps ×0.4. Pass the tint as a varying (`test_foliage:44` forbids `*ALBEDO` in `light()`). Glade uses smoothstep. 29: - **Acceptance:** compare against a gloss-disabled build at the same rain (not against `--rain=0`). No desaturated plate, and 3% or less of crown pixels brightened by more than 10%. 30: - **Files:** `shaders/foliage.gdshader`, `tests/test_foliage.gd` · **Effort** S · **Payoff** 5 · **Perf** none · **Looks** N G D P 31: 32: **2. The island's cut side is a flat slab, brighter than its lawn, with black "beads" at the waterline.** 33: - **Cap:** harbour-day/night/golden (bottom-left and bottom-right edges), glade-day, styles-day (every stepped cell). 34: - **Cause (confirmed):** `architecture.gd:3735` draws one quad per open side in `Color("605650")` on `plain`, which has zero variance. Measured bank against lawn luma: day 137 vs ~100, night 72 vs ~46. At `:3739-3743`, three leaf lobes of `36574b` sit 8-14 cm above the water on every third cell and ink to black. 35: - **Fix now:** change the cut colour to about `43382f` (not `3a3029`, which would sink the night bank below the water). Delete the waterline lobes, or move them to the top lip as overhanging grass (`5f8a55`, flattened). 36: - **Acceptance:** bank luma no higher than lawn by day and at night; at night at least water luma + 8; at golden at most 1.6× lawn (a sunlit bank is correct there); no isolated black pixels. 37: - This is step one of Signature A. 38: - **Files:** `scripts/architecture.gd` · **Effort** S · **Payoff** 4 · **Perf** none · **Looks** all 39: 40: **3. The shoreline foam has never been able to appear.** 41: - **Cap:** every Harbour frame; bare seams at the island, the beach and the boat hulls. 42: - **Cause (confirmed):** `water_footprint.gd:37` writes at most 0.667, but `water.gdshader:79` starts its smoothstep at 0.72, so the foam at `:171` is identically zero. `lighting-and-texture-plan.md:155` records the shoreline as done, which is wrong. 43: - **Fix:** replace it with Signature A's depth-buffer rim. Until then, lower the threshold to 0.45-0.62 so the old term at least shows. 44: - **Files:** `shaders/water.gdshader` · **Effort** S (stopgap) · **Payoff** 2 as a stopgap · **Looks** all 45: 46: **4. Quay and pier faces are near-black in every preset.** 47: - **Cap:** 48: - quarter-night front quay (x1050-1550, y900-990): p50 luma 4, with 48% of pixels below 3. 49: - The same region in quarter-day: p50 15. 50: - Left pier face: luma 2 at night, 12 by day. 51: - The reference quays sit at about luma 41, matching its walls. 52: - **Cause:** mostly lighting, partly **inferred**. These faces turn from the key and get only flat ambient plus rim 0.12-0.14. Albedo is `STONE.darkened(0.2)`, and the terrain quay also takes the full damp band because `batch.ground` stays 0. Wet darkening applies only to top faces, so it is not the cause. 53: - **Fix:** 54: 1. Add a water-bounce term in `masonry_body` for upright faces within about 2.5 m of the water: `EMISSION += albedo*bounce*k*(1-smoothstep(0,2.5,wp.y-water_y))`, with `bounce = profile.water.lerp(profile.horizon,0.5)`, k about 0.12 by day and 0.18 at night, set in `sync_profile`. 55: 2. Raise quay albedo to `STONE`. 56: 3. Add the tide line (quick win 9). 57: - **Acceptance:** at night, quay luma at least 0.55× paving. 58: - **Files:** `shaders/masonry_body.gdshaderinc`, `scripts/world_view.gd`, `scripts/architecture.gd` · **Effort** S–M · **Payoff** 4 · **Perf** none · **Looks** all 59: 60: **5. Black pepper dots on the slate and cone roofs.** 61: - **Cap:** harbour-day and harbour-night (big slate roof, medieval cones), fixed in the same pixels day and night. 62: - **Cause (confirmed):** 4 mm tile insets (`masonry.gd:502-503`) expose the deck, which `architecture.gd:4635` draws in `stone`. The deck takes the paving-grout branch, and the presentation outline then inks those pixels. 63: - **Fix:** draw covered sloped faces in `plain` at the tile row's own tone, not darkened. Add per-tile value plus a lit lower lip and overlap shadow in `surface_body` kind 0. This also covers the open plan item at `lighting-and-texture-plan.md:56`. 64: - **Acceptance:** no isolated pixels more than 0.10 luma below both horizontal neighbours on the pitched roofs and on the cones. 65: - **Files:** `scripts/architecture.gd`, `shaders/surface_body.gdshaderinc` · **Effort** S · **Payoff** 3 · **Perf** none · **Looks** all 66: 67: **6. The mirror ends in a hard stepped seam, and bright sky appears below it.** 68: - **Cap:** quarter-day and quarter-golden, bottom left (x150-850, y880-1000). 69: - **Cause (confirmed):** the march runs out after 72×3 px (`water.gdshader:30-31`) and falls back to full `sky_ref`. In an orthographic mirror, nothing above about 5 m can ever be reached, so the seam traces the town's 5 m contour. 70: - **Fix:** treat running out of steps as a soft hit at the last sample, fading toward `mix(sky_ref, body, 0.3)` over 60-100% of the travel. Double the stride after step 48. Apply the screen-edge fade only to rays that leave the frame. Make the same change in `puddle.gdshader`. 71: - **Files:** `shaders/water.gdshader`, `shaders/mirror.gdshaderinc`, `shaders/puddle.gdshader` · **Effort** S · **Payoff** 3 · **Perf** none · **Looks** D G N P 72: 73: **7. The canal lawn shows a 1 m checkerboard, and its tufts sit on a lattice.** 74: - **Cap:** grove-day (adjacent-cell steps of 5-11 luma), harbour-day (right-hand lawn). 75: - **Cause (confirmed):** `architecture.gd:3627` lightens each meadow cell by `(mark%5-2)*0.009` in canal (Glade already drops this). Every tuft sits at the same in-cell offset (0.25, 0.4) in an x-aligned row, and `TUFT 789269` is lighter than the meadow. 76: - **Fix:** 77: - Use flat `GROUND_COLORS[1]` in both looks and update `canal_same` in `test_look.gd:201-210`. 78: - Give tufts a per-mark offset and row direction. 79: - Colour tufts `MEADOW.darkened(0.15)`, tipping only the tallest blade `789269`. 80: - **Acceptance:** adjacent-cell steps under 1.5 luma. 81: - **Files:** `scripts/architecture.gd`, `scripts/look_profile.gd`, `tests/test_look.gd` · **Effort** S · **Payoff** 3 · **Perf** none · **Looks** N G D 82: 83: **8. The town goes black under the best sky at 21:00 and 06:10.** 84: - **Cap:** `artifacts/feel-journey/11-C3/pkg/after-2100` (town p50 10, quay 0). 85: - **Cause (confirmed):** `SunPath.handover` drives the key to 0 (`world_view.gd:2901`), and the golden shade also drops the ambient at sunset. 86: - **Fix:** add a twilight skylight during the handover only: `+0.3*(1-lit)` ambient, with the colour lerped 0.4 toward the horizon. The presets are unchanged because lit = 1 at the anchors. Update the ambient assert at `test_time.gd:176`. This is already listed as remaining work, item 11. 87: - **Files:** `scripts/world_view.gd` · **Effort** S · **Payoff** 3 · **Perf** none · **Looks** N G 88: 89: **9. Smaller defects.** 90: - **Stars shine through rain.** `backdrop.gdshader:89` keeps 72% at rain 0.35. Change to `×(1-smoothstep(0.03,0.2,rain))`. S · 2. 91: - **"Soft contact shadows" does nothing in canal.** `world_view.gd:2846` toggles SSAO, which Compatibility does not implement. See quick win 10. 92: - **Rain splashes may draw over the painted sky** (**inferred**; two ticks in the qn sky crop). Splashes are not clipped at `SKY_HORIZON`. Quick win 7 retires them. 93: - **Odd window sizes get a non-integer upscale** with one doubled row or column (`main.gd:282, 489`). Signature E's integer-exact rect fixes it. 94: 95: --- 96: 97: ## Quick wins (effort S, high payoff) 98: 99: **1. Night sky and water in indigo-violet** (data only). 100: - **Cap:** quarter-night, harbour-night. The rendered zenith sits at luma ~31 against the reference's ~53. The skyline `212f47` is nearly the haze colour, so blocks read as mist. The water is teal `0b2744`; the reference is `29385f`. 101: - **Change in `lighting_profile.gd`, keeping key, ambient and windows:** 102: - Night: sky `1c2452`, horizon `3a3a70`, haze `322e5e`, cloud `4d4a7c`, city `161a38`, water `1a1f4a`. 103: - 22:00 anchor: sky `1a2450`, horizon `4a4278`, haze `3a3463`, cloud `55527e`, city `1c1f3c`, water `1b2250`. 104: - Nudge the 05:45 and 20:45 water to `1f2a52` and `2c2c58`. 105: - **Acceptance:** zenith luma 45-55, horizon band 60-75 with no increase, hue 230-245. 106: - Reflections and puddles follow automatically, and surfaces stay neutral (plan line 48). Show the owner a before/after. 107: - **Effort** S · **Payoff** 4 · **Perf** none · **Looks** N (and Gl at night) 108: 109: **2. Readable night mid-tones: a small ambient lift plus a violet toe grade.** This merges the light, pixel and tree lenses. 110: - **Cap:** quarter-night: 46% of pixels below luma 0.1, against 18% in the reference. 111: - **Changes:** 112: 1. Night fill 0.43→0.55 and ambient `7580bb`. Raise the 22:00, 05:45 and 20:45 fills so twilight is never darker than night. 113: 2. In `presentation.gdshader`, before the outline multiply so ink stays black: `c += tint*(toe*l*exp(-l/0.09) + black*pow(1-l,6))`. Night tint about (1.0, 0.9, 1.8). Add the keys to **all ten anchors**. Glade gets 0. 114: 3. Foliage night floor that does not scale with albedo: `EMISSION += night*vec3(0.005,0.009,0.016)`. 115: - The cause is dim lighting and dark albedo. The tonemapper is not crushing, so do not touch it. 116: - **Acceptance:** 28-33% of pixels below 0.1 at night; iron and ink still at or below 0.05; the reflection columns keep their punch. 117: - **Files:** `scripts/lighting_profile.gd`, `shaders/presentation.gdshader`, `scripts/main.gd`, `scripts/look_profile.gd`, `shaders/foliage.gdshader` · **Effort** S · **Payoff** 4 · **Perf** none · **Looks** N G D 118: 119: **3. Metal stops reading as black cut-outs.** 120: - **Cap:** quarter-day roofline and right block. Railings, sign cabinets, pipes and tank legs read as a black comb in daylight. 121: - **Cause:** `surface_body.gdshaderinc:84` sets `METALLIC 0.65`, and Compatibility has no probes for it to reflect. 122: - **Fix:** add a `painted_metal` kind (metallic 0.15-0.2, roughness 0.55) for railings, cabinets, posts and pipe bores. Tint bores `PIPE.lerp(COPPER, 0.2-0.4)` by hash, and keep the collars `metal`. 123: - Check that night railings still read as dark lines against the windows. 124: - **Files:** `shaders/surface_body.gdshaderinc`, `scripts/architecture.gd` · **Effort** S · **Payoff** 3 · **Perf** none · **Looks** all 125: 126: **4. Textless neon: bold marks instead of the "ladder" glyph.** 127: - **Cap:** quarter-night. 13 of the 14 blade signs show the same four rungs (`architecture.gd:3053-3058`), and every player-placed sign defaults to it. 128: - **Fix:** 6-8 bold 3×5 marks (cup, fish, star, moon, arrow, heart, cross, note) at `neon_cell` 0.115 m or larger, drawn by the existing FONT tube code. About 35% of seeds instead get the reference's plain double-tube bar or bar-and-dots. Add an optional `icon` param; absent means auto. Adding blades to the Harbour default scene is a separate owner call. 129: - **Files:** `scripts/architecture.gd`, `scripts/scene_state.gd` · **Effort** S · **Payoff** 3 · **Perf** none · **Looks** N G P 130: 131: **5. Medieval windows: leaded lights instead of the "crossed-out" X** (owner approval). 132: - **Cap:** harbour-night and lane-night, the hall and tower lights. 133: - **Background:** WP4 kept the X only for parity (`visual-handoff.md:5992`), not as an art decision. 134: - **Fix:** make leaded the default at `cluster_architecture.gd:376`. Update `test_building_tools:1274` and `test_cluster_walls:1040`. 135: - **Effort** S · **Payoff** 3 · **Perf** none · **Looks** all 136: 137: **6. Switch the built atmosphere on by default** (owner decision, one package). 138: - **Cap:** `fog-2100` is the most reference-like frame in the repo; no capture shows chimney smoke. 139: - **For new canal scenes and starters:** height fog 0.3 and smoke true. Glade gets fog 0.15. 140: - **Fog colour:** lit at night, `haze.lerp(horizon, 0.45*windows).lightened(0.08*windows)`. Amount `×lerp(0.45, 1, windows)`. 141: - **Smoke:** the base of each plume goes warm (`ffb070`) above lit houses. 142: - Older documents keep absent = off, so scene version 2 is unchanged. Re-bench the fog on Harbour and the artwork scene. 143: - **Files:** `scripts/look_profile.gd`, `scripts/scene_state.gd`, `scripts/height_fog.gd`, `scripts/chimney_smoke.gd`, starters · **Effort** S · **Payoff** 4 · **Perf** low · **Looks** all 144: 145: **7. Rain rings on the open water.** 146: - **Fix:** move `rain_ring()` from `puddle.gdshader:61-78` into `rain_ring.gdshaderinc` (cell 0.8 m) and call it from `water.gdshader`. Add the ring to the mirror wobble. Retire the untextured CPU splash squares, which also closes the possible sky leak. Update `test_wet.gd:115-120`. 147: - **Effort** S · **Payoff** 3 · **Perf** low (negative on CPU) · **Looks** N G D 148: 149: **8. Wet glints inside the lamp pools.** 150: - **Cap:** quarter-night and quarter-dry plazas are identical to within 1 luma. 151: - **Fix:** in `light_pool_body.gdshaderinc`, add view-aligned 1×2-4 px glint cells (8-10% lit, re-rolled about every 1.2 s) times the existing `rain*PAVING_SOAK`. 152: - **Effort** S · **Payoff** 3 · **Perf** none · **Looks** N G 153: 154: **9. Tide line and algae band on every wall standing in water.** 155: - **Fix:** add `weather_tide()` in `weathering.gdshaderinc`: `WATERLINE 0.15`, `TIDE 0.30`, `WAVE 0.08`. Mirror the constants in `weathering.gd` and add them to the parity list at `test_weathering.gd:85`. In `masonry_body` and `plaster_body`: algae tint, roughness 0.30, and a pale 1-art-px line (`×1.35`) that carries it at night. 156: - **Effort** S · **Payoff** 3 · **Perf** none · **Looks** all 157: 158: **10. Make the contact-shadow switch work in canal.** 159: - **Fix:** route it to ContactShade instead of SSAO (shade 1.2, radius 0.6). Use a **multiply** or near-black violet: the proposed `(0.11,0.086,0.21)` blend_mix would *brighten* night creases. Quantise to 3 levels and halve the strength at night. 160: - **Acceptance:** measure dense-scene p95 (estimated +0.25-0.75 ms). Show the owner a day and golden A/B; the D1 occlusion-pass verdict is still pending. 161: - **Effort** S · **Payoff** 2-3 · **Perf** low · **Looks** D G 162: 163: **11. Window cores reach the glow, and the two window families match.** 164: - **Fix:** in `window_body`, `ALBEDO *= 1+0.3*warmth*smoothstep(0.5,1,centre)` on a radial centre (not `reveal`, which saturates 13% in from the edge). Apply the `room_tone` lerp to styled glass (`cluster_architecture.gd:354`). Sun disc `×(1.6+1.2*low_sun)`, moon ×1.3. Check pixel sizes 1 and 2 so not every room blooms. Remaining work item 9. 165: - **Effort** S · **Payoff** 3 · **Perf** none · **Looks** N G 166: 167: **12. Glade gets hills instead of the grey city.** 168: - **Cap:** glade-day. 169: - **Fix:** add a `skyline` RENDER key (canal 0, glade 1). Draw 2-3 noise ridges with a tree-line fringe and sparse cottage lights at night. Warm and clear the sky in `LookProfile.lighting`. Canal stays byte-identical. 170: - **Files:** `scripts/look_profile.gd`, `shaders/backdrop.gdshader`, `scripts/world_view.gd` · **Effort** S · **Payoff** 3 · **Perf** none · **Looks** Gl 171: 172: **13. Trees on grass lose their stone plinth.** 173: - **Cap:** grove-day, glade-day. I confirmed a `TRIM` "stone" cylinder at every foot (`tree_growth.gd:960, 1907`). 174: - **Fix:** on meadow or earth, draw a low dark soil or moss collar (`4a3d30`, `plain`, 0.06 m); on paving, use `STONE.darkened(0.25)`. Keep the triangle count and update `test_tree_growth` deliberately. 175: - **Effort** S · **Payoff** 3 · **Perf** none · **Looks** all 176: 177: **14. Keep the island visible when the part tray is open.** 178: - **Cap:** harbour-night editor.png. The tray and dock cover the bottom 31% of the window, including the Fish Market and the boats. 179: - **Fix:** ease `Camera3D.v_offset` by the covered height, 0 in photo mode and automation. Replace the 0.92-alpha label slabs with text outlines. 180: - **Files:** `scripts/editor_ui.gd`, `scripts/world_view.gd` · **Effort** S · **Payoff** 3 · **Perf** none 181: 182: **15. Add an "Ambient motion: full / reduced / off" preference** (planned at `lighting-and-texture-plan.md:91`). 183: - It feeds one `motion_scale` uniform, and it gates every motion item below. Do it before any of them. 184: - **Files:** `scripts/user_prefs.gd` · **Effort** S · **Payoff** enabler 185: 186: --- 187: 188: ## Signature upgrades 189: 190: **A. "Islands that sit in water": a lit waterline and cake-slice banks** (the first thing a new player sees) 191: - **Technique, water side:** `water.gdshader` reads the opaque depth under each fragment (it is already bound, and the water writes no depth). The water column along the ray, times cos(pitch), gives the metres to submerged geometry. From that: 192: - a 1-2 render-px rim that breathes with a slow lap, coloured `mix(sky_ref, pale, 0.45) + mirror*0.35`, so it catches neon at night and sky by day 193: - a hashed, broken swash line at 3-5 px 194: - `shallow_lift` per profile: night -0.15, golden +0.2, day +0.3, glade +0.4, giving turquoise shallows over sand 195: - Glade gets a soft 2-px white line: Tiny Glade foam. 196: - **Boats:** add a submerged hull skirt (y -0.2 to 0), skipped for beached boats so they do not sink into sand. 197: - **Technique, land side:** draw the cut in the cell's own ground material, which adds no draw calls. Pass `UV.y` as depth below the bank top and add an upright branch to `ground.gdshader`, designed at about 0.09 m per art px, with every band at least 1 art px. Top to bottom: 198: - a grass lip with drips 199: - a shadow line 200: - warped soil strata with 1-px roots 201: - a rock band 202: - an algae waterline 203: - Sand gets a sand lip; Glade calms the drips and roots, and gets no CALM_LIFT on the bank. 204: - **Result:** every island, starter and user build becomes a hand-cut diorama slice standing in water. 205: - **Risk:** the rim only exists where a submerged face exists, so stepping stones and reeds get none. Watch for column crawl, and use a face-coordinate footprint, not `fwidth(wp.xz)`. 206: - **Cap to prove it:** harbour-day, night and golden, styles-day, glade-day, quarter-night boat, plus a 3-frame orbit. 207: - **Files:** `shaders/water.gdshader`, `shaders/ground.gdshader`, `scripts/architecture.gd`, `scripts/world_view.gd`, `scripts/look_profile.gd` · **Effort** M+M · **Payoff** 5 · **Perf** low (one depth read) · **Looks** all 208: 209: **B. "A city beyond the canal": layered skyline, neon bay and a living horizon** 210: - **Backdrop:** 211: - Add a landmark tower row (frequency ~6, 40% occupancy, 0.45-0.85 of the panel) with set-back crowns, masts and blinking red aviation lights, 1-px vertical cyan and magenta neon, and floor-run windows. 212: - Do the haze mixes in gamma space (0.50/0.26/0.10) so the rows separate. 213: - Scale neon ×1.8 at night so it crosses glow threshold 1.0. 214: - Paint a 2-4 px far quay with 1-px lamps. 215: - Underlight a heavier, dithered night cloud deck in violet. This is a hue change, not an additive glow; the horizon is already the brightest part of the sky. 216: - Optional life: beacons, and a neon strip cycling every 3-5 s. 217: - **Water:** squash the panel read (`PANEL_SQUASH` 0.10-0.14 at `water.gdshader:145`, gate raised to about 0.33), with row-hash jitter and dash gating. Every far light becomes a long broken column across the bay. Exclude the sun and moon from the stretched read (build it from city lights only, or × night_amount). 218: - **3D skyline ring** (`world_view.gd:624-650`, 100 near-identical boxes): 20% setback stages, 5% spires, 6-8 low-energy neon strips, and two depth tones. 219: - **Why it matters:** it answers the reference's most recognisable motif, the striped bay under a lit skyline. 220: - **Risk:** the quarter's buildings hide most of the panel. Judge on harbour-night and the photo lens. Keep panel lights below the town's windows (plan line 90). 221: - **Files:** `shaders/backdrop.gdshader`, `shaders/sky.gdshaderinc`, `shaders/water.gdshader`, `scripts/world_view.gd` · **Effort** M–L · **Payoff** 5 (Harbour) · **Perf** low · **Looks** N (G and D silhouettes) 222: 223: **C. Trees lit by every lantern** (the reference's defining night image) 224: - **Problem:** only 16 engine lights exist, and each scene-wide foliage MultiMesh gets at most 8. `crown_normals` also forces underside normals to y ≥ 0 (`architecture.gd:2778`), so a lamp below can never light a crown. 225: - **Technique:** 226: - A global `foliage_lamps` texture: the 32 nearest emitters, with neon in its own colour and windows at 0.4. 227: - CPU-binned into an 8×8 grid of 4 indices, so each fragment loops over at most 4 lamps. 228: - Shade with a wrap that ignores the bent normal: `band3(0.55+0.45*dot(wn,L))` × banded attenuation, applied to the *pre-darkening* vertex colour. 229: - Drive it from `profile.lamps` and the dusk sequence, so leaves light when their lamp does. 230: - Skip non-directional lights in `light()`. Ivy comes free. 231: - **Ship with it:** 232: - ramps shading toward cool darks (`1c2c36`, plum `3b2140` for blossom) instead of black 233: - the outline ring on the shadow side only (reading `sun_direction`, item 11), with OUTLINE 0.6 at 0.40 234: - clustered terminators through per-cell pseudo-normals, 4 tones, and footprint-snapped cells. The reviewer's `fract(wp.y)` version would stripe every crown; do not use it. 235: - **Risk:** medium perf. Measure `dense.json` and `trees/style/forest.json` p95 with `--disable-vsync`, **and run on Windows** before claiming it fits the budget. 236: - **Files:** `shaders/foliage.gdshader`, `scripts/world_view.gd`, `scripts/tree_growth.gd`, `scripts/architecture.gd`, `tests/test_foliage.gd` · **Effort** L · **Payoff** 5 · **Looks** N G Gl P 237: 238: **D. A lived-in town: room stories and a derived roofscape** 239: - **Room stories:** a new `room_story.gdshaderinc` in `window_body`, keyed from the UV2 seed that is already stamped: 240: - lamp hot-spot, side curtains in a 5-colour palette, plant silhouettes, dim rooms, cool TV rooms 241: - a solid pull-down blind (slats only at pixel size 1) 242: - a diagonal glint by day 243: - Gate it away from the glass balustrades, which share the `glass` material: split a `pane_glass` key or flag UV2.y. Mirror the story on the CPU emitter without consuming rng. 244: - This delivers `lighting-and-texture-plan.md:78`. 245: - **Roofscape grammar:** a derived "Roofs" section in `composition.gd`, cached and not saved, with a `roof_dressing` opt-out param. 246: - A crown accent (mast or tank) on each cluster's tallest roof. 247: - Then clamp(A/7, 1, 6) style-palette pieces packed inside the cap. 248: - Ivy spill over the highest-drop parapets, 0.35× the drop, as tapering curtains. 249: - Everything drawn as clutter synths into the existing MultiMeshes, reusing existing kinds. 250: - **Later, same budget:** window boxes and Juliet rails per bay column. Derived downpipes and vent stacks. 251: - **Risk:** foliage instance count and release time (Harbour release is already 26.7 ms against a 25 ms target). Test `dense.json` p95. 252: - **Cap to prove it:** quarter-night right block and roofs, styles-day modern block, harbour-day. 253: - **Files:** `shaders/room_story.gdshaderinc`, `shaders/window_body.gdshaderinc`, `scripts/composition.gd`, `scripts/world_view.gd`, `scripts/architecture.gd`, `scripts/cluster_architecture.gd` · **Effort** M (stories) + L (roofs) · **Payoff** 5 · **Perf** medium · **Looks** all 254: 255: **E. Ink and light edges, with pixels that stay fixed to the world** (the pixel-art signature) 256: - **Edge pass:** `edge_ink.gd` cloned from ContactShade at priority 108, premultiplied blend, 5 depth taps at art resolution, second differences. 257: - Silhouette **ink** only on depth jumps larger than max(8·mpp, 0.8 m), so shells inside crowns and brick relief stay un-inked. 258: - A lit **rim** on convex creases deeper than max(1·mpp, 0.06 m): copings, sills, quay lips, nosings, ridges. That threshold keeps proud bricks and tile laps out. 259: - The keys go into all LightingProfile anchors. Glade gets ×0.3 and ×0.4. 260: - Lower the luma outline only after A/B captures. 261: - **Pixel stability:** snap the orthographic camera to the art-pixel grid and scroll the finished frame by the remainder. Use a 1-art-px margin and an integer-exact rect, gated to a live camera so captures keep their exact frames. 262: - **Risk:** glass balustrades may show ink from the walls behind them. This changes the default look, so it needs owner A/B sign-off. 263: - **Cost estimate:** 0.1-0.4 ms (unmeasured). 264: - **Files:** `shaders/edge_ink.gdshader`, `scripts/edge_ink.gd`, `scripts/world_view.gd`, `scripts/main.gd`, `scripts/lighting_profile.gd` · **Effort** L + M · **Payoff** 4 · **Looks** all 265: 266: --- 267: 268: ## Polish backlog 269: 270: - **Golden-hour pass:** 271: - pink Belt of Venus and Earth-shadow band when facing away from the sun, sun-side glow when facing it, mirrored in `sky_ref` 272: - golden fog 0.78→0.62, haze `ecb898` 273: - city ×(1-0.4·low_sun) toward `5e5f7e` whatever the facing 274: - golden lawn lift, because the meadow goes near-black (luma 52) under a low key 275: - Items 7 and 11. M · 4 · G P Gl. 276: - **Rain in art pixels:** a 1-art-px-wide, 6-8 px drop shader with a zoom-scaled box (about 60% of today's drops never rasterise), then a lit veil pass that takes neon and lamp colour. M · 4 · N G D. 277: - **Night water ripples:** a world-anchored, screen-aligned crest and trough dash basis, 3-step posterised swell, calm slicks, `ripple_contrast` (Glade 0.5). M · 4. 278: - **Canal stone toward violet-grey** (`STONES`) with calmer upper storeys (`wall_calm`). Owner A/B; check first that night does not turn purple. M · 4. 279: - **Lawn pixel tone bands:** quantised drifts with a dithered border, plus a mid-scale turf octave that survives zoom. Canal only. M · 4. 280: - **Ivy:** row stagger, JITTER 0.10, *larger* leaves (0.95-1.2), lobe normals bent flat so the outline falls on the patch silhouette, growth-order tint. M · 4. 281: - **Night lights breathe:** a wall-time `light_time` uniform, ±10-12% breathing on pools, OmniLights and fog (not on the clipped glass), and 1 in 10 neon as faulty tubes, applied after the `move_toward` easing. The same uniform fixes the stopped-clock dim sign (`visual-handoff:1901`). M · 4 · N. 282: - **One wind:** rigid whole-pixel crown shifts with a bending trunk ring, flag and laundry free-edge shear, smoke and rain slant, water cat's-paws. Drive it from a weather value, not the zoom-driven audio wind. Judge only from a recording. L · 4. 283: - **Pixel halo ring** replacing the 49-tap LDR bloom (magnitude-weighted, ink guard × lamps). Leave engine glow as is by default. S · 3 · N G. 284: - **Presentation post at art resolution** instead of window resolution. Cuts the post cost by pixels², which matters on Windows iGPUs and fullscreen. S–M · perf. 285: - **Art-pixel density follows the UI scale in fullscreen** (`effective_pixels`), as a preference toggle after an A/B. S · 3. 286: - **Cables as `PRIMITIVE_LINES`** so festoons are continuous 1-px wires. M · 3. 287: - **Irregular paving slabs** through a shared `paving_grid.gdshaderinc` (puddles still follow stones), with a lighter mauve `TERRACE`. M · 3. 288: - **Harbour replanting:** move 4-5 hidden trees into view, add conifers behind the round tower, group the shrubs. An owner and baseline refresh. M · 3. 289: - **Spill seeds** so ivy pours over planters and balconies (after the ivy grid fix). M · 4. 290: - **Tilt-shift and photo DOF on the art-pixel grid** (nearest, snapped centres). Highlight weight carried in alpha so bokeh is square. S · 2. True depth needs a photo-only CoC SubViewport. L · 3. 291: - **Cloud shadows** crossing the island by day (a HeightFog-style quad, 2-step noise). M · 3 · D G. 292: - **Water receives the sun's shadow** (a screen-space march toward the sun). M · 3 · D G Gl. 293: - **Speck guard in the outline**, 8-neighbour version. Largely moot once defect 5 lands. S · 2. 294: - **Reflection streak HDR core** (`reflections.gdshader:119`). S · 2. 295: - **String lights:** thin the quay rows into separate swags; keep lawn and plaza spans. Taste call. S · 2. 296: - **Beacon as a tower param** (not a new kind) as a Harbour focal point. Owner mock first. M · 3. 297: - **Boats bob in whole art pixels** at lane zooms. S–M · 2. 298: - **Placement dust and splash puffs** on release. M · 3. 299: - **More fireflies and moths at night** (S · 2). A pigeon flock only at lane zooms. 300: - **Rainy days read as overcast.** Changes a stated rule, so it needs the owner. S · 2. 301: - **Pixel body font and integer UI scale.** Owner. M · 3. 302: 303: --- 304: 305: ## Considered and rejected 306: 307: - **An additive glow above the city horizon.** The horizon is already the brightest part of the sky, so the fix is hue and cloud deck. 308: - **Retuning the filmic tonemapper.** Godot's filmic slightly *lifts* lows, so the blacks come from scene values. 309: - **1-px far windows to dodge the outline.** The outline still rings them. Keep window luma within 0.14 of the facade instead. 310: - **Expecting panel lights to streak "for free".** The mirror is point-for-point; the squash in Signature B is needed. 311: - **Height-fog hour scaling as the fix for golden milkiness.** The cause is depth fog and water haze. 312: - **Photo DOF as a 3D quad reading `hint_screen_texture`.** It drops water and every transparent pass. 313: - **Raising the whole boat hull.** It sinks beached boats. 314: - **Cut colour `3a3029`.** The island vanishes against night water. 315: - **`darkened(0.05)` alone for the quays.** That is only +19% luma; it needs the bounce term. 316: - **Story shader in `glass_body` without a gate.** It would paint curtains on railings. 317: - **7-slat blinds at pixel size 2.** They alias. 318: - **5×7 pictograms at a 0.045 m cell.** Sub-pixel. 319: - **Violet blend_mix contact shade.** It brightens creases. 320: - **Shrinking ivy leaves.** It widens the grid gaps. 321: - **Dropping string-light spans over meadow.** It cuts the Harbour's best night swags. 322: - **A beacon as a new KIND.** Heavy plumbing, and older builds would reject the files. 323: - **Narrowing engine glow level 3 by default.** It touches the protected neon cores. 324: - **A viaduct train on the horizon.** Close to the traffic exclusion; beacons and neon carry the idea without it. 325: - **Gusts from `scenery_audio`'s wind.** That wind rises with zoom-out. 326: 327: --- 328: 329: ## Suggested order 330: 331: Take the packages one at a time, one Godot at a time, each with before/after captures at the listed views and dense p95 with `--disable-vsync`. I estimated the package sizes from the item efforts; nothing is measured. 332: 333: | # | Package | Contents | Depends on | Effort | Proves it | 334: |---|---|---|---|---|---| 335: | P0 | Defect sweep | Defects 1, 2, 5, 6, 7, 9 (stars), and 3 as a stopgap | — | ~2-3 days S | quarter-golden/day/night crowns vs gloss-off; harbour-day/night/golden, glade-day, styles-day bank; hd/hn roofs and cones; qd/qg bottom-left; grove-day | 336: | P1 | Night palette and values | Quick wins 1, 2, 3; defect 4 (water bounce and tide line, quick win 9); defect 8 | P0 | ~3 days S | quarter-night, harbour-night, lane-night greyscale histograms; time-pass 05:45/20:45/21:00 must still look as good; `test_time` | 337: | P2 | Owner decisions batch | Quick wins 5, 6, 10, 13; show A/Bs | P1 (fog colour uses the new haze) | ~2 days S | harbour-night, quarter-night, fog-2100 view; Harbour and artwork bench | 338: | P3 | Signature A | Water's edge and cake-slice banks, with quick win 7 rain rings | P0 bank colour, P1 water palette | M+M | harbour-day/night/golden, styles-day, glade-day, quarter boat, 3-frame orbit | 339: | P4 | Signature B | Skyline, neon bay, horizon life, 3D ring; then the golden-hour pass | P1 palette | M–L, then M | harbour-night, photo-golden, harbour-golden, quarter-night | 340: | P5 | Quick wins 4, 8, 11, 12, 14 plus the pixel halo | Parallel-safe small items | P1 | ~3 days S | lane-night sign, qn plaza, glade-day, editor.png | 341: | P6 | Signature C | Lantern-lit trees, crown clusters, cool ramps | P0 gloss fix, P1 night floor | L | qn_trees_lamps view, quarter-dry, grove-day, glade-day; Windows perf run | 342: | P7 | Signature D | Room stories, then the roofscape grammar, then window boxes, downpipes, ivy and spill | P3 (terrace and bank look), ivy fix before spill | M + L | quarter-night right block and roofs, styles-day, `dense.json` p95, Harbour release time | 343: | P8 | Motion | Quick win 15 first; then night breathe, rain in art pixels, then wind | Quick win 15 | M, M, L | 10 s recordings at pixel size 2, not stills | 344: | P9 | Signature E | Edge ink and rim, then camera snap and art-resolution post | After P1-P7, so ink is judged on final values | L + M | quarter night/golden/day, Harbour, lane, grove in colour and greyscale; pan recording | 345: SOURCE: docs/beautify-plan.md (execution order and estimates supersede the report order) 155: | Stage | Name | Parts | Depends on | Likely (h:mm) | High (h:mm) | Owner gate | Cumulative likely | 156: |---|---|---:|---|---:|---:|---|---:| 157: | P0 | Defect sweep | 5 | none | 10:52 | 20:36 | None required; P0 information sheet; D3-D5 optional | 10:52 | 158: | P1 | Night palette and values | 7 | P0 | 12:03 | 23:17 | G1 after P1c, G2 after P1f (non-blocking); D7 before P1f | 22:55 | 159: | P2 | Owner-decision batch | 5 | P1; D9-D12 | 11:40 | 20:46 | Yes/no on QW5, QW6, QW10, QW13 before start (blocking); stage sheet | 34:35 | 160: | P3 | Signature A: islands that sit in water | 4 | P0, P1 signed off | 9:37 | 16:45 | Combined sheet; needed before P4b and any export | 44:12 | 161: | P4 | Signature B: skyline, neon bay, golden hour | 4 | P1, P2, P3 | 10:12 | 17:48 | Night sheet after P4c, golden sheet after P4de; D19 | 54:24 | 162: | P5 | Small items | 7 | P1, P4 | 14:24 | 26:18 | D15 before P5a, D16 before P5e; stage sheet | 68:48 | 163: | P6 | Signature C: trees lit by every lantern | 5 | P0, P1 | 10:45 | 19:21 | P6a sheet before P6d; owner runs the Windows kit | 79:33 | 164: | P7 | Signature D: a lived-in town | 9 | P1, P3, P5 | 17:59 | 33:37 | Room stories after P7b; release limit before P7d; roofscape sheet | 97:32 | 165: | P8 | Motion | 14 | P2, P3, P4, P5, P6 | 31:05 | 54:45 | D17 before P8a; D27, D28, D29 inside, kept off the critical path | 128:37 | 166: | P9 | Signature E: ink and light edges, pixels fixed to the world | 5 | P1-P8 | 11:01 | 19:53 | Ink default after P9b; live pan session at close (blocking) | 139:38 | 167: | P10 | Polish backlog (optional) | 12 | P9 | 21:44 | 42:29 | Item selection; per-item A/Bs | not in the core | 168: 169: Likely and high include each stage's overhead (tables under each stage). "High" is the sum of every 170: part's high figure: a ceiling, reached only if every step of every part runs long. 171: 172: **Totals for the core plan (P0-P9, 65 parts, 16 of them with a second review).** 173: 174: | Figure | h:mm | 175: |---|---:| 176: | Parts, likely | 113:46 | 177: | Stage overhead, likely | 25:52 | 178: | **Agent and machine time, likely** | **139:38** | 179: | Contingency 15% (rechecks and handoff checks at high effort, escalations, API 529s and usage limits) | 20:57 | 180: | **Wall-clock planning figure** (likely + contingency, excluding owner turnaround) | **160:35** | 181: | Realistic bad case (likely + 35%: two escalations per stage, a G1 retune, more outages) | 188:30 | 182: | Ceiling (sum of every high figure) | 253:06 | 183: | Optimistic bound (every part at the historical median, section 1) | about 91:00 | 184: | Optional, not in the core: P4f ripples | 1:49 (high 3:17) | 185: | Optional, not in the core: P8a2 motion clock for existing motion | 1:47 (high 3:16) | 186: | Optional, not in the core: P10, all items in three sub-batches | 21:44 (high 42:29) | 187: 188: **Owner turnaround, separately.** About 17 owner sheets or sessions across the core (P0 sheet, G1, 189: G2, P2, P3, P4 night, P4 golden, P5, P6a, P6 stage end, P7 room stories, P7 roofscape, P8 recordings 190: and three P8 verdicts, P9 ink, P9 live pan) plus the Windows kit run and the pre-P2 sitting. Most are 191: reviewed while the next part runs (section 7). The blocking ones are the pre-P2 answers (D9-D12; 192: none if collected during P0-P1), the P3 verdict before P4b (about 2 h of P4a work in hand), and the 193: P9 live pan session. Owner time itself is not estimated. 194: 195: **Critical path.** Every stage and part is on it, because one Godot runs at a time: 196: P0 -> P1 -> P2 -> P3 -> P4 -> P5 -> P6 -> P7 -> P8 (I, II, III, IV) -> P9. The owner gates that can 197: lengthen it are, in order: D9-D12 before P2, D18 before P4b, D22 before P6d (P6b and P6c cover about 198: 4 h), D28 before P8-IV (P8-III covers about 15 h), and D31 at the close of P9. Within P1 the fill and 199: toe (P1c) gate the quay ratio (P1d); within P3 and P4 the water shader is edited by P3a, P3b, P4b, 200: P4c, P4de and P8i2 in that order. 201: 202: **Calendar.** At 160:35 of wall clock, running around the clock with `caffeinate` is about 203: 6.7 days; at about 16 running hours a day, about 10 days, plus owner turnaround and 204: any stoppage. The feel plan's stages ran 34 min to 5 h 14 each; this plan's stages run 205: 9:37 to 31:05 (P8 as four sub-stages). 206: 207: ## 4. Milestones 208: 209: | After | Cumulative likely | What the owner can look at | Exports | 210: |---|---:|---|---| 211: | P0 | 10:52 | The P0 information sheet: no gloss plates in rainy crowns, a darker island cut with no black beads, no lawn quilt or tuft lattice, clean slate roofs and cones, a soft mirror edge at the bottom left, no stars through rain. | none | 212: | P1 | 22:55 | The new default night: indigo-violet sky and water, about 30% of pixels below luma 0.1 instead of 46%, a lit town through the 21:00 and 06:10 handover, lit quays with a tide line, painted railings and pipes by day. First-launch Harbour changes noticeably. | M1 (P1g), if the owner wants builds here | 213: | P2 | 34:35 | New scenes and starters open with lit violet mist and warm smoke; leaded medieval lights; a crisp contact shade in canal by day; soil collars at tree feet. | M2 | 214: | P3 | 44:12 | Islands sit in water: a lit rim, swash and shallows, rain rings on the canal and bay, cake-slice banks. | none (waits for P4) | 215: | P4 | 54:24 | The city beyond the canal and the neon bay at night; the golden sky that knows where the sun is. | M3 (Signatures A and B) | 216: | P5 | 68:48 | Neon marks, rainy plaza glints, glowing window cores and sun disc, Glade hills, the tray no longer hiding the island, the pixel halo. | M4 | 217: | P6 | 79:33 | Trees lit by every lantern, clustered crowns; first Windows run with results on disk. | Windows perf kit builds (P6e) | 218: | P7 | 97:32 | Room stories in lit windows, a derived roofscape, ivy spill, window boxes, pipes and vents. | none (release-time numbers go to the owner) | 219: | P8 | 128:37 | Motion: the preference, breathing lights, pixel rain and veil, one wind, boats, puffs, fireflies, cloud shadows. Recordings, not stills. | M5 | 220: | P9 | 139:38 | Ink and rim edges; a cheaper art-resolution post; pixels fixed to the world while panning (a live session on this Mac). | M6, final | 221: | P10 | +21:44 if all run | Whatever items the owner selects. | M7 after the last sub-batch | 222: 223: Each export milestone backs up `build/macos` and `build/windows` first, runs `tools/build.sh` and 224: the Windows preset with the pinned 4.6.3 engine, rebuilds the Windows zip in the layout the owner 225: received on 25 September (with START HERE), smoke-tests the exported Mac app, records hashes, and 226: says in the entry that the Windows build was exported and not run (except where P6e's kit ran it). 227: The owner may drop any milestone except M6; each is 30 min likely, 45 high. 228: 229: ## 5. Stages 230: 231: ### P0 Defect sweep (step `18-P0`) 232: 233: **Goal.** Rainy crowns lose their camouflage plates. The island's cut side is darker than its lawn 234: with no black beads at the waterline. The canal lawn has no 1 m quilt and its tufts no longer sit 235: on a lattice. Slate roofs and cones lose their pepper dots. The canal mirror fades out instead of 236: ending in a stepped seam over bright sky, and stars no longer shine through rain. 237: 238: **Depends on.** Nothing. P0a runs first because every later acceptance line is measured with its 239: kit. 240: 241: **Owner gates.** None required: every item fixes a defect. Before P0c, optionally: waterline lobes 242: moved to the top lip as overhanging grass (default) or deleted, and what quay sides keep (default: 243: one moss tuft on the coping). Before P0e: the foam stopgap now (default, about 10 min) or left to 244: Signature A. The P0 information sheet also shows the changes existing scenes will see: new tuft 245: positions, flat lawn, darker bank, and no stars at the default rain 0.35 (the report's fade curve; 246: revert is one line). 247: 248: **Stage total:** parts 8:28 likely (16:58 high) + overhead 2:24 (3:38) = **10:52 likely, 20:36 high**; cumulative 10:52 likely after this stage. 249: 250: | Stage overhead item | Likely | High | 251: |---|---:|---:| 252: | Stage snapshot `18-P0`; `beautify-stage.js` copied from `feel-stage.js` (paths, Opus high in every role, report-based role text, syntax check) | 40 | 60 | 253: | Part snapshots and journal reading, 5 parts x 5 min | 25 | 40 | 254: | Handoff check (Opus high) | 7 | 10 | 255: | Journey captures and count comparison | 10 | 15 | 256: | Stage-end full suite on the final code | 12 | 18 | DECISIONS AND RISKS 2987: ## 6. Owner decisions 2988: 2989: Collect D1-D17 in one sitting during P0 or P1, so nothing blocks at P2. D18-D31 need evidence from 2990: the parts. Only D18 (before P4b) and D31 (P9 close) can hold the pipeline; for the others, later 2991: parts run while the owner looks (P8g2 can move after P8k if D29 is slow). 2992: 2993: | # | Decision | Needed before | Default if the owner does not answer | 2994: |---|---|---|---| 2995: | D1 | Run on mains power with Low Power Mode off and `caffeinate` for the whole run | P0 | Run as the Mac is; figures already assume battery and Low Power Mode; the flaky check is recorded as known | 2996: | D2 | Allow a Fable 5.1 second opinion on measuring parts instead of a second Opus review | P0a | Second Opus review, fresh context (as budgeted) | 2997: | D3 | Waterline lobes: moved to the top lip as overhanging grass, or deleted; what quay copings keep | P0c | Moved to the lip; quays keep one moss tuft on the coping | 2998: | D4 | Foam stopgap now (about 10 min), or leave it to P3a | P0e | Do it; P3a replaces it | 2999: | D5 | Stars at the default rain 0.35: the report's fade (gone by 0.2) or a gentler curve | P0 sheet | Report's fade; revert is one line | 3000: | D6 | Run P1d-P1f while G1 is judged, or stop after P1c | P1d | Run on | 3001: | D7 | Painted metal: a flag on the existing metal material, or a new `painted_metal` material (+30-45 min, part bench) | P1f | Flag | 3002: | D8 | Builds at the P1 milestone (M1), and at M2-M5 | P1g, each milestone | Yes at every milestone; M6 always | 3003: | D9 | QW5 leaded windows (reverses the WP4 parity X); the "under 0.6 m transom only" rule | P2 | Yes to leaded; no to the transom-only rule | 3004: | D10 | QW6 fog and smoke on for new scenes and starters; where the defaults live; whether `artwork.json` gains the keys | P2 | Yes; starters, SampleScene and new canvas only; `artwork.json` unchanged (flags used for captures) | 3005: | D11 | QW10 canal contact shade (also closes the pending D1 occlusion verdict) | P2 | Yes, with the measured cost reported | 3006: | D12 | QW13 collar: follow the ground finish (report) or one soil collar everywhere (P2a then merges into P2e) | P2 | Follow the finish | 3007: | D13 | Beached boats with the hull skirt: no lift, lift 0.2 m, or an afloat-only skirt mesh | P3a | No lift | 3008: | D14 | Blinking beacons and ring neon before the motion preference; does the skyline switch hide the 3D ring | P4a | Steady until P8a; yes, it hides the ring | 3009: | D15 | Neon mark cell size; keep an `icon` param | P5a | Drop the frame tubes on marked blades; no `icon` param | 3010: | D16 | Tray: reframe while open, or a fixed dock offset | P5e | Dock offset | 3011: | D17 | Reduced and Off also still existing motion (adds P8a2, about 1 h 47); placement puffs follow the preference | P8a | New terms and P5b glints only; puffs off under Off | 3012: | D18 | P3 combined sheet (rim, night shallows, rings, banks) | P4b | Hold P4b; P4a runs meanwhile | 3013: | D19 | P4f night ripples, go or no-go | end of P4c | No | 3014: | D20 | P4b glow at 05:45 and 20:45: half tint or zero below windows 0.9; 06:45 anchor retune | P4 night and golden sheets | Half tint; 06:45 unchanged | 3015: | D21 | Harbour stone promenade (architecture lens) | any | Not planned | 3016: | D22 | P6a cool undersides and shadow-side ring (changes the 25 September tree style) | P6d | Keep the approved black undersides (one constant); P6c and P6d go ahead on the stamp | 3017: | D23 | Run the P6e Windows kit on the PC; is a low-end or iGPU Windows machine available | P6 close | Kit run on the RX 7900 XTX PC; iGPU recorded as untested | 3018: | D24 | Room stories on by default (G after P7b) | P7c | On | 3019: | D25 | Release-time limit for P7 (Harbour animated release 26.7 ms today, target 25) | P7d | +2 ms, memoised per owner | 3020: | D26 | Editor toggles for `roof_dressing`, `window_boxes`, `services` (15-20 min each) | P7c | No toggles; README note | 3021: | D27 | Faulty neon tubes on by default | after P8b | On at the safe rate (at most 3 flashes per second), off under Reduced | 3022: | D28 | Rain veil (P8e, P8f), lamp-lit drops, or stop | after P8d | Veil | 3023: | D29 | Crowns in the wind: keep, or sway 0 at pixel 2 (drops P8g2) | after P8g1 | Keep if no crawl or tear in the recordings; otherwise sway 0 | 3024: | D30 | Ink and rim on by default; luma-outline level | after P9b | Keys 0 (pass hidden) | 3025: | D31 | Live pan session on this Mac | P9 close | Required; the stage stays open until it happens | 3026: | D32 | Which P10 items run; each P10 look A/B; P10o font and download permission | P10 | P10 not run | 3027: | D33 | Not planned: pigeon flock at lane zooms, textless blades on the Harbour default scene, TV flicker in cool rooms | any | Not planned | 3028: 3029: ## 7. Risks, and how the plan absorbs them 3030: 3031: | Risk | Where | How the plan absorbs it | 3032: |---|---|---| 3033: | Same-family review finds fewer defects (amendments 14, 16) | every part | Second Opus review, briefed adversarially, on every measuring part (16 parts in the core); a zero-finding review of a part over about 200 lines is repeated (small expected cost, in the fix row) | 3034: | The measuring kit is wrong | P0a onward | Kit validated against the report's own numbers; two reviews; determinism check | 3035: | API 529s and usage limits, 1-2 h each | whole run | About one per 10-12 h of agent time, so 12-14 events at 1-2 h over 140 h. The 15% contingency (21 h) covers about 14 events at 1.5 h; beyond that it is wall clock on top | 3036: | Escalated fix (+50 min each) | P0b, P1c, P6c, P7d, P8g1, P9e most likely | Not in the likely figures; covered by the contingency. Two per stage is the lead's bad case | 3037: | Owner declines a look after later parts built on it | P1 G1, P6a, P7b, P9b, P10 | Cheap reverts designed in (constants, profile keys, snapshots); a decline costs a revert pass of about 45 min, not estimated | 3038: | Owner turnaround | every gate | Non-blocking by order where possible: P1d-P1f during G1; P4a during the P3 verdict (about 2 h of work); P6b-P6c during the P6a verdict (about 4 h); P8-III (about 15 h) during the veil decision. Blocking gates: D9-D12 before P2 (collected early), D18 before P4b, D31 at P9 close | 3039: | Suite flake (`test_creature_reactions` re-plan) | every suite | Continuing runner (`tools/suite_all.sh`) never stops at a failing suite; one rerun; recorded as known. `tools/test.sh` stops at the first failure (set -e) and is not used for the full suite | 3040: | Another session starts Godot | every run | Capture and suite scripts wait for a free Godot and retry a killed run (exit 143/137); the orchestrator holds the Godot slot for each part | 3041: | Inherited failures from the untested 25 September UI change | first suite | P0a runs a pre-flight suite on the `18-P0` tree and records them | 3042: | Parts near the context limit | P6c, P6d, P7b, P7f, P9a, P4de | Stop rules written into the scopes; split rather than add scope in orchestrator notes | 3043: | Protected looks drift (canal mirror, neon cores, 05:45 and 20:45 skies, Glade separation, approved trees) | P1, P3, P4, P5f, P6, P8i2, P9 | Protected-look crop sheet at every stage end; noise pairs for every "unchanged" claim | 3044: | Windows cost and correctness unmeasured | P2d, P5f, P6c, P8e-f, P8l, P9a, P9c | P6e runs a reusable kit on the PC once; every other entry says "exported, not run"; iGPU untested throughout | 3045: | Disk and journey size | P8 | Recording frames moved to the Trash per sub-stage; the journey digest (104 MB) is viewable only on this Mac | 3046: | Start-up warm-up grows with larger foliage shaders and new materials | P6c, P6d, P7a1, P7f, P8h, P9a | `--startup-report` before and after; `test_warmup` coverage for every new material and overlay | 3047: 3048: **Not estimated.** Owner time and turnaround; revert passes after a decline; escalations beyond the 3049: expected fix (inside the contingency only); outages beyond the contingency; the P1 G1 retune part 3050: (about 1 h 50) if the owner asks for one; P4f and P8a2 unless chosen; P10 unless selected; editor 3051: toggles for the new params; the TV flicker; the pigeon flock; a Windows iGPU run; any work the