diff --git a/F-progress.md b/F-progress.md index 2e078d0..ba6a3c7 100644 --- a/F-progress.md +++ b/F-progress.md @@ -4,6 +4,32 @@ --- +## Round 31 (v7.0-alpha CLOSE) — THE DIG FLIP + the tag + +**Fable's wave-0 playtest found the one alpha-blocker: the dig was default-OFF on a plain boot.** +`index.html` still carried the v2-era opt-in (`params.has('dig')`) six epochs after the README +claimed "dig on" — and every R30 game-loop gate booted `dig=1` explicitly, so the suite was green +while E at a bin did nothing on the boot every player gets. Fixed with the one-line flip +(`DIG_ON = flagOn('dig')` — ?dig=0 opt-out, ?classic=1 off, `dig` on the flags surface) and fenced +with two new STRICT legs: **default_boot_gate asserts dig REACHABILITY on a NAKED boot** (E at an +aimed bin → digActive true → closed clean) and **classic_regression asserts dig INERT at the bin** +(zero `pcdg-*` DOM, zero Storage calls — measured, not assumed). *Harness lesson #4: the +explicit-flag blindfold — a gate that force-feeds its subject's flag can never notice the default +is broken; every claimed-default-on flag needs at least one flag-ABSENT gate.* Splash de-staled +("Every door opens." — the "(soon)" is over; controls line = E riffle/sell · C crate · SLEEP to +save) + the README manual row. `PROCITY_QA_PORT` override so the suite never silently reuses +whatever holds :8130 (this round: Fable's own preview server). + +**The re-gate (final tree, :8931): `qa.sh --strict --matrix` 7 passed · 0 failed · 0 warn · +0 skipped; flags_check 0/0 incl. both new legs; MATRIX 10 towns green.** Money shot: +`docs/shots/v7_alpha/crate_panel.png` — Monster Robot Party's frontage, THE CRATE with 3 real +finds (real cover thumbs, honest paid/where/day), game bar day 1 · $116 · CRATE 3 · SLEEP, driven +through the real loop with the dig param absent. **Tag `v7.0-alpha` — annotated, LOCAL ONLY** +(Fable pushes). THE BETA QUEUE (Fable's design wants, filed NOT fixed) is in LANE_F_NOTES §31.6. +Commits: `50385c0` (flip + gates + splash) · shot + notes commit (tag target). Full record: §31. + +--- + ## Round 30 (v7.0-alpha — THE SAVE AND THE CRATE) — F: the contract first, then the save core + tomorrow **The contract shipped before a line of implementation** (`53fcd3c`): `window.PROCITY.game = diff --git a/docs/LANES/LANE_F_NOTES.md b/docs/LANES/LANE_F_NOTES.md index 8891dab..9fd2286 100644 --- a/docs/LANES/LANE_F_NOTES.md +++ b/docs/LANES/LANE_F_NOTES.md @@ -1663,3 +1663,94 @@ as §30.5's closed-door: a verify that forgets the world's rules reads the rules an inventory). Buying it again is possible **and loses money every time** (the −$6/trip measurement is exactly this); scarcity-per-day would need the save to carry per-day pull records. The no-pump clamp is what makes the infinite crate safe. Rule it in beta with the guide bands, not here. + +--- + +## 31. Round 31 — the v7.0-alpha CLOSE: THE DIG FLIP (wave 1) + THE TAG (wave 2) + +### §31.1 The alpha-blocker (Fable's wave-0 playtest) and the flip + +**The dig was default-OFF on a plain boot.** `web/index.html` still carried the v2-era opt-in +(`const DIG_ON = params.has('dig') && params.get('dig') !== '0'`) six epochs after the README's +flags table began claiming "dig on" — and every R30 game-loop gate booted `dig=1` EXPLICITLY, so +the whole suite was green while the boot every player gets had no crate-riffle at all: E at a bin +did nothing. The gates tested the game; nobody tested that the default boot IS the game. + +**The flip (one line + the law):** `DIG_ON = flagOn('dig')` — default-ON, `?dig=0` opts out, +`?classic=1` master-off: the exact pattern the other flipped flags ride. `dig` joins the +`PROCITY.flags` intent surface (the gates read intent there). Measured both ways in fresh +contexts on a port-isolated server (:8951): + +| boot | measured | +|---|---| +| NAKED (no params) | E at a bin → riffle **OPENED** + closed clean · `flags.dig` true · 0 errors | +| `?dig=0` | opt-out honoured — riffle does NOT open, **ZERO** dig DOM | +| `?classic=1` | dig INERT at the bin (E falls through `trySell` (null game) + shelf no-op) · ZERO `pcdg-*` DOM · **ZERO Storage-prototype calls** (instrumented) · 0 errors — the covenant untouched | +| `?noassets=1` naked | dig opens on **parody canvas** · 0 errors (existing law holds) | + +*(Observation filed, pre-existing, NOT touched: `assets/gen/*.jpg` skin textures fetch under +`?noassets` — 22 fetches, fail-soft, present since v1; the dig added zero fetches to that boot.)* + +### §31.2 The gate that makes the regression impossible (vacuous-gate law, turned on F's own suite) + +Two new STRICT legs in `tools/flags_check.py`: + +- **default_boot_gate** grows **dig REACHABILITY on the NAKED boot**: enter a record shop, E at an + aimed bin, `digActive` must go true (and close clean via WALK OUT); plus a `PROCITY.flags.dig` + intent assert. Un-flip the default again and this line goes red. Negative control: the identical + measurement on a `?dig=0` boot reads `opened:false` (pre-flight, :8951) — the detector + discriminates. +- **classic_regression** grows the **dig-INERT leg**: the old `digActive` assert was vacuously + false on the street; it is now measured AT THE BIN — E opens nothing, zero dig DOM, filed as + "measured, not assumed". + +**Harness lesson #4 of the epoch (house habit): the explicit-flag blindfold.** A gate that +force-feeds its subject's flag (`dig=1` in every boot query, belt-and-braces) can never notice the +default is broken. Where a flag is CLAIMED default-on, at least one gate must exercise it with the +flag ABSENT. Now true for dig; gigs/weather/winmap/tram always had it (the default-boot gate boots +naked by construction). + +### §31.3 Port isolation (small, suite-wide) + +`PROCITY_QA_PORT` env override added to `flags_check.py`, `qa/interior_scale_check.py`, +`qa/town_matrix.py`. `ensure_server()` silently REUSES anything parked on :8130 — this round that +was Fable's own preview server, and a shared server is somebody else's cache semantics + somebody +else's lifecycle. The R31 re-gate rode `:8931`; default behaviour unchanged. + +### §31.4 The splash (same file, same commit) + +"Every door opens **(soon)**" — stale by six epochs — is gone: the tagline now sells the loop +("Every door opens. Dig the crates, sell the flips, sleep — the town remembers.") and the controls +line carries the game beats (E riffle a bin / sell at the counter · C your crate · SLEEP to save). +README manual gains the matching row (sell at the counter · C crate · SLEEP = save/advance/rotate). + +### §31.5 The re-gate, the shot, the tag — RESULTS + +All on the FINAL tree (commit `50385c0`), suite port-isolated on `:8931` (`PROCITY_QA_PORT` — +Fable's preview holds :8130, untouched): + +- **`qa.sh --strict --matrix`: 7 passed · 0 failed · 0 warn · 0 skipped.** flags_check **0 fails / + 0 warns** — both new R31 legs green in the run (`dig REACHABLE on the naked boot — E at a bin + opened the riffle (and closed clean)` · `?classic dig INERT at the bin — E opened nothing, zero + dig DOM`), all five R30 STRICT gates re-proven over the flipped tree, classic covenant fingerprint + green, no-giants green. **MATRIX GREEN — 10 towns (synthetic + fixtures + real caches) × 7 gates.** +- **The money shot: `docs/shots/v7_alpha/crate_panel.png`** — Monster Robot Party's real frontage + (redhill_godverse, `stock=real`), THE CRATE open with **3 real finds** (The Return $40 · + First Filtration Of The Duplex Brains $15 · Blue Blackness $20 — real cover thumbs off the + per-shop atlas, every row honest: `paid $N · Monster Robot Party · day 1`), game bar + **day 1 · $116 · CRATE 3 · SLEEP**. Driven through the REAL loop with the dig param ABSENT (the + flip carries the shot): enter → E at three different bins → riffle → pull → BUY ×3 → street → + C. 0 console errors. Script: session scratchpad (`crate_shot.py`) — the PNG is the deliverable. +- **The tag: `v7.0-alpha`**, annotated, **LOCAL ONLY** on the notes commit — Fable reviews and + pushes main + tag together (treaty). + +### §31.6 THE BETA QUEUE (Fable's playtest, filed NOT fixed — John's ruling queue) + +1. **Spawn faces dirt/building-backs** instead of the strip — wants a cluster-pose for spawns. +2. **THE CRATE is unreachable inside shops** — C is street-only by design (hud.js); a player wants + it at the counter. +3. **Dawn sky reads dusk-orange** (cosmetic). +4. The pull card's **value hint is THE BIBLE** (chartered — the beta's guide bands). +5. Automation-only, unverified in person: **dig Esc-close under synthetic events**. +6. *(carried from §30.6)* no per-day `gone` tracking on parody/mint dig stock — scarcity-per-day + needs the save to carry pull records; rule it with the guide bands. diff --git a/docs/shots/v7_alpha/crate_panel.png b/docs/shots/v7_alpha/crate_panel.png new file mode 100644 index 0000000..191ec06 Binary files /dev/null and b/docs/shots/v7_alpha/crate_panel.png differ