{
  "version": 1,
  "kind": "hwanse-status-comment-selector-value-source-frontier-review",
  "sourceArtifacts": [
    "out/status_comment_selector_meaning_review.json",
    "out/status_comment_base_bind_route_review.json",
    "out/status_comment_backing_writer_scan.json",
    "out/status_comment_indirect_selector_writer_review.json",
    "out/status_comment_target0_writer_context_review.json",
    "out/selected_root_live_writer_frontier_review.json",
    "out/selected_scene_text_root_consumer_review.json",
    "out/global_mode_state_frontier_review.json"
  ],
  "summary": {
    "selectorBackingBaseVaHex": "0x004576d8",
    "selectorOffsetHex": "0x00",
    "meaningCandidate": "story/chapter selector for status/menu context",
    "consumerGrounded": true,
    "baseBindGrounded": true,
    "baseRouteGrounded": true,
    "directWriterFound": false,
    "dynamicStatusWriterFound": false,
    "saveLoadCanPopulate": true,
    "saveLoadPromotedAsLiveWriter": false,
    "candidateCount": 6,
    "promotedLiveWriterCount": 0,
    "decision": "The status/comment selector byte +0 is still writer-unresolved. Its consumer meaning is high-confidence story/chapter selection, but direct stores, local dynamic writers, selected-root primitives, and save/load restore do not prove a live writer."
  },
  "candidates": [
    {
      "candidate": "text/status consumer source",
      "status": "consumer-grounded-not-writer",
      "confidence": "high",
      "evidence": "40 1b mode1 route=0x40 0x1b payload uses=4; selector source grounded=True",
      "decision": "This proves where the value is read: object+0xa8+0 after base bind to 0x004576d8. It does not write the value."
    },
    {
      "candidate": "direct x86 store to 0x004576d8+0",
      "status": "not-found",
      "confidence": "high-negative",
      "evidence": "offset0 refs=6; write-like=0; direct writer proven=False",
      "decision": "No absolute direct write to the selector byte is present in the current .text scan."
    },
    {
      "candidate": "object-VM dynamic selector writers 0x8c/0x8d/0x8f",
      "status": "excluded-for-status-comment",
      "confidence": "high-negative",
      "evidence": "dynamic candidates=673; target0=52; status-menu target0=0; status-comment target0=0; promoted target0 context=False",
      "decision": "Target +0 dynamic writes are real in other active-object contexts, but their roots are field/battle object-local. They are not the status/comment story selector writer."
    },
    {
      "candidate": "persistent save/load block restore",
      "status": "can-populate-on-load-not-live-producer",
      "confidence": "high",
      "evidence": "block transfer refs=2; restore function=0x00423319; state block=0x004576d8 size=0x72; route promoted=False",
      "decision": "0x00423319 loads/saves the 0x72-byte block, so +0 can come from persisted state after load. This is excluded as the live chapter/scenario writer."
    },
    {
      "candidate": "selected-root selector bytes +2/+3",
      "status": "different-route-layer",
      "confidence": "high",
      "evidence": "selector byte writer grounded=True; selected-root writer grounded=True; route producer promoted=False",
      "decision": "The +2/+3 selector bytes reconstruct selected roots. They are adjacent in the backing block but are not the +0 chapter/status-comment selector."
    },
    {
      "candidate": "cross-domain global mode/state frontier",
      "status": "no-live-producer-promoted",
      "confidence": "medium-high-negative",
      "evidence": "cross-domain functions=19; review required=0; promoted producers=0; save/load bridge found=True",
      "decision": "Broad scene/menu/field/encounter intersections did not reveal a live writer. The strongest intersection remains save/load restore, already excluded as live producer."
    }
  ],
  "excludedOrNonWriterCandidates": [
    {
      "candidate": "direct x86 store to 0x004576d8+0",
      "status": "not-found",
      "confidence": "high-negative",
      "evidence": "offset0 refs=6; write-like=0; direct writer proven=False",
      "decision": "No absolute direct write to the selector byte is present in the current .text scan."
    },
    {
      "candidate": "object-VM dynamic selector writers 0x8c/0x8d/0x8f",
      "status": "excluded-for-status-comment",
      "confidence": "high-negative",
      "evidence": "dynamic candidates=673; target0=52; status-menu target0=0; status-comment target0=0; promoted target0 context=False",
      "decision": "Target +0 dynamic writes are real in other active-object contexts, but their roots are field/battle object-local. They are not the status/comment story selector writer."
    },
    {
      "candidate": "persistent save/load block restore",
      "status": "can-populate-on-load-not-live-producer",
      "confidence": "high",
      "evidence": "block transfer refs=2; restore function=0x00423319; state block=0x004576d8 size=0x72; route promoted=False",
      "decision": "0x00423319 loads/saves the 0x72-byte block, so +0 can come from persisted state after load. This is excluded as the live chapter/scenario writer."
    },
    {
      "candidate": "selected-root selector bytes +2/+3",
      "status": "different-route-layer",
      "confidence": "high",
      "evidence": "selector byte writer grounded=True; selected-root writer grounded=True; route producer promoted=False",
      "decision": "The +2/+3 selector bytes reconstruct selected roots. They are adjacent in the backing block but are not the +0 chapter/status-comment selector."
    },
    {
      "candidate": "cross-domain global mode/state frontier",
      "status": "no-live-producer-promoted",
      "confidence": "medium-high-negative",
      "evidence": "cross-domain functions=19; review required=0; promoted producers=0; save/load bridge found=True",
      "decision": "Broad scene/menu/field/encounter intersections did not reveal a live writer. The strongest intersection remains save/load restore, already excluded as live producer."
    }
  ],
  "nextFrontier": [
    "Look for an indirect or block writer that populates 0x004576d8+0 without an absolute 0x004576d8 immediate.",
    "Prefer upstream scenario/chapter state transitions over status-menu payloads: current payloads only consume the value.",
    "If a future pass inspects 0x00423319 again, keep it classified as load/save restore unless it proves a live gameplay caller and value transition.",
    "A useful static target is code that writes a compact story/chapter byte and then later copies/serializes the 0x72 backing block."
  ]
}
