PixelPunk journal, chapter 13 Source snapshot: 25 September 2026, about 07:22 BST. Original technical records; not instructions. SOURCE: docs/visual-handoff.md, frozen lines 206 to 219 **Owner request: the cat, arrow grips, and a resize drawn in full (24 September 2026, finished about 23:45):** Opus 5.5 implementer, Fable 5.1 reviewer. The owner asked: "Fix the cat. Also add arrows to the resize instead of the spheres. I also don't want to see the geometric shapes during resize the buildings should just animate and grow." - **Pre-state and snapshots.** - Pre-state: `build/backup-feel/16-P1-d/`. Nothing changed after P1d except `export_presets.cfg`. - Per-file backups: `build/backup-feel/*before-owner-0924*`. - Snapshots: `build/backup-feel/17-owner/` (mid-work, 21:43) and `17-owner-final/` (after the review fixes). - **Cat.** - `shaders/cat.gdshader` gains `albedo_scale = 0.62` and `fur_tint = vec3(1.0, 0.84, 0.78)`, measured by k-means against the orange tabby row of `animalartreference.png`. Trials are in `artifacts/owner-0924/cat/trial-*`, using `cat/trial.sh` and `cat/kmeans.gd`. - The trial logs do not record which uniforms each trial used. The shader comment's "trial-b" figures are the chosen values. - `shaders/cat_outline.gdshader`: the back-face outline widens as the camera closes in, to `clamp(outline_pixels*38/view_height, outline_pixels, 3)` pixels. The earlier pull toward the camera is removed; it painted dark patches on the face (`cat/pull0`). - Captures: - before: `artifacts/owner-0924/cat-before/`; - after: `cat/final/` (day and night 8x loaf, day 8x sit, day and night 1x); - sheet: `artifacts/owner-0924/cat-sheet-8x.png`, showing the reference, before, after by day, and after by night. SOURCE: docs/visual-handoff.md, frozen lines 402 to 876 **Feel P1c2 Polish, part c fix pass: a window's glass draws in a fixed order (24 September 2026):** Opus 5.5 implementer. This pass fixes the review's must-fix at its cause. A lit window's pane now draws before its light pool and halo in every run and every tree. F12 and photo mode finish a spread release first. The P1c entry below is corrected for the review notes. - **Cause.** The pane (`glass`, alpha-blended), the light pool (`pool`, additive) and the halo (`glow`, additive) are surfaces of one cluster `MeshInstance3D`, so they share one sort depth. The renderer's transparent sort leaves surfaces of equal depth in no fixed order, so the pool fell before the pane (dimmed by it) or after it, depending on the rest of the draw list. Part c changed which way it fell, not what was built. The `interior` shader writes no ALPHA, so it is opaque and not part of this. Evidence (`artifacts/feel/16-P1/c2/settle/`, `run.sh`, `cmp.sh`): - The dim state is the glass drawn after the pool. The P1c sitting's natural dim crops (`c/pin` none-pre-B, `c/settle` before-A) match the crop with the glass pinned after the pools (priority 1): 1.6 to 2.3% of pixels differ. The bright crop differs by 13.5 to 14.2% (`imgdiff-old-states.txt`). - Dense, window crop (`imgdiff-dense-crop.txt`), with luma values: - the pre-part tree: 52.95 and 52.98 (0.5% between its two runs); - part c without the fix: 53.37 and 53.41, a mix of states, 9.8 to 10.0% from live; - the pre-part tree plus the fix line alone (`tree-prefix`): 54.23 and 54.25, 0.60 to 0.65% from live; - live: 54.25, with 0.42% between its two runs. - The quarter did not flip in this sitting. All 14 runs in all four trees were bright, within 1.2 to 3.1% of live-A (`imgdiff-quarter-crop.txt`). - P1c's interior pin: I cannot explain its four bright runs by this mechanism, and I did not test it further. - **Fix.** In `Architecture.materials()`, `glass.render_priority = -1`. - Glass draws first among the priority-0 transparent surfaces, still after the water (-10) and the puddles (-9). The build variants copy it. - Side effect: priority sorts before depth, so every glass surface now draws before every priority-0 transparent surface. An additive pool or halo behind a glass balustrade (`cluster_architecture.gd:439`, `architecture.gd:4198`, `4432`, `4661`) or a tower pane (`architecture.gd:4336`) is no longer dimmed by that glass. In the six journey views the effect is nil: styles-day (modern glass bridge) differs by 0.26% of pixels, all of it rain. - **Photographs.** `main._settle_for_photo()` runs before `capture_photo` (F12) and on entering photo mode. It calls `settle_release()` when a release is pending. With animations on, that also builds the queued clusters at once; this rests on reading `world_view.gd:811`, not on a test (the photo check runs with animations off, so its empty-queue assertion does not exercise it). Files: `scripts/architecture.gd`, `scripts/main.gd`, `tests/test_release_spread.gd`. Old copies: `build/backup-feel/16-P1-c2-work/`. Snapshots, untouched: `build/backup-feel/16-P1-c-stopped/` (the pre-pass tree) and `16-P1-c/` (pre-part). Scratch trees: `tree-pre`, `tree-prefix` and `tree-stopped`, in this session's scratchpad. Tests: - Test first: `artifacts/feel/16-P1/c2-testfirst-test_release_spread.log(.out)`, 107 checks, 6 failures. - After the fix: 107 checks, 0 failures (`c2/work-test_release_spread-2.log.out`). - Full suite in the foreground (`c2/full.sh`, logs in `full-c2/`): 34 suites, 17,595 checks, 1 failure (`full-c2/tally.txt`). - The failing check is `test_creature_reactions` "The re-plan is applied after the edits (0)". - The pre-pass tree fails the same check in this sitting, 2 runs of 2, and so does live, 2 of 2 (`c2/creature/summary.txt`). The pre-pass runs show 2 failures and 5,523 checks against live's 1 and 5,549 because the snapshot tree lacks `animalartreference.png` (its extra failure is "animalartreference.png loads"); that is the tree, not a difference in behaviour. - The Mac ran on battery with Low Power Mode on (`pmset` lowpowermode 1). Tick and draw took more of the 0.36 ms creature budget, so the re-plan got 60 slices against P1c's 71 and did not finish in the test's 240-frame edit loop (252 frames profiled in all). It passed in P1c's sitting. - `--verify` gave `PIXELPUNK_INTEGRATION []` (`full-c2/verify.log`). Changed expectations: the animated case of `test_release_spread` now compares decorations, `ivy_drawn` and `deco_hash`; before, it dropped them. They are equal (`c2/probe/animate_full.log.out`, and the suite). No assertion was removed. There are 13 new checks: draw order, and settling for photo mode and F12. Captures (`artifacts/feel-journey/16-P1/pkg/`; I looked at each image cited): - `c2-crop-dense-{pre,stopped,prefix,live}-A.png`. The differences are a few luma, hard to see by eye. - `c2-diff-dense-pre-prefix-A.png` shows panes. `c2-diff-dense-stopped-live-A.png` shows panes of other clusters. `c2-diff-dense-prefix-live-A.png`, `c2-diff-quarter-prefix-live-A.png` and `c2-diff-harbour-prefix-live-A.png` show rain, water and wet paving only. - Journey views from the pre-pass tree (`c2-pre/`) and live (`c2-live/`), with a second night pair (`c2-pre2/`, `c2-live2/`): - All six views have identical counts (`c2-counts.txt`: 0 of 63 fields, `draw_calls` and `rendered_objects` included). - Pixels differ by 0.26 to 4.0% (`c2-imgdiff.txt`). - **quarter-night changes on purpose.** Several clusters' panes are brighter. Note for the owner (from the Fable review): every journey from 07-B0 to 15-D2 recorded the other, dim state (glass drawn after the pool; crops 1.0 to 2.4% from the pre-pass crop and 19.1 to 20.3% from live, `artifacts/feel/16-P1/review/imgdiff-history*.log.out`), so the D1 and D2 verdicts were made on dim panes. The bright order is the depth-correct one: in a canal window the pool quad at z 0.105 (`architecture.gd:834`) is in front of the pane at z 0.02 (`architecture.gd:827`). The change (`c2-diff-journey-quarter-night.png`, `c2-crop-journey-quarter-night-{pre,live}.png`): 17.7 to 18.6% of the crop differs between trees, 0.26% between the two pre-pass runs and 0.72% between the two live runs (`c2-imgdiff-night.txt`). - The harbour-night and styles-day diffs show rain and water only. Measurements (same sitting; Low Power Mode, so absolute times are about 1.5 times P1c's): - Settle noise band, whole frame, two runs of each tree (`c2/settle/imgdiff-*.txt`). Rain phase dominates the whole frame; the window crops above are the pane test. | Scene | Same tree, pre-part + fix | Same tree, live | Cross-tree | |---|---|---|---| | Harbour | 2.6% | 2.8% | 4.7 to 5.9% (water reflections and rain) | | Quarter | 8.8% | 7.4% | 3.2 to 8.6% | | Dense | 8.9% | 1.6% | 4.1 to 8.2% | - Release probe (`c2/release/release.sh`, `medians.txt`): three alternating runs against `16-P1-c`. The after/before ratios equal P1c's: 0.256 (was 0.255), 0.296 (0.292) and 0.262 (0.261). | Scene, animations | Release frame before | Release frame after | Worst slice (median) | |---|---|---|---| | Harbour, off | 128.7 ms | 33.0 ms | 10.8 ms | | Harbour, on | 134.9 ms | 39.9 ms | 10.7 ms | | Dense, off | 516.1 ms | 135.0 ms | 26.2 ms | | Dense, on | 502.4 ms | 120.4 ms | 26.4 ms | - Frame cost (`c2/bench/table.txt`), pre-pass tree against live. The ranges overlap. - Harbour: 14.59 to 14.44 ms. - Dense: 20.06 to 20.08 ms. Owner: both P1c misses (dense slice 17.7 ms against 8; Harbour release with animations 26.7 ms against 25) were **accepted** on 24 September 2026 (resumed session), with nothing bent to meet them. In this slower sitting the Harbour slice is also over 8 ms (10.7). Review (orchestrator, 24 September 2026): Fable 5.1 review in run `wf_0f6efecd-303`, acceptance met, no must-fix, five notes, all applied above by the orchestrator: every journey from 07-B0 to 15-D2 showed the dim pane state (so D1 and D2 were judged on it) and the bright state is the depth-correct one; the quarter run count (14, not 13); the pre-pass tree's extra creature failure (missing reference PNG); the side effect named for balustrade and tower glass; the photo-mode settle with animations on rests on code reading, not a test. The Sonnet handoff check flagged the pre-part luma (52.95 and 52.98, corrected) and the 240 frames (the test's edit loop is 240 frames and 252 are profiled in all; clarified). Not done: - Lamps and the other derived layers of a moved part still wait for the queue (recorded in P1c); only photographs settle. - Out of this part's scope and untouched: `lived_step` yielding when cheap, and the 32-bit seed keys of the ivy memos. - Release and frame-cost figures were not re-taken on mains power. Platforms: Mac run; Windows not run. **Feel P1c Polish, part c: release work leaves the edit frame (24 September 2026):** Opus 5.5 implementer. **Stopped on a target miss; see "Not done".** A release (the end of a drag, an undo or a redo) now builds only the geometry in its own frame. Derived layers follow over the next frames in 6 ms slices: clutter, foliage context, lived-in, links, planting, decorations, ivy, then the light pass. Ivy growth is memoised per seed, so an unchanged building does not regrow. - **Where it runs.** Spreading is on when the camera is live (a person's launch) and under `--drag`. It is off for `--smoke`, `--verify` and every other automation, and off for forced syncs, strokes and `settle_next`. - **Interruptions.** `sync_live` or a new sync cancels the queue. `settle_release()` finishes it at once. With animations on, the derived work waits for the A2c cluster queue. - **What waits (added by P1c2 from the review).** The queue also holds a moved part's levitation shimmer, planting, decorations, reflection and paving streaks and the light pass (`RELEASE_STEPS`), so its lamps and their pools stay at the old position until the queue drains: about 13 frames on Harbour and 36 on dense in the probe, more with animations on (the review's estimate is 0.2 to 1 s). Nothing in a person's launch called `settle_release`, so F12 or photo mode within that time photographed the view without its derived layers; P1c2 settles first. - **Memo keys.** The flood memo is keyed on everything the flood read, and a trimmed flood is not reused. Static content-keyed caches cover the ivy finish map, the ground bits per owner, the wall columns, the planting base and water, and the terrain base cells per chunk. - **Other changes.** The terrain fingerprint is `hash([base cells, extras])`. Cluster signatures use a grid index. `_light_links` pairs through a grid and then restores the old order. Files: `scripts/world_view.gd`, `scripts/composition.gd`, `scripts/ivy.gd`, `scripts/light_sources.gd`, `scripts/main.gd` (spread flag; the drag harness also waits for the release queue), new `tests/test_release_spread.gd`, `tools/test.sh`, `tools/Test.ps1`. - Old copies: `build/backup-feel/16-P1-c-work/*.orig`. - Snapshots: `build/backup-feel/16-P1/` (pre-stage) and `build/backup-feel/16-P1-c/` (pre-part), both untouched. - The "before" tree is `feel_snapshot tree 16-P1-c`. It is in the session scratchpad, with the fixtures and a `.tools` link added. Tests: - Test first: `artifacts/feel/16-P1/c-testfirst-test_release_spread.log(.out)`, 19 checks, 9 failures. The budget case was edited after that run. - `test_release_spread` has 94 checks and 0 failures. It covers: - on Harbour, the quarter and dense: the release frame runs no composition pass, the queue drains over several frames, and every derived layer's digest equals a release built whole; - undo replay, cancellation and `settle_release`, and animations on (that case left decorations, `ivy_drawn` and `deco_hash` out of its comparison; P1c2 compares them too); - a quiet re-sync that rebuilds no ground chunk; - ivy memo equal to a cold pass, including a budget-trimmed Harbour. - Full suite in the foreground (`artifacts/feel/16-P1/c/full.sh`, logs in `full-c/`): 34 suites, 17,582 checks, 0 failures (`full-c/tally.txt`). - `--verify` gave `PIXELPUNK_INTEGRATION []` (`full-c/verify.log`). Changed expectations: no assertion was changed or removed. Behaviour changes: - Derived layers now arrive over the frames after the geometry. In the probe that is about 13 slices on Harbour and 36 on dense; the drag harness drained the dense handle in 42 frames. - A derived decoration kept by the release is not regrown. - `pool_resets` and `pool_kept` (corrected in P1c2): identical on Harbour (the 2 to 3 was between two pre-part runs, `c/settle/fields.txt`); on the quarter 4 to 3 and on dense 5 to 4 in the P1c sitting. In the P1c2 sitting (`c2/settle/fields.txt`) the quarter was 5 in all 14 runs of all four trees, and dense 7 in the pre-part tree against 5 or 6 with part c (live 5 and 6 in two runs). These counters follow the periodic light pass, which waits for the queue, so run time moves them. Captures (`artifacts/feel-journey/16-P1/pkg/`; I looked at each image cited): - `c-settle-quarter-pre-A.png`, `c-settle-quarter-pre-P2.png` and `c-settle-quarter-live-A.png`: the quarter after a house widening under `--drag`, settled (`artifacts/feel/16-P1/c/settle/run.sh`). The three look the same. - The window panes of the corner-house cluster come in two brightnesses, run to run (`c-crop-windows-*.png`, `c-diff-quarter-*.png`, `settle/windows.txt`): - The pre-part code (untouched, or with only a print after the capture) was dim in 5 of 7 runs. Its P2 run was bright and its P3 run dim with the same code. The live tree was bright in all 6 runs. - Bright pre-part against live is within noise. - Headless (`c/probe/crossdigest.gd`), both trees match in every mesh, vertex colour, material, multimesh, light source and reflection. The settled light pool is also identical. - I did not find the cause. **Corrected in P1c2:** the "within noise" reading was not supported. The cause is the draw order of a window's glass against its light pool and halo, three surfaces of one cluster mesh with one sort depth, which the renderer leaves unordered; part c changed which way it fell, not what was built. P1c2 fixes the order (entry above). - Settled report counts: every non-timing field is identical, except `pool_kept` and `pool_resets` (`settle/fields.txt`). - Pixels differing, pre-part against live, with same-tree noise in brackets (`settle/imgdiff.txt`): Harbour 2.0 to 3.6% (2.4 to 3.0%), quarter 4.6 to 5.1% (2.8 to 3.1%, the window states above), dense 7.4 to 8.9% (3.5% pre-part pair, 7.0% live pair). - Journey views (`pkg/c-pre/`, `pkg/c-live/`, `pkg/c-counts.txt`): all six views have identical counts. The only differences are `audio.voices` and `light_select_calls` on harbour-day, which depend on run time. Measurements, three alternating runs against the pre-part tree: - Release probe (`c/probe/release.sh`, `release-results.txt`): headless, 9 house moves per run, median of the per-run medians. Target is 8 ms per slice. | Scene, animations | Release frame before | Release frame after | Worst slice (median) | |---|---|---|---| | Harbour, off | 87.0 ms | 22.2 ms | 7.2 ms | | Harbour, on | 92.0 ms | 26.7 ms | 7.2 ms (one outlier of 31.6) | | Dense, off | 348 ms | 90.8 ms | 17.7 ms | | Dense, on | 339 ms | 80.4 ms | 17.7 ms | - Drag harness (`c/drag/table.md`): every `step_total` median and p95 is equal or lower. Round 2 "after" was run a second time after harness errors (the first attempt is kept in `c/drag/after-2-handle-miss/`; added in P1c2). Release frame and handle `step_total` median, before to after: | Scene | Release frame | Handle `step_total` median | |---|---|---| | Harbour handle | 84 to 10.4 ms | 24.95 to 20.06 ms | | Dense handle | 362 to 49 ms | 97.7 to 55.8 ms | | Dense undo | 414 to 139 ms | (not given) | - Frame cost (`c/bench/table.txt`): vsync off, `--smoke`, where the release is not spread. - Harbour: 8.96 to 8.51 ms. - Dense: 13.51 to 13.80 ms. - The ranges overlap. Review (orchestrator, 24 September 2026, stage paused): **NOT MET, one must-fix open, since resolved by part c2** (entry "Feel P1c2" above; the owner accepted both missed targets at 18:45). Fable 5.1 review in run `wf_f28d7d75-0f3`: under `--drag` on the canal quarter and dense the edited cluster's window panes differ between the pre-part and live trees, and this entry's "noise" reading is not supported (evidence under `artifacts/feel/16-P1/review/`); eight notes, listed in `docs/tiny-glade-feel-handoff.md` section 0c. The fix pass was stopped at about 16:59 by the owner's pause, before it edited any project file; its first diagnosis (`artifacts/feel/16-P1/c/pin/`) points at an unstable draw order between the transparent glass and interior surfaces, which flips the panes in the pre-part tree too. The two missed targets (dense slice 17.7 ms against 8, Harbour release with animations 26.7 ms against 25) await the owner. Resume with part `c2` (handoff section 0c). Not done: - **The 8 ms per-slice target on dense.** Worst slice median 17.7 ms. The indivisible units are: - the laundry stage, about 17 ms; - the ivy step, about 16.7 ms, of which moss is 12.5; - decorations, about 15.6 ms after the 10.5 ms signature was split off; - `ivy_columns`, about 9 ms; - levitation, about 5.3 ms; - the light check and the light seal, about 4.7 ms each. - Each unit needs splitting inside its own generator. I did not bend the output to meet the target. - **Harbour with animations on.** The release frame is 26.7 ms against the 25 ms target. Recording build pieces costs about 4 ms. With animations off it is 22.2 ms. - The quarter window-brightness states are unexplained. (Explained and fixed in P1c2.) - **Owner decision, 24 September 2026 (resumed session, 18:45):** both missed targets above (dense slice 17.7 ms against 8; Harbour release with animations 26.7 ms against 25) are accepted as they are. Nothing is to be bent to meet them. (Recorded in P1c2.) Platforms: Mac run; Windows not run. **Feel P1b Polish, part b: photo mode gets the perspective lens (24 September 2026):** Opus 5.5 implementer. Entering photo mode by hand (P, or the photo button) now looks through the perspective lens with a gentle depth of field. Leaving puts the editing view back exactly. Automated runs are unchanged. This follows the owner's acceptance of the D2 recommendation. - **The lens.** From the orthographic view, photo mode switches to perspective at 24 degrees (`ViewProjection.DEFAULT_FOV`). A perspective editing view keeps its own lens and camera. - The lens frames `size` metres only at the depth it pivots on. The canal quarter's target is the ground about 17 m behind the houses in view (pitch 0.315). Pivoting on the target made that scene about 1.5 times larger. - So the pivot slides along the line of sight to the depth of the scene (`_photo_subject_depth`). This is the median, over a 5 x 5 grid, of the first part box or land each sight line meets. That does not change the orthographic picture. - Measured slides: Harbour 2.4 m, quarter 17.1 m, Styles 10.3 m, dense 19.3 m. - Entering costs 2.5 ms (Harbour), 4.4 ms (quarter) and 18 ms (dense), median of 5 (`artifacts/feel/16-P1/b/probe_enter-rays.log`). A first version used the editor's full pick: 100 ms and 380 ms (`probe_enter-picks.log`). - **Depth of field.** A gentle default aperture of 0.3 (`PHOTO_GENTLE_DOF`), unpinned. It focuses on the ground (the terrain, else the water) under the middle of the view (`_middle_ground`). Pinning, `,` `.` and U work as before. `set_photo_dof` now rounds to hundredths, so stepping down lands on exactly 0 (off). Before, 0.3 minus three steps left 5.6e-17, which kept the lens on. - **Restore.** `photo_lens` records the editing projection, lens, `state.camera`, aperture and pin. Leaving restores all of them, snaps the eased view onto the camera and stops a carried orbit spin. An orbit or zoom made in photo mode therefore does not outlast it. - Every save the person makes goes through `_save_scene`: Save, the recovery autosave, and the save on close. In photo mode it writes the editing camera. - A scene opened or started while in photo mode keeps its own camera. - Scenery shows the editing projection and lens throughout. - **The D2 review note is fixed.** The photo field-of-view keys set a new runtime `WorldView.photo_fov` (the lens only; the eye still stands at the distance `fov` gives). They no longer write `state.camera.size`, `world.fov` or `ui.view_fov`, and leaving photo mode clears the value. - **Automation.** `--smoke` (`_enter_photo_mode`) and `--verify` (the photo action, with an automation mode) keep the projection `--projection` gives. They get no depth of field unless `--photo-focus` or `--dof` is passed. The new `--photo-lens` asks a `--smoke` run for the interactive lens, and its report then carries `photo_lens: true` (and `photo_fov` when set). Files: `scripts/main.gd`, `scripts/world_view.gd`, `scripts/view_projection.gd`, `tests/test_camera.gd`, `README.md` (two passages). Old copies: `artifacts/feel/16-P1/b/*.pre-P1b`. Diff: `artifacts/feel/16-P1/b/b-diff.txt`. Snapshot: `build/backup-feel/16-P1/` (untouched); the pre-part snapshot is `build/backup-feel/16-P1-b/` (the "before" tree, untouched). Tests: - Test first: `artifacts/feel/16-P1/b-testfirst-test_camera.log(.out)`, 186 checks, 23 failures. They include "leaving restores the perspective editing lens exactly" (the D2 leak) and the `--verify`/`--smoke` photo checks, which then failed because D2's aperture carried over. - The subject-depth and save checks were added after that run (5 checks, never run against the pre-part tree). - `test_camera` 191/0 (64 new: enter, leave, restore, unpinned focus, keys, save, automation). - Full suite in the foreground, `tools/test.sh`'s steps split into four calls (`artifacts/feel/16-P1/b/full.sh`, logs `artifacts/feel/16-P1/full-b/`): 33 suites, 17,488 checks, 0 failures (`full-b/tally.txt`). - `--verify` gave `PIXELPUNK_INTEGRATION []` (`full-b/verify.log`). [Orchestrator correction: one run is on disk, not two, because `b/full.sh` clears the folder; `full-b/integration/` holds 56 entries, 52 of them PNGs.] - `test_ui`, `test_reroll` and `test_camera` were re-run on the final code. Changed expectations: no assertion was changed or removed. Behaviour changes: - An interactive photo session no longer carries a pinned focus or aperture into the next one. D2 kept them for the session; the automation path still does. - A save made in interactive photo mode writes the editing camera, not the photo orbit. - The photo field of view no longer changes the saved camera size. Captures (`artifacts/feel-journey/16-P1/pkg/`, 1600x1000 `--smoke`, the D2 cameras; `artifacts/feel/16-P1/b/cap_all.sh`; I looked at each image cited): - `b-before-*` (pre-part tree) and `b-after-*` (live, no new argument) for Harbour Night, the canal quarter Night and Styles Day. Every non-timing report field is identical (`b/fields-before-after.txt`). - Pixels differing, before against after: Harbour 1.8%, Styles 1.0%, quarter 6.0% (0.0595) (`b/imgdiff-before-after.txt`). - Quarter noise: a second live run differs from the first by 6.0%, and from both pre runs by 2.4%. Two pre runs differ by 2.4% (`b/imgdiff-noise.txt`). So the 6.0% is one noisy live run. - `b-photo-*`: the same views with `--photo-lens`, which is interactive photo mode. - `sheet-photo-lens.png`: one row per scene; columns are the editor view, the automated photo (orthographic, unchanged) and photo mode by hand. - Harbour and the quarter keep their size. Styles is about 5% smaller (eye estimate). - Each reads as a miniature: sharp across the middle ground, soft sky, skyline and near edge. - In the quarter, tall walls near the top blur (the ground-plane model, as D2 found). - In the quarter, the lamp set is re-chosen for the new eye (`light_evicts` 16) and the facades are less lit than in the orthographic view. - Journey: `pkg/journey-b/` against `journey-a/`. All six views have every non-timing field identical, on the final code (`b/journey-fields.txt`). An earlier journey-b run (overwritten, its comparison not kept) differed only in `light_select_calls`, with shorter elapsed times at a higher refresh rate. Measurements (`b/bench/bench.sh`, `b/bench/table.txt`, `results*.txt`): vsync off, 1920x1080, Day 13:00, against the pre-part tree. Mean frame in ms, median (range): | Scene | Rounds | Pre-part | Live | Live `--photo-lens` | |---|---|---:|---:|---:| | Harbour | 1 to 3 | 7.99 (7.64 to 7.99) | 9.17 (8.62 to 10.77) | 9.74 (8.95 to 9.94) | | Harbour | 4 to 8, live first | 9.41 (8.90 to 9.63) | 9.43 (9.18 to 9.67) | not run | | Dense | 1 to 3 | 13.96 (13.42 to 14.86) | 13.39 (13.36 to 14.39) | 14.24 (14.22 to 15.40) | - In rounds 1 to 3, Harbour live was slower than pre-part with no overlap. The default path runs no new per-frame code, and five more rounds in the other order overlap (drift across the sitting). Draw calls and objects are identical pre against live. - The `--photo-lens` rounds ran on the first, pick-based subject depth. That runs once, before sampling. - No drag harness: not a track-A part. Review (orchestrator, 24 September 2026): Fable 5.1 review in run `wf_8e956e98-b2c`, acceptance met, no must-fix, eight notes: from an orthographic view the photo lens always uses the default field of view (a Scenery preference or `--fov` is overridden); pressing P during a camera ease measures from the eased eye, then snaps; the free camera's unpinned focus is now the ground under the middle of the view; a scene opened while in photo mode saves the photo orbit; the verify count (corrected above); `audio.voices` also differs in three views, treated as timing since E1; the quarter's lamps are re-chosen on entry, so its facades are dimmer in photo mode; the new save check skips `heights`, which does not compare equal after a read-back, unexplained and outside P1b. The Sonnet handoff check flagged the verify count and the 5.9% rounding (both corrected above) and could not find timestamps for the P1a verify times; those come from file modification times (`ls -lT` on the integration folders), as the P1a review states. Not done: - No hands-on windowed session with a real P key press. P, Esc and the lens keys go through `_unhandled_input` in the headless test, and `--photo-lens` runs the same `_photo_lens_on`. - The photo bar hint text is unchanged. Its 52 glyphs are counted in every journey view. - No toast on entering. - The depth of field is still ground-plane only. - The lamp re-selection on entering is not smoothed. - Heights read back from a save did not compare equal as a whole dictionary in the new save check. The other keys and the camera did. Not investigated; the round-trip suites cover heights. - Platforms: Mac run; Windows not run (no new suite, `Test.ps1` unchanged). **Feel P1a Polish, part a: creatures in normal use, ducks wait for land, the cat's colour (24 September 2026):** Opus 5.5 implementer. Three changes: - **Creatures are on in an ordinary launch.** `Mallard.wanted(args, interactive, preference)`: `--creatures` always turns them on; otherwise an interactive launch (no automation mode, not headless: main's `prefs_live`, the same test as `camera_live`) follows the person's Creatures switch, and every `--smoke`, `--verify`, `--benchmark`, `--drag` run and every headless test has none. Scenery has a new **Creatures** switch at the bottom of the panel. It is a preference of the person, stored in `user://preferences.cfg` (section `scenery`, key `creatures`, default on) by the new `scripts/user_prefs.gd`, and written only in an interactive session. It is never in the document or in undo. `WorldView.set_creatures` frees them or plans the scene at once. Save version stays 2. - **Ducks wait for land** (owner decision, 24 September 2026). `Creatures._st_ducks` no longer falls back to any open water when no shore-side home exists. A blank all-water canvas has no ducks (it had 8). A 3x3 island brings the open water's count, to homes near its shore. Erasing the island sends them away, and undo brings them back. `duck_count` is unchanged. - **The cat is an orange tabby.** - The palette is re-sampled from the sheet's Loaf cell where it is flat over 3x3. C1b's stripe and cream points sat on tone edges. New values: orange `df9031` (249,716), stripe `895946` (217,731), cream `fcd18f` (238,744); dark is unchanged. Probe: `artifacts/feel/16-P1/a/probe/probe_cat_samples.log`. - Body stripes are cut by latitude, so both triangles of a quad share a band. C1b's cut gave a zigzag of triangles. - The front of the chest is cream. - The mallard's outline and lighting are unchanged. - A new shader uniform `fur_tint` (linear green 0.9, not on the umbrella's rigid pose) compensates the filmic tonemap. It pushed the sunlit back to a hue of 42 degrees against the sheet's 34. Files: `scripts/user_prefs.gd` (new, no `class_name`), `scripts/mallard.gd`, `scripts/main.gd`, `scripts/world_view.gd`, `scripts/editor_ui.gd`, `scripts/creatures.gd`, `scripts/cat.gd`, `shaders/cat.gdshader`, `tests/test_creatures.gd`, `tests/test_creature_life.gd`, `tests/test_creature_reactions.gd`, `README.md` (the creatures passage; old copy `artifacts/feel/16-P1/a/README.md.pre-P1a`). Snapshot: `build/backup-feel/16-P1/` (untouched). Diff: `artifacts/feel/16-P1/a/a-diff.txt`. Tests: - Test first: `artifacts/feel/16-P1/a-testfirst-test_creatures.log(.out)` (script error: `wanted` took one argument; `user_prefs.gd` missing), `a-testfirst-test_creature_life.log(.out)` (8 failures, including "a blank canvas has no ducks (8)") and `a-testfirst-test_creature_reactions.log(.out)` (3 failures: stripe, cream, contrast). - The band and `fur_tint` checks were added after the first run. Run on the pre-stage tree, they fail with 5 (`a/a-mutation-pre-tree-test_creature_reactions.log.out`, 8 split quads). - Final: `test_creatures` 167/0 (31 new: the default in both modes, and the switch through `main.tscn`, redirected to a scratch preference file); `test_creature_life` 399/0 (16 new); `test_creature_reactions` 5,549/0 (10 new). - Full `tools/test.sh` in the foreground (`artifacts/feel/16-P1/a-full-test.log`, per suite `full-a/`): 33 suites, 17,424 checks, 0 failures (a tally of the 33 headless suite lines; that run's windowed `--verify` did not finish, so the windowed evidence is `a/verify-2` and `a/verify-3`). - `--verify`: two runs in a row (the full suite's at 13:50 and `a/verify-1`) ran into `--quit-after` without printing `PIXELPUNK_INTEGRATION`. [Corrected by the orchestrator after the review and handoff check: the full suite's run went quiet for about 4 minutes between `scenery-inspector.png` (13:50:22) and `roof-inspector.png` (13:54:31) and wrote about 40 images to `artifacts/integration/`; `a/verify-1` paused 75 s at the same place (13:55:48 to 13:57:03) and wrote 12 of 56 images.] The pre-stage tree then passed in 65 s (`a/verify-pre`). Two more runs of the live tree passed with `PIXELPUNK_INTEGRATION []` and 56 images in 21 s each (`a/verify-2`, `a/verify-3`). Cause not found; nothing on that path reads creatures. Changed expectations: none removed. `Mallard.wanted(args)` with one argument still means "not interactive" (the old checks pass unchanged). Captures (`artifacts/feel-journey/16-P1/pkg/`, 1600x1000 `--smoke`; I looked at each one cited): - `creatures-cat.png` (`-day`, `-night`): the cat rows beside the old cat. Each row shows loaf, sit and trot by day and night. Columns: the sheet cell; before and after at 1x (camera size 38); before and after at 8x (size 4.75). "Before" is the pre-stage tree in the same sitting, and draws the cat of `artifacts/feel-journey/12-C1/pkg/creatures-b.png`. - The same C1b yard and rehearsals were used (`a/cap_cat.sh`, `a/make_cat_sheet.gd`). The rehearsal lines and every count are identical before and after. - Before: flat gold, no stripes. After: an orange tabby with dusky bands on the back, flanks and tail, and a cream chest. - At night the scene lighting keeps it darker than the sheet's night cell. - `sheet-ducks-wait-for-land.png`: blank canvas before (8 ducks) and after (none), then a 3x3 island before and after (8 ducks round it and a cat, the same both times). Scenes: `a/blank.json`, `a/island.json`. Raw captures: `raw-ducks/`. - `journey-a/`: the six journey views on the live tree. Every non-timing `performance.json` field is identical to `15-D2`, with 0 creatures in each (`a/journey-fields.txt`). Measurements, same sitting, vsync off, 1920x1080, day 13:00 (`a/bench/bench.sh`, `a/bench/table.txt`). Mean frame in ms, median (range) of three alternating rounds: | Scene | Pre-stage | Live | |---|---:|---:| | Harbour | 8.48 (8.47 to 8.53) | 8.12 (7.81 to 8.64) | | Dense | 13.53 (13.49 to 13.94) | 13.51 (13.50 to 13.58) | | Harbour, `--creatures` (5 rounds) | 8.24 (7.95 to 8.87) | 8.35 (7.94 to 8.44) | - Draw calls and objects are identical, except one live `--creatures` round at 1,026 against 1,017. Two further rounds gave 1,017. - No drag-harness run: part a changes no editing path. Colour against the sheet: hue of the dark, mid and light thirds of the cat's warm pixels (`a/probe/cat_colour-sheet.log`). | Loaf, 8x | Dark | Mid | Light | |---|---:|---:|---:| | Day, sheet | 23 | 32 | 34 | | Day, before | 37 | 36 | 42 | | Day, after | 24 | 26 | 37 | | Night, sheet | 17 | 27 | 30 | | Night, before | 36 | 34 | 39 | | Night, after | 12 | 29 | 33 | Review (orchestrator, 24 September 2026): Fable 5.1 review in run `wf_d139a07f-f5c`, acceptance met, no must-fix, three notes (the full-suite tally and the verify-run details, corrected above; the `fur_tint` comment says "linear" where Compatibility multiplies the sRGB colour, comment only). The Sonnet handoff check flagged the 4-minute gap, which belonged to the full suite's run (corrected above). Orchestrator view of `creatures-cat.png`: the tabby bands and cream chest read now, but the fur is still more yellow than the sheet's orange and the cat has no dark outline like the sheet's; left open for the owner. Not done: - The Creatures switch sits below the fold of the Scenery panel in a 1600x1000 capture, so it is checked headless (the `CheckButton`, a click on it, the preference file) but not photographed. - No hands-on interactive launch was watched. The interactive default is tested through `Mallard.wanted` and a source check. - Eight ducks round a 3x3 island is crowded. The count follows the open water, as the scope says. - With creatures on by default, the C1b open items now reach normal use: p99 creature cost up to 1.08 ms on drag steps, and arrivals about 1.2 s after the hand stops. - Platforms: Mac run; Windows not run (no new suite, so `Test.ps1` is unchanged).