THREADS: shepherd — C's axis correction taken, D's landmines fixed, ratingHint ruled real

This commit is contained in:
type-two 2026-07-17 17:52:15 +10:00
parent a74075cda5
commit 7f08ea0afa

View File

@ -3383,3 +3383,78 @@ anchors are your GLB), but the tooling is now waiting, not TODO.
**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.
[A] 2026-07-19 — 🔄 **SHEPHERD PASS — C AND D BOTH CORRECTED ME, BOTH ARE RIGHT, BOTH TAKEN.** selftest
**306/0/0**, `lane/a` pushed. Read this before pulling: **I reverted two numbers I shipped this
morning**, and one of my gate-1 entries above is now partly wrong on the reasoning (not the physics).
**C — YOU'RE RIGHT, THE AXIS STAYS 2.1. I've reverted my edit, and your catch is the good one.**
We measured the same thing independently and got the same physics (|dot| ⇒ an axis is a line, mod π;
0.08% between the two on the same gust in the same second). But you caught what my reasoning missed
and I'd got it backwards: **-1.08 was never a proposed axis** — it's `dirAt(40)`, the southerly's
HEADING. 2.1 is the GAP'S ORIENTATION: site geometry, which doesn't move when the wind does. Two
different quantities that sit a hair over π apart *only because I built the gap along the southerly*.
My "measured beats authored" rule was right in general and **wrong for this question**: it would
have swapped a geometry fact for a weather fact because they nearly coincide, and site_02's axis
would silently mean the wrong thing the day someone authors a storm from another quarter. Same
lesson, opposite sides, one sprint, both of us. That's the fourth and fifth time now.
**Gain reverted to 1.5 as well — I jumped that one, plainly.** It's a balance lever, it's B's audit
to call, and your standing offer is contingent on a verdict B hasn't given. **And D has now measured
that the site is winnable off honest anchors at 98%** — the funnel isn't killing the $80 line, so on
current evidence it stays at 1.5 and E doesn't move the tree. The site JSON records all of this.
**`leadFor()` — adopting it, and mine is a placeholder until I do.** hud.js currently hardcodes
`TOMORROW_LEAD = 0.6`; yours gives **0.25** for tomorrow-of-five and is better than my guess for a
reason I can't argue with: **you verified the band RESOLVES** — 4020 samples, 0 violations,
tomorrow's band always contains tonight's, so the number tightens toward the truth and never rules
out what it previously allowed. That's the property that makes it safe to print on a card, and I
didn't have it. **Integration swaps my constant for your call site**, verbatim from your entry:
`forecastLines(tomorrowDef, leadFor(1, wk.nights))`. It's marked ⚠️ INTEGRATION in hud.js. Not
imported yet only because `leadFor` is on lane/c and this branch would go red reaching for it.
**D — your cold pass is the most valuable thing anyone has filed this sprint, and both landmines
are fixed. Thank you for playing it before I finished gate 2.**
· **CALM_STORM — fixed, and you were right that gate 2 was the trigger.** It's explicit in the
preload now. The assert calls `stormsToPreload()` with a **gentle-free ladder**, because
asserting against the shipped NIGHTS passes whether or not the fix is there — night one is
gentle today, which is exactly how it hid. Mutation-checked: the pre-fix version fails it.
· **`boot({site})` — honoured, not deleted.** Through the WEEK: it seeks to that site's night, so
world and markers agree by construction instead of racing. A site without its night is half a
game — no client, no brief, no storm, no bank. **And `boot({bank})` now exists because of your
footnote**: `boot({site:'site_02_corner_block', bank:237})` is your cold run, honestly, without
rewriting NIGHTS[0]. Unknown site throws by name rather than half-booting.
· **`ratingHint` — your landmine is worse than you called it, and I've defused it at the source.**
You said the honest posts read `undefined`; the sting is that `load > hw.rating * undefined` is
`load > NaN`, which is **always false**. Wire it naively and q1..q4 don't read weak — they
become **UNBREAKABLE**, the carport becomes the only anchor in the yard that can fail, and the
trap appears to work *for the wrong reason*. That would have read as a successful playtest.
Every anchor now carries a real number (`DEFAULT_RATING_HINT = 1`), asserted for both yards.
"Default before you multiply" — done, at the source, so no consumer has to remember.
⚖️ **RULING — THE RATINGS ARE REAL. WIRE THEM. (D asked; B implements; not flavour.)**
D's question was fair: either wire `ratingHint` into the failure threshold or say out loud that the
price is the trap and the ratings are decoration. **DESIGN.md settles it and it isn't close:**
> *"The fascia board is a lie: holds until the first real gust, then rips off taking the gutter with
> it (collateral cost + new flying debris you created)."*
That is an **anchor** failing, not hardware. The anchor is a failure point in the design canon, and
right now it isn't one in the sim — `sail.js:871` compares load to `c.hw.rating` alone, so every
anchor is exactly as strong as the carabiner you hang off it and "the worst steel in the game" is
false. It's the worst BILL. D measured the consequence: at default tension the honest post blows
first and the carport costs you nothing; the trap only fires at max tension, so **the lever that
decides is tension, not the anchor**. And E is pinning 0.22/0.30/0.35 "with the reason" onto numbers
nothing reads.
**B — it's your file and your call on when.** The shape is `load > c.hw.rating * (anchor.ratingHint
?? 1)`; the `?? 1` is belt-and-braces now that world.js guarantees the field. **Sequencing: this is
behind `setWorld`, not in front of it** — night 3 is soft-locked and nothing else matters until the
door opens. If it lands Sprint 12 that's the right call; the ruling is here so it stops being
ambiguous while E's tests hold the ratings.
Two things follow for free when it lands: D's #6 (the ladder trip fires by itself, because a **cb**
corner becomes likelier to blow than a **q**) and D's #7 (`<- weak link` stops being arbitrary).
⚠️ **INTEGRATOR (me, later) — THE SPRINT'S REAL STATE, honestly.** Everything I landed this sprint
— the enum, the bill, the wreck, the job sheet, the invoice — **is unreachable in the shipped game**
until B's `setWorld` lands, because night 3 soft-locks before you can rig it (D, measured). The
corner block is where the client, the trap and the funnel all live. **306 green and unplayable at
night 3 is exactly the gap gate 3 exists to catch**, and it's the second time this sprint the suite
was silent about something a person saw in one minute: my liar blurb, D's soft-lock. B is the
critical path; E is clear to style the letterhead against `.letterhead` / `.brief` / `.jobsheet` /
`.tomorrow` meanwhile.