{
 "_doc": "Everything spatial and visual for this resort. Text lives in content.json, footprint identities in assignments.json. 'src' notes say where each fact comes from; 'confirm' = still to verify with the resort.",
 "id": "aurora-village",
 "delivery": {
  "_doc": "VIS-195: the page's own words for link previews and the browser tab (title, description), written into the shell by the public Worker. The map's address (www.mapmystay.co/m/<map>/) and the websites allowed to embed it are set in the portal (Home, Share), never here.",
  "title": "Aurora Village Resort Map",
  "description": "Explore Aurora Village in Ivalo, Finnish Lapland in 3D: glass-roof cabins, suites, towers, saunas and activities, under a real winter sky."
 },
 "site": {
  "lat": 68.6508109823455,
  "lon": 27.507885041386388,
  "utcOffset": 2,
  "year": 2026,
  "tz": "Europe/Helsinki",
  "_tz": "VIS-136: the owner picked 'A: follow summer time' (Linear, 2026-10-22): Ivalo keeps Finnish time (EET, EEST in summer), so the plain map's sun follows the real clock all year as the presets already do (bundle.json site.tz). utcOffset stays as the fallback"
 },
 "brand": {
  "name": "Aurora Village",
  "place": "Ivalo · Finnish Lapland",
  "logo": "img/logo-mark.svg",
  "logoSrc": "emblem traced from img/logo.png (refs/photos/AuroraVillage-logo-with-text-150px) to SVG, round 6; user: logo only, no name",
  "showName": false,
  "logoPlate": false,
  "fonts": {
   "display": "Cormorant Garamond",
   "ui": "Manrope",
   "css": "vendor/fonts/fonts.css"
  },
  "colors": {
   "accent": "#d2b46e",
   "ink": "#0b0f17",
   "cabin": "#e8b04a",
   "suite": "#c9a961",
   "tower": "#8fb0d8",
   "towerSuite": "#b8a3e0"
  }
 },
 "camera": {
  "bounds": {
   "maxDistance": 900,
   "minDistance": 12,
   "minElevation": 6,
   "maxElevation": 89,
   "pan": {
    "margin": 0,
    "zones": true,
    "places": true,
    "overshoot": 40,
    "stiffness": 7,
    "activities": true,
    "_activities": "The owner, 2026-10-26: the camera stopped short of the Canyon Path, the horseback trail and the snowmobile route (all leading west out of the village), while Ice Karting to the east could be reached: the target may also go 60 m either side of every ride's route and walked trail, to its end"
   },
   "groundClearance": 4,
   "_src": "WS-17 round 4c: user 'locked at a maximum distance' (refs/user/feedback-round4c/16, 18). Target stays inside the hull of the core extent + zones + places; 900 m keeps the village and the hills on the horizon but never the tree disc or the landscape rim from outside. minElevation 6 keeps the night aurora framing (camera.night is 6.1 deg)."
  },
  "home": {
   "target": [
    -55,
    0,
    40
   ],
   "offset": [
    0,
    230,
    -390
   ]
  },
  "_src": "printed map is drawn south-up, so the default view looks south",
  "datumKey": "main-building",
  "night": {
   "target": [
    -55,
    0,
    20
   ],
   "offset": [
    0,
    46,
    430
   ],
   "unitElevation": 10,
   "_src": "looks north over the village at the aurora; used when the aurora is on at night"
  },
  "sky": {
   "fov": 62,
   "up": 40,
   "above": 30,
   "_src": "user 2026-10-13 (WS-47): look up by rotating, from any angle; no fixed viewpoint (the earlier river-ice spot was dropped with it)",
   "_rc": "WS-47 sky feel (push, rate, settle) approved by owner 2026-10-15",
   "push": 18,
   "rate": 1,
   "settle": true
  }
 },
 "ui": {
  "circles": {
   "src": "The owner's picks for the map style Halo on the canvas https://claude.ai/artifact/MHW7DDTBXVS2gfusiQEsZK (2026-10-28, rounds 1-3): Stay = the start view and the four room types; Activities = snowmobile and aurora tours, the reindeer sleigh ride, horse riding, ice karting, snowshoes and sleds; Around the village = the restaurant, the swing, the reindeer park and the three saunas. Icons from css/styles/halo.svg (his final set); the room types are drawn after the photos of the units. Owner 2026-10-29: the horse and snowmobile circles go to the moving rides (the horseback ride and the snowmobile tour drawn in Fine-tune), not to the Horse Stable and the Safari House.",
   "groups": [
    { "id": "stay", "icon": "house", "items": ["home", "unit:cabin", "unit:suite", "unit:tower", "unit:towerSuite"] },
    { "id": "activities", "icon": "snowmobile", "items": ["ride:snowmobile", "reindeer-ride", "ride:horseback", "ice-karting", "sleds-bikes"] },
    { "id": "around", "label": "Around the village", "icon": "four-dots", "items": ["restaurant-loimu", "aurora-swing", "reindeer-paddock",
      { "id": "saunas", "label": "Saunas", "icon": "bucket-ladle", "items": ["panorama-sauna", "wood-sauna", "sleigh-sauna"] }] }
   ],
   "icons": {
    "home": "turn-back", "unit:cabin": "glass-cabin", "unit:suite": "glass-cabin-wide", "unit:tower": "tower-skylight", "unit:towerSuite": "tower-wide",
    "ride:snowmobile": "snowmobile", "reindeer-ride": "reindeer", "ride:horseback": "horse-head", "ice-karting": "steering-wheel", "sleds-bikes": "snowshoe",
    "restaurant-loimu": "fork-knife", "aurora-swing": "swing", "reindeer-paddock": "reindeer-head",
    "panorama-sauna": "bucket-ladle", "wood-sauna": "ice-hole", "sleigh-sauna": "sauna-sled"
   }
  },
  "explore": true,
  "search": true,
  "timeDock": true,
  "controls": true,
  "legend": true,
  "tourButton": true,
  "fullscreen": true,
  "dates": [
   {
    "m": 12,
    "d": 21,
    "label": "21 Dec",
    "note": "Polar night",
    "season": "winter",
    "src": "owner feedback 2026-10-15: three dates per season, winter = polar night, the sun's return, the pink light. Engine sun (sun.js): 21 Dec the sun stays below the horizon all day (highest -2.1 deg)"
   },
   {
    "m": 1,
    "d": 15,
    "label": "15 Jan",
    "note": "First sun",
    "season": "winter",
    "src": "owner feedback 2026-10-15 (the sun comes back). Engine sun: 15 Jan the sun's centre clears the horizon at noon (+0.3 deg)"
   },
   {
    "m": 2,
    "d": 15,
    "label": "15 Feb",
    "note": "Pink light",
    "season": "winter",
    "src": "owner feedback 2026-10-15 (the pink-light time). Engine sun: 15 Feb highest +8.8 deg, long low-sun twilights"
   },
   {
    "m": 9,
    "d": 1,
    "label": "1 Sep",
    "note": "First dark nights",
    "season": "autumn",
    "confirm": true,
    "src": "owner feedback 2026-10-15: three dates per season; exact day to confirm. Autumn = the first dark nights of September (aurora season starts). Engine sun: 1 Sep the sun goes below -12 deg (darker than nautical twilight) for 2.5 h around midnight; 15 Aug it does not"
   },
   {
    "m": 9,
    "d": 15,
    "label": "15 Sep",
    "note": "Ruska",
    "season": "autumn",
    "confirm": true,
    "src": "user, round 6: autumn = peak ruska for the Ivalo area; mid-September is the usual northern Lapland peak, exact day to confirm"
   },
   {
    "m": 9,
    "d": 23,
    "label": "23 Sep",
    "note": "Equinox",
    "season": "autumn",
    "confirm": true,
    "src": "owner feedback 2026-10-15: three dates per season; exact day to confirm. The 2026 September equinox is 23 Sep (about 03:05 Finnish time); engine sun: 12.3 h of daylight"
   },
   {
    "m": 6,
    "d": 21,
    "label": "21 Jun",
    "note": "Midnight sun",
    "season": "summer",
    "src": "user, round 6: summer = the height of the polar day (midsummer solstice). Engine sun: lowest +2.1 deg at midnight"
   },
   {
    "m": 7,
    "d": 15,
    "label": "15 Jul",
    "note": "Late midnight sun",
    "season": "summer",
    "confirm": true,
    "src": "owner feedback 2026-10-15: three dates per season; exact day to confirm. Engine sun: 15 Jul the sun only grazes the horizon at midnight (+0.1 deg, still up with refraction, 24 h of daylight); the midnight sun ends about 18-20 Jul"
   },
   {
    "m": 8,
    "d": 15,
    "label": "15 Aug",
    "note": "Dusk returns",
    "season": "summer",
    "confirm": true,
    "src": "owner feedback 2026-10-15: three dates per season; exact day to confirm. Engine sun: 15 Aug the sun sets for about 6 h and reaches -7.5 deg at midnight (blue dusk, not yet dark)"
   }
  ],
  "seasons": [
   {
    "id": "winter",
    "label": "Winter",
    "date": "12-21",
    "ready": true,
    "src": "user, round 6: winter = December polar night",
    "_rc": "go-live 2026-10-13: user 'I want to see the season switches within the app. They should be already done' (approval first recorded 2026-10-12, JOURNAL go-live entry); ground option A (heath) as built, option B stays a preview (VIS-24)"
   },
   {
    "id": "autumn",
    "label": "Autumn",
    "date": "9-15",
    "ready": true,
    "_ws35": "WS-35 preview: scenery built (season patch resort.seasonal.autumn); ready only after the user's approval",
    "_rc": "go-live 2026-10-13: user 'I want to see the season switches within the app. They should be already done' (approval first recorded 2026-10-12, JOURNAL go-live entry); ground option A (heath) as built, option B stays a preview (VIS-24)"
   },
   {
    "id": "summer",
    "label": "Summer",
    "date": "6-21",
    "ready": true,
    "_ws35": "WS-35 preview: scenery built (season patch resort.seasonal.summer); ready only after the user's approval",
    "_rc": "go-live 2026-10-13: user 'I want to see the season switches within the app. They should be already done' (approval first recorded 2026-10-12, JOURNAL go-live entry); ground option A (heath) as built, option B stays a preview (VIS-24)"
   }
  ],
  "defaultTime": {
   "month": 12,
   "day": 21,
   "hour": 12
  },
  "auroraControls": true
 },
 "features": {
  "aurora": true,
  "animals": true,
  "skating": true,
  "_src": "skating: owner, 2026-10-25: ice skating path and skaters, Aurora Village only (the Fine-tune editor offers the Ice path kind and skating walkers)",
  "lamps": {
   "roadKinds": [
    "service"
   ],
   "spacing": 18,
   "offset": 3.6
  }
 },
 "units": {
  "_doc": "Which keys are bookable units, and their model. Numbers listed under a type override the pattern.",
  "cabin": {
   "pattern": "^cabin-(\\d+)$",
   "door": {
    "at": [
     -5.8,
     0
    ],
    "src": "web/js/kota.js glassKota entrance (resort.json units.cabin.params.entrance): door in the vestibule gable at x = rearX -4.16, facing -x (the narrow end), landing 0.9 m + step 0.35 m in front of it (steps), so their foot is at x -5.41; the point stands 0.4 m beyond it on the door's axis z 0. Photos: refs feedback-round5/07 front no snow ('10 JUFFE'), Cabins Outsie Juha - 1/2 (as units.cabin.params.entrance._src)"
   },
   "model": "glassKota",
   "params": {
    "plan": [
     [
      4.11,
      0.85
     ],
     [
      3.11,
      2.25
     ],
     [
      1.49,
      2.765
     ],
     [
      -0.95,
      2.765
     ],
     [
      -2.56,
      2.24
     ],
     [
      -3.29,
      1.25
     ]
    ],
    "_plan": "eave (roof edge) half outline, +z side, front -> rear, unit frame: median of the 27 MML cabin footprints, symmetrised (front identical to the suites; rear = two chamfer facets each side ending at the 2.5 m entrance notch; long sides set exactly parallel at 2.765 so the ridge is a straight line). Same numbers as WS-11 models/cabin.json derivation. Top-down check: refs/user/feedback-round5/07-aurora-cabins/no snow aurora cabin from above.png",
    "glassFacets": 2,
    "_glassFacets": "5 glass panes = the front facet + 2 each side (front-left diagonal and the narrow side pane): feedback-round5/07 drone front side + from above; Aurora Cabin Outside - 5 (night, from above), - 12 (front, from above)",
    "eaveY": 1.25,
    "ridgeY": 4.05,
    "band": 0.272,
    "bandPitch": 46.67,
    "_band": "metal band under the glass only. Its run is 0.272 m at the roof's own slope, so it keeps the 0.29 m height of the approved look (0.5 m at 30 deg before): the glass bottom stays where the interior photos show it, just above the window sill (inside.png), and the band no longer kinks against the shingles (owner 2026-10-15)",
    "glassTopFrac": 0.7,
    "_glassTopFrac": "owner 2026-10-15 (second look): 0.8 made the windows too tall and the cone too pointed; the shingle cap starts lower. Side photo 'side - glass trapezoids' and Juha - 7 (front) both measure 0.73 of band top -> ridge seen from low down (the apex sits behind the glass top, so a low camera shortens the cap): 0.7. The cap above the panes continues the glass planes (flush), rounding only where it fits.",
    "capRound": true,
    "_capRound": "the shingle roof wraps round the faceted front and into the rear smoothly (many-faceted round hip): feedback-round5/07 side photo; user feedback 2026-10-12",
    "fascia": 0.1,
    "wallInset": 0.4,
    "_wallInset": "walls 0.4 m inside the eave line (suite CAD; MML traces the roof edge)",
    "plinthH": 0.35,
    "_plinthH": "light grey plinth skirt under the dark boards: feedback-round5/07 front no snow from slight angle; Juha - 3/11 (summer)",
    "floorY": 0.4,
    "posts": 0.12,
    "_posts": "black corner posts at every wall corner: Outside - 3, - 10; Juha - 1/3",
    "entrance": {
     "rearX": -4.16,
     "frontX": -2.4,
     "wallHalf": 1.2,
     "roofHalf": 1.9,
     "eaveY": 1.7,
     "ridgeY": 3.65,
     "overhang": 0.3,
     "roofEndX": -0.4,
     "roofT": 0.15,
     "door": {
      "w": 0.9,
      "h": 2.0,
      "mat": "pine",
      "_mat": "plain light wooden board door, not lit: 'entrance gable at night - LED under the hood rake.png'"
     },
     "sign": {
      "w": 0.9,
      "h": 0.18,
      "y": 2.6
     },
     "led": {
      "r": 0.012,
      "inset": 0.1,
      "endGap": 0.12,
      "wash": 0.7,
      "_src": "warm LED strip UNDER the entrance gable's roof overhang (the hood), along the underside of both sloped rakes, washing light down onto the gable face and the door; no wall lamps, no light round the door: refs/user/feedback-round5/07-aurora-cabins/entrance gable at night - LED under the hood rake.png; client 2026-10-12 (like the tower cabins); user correction 2026-10-12 of the v1 door frame (00-current-screenshots/15-cabin-led-wrong-around-door.webp)"
     },
     "steps": [
      [
       0.9,
       0.4,
       1.9
      ],
      [
       0.35,
       0.2,
       1.9
      ]
     ],
     "_src": "gabled entrance vestibule at the narrow end, door facing back, name board above the door, landing + step: feedback-round5/07 front no snow from slight angle ('10 JUFFE'); Cabins Outsie Juha - 1/2 (steps as wide as the vestibule); sizes from WS-11 (Aurora Cabin Outside - 4 camera match, door 0.9 x 2.0 m as scale). Door light = LED strip (client 2026-10-12). confirm"
    },
    "vents": [
     {
      "x": -0.75,
      "z": 0.0,
      "r": 0.075,
      "top": 4.55,
      "cap": 0.11,
      "_src": "the tall capped flue on the ridge behind the glass: client 2026-10-12 'not every cabin has two roof pipes, default to ONE: keep the tall capped flue'. Position: Aurora Cabin Outside - 5 (night, from above), feedback-round5/07 front no snow from slight angle"
     },
     {
      "x": -0.6,
      "z": 0.75,
      "r": 0.08,
      "top": 4.3,
      "cap": 0.1,
      "enabled": false,
      "confirm": true,
      "_src": "second, shorter pipe on the left slope (viewer facing the glass): only some cabins have it (client 2026-10-12), so it is off by default; which cabins? feedback-round5/07 side photo, WS-11 (Outside - 1, - 4)"
     }
    ],
    "bed": {
     "x0": 0.7,
     "x1": 2.8,
     "w": 1.8,
     "top": 0.85,
     "head": 0.45,
     "_src": "double bed centred under the glass panes, head towards the back: Outside - 5 (night from above), - 12; feedback-round5/07 from above"
    },
    "snow": {
     "depth": 0.3,
     "overhang": 0.14,
     "droop": 0.1,
     "_src": "winter: thick cushion on the opaque roof and the eave band, glass kept clear (heated), lip over the eave: Outside - 3, - 8, - 10, - 12. Dropped by the season flag (?season=summer)"
    },
    "glassApex": true,
    "_glassApex": "all five panes the same size, meeting in one apex at the front end of the ridge; the side panes end at a straight hip from the eave corner up to that apex, with a raised metal strip along it: refs/user/feedback-round5/07-aurora-cabins/'no snow aurora cabin drone front side', 'no snow aurora cabin from above', 'side - glass trapezoids, roof wraps round smoothly'; summer/autumn Cabins Outsie Juha - 3, - 7; owner 2026-10-15",
    "fasciaMat": "post",
    "_fascia": "the metal band runs flush to the eave edge with only a thin dark wooden board under it (no thick metal edge): side photo, drone front side; owner 2026-10-15",
    "_bandPitch": "owner 2026-10-15 (third look): the metal band under the glass meets the shingle roof at the same angle, no kink at the corner (his close-ups of the band corner, side and front). 46.7 deg = the pitch from the eave to the glass apex, so band and glass lie in one plane and the band meets the shingled side flush along the straight hip (was 30)",
    "insideModel": true
   },
   "src": "WS-28 (round 5) rebuild: glassKota builder (web/js/kota.js) from the survey outline + the suite CAD heights + photos (sources per parameter). Replaces the WS-11 GLB derived from the suite CAD, whose kept CAD roof and generated rear overlapped and left holes seen top-down (feedback-round5/00-current-screenshots/06).",
   "fit": "plan = median of the 27 MML cabin footprints (never stretched per cabin)",
   "confirm": true,
   "_confirm": "rear hip, entrance gable, LED strip position and bed position are read from photos (no drawing; the floor plan is deferred by the client). Open: which cabins have the second (shorter) roof pipe?",
   "fallback": {
    "model": "glassFront",
    "params": {
     "wallH": 1.3,
     "roofWindow": null,
     "chimney": false
    },
    "src": "photos refs/photos/Outside-Cabin-4.jpg, refs/user/7.webp; user: no chimney, no smoke"
   },
   "photoCheck": "Aurora Cabin Outside - 1 (top-down): glass end + short body + narrower rear, no roof window; - 4 (rear-left): gabled vestibule with the door facing back, landing + step, rear facet eave receding, black corner posts; - 3 / - 11 (front-left): same 5-pane glass half-pyramid and eave band as the suite",
   "photoDates": "Cabin exterior photos are 2019-2024 (EXIF): Outside - 1 2023-04-18, - 3/- 4 2023-03-25, - 11/12/13 2024-12-04, Drone 13 2023-04-18; - 10 no EXIF. No known change to the cabins since: the photo-date cutoff is per building (date of its last change), so they are used for every cabin feature consistently. Ask the client: did the cabins change after 2023?",
   "_rc": "round-5 go-live: WS-28 Aurora Cabin (glassKota) approved by the user 2026-10-12 (old glTF params url/accents/... of models/cabin.glb removed; the vent is params.vents)",
   "_layout": "same, unmirrored, in all 28 cabins (client 2026-10-12): one parameter set for every cabin, no mirror",
   "walkIn": {
    "model": "interiors/aurora-cabin/aurora-cabin.walk.json",
    "label": "3D",
    "src": "modelled from refs/photos/Aurora cabin 360/ (inside, inside 2-5, inside wide with kitchenette, kitchenette, entrance nook x2, bathroom x3, Cabin Inside - 4..16) + www.auroravillage.fi glass igloo cabins (28 m², private toilet and shower, blackout curtains, kettle + coffee); sources per piece in tools/blender/interiors/aurora_cabin.py",
    "confirm": true,
    "_confirm": "ask the client: is the bathroom on the right-hand side (facing the glass) in every cabin? Is the dark headboard cabinet in every cabin? Twin or double bed set-up by default?",
    "gain": {
     "lamps": 9,
     "led": 3,
     "sky": 12,
     "glow": 1.0
    },
    "_gain": "strength of each baked light group in the viewer (the bake is physical; these set the exposure): tuned 2026-10-15 against inside.png / inside 2.png (night, lamps + LED) and Cabin Inside - 9 (LED only)"
   }
  },
  "suite": {
   "pattern": "^suite-(\\d+)$",
   "door": {
    "at": [
     -6.5,
     -0.2
    ],
    "src": "models/suite.glb (client CAD, models/suite.json frame): the entrance landing ('deck', CAD layer AR122 LATTIA = 'entrance landing outside the door') spans x -6.09 .. -5.09, z -1.35 .. 0.95 at 0.3 m in front of the door wall at the narrow end (x -5.1, door handle at z -0.53); the point is 0.4 m beyond the landing's outer edge on its centre line"
   },
   "model": "gltf",
   "params": {
    "url": "models/suite.glb",
    "rotationDeg": 0,
    "offset": [
     0,
     0,
     0
    ],
    "mirror": false,
    "materialMap": {
     "interior": "drop",
     "linen": "drop"
    },
    "_materialMap": "the CAD's own inside (linings, floors, its older furniture: a dining table where the 2026 panoramas show lounge chairs) is left out: the room seen through the glass is walkIn's baked look-in model, built inside this shell",
    "snowCap": true
   },
   "src": "tools/blender/landmarks/aurora_cabin_suite.py from the architect's drawings refs/user/drawings (Aurora Cabin Family: Pohjakuva, Leikkaus A-A, Julkisivut 1:50, 26.8.2024; sizes in resorts-src/aurora-village/manual/suite/spec.json), the main room 0.60 m longer than drawn as built (owner 2026-11-04: the 2025 CAD Revontulikota mh Pitkä uusi 2025 and the MML roof outlines agree); same unit frame as the CAD conversion it replaces; matches refs/photos/Aurora-Cabin-Suite-2-1-scaled.jpg",
   "fit": "CAD walls sit ~0.2 m inside all 10 MML footprints (IoU 0.77-0.82); placed by best overlap, see models/suite.json",
   "fallback": {
    "model": "glassFront",
    "params": {
     "wallH": 1.4,
     "porch": 1.1,
     "roofWindow": "right",
     "chimney": false
    },
    "src": "refs/photos/Aurora-Cabin-Suite-2-1-scaled.jpg; user: one roof window, on the right when facing the glass front"
   },
   "interior": {
    "_doc": "WS-3: 360 interior tour opened by 'Step inside' on the card (web/js/interior.js). Built with tools/interiors/prepare_panos.py.",
    "tour": "interiors/suite/tour.json",
    "src": "refs/photos/360 IMAGES (client, DJI Osmo 360; WS-6: 15 photos of this type = 9 positions + helpers, 2 photos of another unit type rejected); one representative suite",
    "confirm": true
   },
   "walkIn": {
    "model": "interiors/aurora-suite/aurora-suite.walk.json",
    "walk": false,
    "_walk": "the room is seen through the glass only (look-in copy in every suite); 'Step inside' opens the 360 tour above, never a walk",
    "src": "modelled from the 360 panoramas interiors/suite/ (2026-01-21): glass bedroom bed + headboard wall with the fireplace (bedroom, bedside, glass, kitchen), lounge chairs + round table + rug (kitchen, living), sofa bed + cushions (living, kitchen), kitchenette counter + shelf + LED (kitchen, hallway), curtains (kitchen, bedroom, bedside), ceiling with flat strip, downlights and LED lines (kitchen, living, hallway), second bedroom under the roof window (bedroom2); room shell from the client CAD models/suite.glb; sources per piece in tools/blender/interiors/aurora_suite.py",
    "confirm": true,
    "_confirm": "ask the client: is the furniture (bed under the glass, two lounge chairs and round table, sofa bed, counter on the left-hand side for a guest inside facing the glass) the same in all ten suites? Are the curtains normally open? Is the second bedroom's bed always made up as a double?",
    "gain": {
     "lamps": 14,
     "led": 6,
     "sky": 16,
     "glow": 1.0
    },
    "_gain": "strength of each baked light group in the viewer (the bake is physical; these set the exposure): tuned 2026-10-25 outside the glass, day (15 Mar 12:00) and night (21 Dec 20:00), side by side with the cabin's 9/3/12: the suite's dark stained boards (panoramas kitchen, living, bedside) need more light than the cabin's white pine to read as a lit room at night"
   },
   "photoCheck": "DRONE PROPERTY/Drone Property - 3, - 4, - 22 (low winter sun = south): the glass fronts face the camera, i.e. north, as the frame places them; a snow ledge sits on the flashing band under the glass (modelled as the snow cap). refs/photos/Aurora-Cabin-Suite-2-1-scaled.jpg: the roof window is on the right when facing the glass (CAD agrees, local -z)"
  },
  "tower": {
   "pattern": "^tower-(\\d+)$",
   "door": {
    "at": [
     -4.4,
     0
    ],
    "src": "models/tower.glb (client CAD, models/tower.json frame): entrance landing + 3 steps ('deck' part, CAD layer LATTIA, units.tower.photoCheck: photos/tower-1, tower-2 'a landing at the door + 3 steps') run from the door at x -2.3 out to x -4.01 on the axis z 0 (the entrance annex at the narrow end); the point is 0.4 m beyond the foot of the steps"
   },
   "model": "gltf",
   "params": {
    "url": "models/tower.glb",
    "rotationDeg": 0,
    "offset": [
     0,
     0,
     0
    ],
    "mirror": false,
    "materialMap": {
     "interior": "drop",
     "linen": "drop"
    },
    "_materialMap": "the CAD's own inside (stair, loft, furniture) is left out: it drew in the flat window glow over the baked room (owner 2026-10-29: stairs and wall a flat yellow light). The room seen through the glass is walkIn's baked look-in model, built inside this shell",
    "snowCap": true,
    "accents": [
     {
      "points": [
       [
        -2.38,
        2.57,
        -1.32
       ],
       [
        -2.38,
        4.5,
        0
       ],
       [
        -2.38,
        2.57,
        1.32
       ]
      ],
      "r": 0.035,
      "mat": "led",
      "src": "owner 2026-10-26: one continuous A-shaped LED strip under the entrance gable's roof, along both rakes from eave to apex to eave (the map showed only the left rake, read from refs/photos/Towers-1 at night, which shows that side); the CAD has no lights. Placed just under the CAD rakes (gable face x=-2.32, eaves 2.63 m at z=+-1.39, apex 4.62 m since the 0.30 m entrance lift; the gable is symmetric in tower.glb and towerSuite.glb; models/tower.json frame)"
     }
    ]
   },
   "src": "tools/blender/landmarks/aurora_tower.py from the architect's drawings refs/user/drawings (Aurora Tower: Pohjakuva, Parvi, Leikkaus A-A, Julkisivut; sizes in resorts-src/aurora-village/manual/tower/spec.json, 2026-11-04): octagon, two roof-facet windows, skylight and short entrance annex; same unit frame and sizes as the CAD conversion it replaces (within 1 mm); matches refs/photos/Towers-1, refs/user/6.png",
   "fit": "MML footprints are 3.2 m longer than the CAD (10.8 vs 7.6 m, lessons #8); octagon front aligned with the footprint's wide end, as in the approved parametric model. Confirm the along-axis position on the orthophoto",
   "confirm": true,
   "fallback": {
    "model": "tower",
    "params": {
     "annexDepth": 2.3,
     "wing": false
    },
    "src": "refs/user/6.png; user: entrance annex is short"
   },
   "photoCheck": "DRONE PROPERTY/Drone Property - 3 (crop of the tower row): short gabled entrance annex; photos/tower-1.webp, tower-2.webp: a landing at the door + 3 steps, four rises (models.json entrance: CAD floor 0.40 m + lift 0.30 m), roof-facet windows, octagonal skylight; refs/photos/Tower-Suite-4: two windows on adjacent front facets (CAD agrees). Along-axis position is unverifiable: the 2024 MML orthophoto predates the towers",
   "interior": {
    "_doc": "WS-6: 360 interior tour (two floors) opened by 'Step inside' on the card (web/js/interior.js). Built with tools/interiors/ (plan_from_cad, sfm_poses, prepare_panos).",
    "tour": "interiors/tower/tour.json",
    "src": "refs/photos/360 IMAGES/TOWER (client, DJI Osmo 360, 15 photos = 7 positions + helpers); one representative tower",
    "confirm": true
   },
   "walkIn": {
    "model": "interiors/aurora-tower/aurora-tower.walk.json",
    "walk": false,
    "parts": ["closed"],
    "_parts": "the room is shared with units.towerSuite (one set of copies over all ten towers and suites, on the same pictures); a tower adds only its wall on the front-left diagonal facet, where the suite opens into its bedroom",
    "_walk": "the room is seen through the glass only; 'Step inside' opens the 360 tour above, never a walk",
    "src": "modelled from the 360 panoramas interiors/tower/ (2026-01-21): sofa bed + cushions + log stool + round rug under the front window, the front-left diagonal facet a plain wall (lounge, kitchen, table); round oak table + four cognac lounge chairs + rug, a throw on one chair (table, kitchen); kitchenette counter along the back-left facet and the left wall (kitchen, table); bathroom door shut (kitchen); steep open stair up to the loft, dark slat railing at the loft edge (lounge, stairs); loft bed under the skylight with a dark red throw, rug at its foot (loft); dark carved boards on walls and slopes, dark board ceiling under the loft with four downlights, a warm LED strip on every corner post and up every hip (all); room shell from the client CAD models/tower.glb; sources per piece in tools/blender/interiors/aurora_tower.py",
    "confirm": true,
    "_confirm": "ask the client: is the furniture (sofa under the front window, round table with four lounge chairs, counter along the back-left wall, the loft bed under the skylight) the same in all six towers? The loft photo's place in the 360 tour is a hand guess: the bed keeps the CAD's place, head to the front-left as the photo shows",
    "gain": {
     "lamps": 14,
     "led": 6,
     "sky": 7,
     "glow": 1.0
    },
    "_gain": "strength of each baked light group in the viewer, shared by towerSuite (one set of copies): from the Cabin Suite's (same dark stained boards), daylight lower (two tall windows and the open skylight let in more sky than the suite's glass front: at 16 the dark boards read light beige by day)"
   }
  },
  "towerSuite": {
   "pattern": "^tower-(\\d+)$",
   "door": {
    "at": [
     -4.4,
     0
    ],
    "src": "models/towerSuite.glb (client CAD): the same entrance annex, landing and steps as units.tower ('deck' part x -4.01 .. -2.3, z -1.35 .. 1.35, identical in both GLBs; the bedroom wing is on the other side); the point is 0.4 m beyond the foot of the steps"
   },
   "numbers": [
    203,
    205,
    207,
    209
   ],
   "model": "gltf",
   "view": {
    "front": 25,
    "distance": 34,
    "src": "owner 2026-10-29: a tower suite is seen from the side with its windows, the extra bedroom must show. 25 deg off the front towards local +z (the viewer's left) puts the bedroom wing's glass gable and the octagon's front windows in one view; chosen from -25/0/25/50 on tower-205 at night"
   },
   "params": {
    "url": "models/towerSuite.glb",
    "rotationDeg": 0,
    "offset": [
     0,
     0,
     0
    ],
    "mirror": false,
    "materialMap": {
     "interior": "drop",
     "linen": "drop"
    },
    "_materialMap": "as units.tower: the CAD's own inside is left out, the room seen through the glass is walkIn's baked look-in model (the tower room plus the wing part)",
    "snowCap": true,
    "accents": [
     {
      "points": [
       [
        -2.38,
        2.57,
        -1.32
       ],
       [
        -2.38,
        4.5,
        0
       ],
       [
        -2.38,
        2.57,
        1.32
       ]
      ],
      "r": 0.035,
      "mat": "led",
      "src": "owner 2026-10-26: one continuous A-shaped LED strip under the entrance gable's roof, along both rakes from eave to apex to eave (the map showed only the left rake, read from refs/photos/Towers-1 at night, which shows that side); the CAD has no lights. Placed just under the CAD rakes (gable face x=-2.32, eaves 2.63 m at z=+-1.39, apex 4.62 m since the 0.30 m entrance lift; the gable is symmetric in tower.glb and towerSuite.glb; models/tower.json frame)"
     }
    ]
   },
   "src": "tools/blender/landmarks/aurora_tower.py (towerSuite) from the architect's drawings refs/user/drawings (Aurora Tower Family; sizes in resorts-src/aurora-village/manual/tower/spec.json, 2026-11-04); bedroom wing with glass gable leaves the octagon's front-left diagonal facet (local +z), same side as the photo-derived wingSide 'north' (refs/user/6.png)",
   "fit": "placed with the tower transform (same CAD base); the wing is not in the MML footprints",
   "confirm": true,
   "fallback": {
    "model": "tower",
    "params": {
     "annexDepth": 2.3,
     "wing": true,
     "wingSide": "north",
     "roofWindow": true
    },
    "src": "refs/user/6.png (right building: bedroom wing with glass gable)"
   },
   "photoCheck": "DRONE PROPERTY/Tower (Suite) Outside - 8.PNG (top-down) confirms the CAD exactly: entrance annex at the back, bedroom wing off the front-left diagonal facet (left for a viewer facing the front = local +z), roof windows on the front facet and the front-right diagonal facet, and a small roof window on the back-left facet next to the annex. Two dark pipes on the annex roof in that photo are not in the CAD (not modelled; ask)",
   "walkIn": {
    "model": "interiors/aurora-tower/aurora-tower.walk.json",
    "walk": false,
    "parts": ["wing"],
    "_parts": "the tower's room (units.tower.walkIn, its gain too: one set of copies) plus the suite's own part: the opening in the front-left diagonal facet, the passage and the bedroom wing",
    "src": "the tower room from the tower's 360 panoramas (units.tower.walkIn.src); the bedroom wing from the owner's Tower Suite photos (chat 2026-10-28: the bedroom through the passage from the living room by day and at dusk, the bed under the gable glass, the bed at night): two singles made up as one bed, head to the gable glass, white linen, orange throw over the foot half, grey skirts, two sheepskins at the foot, the side window in the wall on the guest's left facing the glass, a lantern on a log stool beside the bed head, carved dark boards, dark board ceiling, a wooden slatted pendant over the table group by the passage; sizes from the client CAD models/towerSuite.glb (opening 1.0 m under a 2.4 m header, room 2.5 x 3.1 m, the sloped gable glass 2.1 m wide); sources per piece in tools/blender/interiors/aurora_tower.py",
    "confirm": true,
    "_confirm": "ask the client: is the bedroom the same in all four suites? Does it have ceiling lights (none show in the photos; lit here by the lantern only)? Is the pendant over the table in every suite?"
   },
   "_interiorNote": "Splat interior rejected by the user 2026-10-11 (built from marketing footage, quality too low). Use a 360° tour when Tower Suite 360 stills exist; a splat only from a dedicated on-site capture."
  }
 },
 "arrive": {
  "_doc": "Where a walking route to a place ends (VIS-227; wayfinding.md): the guest entrance's door point in map metres [x east, z south], on the ground at the foot of the steps / off the porch; routes to every other place end at its pin. A unit type's door is units.<type>.door (unit frame).",
  "panorama-sauna": {
   "at": [
    -183.7,
    43.8
   ],
   "src": "Door in the middle of the entrance gable at the -x end (models/landmarks/panorama-sauna.glb, tools/blender/landmarks/panorama_sauna.py door at x -4.47, z 0); in front of it the terrace kit's entrance landing (x -5.05 .. -4.42) and the 2.5 m wide entrance steps down onto the walkway (x -6.2 .. -5.35, top 0.22) (resort.json buildings.panorama-sauna.params.terrace: '- 15.MP4' 8.6 s, drone frames 'Panorama Sauna Tim - 5/6.MP4'); the point is on the walkway at the foot of the steps"
  },
  "kota": {
   "at": [
    77.7,
    54.3
   ],
   "src": "models/landmarks/kota.json + tools/blender/landmarks/kota.py: door in the gabled entrance on the GLB's +z (P1 photo: door 0.76 x 1.78 m on a 0.40 m threshold, a landing and one step in front), turned to the footprint's -x by rotationDeg -90 (door bearing 218.5, towards the Safari House); the step ends at GLB z 2.63, the point 0.4 m beyond it on the door axis"
  },
  "horse-stable": {
   "at": [
    154.8,
    67.5
   ],
   "src": "models/landmarks/horse-stable.json + tools/blender/landmarks/horse_stable.py (client Studio note photo N1): the yard-side door with 6 panes (x 6.55 .. 7.45) on the +z (yard, NW) wall under the veranda, the grey veranda deck reaching z 5.5; the point is just off the veranda edge in front of that door. The stable has two other doors (the big stable door and a glazed door in the end wall under the open gable porch, +x): which one guests use is not known",
   "confirm": true
  },
  "grill-station": {
   "at": [
    104.9,
    55
   ],
   "src": "models/landmarks/grill-station.glb (tools/blender/landmarks/grill_station.py, client Studio note photo S, the front from the gravel path): the plank deck under the pergola is reached by the ramp at the front (+x); the ramp's foot on the gravel spans GLB z -3.54 .. -1.21 at x 5.17 (top at x 3.79); the point stands 0.3 m beyond the ramp foot. The glazed double door of the grill cabin is on the deck behind the pergola"
  },
  "recycling": {
   "at": [
    49.24,
    20.5
   ],
   "src": "models/landmarks/recycling.json + tools/blender/landmarks/recycling.py (client photos D1, D2): one door 0.80 x 2.0 m centred on the -x wall (the high side of the roof, an insect hotel right of it); the point is 0.8 m in front of the wall line under the roof overhang. In the package frame: the client's Fine-tune turn of this footprint (-103.52 deg, move 0.51, -0.09 m) carries it to (47.7, 18.6) on the map (touches.js arriveMoved).",
   "confirm": true
  },
  "service-hut": {
   "at": [
    -209.2,
    -22.8
   ],
   "src": "models/landmarks/pump-house.json + tools/blender/landmarks/pump_house.py (client Studio note photo P1): the door leaf (0.79 x 2.08 m) on the +x face at z 0.06; buildings.service-hut.frameBearing 243 turns that face to bearing 243 (from the sign arrows and the service road, the script's own confirm); the point is 0.8 m in front of the door"
  },
  "jurtta": {
   "at": [
    113.8,
    65.4
   ],
   "src": "web/js/units.js yurt: door on the deckSide (+x) wall, the entrance deck in front of it out to x 7.50 (r 4.95); buildings.jurtta.frameBearing 191 turns that side to bearing 191 (refs/user/feedback-round5/02-jurtta 'J arrow at the entrance', round-5 correction); the point is 0.4 m beyond the deck edge on the door axis"
  },
  "tipi": {
   "at": [
    144.5,
    -11.9
   ],
   "src": "web/js/lazy/tent.js tent: the wooden entrance hut with the double door stands out of the canvas on the tent's +x to r + l = 4.5 m, turned to the entrance bearing 246 (buildings.tipi.params.bearing; refs feedback-round5/04-tipi-reindeer-ride 'Teepee Front', 'Teepee front with person at the door'); the point is 0.8 m in front of the door"
  },
  "gifts": {
   "at": [
    59.6,
    24.4
   ],
   "src": "models/landmarks/gifts.json + tools/blender/landmarks/gifts.py (client Studio note photos N1, N3): the main door (6 panes) on the front (+z) 1.3 m from the LIVVA gable corner (GLB x 1.9), 3 risers down from its landing to z 3.7 (woodGrey steps x 1.1 .. 2.7); the point is 0.4 m beyond the foot of the steps"
  },
  "safari-house": {
   "at": [
    66.5,
    56.4
   ],
   "src": "models/landmarks/safari-house.glb + tools/blender/landmarks/safari_house.py (client Studio note photo N): the two doors are in the back wall of the porch recessed into the NW face (+z), the porch open from 0.38 to 4.66 m along the face from the west corner (GLB x -9.6 .. -5.3), its slab to z 9.35; the point is 0.55 m in front of the middle of the porch opening"
  },
  "sleigh-sauna": {
   "at": [
    -104.9,
    66.2
   ],
   "src": "models/landmarks/sleigh-sauna.json + tools/blender/landmarks/sleigh_sauna.py (photos F, S, R): the door is on the -z side of the sled at GLB x -0.84 (hinges and handle), sill 0.45 m above the snow; the point is 0.8 m out from that side wall, on the deck side (props sleigh-sauna rot 176 turns -z to the south, the deck and ice hole)"
  },
  "wood-sauna": {
   "at": [
    -177.7,
    77.8
   ],
   "src": "web/js/units.js barrelOnTerrace: centred glazed door in the +z end wall (z 1.76); props wood-sauna.params.terrace: the door landing reaches z 2.6 and is open to the path, the lantern fence path leads to the door end ('path walk-up DJI_..0129', user/10.png); rot 270 turns the door end west. Since the owner's notes of 2026-11-05 the lantern fence (local x -0.9) ends 1.3 m short of the deck and that gap is the way in: the point is in the gap, 0.6 m in front of the landing (local -0.5, 3.2), facing the door"
  },
  "laavu": {
   "at": [
    -42,
    165
   ],
   "src": "web/js/units.js laavu: the open gable front faces the prop's +z (rot 180: north, refs feedback-round5/01-laavu front), the fire ring on the opening line at z 1.7, the roof to z 2.4; a lean-to has no door: the point is in front of the opening, just past the fire ring",
   "confirm": true
  },
  "karting-teepee": {
   "at": [
    958.3,
    350.4
   ],
   "src": "web/js/units.js lavvu porch: the wooden entrance vestibule with its door on the prop's +x, the door face at r 0.6 + l = 2.94 m (zones ice-karting props karting-teepee params.porch, round 4b photo); rot 319; the point is 0.8 m in front of the door",
   "confirm": true
  },
  "karting-demo-cabin": {
   "at": [
    930.7,
    423.5
   ],
   "src": "the demo cabin is a units.cabin model on a prop frame (+x = glass front): its door point as units.cabin.door (vestibule door at the narrow end, -x, foot of the steps at -5.41), turned by the prop's rot 72",
   "confirm": true
  },
  "reception": {
   "at": [
    26.2,
    64
   ],
   "src": "resort.json buildings.main-building parts reception-wing opening (edge 1, at 3.9 m: the entrance door in the back wall of the open gabled porch, left of centre seen from outside; Screenshot 121505 crop a2) and part reception-porch (open on posts, 3.1 m deep, gable to the WNW: 'E' in the client's annotation). The point is in front of the porch's open front, on the line out from the door, 0.6 m outside the porch edge"
  }
 },
 "buildings": {
  "_doc": "Model per place key for non-unit buildings. Unlisted keyed buildings and all unkeyed ones become a plain cottage.",
  "panorama-sauna": {
   "model": "gltf",
   "params": {
    "url": "models/landmarks/panorama-sauna.glb",
    "terrace": {
     "src": "VIS-246: drone frames 'Panorama Sauna Tim - 5.MP4' 0.3 s and '- 6.MP4' 0.5 s rectified on the MML footprint; newest ground clips 2026-02/03 (Panorama Sauna - 1, 15, 17, 21); 2023 top-down (- 16.JPG). Generated by resorts-src/aurora-village/manual/panorama_sauna.py",
     "decks": [
      {
       "poly": [
        [
         -5.05,
         -1.25
        ],
        [
         -4.42,
         -1.25
        ],
        [
         -4.42,
         1.25
        ],
        [
         -5.05,
         1.25
        ]
       ],
       "top": 0.4,
       "src": "entrance landing 2.5 m wide in front of the door in the middle of the gable end ('- 15.MP4' 8.6 s, door 0.8 x 2.0 m for scale)"
      },
      {
       "poly": [
        [
         -6.2,
         -2.9
        ],
        [
         -5.35,
         -2.9
        ],
        [
         -5.35,
         1.0
        ],
        [
         -6.2,
         1.4
        ]
       ],
       "top": 0.22,
       "src": "walkway along the entrance end, 1 m wide, the entrance steps land on it (drone frames 'Panorama Sauna Tim - 5.MP4' 0.3 s and '- 6.MP4' 0.5 s rectified on the MML footprint)"
      },
      {
       "poly": [
        [
         -6.2,
         1.4
        ],
        [
         -5.35,
         1.0
        ],
        [
         -4.55,
         1.95
        ],
        [
         -4.95,
         2.95
        ]
       ],
       "top": 0.22,
       "src": "walkway's cut corner (drone frames 'Panorama Sauna Tim - 5.MP4' 0.3 s and '- 6.MP4' 0.5 s rectified on the MML footprint; '- 15.MP4' 13.5 s)"
      },
      {
       "poly": [
        [
         -4.95,
         2.95
        ],
        [
         -4.55,
         1.95
        ],
        [
         -2.4,
         2.57
        ],
        [
         -2.69,
         3.58
        ]
       ],
       "top": 0.22,
       "src": "walkway along the tub side of the building to the tub deck (drone frames 'Panorama Sauna Tim - 5.MP4' 0.3 s and '- 6.MP4' 0.5 s rectified on the MML footprint; '- 15.MP4' 13.5 s)"
      },
      {
       "poly": [
        [
         -2.4,
         2.57
        ],
        [
         6.64,
         5.16
        ],
        [
         5.41,
         9.44
        ],
        [
         -2.71,
         6.9
        ]
       ],
       "top": 0.3,
       "src": "tub deck about 9.4 x 4.3 m, 16 deg off the building axis, a step above the gravel (drone frames 'Panorama Sauna Tim - 5.MP4' 0.3 s and '- 6.MP4' 0.5 s rectified on the MML footprint; Tim Panorama Sauna.jpg)"
      },
      {
       "poly": [
        [
         9.08,
         1.7
        ],
        [
         12.93,
         2.8
        ],
        [
         10.56,
         11.07
        ],
        [
         6.71,
         9.97
        ]
       ],
       "top": -0.3,
       "src": "lower viewing deck below the broad steps, railed on its downhill side (drone frames 'Panorama Sauna Tim - 5.MP4' 0.3 s and '- 6.MP4' 0.5 s rectified on the MML footprint; '- 21.MP4' 2026-03; '- 16.JPG'; user round 4b: a terrace a little below the deck)"
      },
      {
       "poly": [
        [
         12.33,
         -3.82
        ],
        [
         14.64,
         -3.16
        ],
        [
         12.93,
         2.8
        ],
        [
         10.62,
         2.14
        ]
       ],
       "top": -0.3,
       "src": "the lower deck's narrower run along the slope to the stairs down ('- 16.JPG', 2023 top-down; TD frames)"
      }
     ],
     "stairs": [
      {
       "from": [
        -5.05,
        0.0
       ],
       "to": [
        -5.35,
        0.0
       ],
       "w": 2.5,
       "top": 0.4,
       "bottom": 0.22,
       "rails": false,
       "src": "entrance steps down onto the walkway ('- 15.MP4' 8.6 s)"
      },
      {
       "from": [
        5.82,
        8.0
       ],
       "to": [
        7.17,
        8.38
       ],
       "w": 3.0,
       "top": 0.3,
       "bottom": -0.3,
       "src": "broad steps from the tub deck down to the lower deck (drone frames 'Panorama Sauna Tim - 5.MP4' 0.3 s and '- 6.MP4' 0.5 s rectified on the MML footprint; '- 21.MP4')"
      },
      {
       "from": [
        13.48,
        -3.49
       ],
       "to": [
        14.26,
        -6.18
       ],
       "w": 1.2,
       "top": -0.3,
       "src": "stairs from the lower deck's far end down the slope to the path ('- 16.JPG'; user round 4b/4c: one stair down to a small landing on the slope path)"
      }
     ],
     "rails": [
      {
       "pts": [
        [
         -5.35,
         1.0
        ],
        [
         -4.55,
         1.95
        ],
        [
         -2.4,
         2.57
        ]
       ],
       "base": 0.22,
       "src": "railing on the building side of the walkway ('- 15.MP4' 13.5 s; TD frames)"
      },
      {
       "pts": [
        [
         -2.4,
         2.57
        ],
        [
         0.29,
         3.34
        ]
       ],
       "base": 0.3,
       "src": "the walkway railing goes on along the tub deck up to the tub (TD frames)"
      },
      {
       "pts": [
        [
         -2.71,
         6.9
        ],
        [
         5.41,
         9.44
        ]
       ],
       "base": 0.3,
       "src": "railing along the outer side of the tub deck (TD frames; Tim Panorama Sauna.jpg)"
      },
      {
       "pts": [
        [
         6.64,
         5.16
        ],
        [
         6.24,
         6.55
        ]
       ],
       "base": 0.3,
       "src": "railing on the tub deck edge beside the broad steps (TD frames)"
      },
      {
       "pts": [
        [
         6.71,
         9.97
        ],
        [
         10.56,
         11.07
        ],
        [
         14.64,
         -3.16
        ],
        [
         14.06,
         -3.32
        ]
       ],
       "base": -0.3,
       "src": "railing round the lower deck's downhill side ('- 21.MP4'; '- 16.JPG'; TD frames)"
      }
     ],
     "tubs": [
      {
       "pos": [
        1.85,
        4.97
       ],
       "size": [
        2.6,
        2.6
       ],
       "rot": -16,
       "base": 0.3,
       "rimH": 0.85,
       "cover": "-z",
       "light": "cycle",
       "steam": 0.6,
       "src": "square spa about 2.6 m (TD frames: 2.6-2.7 m at rim height) set in the tub deck's building edge, cover folded up on the building side ('Tim Panorama Sauna.jpg', 'Panorama Sauna - 2.JPG'). Colour-cycling light and faint steam: user statement round 4b"
      }
     ],
     "benches": [
      {
       "pos": [
        -0.3,
        3.45
       ],
       "len": 1.2,
       "rot": -16,
       "base": 0.3,
       "src": "bench by the tub on the building side (TD frames)"
      },
      {
       "pos": [
        3.7,
        5.0
       ],
       "len": 1.2,
       "rot": -16,
       "base": 0.3,
       "src": "bench beside the tub ('Tim Panorama Sauna.jpg'; TD frames)"
      },
      {
       "pos": [
        -1.0,
        7.0
       ],
       "len": 1.45,
       "rot": -16,
       "base": 0.3,
       "src": "bench along the outer railing (TD frames)"
      },
      {
       "pos": [
        1.64,
        7.89
       ],
       "len": 1.2,
       "rot": -16,
       "base": 0.3,
       "src": "bench along the outer railing (TD frames)"
      },
      {
       "pos": [
        3.75,
        8.35
       ],
       "len": 1.2,
       "rot": -16,
       "base": 0.3,
       "src": "bench along the outer railing (TD frames; '- 1 - @ivanmeloni.MP4')"
      }
     ],
     "screens": [
      {
       "pos": [
        -2.3,
        6.5
       ],
       "w": 1.3,
       "h": 1.8,
       "rot": -106,
       "base": 0.3,
       "src": "tall slatted screen at the tub deck's walkway corner ('- 15.MP4' 13.5 s, 2026-03; TD frames)"
      }
     ],
     "fences": [
      {
       "pts": [
        [
         -5.25,
         -11.9
        ],
        [
         2.67,
         -6.0
        ],
        [
         7.83,
         -1.17
        ]
       ],
       "h": 1.5,
       "src": "roundpole fence (riukuaita) on the far side of the building from the tub (drone frames 'Panorama Sauna Tim - 5.MP4' 0.3 s and '- 6.MP4' 0.5 s rectified on the MML footprint; '- 17.MP4' 2026-03)"
      }
     ]
    }
   },
   "fallback": {
    "model": "glassKota",
    "params": {}
   },
   "view": {
    "front": 45,
    "elevation": 22,
    "distance": 32
   },
   "src": "VIS-246: the Aurora cabin glass kota (owner 2026-10-22: \"It has a symmetrical shape like the aurora cabin ... entrance is in the center\"; DJI_0325.DNG top-down: five glass panes the same size, an equal cap round the top, the ridge flush with the top of the glass), built in Blender from the cabin plan (tools/blender/landmarks/panorama_sauna.py, with the sauna room inside); the terrace kit from the drone frames (resorts-src/aurora-village/manual/panorama_sauna.py). Replaces the glassFront model (WS-10 round 4c)",
   "confirm": true
  },
  "reception": {
   "model": "hip",
   "params": {
    "wallH": 5,
    "roofH": 3.6
   },
   "src": "WS-5: this footprint (mtk 2117117678) is 'Restaurant Loimu & Reception': client printed map 2026-27 labels it 'RESTAURANT, RECEPTION' with 'SAFARI HOUSE' on its east block; DRONE PROPERTY/Restaurant New - 4.jpg shows the octagonal dining hall with a copper crown built into it",
   "todo": "octagonal crowned roof for the dining hall: not modelled yet. Its position inside the footprint is uncertain (WS-2 read: the east block; WS-5 read of the drone photo + printed map: west of the long glazed north facade, about (50, 64), with the east block = Safari House). Needs client confirmation, then a hip-model 'octagon' parameter",
   "confirm": true,
   "_superseded": "WS-19 rc1: no footprint uses the key reception any more (mtk 2117117678 = main-building, compound model; Reception is a part place). Kept only as the old hip fallback for ?edit; safe to delete"
  },
  "jurtta": {
   "model": "yurt",
   "params": {
    "deckSide": 1
   },
   "frameBearing": 191,
   "_frameBearing": "WS-24 (round-5 feedback 'Jurtta rotated 180 deg', taxonomy: orientation ambiguity): the deck + door (deckSide 1 = local +x) now faces bearing 191 (S, slightly W). Source: refs/user/feedback-round5/02-jurtta/'Jurtta, grill area, building behinf jurtta.png' (J arrow at the entrance; crop rotated ~37 deg, fitted on the jurtta and the building north of it, mtk 2117109017 / 2117109007, checked on the grill station 2275750229 within 3 m). WS-5 read the 2024 ortho deck arc as ENE (bearing ~77); the round footprint's frame axis is arbitrary, so the side came out by chance",
   "src": "WS-5 (high): OSM way 1231390184 name=Jurtta on mtk 2117109017; MML ortho 2024 white round canvas roof; refs/user/11.jpg (canvas yurt, deck with steps, string lights, stove pipe). deckSide 1 = local +x = east-north-east: brown deck arc on the NE edge and gravel yard to the E on the 2024 ortho",
   "confirm": false
  },
  "gifts": {
   "model": "cottage",
   "params": {
    "wallH": 2.5,
    "sign": true,
    "whiteDoor": true
   },
   "src": "refs/user/12.webp",
   "_superseded": "WS-24: the gift shop is now a prop (props[key=gifts]); no footprint uses the key gifts. Kept only for ?edit; safe to delete"
  },
  "horse-stable": {
   "model": "gltf",
   "params": {
    "url": "models/landmarks/horse-stable.glb"
   },
   "fallback": {
    "model": "cottage",
    "params": {
     "wallH": 3.2,
     "pitch": 0.7
    }
   },
   "confirm": true,
   "src": "VIS-234: Blender GLB tools/blender/landmarks/horse_stable.py from the client's Studio note photos refs/notes/horse-stable (yard side, open gable porch). Roof outline = MML footprint 2069763581 (ortho 2024 + z18 agree); +x = open gable porch facing bearing 221 (fields), +z = yard side with the veranda (bearing 311). Heights from the door and the heat-pump unit, pitch 0.4 (confirm). Chimneys placed by a camera solve on photo 2 (+-1.5 m). Unseen: SE side, NE end wall, SE roof slope (plain). Big stable door drawn closed. The note's pin (202.95, 104.53) is ~55 m off by the paddock, read as the riding meeting point. approved by the owner 2026-10-21 ('Everything looks super good. now place them into production'), VIS-234 before/after review"
  },
  "kota": {
   "model": "gltf",
   "params": {
    "url": "models/landmarks/kota.glb",
    "rotationDeg": -90,
    "offset": [
     0.27,
     0,
     0
    ],
    "smoke": [
     [
      0,
      4.17,
      0
     ]
    ],
    "materialMap": {
     "log": "kotaLog"
    }
   },
   "smoke": true,
   "fallback": {
    "model": "grillKota"
   },
   "confirm": true,
   "src": "VIS-234: Blender GLB tools/blender/landmarks/kota.py from refs/notes/kota P1-P5 (client Studio note, autumn 2026): regular hexagon, wall 1.8 m (footprint mtk 2069770162 width 3.6 m corner to corner), gabled entrance 0.55 m, windows front-left/front-right/back, roof glazing on three faces, rack back-left, square flue on the apex (smoke point). Door faces bearing 218.5 towards the Safari House NE wall (P4); rotationDeg -90 turns the GLB front (+z) to the footprint's -x end, offset 0.27 m centres walls + entrance on the footprint. Sizes are photo estimates. approved by the owner 2026-10-21 ('Everything looks super good. now place them into production'), VIS-234 before/after review"
  },
  "main-building": {
   "model": "compound",
   "src": "User annotation main-building-S-L-R-E-annotated.png (S = Safari House, L = Loimu, R = Reception, E = entrances; the annotation was drawn on a view whose screen-up is south-east, so S = the EAST block and R = the WEST block). Plans: MML 2117117678 vertices + top-down drone Screenshot 121546 (georeferenced). Facades: Screenshots 121346, 121420, 121505 and Restaurant New - 4/5 (dusk drone views of the north courtyard facade)",
   "confirm": true,
   "params": {
    "parts": [
     {
      "id": "loimu-link",
      "place": "restaurant-loimu",
      "pts": [
       [
        44.8,
        58.5
       ],
       [
        63.0,
        57.4
       ],
       [
        64.9,
        58.8
       ],
       [
        57.3,
        71.8
       ],
       [
        53.9,
        75.5
       ],
       [
        40.5,
        63.8
       ]
      ],
      "wallH": 3.9,
      "roof": {
       "type": "hip",
       "pitch": 0.5,
       "overhang": 0.6
      },
      "openings": [
       {
        "edge": 0,
        "from": 2.6,
        "to": 7.0,
        "panes": 3,
        "sill": 0.45,
        "head": 3.0,
        "frame": "dark",
        "look": "interior",
        "inside": "open",
        "src": "Screenshot 121346: three 3-pane window groups, about 5 m each, 2.5 m tall; positions scaled from the door (0.95 m)"
       },
       {
        "edge": 0,
        "from": 7.8,
        "to": 12.2,
        "panes": 3,
        "sill": 0.45,
        "head": 3.0,
        "frame": "dark",
        "look": "interior",
        "inside": "open",
        "src": "Screenshot 121346"
       },
       {
        "edge": 0,
        "from": 13.1,
        "to": 17.6,
        "panes": 3,
        "sill": 0.45,
        "head": 3.0,
        "frame": "dark",
        "look": "interior",
        "inside": "open",
        "src": "Screenshot 121346"
       },
       {
        "edge": 0,
        "from": 18.1,
        "to": 18.7,
        "panes": 1,
        "sill": 0.45,
        "head": 3.0,
        "frame": "dark",
        "inside": "open",
        "src": "Restaurant New - 5 / Screenshot 121505: narrow window at the Safari House end"
       }
      ],
      "src": "L in the annotation (the new link wing). North wall = MML 5-6 (glazed courtyard facade), joint with S along S's NW wall line (7-13), joint with Reception along the line octagon-15. South side has no photo: no openings. Wall 3.9 m from 121346 (2.5 m windows, 1 m band above) Round 4c (user): the narrow glazed panel next to the octagon is removed; plain cladding like its neighbours.",
      "confirm": true,
      "view": {
       "bearing": 0,
       "elevation": 24
      },
      "view_src": "Front = the side the entrances and the client photos face (courtyard N for Loimu and Safari House, WNW porch for Reception); round 4b: fly-to showed the blank back"
     },
     {
      "id": "loimu-hall",
      "place": "restaurant-loimu",
      "shape": {
       "type": "octagon",
       "center": [
        41.8,
        62.4
       ],
       "apothem": 5.6,
       "rot": 0
      },
      "labelAt": [
       41.8,
       62.4
      ],
      "wallH": 3.4,
      "roof": {
       "type": "hip",
       "pitch": 1.0,
       "overhang": 0.7,
       "capR": 0.8
      },
      "crown": {
       "h": 2.2,
       "r0": 0.68,
       "r1": 1.4,
       "slats": 22
      },
      "openings": [
       {
        "facing": "NE",
        "from": 0.3,
        "to": 2.0,
        "panes": 2,
        "sill": 0.45,
        "head": 2.9,
        "frame": "light",
        "look": "interior",
        "inside": "open",
        "src": "Screenshot 121505: partial facet (2 panes) where the link wing meets the octagon"
       },
       {
        "facing": "N",
        "from": 0.3,
        "to": 4.3,
        "panes": 3,
        "sill": 0.45,
        "head": 2.9,
        "frame": "light",
        "look": "interior",
        "inside": "open",
        "src": "Screenshot 121346 / 121505: frontal facet, 3 panes"
       },
       {
        "facing": "NW",
        "from": 0.3,
        "to": 4.3,
        "panes": 3,
        "sill": 0.45,
        "head": 2.9,
        "frame": "light",
        "look": "interior",
        "inside": "open",
        "src": "Screenshot 121346 / 121505: third facet, towards the Reception wall"
       }
      ],
      "src": "Octagonal kota-style dining hall with the lit wooden crown (Restaurant New - 4/5, Screenshots 121346/121505; older aurora-village-loimu-restaurant-in-winter-at-moonlight.jpg). Centre = crown on the georeferenced top-down drone shot (41.8, 62.1); apothem 5.6 from the crown-to-north-eave distance on that shot (6.5 m incl. overhang); its N-NW corner lands on MML vertex 4. The link wing starts at MML vertex 5, so half of the NE facet stays outside, as the 2-pane facet in 121505 shows. Roof about 45 deg (121346)",
      "confirm": true,
      "crown_src": "Screenshots 121505/121420 (crops in resorts-src/aurora-village/work/qa/ws12/audit/): wide flat slats of two lengths on a base ring that sits on the flattened top of the snow cone (round 4b: the sharp apex made the crown float on a spike)"
     },
     {
      "id": "reception-wing",
      "place": "reception",
      "pts": [
       [
        25.6,
        70.6
       ],
       [
        26.6,
        69.4
       ],
       [
        29.8,
        65.5
       ],
       [
        36.2,
        60.1
       ],
       [
        38.6,
        63.8
       ],
       [
        29.9,
        74.1
       ]
      ],
      "wallH": 3.3,
      "roof": {
       "type": "hip",
       "pitch": 0.55,
       "overhang": 0.6
      },
      "openings": [
       {
        "edge": 2,
        "at": 2.9,
        "w": 1.1,
        "sill": 1.5,
        "head": 2.3,
        "frame": "light",
        "src": "Screenshot 121505 (right): two small windows between the octagon and the porch"
       },
       {
        "edge": 2,
        "at": 5.8,
        "w": 1.1,
        "sill": 1.5,
        "head": 2.3,
        "frame": "light",
        "src": "Screenshot 121505 (right)"
       },
       {
        "edge": 1,
        "at": 3.9,
        "w": 1.0,
        "kind": "door",
        "head": 2.1,
        "src": "Screenshot 121505 (crop resorts-src/aurora-village/work/qa/ws12/audit/a2_porch_121505.png): the entrance door is in the back wall of the open porch, left of centre seen from outside; the porch and the door are lit warm in 121505, so a light beside the door",
        "lamp": true
       },
       {
        "edge": 1,
        "at": 0.8,
        "w": 0.8,
        "sill": 1.0,
        "head": 1.9,
        "frame": "light",
        "src": "Screenshot 121505 (crop a2): lit window with a wreath in the porch back wall, right of the door"
       }
      ],
      "src": "Reception = the NW wing behind the gabled entrance porch (MML 21-22-2-3, ending on the octagon NW corner). Round 4b: the card and highlight now claim only this wing and the porch; the split line is an estimate: confirm",
      "confirm": true,
      "view": {
       "bearing": 305,
       "elevation": 24
      },
      "view_src": "Front = the side the entrances and the client photos face (courtyard N for Loimu and Safari House, WNW porch for Reception); round 4b: fly-to showed the blank back",
      "labelAt": [
       29.0,
       68.0
      ]
     },
     {
      "id": "reception-porch",
      "place": "reception",
      "pts": [
       [
        26.6,
        69.4
       ],
       [
        24.3,
        67.3
       ],
       [
        27.3,
        63.6
       ],
       [
        29.8,
        65.5
       ]
      ],
      "wallH": 2.6,
      "roof": {
       "type": "gable",
       "pitch": 0.85,
       "overhang": 0.45,
       "gables": [
        1,
        3
       ]
      },
      "openings": [],
      "src": "E at R in the annotation: open gabled entrance porch on posts (MML 22-0-1-2, 4.8 x 3.1 m), gable facing WNW, railing on the SW side, door in the back wall. Screenshot 121505 crop a2 (round 4b audit: the first model had a closed front wall with a door and windows, which the photo does not show)",
      "confirm": true,
      "openEdges": [
       1,
       2,
       3
      ],
      "lowEdges": {
       "0": 1.0
      },
      "posts": true,
      "floor": 0.2
     },
     {
      "id": "back-of-house",
      "pts": [
       [
        26.7,
        77.9
       ],
       [
        38.4,
        88.1
       ],
       [
        52.2,
        74.0
       ],
       [
        40.5,
        63.8
       ]
      ],
      "wallH": 3.3,
      "roof": {
       "type": "hip",
       "pitch": 0.55,
       "overhang": 0.6
      },
      "src": "Round 4b, user: part of the Reception block is the kitchen and back rooms. This big SW block (MML 19-18-15 + the corner under the octagon) carries the three rooftop ventilation units and most roof pipes (drone 121546), which fits a kitchen; so it is back-of-house: no card, no pick. The exact reception/back-of-house split has no photo: confirm",
      "confirm": true
     }
    ],
    "chimneys": [
     {
      "at": [
       36.3,
       65.1
      ],
      "r": 0.17,
      "h": 1.3,
      "collar": true,
      "src": "drone 121546 dark dot; black chimney pipe on the Reception roof in Screenshot 121505 (right)"
     },
     {
      "at": [
       37.4,
       71.9
      ],
      "r": 0.12,
      "h": 0.7,
      "src": "drone 121546 dark dot (roof pipe)"
     },
     {
      "at": [
       39.9,
       67.6
      ],
      "r": 0.12,
      "h": 0.7,
      "src": "drone 121546 dark dot (roof pipe)"
     },
     {
      "at": [
       34.1,
       73.8
      ],
      "r": 0.12,
      "h": 0.7,
      "src": "drone 121546 dark dot (roof pipe)"
     },
     {
      "at": [
       40.4,
       79.3
      ],
      "r": 0.12,
      "h": 0.7,
      "src": "drone 121546 dark dot (roof pipe)"
     },
     {
      "at": [
       50.3,
       70.0
      ],
      "r": 0.25,
      "h": 0.45,
      "src": "drone 121546 round vent cap"
     }
    ],
    "roofBoxes": [
     {
      "at": [
       44.5,
       70.5
      ],
      "size": [
       2.4,
       0.7,
       2.4
      ],
      "src": "Rooftop ventilation units (dark metal housings with snow caps) in Screenshots 121420 and 121505 and the drone top view 121546 (crops in resorts-src/aurora-village/work/qa/ws12/audit/); positions from the georeferenced drone shot, height from 121420"
     },
     {
      "at": [
       44.5,
       76.2
      ],
      "size": [
       1.2,
       0.6,
       1.2
      ],
      "src": "Rooftop ventilation units (dark metal housings with snow caps) in Screenshots 121420 and 121505 and the drone top view 121546 (crops in resorts-src/aurora-village/work/qa/ws12/audit/); positions from the georeferenced drone shot, height from 121420"
     },
     {
      "at": [
       44.0,
       79.5
      ],
      "size": [
       2.6,
       0.7,
       2.6
      ],
      "src": "Rooftop ventilation units (dark metal housings with snow caps) in Screenshots 121420 and 121505 and the drone top view 121546 (crops in resorts-src/aurora-village/work/qa/ws12/audit/); positions from the georeferenced drone shot, height from 121420"
     }
    ],
    "signs": [
     {
      "at": [
       50.0,
       60.0
      ],
      "facing": "N",
      "w": 5.0,
      "h": 1.6,
      "lift": 0.25,
      "lines": [
       "AURORA",
       "VILLAGE"
      ],
      "src": "Restaurant New - 4/5, Screenshot 121346: lit name sign on the courtyard roof slope of the link wing, above the window group nearest the octagon, about one window group wide (5.0 x 1.6 m); text only (the client's logo is not reproduced)"
     }
    ],
    "interior": {
     "url": "models/interiors/restaurant-loimu.glb",
     "gain": 0.2,
     "day": 0.25,
     "src": "client photos of January 2026, after the restaurant was extended (RAW FOOTAGE OURS/2026 - JANUARY/PHOTOS/RESTAURANT, A1206320-6626 and A1207931-7967; Restaurant New - 4, 5 from outside): dining hall with tables at the windows, round tables on rugs, the round red booth, the bar with lit niches, the birch-trunk wall, the corner bench, the lounge with the hanging fireplace; round hall with the central fireplace, the buffet and long tables. Room shapes and window holes from this file; furniture positions by eye from the photos",
     "confirm": true
    }
   },
   "_rc": "go-live 2026-10-13, owner in chat: 'Yeah, put it live' (restaurant interior behind real glass, VIS-6)"
  },
  "karting-hut-west": {
   "model": "cottage",
   "params": {
    "wallH": 2.5,
    "pitch": 0.8,
    "windows": true,
    "door": false,
    "light": false
   },
   "src": "WS-13: MTK 1302703291 (7.2 x 4.2 m). 122230: dark red-brown boarded hut, snow on a gable roof, a window on the south side. Door side not visible (no door modelled). Round 4b: the user names two buildings, 'the ice-karting hut and the hut where the karts are stored'; which hut is which is not certain (confirm). WS-31 (round 5 satellite, refs/user/feedback-round5/10-ice-karting): this and karting-hut-east are the two 'c' (cabins) at the road end; the karting hut is 'H' (karting-shed) and the storage 'S' (karting-storage)",
   "confirm": true,
   "_rc": "round-4 release candidate rc1 (WS-19, user 2026-10-12: 'all of the changes should be applied ... one final versioned piece'): karting live (clockwise race, fully electric card, tour stop); open client questions stay confirm"
  },
  "karting-hut-east": {
   "model": "cottage",
   "params": {
    "wallH": 2.5,
    "pitch": 0.8,
    "windows": true,
    "door": false,
    "light": false,
    "wall": "pine"
   },
   "src": "WS-13: MTK 1785159889 (6.6 x 4.3 m). 122230/122347: light tan boarded hut, gable roof with snow, windows on the south-east side. Door side not visible. Round 4b: taken as the kart storage hut (tan walls; a tan building with a wide door shows in the dusk frame 122311) - confirm. WS-31 (round 5 satellite): one of the two 'c' (cabins); the kart storage is 'S' (karting-storage)",
   "confirm": true,
   "_rc": "round-4 release candidate rc1 (WS-19, user 2026-10-12: 'all of the changes should be applied ... one final versioned piece'): karting live (clockwise race, fully electric card, tour stop); open client questions stay confirm"
  },
  "karting-long-building": {
   "model": "cottage",
   "params": {
    "wallH": 2.6,
    "roof": "flat",
    "windows": false,
    "door": false,
    "light": false,
    "wall": "trim"
   },
   "src": "WS-13: MTK 2117188506 (11.3 x 3.2 m). 122230: long white flat-roofed building (container-like) with a fence running east from it; the same building with its fence is in the corner of the top-down frame 122032. Openings not visible",
   "confirm": true,
   "_rc": "round-4 release candidate rc1 (WS-19, user 2026-10-12: 'all of the changes should be applied ... one final versioned piece'): karting live (clockwise race, fully electric card, tour stop); open client questions stay confirm"
  },
  "karting-shed": {
   "model": "cottage",
   "params": {
    "wallH": 2.4,
    "pitch": 0.6,
    "windows": false,
    "door": false,
    "light": false
   },
   "src": "WS-13: MTK 1798277333 (7.9 x 5.2 m) inside the loop; the 2024 ortho shows a pale roof there. The Jan 2026 top-down frame shows a container-sized white roof ~9 m NW of this footprint instead: confirm which is current. WS-31: the round 5 satellite labels this building 'H' (hut) = the ice-karting hut, at its MTK footprint (registration residual 0.1 m)",
   "confirm": true,
   "_rc": "round-4 release candidate rc1 (WS-19, user 2026-10-12: 'all of the changes should be applied ... one final versioned piece'): karting live (clockwise race, fully electric card, tour stop); open client questions stay confirm"
  },
  "grill-station": {
   "model": "gltf",
   "params": {
    "url": "models/landmarks/grill-station.glb"
   },
   "fallback": {
    "model": "cottage",
    "params": {
     "wallH": 2.1,
     "pitch": 0.3,
     "windows": false,
     "light": false
    }
   },
   "confirm": true,
   "src": "VIS-234: Blender GLB tools/blender/landmarks/grill_station.py from the client's Studio note photos refs/notes/grill-station/ast_gydrccgcbayy4snh.webp (west side) + ast_sse6gca7z5mnszwg.webp (front): two-photo camera solve (30 points, ~2 px), scaled x0.95 onto MML footprint 2275750229, whose L outline is the pergola + cabin. Cabin 3.22 x 3.04 m, black boards, mono-pitch roof; pergola on 4 + 3 + 3 posts, beams on the post tops and rafters running over the cabin roof (the cover rests on its posts, no gap); clear corrugated roof; deck + ramp; two fire bowls, picnic table, firewood cart, WC signs. Front (+x, pergola) faces bearing 197 on the footprint frame (the earlier client rule gave 218: confirm). Back wall and the Jurtta-side wall not photographed (plain). approved by the owner 2026-10-21 ('Everything looks super good. now place them into production'), VIS-234 before/after review"
  },
  "tipi": {
   "model": "tent",
   "smoke": true,
   "params": {
    "bearing": 246,
    "r": 3.6,
    "h": 5.4,
    "poles": 14,
    "poleExt": 1.6,
    "color": "#d6ccb8",
    "sag": 0.12,
    "snow": 0.6,
    "glow": 0.08,
    "_glow": "owner 2026-10-25: the glow through the canvas should fade ('not a completely even overlay', 'that harsh cut at the bottom ... needs to fade'): tent.js now shades it by where the fire's light falls and fades it out above the snow on the canvas, so the same strength reads dimmer; 0.08 keeps the lower band about as warm as the old flat 0.05",
    "smoke": true,
    "entrance": {
     "l": 0.9,
     "w": 2.2,
     "wallH": 2.0,
     "ridge": 2.6,
     "door": "double",
     "lights": true,
     "antlers": true,
     "lanterns": true
    }
   },
   "src": "WS-27: refs/user/feedback-round5/04-tipi-reindeer-ride/ 'Teepee Front' (double braced door, string lights under the gable, antlers on the peak, poles crossing above the smoke hole, smoke), 'Teepee front with person at the door' (door 1.9 m and hut 2.2 m wide against a person, candle lanterns either side, light canvas), 'Teepee entrance side profile' (vertical weathered boards, the hut stands out of the canvas), 'Teepee + entrance hut from above' (canvas lit from inside at blue hour, about 14 poles). Entrance bearing 246 (WSW): satellite E label + the hut's roof on the west foot of the cone; the 2024 ortho shows the same. r 3.6 from the white cone on the ortho (about 7 m across; the MML circle of 10 m is generalised); canvas height 5.4 m estimated from the door (confirm) | round 5b (user 2026-10-12): no strong glow from inside (glow 0.05 = a hint of warmth); light smoke is fine",
   "confirm": true,
   "_rc": "round-5 go-live: WS-27 tipi + paddock + reindeer ride (sled option A) approved by the user 2026-10-12"
  },
  "service-building": {
   "model": "compound",
   "src": "User feedback 2026-10-15 (refs/user/feedback-round8/service-buildings: Google satellite with the two buildings circled, a dusk drone frame from the north, a close crop): 'one L-shaped building and one non-L-shaped building close to each other', 'remove the windows all around'; then (same day, on the first draft): the garage is a plain rectangle with one normal gable roof, the small tail of the L on the satellite is at most a snow cover, not part of the building. Plan = the main block of MML footprint 2275750244 (vertices A B C + the corner where edge C-D meets edge A-F, 10.5 x 14.1 m); the L's tail is not drawn. Ridge north-east to south-west (2024 MML ortho resampled into the footprint frame, Google satellite, drone frame). The drone frame is camera-matched (resorts-src/aurora-village/manual/camera_matches_service.json; the main building, staff house and cabins overlay it) and measured on the wall planes: ridge 4.9 m from the north corner, eaves 4.25 to 4.6 m; the gable's east corner is hidden behind the shed's roof. Walls 4.5 m, ridge about 2.4 m above them. No windows: none show on the two walls the photo sees. Not in the 2011 lidar (built later)",
   "confirm": true,
   "_confirm": "what the south-east and south-west walls have (no photo); the fence's far end; what the small cover by the south corner is (not drawn)",
   "params": {
    "parts": [
     {
      "id": "garage",
      "place": "service-building",
      "pts": [
       [
        67.3,
        92.5
       ],
       [
        77.7,
        83.0
       ],
       [
        84.9,
        90.6
       ],
       [
        74.69,
        100.23
       ]
      ],
      "wallH": 4.5,
      "roof": {
       "type": "gable",
       "pitch": 0.45,
       "overhang": 0.5,
       "gables": [
        1,
        3
       ]
      },
      "view": {
       "bearing": 10,
       "elevation": 32
      },
      "openings": [
       {
        "edge": 1,
        "from": 0.3,
        "to": 5.7,
        "kind": "bay",
        "head": 4.2,
        "chamfer": 1.1,
        "frame": "white",
        "src": "north-east gable end: wide opening with cut top corners, standing open and lit inside; measured on the wall plane from the north corner: sides 0.2 and 5.6 to 5.8 m, cut corners from about 3.1 m up, top 4.0 to 4.9 m (drone frame)"
       },
       {
        "edge": 0,
        "from": 3.6,
        "to": 11.0,
        "kind": "bay",
        "head": 4.0,
        "frame": "white",
        "src": "north-west wall: large garage opening standing open, lit, a vehicle inside; measured 3.6 to 11.1 m from the west corner, top about 3.9 to 4.15 m (drone frame)"
       }
      ],
      "inside": {
       "lit": true,
       "glow": 0.015,
       "src": "user 2026-10-16 (relaying the owner): the light inside should be very dim or completely off; was 0.35"
      },
      "lamps": [
       {
        "at": [
         75.04,
         92.59
        ],
        "src": "user 2026-10-15: one light from the roof pointing down inside the garage, to adjust in the light menu; 2026-10-16: kept as a small fixture (the owner wants the inside very dim); brighten, dim or switch it off in Fine-tune's Lights",
        "r": 0.22
       }
      ]
     }
    ],
    "fences": [
     {
      "pts": [
       [
        97.4,
        72.2
       ],
       [
        91.4,
        78.4
       ],
       [
        87.4,
        82.7
       ]
      ],
      "style": "slanted",
      "height": 1.4,
      "src": "user 2026-10-15: 'wooden slat fence made out of sticky trees or sharp' = a Lappish pole fence (riukuaita: poles leaning along the line between post pairs, tips sticking up). Line traced on the camera-matched drone frame (ground points back-projected, shifted 1.9 m north by the bias the garage door's feet show): from the snowmobile yard north-east of the garage to a short return in front of its north-east door; the far end leaves the frame (confirm). 2026-10-16, user: the last few metres by the garage door removed (the short return and 3 m of the run)"
     }
    ]
   },
   "_rc": "user 2026-10-16: go live (after trimming the fence end and dimming the inside)"
  },
  "service-shed": {
   "model": "compound",
   "src": "User feedback 2026-10-15 (refs/user/feedback-round8/service-buildings): the second, non-L building next to the garage = MML footprint 2279637166 (4.0 x 7.8 m). Its north-east end reaches about 2 m beyond the 2024 survey outline: the Google satellite puts that end 2.9 m further north-east, and the camera-matched drone frame 1.9 m (its feet are hidden by about 1 m of snow, as the garage door's feet are), where its roof hides the garage gable's east corner as in the photo; drawn 9.8 m long, walls 3.5 m. Its whole north-west side stands open ('you can see the side right open'), the north-east end is closed with one window; low gable roof with its ridge along the long side (no gable triangle shows under the snow on the north-east end)",
   "confirm": true,
   "_confirm": "its length (the survey outline is 7.8 m, the newer images show about 9.8 m) and wall height; whether the open side has a post in the middle; the south-east side (no photo)",
   "params": {
    "parts": [
     {
      "id": "shed",
      "pts": [
       [
        82.3,
        95.8
       ],
       [
        89.21,
        88.89
       ],
       [
        92.11,
        91.69
       ],
       [
        85.2,
        98.7
       ]
      ],
      "wallH": 3.5,
      "roof": {
       "type": "gable",
       "pitch": 0.2,
       "overhang": 0.5,
       "gables": [
        1,
        3
       ]
      },
      "openings": [
       {
        "edge": 0,
        "from": 0.4,
        "to": 4.85,
        "kind": "bay",
        "head": 3.1,
        "frame": "white",
        "src": "open north-west side (drone frame)"
       },
       {
        "edge": 0,
        "from": 5.05,
        "to": 9.45,
        "kind": "bay",
        "head": 3.1,
        "frame": "white",
        "src": "open north-west side (drone frame)"
       },
       {
        "edge": 1,
        "at": 2.5,
        "w": 0.9,
        "sill": 1.7,
        "head": 2.6,
        "frame": "white",
        "src": "one window in the closed north-east end (drone frame)"
       }
      ],
      "inside": {
       "lit": false
      }
     }
    ]
   },
   "_rc": "user 2026-10-16: go live (after trimming the fence end and dimming the inside)"
  },
  "horse-shelter": {
   "model": "gltf",
   "params": {
    "url": "models/landmarks/horse-shelter.glb"
   },
   "fallback": {
    "model": "cottage",
    "params": {
     "wallH": 2.8,
     "roof": "flat",
     "door": false,
     "windows": false,
     "light": false
    }
   },
   "confirm": true,
   "src": "VIS-234: client Studio note 'Loose housing for horses, \"pihatto\"' + photos refs/notes/horse-pihatto/ast_jxx05b071adf9g22.webp (P1: front, NE end) and ast_n4864bccrsncknez.webp (P2). Blender GLB tools/blender/landmarks/horse_shelter.py: roof outline = MML footprint 2279637149 (6.1 x 4.0), walls and heights from a camera solve of P1. Doorways +z = SE (bearing 139.5, into the paddock) from P1/P2 (staff-house-2 in line on the left) and the client's own paddock fence; her Fine-tune turn of 180 deg on this footprint (made on the old generic cottage) was taken out so the doorways face the paddock as photographed (confirm with the client). Unphotographed rear and SW walls plain. approved by the owner 2026-10-21 ('Everything looks super good. now place them into production'), VIS-234 before/after review"
  },
  "recycling": {
   "model": "gltf",
   "params": {
    "url": "models/landmarks/recycling.glb"
   },
   "fallback": {
    "model": "cottage",
    "params": {
     "wallH": 2.1,
     "windows": false,
     "light": false
    }
   },
   "confirm": true,
   "src": "VIS-234: client photos refs/notes/recycling/ast_avtrx8zftbbv7364, ast_b9ppahetybnpz0r0, ast_qndyy1q7408xkk68 (autumn 2026): closed board-clad waste shed, single-slope roof high over the door, one door 0.8 x 2.0 m, insect hotel right of it, lit '< 28-14' lightbox on the west wall pointing north to rooms 14-28; no windows, no bins visible. Roof outline = MML 3000262430 (2.9 x 2.9 m), walls 1.95 x 2.0 m, 2.1 / 1.5 m high (board counts). Door = frame -x: with the client's Fine-tune turn (-103.5 deg) it faces ~350 (NNW, to the gravel track), as the photos' backgrounds show. Blender GLB tools/blender/landmarks/recycling.py. approved by the owner 2026-10-21 ('Everything looks super good. now place them into production'), VIS-234 before/after review"
  },
  "electrical-building": {
   "model": "gltf",
   "params": {
    "url": "models/landmarks/electrical-building.glb"
   },
   "fallback": {
    "model": "cottage",
    "params": {
     "wallH": 3.8,
     "roof": "flat",
     "windows": false,
     "door": false,
     "light": false
    }
   },
   "confirm": true,
   "src": "VIS-234: client photos refs/notes/electrical/ast_c5kx1y3vnmk97n4b (door end), ast_tnarsgep1wy1s0ad (door end + high wall, info board), ast_n6r5b507gh5gr93s (low side); Blender GLB tools/blender/landmarks/electrical_building.py. Scale from 0.145 m cladding boards + MML footprint 3000262429 (7.7 x 4.3 roof outline, survey 2025-10-20). Door end = +x; with the client's Fine-tune turn 180 on mtk-3000262429 the door faces bearing 148.5 (SSE, gift-shop yard / parking), from photo S's open-sand foreground + refs/user/feedback-round5/06-parking. Back end unphotographed (plain wall); lamp at night unconfirmed. approved by the owner 2026-10-21 ('Everything looks super good. now place them into production'), VIS-234 before/after review"
  },
  "service-hut": {
   "model": "gltf",
   "frameBearing": 243,
   "_frameBearing": "door (local +x) faces bearing 243 (WSW); the sign wall (-z) faces 153 (SSE), towards the service road ~6 m away; from the sign arrows (towards cabins 14-28 and the road junction) and the long side along the survey long axis; no photo with a compass",
   "params": {
    "url": "models/landmarks/pump-house.glb"
   },
   "fallback": {
    "model": "cottage",
    "params": {
     "wallH": 2.3,
     "windows": false
    }
   },
   "confirm": true,
   "src": "VIS-234: client Studio note 'reference photos, Pump-house' pinned on service-hut: refs/notes/pump-house/ast_4z199cqp8aphjvfq.webp (door face, sign wall), ast_6h3an22npnsbhjc6.webp (sign wall, cabinet, roof vent); Blender GLB tools/blender/landmarks/pump_house.py, sizes scaled from the door (~0.79 x 2.08 m); MML footprint 3000262426 gives the position. approved by the owner 2026-10-21 ('Everything looks super good. now place them into production'), VIS-234 before/after review"
  },
  "wood-shed": {
   "model": "gltf",
   "params": {
    "url": "models/landmarks/wood-shed.glb"
   },
   "fallback": {
    "model": "cottage",
    "params": {
     "wallH": 2.0,
     "windows": false,
     "door": false
    }
   },
   "confirm": true,
   "src": "VIS-234: client Studio note 'wood-shed', 3 photos (refs/notes/wood-shed/ast_9p6kb9qch1qmdepk.webp long side, ast_kw8t5ywj1mxxkej2.webp gable end): open post-and-beam firewood shed, 9 x 4 bays, stacked split wood, open gables with tie beam and king post, dark grey corrugated metal gable roof ~25 deg, ridge ~3.2 m. Size = MML footprint 1832019776 (7.4 x 4.5 m); heights from the leaning Euro pallet. confirm: the footprint assignment is a guess; which end faces the yard; far side not photographed. The photos also show a second, mono-pitch wood shed not on the map. Blender GLB tools/blender/landmarks/wood_shed.py. approved by the owner 2026-10-21 ('Everything looks super good. now place them into production'), VIS-234 before/after review"
  }
 },
 "props": [
  {
   "key": "sleigh-sauna",
   "model": "gltf",
   "_rc": "VIS-99: moved to the river with its deck and ice hole, approved by the user 2026-10-16 ('the ice hole and birch look right')",
   "pos": [-106.3, 64.2],
   "rot": 176,
   "params": {
    "url": "models/landmarks/sleigh-sauna.glb",
    "offset": [-0.65, 0, 0],
    "smoke": [[0.34, 3.55, 0.35]],
    "_smoke": "top of the stainless flue (Blender build CHIM, cap at 3.55 m), as on the footprint version"
   },
   "smoke": 0.5,
   "_smokeStrength": "a light wisp from the wood stove (user 2026-10-14: 'slight smoke come out of its pipe')",
   "confirm": true,
   "src": "Client moved the sled (user 2026-10-15, the client's marked screenshot of the live map: grey outline = the sled, blue = the ice hole, grey stroke = the stairs to it, red = not known yet). The screenshot was georeferenced by fitting the map camera to 8 known points (wood shed, wood sauna, log bridge, cabins 6-10; residual under 3 px): the sled outline lands at about (-107, 65), on the north edge of the riverside path (2024 ortho: sandy path z 64-72 at x -110, trees north of it). Placed at the tree side of the path, not in its middle (user: 'at the inner side where the trees are ... not in the middle of that parking path'). rot 176: door side (model -z) faces the river channel, about square to the bank (bank bearing ~94 deg; user: 'the front is pointing towards the river'); the client's outline is drawn long along the river. A free prop now: the MML footprint 3000262427 is the old parking spot (unassigned in assignments.json and hidden by scope.exclude). confirm: which end the drawbar points to (built: west, which puts the door east of the middle) and the exact spot along the path. Model: see the VIS-80 notes in tools/blender/landmarks/sleigh_sauna.py. x -106.3 (was -108): the user 2026-10-16, the birch beside the deck stands on the deck's left (west, for a viewer facing the river); that birch is the surveyed tree at (-109.0, 70.5) (vegetation, lidar height), so the sled, deck and hole line moved east to put it there"
  },
  {
   "model": "terrace",
   "_rc": "VIS-99: moved to the river with its deck and ice hole, approved by the user 2026-10-16 ('the ice hole and birch look right')",
   "pos": [-106.3, 74.8],
   "rot": 0,
   "clear": -1.6,
   "shadow": false,
   "_shadow": "no generic 9.5 m contact-shadow square under the deck and the hole (the deck's posts cast their own shadow)",
   "_clear": "the default tree clearing round a terrace prop is 11 m square and took the surveyed birch at (-109.0, 70.5) that stands at the deck's west side (user 2026-10-16); -1.6 keeps it to the hole and the deck's river half",
   "confirm": true,
   "src": "User 2026-10-15 (client's marked screenshot + the user's reading of it): in front of the sleigh sauna, on one line with it seen from above, a small deck on short posts at the river bank (the red mark), then the ice hole (blue) with pool-style steps (the grey stroke) going from the deck straight down into the water; no stairs on the bank. The hole sits in the north arm of the oxbow (scene water polygon z 72.4-78.4 at x -108; 2024 ortho channel z 75-82), its centre on the sled's x. Moved to x -106.3 and 1.4 m north on 2026-10-16 so the surveyed birch (-109.0, 70.5) stands at the deck's west side (user: 'that one birch tree is ... on the left side of the deck'). Kept open by a circulating pump in winter (user: 'they usually have circulating water in winter with the pump'), so drawn as open water. Shape (client via the user, 2026-10-16): 'a little bit more natural shaped ... no pool or anything ... just ice cut into a little bit more of an organic shape ... the ice is usually rather thick'. confirm: deck size, hole size, which side of the hole the steps are on",
   "params": {
    "terrace": {
     "decks": [
      {
       "poly": [[-2.0, -4.2], [2.0, -4.2], [2.0, -1.2], [-2.0, -1.2]],
       "top": 0.9,
       "src": "the red mark: a deck on short posts at the bank edge between the path and the hole (user 2026-10-15: 'like a deck that sits on top of tiny poles'). About 4 x 3 m, from the marking's size against the sled outline (drawn ~2.7x too large, scaled alike); top level with the bank (ground at its north edge, 0.9 m above the river surface here), its river half on posts over the water's edge. Size estimated, confirm"
      }
     ],
     "iceHoles": [
      {
       "pos": [0, 0],
       "r": 0.95,
       "ladder": true,
       "ladderAt": -0.62,
       "ladderTop": 0.9,
       "ice": { "t": 0.45, "seed": 7, "rough": 0.2, "stretch": 1.3, "lip": 0.7, "lift": 0.1, "freeboard": 0.08, "_src": "client 2026-10-16: a natural, organic hole cut in thick ice, not a pool. Outline seeded and stretched 1.3x along the river; 0.45 m ice (typical for a Lapland river in mid-winter; confirm), the cut edge 0.08 m above the water and the snow on the ice falling 0.7 m from it to the river surface; no thin-ice ring in the water mask (thick ice)" },
       "src": "the blue mark, right in front of the deck; the grey stroke = pool-style steps from the deck edge down into the water (user 2026-10-15: 'the stairs are just in the water ... like normal pool stairs'): the kit's two-rail steel ladder on the deck side, its rails bending onto the deck (ladderTop = deck top). About 2.5 x 1.5 m (long along the river) estimated from the marking, confirm",
       "seasons": ["winter"],
       "_seasons": "an ice hole is winter only; in summer the river is open (confirm: a summer ladder or jetty?)"
      }
     ]
    }
   }
  },
  {
   "key": "gifts",
   "model": "gltf",
   "params": {
    "url": "models/landmarks/gifts.glb"
   },
   "pos": [
    62.7,
    21.2
   ],
   "rot": -69,
   "clear": 1,
   "confirm": true,
   "src": "VIS-234: Blender GLB tools/blender/landmarks/gifts.py from the client's Studio note photos notes/gifts/ast_83pb1h374hmvzzej, ast_72vkyev8z0pmagmc, ast_9hv4x068g4c2ksap (2026) + user/12.webp (winter: roof snow). Frame +x = LIVVA-sign gable, +z = front (main door, steps): rot -69 = front bearing 249 (WSW), sign gable 159 (SSE), as WS-24. Size 6.4 x 4.2 m (client 2026-10-12); floor 0.6 m, eave 2.95 m, pitch 0.5 from the doors and risers (confirm). Position unchanged from WS-24 (satellite fit, residual <= 1.1 m); the note pin lies ~3 m past the sign gable and is read as marking the place. Doors now dark (2026 photos). approved by the owner 2026-10-21 ('Everything looks super good. now place them into production'), VIS-234 before/after review"
  },
  {
   "key": "wood-sauna",
   "model": "barrelSauna",
   "pos": [
    -174.5,
    78.3
   ],
   "rot": 270,
   "smoke": true,
   "confirm": true,
   "src": "Round 6 (user 2026-10-12: 'entrance on the wrong side, flip 180'; position 'almost correct'). Frame: door end +z, +x = river side. rot 270 = door end WEST, facing the path the guests walk in on (path walk-up DJI_..0129: lantern log fence on the river side of the path leads to the door, river on the right walking east), barrel parallel to the channel, deck on the river side, hill + path on the north. 2026-01-23 clips (CONTENT/RAW FOOTAGE OURS/2026 - JANUARY/OSMO/BARREL SAUNA, DJI_..0129 path walk-up + DJI_..0132 from the ice) and 2026 'Barrel Sauna - 18..21' (same setup as refs/user/10.png). Earlier rot 90 put the door at the east end (round-4b reading of user/10.png took the deck end for the door end).",
   "params": {
    "base": 0.6,
    "len": 3.4,
    "shell": "wood",
    "chimneyZ": -0.8,
    "roof": true,
    "src": "black roofing over the crown, stove pipe in the rear half (2026 river view: pipe ~3/4 along from the door end; 2025 summer clips 16-18). base 0.6 at pos z 78.3 (1.5 m south of round 4; the 2024 ortho shows the deck structures south of the path): deck at path level, ~1.6 m above the ice like the 2026 river view, and the barrel and deck clear the bank behind (round 6: 'cropped into the ground' at base 0.1); shell 'wood': dark stained barrel (2026 clips)",
    "backWindow": {
     "w": 0.32,
     "h": 0.32,
     "y": 1.45,
     "confirm": true,
     "src": "user 2026-10-12: 'on the back side there should be a tiny window, I think'; the rear (east) end is not seen in the 2025/2026 refs: size and height assumed, confirm"
    },
    "sign": false,
    "_sign": "owner 2026-11-05: 'remove also the sign from the front of the barrel sauna entrance' (the board beside the door)",
    "terrace": {
     "decks": [
      {
       "poly": [[-1, -2.3], [3, -2.3], [3, 2.6], [-1, 2.6]],
       "top": 0.6,
       "src": "one deck at path level: under the barrel, ~1.8 m in front of it on the river side (table + chairs, firewood rack), ~0.7 m past the rear end and ~0.9 m landing in front of the door; posts down the bank (2026 river view: deck front 300-670 px vs barrel 365-620 px = 3.4 m). The owner's top-down drawing of 2026-11-05 on the map (red guide lines; georeferenced against the deck corners, the old stairs and the old hole in the same screenshot, ~70 px/m, with the camera's height parallax for the lower parts; +-0.5 m) keeps its outline"
      },
      {
       "poly": [[0.95, 4.9], [1.85, 4.9], [1.85, 5.9], [0.95, 5.9]],
       "top": 0.15,
       "src": "the stairs' landing where they turn towards the river (owner's top-down drawing of 2026-11-05 on the map (red guide lines; georeferenced against the deck corners, the old stairs and the old hole in the same screenshot, ~70 px/m, with the camera's height parallax for the lower parts; +-0.5 m); the 2026 river view and the two winter photos the owner sent on 2026-11-05: an upper flight along the bank, a landing, a lower flight down to the ice). Height between the deck and the ice (the 3 m DEM smooths this bank: it is buried a little at its uphill corner), confirm"
      },
      {
       "poly": [[3.45, 4.95], [7.5, 4.95], [7.5, 5.85], [3.45, 5.85]],
       "top": -0.75,
       "t": 0.08,
       "seasons": ["winter"],
       "_seasons": "planks laid on the river ice in winter (the two winter photos the owner sent on 2026-11-05); confirm: a summer jetty?",
       "src": "plank walkway on the ice from the stairs' foot out to the ladder (owner's top-down drawing of 2026-11-05 on the map (red guide lines; georeferenced against the deck corners, the old stairs and the old hole in the same screenshot, ~70 px/m, with the camera's height parallax for the lower parts; +-0.5 m); winter photos: planks at ice level, no railing). Drawn ~3 m long; it reaches 1 m further out than drawn so the opening lies on the river's flat ice (the DEM puts the drawn spot on the bank slope)"
      }
     ],
     "rails": [
      {
       "pts": [[3, -2.3], [3, 2.6], [1.85, 2.6]],
       "base": 0.6,
       "src": "railing along the whole river side and along the door end up to the stairs (owner's top-down drawing of 2026-11-05 on the map (red guide lines; georeferenced against the deck corners, the old stairs and the old hole in the same screenshot, ~70 px/m, with the camera's height parallax for the lower parts; +-0.5 m)); no railing at the rear end (the owner crossed it out)"
      },
      {
       "pts": [[0.95, 4.9], [0.95, 5.9], [1.85, 5.9]],
       "base": 0.15,
       "src": "railing round the landing's outer sides (the two winter photos the owner sent on 2026-11-05: rails along both flights and the landing)"
      },
      {
       "pts": [[-0.9, 3.9], [-0.9, 6.5], [-0.9, 9.3]],
       "follow": true,
       "base": 0,
       "lanterns": 6,
       "src": "lantern log fence along the path, straight along the bank above the stairs, ending 1.3 m short of the deck: the gap is the way in from the path to the deck (owner 2026-11-05, on the map: 'almost it looks like there is no entrance ... the gap between the fence and the opening where you can walk to the barrel sauna area'; owner's top-down drawing of 2026-11-05 on the map (red guide lines; georeferenced against the deck corners, the old stairs and the old hole in the same screenshot, ~70 px/m, with the camera's height parallax for the lower parts; +-0.5 m): the long line on the left; the two winter photos the owner sent on 2026-11-05: the lanterns run above the upper flight). 6 lanterns (user/10.png: 5-6)"
      }
     ],
     "stairs": [
      {
       "from": [1.4, 2.6],
       "to": [1.4, 4.9],
       "w": 0.9,
       "top": 0.6,
       "bottom": 0.15,
       "src": "upper flight: off the door-end edge of the deck, down along the bank to the landing (owner's top-down drawing of 2026-11-05 on the map (red guide lines; georeferenced against the deck corners, the old stairs and the old hole in the same screenshot, ~70 px/m, with the camera's height parallax for the lower parts; +-0.5 m)); handrails both sides (winter photos)"
      },
      {
       "from": [1.85, 5.4],
       "to": [3.45, 5.4],
       "w": 0.9,
       "top": 0.15,
       "bottom": -0.75,
       "src": "lower flight: from the landing down towards the river onto the plank walkway on the ice (owner's top-down drawing of 2026-11-05 on the map (red guide lines; georeferenced against the deck corners, the old stairs and the old hole in the same screenshot, ~70 px/m, with the camera's height parallax for the lower parts; +-0.5 m)); handrails both sides (winter photos)"
      }
     ],
     "iceHoles": [
      {
       "pos": [7.0, 7.5],
       "r": 1.5,
       "ladder": true,
       "ladderAt": -1.25,
       "ladderTop": 0.9,
       "level": -0.86,
       "ice": { "t": 0.45, "seed": 16, "rough": 0.24, "stretch": 0.8, "lip": 0.6, "lift": 0.1, "freeboard": 0.08, "_src": "the open water a pump keeps free in front of the walkway (owner 2026-11-05: 'not a manmade round circular pool but rather organic shape'; on the map: 'make the pool like we did for the one in front of the sled sauna'): the sleigh sauna's cut in thick river ice (VIS-99), larger and longer, from the owner's drawing: about 2.6 x 3.9 m, long out from the ladder along the river (stretch 0.8 along the frame's z), irregular (rough 0.24; seed 16 puts the edge under the walkway's end, at the ladder). On the river's flat ice (3 m DEM), cut edge level with the walkway" },
       "src": "two-rail steel ladder at the end of the plank walkway, down into the open water (owner's top-down drawing of 2026-11-05: the two marks below the walkway's end; the two winter photos the owner sent on 2026-11-05); the rails bend back over the planks",
       "seasons": ["winter"],
       "_seasons": "WS-35: content.json wood-sauna 'All year (ice hole in winter only)' (client). confirm: is the ladder used for a summer swim?"
      }
     ]
    }
   }
  },
  {
   "key": "laavu",
   "model": "laavu",
   "pos": [
    -42,
    168
   ],
   "rot": 180,
   "smoke": true,
   "confirm": true,
   "src": "WS-25 (round 5): refs/user/feedback-round5/01-laavu (front + left side): open gable front with two carved posts, log side and back walls, benches, woodpile back right, low log wing walls in front of the side bays, fire ring centred in front of the opening. Orientation kept: the open front now faces where the old box's tall wall faced, i.e. north (user: it faces the right way; the fire was behind it). The new model opens to local +z, so rot 180 = opening to the north. Client 2026-10-12: opening faces NORTH (confirmed) and the model's ~5.6 x 3.4 m size is about right (confirmed)",
   "params": {},
   "_rc": "round-5 go-live: WS-25 laavu approved by the user 2026-10-12"
  },
  {
   "_block": "Landmarks 2026-10-11 (Blender-built GLBs, tools/blender/build_landmarks.py; spec resorts-src/aurora-village/manual/landmarks.json). Approved by the user 2026-10-12 (live in the default view).",
   "key": "entrance-gate",
   "model": "gltf",
   "params": { "url": "models/landmarks/entrance-gate.glb", "glow": { "gain": 3.0, "color": "#ff4a1f", "_src": "gate driving to the resort.png / gate ans sign together.png: strong red-orange uplight on both posts" } },
   "pos": [213.0, 27.0],
   "rot": 92.5,
   "confirm": true,
   "src": "Position: refs/user/'ref for swing and gate and sign.png' (Google satellite, newer than the 2024 MML ortho, which predates the gate) georeferenced on 5 surveyed buildings (stable, yurt, 2 barns, trailer; residual ~2-3 m); the posts' shadow line crosses the road at screenshot x 1422. Beam across Aurorakuja; front (AURORA VILLAGE) faces arriving traffic from the east, rot 92.5 = perpendicular to the OSM road axis (177.5 deg). Model v2 (2026-10-12): camera-matched to 4 photos (gate driving to the resort.png, Gate driving away from resort.png, gate ans sign together.png, gate and sign drone.png) in resorts-src/aurora-village/manual/landmarks/entrance-gate.solve.json (tools/landmarks/solve_photo_points_ext.py; core reprojection median 1.3 px / rms 2.2 px at 1200 px); the solve keeps pos/rot (the solved reindeer wall lands within 1.5 m and 1 deg of its georeferenced shadow). Size: post spacing 7.0 m (+-0.5, walker in the drone photo = 1.76 m), beam underside 4.97 m, beam 10.7 m incl. root plate, sign 3.37 m wide. Built by tools/blender/landmarks/entrance_gate.py (.blend in manual/landmarks/blender/)"
  },
  {
   "key": "reindeer-sign",
   "model": "gltf",
   "params": { "url": "models/landmarks/reindeer-sign.glb", "glow": { "gain": 4.0, "color": "#ff7a2a", "_src": "sign front.png / gate ans sign together.png: planks washed bright orange from the ground, black reindeer against them" } },
   "pos": [232.79, 17.52],
   "rot": 16.9,
   "clear": 6,
   "_clear": "the wall is 10.1 m long: 6 m from the centre clears both kelo ends; the photos show open snow round the sign and trees only behind it",
   "confirm": true,
   "src": "v2 (2026-10-12): modelled in Blender from a camera-matched solve of 'sign front.png', 'gate ans sign together.png' and 'gate and sign drone.png' (tools/landmarks/solve_photo_points_ext.py, manual/landmarks/reindeer-sign.points.json + .solve.json; max reprojection 3.9 px, median 0.5 px in a 1200-px frame), built by tools/blender/landmarks/reindeer_sign.py. Model: x = plank wall axis (+x = big bull end), origin 0.54 m in front of the wall, between the wall and the steel rail; y = 0 = the snow the rail stands on. Size: plank wall 10.1 m end to end (satellite band 10.4 m incl. shadow, 0.369 m/px; v1's 11.8 m used an assumed zoom-17 scale), fells 1.80 / 1.84 m, saddle 1.22 m; steel rail 9.6 m, 0.13-0.75 m in front of the wall (4 deg to it). Scale check: steel animals at real reindeer size (bull ~1.05 m, walking adult 0.87 m, calf 0.53 m at the withers). Position: refs/user/'ref for swing and gate and sign.png' re-georeferenced on 4 surveyed buildings (yurt, horse stable, roof shelter, red-roof shed; scale 0.369 m/px, residual 0.6-2.2 m; OSM roads and the cabin rows land on the image): wall line centre (232.6, 17.0), 5.5 m north of the road's north edge (as in the MML 2024 ortho); pos = that centre + 0.54 m towards the road; rot 16.9 = the band's bearing, reindeer side (+z) facing the road (the band is mostly shadow: +-0.5 m across). confirm: wall length and the big bull's shoulder height (one tape measure rescales the model: WALL_M)"
  },
  {
   "key": "aurora-swing",
   "model": "gltf",
   "params": { "url": "models/landmarks/aurora-swing.glb" },
   "pos": [-1.75, 74.65],
   "rot": 165,
   "clear": 9,
   "blend": "resorts-src/aurora-village/manual/landmarks/blender/aurora-swing.blend",
   "_clear": "swing front.jpg: open sky and the river valley behind the swing, no trees within ~10 m on the bank",
   "confirm": true,
   "src": "v2 (2026-10-11): modelled in Blender from a camera-matched solve of 'swing front.jpg', 'swing angle.jpg' and 'swing back.png' (tools/landmarks/solve_photo_points.py; manual/landmarks/aurora-swing.points.json; post spacing 3.9 m from the satellite shadow, checked by the seated person ~0.97 m). Model origin = midway between the post bases. Position: same georeferenced screenshot (circle 'S'), fitted on 5 surveyed cabins nearby (residual 0.5 m): the H-shaped shadow (posts + beam, sun from the SSE) puts the post bases at about (-3.6, 75.4) and (0.1, 73.9); beam bearing from the beam shadow. rot 165: thermometer and lit text face north (the resort), the swing looks south over the river, thermometer on the east side, as in 'swing front.jpg' (river behind) and 'swing back.png' (resort behind, thermometer on the right)"
  },
  {
   "_ws21": "WS-21 (2026-10-12): stairs from the swing down to the river + bottom platform",
   "model": "terrace",
   "pos": [0.7, 78.0],
   "rot": 0,
   "params": { "terrace": {
    "stairs": [
     {"from": [0.0, 0.0], "to": [-6.2, 9.8], "w": 1.2, "top": 0.8, "bottom": -4.67, "_top": "starts at the swing level (photo 28 and swing front.jpg: the top rails stand at the crest beside the thermometer post); the 2 m DEM already slopes here"},
     {"from": [-6.2, 9.8], "to": [-8.2, 15.8], "w": 1.2, "top": -4.67, "bottom": -5.65},
     {"from": [-8.2, 15.8], "to": [-11.5, 21.1], "w": 1.2, "top": -5.65, "bottom": -5.84}
    ],
    "decks": [ {"poly": [[-17.2, 20.6], [-15.0, 18.8], [-9.8, 22.2], [-11.9, 24.9]], "top": -5.84, "t": 0.12, "snow": true, "confirm": true, "_snow": "the cited source does not say snow lies on this platform: ask the client"} ]
   } },
   "confirm": true,
   "src": "Traced on the user's recent top-down satellite crop refs/user/feedback-round4e/29-swing-area-topdown-recent.png (user 2026-10-12: 'stairs going down with a platform at the bottom'), georeferenced with a similarity fit on the swing (midpoint of the post bases) and the N corner of MML 2117121788 (0.228 m/px, rot -2.7 deg; check: the footprint edges and the water outline land on the image; trace + fit in resorts-src/aurora-village/manual/landmarks/aurora-swing-area.json). Stair line: from the hatched top landing just SE of the swing's thermometer post, SSW down the bank to the platform's NE edge (22.6 m, 5.8 m drop on the MML 2 m DEM); three flights that follow the DEM, rise 0.18 m. Platform: the light deck at the waterline, 6.2 x 2.8 m, long side along the shore (bearing 123 deg); top 0.4 m above the DEM water level. Photo 28 (dusk, refs/user/feedback-round4e/28-swing-open-view-stairs-no-trees.webp) shows the top flight with handrails on both sides, left of the thermometer. Width 1.2 m, flight breaks, platform height and railings on the platform are estimates: confirm"
  },
  {
   "id": "car-1",
   "model": "car",
   "params": {
    "type": "electric",
    "color": "white"
   },
   "pos": [
    84.08,
    19.0
   ],
   "rot": 180,
   "confirm": true,
   "src": "Parked cars (engine model \"car\", web/js/lazy/cars.js): a detail, not surveyed. Owner 2026-10-20: \"add a few cars to the parking lots, side by side on one side; I will move them to the right place myself\" (Fine-tune > Buildings, \"Car n\"). Placed nose-in in one row along the lot's west edge (paint[kind=parking]), 2.6 m apart, one gap left free; types and colours a plausible mix, not observed; upmarket types since VIS-229 (owner 2026-10-21: \"These look a lot better now\")"
  },
  {
   "id": "snowmobile-1",
   "model": "snowmobile",
   "pos": [
    86.87,
    81.37
   ],
   "rot": 46.4,
   "seasons": [
    "winter"
   ],
   "confirm": true,
   "src": "Parked snowmobiles (engine model \"snowmobile\", web/js/lazy/snowmobile.js; the tours' shared snowmobile from the owner's photos of the resort's Lynx touring sleds): owner 2026-10-24: 'behind the safari house and next to the service building and the short fence, add 10 snowmobiles parked', then 'place the 10 snowmobiles alongside the fence ... two rows of five. They should be after each other, not next to each other'. Two lines of five nose to tail along the riukuaita fence by the garage (resort.json buildings.service-building fences[0], 87.4,82.7 -> 97.4,72.2), on its trail side (1.3 and 2.8 m off the fence; the trail's out lane ~5 m off), noses north-east the way the trail leaves. Not observed (winter only): confirm"
  },
  {
   "id": "snowmobile-2",
   "model": "snowmobile",
   "pos": [
    89.39,
    78.73
   ],
   "rot": 47.4,
   "seasons": [
    "winter"
   ],
   "confirm": true,
   "src": "Parked snowmobiles (engine model \"snowmobile\", web/js/lazy/snowmobile.js; the tours' shared snowmobile from the owner's photos of the resort's Lynx touring sleds): owner 2026-10-24: 'behind the safari house and next to the service building and the short fence, add 10 snowmobiles parked', then 'place the 10 snowmobiles alongside the fence ... two rows of five. They should be after each other, not next to each other'. Two lines of five nose to tail along the riukuaita fence by the garage (resort.json buildings.service-building fences[0], 87.4,82.7 -> 97.4,72.2), on its trail side (1.3 and 2.8 m off the fence; the trail's out lane ~5 m off), noses north-east the way the trail leaves. Not observed (winter only): confirm"
  },
  {
   "id": "snowmobile-3",
   "model": "snowmobile",
   "pos": [
    91.91,
    76.08
   ],
   "rot": 45.4,
   "seasons": [
    "winter"
   ],
   "confirm": true,
   "src": "Parked snowmobiles (engine model \"snowmobile\", web/js/lazy/snowmobile.js; the tours' shared snowmobile from the owner's photos of the resort's Lynx touring sleds): owner 2026-10-24: 'behind the safari house and next to the service building and the short fence, add 10 snowmobiles parked', then 'place the 10 snowmobiles alongside the fence ... two rows of five. They should be after each other, not next to each other'. Two lines of five nose to tail along the riukuaita fence by the garage (resort.json buildings.service-building fences[0], 87.4,82.7 -> 97.4,72.2), on its trail side (1.3 and 2.8 m off the fence; the trail's out lane ~5 m off), noses north-east the way the trail leaves. Not observed (winter only): confirm"
  },
  {
   "id": "snowmobile-4",
   "model": "snowmobile",
   "pos": [
    94.42,
    73.44
   ],
   "rot": 46.9,
   "seasons": [
    "winter"
   ],
   "confirm": true,
   "src": "Parked snowmobiles (engine model \"snowmobile\", web/js/lazy/snowmobile.js; the tours' shared snowmobile from the owner's photos of the resort's Lynx touring sleds): owner 2026-10-24: 'behind the safari house and next to the service building and the short fence, add 10 snowmobiles parked', then 'place the 10 snowmobiles alongside the fence ... two rows of five. They should be after each other, not next to each other'. Two lines of five nose to tail along the riukuaita fence by the garage (resort.json buildings.service-building fences[0], 87.4,82.7 -> 97.4,72.2), on its trail side (1.3 and 2.8 m off the fence; the trail's out lane ~5 m off), noses north-east the way the trail leaves. Not observed (winter only): confirm"
  },
  {
   "id": "snowmobile-5",
   "model": "snowmobile",
   "pos": [
    96.94,
    70.8
   ],
   "rot": 45.9,
   "seasons": [
    "winter"
   ],
   "confirm": true,
   "src": "Parked snowmobiles (engine model \"snowmobile\", web/js/lazy/snowmobile.js; the tours' shared snowmobile from the owner's photos of the resort's Lynx touring sleds): owner 2026-10-24: 'behind the safari house and next to the service building and the short fence, add 10 snowmobiles parked', then 'place the 10 snowmobiles alongside the fence ... two rows of five. They should be after each other, not next to each other'. Two lines of five nose to tail along the riukuaita fence by the garage (resort.json buildings.service-building fences[0], 87.4,82.7 -> 97.4,72.2), on its trail side (1.3 and 2.8 m off the fence; the trail's out lane ~5 m off), noses north-east the way the trail leaves. Not observed (winter only): confirm"
  },
  {
   "id": "snowmobile-6",
   "model": "snowmobile",
   "pos": [
    86.06,
    80.04
   ],
   "rot": 45.4,
   "seasons": [
    "winter"
   ],
   "confirm": true,
   "src": "Parked snowmobiles (engine model \"snowmobile\", web/js/lazy/snowmobile.js; the tours' shared snowmobile from the owner's photos of the resort's Lynx touring sleds): owner 2026-10-24: 'behind the safari house and next to the service building and the short fence, add 10 snowmobiles parked', then 'place the 10 snowmobiles alongside the fence ... two rows of five. They should be after each other, not next to each other'. Two lines of five nose to tail along the riukuaita fence by the garage (resort.json buildings.service-building fences[0], 87.4,82.7 -> 97.4,72.2), on its trail side (1.3 and 2.8 m off the fence; the trail's out lane ~5 m off), noses north-east the way the trail leaves. Not observed (winter only): confirm"
  },
  {
   "id": "snowmobile-7",
   "model": "snowmobile",
   "pos": [
    88.58,
    77.4
   ],
   "rot": 46.9,
   "seasons": [
    "winter"
   ],
   "confirm": true,
   "src": "Parked snowmobiles (engine model \"snowmobile\", web/js/lazy/snowmobile.js; the tours' shared snowmobile from the owner's photos of the resort's Lynx touring sleds): owner 2026-10-24: 'behind the safari house and next to the service building and the short fence, add 10 snowmobiles parked', then 'place the 10 snowmobiles alongside the fence ... two rows of five. They should be after each other, not next to each other'. Two lines of five nose to tail along the riukuaita fence by the garage (resort.json buildings.service-building fences[0], 87.4,82.7 -> 97.4,72.2), on its trail side (1.3 and 2.8 m off the fence; the trail's out lane ~5 m off), noses north-east the way the trail leaves. Not observed (winter only): confirm"
  },
  {
   "id": "snowmobile-8",
   "model": "snowmobile",
   "pos": [
    91.1,
    74.76
   ],
   "rot": 47.4,
   "seasons": [
    "winter"
   ],
   "confirm": true,
   "src": "Parked snowmobiles (engine model \"snowmobile\", web/js/lazy/snowmobile.js; the tours' shared snowmobile from the owner's photos of the resort's Lynx touring sleds): owner 2026-10-24: 'behind the safari house and next to the service building and the short fence, add 10 snowmobiles parked', then 'place the 10 snowmobiles alongside the fence ... two rows of five. They should be after each other, not next to each other'. Two lines of five nose to tail along the riukuaita fence by the garage (resort.json buildings.service-building fences[0], 87.4,82.7 -> 97.4,72.2), on its trail side (1.3 and 2.8 m off the fence; the trail's out lane ~5 m off), noses north-east the way the trail leaves. Not observed (winter only): confirm"
  },
  {
   "id": "snowmobile-9",
   "model": "snowmobile",
   "pos": [
    93.61,
    72.12
   ],
   "rot": 45.9,
   "seasons": [
    "winter"
   ],
   "confirm": true,
   "src": "Parked snowmobiles (engine model \"snowmobile\", web/js/lazy/snowmobile.js; the tours' shared snowmobile from the owner's photos of the resort's Lynx touring sleds): owner 2026-10-24: 'behind the safari house and next to the service building and the short fence, add 10 snowmobiles parked', then 'place the 10 snowmobiles alongside the fence ... two rows of five. They should be after each other, not next to each other'. Two lines of five nose to tail along the riukuaita fence by the garage (resort.json buildings.service-building fences[0], 87.4,82.7 -> 97.4,72.2), on its trail side (1.3 and 2.8 m off the fence; the trail's out lane ~5 m off), noses north-east the way the trail leaves. Not observed (winter only): confirm"
  },
  {
   "id": "snowmobile-10",
   "model": "snowmobile",
   "pos": [
    96.13,
    69.47
   ],
   "rot": 46.4,
   "seasons": [
    "winter"
   ],
   "confirm": true,
   "src": "Parked snowmobiles (engine model \"snowmobile\", web/js/lazy/snowmobile.js; the tours' shared snowmobile from the owner's photos of the resort's Lynx touring sleds): owner 2026-10-24: 'behind the safari house and next to the service building and the short fence, add 10 snowmobiles parked', then 'place the 10 snowmobiles alongside the fence ... two rows of five. They should be after each other, not next to each other'. Two lines of five nose to tail along the riukuaita fence by the garage (resort.json buildings.service-building fences[0], 87.4,82.7 -> 97.4,72.2), on its trail side (1.3 and 2.8 m off the fence; the trail's out lane ~5 m off), noses north-east the way the trail leaves. Not observed (winter only): confirm"
  },
  {
   "id": "car-2",
   "model": "car",
   "params": {
    "type": "grand",
    "color": "black"
   },
   "pos": [
    84.1,
    21.6
   ],
   "rot": 178,
   "confirm": true,
   "src": "Parked cars (engine model \"car\", web/js/lazy/cars.js): a detail, not surveyed. Owner 2026-10-20: \"add a few cars to the parking lots, side by side on one side; I will move them to the right place myself\" (Fine-tune > Buildings, \"Car n\"). Placed nose-in in one row along the lot's west edge (paint[kind=parking]), 2.6 m apart, one gap left free; types and colours a plausible mix, not observed; upmarket types since VIS-229 (owner 2026-10-21: \"These look a lot better now\")"
  },
  {
   "id": "car-3",
   "model": "car",
   "params": {
    "type": "cross",
    "color": "silver"
   },
   "pos": [
    83.6,
    24.2
   ],
   "rot": 181,
   "confirm": true,
   "src": "Parked cars (engine model \"car\", web/js/lazy/cars.js): a detail, not surveyed. Owner 2026-10-20: \"add a few cars to the parking lots, side by side on one side; I will move them to the right place myself\" (Fine-tune > Buildings, \"Car n\"). Placed nose-in in one row along the lot's west edge (paint[kind=parking]), 2.6 m apart, one gap left free; types and colours a plausible mix, not observed; upmarket types since VIS-229 (owner 2026-10-21: \"These look a lot better now\")"
  },
  {
   "id": "car-4",
   "model": "car",
   "params": {
    "type": "shuttle",
    "color": "white"
   },
   "pos": [
    83.71,
    29.4
   ],
   "rot": 179,
   "confirm": true,
   "src": "Parked cars (engine model \"car\", web/js/lazy/cars.js): a detail, not surveyed. Owner 2026-10-20: \"add a few cars to the parking lots, side by side on one side; I will move them to the right place myself\" (Fine-tune > Buildings, \"Car n\"). Placed nose-in in one row along the lot's west edge (paint[kind=parking]), 2.6 m apart, one gap left free; types and colours a plausible mix, not observed; upmarket types since VIS-229 (owner 2026-10-21: \"These look a lot better now\")"
  },
  {
   "id": "car-5",
   "model": "car",
   "params": {
    "type": "electric",
    "color": "grey"
   },
   "pos": [
    83.88,
    32.0
   ],
   "rot": 182,
   "confirm": true,
   "src": "Parked cars (engine model \"car\", web/js/lazy/cars.js): a detail, not surveyed. Owner 2026-10-20: \"add a few cars to the parking lots, side by side on one side; I will move them to the right place myself\" (Fine-tune > Buildings, \"Car n\"). Placed nose-in in one row along the lot's west edge (paint[kind=parking]), 2.6 m apart, one gap left free; types and colours a plausible mix, not observed; upmarket types since VIS-229 (owner 2026-10-21: \"These look a lot better now\")"
  },
  {
   "id": "car-6",
   "model": "car",
   "params": {
    "type": "cross",
    "color": "red"
   },
   "pos": [
    83.61,
    34.6
   ],
   "rot": 177,
   "confirm": true,
   "src": "Parked cars (engine model \"car\", web/js/lazy/cars.js): a detail, not surveyed. Owner 2026-10-20: \"add a few cars to the parking lots, side by side on one side; I will move them to the right place myself\" (Fine-tune > Buildings, \"Car n\"). Placed nose-in in one row along the lot's west edge (paint[kind=parking]), 2.6 m apart, one gap left free; types and colours a plausible mix, not observed; upmarket types since VIS-229 (owner 2026-10-21: \"These look a lot better now\")"
  },
  {
   "id": "car-7",
   "model": "car",
   "params": {
    "type": "grand",
    "color": "blue"
   },
   "pos": [
    83.94,
    37.2
   ],
   "rot": 181,
   "confirm": true,
   "src": "Parked cars (engine model \"car\", web/js/lazy/cars.js): a detail, not surveyed. Owner 2026-10-20: \"add a few cars to the parking lots, side by side on one side; I will move them to the right place myself\" (Fine-tune > Buildings, \"Car n\"). Placed nose-in in one row along the lot's west edge (paint[kind=parking]), 2.6 m apart, one gap left free; types and colours a plausible mix, not observed; upmarket types since VIS-229 (owner 2026-10-21: \"These look a lot better now\")"
  },
  {
   "key": "safari-house",
   "model": "gltf",
   "params": {
    "url": "models/landmarks/safari-house.glb"
   },
   "pos": [
    68.71,
    68.58
   ],
   "rot": -132.6,
   "confirm": true,
   "src": "VIS-234: Blender GLB tools/blender/landmarks/safari_house.py from the client's Studio note photo refs/notes/safari-house/ast_bbgycgs3f4kgy90d.webp (porch set back into the NW face, two doors, sign, eave 3.0 m scaled from the doors) + Screenshots 121420/121505 and Restaurant New - 4 (gable end with three high windows; this block is lower than the Loimu wing). Outline = MML 2117117678 vertices 7-13; replaces the compound part 'safari-house'. Front = porch, bearing 313 (courtyard). SE/SW walls, ridge position and SE eave height unconfirmed. approved by the owner 2026-10-21 ('Everything looks super good. now place them into production'), VIS-234 before/after review"
  },
  {
   "key": "reindeer-gate",
   "model": "gltf",
   "params": {
    "url": "models/landmarks/reindeer-gate.glb"
   },
   "pos": [
    34.8,
    13.2
   ],
   "rot": 90,
   "clear": 4.5,
   "confirm": true,
   "_clear": "the model runs from x -2.6 to +4.1 around its origin; sand on the road side, pines inside from about 4 m",
   "src": "VIS-234: Studio note 'portti tähän' (gate here) + refs/notes/gate-portti (3 photos, 2026-10). Blender GLB from a camera solve (manual/landmarks/reindeer-gate.points.json / .solve.json, 3 views, the lilac sign = A4 sets the scale), tools/blender/landmarks/reindeer_gate.py. Front = bearing 90 (east, the service road; the photos look from the road into the paddock), side gate at the north end; the gate sits in the reindeer paddock fence's east edge (paddocks[reindeer-paddock].fence.gates, draw false). approved by the owner 2026-10-21 ('Everything looks super good. now place them into production'), VIS-234 before/after review"
  },
  {
   "key": "hitching-rack",
   "model": "gltf",
   "params": {
    "url": "models/landmarks/hitching-rack.glb"
   },
   "pos": [
    139.9,
    51.7
   ],
   "rot": 40,
   "clear": 0.5,
   "shadow": false,
   "confirm": true,
   "src": "VIS-234: client Studio note 'Horseback riding departure hitching racks', photo refs/notes/hitching-racks/ast_8ynzgbf4a7ry8dqp.webp (one ground photo, no snow); tools/blender/landmarks/hitching_rack.py from ground-plane distances (level camera, eye 1.6 m; step stool 0.91 m as scale check; +-10 %). Position: the client's pin (139.9, 51.69); front (+z, yard side) bearing 140, from the camera heading fixed on the shed 2117109007 and the parking lot's SE corner. The two pines the left rail is nailed to are 2.5 m stubs in the model. confirm: sizes, rack angle, the right rail's far end. approved by the owner 2026-10-21 ('Everything looks super good. now place them into production'), VIS-234 before/after review"
  },
  {
   "id": "ev-charger-1",
   "model": "gltf",
   "params": {
    "url": "models/landmarks/ev-charger.glb"
   },
   "pos": [
    80.3,
    35.4
   ],
   "rot": 89,
   "clear": 0.5,
   "shadow": false,
   "confirm": true,
   "src": "VIS-234: client note 'photos for ref. 4 electric car charging stations' (refs/notes/parking); one charger GLB tools/blender/landmarks/ev_charger.py (post 1.64 m, wall box, rain cap, concrete foot; scaled from the wall box). west-edge pair at the gravel/grass border, front east into the lot (bearing 91); spacing ~5 m read on ast_7j9gvh1m7rr94qch and ast_13bx384wx7xy30mr; spot +-2 m. approved by the owner 2026-10-21 ('Everything looks super good. now place them into production'), VIS-234 before/after review"
  },
  {
   "id": "ev-charger-2",
   "model": "gltf",
   "params": {
    "url": "models/landmarks/ev-charger.glb"
   },
   "pos": [
    80.2,
    30.4
   ],
   "rot": 89,
   "clear": 0.5,
   "shadow": false,
   "confirm": true,
   "src": "VIS-234: client note 'photos for ref. 4 electric car charging stations' (refs/notes/parking); one charger GLB tools/blender/landmarks/ev_charger.py (post 1.64 m, wall box, rain cap, concrete foot; scaled from the wall box). the northern one of the west pair; 0.76 m clear of the client-moved car-7; spot +-2 m. approved by the owner 2026-10-21 ('Everything looks super good. now place them into production'), VIS-234 before/after review"
  },
  {
   "id": "ev-charger-3",
   "model": "gltf",
   "params": {
    "url": "models/landmarks/ev-charger.glb"
   },
   "pos": [
    95.75,
    32.0
   ],
   "rot": 272,
   "clear": 0.5,
   "shadow": false,
   "confirm": true,
   "src": "VIS-234: client note 'photos for ref. 4 electric car charging stations' (refs/notes/parking); one charger GLB tools/blender/landmarks/ev_charger.py (post 1.64 m, wall box, rain cap, concrete foot; scaled from the wall box). east fence, just inside the lot, front west (bearing 268), the red van charging (ast_fb9kb5jf6vvvkf9f, ast_tjej5x186wbfd6w8); spot +-2 m. approved by the owner 2026-10-21 ('Everything looks super good. now place them into production'), VIS-234 before/after review"
  },
  {
   "id": "ev-charger-4",
   "model": "gltf",
   "params": {
    "url": "models/landmarks/ev-charger.glb"
   },
   "pos": [
    95.95,
    25.5
   ],
   "rot": 272,
   "clear": 0.5,
   "shadow": false,
   "confirm": true,
   "src": "VIS-234: client note 'photos for ref. 4 electric car charging stations' (refs/notes/parking); one charger GLB tools/blender/landmarks/ev_charger.py (post 1.64 m, wall box, rain cap, concrete foot; scaled from the wall box). east fence, ~1.3 fence spans north of ev-charger-3, seen from behind in ast_tjej5x186wbfd6w8 (confirm it is a charger); spot +-2 m. approved by the owner 2026-10-21 ('Everything looks super good. now place them into production'), VIS-234 before/after review"
  },
  {
   "key": "grill-station-walk",
   "model": "boardwalk",
   "pos": [
    107.3,
    50.0
   ],
   "params": {
    "pts": [
     [
      0,
      0
     ],
     [
      6.7,
      2.1
     ]
    ],
    "w": 1.3,
    "rail": false,
    "mat": "woodGrey",
    "lift": 0.25
   },
   "confirm": true,
   "src": "VIS-234: ast_sse6gca7z5mnszwg.webp (client Studio note, grill station): dark plank walk from the grill-station deck's east edge to the Jurtta's railed walkway (bearing ~108); the grill station GLB carries no walkway. approved by the owner 2026-10-21 ('Everything looks super good. now place them into production'), VIS-234 before/after review"
  }
 ],
 "views": {
  "_doc": "WS-12 per-place camera for the card flight: bearing = compass direction from the place to the camera (deg), elevation (deg), distance (m). Generic: main.js select() reads resort.views[key]",
  "ice-karting": { "bearing": 190, "elevation": 48, "distance": 300, "_ws21": "WS-21 (2026-10-12): frames the whole track loop and the huts on its west side (the 70 m pin default showed a washed-out infield patch); chosen from 10 tried views, docs/qa/ws21/karting-try*-sheet.jpg" },
  "reindeer-ride": {
   "bearing": 200,
   "elevation": 38,
   "distance": 140
  },
  "tipi": {
   "bearing": 250,
   "elevation": 22,
   "distance": 34
  }
 },
 "pins": {
  "reindeer-paddock": [
   -44.7,
   15.3
  ],
  "horse-paddock": [
   193,
   133
  ],
  "sleds-bikes": [
   19,
   84
  ],
  "parking": [
   89,
   24
  ],
  "ice-karting": [
   985.0,
   392.0
  ],
  "reindeer-ride": [
   159.6,
   -22.5
  ],
  "canyon-path": [
   -317.4,
   -79.4
  ]
 },
 "paddocks": [
  {
   "id": "reindeer-paddock",
   "polygon": [
    [
     -186.3,
     -34.1
    ],
    [
     -185.2,
     -31.5
    ],
    [
     -181.5,
     -28.0
    ],
    [
     -172.4,
     -22.2
    ],
    [
     -163.9,
     -18.6
    ],
    [
     -156.9,
     -14.8
    ],
    [
     -144.9,
     -10.1
    ],
    [
     -115.2,
     -1.1
    ],
    [
     -108.1,
     1.8
    ],
    [
     -97.0,
     7.9
    ],
    [
     -82.3,
     14.2
    ],
    [
     -56.4,
     24.0
    ],
    [
     -38.3,
     29.6
    ],
    [
     -17.1,
     33.6
    ],
    [
     -11.8,
     33.8
    ],
    [
     -7.1,
     33.3
    ],
    [
     4.5,
     30.1
    ],
    [
     24.4,
     17.9
    ],
    [
     34.56,
     15.89
    ],
    [
     34.34,
     8.96
    ],
    [
     31.9,
     7.3
    ],
    [
     14.3,
     -6.4
    ],
    [
     -2.1,
     -16.7
    ],
    [
     -20.6,
     -25.5
    ],
    [
     -26.6,
     -27.7
    ],
    [
     -131.3,
     -47.3
    ],
    [
     -133.3,
     -47.3
    ],
    [
     -144.5,
     -46.0
    ],
    [
     -154.9,
     -46.2
    ],
    [
     -171.0,
     -44.8
    ],
    [
     -182.2,
     -42.2
    ],
    [
     -185.8,
     -39.3
    ]
   ],
   "animals": {
    "kind": "reindeer",
    "count": 12
   },
   "src": "WS-8 round 4: user-drawn outline (refs/user/feedback-round4/paddock-should-be-red-outline.webp), georeferenced with tools/georef_outline.py on 17 cabin glass fronts (manual/paddock-sketch-points.json; affine rms 0.12 m, worst 0.20 m), stroke centreline smoothed +-2 m and kept 3 m off the service-road centreline (the drawing runs on the road edge; a fence cannot stand on the road); result in manual/paddock-outline-round4.json. Ortho 2024 (0.5 m, summer): no fence line visible under the pines; the north side follows the inner edge of the service road. Replaces road-loop minus 4.2 m (round 3), which put cabins 1-13 inside the fence | approved by the user 2026-10-11 (round 4 review)",
   "confirm": false,
   "fence": {
    "gates": [
     {
      "at": [
       34.45,
       12.42
      ],
      "width": 6.3,
      "draw": false,
      "src": "VIS-234: the reindeer gate (props key reindeer-gate) stands in this opening: 4.7 m double gate + 1.36 m side gate between the kelo end posts; draw false = the fence leaves the opening and the GLB is the gate"
     }
    ]
   },
   "_vis234": "VIS-234: east tip straightened into one edge through the two kelo end posts of the new gate (34.55, 15.59) and (34.34, 9.26), extended 0.3 m past each, so the 6.3 m opening fits (the 1.9 m tip could not hold it). approved by the owner 2026-10-21 ('Everything looks super good. now place them into production'), VIS-234 before/after review"
  },
  {
   "id": "horse-paddock",
   "area": "meadow",
   "animals": {
    "kind": "horse",
    "count": 4
   }
  }
 ],
 "paint": [
  {
   "kind": "parking",
   "polygon": [[95.0, 2.1], [96.3, 2.3], [98.0, 4.4], [96.4, 19.0], [95.9, 36.4], [98.3, 41.2], [96.5, 42.8], [92.5, 42.2], [86.9, 40.0], [81.4, 38.5], [80.6, 36.8], [80.5, 28.9], [80.9, 17.1], [85.0, 12.6], [90.4, 6.3]],
   "confirm": true,
   "src": "WS-24 (round-5 feedback): the user's red outline P on refs/user/feedback-round5/06-parking/'Parking, gift shop, kota.png' (satellite, newer than the 2024 ortho, rotated ~31 deg), georeferenced by a similarity fit on jurtta, kota and cabin-1 (residual <= 1.1 m, 0.149 m/px). Gravel lot, no stall lines visible: none drawn. Entry from the track at its north tip and from the junction at its south end. Was a 44 x 22 m striped rectangle at (82, -3), 20 m north of the real lot"
  }
 ],
 "smokeExtra": [],
 "treeRules": {
  "_doc": "WS-14: tree clearings (schema: skill references/landscape.md). clearAround = clearing radius in m around a place's footprint (build_scene.py; was hard-coded). Runtime 'rules' (live) apply over the baked trees; previews add treeRules.layers.<topic>.",
  "clearAround": {
   "panorama-sauna": 14,
   "main-building": 14,
   "jurtta": 14
  },
  "rules": [
   {
    "paddock": "reindeer-paddock",
    "mode": "mask",
    "mask": {
     "src": "masks/reindeer-paddock-canopy.png",
     "bounds": [
      -193.0,
      -54.0,
      41.0,
      40.0
     ],
     "threshold": 0.5
    },
    "src": "WS-8: ortho 2024 shows pine forest inside the paddock (dense in the west, clumps with open trampled ground in the middle and east). Canopy mask: tools/canopy_mask.py aurora-village --paddock reindeer-paddock --preview paddock --name reindeer-paddock-canopy --dark 120 --window 8 (QA overlay docs/qa/ws8/canopy-mask-overlay.png)"
   },
   {
    "mode": "mask",
    "mask": {
     "src": "masks/zone-ice-karting-canopy.png",
     "bounds": [
      830,
      230,
      1132,
      542
     ],
     "threshold": 0.25
    },
    "fill": 6,
    "src": "WS-13: canopy of the karting area from the 2024 ortho (tools/zone_ortho.py --mask --clear-tracks: crowns = dark summer pixels; track corridor, footprints, props and open water cleared). Inside the mask box trees stand only where the ortho shows crowns, filled to ~6 trees / 100 m2",
    "_ws31": "WS-31 (round 5, 2026-10-12): threshold 0.5 -> 0.25 and fill 4 -> 6. The mask is a soft canopy probability; at 0.5 it kept 23 % of the box, while the user's summer satellite (refs/user/feedback-round5/10-ice-karting) shows closed pine forest everywhere except the sand clearings, track and river (0.25 keeps 51 %). 6 / 100 m2 is close to the core survey forest density (739 / ha, vegetation.json). The engine now also plants these fill trees with the survey forest (vegetation.js), where before only the distance-thinned far ring reached the zone ('almost no trees inside the square')",
    "_layer": "karting",
    "_rc": "round-4 release candidate rc1 (WS-19, user 2026-10-12: 'all of the changes should be applied ... one final versioned piece'): karting live (clockwise race, fully electric card, tour stop); open client questions stay confirm"
   },
   {
    "_ws24": "WS-24 (2026-10-12): gift shop yard, cleared after the 2024 ortho: no trees in front of the shop (user). The pines on its right (SSE) and the tree strip towards the parking stay",
    "polygon": [[56.7, 1.9], [65.9, 8.2], [70.8, 14.6], [69.0, 20.4], [66.2, 30.0], [61.2, 37.5], [52.9, 36.2], [44.4, 30.1], [41.6, 22.2], [47.1, 13.4]],
    "mode": "clear",
    "src": "refs/user/feedback-round5/05-gift-shop/'gift shop Entrance e, T tree.png' (T = the only trees by the shop) + 06-parking/'Parking, gift shop, kota.png': open sand west and north of the shop, georeferenced as the parking outline"
   },
   {
    "_ws24": "WS-24 (2026-10-12): parking lot, cleared after the 2024 ortho",
    "polygon": [[95.0, 2.1], [96.3, 2.3], [98.0, 4.4], [96.4, 19.0], [95.9, 36.4], [98.3, 41.2], [96.5, 42.8], [92.5, 42.2], [86.9, 40.0], [81.4, 38.5], [80.6, 36.8], [80.5, 28.9], [80.9, 17.1], [85.0, 12.6], [90.4, 6.3]],
    "mode": "clear",
    "src": "same outline as paint[kind=parking] (WS-24)"
   },
   {
    "_ws21": "WS-21 (2026-10-12): sledding hill beside the Aurora Swing: few trees",
    "polygon": [[2.0, 76.8], [8.6, 77.1], [9.5, 81.6], [11.5, 89.3], [13.7, 98.3], [14.5, 105.1], [3.5, 105.2], [2.2, 96.6], [0.8, 90.9], [0.8, 85.2], [2.1, 78.8]],
    "mode": "density",
    "density": 0.1,
    "confirm": true,
    "src": "User 2026-10-12: 'on the left side of the swing there are only a few trees, because there is a sledding hill there' (left = for a person at the swing facing the river) and refs/user/feedback-round4e/29-swing-area-topdown-recent.png: the open bare strip right of the stairs in that north-up image (image right = the user's left), from swing level down to the shore forest. Traced + georeferenced in resorts-src/aurora-village/manual/landmarks/aurora-swing-area.json. The 2024 ortho predates the swing (lessons #46) and is not used. Confirm: the strip's east edge and the shore end"
   },
   {
    "_ws21": "WS-21 (2026-10-12): open view in front of the Aurora Swing: no trees",
    "polygon": [[-5.1, 76.2], [1.3, 75.9], [2.1, 78.8], [0.8, 85.2], [0.8, 90.9], [2.2, 96.6], [3.5, 105.2], [-2.6, 106.4], [-6.5, 104.3], [-11.5, 104.0], [-17.6, 98.8], [-15.0, 95.6], [-10.6, 96.0], [-8.5, 91.4], [-6.6, 83.3], [-5.4, 78.7]],
    "mode": "clear",
    "confirm": true,
    "src": "User 2026-10-12: 'the swing has no trees in front of it any more: they were all cut when the swing was built, to open the view; in front of it there are stairs going down, and no trees' (refs/user/feedback-round4e/28-swing-open-view-stairs-no-trees.webp: open view over the frozen river, stairs at lower left) and refs/user/feedback-round4e/29-swing-area-topdown-recent.png: the open slope from the swing down to the water, between the upper-left tree cluster (kept: the big pines right of the swing in photo 28) and the sledding strip. Traced + georeferenced in resorts-src/aurora-village/manual/landmarks/aurora-swing-area.json; covers the stairs and the bottom platform (+ ~1 m; props: the swing stairs terrace). The 2024 ortho predates the swing (lessons #46). Confirm: the shore end"
   },
   {
    "mode": "clear",
    "line": [
     [
      9.6,
      -76.1
     ],
     [
      30.3,
      -93.2
     ],
     [
      38.0,
      -104.9
     ],
     [
      45.7,
      -113.5
     ],
     [
      53.4,
      -122.0
     ],
     [
      60.2,
      -140.5
     ],
     [
      63.4,
      -145.5
     ],
     [
      65.5,
      -146.7
     ],
     [
      71.1,
      -150.0
     ],
     [
      80.2,
      -150.4
     ],
     [
      90.6,
      -141.9
     ],
     [
      96.0,
      -135.6
     ],
     [
      108.3,
      -124.8
     ],
     [
      120.1,
      -103.6
     ],
     [
      130.9,
      -95.9
     ],
     [
      154.1,
      -81.5
     ],
     [
      174.0,
      -63.1
     ],
     [
      190.8,
      -41.5
     ],
     [
      188.1,
      -30.7
     ],
     [
      180.4,
      -16.2
     ],
     [
      175.4,
      -13.1
     ],
     [
      166.3,
      -15.3
     ],
     [
      155.9,
      -26.6
     ],
     [
      148.2,
      -29.3
     ],
     [
      137.4,
      -26.8
     ],
     [
      126.9,
      -24.4
     ],
     [
      112.8,
      -23.0
     ],
     [
      102.8,
      -28.9
     ],
     [
      89.7,
      -56.8
     ],
     [
      80.6,
      -67.1
     ],
     [
      73.8,
      -72.5
     ],
     [
      60.2,
      -77.0
     ],
     [
      43.9,
      -78.4
     ],
     [
      23.5,
      -77.0
     ],
     [
      17.2,
      -75.7
     ],
     [
      12.6,
      -74.0
     ]
    ],
    "closed": true,
    "width": 5,
    "src": "WS-27: the sled trail corridor (2.6 m lane + 1.2 m each side); the trail shows as a gap in the canopy on the ortho and in the vegetation survey",
    "_layer": "reindeer-ride",
    "_rc": "round-5 go-live: WS-27 tipi + paddock + reindeer ride (sled option A) approved by the user 2026-10-12"
   }
  ],
  "landcover": true,
  "sparseDensity": 0.35,
  "_src": "Maastotietokanta 2025 land cover (landscape package): no trees on open bogs, fields, meadows, open forest land, rock or water; sparse forest on forested bogs. Object keys only, so it combines with other previews' treeRules.layers",
  "_clearAround": "WS-19 rc1: reception -> main-building (the footprint key since the main-building merge; clearAround is looked up by footprint key in build_scene.py / vegetation.py)"
 },
 "tour": [
  "reception",
  "restaurant-loimu",
  "cabin-7",
  "suite-106",
  "tower-205",
  "panorama-sauna",
  "wood-sauna",
  "ice-karting",
  "reindeer-paddock",
  "laavu",
  "jurtta",
  "safari-house"
 ],
 "scope": {
  "area": "resort",
  "neighbours": "hide",
  "src": "OSM leisure=resort polygon (way in raw/osm.json) + every assigned building; the 38 hidden footprints are outside it and unassigned (older Ivalo houses: several measure as pre-2011 buildings in the 2011 lidar)",
  "confirm": true,
  "exclude": [
   3000262427
  ],
  "_exclude": "3000262427 = the sleigh sauna's old parking spot (MML footprint of the sled, VIS-80); the client moved the sled to the river (2026-10-15), nothing stands there now"
 },
 "sky": {
  "style": "handmade",
  "src": "The owner's choice of sky (2026-10-31): both skies stay as a map setting, painted (handmade) or from the physics of the air (physical, his look: haze 2.5x, today's colours 15 %). Aurora Village keeps the painted sky until he picks; a preset may pick the other in the editor (Scene > Picture > Sky)."
 },
 "landscape": {
  "src": "landscape/landscape.json",
  "_src": "tools/build_landscape.py: MML 10 m DEM (2019) + Maastotietokanta 2025 land cover, 9 km radius",
  "fog": {
   "near": 1800,
   "far": 9800
  },
  "trees": {
   "radius": 1300,
   "max": 18000,
   "maxMobile": 9000,
   "sparse": 0.35
  },
  "canopy": 9,
  "lights": true,
  "aerial": {
   "start": 1200,
   "distance": 6500,
   "strength": 0.75,
   "height": 400,
   "band": {
    "width": 0.035,
    "strength": 1,
    "air": 0.4
   },
   "_src": "look decision, not a measurement: the owner's request 2026-11-01 'Aurora Village should look better from the horizon, more distant haze, then mist'. A gentler, farther haze than Lumo's (start 1.2 km, distance 6.5 km, strength 0.75; Lumo 1.2 / 6 / 0.8) for its 9 km landscape; pending his pick in this PR"
  },
  "_approved": "user approved the landscape look 2026-10-11 (round 4 review); seam fixed round 4b"
 },
 "ground": {
  "_src": "F6: the 'lines' were painted strokes, not terrain: ice streaks on all water, dark water outlines, dashed blue path guides and coloured trail dashes",
  "iceStreaks": false,
  "waterOutline": false,
  "pathGuides": false,
  "trails": "tracks",
  "look": {
   "roads": {
    "banks": 0.16,
    "bankWidth": 2.2,
    "ruts": 0.3,
    "bank": {
     "crest": 0.25,
     "shoulder": 0,
     "round": 1,
     "fade": 1.3
    },
    "tyres": {
     "pairs": 2,
     "spread": 0.45,
     "wander": 0.4,
     "width": 0.3,
     "glaze": 0
    },
    "finish": {
     "tone": 0.05,
     "edge": 1.2,
     "lift": 0.06
    },
    "_rc": "VIS-228 owner pick 2026-10-21 (pick page, and in chat: 'soft sunken track is the best ... update and bring to production'): road look B 'soft sunken track' = a low 16 cm fully rounded rim 2.2 m wide, a slightly darker groomed lane with a 1.2 m feathered edge, two soft matte tyre pairs; the colours and paths.width 1.4 below and the seasonal roads/paths/colours come with it. His note of 2026-10-21: weak banks, sharp jagged edges, nothing fades into the ground"
   },
   "paths": {
    "width": 1.4
   },
   "snow": {
    "drifts": 0.5,
    "ripples": 0,
    "pattern": "smooth",
    "relief": {
     "scale": 40,
     "stretch": 2.5,
     "height": 0.28,
     "albedo": 0.04,
     "ridges": {
      "spacing": 12,
      "length": 5,
      "height": 0.1
     }
    },
    "grain": {
     "map": "silk",
     "scale": 0.12
    },
    "_rc": "VIS-228 owner pick 2026-10-21 (pick page, and in chat: 'I picked both now. update and bring to production'): snow C 'soft wind crests' = calm wind-packed snow (swells 40 m long, 16 m wide, 28 cm high) with a few soft wind-carved crests about 12 m apart and 10 cm high, broken into patches; no wind ripples. His note of 2026-10-21: the ripple pattern on Aurora's snow is very bad, wants a smooth snow different from Lumo's powder"
   },
   "canopyShade": 0.6,
   "_src": "Drone Property 4, 5, 11, 12: ploughed white roads with darker tyre tracks and plough banks, trodden paths, wind-shaped snow",
   "colors": {
    "shade": "rgba(92,106,134,1)",
    "road": "#b0bbc9",
    "rut": "#9ba7b7",
    "bank": "#f3f6fa",
    "bankInner": "#d4dce6",
    "path": "#b3becb"
   },
   "_rc": "go-live 2026-10-13, user approval in chat: opens on Heavy snow, lighter ground under the trees, VIS-8",
   "_canopyShade_src": "Drone Property 4, 5, 20: under heavy crown snow the snow below the trees reads lighter (0.9 -> 0.6); user 2026-10-13: 'it needs to be lighter ground underneath'"
  }
 },
 "aurora": {
  "_src": "68.65 N lies under the auroral oval: the aurora can stand in any direction and overhead on active nights (user 2026-10-12, WS-36); Strength drives form, motion and colour (user 2026-10-12, WS-47)",
  "enabled": true,
  "bearing": 0,
  "elevation": 12,
  "intensity": 1.25,
  "controls": true,
  "radius": "auto",
  "confirm": true,
  "_confirm": "default direction and height for Aurora Village (user 2026-10-12: decide later); should the popover also show in kiosk mode",
  "_approved": "go-live 2026-10-12: user approved the WS-36 controls ('the Aurora controls are completely fine'); dial picked the same day. Go-live 2026-10-13 (WS-47): user picked look B ('B is my choice. looks fantastic. midway is correct strength'): intensity 1.25 = the middle of the Strength slider; the lights stay where the guest puts them. The 'Let the lights wander' switch (aurora.auto) was taken off again the same day: user 2026-10-13 'it just moves the band very unrealistically and fast across the sky as a whole ... either remove it or fix it'; it had gone live without a preview Go-live 2026-10-13 (WS-47, VIS-58): 'Play a night's display' (aurora.cycle: an auroral substorm, 90 s per cycle, off until a guest switches it on) with the caption 'Explain what's happening' (placement A, at the top; on while the display plays). User, after trying it on the local map: \"Yeah, everything looks good.\" The wording of the four notes and the caption being on by default were the orchestrator's calls; he has seen them",
  "look": {
   "brightness": [
    0.32,
    0.46,
    0.6,
    0.92
   ],
   "speed": [
    0.2,
    0.85,
    1.7,
    2.7
   ],
   "fold": [
    0.6,
    1.1,
    2.1,
    2.8
   ],
   "folds": [
    0,
    4,
    8,
    10
   ],
   "rays": [
    0.1,
    0.34,
    0.5,
    0.6
   ],
   "pink": [
    0,
    0.06,
    0.38,
    0.42
   ],
   "red": [
    0,
    0,
    0.12,
    0.3
   ],
   "violet": [
    0,
    0.12,
    0.42,
    0.65
   ],
   "colors": {
    "green": [
     0.16,
     1.0,
     0.46
    ],
    "pink": [
     1.0,
     0.26,
     0.6
    ],
    "red": [
     1.0,
     0.12,
     0.14
    ],
    "violet": [
     0.6,
     0.28,
     0.95
    ]
   },
   "_src": "colour order by altitude and activity, soft veil with rays inside it: references/rendering.md 'Aurora' (sources cited there; user feedback 2026-10-13: softer, less bright, no bars)",
   "_rc": "WS-47 look B 'rich' approved by the user 2026-10-13 (\"B is my choice. looks fantastic. midway is correct strength\"); storm red top and pink border toned to slight"
  },
  "cycle": {
   "default": false,
   "length": 90,
   "hours": 3,
   "says": "about three hours in a minute and a half",
   "guide": {
    "default": true
   },
   "_src": "\"Play a night's display\": an auroral substorm (quiet arc, breakup, full display, fading glow), time-compressed around the guest's direction, height and Strength. Phases and time scales: Akasofu 1964 and later reviews, UAF Geophysical Institute, Annales Geophysicae 36/59/2018 (skill references/rendering.md 'A night's display'). default false = it plays only when a guest switches it on; length 90 s for about 3 h of nature, said in the popover (says); guide.default true = the caption 'Explain what's happening' is on while the display plays ({ \"default\": false } = off until switched on, false = no caption). The caption's copy is the interface's (web/js/i18n: aurora.part.*); names / lines here would override it",
   "_rc": "WS-47 go-live 2026-10-13: the user saw the 90 s display with caption A on the local map and approved it (\"Yeah, everything looks good\"); earlier the same day on the mode: \"absolutely crazy ... so fantastic\", on the length: 1.5 minutes (\"it's better to show it more often\"), on the caption's place: \"I think A is better for both\""
  }
 },
 "animalModels": {
  "reindeer": {
   "url": "models/animals/reindeer.glb",
   "herd": {
    "bulls": 1
   },
   "src": "tools/animals/reindeer.mjs, proportioned from the client's herd photos (refs/photos/winter-ready/: Reindeer 1-17, Reindeer Ride - 1..6); herd.bulls = 1 from the user's round-4b review (one draught bull, the rest cows, young animals and calves)",
   "_approved": "user approved 2026-10-11 (round 4c review, after eyes were added)"
  },
  "horse": {
   "url": "models/animals/horse-a.glb",
   "src": "tools/animals/horse.mjs (WS-39), Finnhorse from the client's photos and videos (refs/photos/horses/: Horses forest, Horseriding Tim - 1 side-on frame, Horses - 1, Horses Dutch Family 1-3; card text 'Home of the Finnhorses'). Herd make-up from the spec mix (2 chestnut with flaxen mane, 1 chestnut, 1 dark bay in a navy rug as in Dutch Family 2)",
   "confirm": true,
   "_confirm": "how many horses live in the paddock, which coats, do they wear rugs in winter, is the black pony from the summer videos kept there",
   "_rc": "go-live 2026-10-12: user approved horse option A as final (after the hind-leg fix, PR #49)"
  }
 },
 "zones": [
  {
   "id": "ice-karting",
   "type": "activity",
   "name": "Ice karting",
   "offsite": true,
   "margin": 120,
   "roads": [
    {
     "kind": "service",
     "name": "Access road to the ice karting",
     "pts": [[429.8, -51.8], [431.1, -45.8], [432.9, -41.0], [441.5, -33.1], [452.1, -27.0], [485.2, -17.0], [515.4, -8.8], [529.1, -6.7], [536.7, -5.8], [549.2, 3.7], [560.1, 15.8], [583.9, 49.0], [742.8, 250.9], [827.6, 356.6], [834.7, 364.4], [841.6, 368.1], [850.5, 370.8], [862.4, 369.7], [874.3, 367.3], [912.4, 359.3], [921.7, 362.4], [924.5, 364.4]],
     "src": "WS-31 (round 5): OSM way 24478975 (highway=track, tracktype=grade1, surface=unpaved; resorts-src/aurora-village/raw/osm.json, projected with project.json origin) from the village road to the karting huts. The user's summer satellite (refs/user/feedback-round5/10-ice-karting, arrow 'R' = road entrance; registered to the 4 MTK footprints, 0.34 m/px, rotated 33 deg, residual <= 0.3 m) shows the same road arriving from the west-south-west at the cabins 'c'. It was drawn only inside the core as a narrow track and stopped at the core edge ('only one straight, unclear road leads to it'). Drawn as a ploughed road: guests are driven to the karting (printed map 'Ice Karting 1 km'); confirm it is ploughed in winter (not a snowmobile route). Client (user, 2026-10-12): 'the access road is ploughed in winter; in summer there is nothing there' -> seasons [winter]: outside winter the surveyed core path returns and the zone shows plain ground",
     "seasons": ["winter"]
    }
   ],
   "polygon": [
    [
     893,
     360
    ],
    [
     925,
     352
    ],
    [
     960,
     330
    ],
    [
     1000,
     300
    ],
    [
     1035,
     290
    ],
    [
     1068,
     300
    ],
    [
     1072,
     350
    ],
    [
     1062,
     405
    ],
    [
     1040,
     450
    ],
    [
     1000,
     455
    ],
    [
     965,
     480
    ],
    [
     915,
     482
    ],
    [
     895,
     460
    ],
    [
     890,
     400
    ]
   ],
   "src": "Located by WS-13 (high): the 2024 MML ortho shows a sand-track loop (OSM way 580121299, surface=sand) round an open pine heath with 4 MTK 2025 buildings on its north side, ~1 km from the reception by road (printed map: 'Ice Karting 1 km'). The client's top-down drone frame refs/photos/ice karting/122032 registers onto it (tools/register_photo.py, similarity, RMS 1.6 m, the long white building lands 2.5 m from its MTK footprint); the oblique frame 122230 shows the same row of two huts + long white building, the kota inside the loop and the teepee behind.",
   "confirm": true,
   "props": [
    {
     "key": "karting-demo-cabin",
     "model": "unit",
     "params": {
      "type": "cabin",
      "L": 8.2,
      "W": 5.6
     },
     "pos": [
      932.5,
      418.0
     ],
     "rot": 72,
     "src": "Round 4b, user: 'the structure you modelled as the kota (inside the loop) is actually their first demo cabin' (orchestrator relay 2026-10-11). Position: 2024 ortho dark round roof at (932.5, 418); camera-solved oblique 122230 (manual/zones/ice-karting-camera.json, rms 4.4 px) agrees; round 5 satellite 'D' (refs/user/feedback-round5/10-ice-karting, registered) at (931.6, 419.5), 1.7 m. WS-31 (round 5, user: 'D demo igloo which is aurora cabin'): drawn as the Aurora Cabin unit type (units.cabin, so it follows the cabin model; L x W of the surveyed cabins, e.g. cabin-1 8.2 x 5.6 m). Orientation: client (user, 2026-10-12): 'its glass front faces the teepee T in the karting area'. Bearing D (932.5, 418) -> T (955.5, 348) = (23, -70) m, 74 m; unit +x (glass front) turned by rot 72 -> world (cos 72, -sin 72) = NNE, onto T. Position and size unchanged",
     "confirm": false
    },
    {
     "key": "karting-storage",
     "model": "cottage",
     "params": {
      "L": 8.5,
      "W": 7.5,
      "wallH": 2.6,
      "pitch": 0.6,
      "windows": false,
      "door": false,
      "light": false
     },
     "pos": [
      938.0,
      403.0
     ],
     "rot": 0,
     "src": "WS-31 (round 5): 'S storage' on the user's summer satellite (refs/user/feedback-round5/10-ice-karting), registered onto the 4 MTK footprints of the zone (similarity, 0.34 m/px, image rotated 33 deg, residual <= 0.3 m). Dark roof corners at (942.0, 397.3), (942.6, 405.8), (933.6, 407.0), (933.3, 398.2) = ~9 x 8.6 m incl. its north shadow; taken as 8.5 x 7.5 m centred (938, 403), walls along the axes. Not in MTK 2025 (keyless) nor in the 2024 ortho crop used by WS-13. Roof shape, height, wall colour and doors not visible: neutral gable shed. Client (user, 2026-10-12): 'a typical roll-up garage door on the far side'; recorded only, not modelled (instruction: nothing extra); the size stays an estimate (confirm)",
     "garageDoor": "roll-up, far side (client 2026-10-12; recorded, not modelled)",
     "confirm": true
    },
    {
     "key": "karting-teepee",
     "model": "lavvu",
     "pos": [
      955.5,
      348.0
     ],
     "rot": 319,
     "params": {
      "r": 2.4,
      "h": 4.6,
      "color": "#7f8a81",
      "porch": {
       "l": 1.5,
       "w": 1.4,
       "wallH": 1.9,
       "door": true
      }
     },
     "src": "Round 4b, user: 'there are two buildings, the ice-karting hut and the hut where the karts are stored; behind them is the kota (teepee)'. Position: base of the teepee back-projected from the camera-solved oblique 122230 (rms 4.4 px) = (955.5, 348.4), ~2 m from the white canvas on the 2024 ortho. Wooden gabled entrance with a door: refs/photos/winter-ready/Teepee - 1.jpg; in 122230 the snow-roofed entrance is on the teepee's west side (rot 180 = porch to the west). Canvas colour: grey-green in daylight (122230). WS-31 check: the round 5 satellite 'T' (registered) puts the canvas ~4 m north-east, at (958, 345); kept here (ortho + camera solve agree within 2 m; the satellite pick is the cone tip, not its base). Entrance: client (user, 2026-10-12): 'its entrance points towards the ice karting track' (supersedes the west-side reading of 122230). Nearest track centreline point (984.5, 372.9), 38 m south-east; porch (+x) turned by rot 319 (= -41) -> world (cos -41, -sin -41) = (0.75, 0.66), onto it: entrance faces compass bearing 131 (SE)",
     "confirm": false
    }
   ]
  }
 ],
 "tracks": [
  {
   "id": "ice-karting",
   "place": "ice-karting",
   "zone": "ice-karting",
   "closed": true,
   "centerline": [
    [
     986.2,
     434.9
    ],
    [
     994.4,
     435.4
    ],
    [
     1003.8,
     434.4
    ],
    [
     1013.5,
     435.3
    ],
    [
     1022.9,
     429.1
    ],
    [
     1026.4,
     421.5
    ],
    [
     1028.7,
     416.5
    ],
    [
     1034.6,
     407.4
    ],
    [
     1037.6,
     401.2
    ],
    [
     1038.7,
     393.4
    ],
    [
     1039.2,
     385.2
    ],
    [
     1041.2,
     376.4
    ],
    [
     1045.7,
     368.0
    ],
    [
     1051.6,
     362.4
    ],
    [
     1056.9,
     356.2
    ],
    [
     1061.5,
     349.6
    ],
    [
     1064.7,
     341.8
    ],
    [
     1066.3,
     334.5
    ],
    [
     1063.7,
     328.1
    ],
    [
     1056.1,
     320.4
    ],
    [
     1047.0,
     312.3
    ],
    [
     1038.0,
     306.4
    ],
    [
     1032.2,
     306.1
    ],
    [
     1027.1,
     309.7
    ],
    [
     1023.7,
     315.6
    ],
    [
     1019.0,
     325.7
    ],
    [
     1011.9,
     337.2
    ],
    [
     1004.2,
     348.3
    ],
    [
     996.1,
     359.0
    ],
    [
     989.3,
     367.4
    ],
    [
     981.4,
     376.6
    ],
    [
     975.0,
     383.5
    ],
    [
     968.8,
     388.9
    ],
    [
     963.0,
     392.9
    ],
    [
     954.0,
     397.7
    ],
    [
     945.0,
     394.0
    ],
    [
     935.0,
     393.0
    ],
    [
     927.0,
     396.5
    ],
    [
     921.5,
     404.0
    ],
    [
     911.2,
     418.4
    ],
    [
     908.8,
     432.4
    ],
    [
     908.2,
     445.4
    ],
    [
     910.2,
     455.6
    ],
    [
     915.4,
     463.8
    ],
    [
     929.9,
     467.4
    ],
    [
     944.5,
     469.6
    ],
    [
     953.2,
     467.2
    ],
    [
     960.4,
     462.2
    ],
    [
     967.5,
     449.9
    ],
    [
     972.8,
     440.2
    ]
   ],
   "width": 7,
   "surface": "ice",
   "banks": {
    "height": 0.6,
    "width": 1.6
   },
   "lamps": [
    [
     950.0,
     390.0
    ],
    [
     956.0,
     404.0
    ],
    [
     934.0,
     371.0
    ]
   ],
   "lampHeight": 6,
   "vehicles": {
    "kind": "kart",
    "count": 4,
    "topSpeed": 10,
    "cornerAccel": 2.6,
    "accel": 2.2,
    "brake": 4.0,
    "slide": 0.11,
    "minGap": 6,
    "startGap": 16,
    "margin": 1.3,
    "headlights": true,
    "spray": true,
    "src": "Round 4b: model from refs/user/feedback-round4b/07-09 and refs/photos/winter-ready/Karting - 1..22 (fully electric rental ice karts, RiMO SiNUS iON-type bodywork, no branding reproduced). Clockwise race direction seen from above: user, round 4c ('I meant CLOCKWISE for karting'). Speeds and grip are estimates (confirm)"
   },
   "camera": {
    "label": "Watch a race",
    "distance": 11,
    "height": 4.2
   },
   "src": "WS-13: north-east half traced on the registered top-down drone frame 122032 (winter track, Jan 2026); south-west half = OSM sand track 580121299 (also the line the oblique frame 122230 shows in front of the huts). Width 7 m: three karts abreast in 122311. Snow banks from 122311/122347. Lamps: posts with lit heads in 122230/122311, positions estimated to +-5 m. Direction: clockwise seen from above. User, round 4c: 'I meant CLOCKWISE for karting' (round 4b had asked for counter-clockwise, which the round-4 build already drove)",
   "_ws31": "WS-31 (round 5): the user's summer satellite (refs/user/feedback-round5/10-ice-karting, registered onto the zone's MTK footprints, residual <= 0.3 m) shows the storage 'S' (karting-storage, 938, 403) just south of the track where the old centreline (945.6, 402.1) -> (919.3, 406.3) ran straight through it; the user's drawn track line passes north of S at z ~396 and turns south at (929, 397.5). That stretch now runs (945, 394) -> (935, 393) -> (927, 396.5) -> (921.5, 404), >= 5.1 m (half width + bank) from S; the rest of the track is unchanged ('the track itself is mostly correct - keep it'). Lamp (954, 399) stood 1.3 m from the centreline (on the ice); moved within its +-5 m estimate to (956, 404), off the track",
   "confirm": true,
   "direction": "cw",
   "seasons": ["winter"],
   "_seasons": "Client (user, 2026-10-12): no ice track in summer. The whole track (ice, banks, the lamps on it, karts, race camera / 'Watch a race') is winter-only; outside winter the area is the plain sand clearing"
  }
 ],
 "_tour": "WS-19 rc1: 'ice-karting' added after the wellness stops (panorama-sauna, wood-sauna), WS-13 go-live step; the tour then returns to the reindeer paddock",
 "water": {
  "state": "frozen",
  "src": "Winter drone photos (refs/photos/winter-ready/Drone Property - 2, 19, 20, 23): the Ivalojoki and the oxbow are frozen and snow-covered, a flat white band; open water only at the sauna ice holes (Barrel Sauna 1-19). Ice holes drawn by props (params.terrace.iceHoles) are added to the open-water mask automatically.",
  "shore": 1.5,
  "iceShare": 0.15,
  "flow": [
   0.55,
   0.25
  ],
  "openings": [],
  "far": {
   "state": "frozen",
   "openRapids": 60,
   "open": [],
   "_src": "Rapids (MTK 'koski' lines, e.g. Myllykoski 5.8 km S) stay open through the winter, like Jäniskoski in refs/photos/winter-ready/Jäniskoski - 1/2 (open, dark, fast water between snowy banks). confirm: which rapids near Ivalo are open in Dec-Mar.",
   "confirm": true
  },
  "wetland": "snow",
  "extraSmooth": 6,
  "colors": {
   "snowOnIce": "#e8eef5",
   "ice": "#aabccb",
   "bank": "#c6d3e0",
   "open": "#0b1820",
   "thinIce": "#7a8d9a",
   "shelf": "#e4ebf2"
  },
  "_ws17": "Round 4c (user: 'change the texture to be more realistic; top-down it looks quite poor'): frozen water = a smooth bright snow sheet like the winter drone photos (Drone Property - 2, 19, 23: the Ivalojoki and the oxbow are clean white ribbons), low-contrast wind drifts and sastrugi along the flow, rare soft wind-polished patches (iceShare 0.15), pressure cracks in the shore band, bank shade; open water ringed by thin grey ice and a slush rim (Barrel Sauna 19). wetland 'snow': the marsh round the oxbow shows a few clumps of sedge instead of 3000 even strokes (the 'speckles'). extraSmooth: survey land-cover water (10 m raster) gets a smooth shore instead of a staircase.",
  "_rc": "round-4 release candidate rc1 (WS-19, user 2026-10-12: 'all of the changes should be applied ... one final versioned piece'): frozen water + WS-17 ice texture live"
 },
 "vegetation": {
  "src": "vegetation/vegetation.json",
  "place": [
   { "x": -15.2, "z": 76.4, "species": "pine", "height": 20, "crown": 3.2, "clear": 3.5, "confirm": true, "_ws21": "WS-21 (2026-10-12)", "src": "The big mature Scots pine right of the swing (facing the river): refs/user/feedback-round4e/31-swing-right-side-big-pine.webp (user 2026-10-12: 'a bigger pine tree on the right, and further right more birch'). Position: the trunk base (pixel 984, 1044 in swing angle.jpg at 1200 px) on the WS-20 solve camera A ray, crossed with the long NNW shadow of a tall tree in refs/user/feedback-round4e/29 (base at px 45, 94; georef in resorts-src/aurora-village/manual/landmarks/aurora-swing-area.json); the two agree within ~1.5 m. Height: crown runs out of the photo frame above the 9.4 m swing post; 20 m assumed (confirm). Replaces the survey trees within 3.5 m (incl. the 2011-lidar 17 m pine at -15.5, 73.5, likely the same tree)" }
  ],
  "species": [
   { "polygon": [[-26.0, 68.3], [-16.9, 66.7], [-8.5, 76.6], [-5.9, 83.3], [-11.4, 88.1], [-25.0, 88.7]], "species": "birch", "share": 0.7, "confirm": true, "_ws21": "WS-21 (2026-10-12)", "src": "Birch-dominant mix right of the big pine (facing the river) = west of the swing: user 2026-10-12 'pine and birch mixed ... further right more birch'; refs/user/feedback-round4e/31 (frosted birches right of the pine) and the light-green deciduous cluster in refs/user/feedback-round4e/29 (px (0,60)-(85,130)-(0,150), georef aurora-swing-area.json). The survey (2024 ortho + 2011 lidar) has 30 pines / 4 birches here. Share 0.7 birch, rest stays survey species (pine)" }
  ],
  "snowLoad": 0.25,
  "snow": {
   "default": "heavy",
   "ui": true,
   "levels": [
    { "id": "none", "label": "None", "load": 0 },
    { "id": "light", "label": "Light", "load": 0.25 },
    { "id": "medium", "label": "Medium", "load": 0.45 },
    { "id": "heavy", "label": "Heavy", "load": 0.65, "grade": { "hemi": 0.9, "sun": 1.08 } }
   ],
   "_src": "WS-18 r3, user 2026-10-12 (round-4 review): 'a simple button that opens a dropdown ... a simple UI for selecting the snow level'. light = the live look (look A, Drone Property 22/23 wind-cleared pines); heavy = the former ?preview=look-b crown snow load (Drone Property 4/5/20) with its brighter grade. ui:false hides the control and fixes the level (embeds).",
   "_default_src": "user 2026-10-13: 'the map should open with the heavy snow on' (crown snow: Drone Property 4, 5, 20)",
   "_rc": "go-live 2026-10-13, user approval in chat: opens on Heavy snow, lighter ground under the trees, VIS-8"
  },
  "far": {
   "taper": 260,
   "share": 0.1,
   "along": [
    {
     "line": "path-mvirc2s7",
     "width": 160,
     "fade": 60,
     "src": "The owner, 2026-10-26: the Canyon Path runs 1.2 km west, far past the survey forest (bounds x -500), and the forest thinned to 10 % along it ('at distance it starts to clearly suffer'): draw more trees towards its end. The strip keeps the survey's forest density 80 m either side of the drawn trail (his GPS track, saved settings touches.paths path-mvirc2s7), where the land cover says forest"
    }
   ]
  },
  "lod": {
   "near": 0.22
  },
  "_src": "trees: refs/photos/winter-ready/full/Drone Property - 22, 23 (2026-03; Scots pine dominant, dark crowns, little crown snow, spruce spires, frosted birch at the river); placement and heights: resorts-src/aurora-village/reports/vegetation.md",
  "_rc": "round-4 release candidate rc1 (WS-19, user 2026-10-12: 'all of the changes should be applied ... one final versioned piece'): look A (photo-true, wind-cleared pines; the user's round-4d screenshots used look-a) live; look-b stays a preview",
  "trees": {
   "model": "cards",
   "density": 0.25,
   "_density": "owner 2026-10-18: 'twenty-five should be the standard' (was 0.7); a preset's own trees.density still wins",
   "snow": true,
   "season": "winter",
   "lod": {
    "near": 130,
    "band": 28
   },
   "readability": {
    "buildings": 4,
    "labels": 3,
    "focusFade": true,
    "focusRadius": 6
   },
   "_src": "shapes: refs/photos/winter-ready/Drone Property 4, 5, 20, 22, 23 (2026: slender Lapland pines with a crown from about mid height, narrow spruce spires, small multi-stem leafless birches); density default 0.7 = the user's 'quite dense for an interactive map, the resort hides' (round 4d), confirm",
   "_rc": "round-4 release candidate rc1 (WS-19, user 2026-10-12: 'all of the changes should be applied ... one final versioned piece'): tree models direction A 'realistic cards' live (user likes them close up); B stays as previews/trees-b.json and the Simplified style",
   "_ws34": "WS-34 trees-hq option A 'natural detail' (hq below) approved by the user 2026-10-12 ('I like the letter A, it looks pretty nice'), compared live vs A vs B (B = full and frosted, rejected, preview deleted). src: Drone Property 22, 23 (2026-03, refs/photos/DRONE PROPERTY): dense dark narrow pine crowns with frosted upper surfaces, spires, a grey-brown birch twig haze; neighbouring stands differ in tone. Cost: no draw calls; near-tree triangles +25 % (night home 8.1 -> 10.1 M), inside tests/qa/perf-budgets.json",
   "hq": {
    "option": "A",
    "crown": {
     "clumps": 1.35,
     "gaps": 0.75,
     "tufts": 0.5,
     "top": 1.4
    },
    "spruce": {
     "layers": 1.25
    },
    "birch": {
     "twigs": 2,
     "tint": [
      1.0,
      1.0,
      1.0
     ],
     "stems": 1,
     "foot": 0.06,
     "fans": "fine",
     "leaves": {
      "size": 1.1,
      "density": 1.35,
      "spread": 1.12,
      "cut": 0.25,
      "shade": 1
     },
     "summer": [
      "#4f8040",
      "#467838",
      "#578a46",
      "#4b7c42",
      "#5c8c4a",
      "#42733a"
     ],
     "autumn": [
      "#d8a62c",
      "#ddb238",
      "#d09c28",
      "#e0b63e",
      "#d4a030",
      "#cc8e26",
      "#a8a03a",
      "#c8781e"
     ],
     "forms": [
      {
       "crown": 0.85,
       "base": 0.42,
       "lean": 0.02,
       "limbs": 1.5
      },
      {
       "crown": 1.15,
       "base": 0.3,
       "lean": 0.07,
       "limbs": 1.7
      }
     ],
     "_src": "WS-76, owner 2026-10-18 in chat: the original procedural birch made a little better instead of the hero or card birch ('stop rendering it with two roots', 'create a few variations', 'improve the leaves'). stems 1 (one stem), foot 0.06 (a short grey-brown foot, never a black sock), fans 'fine' and twigs 2 (finer, lighter, fuller twig fans), leaves (summer and autumn leaf size, density, spread, cut-out, shading), summer / autumn = the leaf colours per season, tint neutral (the earlier [0.96, 1, 0.88] turned the twigs brown-yellow), forms = two variants: a slender upright birch and a wider, lower, leaning one. Approved all seasons on the dev server 2026-10-18."
    },
    "tint": {
     "value": 0.14,
     "hue": 0.05,
     "stand": 0.5,
     "standM": 40
    },
    "wind": {
     "amp": 0.1,
     "gust": 0.8,
     "gustScale": 45,
     "gustSpeed": 0.6,
     "flutter": 0.012
    },
    "snow": {
     "soft": 1.8,
     "dust": 0.12
    }
   },
   "kit": {
    "pack": "lapland-boreal",
    "kinds": {
     "0": "pine",
     "1": "spruce",
     "2": "birch"
    },
    "snowLoad": 0.65,
    "pick": {
     "0": [
      { "types": ["young"], "below": 9.0 },
      { "types": ["tall", "leaning", "gappy", "full", "old"] }
     ],
     "1": [
      { "types": ["small"], "below": 5.5 },
      { "types": ["young"], "below": 9.2 },
      { "types": ["medium", "full"], "below": 12.5 },
      { "types": ["tall", "full", "old", "medium"] }
     ],
     "2": [
      { "types": ["small"], "below": 6.0 },
      { "types": ["young"], "below": 10.0 },
      { "types": ["leaning", "twin", "old"] }
     ]
    },
    "_src": "survey species code (0 pine, 1 spruce, 2 birch: tools/vegetation.py) -> the kits of the shared tree pack lapland-boreal (web/trees/lapland-boreal/, VIS-195; built in Blender by tools/blender/kit/pine_kit.py, spruce_kit.py, birch_kit.py, far pictures far_bake.py; packaged by tools/trees/kit_package.py), from the hero trees' approved branchlets and the client's winter drone photos (Drone Property 4/5/20/22/23). pick = the kit tree per survey height (first band the tree is under, the last without `below`; inside a band hashed by place): the shortest third of the survey pines (< 9.0 m) and spruces (< 9.2 m) draw the young trees as the hero trees did, spruces under 5.5 m the small one, mid spruces (< 12.5 m) the medium or full one; birches under 6 m the small, under 10 m the young one (survey birch heights: 20 % under 6.6 m, median 9.0 m). Each tree is its kit tree scaled to its survey height (x 0.35-2.2). snowLoad = the snow level the kit pictures carry (Heavy, the map's opening level).",
    "_live": "Live since 2026-10-19: the owner saw the tree kit demo (web/previews/tree-kit/, PR #267) and asked in chat the same day: 'bring these trees and test them as the trees for Aurora Village's map and have those load instead of the old ones or the current hero ones ... just replace the tree system with those ... update the PR with putting the trees into production'. They replace the hero trees (winter, removed 2026-10-21, VIS-194) and the procedural trees (summer, autumn).",
    "confirm": true
   }
  }
 },
 "grade": {
  "hemi": 0.82,
  "sun": 1.12,
  "_src": "Drone Property 4/5/8/20: sunlit snow near white, tree shadows on snow clearly blue-grey (about half the lit snow)",
  "_rc": "round-4 release candidate rc1 (WS-19, user 2026-10-12: 'all of the changes should be applied ... one final versioned piece'): look A (photo-true, wind-cleared pines; the user's round-4d screenshots used look-a) live; look-b stays a preview",
  "haze": {
   "start": 150,
   "scale": 1400,
   "max": 0.14
  },
  "contrast": 1.07,
  "_ws42": "WS-42 winter far contrast (round-7 feedback 08: winter from high up read as a washed-out blue): tree haze 0.3 -> 0.14 from 150 m, contrast 1.07, no saturation boost (it only made the polar-night blue bluer). User 2026-10-13: 'from above, looks good ... way better'",
  "env": 0.55,
  "exposure": 1.12,
  "bloomDay": 0.22,
  "bloomThreshold": 0.85,
  "bloomKnee": 0.6,
  "_vis79": "VIS-79 daylight (owner 2026-10-14 picked option C 'soft glow' from previews/light-c.json, seen with heavy snow on the trees = hemi 0.9 / sun 1.08 from vegetation snow level 'heavy'): sky reflections by day 0.55 (they doubled the sky fill: shade nearly as bright as sun), exposure 1.12, soft daytime bloom 0.22 from 0.85 with a 0.6 knee; summer / autumn exposure x1.1. hemi / sun stay as calibrated. Same values are the engine default (main.js GRADE_DEFAULT)",
  "lowSun": {
   "full": 3,
   "to": 12,
   "green": 1,
   "_src": "WS-82 sunrise colour option B (merged from previews/sunrise-b.json): the low sun's sky light lifted toward green by its whole magenta excess (belt, horizon, hemisphere), full at 3 deg of sun and below, gone by 12 deg and below -5 deg; the sun's own colour unchanged. Snow magenta index at 1.5 deg 0.105 -> 0.082, trees 0.061 -> 0.044 (docs/qa/ws82/light.mjs). Owner's pick in chat 2026-10-20: 'Sunrise B is better' (over A = before and C)."
  }
 },
 "render": {
  "_doc": "WS-15: post-effect look parameters (engine defaults in web/js/render.js and ui.js). Merged from previews/focus-subtle.json.",
  "selectionFocus": {
   "_approved": "user picked the subtle option (?preview=focus-subtle, blur 0.2) in the round-4 review, 2026-10-12; medium (0.5) and off (0) were rejected",
   "blur": 0.2,
   "dim": 0.58,
   "src": "user feedback 2026-10-11 (round 4b): 'extremely strong blur ... maybe a less strong effect'"
  },
  "shadows": {
   "softness": 1.4,
   "strength": 0.86,
   "shade": "#6688e8",
   "_why": "WS-72 shadow look C 'Soft cool shade': softer, lighter shadows; the sunlight that reaches them is tinted cool blue, like snow in shade under a clear sky (tuned by eye 2026-10-17)",
   "src": "owner's choice 2026-10-17 in chat ('C is the best') on web/previews/shadows/ (options A Crisp, B Contact, C Soft cool shade)"
  },
  "daylight": {
   "strength": 0.65,
   "src": "VIS-165, owner's choice 2026-10-18 in chat ('65 % looks right, put it live on Aurora Village') among 50 / 65 / 80 % of the physical daylight (he liked the full version 'but not as strong')"
  }
 },
 "rides": [
  {
   "id": "reindeer-ride",
   "place": "reindeer-ride",
   "seasons": [
    "winter"
   ],
   "seasonsKeep": [
    "paddock",
    "props"
   ],
   "_seasons": "WS-35: the sleigh ride (teams, parked sleds, packed-snow lanes) runs on snow only; the paddock, herd and log shelter stay all year. confirm: which reindeer activity runs in summer/autumn (feeding is 1 Nov-10 Apr per content.json), and does the herd stay in the paddock outside winter?",
   "start": [
    148.6,
    -27.8
   ],
   "teams": {
    "count": 3,
    "animal": "reindeer",
    "speed": 1.2,
    "spacing": 6.8,
    "dwell": 30,
    "guide": true,
    "sled": {
     "lights": false,
     "riders": [
      2,
      1,
      2
     ]
    }
   },
   "parked": [
    [
     156.0,
     -19.0,
     132
    ],
    [
     158.2,
     -16.9,
     132
    ]
   ],
   "paddock": {
    "id": "ride-paddock",
    "polygon": [
     [
      116.0,
      -34.0
     ],
     [
      160.0,
      -34.0
     ],
     [
      165.0,
      -40.0
     ],
     [
      163.0,
      -55.0
     ],
     [
      150.0,
      -63.0
     ],
     [
      125.0,
      -66.0
     ],
     [
      112.0,
      -58.0
     ],
     [
      110.0,
      -44.0
     ]
    ],
    "fence": {
     "style": "roundpole",
     "height": 1.6,
     "rails": 6,
     "spacing": 3.4,
     "gates": [
      {
       "at": [
        152.0,
        -34.0
       ],
       "width": 3.2,
       "lights": 8
      }
     ]
    },
    "animals": {
     "kind": "reindeer",
     "count": 5,
     "within": [
      [
       117.7,
       -37.0
      ],
      [
       113.1,
       -44.6
      ],
      [
       114.8,
       -56.2
      ],
      [
       125.7,
       -62.9
      ],
      [
       149.0,
       -60.1
      ],
      [
       160.2,
       -53.2
      ],
      [
       161.9,
       -40.9
      ],
      [
       158.6,
       -37.0
      ]
     ]
    },
    "src": "WS-27 round 5b: the fence encloses the paddock only, NOT the trail loop (user 2026-10-12). South side near the user's fence line F behind the tipi with the start gate; the north, east and west sides are drawn round the log shelter IN and the herd area (extent unknown: confirm). Round-pole rail fence and plank gate: refs ... Reindeer ride side next to starting point gate behing teepee, Side profile daytime with fence gate, inside paddock (I think); bulbs by the start: Reindeer ride close up with sled",
    "confirm": true
   },
   "props": [
    {
     "key": "ride-shelter",
     "model": "logHut",
     "pos": [
      134.7,
      -44.2
     ],
     "rot": -90,
     "params": {
      "L": 6.0,
      "W": 4.0,
      "wallH": 2.0,
      "open": "+x",
      "snow": 0.9
     },
     "src": "WS-27: IN on the client's round-5 satellite (log cabin inside the paddock), registered position; horizontal-log shelter with one open end: refs/user/feedback-round5/04-tipi-reindeer-ride/'inside paddock (I think)'. Size and which side is open are estimates (confirm)",
     "confirm": true
    }
   ],
   "src": "WS-27: start from the side at the paddock gate behind the tipi; default route = the straight road towards the cabins, out and back (user 2026-10-12, round-5 answers). The forest loop (OSM path #9) stays as a drawn trail and the alternative route. Raito of 3 sleighs, each pulled by one reindeer, the next reindeer tied to the sleigh ahead, the herder on foot leading the first: refs/user/feedback-round5/04-tipi-reindeer-ride/ Reindeer ride forest path, Reindeer ride side profile, herder leading reindeer with sled. Number of sleighs, walking speed 1.2 m/s and the 30 s boarding stop are estimates (confirm)",
   "confirm": true,
   "route": "straight",
   "routes": {
    "straight": {
     "path": [
      [
       150.4,
       -32.2
      ],
      [
       148.6,
       -31.4
      ],
      [
       146.8,
       -30.2
      ],
      [
       139.3,
       -28.4
      ],
      [
       139.2,
       -28.3
      ],
      [
       139.1,
       -28.3
      ],
      [
       139.0,
       -28.3
      ],
      [
       138.9,
       -28.2
      ],
      [
       138.8,
       -28.1
      ],
      [
       138.8,
       -28.1
      ],
      [
       138.7,
       -28.0
      ],
      [
       138.6,
       -27.9
      ],
      [
       138.6,
       -27.8
      ],
      [
       138.6,
       -27.7
      ],
      [
       136.7,
       -22.3
      ],
      [
       136.6,
       -22.2
      ],
      [
       136.6,
       -22.1
      ],
      [
       136.6,
       -22.0
      ],
      [
       136.4,
       -14.3
      ],
      [
       134.5,
       -10.7
      ],
      [
       125.2,
       -12.8
      ],
      [
       115.5,
       -15.1
      ],
      [
       115.4,
       -15.1
      ],
      [
       115.3,
       -15.1
      ],
      [
       115.2,
       -15.1
      ],
      [
       115.1,
       -15.1
      ],
      [
       108.3,
       -14.0
      ],
      [
       108.2,
       -14.0
      ],
      [
       108.2,
       -13.9
      ],
      [
       102.7,
       -11.9
      ],
      [
       96.3,
       -15.7
      ],
      [
       86.6,
       -22.8
      ],
      [
       76.8,
       -29.8
      ],
      [
       67.1,
       -36.8
      ],
      [
       57.4,
       -43.9
      ],
      [
       47.7,
       -50.9
      ],
      [
       37.9,
       -57.9
      ],
      [
       28.2,
       -65.0
      ],
      [
       24.5,
       -70.5
      ],
      [
       22.3,
       -70.2
      ],
      [
       20.6,
       -68.8
      ],
      [
       19.9,
       -66.8
      ],
      [
       20.2,
       -64.6
      ],
      [
       26.7,
       -62.8
      ],
      [
       36.4,
       -55.8
      ],
      [
       46.1,
       -48.8
      ],
      [
       55.9,
       -41.8
      ],
      [
       65.6,
       -34.7
      ],
      [
       75.3,
       -27.7
      ],
      [
       85.0,
       -20.7
      ],
      [
       94.8,
       -13.6
      ],
      [
       103.3,
       -10.1
      ],
      [
       108.8,
       -12.0
      ],
      [
       115.3,
       -13.1
      ],
      [
       124.8,
       -10.8
      ],
      [
       124.8,
       -10.8
      ],
      [
       134.8,
       -8.6
      ],
      [
       134.9,
       -8.6
      ],
      [
       135.0,
       -8.6
      ],
      [
       135.1,
       -8.6
      ],
      [
       135.2,
       -8.6
      ],
      [
       135.3,
       -8.6
      ],
      [
       135.4,
       -8.7
      ],
      [
       135.5,
       -8.7
      ],
      [
       135.5,
       -8.8
      ],
      [
       135.6,
       -8.8
      ],
      [
       135.7,
       -8.9
      ],
      [
       135.8,
       -9.0
      ],
      [
       135.8,
       -9.0
      ],
      [
       135.9,
       -9.1
      ],
      [
       138.3,
       -13.5
      ],
      [
       138.3,
       -13.6
      ],
      [
       138.4,
       -13.7
      ],
      [
       138.4,
       -13.8
      ],
      [
       138.4,
       -13.9
      ],
      [
       138.4,
       -14.0
      ],
      [
       138.6,
       -21.8
      ],
      [
       140.3,
       -26.6
      ],
      [
       147.2,
       -28.2
      ],
      [
       148.6,
       -27.8
      ],
      [
       150.4,
       -27.0
      ],
      [
       152.2,
       -27.8
      ],
      [
       153.0,
       -29.6
      ],
      [
       152.2,
       -31.4
      ]
     ],
     "closed": true,
     "src": "User 2026-10-12: rides start from the side at the gate behind the tipi and usually walk the straight road in front of the paddock towards the cabins (scene.json roads #9), out and back with a small turn at the far end (336 m round trip). Lanes 1.3 m either side of the road centreline; turn radius 4.2 m (estimates). 2026-10-13: the turn at the start is a loop of 2.6 m radius round (150.4, -29.6), in the open ground south of the gate, at least 1.2 m clear of every tree drawn there (trunks from vegetation/trees.bin) and wide enough for the three sleighs to follow round without touching, where the path used to double back at one point (a turn no reindeer with a sled can walk); its place and size are estimates (confirm)"
    },
    "loop": {
     "path": [
      [
       9.6,
       -76.1
      ],
      [
       30.3,
       -93.2
      ],
      [
       38.0,
       -104.9
      ],
      [
       45.7,
       -113.5
      ],
      [
       53.4,
       -122.0
      ],
      [
       60.2,
       -140.5
      ],
      [
       63.4,
       -145.5
      ],
      [
       65.5,
       -146.7
      ],
      [
       71.1,
       -150.0
      ],
      [
       80.2,
       -150.4
      ],
      [
       90.6,
       -141.9
      ],
      [
       96.0,
       -135.6
      ],
      [
       108.3,
       -124.8
      ],
      [
       120.1,
       -103.6
      ],
      [
       130.9,
       -95.9
      ],
      [
       154.1,
       -81.5
      ],
      [
       174.0,
       -63.1
      ],
      [
       190.8,
       -41.5
      ],
      [
       188.1,
       -30.7
      ],
      [
       180.4,
       -16.2
      ],
      [
       175.4,
       -13.1
      ],
      [
       166.3,
       -15.3
      ],
      [
       155.9,
       -26.6
      ],
      [
       148.2,
       -29.3
      ],
      [
       137.4,
       -26.8
      ],
      [
       126.9,
       -24.4
      ],
      [
       112.8,
       -23.0
      ],
      [
       102.8,
       -28.9
      ],
      [
       89.7,
       -56.8
      ],
      [
       80.6,
       -67.1
      ],
      [
       73.8,
       -72.5
      ],
      [
       60.2,
       -77.0
      ],
      [
       43.9,
       -78.4
      ],
      [
       23.5,
       -77.0
      ],
      [
       17.2,
       -75.7
      ],
      [
       12.6,
       -74.0
      ]
     ],
     "closed": true,
     "direction": "cw",
     "src": "OSM path loop (scene.json paths #9, 499 m) = the forest trail of the user screenshot 11; used on some rides (user 2026-10-12), not the default"
    }
   },
   "trails": [
    {
     "path": [
      [
       9.6,
       -76.1
      ],
      [
       30.3,
       -93.2
      ],
      [
       38.0,
       -104.9
      ],
      [
       45.7,
       -113.5
      ],
      [
       53.4,
       -122.0
      ],
      [
       60.2,
       -140.5
      ],
      [
       63.4,
       -145.5
      ],
      [
       65.5,
       -146.7
      ],
      [
       71.1,
       -150.0
      ],
      [
       80.2,
       -150.4
      ],
      [
       90.6,
       -141.9
      ],
      [
       96.0,
       -135.6
      ],
      [
       108.3,
       -124.8
      ],
      [
       120.1,
       -103.6
      ],
      [
       130.9,
       -95.9
      ],
      [
       154.1,
       -81.5
      ],
      [
       174.0,
       -63.1
      ],
      [
       190.8,
       -41.5
      ],
      [
       188.1,
       -30.7
      ],
      [
       180.4,
       -16.2
      ],
      [
       175.4,
       -13.1
      ],
      [
       166.3,
       -15.3
      ],
      [
       155.9,
       -26.6
      ],
      [
       148.2,
       -29.3
      ],
      [
       137.4,
       -26.8
      ],
      [
       126.9,
       -24.4
      ],
      [
       112.8,
       -23.0
      ],
      [
       102.8,
       -28.9
      ],
      [
       89.7,
       -56.8
      ],
      [
       80.6,
       -67.1
      ],
      [
       73.8,
       -72.5
      ],
      [
       60.2,
       -77.0
      ],
      [
       43.9,
       -78.4
      ],
      [
       23.5,
       -77.0
      ],
      [
       17.2,
       -75.7
      ],
      [
       12.6,
       -74.0
      ]
     ],
     "closed": true,
     "width": 2.6,
     "src": "the forest-loop sled trail is real (user 2026-10-12): drawn whether or not the sleighs use it"
    }
   ]
  }
 ],
 "attribution": [
  {
   "text": "© Maanmittauslaitos (National Land Survey of Finland): Topographic Database, Elevation Model 2 m, Laser Scanning Data, Orthophoto, 10/2026. CC BY 4.0. Processed by MapMyStay.",
   "href": "https://www.maanmittauslaitos.fi/en/opendata-licence-cc40",
   "_src": "MML asks for licensor, data set and delivery time (opendata-licence-cc40); raw/SOURCES.md: DEM, lidar and orthophoto fetched 2026-10-11, building footprints 2026-10-10. \"Processed by MapMyStay.\": CC BY 4.0 §3(a)(1)(B) asks to say the data was changed (owner, 2026-10-13)"
  },
  {
   "text": "© OpenStreetMap contributors (ODbL)",
   "href": "https://www.openstreetmap.org/copyright",
   "showAtStart": true,
   "_src": "OSM roads, paths, water, landuse (raw/osm.json). showAtStart: the OSMF attribution guideline wants the credit seen first; it may fold away after 5 s"
  }
 ],
 "materials": {
  "level": "subtle",
  "src": "refs/user/feedback-round6/01-playdoh-buildings-no-materials.webp, 02-restaurant-windows-blocks.webp; wall/window look from refs/photos/reception restaurant safari house building/Screenshot 2026-10-11 121346.png, 121505.png, Outside-Cabin-4.jpg",
  "_rc": "go-live 2026-10-13, user approval in chat: materials A (subtle), VIS-6",
  "add": {
   "saunaWood": {
    "from": "boards",
    "color": "#cfa274",
    "rows": 20,
    "contrast": 0.6,
    "src": "the sauna room's pale honey boards on walls, slopes, benches and floor, about 10 cm wide, low contrast: the owner's Panorama Sauna interior photos (chat 2026-10-31, day and night stills); VIS-246 'Panorama Sauna 9.png', '15.jpg'"
   },
   "saunaSteel": {
    "color": "#b4b8bc",
    "metalness": 0.75,
    "roughness": 0.35,
    "src": "the Harvia Cilindro's brushed steel cage and the aluminium bucket beside it (owner's Panorama Sauna photos, chat 2026-10-31)"
   },
   "saunaStone": {
    "color": "#6f6e6b",
    "roughness": 0.95,
    "src": "the grey sauna stones inside the Harvia Cilindro's cage (owner's Panorama Sauna photos, chat 2026-10-31)"
   },
   "gateRed": {
    "color": "#9e5249",
    "src": "VIS-234 reindeer gate photos: red-stained board frame, cloud board, reindeer cut-out"
   },
   "gateSun": {
    "color": "#bb2e30",
    "src": "VIS-234 reindeer gate photos: the bright red half-suns"
   },
   "signLilac": {
    "color": "#b7a6c3",
    "src": "VIS-234 reindeer gate photos: the lilac 'Home of the reindeer' sign"
   },
   "rust": {
    "color": "#6b3a22",
    "roughness": 0.85,
    "src": "VIS-234 grill station photos: rust-brown steel fire-bowl cabinets"
   },
   "kotaLog": {
    "from": "logs",
    "color": "#3a312b",
    "roughness": 0.85,
    "src": "VIS-234 kota log walls: black-stained round logs (refs/notes/kota P1-P5), a step above black so the walls read at night",
    "confirm": true
   }
  }
 },
 "seasonal": {
  "summer": {
   "ui": {
    "defaultTime": {
     "month": 6,
     "day": 21,
     "hour": 13
    }
   },
   "ground": {
    "palette": {
     "base": "#5f6142",
     "mottle": [
      {
       "tone": "176,170,138",
       "a": 0.2,
       "n": 1700,
       "r": [
        3,
        16
       ],
       "layer": "lichen"
      },
      {
       "tone": "50,54,33",
       "a": 0.25,
       "n": 1500,
       "r": [
        4,
        22
       ],
       "layer": "shrub"
      },
      {
       "tone": "96,118,56",
       "a": 0.14,
       "n": 700,
       "r": [
        6,
        30
       ],
       "layer": "grass",
       "ctl": 0.5
      },
      {
       "tone": "108,86,60",
       "a": 0.14,
       "n": 600,
       "r": [
        5,
        24
       ],
       "layer": "litter",
       "ctl": 0.6
      }
     ],
     "areas": {
      "farmland": "#687a45",
      "meadow": "#68784a",
      "grass": "#5d7140",
      "parking": "#958e7d",
      "helipad": "#958e7d",
      "marsh": "#6a7044"
     },
     "sedge": "rgba(150,142,80,0.35)",
     "sedgeWet": "rgba(118,122,70,0.3)",
     "water": "#3a3b2a",
     "streams": "#34433f",
     "paint": "#958e7d",
     "clearings": [
      {"polygon": [[-182.0, 40.1], [-178.7, 41.4], [-176.4, 44.8], [-175.7, 48.3], [-176.6, 51.2], [-178.5, 53.5], [-181.1, 54.4], [-183.1, 53.6], [-184.1, 51.3], [-184.7, 47.9], [-188.8, 49.3], [-190.7, 49.2], [-191.1, 46.7], [-189.1, 43.7], [-185.8, 41.2]], "color": "#a8a092", "blur": 1.5, "confirm": true, "src": "VIS-246: gravel pad round the Panorama Sauna, outline traced on drone frames 'Panorama Sauna Tim - 5.MP4' 0.3 s and '- 6.MP4' 0.5 s rectified on the MML footprint (light grey crushed rock in every summer frame)"},
      {
       "line": [
        [
         986.2,
         434.9
        ],
        [
         994.4,
         435.4
        ],
        [
         1003.8,
         434.4
        ],
        [
         1013.5,
         435.3
        ],
        [
         1022.9,
         429.1
        ],
        [
         1026.4,
         421.5
        ],
        [
         1028.7,
         416.5
        ],
        [
         1034.6,
         407.4
        ],
        [
         1037.6,
         401.2
        ],
        [
         1038.7,
         393.4
        ],
        [
         1039.2,
         385.2
        ],
        [
         1041.2,
         376.4
        ],
        [
         1045.7,
         368
        ],
        [
         1051.6,
         362.4
        ],
        [
         1056.9,
         356.2
        ],
        [
         1061.5,
         349.6
        ],
        [
         1064.7,
         341.8
        ],
        [
         1066.3,
         334.5
        ],
        [
         1063.7,
         328.1
        ],
        [
         1056.1,
         320.4
        ],
        [
         1047,
         312.3
        ],
        [
         1038,
         306.4
        ],
        [
         1032.2,
         306.1
        ],
        [
         1027.1,
         309.7
        ],
        [
         1023.7,
         315.6
        ],
        [
         1019,
         325.7
        ],
        [
         1011.9,
         337.2
        ],
        [
         1004.2,
         348.3
        ],
        [
         996.1,
         359
        ],
        [
         989.3,
         367.4
        ],
        [
         981.4,
         376.6
        ],
        [
         975,
         383.5
        ],
        [
         968.8,
         388.9
        ],
        [
         963,
         392.9
        ],
        [
         954,
         397.7
        ],
        [
         945,
         394
        ],
        [
         935,
         393
        ],
        [
         927,
         396.5
        ],
        [
         921.5,
         404
        ],
        [
         911.2,
         418.4
        ],
        [
         908.8,
         432.4
        ],
        [
         908.2,
         445.4
        ],
        [
         910.2,
         455.6
        ],
        [
         915.4,
         463.8
        ],
        [
         929.9,
         467.4
        ],
        [
         944.5,
         469.6
        ],
        [
         953.2,
         467.2
        ],
        [
         960.4,
         462.2
        ],
        [
         967.5,
         449.9
        ],
        [
         972.8,
         440.2
        ]
       ],
       "closed": true,
       "width": 12,
       "color": "#cdb98f",
       "blur": 2,
       "src": "The karting loop is a sand track outside winter: OSM way 580121299 surface=sand + refs/user/feedback-round5/10-ice-karting (user's summer satellite, labelled) (pale sand loop); centreline copied from tracks[ice-karting], width 7 m + sandy verges",
       "confirm": true
      },
      {
       "polygon": [
        [
         916,
         370
        ],
        [
         972,
         371
        ],
        [
         976,
         391
        ],
        [
         958,
         410
        ],
        [
         946,
         428
        ],
        [
         924,
         428
        ],
        [
         913,
         404
        ]
       ],
       "color": "#c7b48c",
       "blur": 2.5,
       "src": "Sand yard round the karting huts c, S and D in refs/user/feedback-round5/10-ice-karting (user's summer satellite, labelled); outline traced by eye on the registered satellite (WS-31 registration), +-5 m",
       "confirm": true
      },
      {
       "polygon": [
        [
         960,
         338
        ],
        [
         982,
         302
        ],
        [
         1008,
         282
        ],
        [
         1026,
         298
        ],
        [
         1012,
         330
        ],
        [
         992,
         360
        ],
        [
         970,
         384
        ],
        [
         957,
         366
        ]
       ],
       "color": "#d0bf96",
       "blur": 3,
       "src": "Open sand plain north of the huts, west of the loop's north-west leg, teepee T on its west edge, in refs/user/feedback-round5/10-ice-karting (user's summer satellite, labelled); traced by eye, +-8 m",
       "confirm": true
      }
     ],
     "detail": {
      "light": "#b0aa86",
      "dark": "#33381f",
      "amount": 0.4
     },
     "_src": "Lapland summer floor: pale reindeer lichen, dark crowberry/heather, some grass, needle litter under the pines (refs/user/feedback-round5/10-ice-karting (user's summer satellite, labelled); refs/user/feedback-round5/07-aurora-cabins/no snow *); hay fields green (2024 MML ortho, used as a colour reference only); user 2026-10-12: painted like the snow, no image on the ground",
     "layers": {
      "base": {
       "lichen": 0.3,
       "shrub": 0.6,
       "litter": 0.1
      },
      "colors": {
       "lichen": "#b9b79a",
       "shrub": "#3e4a27",
       "litter": "#6b5a3c",
       "grass": "#6f8240",
       "gravel": "#a3a093",
       "sand": "#b59e78"
      },
      "accent": {
       "lichen": [
        "#8f9f6e",
        0.5
       ],
       "shrub": [
        "#5d7a2e",
        0.35
       ],
       "litter": [
        "#58712f",
        0.5
       ],
       "grass": [
        "#b3a66a",
        0.4
       ]
      },
      "amount": 1,
      "normal": 1,
      "contrast": 0.5,
      "_src": "WS-42: Lapland dry pine heath, summer: crowberry/bilberry carpet with pale reindeer-lichen mats, moss + needle litter under the crowns, grey gravel pads round the cabins and on the roads (client drone 2024-08 'DRONE PROPERTY/DJI_0502, DJI_0518' in V:\\AURORA VILLAGE\\CONTENT, colour reference only)"
     }
    },
    "look": {
     "roads": {
      "banks": 0,
      "bankWidth": 1.6,
      "ruts": 0.3,
      "bank": {
       "fade": 1.2
      }
     },
     "paths": {
      "width": 1.4
     },
     "canopyShade": 0.9,
     "colors": {
      "road": "#857c6a",
      "rut": "#6c6455",
      "bank": "#6f7050",
      "bankInner": "#7a735f",
      "path": "#86775c",
      "trail": "#7f7a5c",
      "shade": "rgba(38,44,26,1)"
     },
     "_src": "Gravel roads grey-beige with darker wheel tracks, grassy verges, sandy trodden paths: refs/user/feedback-round5/10-ice-karting (user's summer satellite, labelled), refs/user/feedback-round5/07-aurora-cabins/no snow aurora cabin drone front side.png"
    }
   },
   "water": {
    "state": "open",
    "iceShare": 0,
    "far": {
     "state": "open"
    },
    "colors": {
     "open": "#132028",
     "snowOnIce": "#6b6a4f",
     "ice": "#6b6a4f",
     "bank": "#59583f",
     "shelf": "#6b6a4f",
     "thinIce": "#2f3b3a"
    },
    "_src": "Open water outside winter: the Ivalojoki is open and dark (navy/tea) in refs/user/feedback-round5/10-ice-karting (user's summer satellite, labelled) and the 2024 MML ortho (summer); the shore colours replace snow on ice where the soft mask blends water into the bank",
    "ripples": 0.45,
    "level": {
     "gate": true,
     "tolerance": 0.12,
     "wet": 0.3,
     "wetDark": 0.5,
     "_src": "WS-42: open water only where the ground is at the water level (round-7 feedback 05/06: water climbed the bank); wet soil band above it"
    }
   },
   "landscape": {
    "colors": {
     "water": "#1d2a2e",
     "forest": "#2d3a25",
     "sparse": "#56613d",
     "open": "#61644a",
     "forestFloor": "#4a4e33"
    },
    "trees": {
     "frost": 0
    }
   },
   "vegetation": {
    "trees": {
     "season": "summer",
     "seasonParams": {
      "needle": [
       1.14,
       1.26,
       0.95
      ]
     }
    }
   },
   "grade": {
    "bounce": "#55573a",
    "sky": {
     "zenith": "#3c6fb8",
     "horizon": "#a8c2de",
     "k": 1
    },
    "haze": {
     "max": 0.08
    },
    "saturation": 1.12,
    "contrast": 1.05,
    "exposure": 1.23,
    "night": {
     "hemi": 3,
     "moon": 5,
     "bounce": "#131b2e",
     "_src": "owner, 2026-10-13: 'the autumn night is far too dark ... nothing is visible', hovering 'creates a row of bloom'. The night light is tuned on snow; heath returns about an eighth of it. Measured against the winter night at the same camera: moon x5, sky fill x3 and a ground fill at 0.7 of winter's give a night that is darker than winter but shows roads, water, trees and buildings"
    }
   },
   "paddocks": [
    {
     "id": "reindeer-paddock",
     "animals": {
      "within": "reindeer-roam"
     }
    }
   ],
   "rides": [
    {
     "id": "reindeer-ride",
     "paddock": {
      "id": "ride-paddock",
      "animals": {
       "within": "reindeer-roam"
      }
     }
    }
   ],
   "_ws41": "WS-41: outside winter the reindeer of the reindeer park and of the ride paddock roam animalAreas.reindeer-roam (live season switch; the ride paddock herd walks out through its gate when the way is clear, the park has no gate drawn: its herd is moved under the season crossfade). confirm: see animalAreas"
  },
  "autumn": {
   "ui": {
    "defaultTime": {
     "month": 9,
     "day": 15,
     "hour": 14
    }
   },
   "ground": {
    "palette": {
     "base": "#655a40",
     "mottle": [
      {
       "tone": "140,54,34",
       "a": 0.2,
       "n": 1500,
       "r": [
        3,
        16
       ],
       "layer": "shrub"
      },
      {
       "tone": "176,110,46",
       "a": 0.16,
       "n": 1100,
       "r": [
        4,
        20
       ],
       "layer": "shrub",
       "ctl": 0.6
      },
      {
       "tone": "172,164,134",
       "a": 0.16,
       "n": 1300,
       "r": [
        3,
        14
       ],
       "layer": "lichen"
      },
      {
       "tone": "54,48,32",
       "a": 0.22,
       "n": 1200,
       "r": [
        4,
        22
       ],
       "layer": "litter",
       "ctl": 0.6
      }
     ],
     "areas": {
      "farmland": "#877d50",
      "meadow": "#857749",
      "grass": "#77713f",
      "parking": "#8f8878",
      "helipad": "#8f8878",
      "marsh": "#7a623d"
     },
     "sedge": "rgba(172,132,72,0.38)",
     "sedgeWet": "rgba(140,110,64,0.3)",
     "water": "#3c3628",
     "streams": "#323d3a",
     "paint": "#8f8878",
     "clearings": [
      {"polygon": [[-182.0, 40.1], [-178.7, 41.4], [-176.4, 44.8], [-175.7, 48.3], [-176.6, 51.2], [-178.5, 53.5], [-181.1, 54.4], [-183.1, 53.6], [-184.1, 51.3], [-184.7, 47.9], [-188.8, 49.3], [-190.7, 49.2], [-191.1, 46.7], [-189.1, 43.7], [-185.8, 41.2]], "color": "#a8a092", "blur": 1.5, "confirm": true, "src": "VIS-246: gravel pad round the Panorama Sauna, outline traced on drone frames 'Panorama Sauna Tim - 5.MP4' 0.3 s and '- 6.MP4' 0.5 s rectified on the MML footprint (light grey crushed rock in every summer frame)"},
      {
       "line": [
        [
         986.2,
         434.9
        ],
        [
         994.4,
         435.4
        ],
        [
         1003.8,
         434.4
        ],
        [
         1013.5,
         435.3
        ],
        [
         1022.9,
         429.1
        ],
        [
         1026.4,
         421.5
        ],
        [
         1028.7,
         416.5
        ],
        [
         1034.6,
         407.4
        ],
        [
         1037.6,
         401.2
        ],
        [
         1038.7,
         393.4
        ],
        [
         1039.2,
         385.2
        ],
        [
         1041.2,
         376.4
        ],
        [
         1045.7,
         368
        ],
        [
         1051.6,
         362.4
        ],
        [
         1056.9,
         356.2
        ],
        [
         1061.5,
         349.6
        ],
        [
         1064.7,
         341.8
        ],
        [
         1066.3,
         334.5
        ],
        [
         1063.7,
         328.1
        ],
        [
         1056.1,
         320.4
        ],
        [
         1047,
         312.3
        ],
        [
         1038,
         306.4
        ],
        [
         1032.2,
         306.1
        ],
        [
         1027.1,
         309.7
        ],
        [
         1023.7,
         315.6
        ],
        [
         1019,
         325.7
        ],
        [
         1011.9,
         337.2
        ],
        [
         1004.2,
         348.3
        ],
        [
         996.1,
         359
        ],
        [
         989.3,
         367.4
        ],
        [
         981.4,
         376.6
        ],
        [
         975,
         383.5
        ],
        [
         968.8,
         388.9
        ],
        [
         963,
         392.9
        ],
        [
         954,
         397.7
        ],
        [
         945,
         394
        ],
        [
         935,
         393
        ],
        [
         927,
         396.5
        ],
        [
         921.5,
         404
        ],
        [
         911.2,
         418.4
        ],
        [
         908.8,
         432.4
        ],
        [
         908.2,
         445.4
        ],
        [
         910.2,
         455.6
        ],
        [
         915.4,
         463.8
        ],
        [
         929.9,
         467.4
        ],
        [
         944.5,
         469.6
        ],
        [
         953.2,
         467.2
        ],
        [
         960.4,
         462.2
        ],
        [
         967.5,
         449.9
        ],
        [
         972.8,
         440.2
        ]
       ],
       "closed": true,
       "width": 12,
       "color": "#cdb98f",
       "blur": 2,
       "src": "The karting loop is a sand track outside winter: OSM way 580121299 surface=sand + refs/user/feedback-round5/10-ice-karting (user's summer satellite, labelled) (pale sand loop); centreline copied from tracks[ice-karting], width 7 m + sandy verges",
       "confirm": true
      },
      {
       "polygon": [
        [
         916,
         370
        ],
        [
         972,
         371
        ],
        [
         976,
         391
        ],
        [
         958,
         410
        ],
        [
         946,
         428
        ],
        [
         924,
         428
        ],
        [
         913,
         404
        ]
       ],
       "color": "#c7b48c",
       "blur": 2.5,
       "src": "Sand yard round the karting huts c, S and D in refs/user/feedback-round5/10-ice-karting (user's summer satellite, labelled); outline traced by eye on the registered satellite (WS-31 registration), +-5 m",
       "confirm": true
      },
      {
       "polygon": [
        [
         960,
         338
        ],
        [
         982,
         302
        ],
        [
         1008,
         282
        ],
        [
         1026,
         298
        ],
        [
         1012,
         330
        ],
        [
         992,
         360
        ],
        [
         970,
         384
        ],
        [
         957,
         366
        ]
       ],
       "color": "#d0bf96",
       "blur": 3,
       "src": "Open sand plain north of the huts, west of the loop's north-west leg, teepee T on its west edge, in refs/user/feedback-round5/10-ice-karting (user's summer satellite, labelled); traced by eye, +-8 m",
       "confirm": true
      }
     ],
     "detail": {
      "light": "#b9985e",
      "dark": "#4e2c22",
      "amount": 0.42
     },
     "_src": "Ruska (mid-September): bilberry and dwarf birch turn red and orange on the floor, lichen stays pale, crowberry dark; fields yellow-brown. Typical Lapland autumn; confirm with the client's autumn photos (V: CONTENT)",
     "layers": {
      "base": {
       "lichen": 0.3,
       "shrub": 0.6,
       "litter": 0.1
      },
      "colors": {
       "lichen": "#bdb69a",
       "shrub": "#4a3b25",
       "litter": "#6e5636",
       "grass": "#8a7b45",
       "gravel": "#99958a",
       "sand": "#ab9470"
      },
      "accent": {
       "lichen": [
        "#a0946a",
        0.4
       ],
       "shrub": [
        "#a42e1c",
        0.75
       ],
       "litter": [
        "#596b2c",
        0.4
       ],
       "grass": [
        "#c4a35a",
        0.5
       ]
      },
      "amount": 1,
      "normal": 1,
      "contrast": 0.5,
      "_src": "WS-42: ruska (mid-September): bilberry leaves red, crowberry dark, lichen pale, grass yellow-brown (typical Lapland autumn; client autumn photos in V:\\AURORA VILLAGE\\CONTENT\\OUR CONTENT\\READY TO USE\\PHOTOS\\AUTUMN, colour reference only)"
     }
    },
    "look": {
     "roads": {
      "banks": 0,
      "bankWidth": 1.6,
      "ruts": 0.3,
      "bank": {
       "fade": 1.2
      }
     },
     "paths": {
      "width": 1.4
     },
     "canopyShade": 0.9,
     "colors": {
      "road": "#7d7464",
      "rut": "#655e50",
      "bank": "#7a6240",
      "bankInner": "#76705f",
      "path": "#7f6f56",
      "trail": "#78694a",
      "shade": "rgba(48,38,26,1)"
     },
     "_src": "Same gravel and paths as summer, a little darker (wet autumn), ruska verges"
    }
   },
   "water": {
    "state": "open",
    "iceShare": 0,
    "far": {
     "state": "open"
    },
    "colors": {
     "open": "#132028",
     "snowOnIce": "#6b6a4f",
     "ice": "#6b6a4f",
     "bank": "#59583f",
     "shelf": "#6b6a4f",
     "thinIce": "#2f3b3a"
    },
    "_src": "Open water outside winter: the Ivalojoki is open and dark (navy/tea) in refs/user/feedback-round5/10-ice-karting (user's summer satellite, labelled) and the 2024 MML ortho (summer); the shore colours replace snow on ice where the soft mask blends water into the bank",
    "ripples": 0.45,
    "level": {
     "gate": true,
     "tolerance": 0.12,
     "wet": 0.3,
     "wetDark": 0.5,
     "_src": "WS-42: as summer"
    }
   },
   "landscape": {
    "colors": {
     "water": "#1d2a2e",
     "forest": "#363824",
     "sparse": "#7a6a3a",
     "open": "#655a40",
     "forestFloor": "#4d4330"
    },
    "trees": {
     "frost": 0
    }
   },
   "vegetation": {
    "trees": {
     "seasonParams": {
      "leaf": "#e39a1c",
      "needle": [
       1.1,
       1.18,
       0.92
      ]
     },
     "season": "autumn"
    }
   },
   "grade": {
    "bounce": "#5a5038",
    "sky": {
     "zenith": "#4672b2",
     "horizon": "#b3c3d4",
     "k": 1
    },
    "haze": {
     "max": 0.1
    },
    "saturation": 1.15,
    "contrast": 1.05,
    "exposure": 1.32,
    "night": {
     "hemi": 3,
     "moon": 5,
     "bounce": "#131b2e",
     "lift": 0.11,
     "blue": 22,
     "sky": 1.6,
     "_lift": "owner's pick 2026-10-28: D winter, B autumn ('D for winter, B for autumn. Build it and open the PR with Auto-fix.', slider page https://claude.ai/artifact/3h2ciSuPe1y8AwnkPA2me7). Autumn = B: blue 22 (% of the way from the old navy night toward neutral, sun.js NIGHT_LIGHT), the sky's horizon band x1.6 so the far land meets it, lift 0.11 on brightness only, fading out toward the horizon. Was lift 0.2 (owner, 2026-10-26: 'our current autumn night is far too dark to see anything'), which with the 40 % night greyed the heath and left a hard line under the dark sky",
     "_src": "owner, 2026-10-13: 'the autumn night is far too dark ... nothing is visible', hovering 'creates a row of bloom'. The night light is tuned on snow; heath returns about an eighth of it. Measured against the winter night at the same camera: moon x5, sky fill x3 and a ground fill at 0.7 of winter's give a night that is darker than winter but shows roads, water, trees and buildings"
    }
   },
   "paddocks": [
    {
     "id": "reindeer-paddock",
     "animals": {
      "within": "reindeer-roam"
     }
    }
   ],
   "rides": [
    {
     "id": "reindeer-ride",
     "paddock": {
      "id": "ride-paddock",
      "animals": {
       "within": "reindeer-roam"
      }
     }
    }
   ],
   "_ws41": "WS-41: outside winter the reindeer of the reindeer park and of the ride paddock roam animalAreas.reindeer-roam (live season switch; the ride paddock herd walks out through its gate when the way is clear, the park has no gate drawn: its herd is moved under the season crossfade). confirm: see animalAreas"
  },
  "spring": {
   "ground": {
    "look": {
     "paths": {
      "width": 1.4
     },
     "roads": {
      "banks": 0,
      "ruts": 0.35,
      "bankWidth": 1.6,
      "bank": {
       "fade": 1.2
      }
     },
     "colors": {
      "road": "#7d7564",
      "rut": "#665e50",
      "bank": "#68694b",
      "bankInner": "#736c59",
      "path": "#7e7056",
      "trail": "#777356",
      "shade": "rgba(38,44,26,1)"
     }
    }
   }
  }
 },
 "animalAreas": {
  "reindeer-roam": {
   "polygon": [
    [
     -282.1,
     -38.0
    ],
    [
     -282.0,
     -36.4
    ],
    [
     -280.1,
     -33.4
    ],
    [
     -278.3,
     -18.9
    ],
    [
     -276.0,
     -14.5
    ],
    [
     -270.1,
     -9.0
    ],
    [
     -251.4,
     1.6
    ],
    [
     -223.4,
     8.8
    ],
    [
     -219.1,
     10.4
    ],
    [
     -213.6,
     11.4
    ],
    [
     -204.9,
     14.7
    ],
    [
     -186.5,
     19.3
    ],
    [
     -178.2,
     22.7
    ],
    [
     -171.7,
     27.0
    ],
    [
     -166.5,
     29.4
    ],
    [
     -148.1,
     36.4
    ],
    [
     -133.7,
     40.3
    ],
    [
     -111.6,
     50.4
    ],
    [
     -91.1,
     57.4
    ],
    [
     -79.1,
     63.5
    ],
    [
     -60.5,
     70.2
    ],
    [
     -49.8,
     75.5
    ],
    [
     -34.3,
     81.2
    ],
    [
     -24.2,
     86.0
    ],
    [
     -13.6,
     89.7
    ],
    [
     -10.0,
     91.7
    ],
    [
     1.7,
     96.3
    ],
    [
     17.7,
     100.9
    ],
    [
     24.3,
     103.9
    ],
    [
     36.8,
     107.5
    ],
    [
     52.8,
     111.8
    ],
    [
     68.6,
     115.1
    ],
    [
     74.5,
     115.5
    ],
    [
     89.0,
     115.1
    ],
    [
     96.4,
     113.8
    ],
    [
     104.0,
     111.2
    ],
    [
     128.9,
     95.1
    ],
    [
     135.7,
     89.8
    ],
    [
     142.1,
     84.0
    ],
    [
     156.9,
     68.7
    ],
    [
     163.8,
     59.3
    ],
    [
     167.5,
     50.2
    ],
    [
     168.7,
     45.4
    ],
    [
     169.9,
     34.1
    ],
    [
     169.2,
     11.6
    ],
    [
     169.2,
     -3.9
    ],
    [
     171.5,
     -7.9
    ],
    [
     170.4,
     -13.4
    ],
    [
     166.8,
     -15.8
    ],
    [
     160.5,
     -25.2
    ],
    [
     155.1,
     -31.0
    ],
    [
     136.0,
     -46.2
    ],
    [
     121.9,
     -54.4
    ],
    [
     114.0,
     -58.0
    ],
    [
     107.1,
     -60.6
    ],
    [
     97.0,
     -63.0
    ],
    [
     70.4,
     -73.0
    ],
    [
     62.6,
     -75.1
    ],
    [
     52.1,
     -78.8
    ],
    [
     32.2,
     -86.6
    ],
    [
     23.6,
     -90.4
    ],
    [
     18.0,
     -93.7
    ],
    [
     16.7,
     -94.6
    ],
    [
     15.0,
     -97.7
    ],
    [
     13.8,
     -98.6
    ],
    [
     -51.8,
     -116.1
    ],
    [
     -53.4,
     -116.1
    ],
    [
     -55.8,
     -114.5
    ],
    [
     -58.7,
     -113.9
    ],
    [
     -77.3,
     -115.0
    ],
    [
     -94.3,
     -118.9
    ],
    [
     -99.6,
     -119.6
    ],
    [
     -108.4,
     -122.1
    ],
    [
     -119.3,
     -123.4
    ],
    [
     -157.3,
     -133.6
    ],
    [
     -165.3,
     -134.7
    ],
    [
     -186.2,
     -140.5
    ],
    [
     -192.6,
     -141.7
    ],
    [
     -206.7,
     -142.0
    ],
    [
     -218.2,
     -140.7
    ],
    [
     -226.1,
     -137.5
    ],
    [
     -231.1,
     -134.7
    ],
    [
     -237.1,
     -129.6
    ],
    [
     -252.4,
     -109.5
    ],
    [
     -267.0,
     -82.3
    ],
    [
     -270.1,
     -80.6
    ],
    [
     -271.0,
     -79.4
    ]
   ],
   "avoid": {
    "buildings": 2,
    "props": 0.5,
    "water": 1,
    "paddocks": 1.5
   },
   "src": "User round 7 (2026-10-12): 'free the reindeer out from the paddocks and let them roam freely within the core dimensions of the resort ... within the lines which I drew'. Red outline on refs/user/feedback-round7-seasons/01-reindeer-roam-area-red-outline-topdown.webp (top-down viewer screenshot), georeferenced with tools/georef_outline.py on 38 unit number badges (auto-detected, plus the median label offset to the cabin body; manual/reindeer-roam-sketch-points.json): affine rms 0.44 m, worst 1.05 m; result manual/reindeer-roam-outline.json (87 points, 73,000 m2). The herd keeps 2 m off building footprints and off props, water and the fenced paddocks; roads are fine (user).",
   "confirm": true,
   "_confirm": "Client: do the reindeer really walk free among the cabins outside winter, and in which months? (feeding is 1 Nov-10 Apr per content.json)"
  }
 },
 "lighting": {
  "cast": {
   "look": "subtle",
   "_src": "user 2026-10-15: realistic light cast from the cabin and path lights onto the surroundings; picked the Subtle look in the preview (approved the same day)"
  },
  "soft": {
   "contact": 0.7,
   "bounce": 1,
   "radius": 2.5,
   "bounceRadius": 5,
   "trunks": 0.3,
   "trunkHeight": 2.5,
   "_src": "WS-72 option B = SOFT_LIGHT defaults (lightcast.js, WS-63); owner picked B on 2026-10-17 (\"I pick B for the soft light\"), comparison web/previews/soft/"
  },
  "baked": {
   "models": ["building:panorama-sauna", "prop:sleigh-sauna"],
   "sky": 1,
   "room": 1,
   "falloff": 1,
   "src": "Owner 2026-10-31 after the baked-light test on the Panorama Sauna: \"the baked light cast looks awesome and needs to become the standard. I think it's falloff/strength can be adjusted in the future but otherwise great\". Baked: the two saunas, whose rooms are drawn with the map's own lit materials, so their glowing ceilings now light their benches and walls. Baked too and compared at the same cameras, then left out because nothing changed on screen (by day under 0.1 % of the pixels moved, at night none): the glass cabins, the suite and tower types and the main building; their rooms behind the glass are ready-lit look-in models already (units.*.walkIn, buildings.main-building.params.interior). sky/room/falloff = 1: the look he approved (strength and falloff to be tuned later). Bake: tools/bake_light_shapes.mjs + tools/blender/bake_light.py into light/."
  }
 },
 "rideViews": {
  "reindeer-ride": {}
 },
 "walkViews": {
  "_doc": "WS-89: 'Walk the trail' on an outdoors card: a walker's eye (1.6 m) along the card's path (lazy/rideview.js walk mount; main.js walkPath). An open path is walked to its end and back.",
  "canyon-path": {
   "path": "path-mvirc2s7",
   "speed": 1.2,
   "src": "VIS-192: the owner's Canyon Path GPS track (recorded 6 May 2026), added by him in Fine-tune as a drawn trail ('AuroraVillage-Canyon path', the map's saved settings touches.paths, rev 17 of 2026-10-22; walkers on it in Life: snowshoes in winter, walking in summer and autumn). It lives in the saved settings, not in this package: without them the card has no walk button. The pin is the line's first point (the track's start); which end guests start from: confirm",
   "confirm": true
  }
 },
 "seatViews": {
  "_doc": "VIS-246: a seat inside a building, looking out (lazy/rideview.js \"Sit inside\"); eye in the place's footprint frame",
  "panorama-sauna": {
   "eye": [
    1.0,
    2.2,
    0.9
   ],
   "heading": 0,
   "pitch": -6,
   "src": "seated on the bench across the back wall, back to its slatted backrest, looking past the stove out through the glass (the owner's Panorama Sauna photos and his reading of them, chat 2026-10-31: the guests on that bench, the glass ahead); the room is tools/blender/landmarks/panorama_sauna.py room()",
   "confirm": true
  }
 },
 "tethered": [
  {
   "id": "hitching-rack-horses",
   "kind": "horse",
   "prop": "hitching-rack",
   "tack": [
    "saddle",
    "bridle"
   ],
   "animals": [
    {
     "at": [
      -4.17,
      3.96
     ],
     "rope": [
      -3.17,
      1.29,
      2.35
     ],
     "_where": "the left rack (rail on the two pines): yard side, 0.6 of the way from its gap end (pine T2) to the far pine T1; rope on the rail top (centre 1.25 m)"
    },
    {
     "at": [
      4.3,
      -0.76
     ],
     "rope": [
      3.01,
      1.17,
      -2.15
     ],
     "_where": "the right rack (rail on three posts): yard side, 2.4 m from post 1, just past post 2; rope on the rail top (centre 1.1 m)"
    }
   ],
   "seasons": null,
   "src": "The owner's chat request 2026-10-24 (two horses tied at the two hitching rails in front of the horse stable) and his screenshot marking the two spots (red circles, one behind each rail as seen from the forest side, the stable behind them). Fitted to the map: the stable (2069763581) lies 26 m from the rack at bearing 123, on the prop's front (+z, yard) side, and the three-post rack shows left of the pine rack, so the camera stood on the forest side and both circles are on the yard side of their rail. Positions in the hitching-rack prop's frame from tools/blender/landmarks/hitching_rack.py's rail geometry: each horse 1.9 m out from its rail along the rail's yard normal, facing it, its lead rope from the bridle's ring to the rail. Saddle and bridle: the owner's request and his tied-horse reference photo (bridle and halter, lead rope over a log rail).",
   "confirm": true,
   "_confirm": "Which horses and coats stand there (the model's coat mix is used); are horses tied there in winter, and only before a ride; saddled or only in halters; the lead rope's colour; exactly where along each rail."
  }
 ]
}
