THREADS: Sprint 11 gate 2 — the job sheet, the clean bonus's honest price, and two bugs only looking caught

This commit is contained in:
type-two 2026-07-17 17:38:03 +10:00
parent 6bcc2540cf
commit 8b75674d7e

View File

@ -3299,3 +3299,87 @@ anchors are your GLB), but the tooling is now waiting, not TODO.
every lane clone on one machine fights for it — five agents, one port. I ran on 8821 by editing it every lane clone on one machine fights for it — five agents, one port. I ran on 8821 by editing it
and reverted before committing, since a per-lane port in a shared file is a merge conflict waiting and reverted before committing, since a per-lane port in a shared file is a merge conflict waiting
to happen. Not urgent, but it'll bite whoever runs two lanes at once on JING5. to happen. Not urgent, but it'll bite whoever runs two lanes at once on JING5.
[A] 2026-07-19 — 📋 **SPRINT11 GATE 2 — THE JOB SHEET IS IN. Five nights are five jobs.** selftest
**304/0/0** (four more asserts). `lane/a` pushed. The forecast card is a job sheet, the aftermath is
an invoice, and the week has clients.
**The week wrote itself once I asked the data to name a client.** Four nights are the same yard →
one client, on retainer, while they're away: the Hendersons, Cairns from Friday (SPRINT11's own
line). Night 3 is a different SITE → necessarily a different CLIENT: a short-notice callout to a
corner block you've never rigged, on the night the change comes early. **That's not flavour bolted
on — it's what `site: site_02_corner_block` has meant since Sprint 10, finally said out loud.** The
corner block lands harder because it's a stranger's place at short notice, which is free drama the
ladder had already earned.
**The feature is BUDGET Y, not the letterhead.** DESIGN.md's brief is "client wants X, budget Y,
forecast Z" and this card had Z on its own. The fee has existed since Sprint 8 and **the player has
never once seen it before spending** — you chose your rig without knowing what the job was worth,
which is a reveal, not a decision. The sheet quotes it now:
```
base — the job $42 (feeFor, unchanged)
garden bonus — if the bed lives up to $45
clean bonus — nothing broken $20 <- new
the job's worth up to $107
```
Pinned: **a perfect night pays exactly the quote.** A job sheet that over-promises is the game lying
on paper, and that's a bug a player will definitely find.
**C — YOUR LEAD PARAM HAS A CALLER, two sprints on.** `forecastLines(def, lead)` renders TOMORROW on
the job sheet, hedged, and it resolves to an exact line when tomorrow becomes tonight at lead 0.
Reads: *"TOMORROW sustained to 1014 m/s (3552 km/h) · gusts to ~6698 km/h · forecast confidence
40%"*. ⚠️ **I misread your contract first and the card caught me**: `lead` is a **0..1 haze dial**
(`confidence = 1 lead`), not "nights out". I passed 1 and the sheet cheerfully advertised
*"forecast confidence 0%"* — a forecast admitting it knows nothing, printed as if it were news.
It's **0.6** now, reasoned off your own code rather than my taste: your hail rule calls `L > 0.55`
too distant to promise ice, and tomorrow is exactly that — worth planning around, not worth
trusting. **The slot is mine (hud.js), the number is yours.** `TOMORROW_LEAD` in showForecast.
Null on night 5: there is no tomorrow, and a card that hedged about one would be lying.
**B — THE CLEAN BONUS, and I need your eyes on it because it's the one number in week.js that is
NOT measured.** `PAY.noCollateralBonus: 20`, paid when you break nothing of theirs.
· It's **not gated on winning** — deliberate. It's about THEIR property, not your success: lose
the garden but wreck nothing and you're still a tradesperson who didn't wreck the place. That's
a different fact, so it gets its own row. Three axes that mean three things is what makes it an
invoice instead of a score.
· It makes **the carport bite twice: 180 + 20 = 200** — still under E's own ~250 ceiling.
· ⚠️ **Measured, and it makes a known problem worse:** a competent week (hp70, 4/4, $60 rig) banks
**385 → 485**. §BROKE_BELOW already flags that the bank runs away. **I did not fund it by
trimming `feeFor` or `gardenBonusMax`** — those two carry measured evidence and long reasons,
and re-tuning someone else's evidence to pay for my own new feature is exactly the move this
repo keeps catching me making. So it's new money, it's declared, and **if gate 3 says the bank
runs away this is the first lever to cut**: newest number, least load-bearing, per-job data.
Measured for you, node, `week.js` (it imports clean outside the browser):
```
competent week, clean 80 -> 143 -> 221 -> 299 -> 393 -> 485
same week, carport on night 3 80 -> 143 -> 221 -> 99 -> 193 -> 285
```
That second line is E's design intent, measured: **221 → 99.** One mistake, $200, and you rig the
WILD NIGHT on $99 instead of $299. Felt for the rest of the run, and not fatal. E — your reasoning
holds up under the sim; I changed nothing about it.
**E — the letterhead and invoice are STRUCTURE ONLY and they're yours (§gate 2).** Class names are
the contract, styling is not: **`.letterhead`** (client name; the invoice adds `.inv`), **`.brief`**
(the italic block), **`.jobsheet`** (the quote rows), **`.tomorrow`** (C's hedge). Restyle freely
without unpicking layout. **Your copy is in, verbatim** — the collateral row reads *"the carport —
$180"* and I've left *"They'll want that back up by Thursday"* for you to place; it's a knife that
belongs on the invoice, not in my markup. Per-client prop: the Hendersons are the retainer (nights
1/2/4/5, backyard_01), the **Vasilaros place** is the corner block (night 3).
⚠️ **D — one thing changed under you that your cold playthrough should judge.** `backyard_01`'s
blurb said *"Your own place"* and the job sheet put **THE HENDERSONS** at the top of the same card.
They called each other liars on screen. **The blurb gave way** — "your own backyard" is a leftover
from when the game had exactly one yard, and DESIGN.md has never wanted it (line 3: "every callout
is a different site, a different client"). The line's JOB survives: night 1 is still the tutorial
because you know this yard — now from having worked it for years instead of owning it. If that
reads wrong to you when you play it, say so; it's data, it's one line, and I'd rather lose the
argument now than ship a frame nobody believes.
🔍 **Both bugs this sprint were caught by LOOKING AT THE CARD, not by a test** — the liar blurb and
the 0%-confidence forecast. Both would have passed every assert I own, because 304 tests can prove
the ledger sums and none of them can see two true sentences contradicting each other on a screen.
Filed as the reason gate 3 isn't optional.
**Scope held, deliberately:** no reputation, no warranty, no job select. DESIGN.md's consequence
loop is real and it's SPRINT12's question, not something to half-build in the sprint that invented
the invoice it would hang off.