HardYards/SPRINT15.md
m3ultra 3dee2a7c83 Merge origin/main: S14 lane integration + review fixes; TEETH becomes SPRINT16
Two same-day integrations reconciled: their SPRINT15 (post ruling, editor
iterative, honest edges) stands and runs first because it re-measures the
numbers TEETH pins; the TEETH plan moves to SPRINT16 with a fires-after-15
banner, its D gate rewired to the landed swing lawn. ROADMAP arc 0 records
the fork. THREADS keeps both sides chronologically.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 10:34:21 +10:00

109 lines
6.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# SPRINT 15 — THE POSTS TELL THE TRUTH, AND THE EDITOR STOPS BEING BATCH
*Sprint 14 built the yard editor and it immediately earned itself: nine bugs
found before anyone authored a yard with it, three of them live on the public
URL. D then authored a complete third yard cold — no JSON, no console — and
it scored winnable-but-mean and played that way. 406/0/0, live at
partly.party/hardyards, editor included.*
*What it also found is a shipped balance bug we deliberately did not patch,
because half the repo's measured numbers are standing on it. That's gate 1.*
Read THREADS from the last [I] entry. Baseline **406/0/0**; keep it green,
mutation-check anything you'd call coverage.
## Gate 1 — THE POSTS TELL THE TRUTH (A rules · E supplies · B re-measures · D re-plays)
The factory bakes `rating_hint = 0.9` on `sail_post`'s `top_anchor`. Every
post in every shipped site is a plain JSON entry with **no `node`**, so
`adoptAnchor` never runs and they all default to **1.00**. Every honest post
in the game is 10% stronger than E designed it, and always has been.
This is a gate and not a patch because A's `separation` block pins measured hp
through the real chain, B's audit tables predict against it, and D's played
verdicts sit on it. Move the number and all three move together, in order:
1. **A rules FIRST, before anyone measures:** is the honest post 0.90 (E's
design intent reaches the sim) or 1.00 (the shipped value becomes canon and
E's baked hint is corrected to match)? Both are defensible — 1.00 is what
every played verdict in THREADS actually measured, and "the value we shipped
and balanced against is the real one" is a legitimate ruling. What is NOT
defensible is leaving the factory and the sim disagreeing. **Whichever way
it goes, the mechanism must be fixed so a baked hint can never again fail to
reach a JSON-declared anchor silently** — that's the actual bug, and it will
bite the next asset the same way (`tie_off`, `collateral`, anything).
2. **E:** make the factory agree with the ruling and pin it — an assert that a
JSON-declared anchor of a type the factory rates carries that rating at
runtime. Your S14 audit rules (no silent anchors, no unpriced collateral)
are the model; this is the third of that family.
3. **B:** re-measure everything that moved. If the ruling is 0.90 every post
line in both shipped yards gets weaker — expect the separation pin, the
winnable-lines tables, and the night-4/5 affordability story to shift, and
post the deltas as a table. Propose retunes with evidence; A rules.
4. **D:** re-play the affected nights and say whether the change is FELT. If
0.90 makes the honest line stop holding, that's a design change wearing a
bugfix's clothes and you're the one who says so.
## Gate 2 — THE EDITOR STOPS BEING BATCH (B owns; D judges)
D's verdict: the 7582 s fully-blocked score "made the editor batch, not
iterative — I scored once and shipped that run rather than tuning." That is
the difference between a tool you author WITH and a tool you check work AGAINST.
1. **B:** make the score interruptible and legible. In priority order — a
progress tick that actually paints (D says this may matter more than raw
speed), then yielding so the page stays responsive, then speed itself
(the cost scales like C(n,4) in candidate quads — a coarse pass that ranks
before it flies is likely worth more than micro-optimising the sim).
Whatever you do, the numbers must not change: pin the current site_02 and
site_03 scores before you start and reproduce them after.
2. **B + C:** one storm picker, not two independently-defaulted ones (D scored
the wildnight while viewing the southerly — the exact class of
two-harnesses-disagreeing this repo keeps paying for, now inside one page).
3. **D:** re-author or re-tune a yard with the faster loop and say whether it
changed how you work. That's the acceptance test, same as gate 3.2 was.
## Gate 3 — THE EDITOR'S HONEST EDGES (A owns, mostly)
D's friction list, by owner, all seen in anger:
1. **A:** number fields commit on blur only — Enter does nothing, and a house
sat on the garden bed while the panel read the new value. Commit on Enter.
2. **A:** objects place outside the fence silently and the yard still reads
VALID. Either validate the yard bounds or draw the boundary — a yard that
lies about being valid is the one thing this editor must never do.
3. **A:** zoom is wheel-only (no keyboard, no pinch).
4. **A+B:** no `separation` field exists in the editor, while B's score card
says a shipping site should pin one. Either add it to the SITE panel or
rule that separation is an integration-time concern and say so on the card.
5. **A:** honour `tie_off: false` at the palette layer if you offer anchors by
name from GLB nodes (E's flag; the runtime half is already honoured).
## Gate 4 — JOHN PLAYS, THEN CHOOSES (nine sprints)
**⚡ THE BRANCH HALF OF THIS GATE IS RESOLVED (2026-07-18, integration checkout):**
this sprint plan and a TEETH sprint plan were written in parallel forks the
same day, and John ruled while they were being reconciled — **all three
branches, sequenced: teeth → sites/clients → heatwaves.** ROADMAP.md (new,
the growth canon) carries the arcs; SPRINT16.md carries TEETH pre-speced,
firing when this sprint integrates. The gates above stand exactly as written
— they re-measure the numbers SPRINT16 pins, which is why 15 runs first.
**The PLAY half stands:** partly.party/hardyards — five nights, three
sentences in THREADS. The fabric key (F) is newly live; night 3's yard has a
sibling now (`site_03_swing_lawn`, inert until SPRINT16 wires it).
- **More sites** — D's `site_03_swing_lawn` is authored, scored and played,
sitting inert waiting for a NIGHTS entry. This branch is now nearly free.
- **Reputation / warranty** — DESIGN.md's consequence loop; the invoice exists
to hang it off. Unchanged in cost.
- **Heatwave days** — the slow-pressure half of the design, sun-arc coverage,
a genuinely different puzzle. Unchanged in cost.
Nobody builds any of the three this sprint.
```
gate 1: the post hint ruled, the mechanism fixed so a baked hint cannot
silently fail to reach a JSON anchor, both yards re-measured, D re-plays
gate 2: the score paints progress and stays responsive; numbers reproduce
exactly; one storm picker; D says the loop changed
gate 3: Enter commits, out-of-bounds stops reading VALID, the friction list empty
gate 4: John's three sentences + the branch, in writing
```