From 180747ce28c4a93841fc6bb013332dc8c3152464 Mon Sep 17 00:00:00 2001 From: type-two Date: Fri, 17 Jul 2026 20:01:38 +1000 Subject: [PATCH] [screen] round 4 notes Co-Authored-By: Claude Opus 4.8 --- fktry/lanes/LANE-SCREEN.md | 86 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git a/fktry/lanes/LANE-SCREEN.md b/fktry/lanes/LANE-SCREEN.md index a5139a7..00dbad3 100644 --- a/fktry/lanes/LANE-SCREEN.md +++ b/fktry/lanes/LANE-SCREEN.md @@ -302,3 +302,89 @@ piles** are the obvious next spatial artifacts (both are regional in the codex), biomes in §1 would suggest a mask per era. Also, now that strain reads the snapshot, THE SCREEN could react to `jammed` entities (a stalled factory *should* look bored — the feed drifting back toward clean is a nice punishment), but that's a design call, not a lane call. + +### Round 4 — 2026-07-17 — Opus 4.8 + +SHIPPED: all 4 orders. Thanks for granting capacity unasked. +- `boredom.ts` + `boredom.test.ts` (new) — pure freshness curve, 7 tests. +- `strain.ts` — second dread axis; `strain.test.ts` now 20 tests. Screen suite 57 green. +- `overlays.ts` — ratification card painter + era→standard table. +- `glitchStack.ts` — pallor pass (desaturate + vignette), card composite. +- `index.ts` — boredom wiring, card lifecycle, `researched` handling, pallor easing. + +DESIGN INTENT, one line each (as ordered): +- **tremor = "how many seconds until dark?"** ACUTE. The cliff edge. Only exists while something + is actually draining, and it spikes as the runway runs out. Expressed as motion: judder. +- **pallor = "how much cushion do I have at all?"** CHRONIC. Sits there in surplus. Expressed as + colour: the saturation drains out and the corners close in. +A full tank draining fast is a jolt; a near-empty tank coasting is a way of life. Different +questions, different senses, so they never mush into one dial. + +DECISIONS: +- **Pallor drains saturation on purpose.** Codex §8: "ALL saturation belongs to media/artifacts. + Color = value = literally the resource." A factory with no reserve should therefore literally + have less colour. The vignette does the rest. It fits the existing strain/fever/seizure + hierarchy as the quiet one: chronic, slow tau (2.0s), never louder than the corruption. +- **The capacity trap**: `1 - stored/capacity` with no tanks built reads as "totally empty" and + would have painted the boot state grey — blowing up round 3's sterile guarantee on day one. + No tanks = no cushion to miss = no pallor. That's not a special case, it's the honest reading: + you cannot be low on a reserve you never built. Two tests pin it (capacity 0 AND undefined). +- **Boredom decays the DISPLAY, never the ledger.** `fresh` scales the targets; the tally + underneath is untouched. Verified explicitly: after 4 idle minutes the sky is clean but + `units: 72, tally: {melt: 60}, total: 0.893` are all exactly as earned. +- **Boredom horizon: 60s grace, then 180s decay (4 minutes to clean).** You asked for minutes, + not seconds. A full minute of silence changes literally nothing, so a jam you notice, diagnose + and fix is free. Recovery rides the normal 1.2s shipment ease — against a 4-minute decay that + reads as a snap, and it reuses the wave feel rather than inventing a second motion. +- **The card is timed in SECONDS, not frames** — it's a broadcast interruption and must be one + second at any refresh rate. Verified 30 frames @30fps AND 60 frames @60fps. (Deliberate + contrast with the scram wipe, which stays frame-counted: that one is a tape artifact, and tape + artifacts are quantized to frames. Two different clocks for two different fictions.) +- Card composites dead last in screen space, so not one pixel of it is corrupted — that IS the + joke. Hard cut on exit, no fade: the corruption crashes back rather than seeping, because a + dissolve would make The Correction look negotiable. +- Card says the STANDARD, not the tech id (codex §1 names: OPTICAL FILM, NTSC / PAL ANALOG, + MPEG-2 / DVD, H.264 / HEVC / AV1, DCP) with the green tick from §8's Correction uniform. The + tech id is in the small print where a compliance notice would put it. + +VERIFIED (fixture snapshots, pixel reads, contact sheet): +- **Sterile guarantee survives the new axis**: boot AND a tankless factory in surplus both render + byte-for-byte identical to no-snapshot, pallor 0. +- **Two dreads are separable at the pixel level**: full-tank-draining-fast → tremor 0.50, pallor + 0, saturation 0.621 and corners 96 both *unchanged from healthy*. Empty-tank-coasting → tremor + 0, pallor 0.972, saturation 0.500, corners 26.6. MAD between the two: **43.7**. They do not + look like the same emergency. +- **Boredom**: untouched at 60s → fresh 0.834 at 90s → 0.5 at 150s → 0 at 240s → stays 0. Ledger + intact throughout. Resume: freshness 1 instantly, picture home in ~1.5s. +- **Card**: 30 frames @30fps, 60 @60fps = 1.00s both. Mean luminance 83 → 235 → 83. +- **Budget: 0.078 ms/frame** with GPU sync, 2000 entities, every artifact + both dreads + fever + + brownout + card compositing. ~26× under. +- Note for the record: **tremor is invisible in a still** — it's motion, so the contact-sheet tile + looks like HEALTHY. I pinned it numerically instead (0.50, MAD 6.8 vs sterile). A still frame is + the wrong instrument for a judder and I didn't want that filed as "verified by screenshot". + +BLOCKED/BROKEN: nothing in my lane. **One thing the fleet needs to know:** +- `npm test` currently shows 6 red in `src/ui/live.test.ts` ("reference factory should contain a + software decoder", commission/entity-count assertions). **Not mine, and not LANE-UI's fault + either**: LANE-DATA has uncommitted edits to all five `data/*.json` in the shared tree, and + UI's live tests build a reference factory out of that data. I confirmed by stashing *only* + `src/screen/` — the same 6 still fail with my lane entirely absent. +- **Warning about the shared working tree**: my first instinct was `git stash`, which stashed + every lane's uncommitted work, not just mine — and made the UI tests "pass", which nearly had me + believing I'd broken them. `git stash push -- src/screen/` is the only safe form here. Any lane + bisecting a red test in this tree can be badly misled by a bare stash. Worth a line in + MASTERPLAN if you agree. + +CONTRACT REQUEST: none. v4 gave me everything; fixtures now carry `commissionQueue` and +`research` ahead of the v5 hardening (order 4 done). + +PROPOSAL: boredom currently only listens for `shipped`. A factory that is *jammed solid* and one +that is *idle because the player is redesigning it* decay identically. You approved the stalled- +factory idea as design — if you want the distinction, `jammed` entities in the snapshot could make +the sky decay noticeably faster (the work is rotting, not resting) while a clean idle stays +gentle. That's a one-line read of data I already have. Say the word and it's a small round-5 item. + +NEXT (not self-assigning): the era→standard table means THE SCREEN now knows about eras — the §1 +strata skins (sepia Reel, phosphor Broadcast, rainbow-on-black Disc) could drive the *base feed's* +palette per the player's current era, so the clean programming itself ages as they tech up. That +plus the mask template would give era-flavoured biomes on the sky.