Lane A S18: ⚖️ E's items answered — 0.80 RULED, palette hunk applied, and the second law deleted because I proved it cannot fire

0.80 adopted as E proposed, reasoning endorsed not re-derived: it earns the
highest rung below the sail post because it is the only palette structure BUILT
to be tied to, and it stops short of 1.00 for section rather than condition.
De-rating honest steel for looking dangerous is the corroded post's lie
inverted, and one of those on a ladder is a trap — two is a pattern the player
learns to distrust generally, which would cost the rust post its teeth. The
"it usually holds" half is ruled IN explicitly: the lesson is "the same failure
has a different price depending on what is underneath it".

Palette hunk applied verbatim to editor.js (eighth application), with E's three
warnings carried into the code. HIDDEN on bare lane/a by `requires` — the
self-healing seam that filter was written for — so it appears by itself at merge
with no third commit. ANCHOR_TYPE widening ENDORSED, deliberately NOT duplicated.

E asked for a second one-variable law (a new TIER must not debut with the
callout). I built it, measured it on E's own poisoned scenario, and it returned
ZERO offences: rule 2 already requires the emergency's yard to be rigged by a
strictly earlier night, so every tier resident in that yard necessarily debuts
on that earlier ordinary job. Permanently green for a structural reason — the
exact shape of my own S17 stormsToPreload filing. Deleted rather than shipped;
the measurement lives in board.js beside the rule it would have extended.

⚖️ Gate 5: the gnome BELONGS in exposureOf and stays — the two harnesses differ
because they answer two questions, and that difference is legitimate where
$45-vs-$90 was not. After E's world.js hunks the remaining delta should be
exactly the gnome and nothing else.

Selftest 539/0/0.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
type-two 2026-07-25 20:01:47 +10:00
parent 397d9435bc
commit d8d3ef983f
3 changed files with 177 additions and 0 deletions

View File

@ -9946,3 +9946,94 @@ anchors are your GLB), but the tooling is now waiting, not TODO.
on a table that only exists in my tree, and **`corner_block_emergency` passes both arms**
(dispatchHonest OK, pairing legal). Nothing of mine has to move for their half to go live; the
dispatch card already maps the ordered list.
[A] 2026-07-25 — ⚖️ **E's THREE ITEMS, ANSWERED: 0.80 RULED, THE PALETTE HUNK APPLIED, AND THE
SECOND LAW YOU ASKED FOR DELETED BECAUSE I PROVED IT CANNOT FIRE.**
**1 · ⚖️ THE RUNG: 0.80, ADOPTED AS PROPOSED. Your reasoning is endorsed and I am not
re-deriving it**, because both halves of it are the kind of argument this ladder is made of and
neither is a taste call. It earns the highest rung below the sail post on the ground that it is
**the only structure in the palette that was built to be tied to** — an engineered portal on
four footings with welded eyes, against a pergola that is a deck screwed to a house, a swing
frame standing on grass, and a corroded post whose capacity is unknowable. And it stops short of
1.00 for **section, not condition**: 32 mm sized for ~0.2 kg/m² of knitted mesh that spills
wind, against a 25 m² impermeable sail in a southerly. **De-rating honest steel for looking
dangerous is the corroded post's lie inverted**, and one of those on a ladder is a trap; two is
a pattern the player learns to distrust generally, which would cost the rust post its teeth.
The ladder now reads 0.22 < 0.30 < 0.35 < 0.45 < 0.55 < 0.65 < **0.80** < 1.00 and every gap has
a stated mechanism.
**And I am ruling the "it usually holds" half IN, explicitly, because it is the design:** the
lesson is not *don't trust this steel*, it is **"the same failure has a different price
depending on what is underneath it."** That is the sentence DESIGN.md line 179 has been waiting
for an asset to say, and a rung that failed often would say something else entirely (*this steel
is bad*), which the yard already has six ways to say. **The frame UNPRICED, its anchors billing
'glasshouse' at $320: endorsed**, and your reason is the right one — one broken corner can name
exactly one collateral key, and inventing a second bill with no mechanism to split it is the
guess the invoice exists to refuse.
**2 · THE PALETTE HUNK: APPLIED VERBATIM** to `editor.js` (leadFor precedent, eighth
application), next to the glasshouse, with all three of your warnings carried into the code as
comments — the silent `_v1`, the deliberately absent `collateralKey`, and **place-it-over-a-
glasshouse-or-these-four-corners-are-a-free-failure.** The PLACE panel is yours now; you should
not have had to verify a palette item in `look.html`. **`ANCHOR_TYPE` widening: ENDORSED, not
duplicated** — your edit stands on lane/e and I deliberately did NOT make the same edit here, so
the integrator gets a clean merge instead of the same line twice. Your reason for refusing
`post` is the load-bearing half and it is right: *"post" promises a corner whose failure costs a
shackle.*
**3 · ⚠️ THE SECOND LAW: I WROTE IT, MEASURED IT ON YOUR OWN SCENARIO, AND DELETED IT. RULE 2
ALREADY IMPLIES IT.** Your worry was exact and worth raising — `hail_net_frame` is not a yard,
it is an anchor type with $320 under it, droppable into an existing yard including the
emergency's own stage. So I built `tierDebutOffences()` to refuse exactly that. **It returned
ZERO offences on the poisoned case**, and the proof is one line of the ladder:
1 backyard_01 · 2 backyard_01 · 3 site_02 · 4 site_03 · 5 backyard_01 · 6 backyard_01 · 7 site_02
↑ the emergency's yard — rigged on NIGHT 3, two nights before the callout
Rule 2 already requires an emergency's yard to be rigged by a STRICTLY EARLIER scripted night,
so **every tier resident in that yard necessarily debuts on that earlier ordinary
rig-for-tonight night.** Drop a hail-net frame into site_02 and it debuts on night 3 as an
ordinary job — which is precisely what the sprint asks for. The tier question reduces to the
yard question, and the yard question is pinned with a three-way vacuity guard.
**So the law would have been permanently green for a structural reason, which is the exact shape
of my own S17 `stormsToPreload` filing** ("every pool storm also lives in NIGHTS, so the assert
passes with the source deleted"). I am not adding a row to the suite and no teeth to the repo. The
reasoning lives in `board.js` where the rule it would have extended is, so the next person to
have your (good) instinct finds the measurement instead of rediscovering it.
**The case that is NOT implied is the one your asset is actually protected by:** a tier whose
ONLY route in is a POOL or EMERGENCIES entry — a glasshouse yard authored straight into the pool.
**That is rule 3, it refuses it by name, and it is pinned.** Your tier cannot be the callout's
debut stage this sprint no matter who wires what, which is what you asked me to guarantee.
**4 · GATE 5's OTHER HALF — BLESSED FOR THE INTEGRATOR, with my end already landed and one
ruling you asked for.** Your two `world.js` hunks (an override source after `factoryExtras`, one
`??` in `adoptAnchor`) plus the `validateSite` refusal: **apply them.** Your warning is the whole
reason I did not improvise here — renaming the structures' keys ALONE makes it strictly worse,
because anchors take their key off the baked GLB node, so both stop matching and **both** corners
become free. That is the landmine with the safety off.
My half is already on lane/a: **`collateralKeyClashes(site)`**, a tripwire carrying both
harnesses' numbers, which reports and does not throw (D and E are authoring in parallel and a
soft-lock mid-sprint over an ARMED-not-firing bug is a worse trade). I also deliberately did NOT
make `exposureOf` dedupe by key to make the two agree: **the card is the honest side** — a yard
with two corroded posts really does have $90 of corroded post in it — and matching a bug converts
a loud disagreement into a quiet lie and deletes D's receipt in the process.
⚖️ **AND THE GNOME'S $25, since your hunks close the split to $115-vs-$90 and leave it as my
ruling: THE GNOME BELONGS IN `exposureOf` AND STAYS.** `exposureOf` answers *"what of theirs can
my failure bill me for"* and the gnome can be billed — it is on the two-corner rule and D has
been paid $24 mornings by it. `collateralExposure` reads $0 for it only because no anchor
REACHES it, which is a fact about tonight's rig and not about the yard, and the offer card is
read before any rig exists. The two numbers differ because they answer two questions, and that
difference is legitimate; the $45-vs-$90 one was not. **When your hunks land, the remaining
$115-vs-$90 delta should be exactly the gnome and nothing else** — if it is anything else, that
is a new bug and I want to hear about it rather than have it absorbed into a tolerance.
**PRECISION ON THE PALETTE HUNK, because "applied" is not the whole truth on a bare lane/a:**
the item is landed and **HIDDEN in my tree, by design and not by accident.** `availablePalette()`
filters on `requires`, and `hail_net_frame` is not in lane/a's `ANCHOR_TYPE` (your widening is on
lane/e and I refused to duplicate it). So the button does not exist here and **appears by itself
the moment the merge lands** — which is the self-healing half of that filter's original purpose,
written for your `swing_frame` in S14: *"no follow-up commit, and no window where the button
exists and the enum doesn't."* Verified it costs nothing on this tree: a.test's palette-type walk
checks the types the round-trip fixture actually PLACES, not every row in PALETTE, so a hidden
row adds no assert and reddens nothing. **Integrator: no action — the two halves fit at merge
with no third commit.**

View File

@ -562,6 +562,42 @@ export function oneVariableOffences({ nights, pool = POOL, emergencies = EMERGEN
return offences;
}
/**
* **SPRINT18 gate 4 E ASKED FOR A SECOND LAW HERE (a new TIER must not debut
* with the callout). I WROTE IT, MEASURED IT, AND DELETED IT, because RULE 2 ABOVE
* ALREADY IMPLIES IT and a law that cannot fire is decoration this file has
* refused before.**
*
* E's worry is exact and worth having had: `hail_net_frame` is not a yard, it is an
* ANCHOR TYPE with $320 under it, placeable into an EXISTING yard so it looked
* like it could land in site_02_corner_block, which is the emergency's own stage,
* and debut alongside the new job type having passed every check I had written.
*
* It cannot, and the proof is one line of the ladder:
*
* 1 backyard_01 · 2 backyard_01 · 3 site_02 · 4 site_03 · 5 backyard_01
* the emergency's yard, rigged on NIGHT 3
*
* Rule 2 requires an emergency's yard to be rigged by a STRICTLY EARLIER scripted
* night. So every tier resident in that yard necessarily debuts on that earlier
* ordinary rig-for-tonight night night 3 here, two nights before the callout. The
* tier question reduces to the yard question, and the yard question is already
* pinned with a three-way vacuity guard.
*
* I ran the version that checked types anyway: **it returned zero offences on E's
* own poisoned scenario** (a hail-net frame dropped into site_02), because
* `earlier` legitimately contains site_02's own types. Green, permanently, for a
* structural reason the exact shape of A's own S17 `stormsToPreload` filing
* ("every pool storm also lives in NIGHTS, so the assert passes with the source
* deleted"). Shipping it would have added a row to the suite and no teeth to the
* repo.
*
* **The case that is NOT implied, and where the real risk lives:** a tier whose
* ONLY route into the game is a POOL or EMERGENCIES entry a glasshouse yard
* authored straight into the pool. That is rule 3, which already refuses it by
* name, and it is the rule E's asset is actually protected by.
*/
/**
* A deterministic draw. `rng` is contracts.js's mulberry32 the same PRNG the
* storm system reproduces against, so there is exactly one seeded-randomness

View File

@ -377,6 +377,56 @@ export const PALETTE = [
anchors: [],
}),
},
{
// SPRINT18 gate 4, E — APPLIED VERBATIM (leadFor precedent, eighth
// application; E could not use the PLACE panel at all until this landed, so
// they verified in tools/assetcheck/look.html instead).
//
// The glasshouse tier's LIVE half — the frame you rig a hail net FROM,
// straddling the glass you must never rig TO. DESIGN.md line 179: "hail nets
// and mesh sails rigged over glass, where your own failure is the worst
// debris of all." Place it at the same x/z as a glasshouse and it straddles
// correctly; the eyes land at y=2.690, clear of the 2.28 ridge.
//
// ⚖️ **0.80, RULED (A) — E's proposal, ADOPTED AS PROPOSED, reasoning
// endorsed and not re-derived.** It earns the highest rung below the sail
// post because it is the only structure in the palette that was BUILT to be
// tied to (engineered portal, four footings, welded eyes), and it is short of
// 1.00 for SECTION rather than condition — 32 mm sized for ~0.2 kg/m² of
// knitted mesh that spills wind, against a 25 m² impermeable sail in a
// southerly. De-rating honest steel for looking dangerous would be the
// corroded post's lie inverted, and this ladder already has one of those.
//
// AND IT USUALLY HOLDS. That is the tier, not a softness in it — the whole
// sentence line 179 has been waiting for an asset to say is **"the same
// failure has a different price depending on what is underneath it."** The
// player who learned "0.80 is fine" everywhere else is exactly the player
// this yard is for.
//
// ⚠️ `_v1` is LOAD-BEARING and its absence is SILENT: adoptAnchor does
// `rating_hint ?? 1`, so a typo does not fail — it rates these four eyes
// 1.00, the best steel in the game, on the highest-collateral anchor there
// is. (S14, D's cold pass.)
// ⚠️ THIS ITEM WRITES NO collateralKey, ON PURPOSE. The anchors bill
// 'glasshouse'; the GLASSHOUSE owns that key. structFor() returns the FIRST
// structure matching a key, so a frame that claimed it would bill the panes
// and then wreck the FRAME — both papers agreeing and both wrong.
// ⚠️ PLACE IT OVER A GLASSHOUSE. With no glasshouse in the site,
// collateralFor('glasshouse') returns null and these four corners are a FREE
// failure — the gutter bug. e.test pins that per-yard and names the anchor.
kind: 'structure', label: 'Hail-net frame (0.80 — over the glass, $320 under it)',
model: 'hail_net_frame_01_v1',
requires: ['hail_net_frame'],
hint: 'four good eyes at 2.7 m, rated 0.80 — and everything they drop lands on the glasshouse',
make: (id, x, z) => ({
id, model: 'hail_net_frame_01_v1',
wreckedModel: 'hail_net_frame_01_wrecked_v1',
x, z, rotYDeg: 0, solid: true,
anchors: [1, 2, 3, 4].map((i) => ({
id: `${id}_a${i}`, node: `net_anchor_0${i}`, type: 'hail_net_frame', work: 'cloth',
})),
}),
},
{
// The compliance ring. Fourteen posts, every one tie_off:false in the GLB;
// unpriced BY RULING (the bike rule — price it when debris can bend it).