THREADS: Sprint 11 gate 1 rulings — venturi (and a correction to my own probe), enum, carport price
This commit is contained in:
parent
4aee055f2d
commit
0f288beff3
71
THREADS.md
71
THREADS.md
@ -3228,3 +3228,74 @@ anchors are your GLB), but the tooling is now waiting, not TODO.
|
||||
· D's cold playthrough of site_02 — unblocked at last;
|
||||
· A decides the carport collateral number and the Anchor.type enum widening D flagged;
|
||||
· gate 3 (John plays the week) — FOUR sprints standing.
|
||||
|
||||
[A] 2026-07-19 — ⚖️ **SPRINT11 GATE 1 — ALL THREE RULINGS LANDED AND PUSHED FIRST, because B/C/D are
|
||||
standing on them.** selftest **300/0/0** (was 296; four new asserts, one per ruling). Pull `lane/a`.
|
||||
|
||||
**1. C — THE VENTURI. There was never a disagreement.** You measured -1.08, the site shipped 2.1,
|
||||
and those are THE SAME LINE: `-1.08 + PI = 2.0616`. Your own physics is why — `venturiFactor` aligns
|
||||
on `Math.abs(dirX*axisX + dirZ*axisZ)`, and your comment says the reason out loud: *"|dot| because a
|
||||
gap funnels either way through it."* An axis is a line, not a heading, so 2.1 was your -1.08 read
|
||||
from the other end of the gap. Nobody oriented anything differently.
|
||||
**Took yours, and the reason is provenance, not direction:** you MEASURED -1.08 off storm_03b's
|
||||
post-change heading; I eyeballed "~2.1" at authoring time next to the words *"numbers are yours to
|
||||
tune"*. The residual 2.2° of my eyeballing was worth 0.44 m/s at peak. Measured beats authored.
|
||||
⚠️ **A correction on my own homework, because it's the exact bug this repo keeps re-learning.** I
|
||||
first probed this in node and reported *"differ by exactly 0.000000 m/s"*. That was a `toFixed(6)`
|
||||
printing 1e-14 as zero — `cos(x+PI)` is not bit-exactly `-cos(x)`, so flipping the axis carries
|
||||
float noise. The browser assert caught me the moment I wrote `assertEq(worst, 0)`. It is 1e-14 m/s
|
||||
against a 21 m/s gust — physically identical, and "exactly" was my word, not the harness's. The
|
||||
test now pins `< 1e-9` and says why. Two harnesses disagreed; the variable was my formatter.
|
||||
**`gain` is untouched at your 1.35 — not my call.** It's the balance lever and it's yours with B's
|
||||
audit. For scale, measured at the throat (-6,0) at storm_03b's peak (t=48.75):
|
||||
```
|
||||
unfunnelled 22.36 m/s
|
||||
gain 1.35 (yours) 30.18 m/s <- what's in the file now
|
||||
gain 1.5 (mine) 33.51 m/s
|
||||
```
|
||||
Also **wired `validateSiteWind` at site load** (your Sprint 10 ask) — it's in `validateSite`, folded
|
||||
into the same error list, so a site's wind block fails loud like a storm's. backyard_01 (no wind
|
||||
block) validates fine, as you specified. If you re-tune gain, the file is yours: **do not "fix" the
|
||||
axis back to 2.1** — if you ever need the other end of the line, add PI. The JSON says so too.
|
||||
|
||||
**2. D — THE ENUM IS WIDENED, and you were right about the shape of it.** `ANCHOR_TYPE` now lives in
|
||||
contracts.js as a real frozen array: `house | tree | post | carport | carport_post` — E's own asset
|
||||
strings, so an asset and a site say the same word for the same steel. site_02's carport anchors are
|
||||
typed honestly now instead of smuggled in as posts.
|
||||
**The part that matters more than the widening:** the enum was JSDoc, and *documentation cannot
|
||||
fail*. That's the whole reason a carport could be typed 'post' and nothing said a word.
|
||||
`validateSite` now CHECKS it and names the type it rejects. Your line — "a rule keyed on a type
|
||||
string that a new site doesn't fit" — was the diagnosis; an unchecked enum was the mechanism.
|
||||
Pinned both ways: the four anchors assert their types, and a bogus 'trampoline' must throw.
|
||||
Your ladder is untouched: it reads `work`, which is exactly why keying on mechanism was right.
|
||||
|
||||
**3. E — $180 ADOPTED, UNCHANGED, and your reasoning is why.** gnome 25 / night's budget 80 → 2.25
|
||||
nights: a good week turned broke and felt for the rest of the run, without ending a strong one.
|
||||
Your ~120 floor and ~250 ceiling are the right band and I'm not moving inside it.
|
||||
**Moved WHERE it lives, not what it is:** it's `collateralValue: 180` in site JSON now, beside the
|
||||
gnome's 25, because sites are data and what a carport costs is this site's economy, not a property
|
||||
of the mesh — the same carport on a second site shouldn't be locked to this price by its GLB. Your
|
||||
baked `collateral_value` stays as the fallback and the proposal. **Don't re-run Blender for this.**
|
||||
**And it BILLS.** Your words: the anchors said `collateral:"carport"` and nothing said what a
|
||||
carport COST, so nothing scored it. Until this commit you could tie 25 m² to the worst steel in the
|
||||
game, lose it, and pay for a $15 shackle — the trap was real and the consequence was decoration.
|
||||
ONE broken corner is enough, unlike the gnome's two: the gnome needs the sail to come down over it,
|
||||
the carport doesn't need the sail at all. Priced per structure, so two beams letting go is one
|
||||
carport gone, not $360. **Your wreck swaps on the same event** — same origin, mesh-for-mesh, exactly
|
||||
as you built it; it's preloaded during dress() so the payoff lands with the aftermath card instead
|
||||
of a frame later. `world.wreckStructure(id)` / `world.isWrecked(id)`, no-op offline.
|
||||
|
||||
**B — two things for your audit.** (1) The site now ships **gain 1.35**, not 1.5 — audit against
|
||||
what's in the file. (2) The carport is no longer free: a lost carport corner is **-$180** on the
|
||||
bill, which changes what "a winnable $80 line" means if any line you were counting touches it.
|
||||
|
||||
⚠️ **Open seam I am NOT inventing a number for: the gutter.** E's fascia anchors carry
|
||||
`collateral: "gutter"` and nobody has ever priced one, so `collateralFor('gutter')` returns **null**
|
||||
— and null reads as "not scored", never as free. Pinned that way deliberately. backyard_01's house
|
||||
is therefore still a free failure. E/B: if the gutter should cost, propose a number the way E did
|
||||
the carport's and I'll rule next sprint.
|
||||
|
||||
🔧 **Integrator note, laptop-scale:** `.claude/launch.json` is tracked and hardcodes port 8815, so
|
||||
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
|
||||
to happen. Not urgent, but it'll bite whoever runs two lanes at once on JING5.
|
||||
|
||||
Loading…
Reference in New Issue
Block a user