PIXELPUNK JOURNAL / CHAPTER 07 Editorial evidence captured 23 September 2026. These are historical project notes. Status and next-step instructions in these excerpts belong to their original development session. Performance and test results quoted here are from those sessions, not tests performed by the journal build. ======================================================================== docs/visual-handoff.md | original lines 255–295 ======================================================================== **Feel Q1c Owner follow-ups: stair options — part c (23 September 2026):** A placed stair now has two optional params, set in the inspector like a bridge's Design (owner, 23 September 16:10: "options for floating stairs, supported stairs, and bannistered stairs"). - **Structure** (`stair_body`): "supported" (default) is what each stair drew before. "floating" is separate treads, `Architecture.float_thickness` = min(`FLOAT_TREAD` 0.12, 0.6 × rise) thick, so the risers stay open, with nothing under them. On the helix they are slabs cantilevered from the wall, keyed 5 cm into the facet face (`helix_float_treads`), with no soffit and no cheek. On a straight flight they sit on one `SPINE` 0.16 m beam, steel or timber by style (`float_flight`). A floating straight flight whose every tread has a building face within `WALL_REACH` 0.25 m of its edge keys the treads 5 cm into that wall and has no spine. This is read by `Architecture.flight_wall`, which is also that stair's `connection_context`, so moving the wall redraws the stair. - **Railing** (`stair_rail`): "auto" (default) is the old rail. That is the iron posts and rails on a straight flight (`flight_rails` repeats them for floating) and the style guard on the helix. Over floating treads a parapet stands on the nosing line, closed underneath. "banister" is a turned baluster on every tread (two where the going exceeds 0.42 m), a continuous handrail 0.9 m over the tread line and a newel at the foot and at the head. It runs on both sides of a straight flight, on the open side only of a wall-keyed one, and on the outer edge only of the helix. Material (`stair_look`): timber for japanese, stone for canal, victorian and medieval, steel for modern, iron when the stair reaches no building. "none" means no guard. All six combinations build. - The approach flight into the helix follows its stair. Terrace, lifted-foot and other derived flights still call `stair_flight` and have no options. `form_of` and `stair_wrap` do not read the params. - Save version stays 2. `validate_document` refuses unknown values. A stair drawn with the tool after choosing non-default options stores them; the defaults store nothing. Selecting a stair resets the options shown to the defaults first (`main.select_id`). - **Review cost fix:** `DioramaState.bounds` of a wound stair is now the analytic annular sector from the helix start to the landing end. It contains the old sampled box and is under 1 mm larger. `WorldView._sync_clusters` now takes every body's box once per sync instead of once per cluster member. - **Bounds fix found by the new test:** a default straight flight's first tread reached 3 cm under its old 0.2 m box (18 vertices outside on the test flight). Stairs now use `below` 0.3; floating uses 0.55 with margin 1.35, and banister uses `above` 1.3. This changes boxes only, not meshes. Files: `scripts/architecture.gd`, `scripts/scene_state.gd`, `scripts/editor_ui.gd`, `scripts/main.gd` (`connection_candidate`, `select_id`), `scripts/world_view.gd` (`_sync_clusters` only; creature section and `scripts/mallard.gd` untouched), `tests/test_meet.gd`, `tests/test_ui.gd`, `README.md` (item 3). Pre-edit copies are in `artifacts/feel/06-B2q/c-bak/`. Snapshot: `build/backup-feel/06-B2q/`. The pre-part tree is `build/backup-feel/06-B2q-d/`. ======================================================================== docs/visual-handoff.md | original lines 395–442 ======================================================================== **Feel Q1b Owner follow-ups: helical tower stair — part b (23 September 2026):** A stair up to a round tower's roof that would run into its wall now winds round the shell as one continuous helix (owner, 23 September 16:00: "curve up and around like a screw, seamlessly to the outside"). It replaces the B2a square wrap of flights, corner landings and pillars. It is carried by the tower: there are no landings on the way and no posts to the ground. The corbel attempt stopped at 16:01 is not in this tree; from `artifacts/feel/06-B2q/b-stopped/` only its foot-near-the-band sites were reused, as tests. - **Rule** (`DioramaState.stair_wrap`, same gate as B2a, so the same stairs wind): - The inner edge is keyed `WRAP_KEY` 0.05 m into the wall's facet face. - The outer edge stands `WRAP_WIDTH` 1.2 m out from the shell. - Treads fall every `WRAP_GOING` 0.28 m on the walking line, R + 0.6. Every riser is the same height, from the foot to a curved landing, one `WRAP_WIDTH` long and centred on the ray to the head. From the landing, B2a's level deck crosses the roof edge through the opening `wrap_crossings` cuts. - Choice of helix: both directions and 0 to `WRAP_TURNS` extra turns are scored. It keeps the one whose slope on the walking line is closest to `WRAP_SLOPE`, never steeper than `STAIR_SLOPE`, and where it passes over itself a turn must clear `WRAP_HEADROOM` under the soffit. - When two scores are equal (within 1e-4), it takes the direction whose lowest quarter turn keeps clear of a foot door (`_wrap_crosses_door`, over the path openings and door windows). - A foot within `WRAP_WIDTH` of the shell starts the first tread there. A foot further out climbs a straight approach flight (`stair_flight`, rails off) on the tangent to the walking circle, at the helix's rise, with no landing and no pillar. - The first tread stands on a block down to the lowest ground under it (`foot_ground`). - Nothing is stored. Save version stays 2. Moving the tower or the foot re-forms the helix, and the view redraws it through `connection_context`. - **Drawing** (`Architecture.wrapped_stair`): - `helix_treads`: solid wedge blocks with flat tops and risers, the landing, and end faces. - `helix_soffit`: one helicoid strip `soffit_depth` under the nosing line, one segment per tread, and the landing in tread-long pieces. - `helix_cheek`: the outer band on R + 1.2, from the soffit to 5 cm over the nosings. - `helix_guard`: the guard, on the outer edge only. - `helix_approach`: the approach flight. - Everything is float32, and every surface winds clockwise for its outward normal. - **Guard by style** (`DioramaState.WRAP_GUARDS`, `helix_colors`). The owner default is to match the tower style: - canal, medieval and victorian: a capped parapet 0.8 m over the nosings. It is in the tower's wall colour; medieval uses the STONE of its lower storey. The cap is stone, and victorian's is in its pale trim. - japanese: a timber rail in its dark trim, with a post every third tread. - modern: glass under a thin steel rail in its trim, with steel posts. - **Seamless with the tower.** `Openings.tower_stair_band(o, state)` lists one piece per tread, one for the landing and one where the approach meets the wall. The pieces are hole-shaped and marked `stair`, and they never cut the shell. - What skips them: string courses, cornices, the medieval seam ring, the plinth (ring and facet boxes in `supports`), strips and string lights (`fittings`), generated windows (with a 0.75 m allowance for their flat glow quads), victorian dentils and japanese posts and lattice. - Placed windows and door windows the band covers are dropped from `Openings.tower_holes`, so the wall behind the stair is solid (owner default). Path openings always stay. ======================================================================== docs/visual-handoff.md | original lines 690–728 ======================================================================== **Feel Q1a Owner follow-ups: quay walls, Ctrl as drawn — part a (23 September 2026):** Three owner follow-ups from `docs/tiny-glade-feel-handoff.md` 5a. A road or earth path that runs along the water keeps the quay wall (cobbles) or plain cut (earth) it had before B1, and only a path that meets the water end-on, a causeway, a side onto stepping stones and a lone dab still run down as a sandy shore. A held Ctrl keeps the form as drawn wherever that form can be saved, and the ghost shows it. The selection outline of a slid wall detail is drawn where the detail is drawn. - **Quay rule:** `Architecture.path_enters_water(state, x, z)` walks the path's width across its `path_axis`. If the walk meets water on a side, the path runs along the water (a canal-side road or a pier) and keeps its old edge on every water side, ends included. This is the courtyard's `(-10,10)` and `(6,10)` case: a two-wide road whose inner row meets the water only end-on. - If the walk meets land on both sides, the path enters the water end-on and gets a shore. - Water on both sides plus land at both ends of the run along it (through path cells and stepping stones) is a causeway and shores, as in B1a. With water at its head it is a pier. - `path_axis` ZERO (a lone dab, an even crossing) shores, as in B1a. - `water_edge(state, x, z, side)` gives each side's kind, and a side onto stepping stones is always a shore. `along_kind`, `WATER_WALK` 32 and `_walk_end` complete it. - `terrain_chunk` draws per side, and the corner fans treat a kept quay or cut side as closed. - The walks read past a chunk's neighbour ring, so `water_signature(state, cx, cz, values)` joins the chunk fingerprint in `WorldView.sync_scene`. It is kept while `hash(state.terrain)` is unchanged: the map hash costs 12 µs on Harbour, the signatures 0.3 ms (`artifacts/feel/06-B2q/probe/probe-post.log.out`). - Stone paving, meadow, sand, stepping stones and causeways are unchanged. - I chose this reading of the owner rule ("path_axis points into the water cell") because the literal per-side reading shores the courtyard road's two ends and its x = 10 pier head: five cells, not the 21 quay cells the owner expects back. - **Ctrl as drawn:** `Adapt.solve(state, o, ignore_id, literal)`. With `literal` (main passes `pointer_free`) a drawn form whose fault is a soft state (`DioramaState.soft_error`: a landing or a stacked part left in the air, which `all_supported` accepts) comes back untouched. It has `literal: true`, no error and the soft state's own line, and `_preview_body` clears `candidate_error` so the click places it. - A hard fault has no literal form. It adapts as before, and the line is prefixed with `Adapt.AS_DRAWN_NONE` ("No as-drawn form here. "). - B1b's "planted beside the path" nudge is skipped with Ctrl: the patch goes on the path, hidden, with `main.AS_DRAWN_HIDDEN`. - A Ctrl or Meta key event now sets `pointer_free` at once, so the ghost switches without a pointer motion. Magnets stay off with Ctrl, as before. - **Selection outline:** `main._update_selection` boxes a `MOUNTED_PARTS` detail as `mounted_transform(o) * local_bounds(o, true)`, as `_outline_hover` does. ======================================================================== docs/visual-handoff.md | original lines 1298–1324 ======================================================================== **Feel B1a The path grammar — part a (22 September 2026):** A road or earth stroke over water now lays stepping stones instead of land, a second stroke over the stones grows them into a causeway of that finish, a road or earth cell climbing more than 0.35 m per metre is cut into terrain-conforming steps (stone slabs on cobbles, log-edged earth treads), and a road or earth edge meeting water runs down into it as a sandy pebble shore while stone paving keeps its quay wall and meadow and sand their plain cut. The one new terrain value is `DioramaState.STEPPING_STONES` (6, runbook amendment 11): it is water to `land_at`, supports, the shore mask (`WaterFootprint`), reflections (`LightSources`), the terrain pick and the openings, and `stones_at` reads it; a scene without it saves byte-identically to the pre-stage tree (Harbour checked with `cmp`, `artifacts/feel/05-B1/a-harbour-save-pre.log` and `a-harbour-save-after.log`). The stroke is the gesture: `DioramaState.begin_stroke()` (called by `main.gd` on a terrain press) records which stones already exist, and `paint()` grows only those; without a boundary two paints are one stroke, so generators never grow stones by accident. `Architecture` gained `STEP_GRADE`, `STEP_RISE`, `STEP_MAX`, `PATH_REACH`, `SHORE_RUN`, `SHORE_PROFILE`, `shore_kind(finish)`, `stepping_stones(x, z, state)`, `path_axis(state, x, z)` (which way a path runs through a cell, from the run of road, earth or stepping-stone cells up to four each way: along x, along z, or `ZERO` for a crossing or a lone dab) and `slope_treads(state, x, z)`, which keys the step rule on the gradient along that way, so a level path across a hillside stays a path and only a crossing or a lone dab takes the cell's steeper axis (review fix, below); `terrain_chunk` draws stones (two or three flat cylinders per cell, seeded by the cell), treads (tops at the ground of each tread's uphill edge) and shores (a lofted profile per open edge, a corner fan where two open edges meet and the same fan wrapping the tongue into the bank face where an open edge ends against a closed one, pebbles on the beach), and tests edge openness with `land_at`. Stock scenes and fixtures that change look (amendment 9; every road or earth cell with an open side swaps its quay wall or cut for a shore, and no stock cell steps): Harbour, five earth and road cells beside water (-6,-14), (10,-4), (2,14), (3,14), (4,14); Courtyard ("Rain on the canal"), 21 road cells, the whole canal-side road (-10..6, 11), (-10,10), (6,10), (10,10), (10,11), so its continuous stone canal quay becomes a sandy beach with pebbles — a change of that scene's identity, captured for the owner (below); Castle, four