{
  "version": "20.0",
  "source_master_path": "masters/world/04_Shrine_Occupied.png",
  "source_master_sha256": "6d1913c8e64b1b3366cb9c96135ba79f983a90ed0d0b97cc9c8097f4bd5345bf",
  "coordinate_space": "5120x2880_world",
  "registration": "DIRECT_MANUAL_NATIVE_PIXEL_INSPECTION_OF_CURRENT_APPROVED_MASTER",
  "candle_anchor_semantics": "2026-09-29 user correction: flame/radiance pivot 6 native world pixels down into visible wick; all source frame registrations unchanged.",
  "candle_anchors": [
    {
      "id": "rear_left",
      "wick_world": [
        2064,
        1961
      ],
      "visible_flame": true
    },
    {
      "id": "rear_right",
      "wick_world": [
        3079,
        1931
      ],
      "visible_flame": true
    },
    {
      "id": "steps_left",
      "wick_world": [
        2244,
        2226
      ],
      "visible_flame": true
    },
    {
      "id": "steps_right_upper",
      "wick_world": [
        2910,
        2161
      ],
      "visible_flame": true
    },
    {
      "id": "steps_right_lower",
      "wick_world": [
        3007,
        2205
      ],
      "visible_flame": true
    },
    {
      "id": "front_left_tall",
      "wick_world": [
        1914,
        2245
      ],
      "visible_flame": true
    },
    {
      "id": "front_left_short",
      "wick_world": [
        1850,
        2309
      ],
      "visible_flame": true
    },
    {
      "id": "front_left_stub",
      "wick_world": [
        1981,
        2347
      ],
      "visible_flame": true
    },
    {
      "id": "front_right_tall",
      "wick_world": [
        3105,
        2314
      ],
      "visible_flame": true
    },
    {
      "id": "front_right_short",
      "wick_world": [
        3174,
        2338
      ],
      "visible_flame": true
    }
  ],
  "silver_glint_anchors": [
    {
      "id": "staff_crown",
      "world": [
        2782,
        1431
      ],
      "radius_world_px": 26,
      "surface_normal_hint": [
        0.2,
        -0.75,
        0.63
      ],
      "figure_only": true,
      "registration": "Native metal detail reviewed; bounded anchor without inferred new highlights"
    },
    {
      "id": "staff_upper_left",
      "world": [
        2746,
        1490
      ],
      "radius_world_px": 26,
      "surface_normal_hint": [
        -0.35,
        -0.45,
        0.82
      ],
      "figure_only": true,
      "registration": "Native metal detail reviewed; bounded anchor without inferred new highlights"
    },
    {
      "id": "staff_upper_right",
      "world": [
        2830,
        1493
      ],
      "radius_world_px": 26,
      "surface_normal_hint": [
        0.35,
        -0.45,
        0.82
      ],
      "figure_only": true,
      "registration": "Native metal detail reviewed; bounded anchor without inferred new highlights"
    },
    {
      "id": "staff_shaft_upper",
      "world": [
        2775,
        1680
      ],
      "radius_world_px": 22,
      "surface_normal_hint": [
        0.45,
        -0.15,
        0.88
      ],
      "figure_only": true,
      "registration": "Native metal detail reviewed; bounded anchor without inferred new highlights"
    },
    {
      "id": "staff_shaft_hand",
      "world": [
        2770,
        1740
      ],
      "radius_world_px": 22,
      "surface_normal_hint": [
        0.55,
        0.0,
        0.84
      ],
      "figure_only": true,
      "registration": "Native metal detail reviewed; bounded anchor without inferred new highlights"
    },
    {
      "id": "staff_shaft_lower",
      "world": [
        2773,
        1980
      ],
      "radius_world_px": 22,
      "surface_normal_hint": [
        0.5,
        0.05,
        0.86
      ],
      "figure_only": true,
      "registration": "Native metal detail reviewed; bounded anchor without inferred new highlights"
    },
    {
      "id": "staff_foot",
      "world": [
        2773,
        2165
      ],
      "radius_world_px": 22,
      "surface_normal_hint": [
        0.45,
        0.18,
        0.87
      ],
      "figure_only": true,
      "registration": "Native metal detail reviewed; bounded anchor without inferred new highlights"
    },
    {
      "id": "necklace_left",
      "world": [
        2540,
        1670
      ],
      "radius_world_px": 22,
      "surface_normal_hint": [
        -0.45,
        -0.1,
        0.89
      ],
      "figure_only": true,
      "registration": "Native metal detail reviewed; bounded anchor without inferred new highlights"
    },
    {
      "id": "necklace_right",
      "world": [
        2581,
        1682
      ],
      "radius_world_px": 22,
      "surface_normal_hint": [
        -0.4,
        -0.05,
        0.91
      ],
      "figure_only": true,
      "registration": "Native metal detail reviewed; bounded anchor without inferred new highlights"
    },
    {
      "id": "pendant_loop",
      "world": [
        2558,
        1708
      ],
      "radius_world_px": 22,
      "surface_normal_hint": [
        0.4,
        -0.05,
        0.91
      ],
      "figure_only": true,
      "registration": "Native metal detail reviewed; bounded anchor without inferred new highlights"
    },
    {
      "id": "pendant_frame_left",
      "world": [
        2538,
        1739
      ],
      "radius_world_px": 22,
      "surface_normal_hint": [
        -0.25,
        0.05,
        0.97
      ],
      "figure_only": true,
      "registration": "Native metal detail reviewed; bounded anchor without inferred new highlights"
    },
    {
      "id": "pendant_frame_right",
      "world": [
        2574,
        1739
      ],
      "radius_world_px": 22,
      "surface_normal_hint": [
        0.25,
        0.05,
        0.97
      ],
      "figure_only": true,
      "registration": "Native metal detail reviewed; bounded anchor without inferred new highlights"
    },
    {
      "id": "silver_pendant_upper",
      "world": [
        2556,
        1725
      ],
      "radius_world_px": 22,
      "surface_normal_hint": [
        0.0,
        0.0,
        1.0
      ],
      "figure_only": true,
      "registration": "Native metal detail reviewed; bounded anchor without inferred new highlights"
    },
    {
      "id": "silver_pendant_cross",
      "world": [
        2557,
        1765
      ],
      "radius_world_px": 22,
      "surface_normal_hint": [
        0.0,
        0.1,
        0.99
      ],
      "figure_only": true,
      "registration": "Native metal detail reviewed; bounded anchor without inferred new highlights"
    },
    {
      "id": "pillar_right_armillary",
      "world": [
        3212,
        680
      ],
      "radius_world_px": 33,
      "surface_normal_hint": [
        0.0,
        -0.25,
        0.968
      ],
      "source_pack": "HIER_SILVER_GLINT_ANIM_PACK_FINAL",
      "amendment": "AMD-2026-09-17-GLINT-15",
      "figure_only": false,
      "registration": "current master metal detail; require native visual QA"
    },
    {
      "id": "connecting_chain_01",
      "world": [
        2896.5,
        1808.5
      ],
      "radius_world_px": 22,
      "figure_only": false,
      "surface_normal_hint": [
        0,
        -0.25,
        0.968
      ]
    },
    {
      "id": "connecting_chain_02",
      "world": [
        2960.5,
        1834.5
      ],
      "radius_world_px": 22,
      "figure_only": false,
      "surface_normal_hint": [
        0,
        -0.25,
        0.968
      ]
    },
    {
      "id": "connecting_chain_03",
      "world": [
        3006.5,
        1837.5
      ],
      "radius_world_px": 22,
      "figure_only": false,
      "surface_normal_hint": [
        0,
        -0.25,
        0.968
      ]
    },
    {
      "id": "connecting_chain_04",
      "world": [
        3082.5,
        1835.5
      ],
      "radius_world_px": 22,
      "figure_only": false,
      "surface_normal_hint": [
        0,
        -0.25,
        0.968
      ]
    }
  ],
  "transform_contract": {
    "world_crop": [
      1898.125,
      0,
      3221.875,
      2880
    ],
    "screen_x": "(world_x - view_left_world) * screen_width / view_width_world",
    "screen_y": "world_y * screen_height / 2880",
    "apply_view_transform_once_to_foreground_and_effects": true,
    "independent_css_positioning_forbidden": true,
    "device_specific_anchor_changes_forbidden": true
  },
  "candle_runtime": {
    "flame_free": false,
    "activation_order": "seeded_per_night_stable_shuffle_of_anchor_ids",
    "activation_stagger_seconds": [
      0.22,
      0.9
    ],
    "flicker_source": "seeded continuous noise keyed by night_id and anchor_id",
    "render_time_math_random_forbidden": true,
    "glow_center_must_equal_transformed_wick_anchor": true,
    "maximum_alignment_error_css_px": 1.0
  },
  "silver_runtime": {
    "selection": "One connecting-chain glint per event; remaining slots cycle original anchors; direction controls intensity, not eligibility.",
    "maximum_simultaneous": {
      "day": 3,
      "night": 2,
      "lightning": 4
    },
    "whole_staff_or_outfit_glow_forbidden": true,
    "glint_center_must_equal_transformed_anchor": true,
    "maximum_alignment_error_css_px": 1.0
  },
  "runtime_alignment": {
    "shared_simulation_clock": true,
    "state_blend_sample_once_per_frame": true,
    "viewport_transform_sample_once_per_frame": true,
    "candle_and_glint_effects_use_same_frame_state": true,
    "independent_css_animation_clocks_forbidden": true,
    "evaluation_order": [
      "sample_world_state",
      "sample_world_lighting",
      "sample_view_transform",
      "transform_anchor_centers",
      "evaluate_candle_emission",
      "evaluate_silver_glints",
      "composite_over_approved_foreground"
    ]
  },
  "status": "CURRENT_WORLD_REGISTERED",
  "amendments": [
    {
      "id": "AMD-2026-09-17-GLINT-15",
      "date": "2026-09-17",
      "scope": "Adds a 15th silver_glint_anchor. Changes nothing else. Does not alter the foreground, any existing anchor, or the candle set.",
      "authority": "Explicit user instruction during instrc_v0917 integration.",
      "pack_declared_anchor": [
        2971,
        989
      ],
      "pack_anchor_rejected_because": "The shipped foreground master is fully transparent at (2971,989) - alpha 0 across the surrounding 80x80. Row y=989 is opaque only over x 1804-2012 and x 3108-3320; the declared point falls in the gap between them. Nearest opaque foreground pixel is 129px away. Nearest existing anchor is staff_crown at 563px with a 12px radius. The pack was authored against a different foreground layout.",
      "adopted_anchor": [
        3207,
        840
      ],
      "adopted_anchor_derivation": "Centre of the right pillar armillary sphere, measured from the shipped master: closed sphere spanning y 740-940, widest 169px at y=840, centre column x=3207. Silver banding and star points are present on the sphere; an earlier mean-RGB reading suggested otherwise but was diluted by the dark sphere body.",
      "surface_normal_rationale": "Camera-facing normal. A sphere viewed head-on is rotationally symmetric, so no directional bias is derivable or warranted.",
      "radius_rationale": "Half the pack art union bbox (67x67), not the sphere radius (~85).",
      "known_issues": [
        "Mobile crop: normalized x is 0.9888, only 14.875 world px from the right edge of the crop [1898.125 .. 3221.875]. The 67px-wide glint art will be clipped on its right side in the mobile view.",
        "Left/right asymmetry: the left pillar carries a matching armillary sphere but the pack supplies one glint sequence and only the right pillar was authorized. Not self-corrected."
      ]
    },
    {
      "id": "AMD-2026-09-17-CANDLE-FLAME",
      "date": "2026-09-17",
      "authority": "Explicit user instruction during instrc_v0917 integration.",
      "recorded_here_because": "LOCKS/HIER_STANDING_RULES.md is sealed by SHA256 in FG_LOCK/manifest.json; editing it fails check_lock.py with manifest_hash_mismatch and fails VERIFY.py. The manifest hash was NOT altered - that would weaken the tamper detector the lock itself forbids weakening. This file is the live operative contract the renderer reads for candle behaviour, so the amendment is recorded here.",
      "supersedes": {
        "K015": "The nighttime-presentation half only. Candles may now show a visible animated flame at runtime. The base-art half is NOT superseded.",
        "K017": "The flame-free constraint only. The restrained irregular stagger is retained and still governs multi-candle timing."
      },
      "not_superseded": [
        "K001-K005: candle bodies physically present in base foreground, completely unlit, with no baked flame, no baked halo, no baked reflected warm light. The v6 flame is a runtime overlay; the foreground master is not re-authored.",
        "K007: dynamic flame and glow must align exactly to wick anchors on desktop and mobile.",
        "K011: severe exposed weather may still extinguish individual candles.",
        "K013 melted bodies, uneven rims, drips, pools. K014 very thin short dark wicks.",
        "The entire foreground lock, all FG_LOCK authority, the ten-candidate rule, and the display permit."
      ],
      "field_change": "candle_anchors[].visible_flame false -> true. Anchor positions unchanged.",
      "anchors_affected": [
        "candle_left_rear_01",
        "candle_left_rear_02",
        "candle_left_rear_03",
        "candle_left_mid_01",
        "candle_left_front_01",
        "candle_right_rear_01",
        "candle_right_mid_01",
        "candle_right_mid_02",
        "candle_right_front_01",
        "candle_right_front_02"
      ],
      "implementation_constraints": [
        "Purple/lavender is supernatural poof/smoke, never flame.",
        "Warm flame base locked to the wick with zero drift; upper flame dances per the pack's flame_lean_px / tip_curl_px / flame_height_px table.",
        "Ambient light is a runtime luminance/colour response on EXISTING nearby world pixels driven by per-frame light_strength, with small irregular surface-aware falloff. No pasted halo, hard circle, neon aura, or large orange orb.",
        "Lighting may alter rendered colour and luminance only - never geometry, registration, texture identity, or placement.",
        "Frames used exactly as supplied, order 01 to 12. Never regenerate, recolor, rescale, retime, reorder, or substitute.",
        "Multiple candles reuse the identical animation with restrained staggered starts.",
        "Silver inside a candle influence may brighten subtly in sync. Do not invent or move metal highlights."
      ],
      "gate_consequences": [
        "tools/check_candles_off.py needs NO change. CORRECTION: an earlier draft of this amendment claimed it 'becomes wrong by construction'. That was wrong. It tests assets/sky/*.jpg and candle_emissive.* for BAKED flame in the base art, which K001-K005 keep binding. The v6 flame is a runtime overlay, so the gate is unaffected. Verified empirically after implementation: PASS 4/0 with identical per-plate correlations (deepnight 0.97, others 0.01-0.10).",
        "validate.mjs S008 'weather-extinguished candles replay the poof on relight' was a REAL failure, not a stale one: it read x.poof, which no longer existed, so NaN > 0.15 was never true. Fixed by exposing a linear ignition phase from candles.js with poof = 1 - smoothstep(0, 0.20, phase). Now PASS, peak poof 0.97, verified at a genuine weather relight replaying frames 1->12."
      ],
      "verified_after_implementation": "2026-09-18"
    },
    {
      "id": "AMD-2026-09-22-CANDLE-V7-SOURCE-CANDIDATE",
      "date": "2026-09-22",
      "authority": "User request to wire the newer stars and flames into the source pack.",
      "scope": "All sixteen v7 original RGBA frames replace the v6 runtime overlay at the same ten world wick anchors and (128,178) registration; no change to base foreground or scene geometry.",
      "gate": "V7 does not supply per-frame light/lean coefficients. Current coefficients are independently derived from supplied frame pixels with the baseline v6 lighting scale by tools/verify_v7_candle_metadata.py. They are implementation measurements, not pack-authored approval. Complete scene visual QA remains UNVERIFIED. Do not deploy or claim full approval."
    },
    {
      "id": "AMD-2026-09-22-STORM-Q15-B",
      "date": "2026-09-22",
      "authority": "User's later final Storm/Rain/Lightning questionnaire answer Q15=B: candles flicker strongly but stay lit; storm must not extinguish.",
      "supersedes": "K011's weather extinguishing behavior and K012's weather relight path, both retained by the older 2026-09-17 candle amendment. Daylight unlit candles and restrained dusk ignition are unchanged.",
      "implementation": "candleStates returns survive=1 in weather; home.js uses the existing deterministic stormCandleFlicker on flame opacity and existing-world light, with floor 0.62."
    }
  ]
}
