[
  {
    "id": "forest/mid-oak",
    "file": "apps/mobile/src/three/scene/fields/forestFar.js:93",
    "line": "",
    "behavior": "Twelve procedural crown lobes and two branches; 992 triangles with a six-sided open trunk.",
    "fullCost": "triangles Per Tree: 12,862; crown Triangles: 12,530; wood Triangles: 332; delta Triangles Per Tree: 11,870; draws Per Species: 2",
    "after": "Replace with clearing oak crown plus eight complete wood components.",
    "rawCost": {
      "evidenceKind": "measured",
      "trianglesPerTree": 12862,
      "crownTriangles": 12530,
      "woodTriangles": 332,
      "deltaTrianglesPerTree": 11870,
      "drawsPerSpecies": 2
    }
  },
  {
    "id": "forest/far-oak",
    "file": "apps/mobile/src/three/scene/fields/forestFar.js:101",
    "line": "",
    "behavior": "Six crown lobes; 492 triangles including a six-sided trunk.",
    "fullCost": "triangles Per Tree: 12,862; delta Triangles Per Tree: 12,370; draws Per Species: 2",
    "after": "Same complete oak as the medium band, with original normals.",
    "rawCost": {
      "evidenceKind": "measured",
      "trianglesPerTree": 12862,
      "deltaTrianglesPerTree": 12370,
      "drawsPerSpecies": 2
    }
  },
  {
    "id": "forest/mid-blossom",
    "file": "apps/mobile/src/three/scene/fields/forestFar.js:108",
    "line": "",
    "behavior": "Fourteen 20-triangle pink spheres on the procedural crown; 1,272 total triangles.",
    "fullCost": "triangles Per Tree: 11,656; crown Triangles: 10,160; petal Triangles: 924; wood Triangles: 572; delta Triangles Per Tree: 10,384; draws Per Species: 3",
    "after": "Use clearing blossom crown, all selected above-crown petal components and baked wood.",
    "rawCost": {
      "evidenceKind": "measured",
      "trianglesPerTree": 11656,
      "crownTriangles": 10160,
      "petalTriangles": 924,
      "woodTriangles": 572,
      "deltaTrianglesPerTree": 10384,
      "drawsPerSpecies": 3
    }
  },
  {
    "id": "forest/far-blossom",
    "file": "apps/mobile/src/three/scene/fields/forestFar.js:243",
    "line": "",
    "behavior": "Far blossom candidates become generic 492-triangle broadleafs. Their pink petals disappear.",
    "fullCost": "triangles Per Tree: 11,656; delta Triangles Per Tree: 11,164; full Density Instances: 115; reduced Instances: 52; draws Per Species: 3",
    "after": "Keep far blossoms as the same 11,656-triangle blossom used nearer the clearing.",
    "rawCost": {
      "evidenceKind": "measured",
      "trianglesPerTree": 11656,
      "deltaTrianglesPerTree": 11164,
      "fullDensityInstances": 115,
      "reducedInstances": 52,
      "drawsPerSpecies": 3
    }
  },
  {
    "id": "forest/mid-conifer",
    "file": "apps/mobile/src/three/scene/fields/forestFar.js:119",
    "line": "",
    "behavior": "Six scalloped 14-segment cone tiers; 180 triangles with trunk.",
    "fullCost": "triangles Per Tree: 2,968; crown Triangles: 2,616; wood Triangles: 352; delta Triangles Per Tree: 2,788; draws Per Species: 2",
    "after": "Use clearing spruce foliage plus its complete baked trunk.",
    "rawCost": {
      "evidenceKind": "measured",
      "trianglesPerTree": 2968,
      "crownTriangles": 2616,
      "woodTriangles": 352,
      "deltaTrianglesPerTree": 2788,
      "drawsPerSpecies": 2
    }
  },
  {
    "id": "forest/far-conifer",
    "file": "apps/mobile/src/three/scene/fields/forestFar.js:121",
    "line": "",
    "behavior": "Five plain 10-segment cone tiers; 112 triangles with trunk.",
    "fullCost": "triangles Per Tree: 2,968; delta Triangles Per Tree: 2,856; draws Per Species: 2",
    "after": "Use the same complete spruce as the medium band.",
    "rawCost": {
      "evidenceKind": "measured",
      "trianglesPerTree": 2968,
      "deltaTrianglesPerTree": 2856,
      "drawsPerSpecies": 2
    }
  },
  {
    "id": "forest/tree-materials-and-flat-normals",
    "file": "apps/mobile/src/three/scene/fields/forestFar.js:73",
    "line": "",
    "behavior": "Procedural tree geometry discards UVs, uses generic roughness-1 untextured material and forces flat shading on far broadleafs at line 251.",
    "fullCost": "shared Rgba8With Mips Bytes: 2,796,200; incremental Texture Bytes: 0; incremental Asset Download Bytes: 0",
    "after": "Keep source UVs, normalized RGBA colours, original transformed normals, material names and source Texture objects; apply the same bark finish as near trees.",
    "rawCost": {
      "evidenceKind": "measured",
      "leafTextureDimensions": [
        512,
        512
      ],
      "barkTextureDimensions": [
        512,
        512
      ],
      "sharedRgba8WithMipsBytes": 2796200,
      "incrementalTextureBytes": 0,
      "incrementalAssetDownloadBytes": 0
    }
  },
  {
    "id": "forest/distance-band-geometry",
    "file": "apps/mobile/src/three/scene/fields/forestFar.js:229",
    "line": "",
    "behavior": "Random distance crossover at 48\u201362 m selects medium or far geometry.",
    "fullCost": "full Density Tree Triangles: 13,730,674; reduced Tree Triangles: 5,264,094; additional Geometry Lod Bytes: 0",
    "after": "Keep its random draw and planting iteration to preserve all instance matrices/colours; combine both bands into one batch per source part/species.",
    "rawCost": {
      "evidenceKind": "measured",
      "fullDensityTreeTriangles": 13730674,
      "reducedTreeTriangles": 5264094,
      "additionalGeometryLodBytes": 0
    }
  },
  {
    "id": "forest/reduced-tree-density",
    "file": "apps/mobile/src/three/scene/fields/forestFar.js:49",
    "line": "",
    "behavior": "Reduced changes keep from [.62,.3] to [.45,.3], spacing from [3.6,.03] to [4.4,.05], then removes the medium-detail band.",
    "fullCost": "full Density Trees: 1,603; reduced Trees: 618; full Density Far Triangles: 13,820,882; reduced Far Triangles: 5,280,622; restore Density And Floor Delta Triangles: 8,540,260; full Mesh Draws Before Culling: 12; reduced Mesh Draws Before Culling: 10",
    "after": "Keep 618 tree positions versus 1,603 full-density positions. Restore complete crowns, wood, UVs and textures at every retained position.",
    "rawCost": {
      "evidenceKind": "measured",
      "fullDensityTrees": 1603,
      "reducedTrees": 618,
      "fullDensityFarTriangles": 13820882,
      "reducedFarTriangles": 5280622,
      "restoreDensityAndFloorDeltaTriangles": 8540260,
      "fullMeshDrawsBeforeCulling": 12,
      "reducedMeshDrawsBeforeCulling": 10
    }
  },
  {
    "id": "forest/distance-density",
    "file": "apps/mobile/src/three/scene/fields/forestFar.js:41",
    "line": "",
    "behavior": "Spacing grows from 3.6 m at 26 m to about 7.32 m at 150 m; stand acceptance also leaves deliberate gaps.",
    "fullCost": "current Full Trees: 1,603; current Reduced Trees: 618; estimate: Keeping 3.6 m spacing at the outer radius would increase local candidate density by about (7.32/3.6)^2 = 4.13 times. Exact whole-scene count requires a new layout and clearance pass, which this patch does not perform.",
    "after": "Retain the approved planting layout; no hidden device-dependent geometry substitution.",
    "rawCost": {
      "evidenceKind": "measured current counts; estimated alternative",
      "currentFullTrees": 1603,
      "currentReducedTrees": 618,
      "estimate": "Keeping 3.6 m spacing at the outer radius would increase local candidate density by about (7.32/3.6)^2 = 4.13 times. Exact whole-scene count requires a new layout and clearance pass, which this patch does not perform."
    }
  },
  {
    "id": "forest/aerial-wash",
    "file": "apps/mobile/src/three/scene/fields/forestFar.js:60",
    "line": "",
    "behavior": "Post-lighting air blend reaches 52% at 145 m and begins at 24 m, suppressing crown cavities, grain and petal contrast.",
    "fullCost": "added Triangles: 0; added Texture Bytes: 0; added Draws: 0; uniform Count Unchanged: True; gpu Ms: None",
    "after": "Lower only the generated-tree blend ceiling to 22%; preserve hue, range, terrain, creek, near trees and sky.",
    "rawCost": {
      "evidenceKind": "measured",
      "addedTriangles": 0,
      "addedTextureBytes": 0,
      "addedDraws": 0,
      "uniformCountUnchanged": true,
      "gpuMs": null
    }
  },
  {
    "id": "forest/terrain-tessellation",
    "file": "apps/mobile/src/three/scene/fields/forestFar.js:190",
    "line": "",
    "behavior": "Terrain has 26 radial rings and 256 angular segments, increasingly coarse outer radial intervals; 12,800 triangles and 6,682 vertices on both tiers.",
    "fullCost": "current Triangles: 12,800; current Geometry Bytes: 370,808; constructed Alternative Triangles: 51,200; constructed Alternative Geometry Bytes: 1,458,372; delta Triangles: 38,400; delta Geometry Bytes: 1,087,564; alternative: Insert one ring between each existing pair and use 512 angular segments. This is a measured geometry budget, not an implemented or visually approved surface.",
    "after": "Raised from 12,800 to 51,200 triangles on the same analytic landform and seam.",
    "rawCost": {
      "evidenceKind": "measured current mesh; constructed alternative counts",
      "currentTriangles": 12800,
      "currentGeometryBytes": 370808,
      "constructedAlternativeTriangles": 51200,
      "constructedAlternativeGeometryBytes": 1458372,
      "deltaTriangles": 38400,
      "deltaGeometryBytes": 1087564,
      "alternative": "Insert one ring between each existing pair and use 512 angular segments. This is a measured geometry budget, not an implemented or visually approved surface."
    }
  },
  {
    "id": "forest/terrain-texture-extension",
    "file": "apps/mobile/src/three/scene/fields/forestFar.js:196",
    "line": "",
    "behavior": "Planar x/24,z/24 UVs extend beyond the clearing texture; clamped meadow pixels stretch over the distant landform. The terrain uses a clone of the existing meadow material at line 210.",
    "fullCost": "current Shared Rgba8With Mips Bytes: 27,962,024; incremental Current Texture Bytes: 0; estimate: A separate seamless 2048-square RGBA8 far-ground tile would add 22,369,620 bytes with mips and one material texture slot. Its encoded download size and actual visual result need an authored asset; no such asset is created here.",
    "after": "Uses the clearing colour and normal maps at the same world texel scale; a mirrored path-free patch continues across the hills. No added texture.",
    "rawCost": {
      "evidenceKind": "measured shared textures; estimated alternative",
      "currentAlbedoDimensions": [
        2048,
        2048
      ],
      "currentNormalDimensions": [
        1024,
        1024
      ],
      "currentSharedRgba8WithMipsBytes": 27962024,
      "incrementalCurrentTextureBytes": 0,
      "estimate": "A separate seamless 2048-square RGBA8 far-ground tile would add 22,369,620 bytes with mips and one material texture slot. Its encoded download size and actual visual result need an authored asset; no such asset is created here."
    }
  },
  {
    "id": "forest/far-floor-prototypes",
    "file": "apps/mobile/src/three/scene/fields/forestFar.js:271",
    "line": "",
    "behavior": "One 71-triangle clump uses six four-sided cones, three four-triangle fronds, three five-triangle leaf discs and one 20-triangle pebble. It has no source pigment texture.",
    "fullCost": "current Triangles Per Clump: 71; current Clumps: 960; current Placed Triangles: 68,160; existing Clearing Understory Foliage Triangles: 3,124; existing Clearing Understory Solid Triangles: 1,376; full Source Alternative Triangles Per Clump: 4,500; source Alternative Placed Triangles: 4,320,000; delta Triangles: 4,251,840; draws For Source Alternative: 2; incremental Source Texture Bytes: 0; alternative: Reuse the existing paired understory batches, preserving both materials and the shared 512-square leaf map. This measures source asset cost; its footprint and species differ from the far clump and require a separately approved placement fit.",
    "after": "Reuses the actual clearing understory foliage and solid pair, 4,500 triangles per clump, fitted to the old footprint. 960 placements at full density.",
    "rawCost": {
      "evidenceKind": "measured current and existing-source counts; unimplemented alternative",
      "currentTrianglesPerClump": 71,
      "currentClumps": 960,
      "currentPlacedTriangles": 68160,
      "existingClearingUnderstoryFoliageTriangles": 3124,
      "existingClearingUnderstorySolidTriangles": 1376,
      "fullSourceAlternativeTrianglesPerClump": 4500,
      "sourceAlternativePlacedTriangles": 4320000,
      "deltaTriangles": 4251840,
      "drawsForSourceAlternative": 2,
      "incrementalSourceTextureBytes": 0,
      "alternative": "Reuse the existing paired understory batches, preserving both materials and the shared 512-square leaf map. This measures source asset cost; its footprint and species differ from the far clump and require a separately approved placement fit."
    }
  },
  {
    "id": "forest/far-rock-prototype",
    "file": "apps/mobile/src/three/scene/fields/forestFar.js:290",
    "line": "",
    "behavior": "Far rocks are an untextured 80-triangle icosahedron with vertex shading; 69 instances.",
    "fullCost": "current Triangles Per Rock: 80; current Instances: 69; current Placed Triangles: 5,520; constructed Smooth Alternative Triangles Per Rock: 1,280; constructed Smooth Alternative Placed Triangles: 88,320; delta Triangles: 82,800; incremental Texture Bytes: 0; alternative: IcosahedronGeometry detail 7 is a measured 1,280-triangle budget. It only rounds the old rock and is not evidence of matching a near stone. Extracting a specific near stone remains unimplemented.",
    "after": "Extracts a complete existing clearing stone and preserves its source pigment and topology; fits the original footprint.",
    "rawCost": {
      "evidenceKind": "measured current and constructed counts; full source match unknown",
      "currentTrianglesPerRock": 80,
      "currentInstances": 69,
      "currentPlacedTriangles": 5520,
      "constructedSmoothAlternativeTrianglesPerRock": 1280,
      "constructedSmoothAlternativePlacedTriangles": 88320,
      "deltaTriangles": 82800,
      "incrementalTextureBytes": 0,
      "alternative": "IcosahedronGeometry detail 7 is a measured 1,280-triangle budget. It only rounds the old rock and is not evidence of matching a near stone. Extracting a specific near stone remains unimplemented."
    }
  },
  {
    "id": "forest/far-floor-density",
    "file": "apps/mobile/src/three/scene/fields/forestFar.js:294",
    "line": "",
    "behavior": "Clump/rock rows step 2.6 m; keep probability fades from 0.55 beyond 45 m to zero at 100 m.",
    "fullCost": "current Details: 1,029; current Triangles: 73,680; estimate: Restoring omitted vegetation outside 100 m is a new layout. At the existing 2.6 m spacing, extending to 150 m at 0.55 keep adds roughly 3,195 pre-clearance candidates. With the current 93% clump/7% rock split this is about 228,854 triangles; at 4,500 triangles per source understory clump, roughly 13.4 million triangles. These are annulus-area estimates, not placed measurements.",
    "after": "Keep approved placement and fade. Existing full density has 1,029 details, 73,680 placed triangles.",
    "rawCost": {
      "evidenceKind": "measured current scene; estimated alternative",
      "currentDetails": 1029,
      "currentTriangles": 73680,
      "estimate": "Restoring omitted vegetation outside 100 m is a new layout. At the existing 2.6 m spacing, extending to 150 m at 0.55 keep adds roughly 3,195 pre-clearance candidates. With the current 93% clump/7% rock split this is about 228,854 triangles; at 4,500 triangles per source understory clump, roughly 13.4 million triangles. These are annulus-area estimates, not placed measurements."
    }
  },
  {
    "id": "forest/reduced-floor-omission",
    "file": "apps/mobile/src/three/scene/fields/forestFar.js:49",
    "line": "",
    "behavior": "Reduced floor:false removes every clump and rock.",
    "fullCost": "restore Current Floor Triangles: 73,680; restore Current Floor Instances: 1,029; restore Current Floor Draws: 2; restore Current Floor Geometry Bytes: 16,308; restore Current Floor Instance Bytes: 78,204",
    "after": "Retain this explicit density omission; tree geometry and texture resolution remain complete.",
    "rawCost": {
      "evidenceKind": "measured",
      "restoreCurrentFloorTriangles": 73680,
      "restoreCurrentFloorInstances": 1029,
      "restoreCurrentFloorDraws": 2,
      "restoreCurrentFloorGeometryBytes": 16308,
      "restoreCurrentFloorInstanceBytes": 78204
    }
  },
  {
    "id": "forest/cloud-meshes",
    "file": "apps/mobile/src/three/scene/fields/forestFar.js:320",
    "line": "",
    "behavior": "Ten clouds each use four 80-triangle puffs; 3,200 merged unlit triangles with vertex colours and no texture.",
    "fullCost": "current Triangles: 3,200; current Geometry Bytes: 230,400; constructed Alternative Puff Triangles: 1,280; constructed Alternative Cloud Triangles: 51,200; delta Triangles: 48,000; alternative Position Color Bytes: 3,686,400; delta Position Color Bytes: 3,456,000; alternative: Replacing each puff with IcosahedronGeometry detail 7 measures smoothness cost only. It is not a newly authored high-resolution sky asset.",
    "after": "Smooth 1,280-triangle puffs replace 80-triangle puffs. Cloud locations and palette stay unchanged.",
    "rawCost": {
      "evidenceKind": "measured current and constructed counts",
      "currentTriangles": 3200,
      "currentGeometryBytes": 230400,
      "constructedAlternativePuffTriangles": 1280,
      "constructedAlternativeCloudTriangles": 51200,
      "deltaTriangles": 48000,
      "alternativePositionColorBytes": 3686400,
      "deltaPositionColorBytes": 3456000,
      "alternative": "Replacing each puff with IcosahedronGeometry detail 7 measures smoothness cost only. It is not a newly authored high-resolution sky asset."
    }
  },
  {
    "id": "forest/sky-dome",
    "file": "apps/mobile/src/three/scene/fields/forestFar.js:343",
    "line": "",
    "behavior": "The reverse-angle sky is an unlit 24 by 12 gradient sphere with 528 triangles, not the 1536-square painted near sky.",
    "fullCost": "current Triangles: 528; current Geometry Bytes: 17,468; constructed Alternative Triangles: 9,024; delta Triangles: 8,496; constructed Alternative Geometry Bytes: 263,276; delta Geometry Bytes: 245,808; current Painted Sky Rgba8With Mips Bytes: 12,582,904; incremental Existing Sky Texture Bytes: 0; alternative: 96 by 48 sphere, same gradient and radius. Gradient interpolation is already smooth; this is a concrete tessellation budget, not a demonstrated quality need.",
    "after": "Raised to 96 by 48 segments, 9,024 triangles. Painted sky image retained.",
    "rawCost": {
      "evidenceKind": "measured current and constructed counts",
      "currentTriangles": 528,
      "currentGeometryBytes": 17468,
      "constructedAlternativeTriangles": 9024,
      "deltaTriangles": 8496,
      "constructedAlternativeGeometryBytes": 263276,
      "deltaGeometryBytes": 245808,
      "currentPaintedSkyDimensions": [
        1536,
        1536
      ],
      "currentPaintedSkyRgba8WithMipsBytes": 12582904,
      "incrementalExistingSkyTextureBytes": 0,
      "alternative": "96 by 48 sphere, same gradient and radius. Gradient interpolation is already smooth; this is a concrete tessellation budget, not a demonstrated quality need."
    }
  },
  {
    "id": "forest/reduced-wind",
    "file": "apps/mobile/src/three/scene/fields/forest.js:50",
    "line": "",
    "behavior": "Reduced turns off tagged plant sway. Near foliage already behaves this way; full far crowns now inherit the same tagged foliage/wind/contour patches.",
    "fullCost": "geometry Delta: 0; texture Delta Bytes: 0; max Full Sway Meters: 0.015; full Far Crown Instances: 1,603; reduced Far Crown Instances: 618; estimate: Enabling reduced sway adds the existing wind vertex arithmetic on 618 complete crowns. Frame-time cost has not been measured.",
    "after": "Retain reduced motion policy, source geometry and maps.",
    "rawCost": {
      "evidenceKind": "measured geometry and source shader policy; timing unknown",
      "geometryDelta": 0,
      "textureDeltaBytes": 0,
      "maxFullSwayMeters": 0.015,
      "fullFarCrownInstances": 1603,
      "reducedFarCrownInstances": 618,
      "estimate": "Enabling reduced sway adds the existing wind vertex arithmetic on 618 complete crowns. Frame-time cost has not been measured."
    }
  },
  {
    "id": "forest/reduced-ground-atlas-caller",
    "file": "apps/mobile/src/three/scene/fields/forest.js:37",
    "line": "",
    "behavior": "takeForestLightAtlas disables the 1024-square field-light atlas for detail:reduced. This is a ground-lighting policy, not a far-tree texture reduction.",
    "fullCost": "atlas Rgba8With Mips Bytes: 5,592,404; incremental Geometry: 0; incremental Draws: 0; added Shader Samples Per Ground Fragment: 1; asset Download Delta: 0",
    "after": "Unchanged; implementation is outside the forest-far assignment.",
    "rawCost": {
      "evidenceKind": "measured",
      "atlasDimensions": [
        1024,
        1024
      ],
      "atlasRgba8WithMipsBytes": 5592404,
      "incrementalGeometry": 0,
      "incrementalDraws": 0,
      "addedShaderSamplesPerGroundFragment": 1,
      "assetDownloadDelta": 0
    }
  },
  {
    "id": "forest/no-global-fog",
    "file": "apps/mobile/src/three/scene/fields/forest.js:151",
    "line": "",
    "behavior": "Field fog is null; atmosphere is the tree-only air shader. Sky materials explicitly use fog:false.",
    "fullCost": "added Triangles: 0; added Texture Bytes: 0; added Draws: 0",
    "after": "Retain. No scene-wide fog, post-process blur or detail-hiding pass is added.",
    "rawCost": {
      "evidenceKind": "measured",
      "addedTriangles": 0,
      "addedTextureBytes": 0,
      "addedDraws": 0
    }
  },
  {
    "id": "farm/far-hedges",
    "file": "apps/mobile/src/three/scene/fields/farm.js:352",
    "line": "",
    "behavior": "Seven of seventeen hedge placements always select f1_hedgelo_0..2, even on full detail. Only the central ten use the finest models.",
    "fullCost": "far Base Triangles: 35,256; far After Triangles: 108,060; added Triangles Both Tiers: 72,804; extra Draw Submissions: 0; extra Texture Bytes: 0; extra GLBBytes: 0",
    "after": "All seventeen use the clearing f1_hedge_0..5 library, following the existing central variant sequence. Positions, yaw and scale stay unchanged.",
    "rawCost": {
      "evidence": "measured decoded GLB and real CPU scene",
      "farBaseTriangles": 35256,
      "farAfterTriangles": 108060,
      "addedTrianglesBothTiers": 72804,
      "extraDrawSubmissions": 0,
      "extraTextureBytes": 0,
      "extraGLBBytes": 0
    }
  },
  {
    "id": "farm/reduced-near-hedges",
    "file": "apps/mobile/src/three/scene/fields/farm.js:353",
    "line": "",
    "behavior": "Reduced detail swaps the ten central hedges for *_lo prototypes.",
    "fullCost": "base Triangles: 71,136; after Triangles: 160,064; added Triangles Reduced Only: 88,928; extra Draw Submissions: 0; extra Texture Bytes: 0",
    "after": "Use the same full prototypes as full detail.",
    "rawCost": {
      "evidence": "measured",
      "baseTriangles": 71136,
      "afterTriangles": 160064,
      "addedTrianglesReducedOnly": 88928,
      "extraDrawSubmissions": 0,
      "extraTextureBytes": 0
    }
  },
  {
    "id": "farm/reduced-fruit-trees",
    "file": "apps/mobile/src/three/scene/fields/farm.js:563",
    "line": "",
    "behavior": "Reduced detail uses f1_tree_a_lo, b_lo and c_lo.",
    "fullCost": "base Triangles: 43,330; after Triangles: 79,970; added Triangles Reduced Only: 36,640; extra Draw Submissions: 0; extra Texture Bytes: 0",
    "after": "Use full f1_tree_a, b and c on both tiers.",
    "rawCost": {
      "evidence": "measured",
      "baseTriangles": 43330,
      "afterTriangles": 79970,
      "addedTrianglesReducedOnly": 36640,
      "extraDrawSubmissions": 0,
      "extraTextureBytes": 0
    }
  },
  {
    "id": "farm/reduced-hill-clumps",
    "file": "apps/mobile/src/three/scene/fields/farm.js:576",
    "line": "",
    "behavior": "Reduced detail uses five clump_a_lo and five clump_b_lo.",
    "fullCost": "base Triangles: 29,440; after Triangles: 64,800; added Triangles Reduced Only: 35,360; extra Draw Submissions: 0; extra Texture Bytes: 0",
    "after": "Use full f1_clump_a and b on both tiers.",
    "rawCost": {
      "evidence": "measured",
      "baseTriangles": 29440,
      "afterTriangles": 64800,
      "addedTrianglesReducedOnly": 35360,
      "extraDrawSubmissions": 0,
      "extraTextureBytes": 0
    }
  },
  {
    "id": "farm/hill-dome-tessellation",
    "file": "apps/mobile/src/three/scene/fields/farm.js:569",
    "line": "",
    "behavior": "Six near hills use 40x12 hemisphere segments; three larger far hills use 40x10.",
    "fullCost": "base Triangles: 7,800; after Triangles: 54,432; added Triangles Both Tiers: 46,632; extra Draw Submissions: 0; extra Texture Bytes: 0",
    "after": "Use 96x32 hemisphere segments on all nine hills, retaining centres, dimensions and vertex-colour formula.",
    "rawCost": {
      "evidence": "measured generated geometry",
      "baseTriangles": 7800,
      "afterTriangles": 54432,
      "addedTrianglesBothTiers": 46632,
      "extraDrawSubmissions": 0,
      "extraTextureBytes": 0
    }
  },
  {
    "id": "farm/paint-only-distant-wheat",
    "file": "apps/mobile/src/three/scene/fields/farm.js:527",
    "line": "",
    "behavior": "Only wheat plots 3 and 4 receive GLB sheaves. Wheat plots 6, 7 and 11 remain painted rectangles. Plot 2 has a separate procedural low crop mass.",
    "fullCost": "added Full Copies: 98; added Full Triangles: 86,240; added Reduced Copies: 39; added Reduced Triangles: 34,320; extra Draw Submissions: 0; extra Texture Bytes: 0; extra GLBBytes: 0",
    "after": "Add the same 880-triangle wheat_clump as plots 3 and 4 to plots 6, 7 and 11. Reject candidates against all static prop bounds plus 4 cm wind clearance. Retain the painted layouts.",
    "rawCost": {
      "evidence": "measured CPU construction",
      "addedFullCopies": 98,
      "addedFullTriangles": 86240,
      "addedReducedCopies": 39,
      "addedReducedTriangles": 34320,
      "extraDrawSubmissions": 0,
      "extraTextureBytes": 0,
      "extraGLBBytes": 0
    }
  },
  {
    "id": "farm/wheat-density",
    "file": "apps/mobile/src/three/scene/fields/farm.js:528",
    "line": "",
    "behavior": "Reduced rows use 0.65 m nominal spacing rather than 0.42 m, keeping the same sheaf model.",
    "fullCost": "existing Full Copies: 73; existing Reduced Copies: 35; existing Difference Triangles: 33,440; new Full Copies: 98; new Reduced Copies: 39; new Difference Triangles: 51,920; total Difference Triangles: 85,360; extra Draw Submissions For Full: 0; extra Texture Bytes: 0",
    "after": "Preserve as the allowed phone instance-count option; apply the same choice to added far plots.",
    "rawCost": {
      "evidence": "measured geometry, density cost only",
      "existingFullCopies": 73,
      "existingReducedCopies": 35,
      "existingDifferenceTriangles": 33440,
      "newFullCopies": 98,
      "newReducedCopies": 39,
      "newDifferenceTriangles": 51920,
      "totalDifferenceTriangles": 85360,
      "extraDrawSubmissionsForFull": 0,
      "extraTextureBytes": 0
    }
  },
  {
    "id": "farm/ground-cover-density",
    "file": "apps/mobile/src/three/scene/fields/farm.js:453",
    "line": "",
    "behavior": "Reduced detail targets half as many clover, daisies and loose straw. All use the same full GLB meshes.",
    "fullCost": "difference Triangles: 18,240; extra Draw Submissions For Full: 0; extra Texture Bytes: 0",
    "after": "Preserve as the allowed phone instance-count option. Existing random placement sequence and keep-outs stay unchanged.",
    "rawCost": {
      "evidence": "measured accepted copies after clearance",
      "fullCounts": {
        "clover_clump": 30,
        "daisies_small": 14,
        "straw_scatter": 11
      },
      "reducedCounts": {
        "clover_clump": 15,
        "daisies_small": 7,
        "straw_scatter": 8
      },
      "differenceTriangles": 18240,
      "extraDrawSubmissionsForFull": 0,
      "extraTextureBytes": 0
    }
  },
  {
    "id": "farm/still-reduced-plants",
    "file": "apps/mobile/src/three/scene/fields/farm.js:610",
    "line": "",
    "behavior": "Reduced detail omits the wind deformation shader for swaying plants.",
    "fullCost": "extra Triangles For Wind: 0; extra Texture Bytes: 0; extra Draw Submissions For Wind: 0; GPUms: None; GPUms Status: unmeasured; enabling wind adds vertex shader arithmetic, not geometry",
    "after": "Preserve. Full mesh positions and normals remain; only animation work is omitted.",
    "rawCost": {
      "evidence": "source inspection",
      "extraTrianglesForWind": 0,
      "extraTextureBytes": 0,
      "extraDrawSubmissionsForWind": 0,
      "GPUms": null,
      "GPUmsStatus": "unmeasured; enabling wind adds vertex shader arithmetic, not geometry"
    }
  },
  {
    "id": "farm/windmill-speed",
    "file": "apps/mobile/src/three/scene/fields/farm.js:659",
    "line": "",
    "behavior": "Reduced windmill rotation is -0.09 t, compared with -0.18 t plus a gust term on full detail.",
    "fullCost": "silo Triangles: 9,152; windmill Body Triangles: 13,316; sail Triangles: 5,908; cost To Remove Geometry LOD: 0; extra Triangles For Full Motion: 0; GPUms: None",
    "after": "Preserve motion choice. Both tiers already use identical full windmill and sail geometry.",
    "rawCost": {
      "evidence": "decoded GLB and source inspection",
      "siloTriangles": 9152,
      "windmillBodyTriangles": 13316,
      "sailTriangles": 5908,
      "costToRemoveGeometryLOD": 0,
      "extraTrianglesForFullMotion": 0,
      "GPUms": null
    }
  },
  {
    "id": "farm/baked-ground-light",
    "file": "apps/mobile/src/three/scene/fields/farm.js:63",
    "line": "",
    "behavior": "Reduced detail detaches the 512x512 atlas without binding it. On #269 only full/default-A can bind it after the farmLight layout-key guard.",
    "fullCost": "embedded Atlas Width: 512; embedded Atlas Height: 512; embedded PNGBytes: 50,361; extra Geometry For Matching Rebake: 0; matching Rebake Bytes: None; rebake Status: not performed; would change the protected GLB and farmLight.js outside this patch; RGBA8Mip Allocation Estimate Bytes: 1,398,100",
    "after": "Ground-light image rebaked from upgraded geometry at the original 512px resolution. Layout guard is updated only to the measured matching key 66180278. Every non-atlas GLB binary byte is identical.",
    "rawCost": {
      "evidence": "measured compiled CPU shader uniforms and GLB PNG header",
      "embeddedAtlasWidth": 512,
      "embeddedAtlasHeight": 512,
      "embeddedPNGBytes": 50361,
      "extraGeometryForMatchingRebake": 0,
      "matchingRebakeBytes": null,
      "rebakeStatus": "not performed; would change the protected GLB and farmLight.js outside this patch",
      "RGBA8MipAllocationEstimateBytes": 1398100
    }
  },
  {
    "id": "farm/mid-ground-texel-density",
    "file": "apps/mobile/src/three/scene/fields/farm.js:281",
    "line": "",
    "behavior": "Near and fields maps both use 2048x2048 pixels, covering 13.2 m and 38 m respectively. The fields map has about one third the texels per metre.",
    "fullCost": "near Texels Per Metre: 155.15151515151516; fields Texels Per Metre: 53.89473684210526; pixels For Equal Density: 5,896; example6144Fields Map Estimate Bytes: 201,326,584; current2048Fields Map Estimate Bytes: 22,369,620; example Extra Estimate Bytes: 178,956,964; encoded Download Delta: None; download Status: unknown until a real bake; not included",
    "after": "Repainted the fields map at 6144px instead of 2048px, matching the clearing map world texel density within 4.3%. Full field maps selected on all tiers.",
    "rawCost": {
      "evidence": "measured manifest dimensions; analytic memory estimate assumes RGBA8 with complete mips",
      "nearTexelsPerMetre": 155.15151515151516,
      "fieldsTexelsPerMetre": 53.89473684210526,
      "pixelsForEqualDensity": 5896,
      "example6144FieldsMapEstimateBytes": 201326584,
      "current2048FieldsMapEstimateBytes": 22369620,
      "exampleExtraEstimateBytes": 178956964,
      "encodedDownloadDelta": null,
      "downloadStatus": "unknown until a real bake; not included"
    }
  },
  {
    "id": "farm/ground-surface-meshes",
    "file": "apps/mobile/src/three/scene/fields/farm.js:309",
    "line": "",
    "behavior": "Near ground is a 64-triangle disc. Fields are a 48x4 ring and the untextured far ground a 40x2 ring with broad vertex-colour haze.",
    "fullCost": "near Triangles: 64; fields Triangles: 384; far Triangles: 160; uniform64Angular Segments Total Triangles: 832; uniform64Added Triangles: 224; extra Texture Bytes: 0",
    "after": "Outer ring now samples clearing grass at the same world texel density; keeps the original bright haze palette. Flat surface has 2,048 triangles instead of 160.",
    "rawCost": {
      "evidence": "measured generated geometry; hypothetical common 64 angular segments",
      "nearTriangles": 64,
      "fieldsTriangles": 384,
      "farTriangles": 160,
      "uniform64AngularSegmentsTotalTriangles": 832,
      "uniform64AddedTriangles": 224,
      "extraTextureBytes": 0
    }
  },
  {
    "id": "farm/near-wheat-mass",
    "file": "apps/mobile/src/three/scene/fields/farm.js:541",
    "line": "",
    "behavior": "Plot 2 behind the hedge is a 132x18 procedural row surface, 0.3 m nominal height. It is intentionally a low continuous crop mass at the gameplay top band.",
    "fullCost": "triangles: 4,752; extra For Retaining Clearing: 0; standalone Sheaf Triangles: 880; uniform042Spacing Candidate Sheaves: 55; candidate Sheaf Triangles Estimate: 48,400; limitation: 55 is an analytic unfiltered grid count, not a clipped placement or an approved replacement",
    "after": "Retain the clearing appearance and current clearance. Full wheat geometry is reused in the distant standing-sheaf plots, not added above this low mass.",
    "rawCost": {
      "evidence": "measured generated geometry",
      "triangles": 4752,
      "extraForRetainingClearing": 0,
      "standaloneSheafTriangles": 880,
      "uniform042SpacingCandidateSheaves": 55,
      "candidateSheafTrianglesEstimate": 48400,
      "limitation": "55 is an analytic unfiltered grid count, not a clipped placement or an approved replacement"
    }
  },
  {
    "id": "farm/scarecrow-and-fence",
    "file": "apps/mobile/src/three/scene/fields/farm.js:482",
    "line": "",
    "behavior": "Scarecrow uses small procedural ellipsoids, tubes and lathed hat surfaces; fence rails are procedural farmRail meshes. They do not switch models with distance or detail.",
    "fullCost": "veg And Scarecrow Triangles: 20,378; fence And Hedge Triangles After: 322,368; extra Triangles For Removing LODSwitch: 0",
    "after": "Retain approved shapes and transforms. Smoothing these is separate from removing far foliage LOD.",
    "rawCost": {
      "evidence": "measured sections and source inspection",
      "vegAndScarecrowTriangles": 20378,
      "fenceAndHedgeTrianglesAfter": 322368,
      "extraTrianglesForRemovingLODSwitch": 0
    }
  },
  {
    "id": "farm/sky-and-clouds",
    "file": "apps/mobile/src/three/scene/fields/farm.js:144",
    "line": "",
    "behavior": "Farm sky uses a 16x10 dome. Each cloud has an 18x9 central ellipsoid and two 9x5 side ellipsoids. These counts are identical on both tiers.",
    "fullCost": "sky Triangles: 288; cloud Triangles: 864; hypothetical Sky64x32Triangles: 3,968; hypothetical Sky Added Triangles: 3,680; hypothetical All Cloud Lobes18x9Triangles: 1,728; hypothetical Cloud Added Triangles: 864; extra Textures: 0",
    "after": "Retain the pastel sky, cloud positions and approved soft cloud forms.",
    "rawCost": {
      "evidence": "measured scene; hypothetical uniform sky and cloud tessellation costs are analytic",
      "skyTriangles": 288,
      "cloudTriangles": 864,
      "hypotheticalSky64x32Triangles": 3968,
      "hypotheticalSkyAddedTriangles": 3680,
      "hypotheticalAllCloudLobes18x9Triangles": 1728,
      "hypotheticalCloudAddedTriangles": 864,
      "extraTextures": 0
    }
  },
  {
    "id": "farm/full-silo-windmill",
    "file": "apps/mobile/src/three/scene/fields/farm.js:582",
    "line": "",
    "behavior": "The silo, windmill body and rotating sails already place the sole full library models. There are no lo aliases or distance switches.",
    "fullCost": "silo Triangles: 9,152; windmill Body Triangles: 13,316; sail Triangles: 5,908; total Triangles: 28,376; extra Triangles: 0; extra GLBBytes: 0",
    "after": "Reuse without resampling or changing the GLB.",
    "rawCost": {
      "evidence": "decoded GLB and actual merged-index/position match",
      "siloTriangles": 9152,
      "windmillBodyTriangles": 13316,
      "sailTriangles": 5908,
      "totalTriangles": 28376,
      "extraTriangles": 0,
      "extraGLBBytes": 0
    }
  },
  {
    "id": "farm/external-life-tier",
    "file": "apps/mobile/src/three/scene/fields/farm.js:654",
    "line": "",
    "behavior": "createFarmLife receives opts unchanged. Its own module omits the life batch on reduced detail.",
    "fullCost": "full Life Triangles: 48; reduced Life Triangles: 0; full Life Draw Submission Upper Bound: 1; texture Bytes: 0; extra For Changing This Lane: 0",
    "after": "Inventory boundary only. farmLife.js and life/FX were excluded from this lane.",
    "rawCost": {
      "evidence": "measured current scene geometry",
      "fullLifeTriangles": 48,
      "reducedLifeTriangles": 0,
      "fullLifeDrawSubmissionUpperBound": 1,
      "textureBytes": 0,
      "extraForChangingThisLane": 0
    }
  },
  {
    "id": "farm/external-texture-tier",
    "file": "apps/mobile/src/three/scene/fields/farm.js:150",
    "line": "",
    "behavior": "paintedTexture is called with the existing farm-ground ids. platform/textures.ts selects full or half baked images through its global scale, ignoring the painter size at runtime.",
    "fullCost": "full Ground Encoded Bytes: 421,735; half Ground Encoded Bytes: 138,285; full Ground Mip Estimate Bytes: 44,739,240; half Ground Mip Estimate Bytes: 11,184,808; estimated Difference Bytes: 33,554,432; full Extra Encoded Bytes: 283,450",
    "after": "Field maps always use full sources, independent of the actor/FX tier. Farm fields map is now 6144px.",
    "rawCost": {
      "evidence": "measured baked files and manifest dimensions; memory is analytic RGBA8 plus mips",
      "fullGroundMapDimensions": [
        2048,
        2048
      ],
      "halfGroundMapDimensions": [
        1024,
        1024
      ],
      "fullGroundEncodedBytes": 421735,
      "halfGroundEncodedBytes": 138285,
      "fullGroundMipEstimateBytes": 44739240,
      "halfGroundMipEstimateBytes": 11184808,
      "estimatedDifferenceBytes": 33554432,
      "fullExtraEncodedBytes": 283450
    }
  },
  {
    "id": "farm/shot-visibility-guards",
    "file": "apps/mobile/src/three/scene/fields/farm.js:65",
    "line": "",
    "behavior": "edgeSafe can omit a whole prop crossing a gameplay frame edge; hidden keeps selected flowers and grass out of gameplay shots. The same guards run on both detail tiers.",
    "fullCost": "existing Standing Wheat Unfiltered Candidates Full: 84; existing Standing Wheat Accepted Full: 73; existing Standing Wheat Unfiltered Candidates Reduced: 40; existing Standing Wheat Accepted Reduced: 35; new Far Wheat Unfiltered Candidates Full: 200; new Far Wheat Accepted Full: 98; new Far Wheat Unfiltered Candidates Reduced: 82; new Far Wheat Accepted Reduced: 39; upper Bound New Far Triangles Without Either Guard Full: 176,000; upper Bound New Far Triangles Without Either Guard Reduced: 72,160; limitation: New far candidates are rejected for both shot edges and prop clearance. Removing clearance is not authorized. These upper bounds are not a proposed placement or measured render cost.; extra Texture Bytes: 0",
    "after": "Retain the existing camera-derived placement rules. Full mesh quality does not remove these layout safeguards.",
    "rawCost": {
      "evidence": "source counts and analytic upper bounds, not rendered visibility",
      "existingStandingWheatUnfilteredCandidatesFull": 84,
      "existingStandingWheatAcceptedFull": 73,
      "existingStandingWheatUnfilteredCandidatesReduced": 40,
      "existingStandingWheatAcceptedReduced": 35,
      "newFarWheatUnfilteredCandidatesFull": 200,
      "newFarWheatAcceptedFull": 98,
      "newFarWheatUnfilteredCandidatesReduced": 82,
      "newFarWheatAcceptedReduced": 39,
      "upperBoundNewFarTrianglesWithoutEitherGuardFull": 176000,
      "upperBoundNewFarTrianglesWithoutEitherGuardReduced": 72160,
      "limitation": "New far candidates are rejected for both shot edges and prop clearance. Removing clearance is not authorized. These upper bounds are not a proposed placement or measured render cost.",
      "extraTextureBytes": 0
    }
  },
  {
    "id": "shared/web-dpr-cap",
    "file": "apps/mobile/src/three/quality.ts:38; apps/mobile/src/three/quality.ts:39; apps/mobile/src/three/quality.ts:40; apps/mobile/src/three/platform/webHost.ts:16",
    "line": "",
    "behavior": "Web caps DPR at controller DPR 1 / 1.5 / 2. Low also skips correction for CSS column scaling.",
    "fullCost": "formula: Framebuffer pixels scale as (newDpr / oldDpr)^2, multiplied by shown()^2 where low previously skipped it. At native DPR 3, former high DPR 2 to full is 2.25x pixels; former low DPR 1 to full is 9x. Balanced phone DPR 1.5 vs full DPR 3 is one quarter the pixels.",
    "after": "Full uses device DPR. Balanced caps only forest phones at 1.5; farm, desktop and tablet retain device DPR. Home and table notify the adapter on field changes.",
    "rawCost": {
      "formula": "Framebuffer pixels scale as (newDpr / oldDpr)^2, multiplied by shown()^2 where low previously skipped it. At native DPR 3, former high DPR 2 to full is 2.25x pixels; former low DPR 1 to full is 9x. Balanced phone DPR 1.5 vs full DPR 3 is one quarter the pixels."
    }
  },
  {
    "id": "shared/frame-cap-30",
    "file": "apps/mobile/src/three/quality.ts:38; apps/mobile/src/three/platform/webHost.ts:11; apps/mobile/src/three/platform/frameScheduler.ts:10",
    "line": "",
    "behavior": "Low requests 30 fps. Other tiers request 60 fps.",
    "fullCost": "formula: 60 vs 30 doubles maximum frame submissions per second. Achieved fps is unmeasured.",
    "after": "Web adapter always returns maxFps 60, including saved/manual/adaptive low. Native retains controller 30/60 caps.",
    "rawCost": {
      "formula": "60 vs 30 doubles maximum frame submissions per second. Achieved fps is unmeasured."
    }
  },
  {
    "id": "shared/initial-saved-manual-tier",
    "file": "apps/mobile/src/three/quality.ts:49; apps/mobile/src/three/quality.ts:52; apps/mobile/src/three/quality.ts:62; apps/mobile/src/three/quality.ts:167; apps/mobile/src/three/quality.ts:177",
    "line": "",
    "behavior": "RAM <= 3 GiB, <= 2 cores or listed old/software GPUs choose low. Strong hints choose high; other hints choose mid. Saved/manual tier can select low independent of current hardware.",
    "fullCost": "behavior: Higher tier also increases particles, textures, MSAA and field detail under the original controller.",
    "after": "Controller, storage fingerprint and override behavior unchanged. Web adapter changes only dpr, maxFps and fieldDetail. Tier, particles, textureScale and msaa are preserved.",
    "rawCost": {
      "behavior": "Higher tier also increases particles, textures, MSAA and field detail under the original controller."
    }
  },
  {
    "id": "shared/adaptive-dpr-tier",
    "file": "apps/mobile/src/three/quality.ts:133; apps/mobile/src/three/quality.ts:143; apps/mobile/src/three/quality.ts:144; apps/mobile/src/three/quality.ts:159",
    "line": "",
    "behavior": "Active slow-frame p90 reduces DPR 2 -> 1.5 -> 1, then lowers the tier. Sustained fast frames recover, with upgrade backoff.",
    "fullCost": "behavior: Original controller budgets remain 30 fps for low and 60 for mid/high. Workload changes may still adjust actor/FX tier.",
    "after": "Internals and pure quality tests untouched. Web field DPR/detail/frame target do not downgrade with those notifications; mapped onChange agrees with mapped settings().",
    "rawCost": {
      "behavior": "Original controller budgets remain 30 fps for low and 60 for mid/high. Workload changes may still adjust actor/FX tier."
    }
  },
  {
    "id": "shared/painted-map-half-resolution",
    "file": "apps/mobile/src/three/platform/textures.ts:21; apps/mobile/src/three/platform/textures.ts:28; apps/mobile/src/three/platform/textures.ts:35; apps/mobile/src/three/platform/baked-assets.ts:5",
    "line": "",
    "behavior": "One global requestedScale originally selected full or half sources for every prepared painted map, and the same global scale controlled lookup.",
    "fullCost": "formula: Half means width/2 and height/2: full has 4x texels. Costs are for all prepared maps of the selected field. GPU estimates only apply to maps actually bound/uploaded.",
    "after": "Patched using one per-ID function for prepare cache keys, pending keys, lookup and localization key. All seven forest-/farm-prefixed maps use scale 1 on web/native. Thirteen other baked IDs still follow requestedScale. No half-source retry or fallback.",
    "rawCost": {
      "field_totals": {
        "forest": {
          "full": {
            "download_bytes": 390212,
            "rgba8_base_bytes": 21041152,
            "rgba8_mipmap_estimate_bytes": 28054869.333333332
          },
          "half": {
            "download_bytes": 156963,
            "rgba8_base_bytes": 5260288,
            "rgba8_mipmap_estimate_bytes": 7013717.333333333
          },
          "download_delta_bytes": 233249,
          "rgba8_base_delta_bytes": 15780864
        },
        "farm": {
          "full": {
            "download_bytes": 425741,
            "rgba8_base_bytes": 33570816,
            "rgba8_mipmap_estimate_bytes": 44761088.0
          },
          "half": {
            "download_bytes": 139663,
            "rgba8_base_bytes": 8392704,
            "rgba8_mipmap_estimate_bytes": 11190272.0
          },
          "download_delta_bytes": 286078,
          "rgba8_base_delta_bytes": 25178112
        }
      },
      "formula": "Half means width/2 and height/2: full has 4x texels. Costs are for all prepared maps of the selected field. GPU estimates only apply to maps actually bound/uploaded."
    }
  },
  {
    "id": "shared/authored-bake-size-encoding",
    "file": "apps/mobile/src/three/scene/fields/farm.js:215; apps/mobile/src/three/scene/fields/farm.js:281; apps/mobile/scripts/bake-scene-textures.mjs:52; apps/mobile/scripts/lib/baked-textures.mjs:7",
    "line": "",
    "behavior": "Full means the authored bitmap dimensions, at most 2048x2048 for current painted field maps. Half sources are authored by canvas downsampling. Opaque maps are JPEG quality 90 with 4:4:4 chroma, alpha maps PNG.",
    "fullCost": "behavior: Removing half selection restores authored texels, not lost JPEG information or extra source detail. Doubling authored width/height would quadruple texels and needs a separate approved bake.",
    "after": "Farm fields image repainted at 6144px, JPEG quality 90 and 4:4:4. Other authored field images retained at full resolution.",
    "rawCost": {
      "behavior": "Removing half selection restores authored texels, not lost JPEG information or extra source detail. Doubling authored width/height would quadruple texels and needs a separate approved bake."
    }
  },
  {
    "id": "shared/embedded-field-map-limits",
    "file": "apps/mobile/src/three/platform/assets.ts:12; apps/mobile/src/three/platform/assets.native.ts:39; apps/mobile/src/three/scene/fields/forest-light-bake/pack.mjs:111; apps/mobile/src/three/scene/fields/lookdev-light/pack-farm.mjs:91",
    "line": "",
    "behavior": "Both platforms load the same whole field GLB with its embedded image sizes. Forest embedded images range from 128 to 2048 pixels; Farm atlas is 512x512. Farm packing explicitly resizes only that atlas to 512; Forest atlas is asserted 1024.",
    "fullCost": "behavior: GLB downloads are unchanged by textureScale and this patch. Raising these authored limits requires new source assets, outside this lane.",
    "after": "Embedded maps stay full resolution. Farm 512px light image rebaked for upgraded geometry; no other embedded image/geometry is changed.",
    "rawCost": {
      "field_glbs": [
        {
          "field": "forest",
          "file": "apps/mobile/assets/forest/forest.glb",
          "download_bytes": 14954580,
          "images": [
            {
              "index": 0,
              "name": "forest-contact-shadow",
              "mime": "image/png",
              "embedded_bytes": 7480,
              "dimensions": [
                128,
                128
              ],
              "rgba8_base_bytes": 65536
            },
            {
              "index": 1,
              "name": "leaf-pigment",
              "mime": "image/png",
              "embedded_bytes": 60980,
              "dimensions": [
                512,
                512
              ],
              "rgba8_base_bytes": 1048576
            },
            {
              "index": 2,
              "name": "forest-path-normal",
              "mime": "image/png",
              "embedded_bytes": 457213,
              "dimensions": [
                1024,
                1024
              ],
              "rgba8_base_bytes": 4194304
            },
            {
              "index": 3,
              "name": "woodland-textured-path",
              "mime": "image/jpeg",
              "embedded_bytes": 267545,
              "dimensions": [
                2048,
                2048
              ],
              "rgba8_base_bytes": 16777216
            },
            {
              "index": 4,
              "name": "soft-blue-sky",
              "mime": "image/png",
              "embedded_bytes": 44783,
              "dimensions": [
                1536,
                1536
              ],
              "rgba8_base_bytes": 9437184
            },
            {
              "index": 5,
              "name": "bark-pigment",
              "mime": "image/png",
              "embedded_bytes": 38381,
              "dimensions": [
                512,
                512
              ],
              "rgba8_base_bytes": 1048576
            },
            {
              "index": 6,
              "name": "Field light atlas",
              "mime": "image/png",
              "embedded_bytes": 331003,
              "dimensions": [
                1024,
                1024
              ],
              "rgba8_base_bytes": 4194304
            }
          ]
        },
        {
          "field": "farm",
          "file": "apps/mobile/assets/farm/farm.glb",
          "download_bytes": 2496116,
          "images": [
            {
              "index": 0,
              "name": "Field light atlas",
              "mime": "image/png",
              "embedded_bytes": 50361,
              "dimensions": [
                512,
                512
              ],
              "rgba8_base_bytes": 1048576
            }
          ]
        }
      ],
      "behavior": "GLB downloads are unchanged by textureScale and this patch. Raising these authored limits requires new source assets, outside this lane."
    }
  },
  {
    "id": "shared/hardware-texture-framebuffer-limits",
    "file": "apps/mobile/src/three/platform/webHost.ts:12; apps/mobile/src/three/platform/nativeHost.ts:19; apps/mobile/src/three/platform/nativeHost.ts:22; package-lock.json:13488",
    "line": "",
    "behavior": "The app delegates texture upload and backing-buffer allocation to Three 0.186.1 / the device GL implementation. No app maxTextureSize setting was found. Authored dimensions remain bounded by MAX_TEXTURE_SIZE; framebuffer dimensions also have device limits.",
    "fullCost": "behavior: Hardware limit is not measured in this read/write-only lane. Lead must record renderer.capabilities.maxTextureSize and actual texture/backing-buffer dimensions on M1/native before claiming GPU full resolution.",
    "after": "No hardware bypass or hidden full-to-half fallback added. Third-party Three source is not installed in the inspected checkout or the two alternate clones searched, so renderer downsize behavior was not source-verified here. An upload/allocation limit remains an explicit concern, not a claimed pass.",
    "rawCost": {
      "behavior": "Hardware limit is not measured in this read/write-only lane. Lead must record renderer.capabilities.maxTextureSize and actual texture/backing-buffer dimensions on M1/native before claiming GPU full resolution."
    }
  },
  {
    "id": "shared/mip-filter-anisotropy",
    "file": "apps/mobile/src/three/platform/embedded-images.js:25; apps/mobile/src/three/platform/embedded-images.js:27; apps/mobile/src/three/scene/fields/common.js:34; apps/mobile/src/three/scene/fields/farm.js:154",
    "line": "",
    "behavior": "Distance/oblique minification uses texture mip/filter settings. Native GLB sampler default is LinearMipmapLinearFilter; Farm ground anisotropy is 8, shared ground helper is 4. Hardware may cap anisotropy.",
    "fullCost": "formula: An RGBA8 mip chain costs approximately 4/3 of base-level bytes. More anisotropic sampling costs texture fetch bandwidth; measured GPU cost unavailable.",
    "after": "Unchanged. Full asset selection preserves mip filtering rather than disabling minification or fabricating detail. GLB sampler settings are retained.",
    "rawCost": {
      "formula": "An RGBA8 mip chain costs approximately 4/3 of base-level bytes. More anisotropic sampling costs texture fetch bandwidth; measured GPU cost unavailable."
    }
  },
  {
    "id": "shared/native-dpr-frame-target",
    "file": "apps/mobile/src/three/platform/nativeHost.ts:14; apps/mobile/src/three/platform/nativeHost.ts:19; apps/mobile/src/three/platform/nativeHost.ts:22",
    "line": "",
    "behavior": "Native renders into a capped intermediate target at min(renderer native DPR, quality DPR). Target format is half-float if EXT_color_buffer_float exists, otherwise unsigned byte; MSAA samples are 4 or 0.",
    "fullCost": "formula: At native DPR 3, removing low DPR 1 cap would be 9x target pixels; mid 1.5 to 3 would be 4x. Half-float color is 8 bytes/pixel before depth/MSAA; RGBA8 is 4.",
    "after": "Deliberately unchanged. Native has no URL field mode. Full field painted assets still apply there through per-ID selection.",
    "rawCost": {
      "formula": "At native DPR 3, removing low DPR 1 cap would be 9x target pixels; mid 1.5 to 3 would be 4x. Half-float color is 8 bytes/pixel before depth/MSAA; RGBA8 is 4."
    }
  },
  {
    "id": "shared/native-loaded-settings",
    "file": "apps/mobile/src/three/platform/nativeHost.ts:9; apps/mobile/src/three/platform/nativeHost.ts:11; apps/mobile/src/three/platform/nativeHost.ts:57; apps/mobile/src/three/platform/nativeHost.ts:61",
    "line": "",
    "behavior": "Structural settings are held until a different field prepares; DPR and maxFps remain live. Non-field textures may stay half until the next field load after an upgrade.",
    "fullCost": "behavior: Reloading all structural settings mid-scene would require rebuilding materials/meshes and can increase residency.",
    "after": "Unchanged. No global textureScale rewrite; loadedSettings still controls actor/FX requestedScale while field IDs always load full maps. Native reduced field geometry/light/motion may persist.",
    "rawCost": {
      "behavior": "Reloading all structural settings mid-scene would require rebuilding materials/meshes and can increase residency."
    }
  },
  {
    "id": "shared/forest-atlas-low-omission",
    "file": "apps/mobile/src/three/scene/fields/forestLight.js:7; apps/mobile/src/three/scene/fields/forestLight.js:21; apps/mobile/src/three/scene/fields/forest.js:37",
    "line": "",
    "behavior": "Reduced detail detaches the carrier and returns no light atlas. Vertex AO/contact decals remain; embedded bytes can still download/decode.",
    "fullCost": "embedded bytes: 331,003; rgba8 base bytes: 4,194,304; rgba8 mipmap estimate bytes: 5,592,405.333333333; shader: Ground gets one additional atlas texture2D lookup. No extra draw needed. GLB download already includes the atlas.",
    "after": "Web fieldDetail full enables existing atlas when carrier/map exists. Native low still omits the binding. Carrier absence behavior in field-owned code is unchanged.",
    "rawCost": {
      "embedded_bytes": 331003,
      "rgba8_base_bytes": 4194304,
      "rgba8_mipmap_estimate_bytes": 5592405.333333333,
      "shader": "Ground gets one additional atlas texture2D lookup. No extra draw needed. GLB download already includes the atlas."
    }
  },
  {
    "id": "shared/farm-atlas-low-omission",
    "file": "apps/mobile/src/three/scene/fields/farmLight.js:7; apps/mobile/src/three/scene/fields/farmLight.js:38; apps/mobile/src/three/scene/fields/farm.js:63",
    "line": "",
    "behavior": "Reduced detail never exposes Farm atlas to renderer; GLB still carries its bytes.",
    "fullCost": "embedded bytes: 50,361; rgba8 base bytes: 1,048,576; rgba8 mipmap estimate bytes: 1,398,101.3333333333; shader: One ground atlas sample, no extra draw. Embedded download unchanged.",
    "after": "Web fieldDetail full enables the existing atlas subject to its authored layout guard. Native low omission unchanged.",
    "rawCost": {
      "embedded_bytes": 50361,
      "rgba8_base_bytes": 1048576,
      "rgba8_mipmap_estimate_bytes": 1398101.3333333333,
      "shader": "One ground atlas sample, no extra draw. Embedded download unchanged."
    }
  },
  {
    "id": "shared/farm-atlas-layout-guard",
    "file": "apps/mobile/src/three/scene/fields/farmLight.js:46; apps/mobile/src/three/scene/fields/farmLight.js:47",
    "line": "",
    "behavior": "Full atlas is valid only for seats A, modelScale 0.85, sideTurn 22, angles 0/135/180/225 and placement hash ec769aaf. Other layouts omit it.",
    "fullCost": "behavior: Forcing it onto mismatching geometry would produce wrong shadows, not higher quality.",
    "after": "New atlas and exact matching layout key 66180278. Guard stays active for layout changes; full/default A binds this image.",
    "rawCost": {
      "behavior": "Forcing it onto mismatching geometry would produce wrong shadows, not higher quality."
    }
  },
  {
    "id": "shared/forest-low-far-density",
    "file": "apps/mobile/src/three/scene/fields/forest.js:112; apps/mobile/src/three/scene/fields/forestFar.js:49",
    "line": "",
    "behavior": "At #269 base, reduced detail lowers keep from [0.62,0.3] to [0.45,0.3], grows spacing [3.6,0.03] -> [4.4,0.05], removes medium band and floor details.",
    "fullCost": "behavior: Full restores denser tree/floor instances. Exact triangle/draw/frame cost depends on seed, blockers and the forest worker replacement; not measured.",
    "after": "Full web modes select full density. Direct/native reduced option retains fewer instances of exactly the same complete clearing models.",
    "rawCost": {
      "behavior": "Full restores denser tree/floor instances. Exact triangle/draw/frame cost depends on seed, blockers and the forest worker replacement; not measured."
    }
  },
  {
    "id": "shared/forest-base-distance-prototypes",
    "file": "apps/mobile/src/three/scene/fields/forestFar.js:41; apps/mobile/src/three/scene/fields/forestFar.js:92; apps/mobile/src/three/scene/fields/forestFar.js:122; apps/mobile/src/three/scene/fields/forestFar.js:229; apps/mobile/src/three/scene/fields/forestFar.js:243",
    "line": "",
    "behavior": "At base, trees change probabilistically from mid to far prototypes over 48-62 m. Broadleaf crowns use 12 vs 6 lobes, conifers 6/14 vs 5/10 tiers/segments, far blossoms merge to broadleaves. This is geometry reduction by distance, with no billboard.",
    "fullCost": "behavior: Keeping near prototypes would add triangles/vertex/shader work. Static prototype counts below are for Farm only; the Forest lane owns its revised numbers.",
    "after": "All distance bands use complete clearing oak, blossom and spruce geometry, UVs and maps, including trunks and petals.",
    "rawCost": {
      "behavior": "Keeping near prototypes would add triangles/vertex/shader work. Static prototype counts below are for Farm only; the Forest lane owns its revised numbers."
    }
  },
  {
    "id": "shared/forest-base-distance-density",
    "file": "apps/mobile/src/three/scene/fields/forestFar.js:223; apps/mobile/src/three/scene/fields/forestFar.js:294; apps/mobile/src/three/scene/fields/forestFar.js:298",
    "line": "",
    "behavior": "Base tree candidate spacing grows with radius to 150 m; floor detail probability fades from 45 to 100 m and stops at 100 m.",
    "fullCost": "behavior: Removing spacing/fade increases instance count and rendered triangles. Exact resulting count is field-worker-owned and unmeasured.",
    "after": "Field-owned, unchanged here. The phone density seam is the web adapter fieldDetail selection; it does not change texture resolution.",
    "rawCost": {
      "behavior": "Removing spacing/fade increases instance count and rendered triangles. Exact resulting count is field-worker-owned and unmeasured."
    }
  },
  {
    "id": "shared/forest-low-wind-life",
    "file": "apps/mobile/src/three/scene/fields/forest.js:50; apps/mobile/src/three/scene/fields/forestLife.js:100",
    "line": "",
    "behavior": "Reduced opts omit foliage wind deformation and ambient life; missing board.isFree also omits life.",
    "fullCost": "behavior: Full adds wind vertex calculations plus the field life batch. No asset download change for the procedural life; exact frame/triangle cost unmeasured.",
    "after": "Full web detail selects existing full behavior. Native reduced behavior unchanged. No actor or FX-family edits.",
    "rawCost": {
      "behavior": "Full adds wind vertex calculations plus the field life batch. No asset download change for the procedural life; exact frame/triangle cost unmeasured."
    }
  },
  {
    "id": "shared/farm-low-prototype-substitution",
    "file": "apps/mobile/src/three/scene/fields/farm.js:353; apps/mobile/src/three/scene/fields/farm.js:563; apps/mobile/src/three/scene/fields/farm.js:576",
    "line": "",
    "behavior": "Reduced opts select _lo versions of near hedge, fruit trees and hill clumps. Coarser models are present in the same GLB.",
    "fullCost": "behavior: Full per-copy triangle delta is full minus matching _lo entry. Draws may stay merged; total depends on placements. Download does not grow because both variants are in one GLB.",
    "after": "Both direct/native detail tiers use full clearing hedge, tree and clump models. No coarse prototype is placed.",
    "rawCost": {
      "per_prototype_triangles": [
        {
          "name": "f1_bush_0",
          "triangles": 17512
        },
        {
          "name": "f1_bush_1",
          "triangles": 12872
        },
        {
          "name": "f1_clump_a",
          "triangles": 6752
        },
        {
          "name": "f1_clump_a_lo",
          "triangles": 3136
        },
        {
          "name": "f1_clump_b",
          "triangles": 6208
        },
        {
          "name": "f1_clump_b_lo",
          "triangles": 2752
        },
        {
          "name": "f1_hedge_0",
          "triangles": 13120
        },
        {
          "name": "f1_hedge_0_lo",
          "triangles": 5920
        },
        {
          "name": "f1_hedge_1",
          "triangles": 16096
        },
        {
          "name": "f1_hedge_1_lo",
          "triangles": 7360
        },
        {
          "name": "f1_hedge_2",
          "triangles": 18496
        },
        {
          "name": "f1_hedge_2_lo",
          "triangles": 8352
        },
        {
          "name": "f1_hedge_3",
          "triangles": 13928
        },
        {
          "name": "f1_hedge_3_lo",
          "triangles": 5928
        },
        {
          "name": "f1_hedge_4",
          "triangles": 16004
        },
        {
          "name": "f1_hedge_4_lo",
          "triangles": 7108
        },
        {
          "name": "f1_hedge_5",
          "triangles": 17896
        },
        {
          "name": "f1_hedge_5_lo",
          "triangles": 7720
        },
        {
          "name": "f1_hedgelo_0",
          "triangles": 4696
        },
        {
          "name": "f1_hedgelo_1",
          "triangles": 5372
        },
        {
          "name": "f1_hedgelo_2",
          "triangles": 5212
        },
        {
          "name": "f1_tree_a",
          "triangles": 26790
        },
        {
          "name": "f1_tree_a_lo",
          "triangles": 14694
        },
        {
          "name": "f1_tree_b",
          "triangles": 28316
        },
        {
          "name": "f1_tree_b_lo",
          "triangles": 14684
        },
        {
          "name": "f1_tree_c",
          "triangles": 24864
        },
        {
          "name": "f1_tree_c_lo",
          "triangles": 13952
        }
      ],
      "behavior": "Full per-copy triangle delta is full minus matching _lo entry. Draws may stay merged; total depends on placements. Download does not grow because both variants are in one GLB."
    }
  },
  {
    "id": "shared/farm-low-ground-wheat-density",
    "file": "apps/mobile/src/three/scene/fields/farm.js:453; apps/mobile/src/three/scene/fields/farm.js:528",
    "line": "",
    "behavior": "Reduced halves ground clump count and changes wheat row/column spacing from 0.42 to 0.65.",
    "fullCost": "formula: Full ground detail is about 2x instances. Ignoring rounding, full wheat count is (0.65/0.42)^2 = 2.395x reduced. Exact counts need the field build.",
    "after": "Web full detail restores density. Native reduced stays. This lane adds no field geometry.",
    "rawCost": {
      "formula": "Full ground detail is about 2x instances. Ignoring rounding, full wheat count is (0.65/0.42)^2 = 2.395x reduced. Exact counts need the field build."
    }
  },
  {
    "id": "shared/farm-low-wind-life-mill",
    "file": "apps/mobile/src/three/scene/fields/farm.js:610; apps/mobile/src/three/scene/fields/farm.js:659; apps/mobile/src/three/scene/fields/farmLife.js:10; apps/mobile/src/three/scene/fields/farmLife.js:141",
    "line": "",
    "behavior": "Reduced omits swaying shader work and the ambient-life batch; mill rotation uses a simpler/slower expression.",
    "fullCost": "behavior: Full adds vertex wind and ambient-life draw/instances. Mill uses the existing mesh. GPU/CPU timings not measured.",
    "after": "Full web detail enables existing behavior. Native reduced unchanged.",
    "rawCost": {
      "behavior": "Full adds vertex wind and ambient-life draw/instances. Mill uses the existing mesh. GPU/CPU timings not measured."
    }
  },
  {
    "id": "shared/farm-far-hedge",
    "file": "apps/mobile/src/three/scene/fields/farm.js:353",
    "line": "",
    "behavior": "Even full opts use f1_hedgelo_0..2 for non-close hedge sections. This is authored spatial simplification, not camera-time billboard switching.",
    "fullCost": "behavior: Replacing with near models would add per-copy triangles. Not part of shared settings.",
    "after": "Excluded; Farm worker owns distance prototype policy.",
    "rawCost": {
      "far_model_triangles": [
        {
          "name": "f1_hedgelo_0",
          "triangles": 4696
        },
        {
          "name": "f1_hedgelo_1",
          "triangles": 5372
        },
        {
          "name": "f1_hedgelo_2",
          "triangles": 5212
        }
      ],
      "behavior": "Replacing with near models would add per-copy triangles. Not part of shared settings."
    }
  },
  {
    "id": "shared/farm-distance-ground-rings",
    "file": "apps/mobile/src/three/scene/fields/farm.js:148; apps/mobile/src/three/scene/fields/farm.js:215; apps/mobile/src/three/scene/fields/farm.js:281",
    "line": "",
    "behavior": "Farm paints near radius 6.6 and mid radius 19 at 2048 each; the outer horizon ring to radius 95 uses coarse vertex colors, not a full ground bitmap.",
    "fullCost": "behavior: Painting the outer ring or raising authored density/resolution requires separate assets/geometry. Current full maps are 4x the half texel count.",
    "after": "Fields map 6144px; outer terrain carries the clearing grass at matching texel scale. No untextured far ring remains.",
    "rawCost": {
      "behavior": "Painting the outer ring or raising authored density/resolution requires separate assets/geometry. Current full maps are 4x the half texel count."
    }
  },
  {
    "id": "shared/common-ground-ring",
    "file": "apps/mobile/src/three/scene/fields/common.js:30; apps/mobile/src/three/scene/fields/common.js:44; apps/mobile/src/three/scene/fields/common.js:47",
    "line": "",
    "behavior": "Shared helper defaults to a 1024 near disc and a UV-free coarse far ring with 4 radial segments. Current GLB Forest does not call this near-ground helper.",
    "fullCost": "behavior: Keeping near texture/geometry everywhere requires more authored texels/triangles. This is helper capability rather than an active camera-tier switch.",
    "after": "Unchanged; scene/fields excluded.",
    "rawCost": {
      "behavior": "Keeping near texture/geometry everywhere requires more authored texels/triangles. This is helper capability rather than an active camera-tier switch."
    }
  },
  {
    "id": "shared/distance-atmosphere",
    "file": "apps/mobile/src/three/scene/fields/forestFar.js:60; apps/mobile/src/three/scene/fields/farm.js:669",
    "line": "",
    "behavior": "Forest aerial color mixes up to 0.52 over view distances 24-145 m; Farm fog starts 24 and is complete at 88. These hide contrast, not replace assets.",
    "fullCost": "behavior: Disabling haze/fog changes art direction; no high-res asset selection cost to calculate.",
    "after": "Forest tree wash reduced from 52% to 22%. Farm keeps approved pastel haze; it covers full-detail hills and foliage.",
    "rawCost": {
      "behavior": "Disabling haze/fog changes art direction; no high-res asset selection cost to calculate."
    }
  },
  {
    "id": "shared/farview-103-offscreen-culling",
    "file": "apps/mobile/src/ui/table/scene/farView.ts:4; apps/mobile/src/ui/table/scene/farView.ts:10; apps/mobile/src/ui/table/scene/farView.ts:63; apps/mobile/src/ui/table/scene/farView.ts:80",
    "line": "",
    "behavior": "Camera-frustum/clearing bounds hide existing Forest far-world and creek groups only when they cannot enter the shot. Shown-before-motion and until-settled handling keeps switches offscreen. This is safe visibility culling, not LOD, lower-detail geometry, billboards, or texture reduction.",
    "fullCost": "base comment estimate: About 450,000 triangles and 10 draws are skipped in covered shots at base. This is a source-comment estimate, not a new measurement; revised forest worker cost differs. Disabling would spend those draws while still offscreen.",
    "after": "Deliberately untouched. Keep #103 culling in both modes. Farm setFarVisible is a no-op.",
    "rawCost": {
      "base_comment_estimate": "About 450,000 triangles and 10 draws are skipped in covered shots at base. This is a source-comment estimate, not a new measurement; revised forest worker cost differs. Disabling would spend those draws while still offscreen."
    }
  },
  {
    "id": "shared/unrelated-particles-msaa",
    "file": "apps/mobile/src/three/quality.ts:38; apps/mobile/src/three/quality.ts:39; apps/mobile/src/three/quality.ts:40; apps/mobile/src/three/fx/kit.js:83; apps/mobile/src/three/platform/webHost.ts:12; apps/mobile/src/three/platform/nativeHost.ts:22",
    "line": "",
    "behavior": "Original low/mid/high particles are 0.25/0.6/1; low disables MSAA, mid/high enable it. Web MSAA only applies at context construction; native target sample count changes with loaded settings.",
    "fullCost": "formula: Full particles can be 4x low counts; native MSAA 4 adds per-sample color/depth storage and resolves, not necessarily 4x frame time.",
    "after": "Preserved. Field full mode does not rewrite these settings, so a low-tier full field can retain no MSAA and reduced FX particles.",
    "rawCost": {
      "formula": "Full particles can be 4x low counts; native MSAA 4 adds per-sample color/depth storage and resolves, not necessarily 4x frame time."
    }
  },
  {
    "id": "shared/unrelated-face-half-sheets",
    "file": "apps/mobile/src/three/platform/faces-runtime.js:11; apps/mobile/src/three/platform/faces-runtime.js:24; apps/mobile/src/three/platform/faces-runtime.js:27",
    "line": "",
    "behavior": "Actor face sheets always choose FACE_SCALE 0.5, independent of quality tier, based on the documented board-camera source-size decision.",
    "fullCost": "formula: Switching to authored full sheets would be 4x texels before mipmaps; exact actor sheet bytes outside field scope.",
    "after": "Untouched. Mentioned because full field modes must not imply actor sheet resolution changes.",
    "rawCost": {
      "formula": "Switching to authored full sheets would be 4x texels before mipmaps; exact actor sheet bytes outside field scope."
    }
  }
]