HardYards/web/world/js/anchor_ratings.gen.js
type-two 00e6b288c8 Lane E S18 gate 4: THE GLASSHOUSE TIER — the hail-net frame, and the apex made reachable
S16 shipped the glasshouse and priced it at $320. e.test said the rest in its
own words: "nothing in the sim wrecks a glasshouse yet — the value is inert
data". main.js bills collateral off a broken rig corner's baked key, and a
glasshouse rightly offers no anchors, so the most expensive object in the game
could not cost anybody a cent — RULE 2's mirror image, a price with no key that
can reach it.

DESIGN.md line 179 named the missing asset: hail nets rigged OVER glass. You
tie to the frame that straddles it. hail_net_frame_01 / _wrecked: a powder-coat
portal frame clear of the glasshouse on all four sides, head at 2.75 m to clear
the 2.28 ridge, four welded eyes at 2.690 baking collateral 'glasshouse'.

The tell is a POSITION, not a defect — the frame's numbers are good and the
hazard is where it stands. Pinned as geometry off two GLBs (footprint strictly
contains the glass; head clears the ridge) rather than as paint on one. The 20 m
read is metalness: powder-coat at 0.05 renders bright where every trusted
galvanised steel at 0.90 goes near-black with no environment map (S17's measured
lesson, applied on purpose this time).

Rung 0.80, proposal, A rules: it earns the highest rung below the honest post
(engineered frame, four footings, the only structure built to be tied to) and is
de-rated 20% for section, not condition. It usually holds — that is the tier:
the corner failure that costs a shackle on a sail post costs $320 here.

The root deliberately carries NO collateral_key. structFor() takes the first
match, so a frame claiming the glass's key would bill the panes and wreck the
frame, both papers agreeing and both wrong. That omission is gate 5 in one line.

Wreck racks at one end (0.45 in at the head, 0.45 out at the feet) after the
first cut still read as a clean level rectangle in the render. Carries no glass:
the glasshouse swaps independently. Unpriced by ruling.

ANCHOR_TYPE widened with 'hail_net_frame' (contracts.js is A's — revert and tell
me; corroded_post precedent). Manifest unambiguous: 0.80, glasshouse, 4 sources.

Determinism held: runs 2 and 3 are 56/56 byte-identical. NOTE the shipped GLBs
were exported by Blender 5.1.2 and this box has 5.0.1 — the 45-binary churn that
causes is semantically nil (60 nm accessor drift, PNGs losing sRGB/gAMA/cHRM
with identical pixels) and was reverted, not shipped. Documented in the header.

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

126 lines
3.3 KiB
JavaScript

// GENERATED by tools/blender/build_yard_assets.py — do NOT hand-edit.
// Regenerate: blender -b -P tools/blender/build_yard_assets.py
//
// SPRINT15 gate 1.2 — the wire between the factory and the sim.
// adoptAnchor only carries a baked rating_hint to anchors that name a
// GLB `node`; a plain-JSON anchor (every shipped sail post) defaulted
// to `?? 1` regardless of the bake, and nobody could see the
// disagreement. This module is the factory's bakes, resolvable by
// anchor TYPE at runtime: `types` are unambiguous (every rated node
// of that type agrees), `ambiguous` lists the disagreements so the
// runtime can refuse to guess. ratings.js is the reader; e.test.js
// pins runtime === this module === the GLBs, so none of the three
// can drift from the others silently again.
export const FACTORY_ANCHOR_RATINGS = Object.freeze({
"ambiguous": {
"tree": {
"variants": [
{
"rating_hint": 1.0,
"sources": [
"tree_gum_01/branch_anchor_01",
"tree_gum_02/branch_anchor_01"
]
},
{
"rating_hint": 0.95,
"sources": [
"tree_jacaranda_01/branch_anchor_01"
]
},
{
"rating_hint": 0.88,
"sources": [
"tree_gum_01/branch_anchor_02",
"tree_gum_02/branch_anchor_02"
]
},
{
"rating_hint": 0.76,
"sources": [
"tree_gum_01/branch_anchor_03"
]
},
{
"rating_hint": 0.52,
"sources": [
"tree_jacaranda_01/branch_anchor_02"
]
},
{
"rating_hint": 0.4,
"sources": [
"tree_jacaranda_01/branch_anchor_03"
]
}
]
}
},
"types": {
"carport": {
"collateral": "carport",
"rating_hint": 0.22,
"sources": [
"carport_01/beam_anchor_01",
"carport_01/beam_anchor_02"
]
},
"carport_post": {
"collateral": "carport",
"rating_hint": 0.3,
"sources": [
"carport_01/post_anchor_01",
"carport_01/post_anchor_02"
]
},
"corroded_post": {
"collateral": "corroded_post",
"rating_hint": 0.55,
"sources": [
"sail_post_corroded/top_anchor"
]
},
"hail_net_frame": {
"collateral": "glasshouse",
"rating_hint": 0.8,
"sources": [
"hail_net_frame_01/net_anchor_01",
"hail_net_frame_01/net_anchor_02",
"hail_net_frame_01/net_anchor_03",
"hail_net_frame_01/net_anchor_04"
]
},
"house": {
"collateral": "gutter",
"rating_hint": 0.35,
"sources": [
"house_yardside/fascia_anchor_01",
"house_yardside/fascia_anchor_02",
"house_yardside/fascia_anchor_03"
]
},
"pergola": {
"collateral": "pergola",
"rating_hint": 0.65,
"sources": [
"pergola_01/pergola_anchor_01",
"pergola_01/pergola_anchor_02"
]
},
"post": {
"rating_hint": 1.0,
"sources": [
"sail_post/top_anchor"
]
},
"swing_frame": {
"collateral": "swing_set",
"rating_hint": 0.45,
"sources": [
"swing_set_01/frame_anchor_01",
"swing_set_01/frame_anchor_02"
]
}
}
});