{
  "id": "site_02_corner_block",
  "name": "The Corner Block",
  "blurb": "Two streets, two fences, and a carport that looks like four free anchors. It isn't.",

  "yard": { "width": 24, "depth": 16 },

  "sun": { "elevationDeg": 55, "azimuthDeg": -125 },

  "gardenBed": { "x": 0, "z": 1, "w": 5, "d": 3.5 },

  "_design": [
    "DESIGN.md wants the corner block anchor-poor — 'nowhere to tie off'. An empty yard is just a",
    "smaller yard, so the trap is the interesting build: give it something that LOOKS like four free",
    "anchors and is the worst steel in the game. That's E's carport (beam 0.22, post 0.30 rating_hint,",
    "both BELOW the house fascia's 0.35, collateral 'carport'). Tie 25 m2 to it in a southerly and you",
    "don't break a shackle — you take the carport, and it lands on whatever's under it.",
    "",
    "The site IS winnable off the honest anchors — one gum tree east and three ground posts — so the",
    "carport is temptation, not necessity. Measured at authoring time over honest anchors only:",
    "  tr1+q2+q3   with the carport's cb corner is the covering play, but the honest 3 posts alone",
    "  make an in-band quad and q1+q2+q3+tr1 covers 58% at 32.6 m2. Full load audit: Lane B's",
    "  tools/site_audit. If tree+posts can't make a winnable $80 line, the fix is to move the tree",
    "  (or add a post), NEVER to soften the carport — E's e.test.js pins those ratings with the reason."
  ],

  "structures": [
    {
      "id": "carport", "model": "carport_01_v1",
      "wreckedModel": "carport_01_wrecked_v1",
      "x": -7, "z": -3, "rotYDeg": 0,
      "solid": true,

      "collateralValue": 180,
      "collateralLabel": "the carport",
      "_collateral": [
        "SPRINT11, Lane A's ruling. E proposed 180 in the asset and asked to be argued with rather",
        "than adopted; the reasoning holds, so it's adopted unchanged. Gnome 25, a night's shop",
        "budget 80: at 180 the carport is 2.25 nights, which turns a good week broke and is felt for",
        "the rest of the run without ending a strong one outright. Under ~120 the trap is a shrug;",
        "over ~250 it's a silent game over, which teaches nothing because you never get to act on it.",
        "It lives HERE and not in the GLB for the same reason the gnome's 25 does: sites are data,",
        "and what a carport COSTS is this site's economy, not a property of the mesh. E's baked",
        "collateral_value stays as the proposal and the fallback; world.js prefers this number."
      ],

      "_types": [
        "SPRINT11: these were all 'post' to fit the old closed enum, which is exactly the lie D",
        "flagged — a carport silently joining the sail-post family that C's venturi and B's audit",
        "read. Now typed with E's own asset strings. The ladder is unaffected either way: it reads",
        "`work` (the mechanism), which is why D keyed it there."
      ],
      "anchors": [
        { "id": "cb1", "node": "beam_anchor_01", "type": "carport", "work": "bracket" },
        { "id": "cb2", "node": "beam_anchor_02", "type": "carport", "work": "bracket" },
        { "id": "cp1", "node": "post_anchor_01", "type": "carport_post", "work": "cloth" },
        { "id": "cp2", "node": "post_anchor_02", "type": "carport_post", "work": "cloth" }
      ]
    }
  ],

  "trees": [
    {
      "id": "tr1", "model": "tree_gum_02_v1",
      "x": 7, "z": -1, "phase": 1.7, "trunkH": 3.8, "anchorY": 3.1,
      "anchors": [
        { "id": "tr1", "node": "branch_anchor_01", "type": "tree", "work": "cloth" },
        { "id": "tr1b", "node": "branch_anchor_02", "type": "tree", "work": "cloth" }
      ]
    }
  ],

  "posts": [
    { "id": "q1", "x": -3.5, "z": -2.5, "h": 4.0, "type": "post", "work": "cloth" },
    { "id": "q2", "x": 3.5, "z": -2.0, "h": 4.0, "type": "post", "work": "cloth" },
    { "id": "q3", "x": 2.0, "z": 4.0, "h": 4.0, "type": "post", "work": "cloth" },
    { "id": "q4", "x": -3.0, "z": 4.0, "h": 4.0, "type": "post", "work": "cloth" }
  ],

  "shedTable": { "model": "shed_table_v1", "x": 8.5, "z": 4.5, "rotYDeg": -90, "pickupNode": "pickup_anchor" },

  "gnome": { "model": "garden_gnome_01_v1", "x": 2.6, "z": 3.0, "rotYDeg": 0.6, "collateralValue": 25 },

  "fence": {
    "sides": ["south", "east"]
  },

  "wind": {
    "_venturi": [
      "The corner block's whole weather personality: a street on two sides, so a gap that SCREAMS",
      "when the southerly swings to run along it and is calm otherwise. The gap runs NE-SW between",
      "the house line and the carport, i.e. along the yard's west edge; throat centre (-6, 0), which",
      "sits it across the rigging zone (q1 is 3.5 m away, inside the radius) as C asked.",
      "",
      "SPRINT11 — A/C RECONCILED, AND THE ANSWER IS: DON'T TOUCH THE AXIS. Both lanes measured this",
      "independently and landed on the same physics. An axis is a LINE, not an arrow — weather.core",
      "aligns with Math.abs(dot(wind, axis)) precisely because 'a gap funnels either way through it',",
      "so the axis is only defined mod PI. 2.1 and -1.08 are 2.2 deg apart, i.e. the same gap read",
      "from opposite ends: 33.5061 vs 33.5329 m/s peak at the throat, a 0.08% difference on the same",
      "gust in the same second. Any edit here would be a no-op.",
      "",
      "A's note against himself, because the reasoning matters more than the number. I nearly wrote",
      "-1.08 in here on 'measured beats authored' grounds. C caught what that misses: -1.08 was never",
      "a proposed axis. It's dirAt(40) — the SOUTHERLY'S HEADING once the change settles. 2.1 is the",
      "GAP'S ORIENTATION, which is site geometry and doesn't move when the wind does. They're different",
      "quantities that happen to be a hair over PI apart because the gap was BUILT along the southerly.",
      "Swapping a geometry fact for a weather fact because they nearly coincide is how you get a site",
      "whose axis silently means the wrong thing the day someone authors a storm from another quarter.",
      "'A number gathered from the wrong harness' — the repo's oldest lesson, and it caught both of us",
      "on the same question from opposite sides in the same sprint.",
      "",
      "gain stays 1.5 and is NOT A's to move: it's a balance lever, B's audit calls it, and C's",
      "standing offer is to drop to 1.35 the moment B says no $80 line survives the funnel. Measured",
      "at the throat: 22.36 m/s unfunnelled, 30.16 at 1.35, 33.51 at 1.5. Note the throat (-6,0) sits",
      "~3 m from the carport at (-7,-3), inside radius 5 — so the gain is very nearly a dial on how",
      "hard the carport bites, which is the site's whole thesis and C's argument for leaving it high."
    ],
    "venturi": [
      { "x": -6, "z": 0, "axis": 2.1, "gain": 1.5, "radius": 5, "sharp": 3 }
    ]
  }
}
