{
  "meta": {
    "steamAppId": 2402680,
    "steamBuildId": "25684114",
    "checkedAt": "2026-10-13",
    "counts": {
      "sets": 43,
      "slots": 8,
      "pieces": 344,
      "stats": 67
    }
  },
  "inputs": [
    {
      "path": "GameAssembly.dll",
      "sha256": "83ae93666238194d023113d450eec9b30a306503496351f8774ee88cd45b9c4f"
    },
    {
      "path": "Dimraeth_Data/il2cpp_data/Metadata/global-metadata.dat",
      "sha256": "26a0e57631d5e2fb952281e74e57cbead652b94998c43d0ca4d012f3c78ef7ef"
    },
    {
      "path": "Dimraeth_Data/resources.assets",
      "sha256": "a5125bfa74585a72cd906468125a2d9a5585cf03eb23f3909ecf54d5138ac70c"
    },
    {
      "path": "Dimraeth_Data/sharedassets1.assets",
      "sha256": "0eb342cd2aadb2d9dc5a6b02609cac178f7c4a9efa3def1b98cb9104e75dead7"
    },
    {
      "path": "Dimraeth_Data/resources.assets.resS",
      "sha256": "1ce529988d4adf75f92b9bf0478470ed75509aba760dfa1295875d62012fcaaa"
    },
    {
      "path": "Dimraeth_Data/sharedassets1.assets.resS",
      "sha256": "1f9def483d01191ef5ae80369566376789d1ec1fa7223508332fabe47dc58e09"
    }
  ],
  "rawInputSha256": "e928c6fece2dec0731e1ea04d43481f5ee0dac63d78207cebd4e23d1448aac55",
  "equipmentSha256": "584f3a66e32d646b52480fccda1a7e4bdfc984d596fd837a6ece4a406983fa3a",
  "generator": "scripts/generate-dimraeth-equipment.py",
  "inputManifest": "provenance/dimraeth/journal-input-manifest.json",
  "rawSets": 43,
  "publishedCounts": {
    "sets": 43,
    "slots": 8,
    "pieces": 344,
    "stats": 67
  },
  "excluded": [],
  "parseFailures": [],
  "primaryFallbacks": [
    {
      "setId": "set.Lifebloom",
      "slot": 0,
      "registeredPrimary": [],
      "effectivePrimary": [
        2
      ],
      "rule": "GenerateRuneStats uses Health when the primary list is empty"
    },
    {
      "setId": "set.Lifebloom",
      "slot": 6,
      "registeredPrimary": [],
      "effectivePrimary": [
        2
      ],
      "rule": "GenerateRuneStats uses Health when the primary list is empty"
    }
  ],
  "selection": "InProduction RuneSetDefinition joined to published Codex sets by RuneSet enum and verified file/pathId. SlotDefinitions retain the exact stat IDs except explicitly recorded empty-primary Health fallbacks; no name-based joining.",
  "localization": "Runes.GetLocalizedStatName builds UI STAT_{uppercase enum}_NAME. Missing UI names use serialized Attributes templates when present; six missing names have explicitly marked editorial translations.",
  "editorialTranslations": [
    {
      "id": 105,
      "name": "焚き付け最大数",
      "enName": "MaxKindled",
      "template": "",
      "source": {
        "editorialTranslation": true,
        "enum": "MaxKindled"
      }
    },
    {
      "id": 106,
      "name": "氷結の加護最大数",
      "enName": "MaxFrostbound",
      "template": "",
      "source": {
        "editorialTranslation": true,
        "enum": "MaxFrostbound"
      }
    },
    {
      "id": 107,
      "name": "免疫最大数",
      "enName": "MaxInoculation",
      "template": "",
      "source": {
        "editorialTranslation": true,
        "enum": "MaxInoculation"
      }
    },
    {
      "id": 108,
      "name": "焚き付け持続時間",
      "enName": "KindledDuration",
      "template": "",
      "source": {
        "editorialTranslation": true,
        "enum": "KindledDuration"
      }
    },
    {
      "id": 109,
      "name": "氷結の加護持続時間",
      "enName": "FrostboundDuration",
      "template": "",
      "source": {
        "editorialTranslation": true,
        "enum": "FrostboundDuration"
      }
    },
    {
      "id": 110,
      "name": "免疫持続時間",
      "enName": "InoculationDuration",
      "template": "",
      "source": {
        "editorialTranslation": true,
        "enum": "InoculationDuration"
      }
    }
  ],
  "native": {
    "provider": "REA 6.4.0 / Ghidra 12.1.4 / same-build LibCpp2IL map",
    "functions": [
      {
        "address": "0x1810cec90",
        "end_exclusive": "0x1810ceef9",
        "name": "Runes.GetLocalizedStatName__27454",
        "managed_signature": "Assembly-CSharp.dll :: Runes :: System.String GetLocalizedStatName(Runes+Stat stat)",
        "metadata_index": 27454,
        "token": "0x6006b3f",
        "source": "Same-build LibCpp2IL metadata/code registration and PE unwind range",
        "evidenceId": "ev_2268d21a2433da9c81960456c2c9e6be1924e608cd3d4fab16583f3a1ec9b6af",
        "artifactSha256": "bce1e84d3aba213ad1fe3e439ed43c7bd8cb8469340999aaaedf6046694d3765"
      },
      {
        "address": "0x1810cdf40",
        "end_exclusive": "0x1810ce0aa",
        "name": "Runes.GenerateRuneStats__27476",
        "managed_signature": "Assembly-CSharp.dll :: Runes :: RuneObject GenerateRuneStats(RuneObject rune)",
        "metadata_index": 27476,
        "token": "0x6006b55",
        "source": "Same-build LibCpp2IL metadata/code registration and PE unwind range",
        "evidenceId": "ev_5e7e5badbbad92e681ca9a87fb365618bd3f8e57121b551d588513eeb5fba5f2",
        "artifactSha256": "81d028ed715c5c013ec3de14a75583526104b043b8cb3cac06caeee48b8a19ce"
      },
      {
        "address": "0x1810d2840",
        "end_exclusive": "0x1810d298f",
        "name": "Runes.ReturnRandomSecondaryStat__27478",
        "managed_signature": "Assembly-CSharp.dll :: Runes :: Runes+Stat ReturnRandomSecondaryStat(Runes+Stat[] usedStats, Runes+Stat primaryStat, System.Collections.Generic.List`1<Runes+Stat> validSecondaryStats)",
        "metadata_index": 27478,
        "token": "0x6006b57",
        "source": "Same-build LibCpp2IL metadata/code registration and PE unwind range",
        "evidenceId": "ev_bcc087e4b60bc7fabb246bb4c57b417cfbc44dd300aa031b21b7250e8a170474",
        "artifactSha256": "b6343b0231c65fb6f2894d6587dc987f800d5b89125c536429b7ab516986a276"
      },
      {
        "address": "0x1810cf500",
        "end_exclusive": "0x1810cf635",
        "name": "Runes.GetRandomSecondaryStat__27492",
        "managed_signature": "Assembly-CSharp.dll :: Runes :: Runes+Stat GetRandomSecondaryStat(Rune rune, System.Int32 seed)",
        "metadata_index": 27492,
        "token": "0x6006b65",
        "source": "Same-build LibCpp2IL metadata/code registration and PE unwind range",
        "evidenceId": "ev_9fcce06a03735f1cb28486dda66222aa64b2aed37a906ac7b5ccbabc5a13698f",
        "artifactSha256": "0ed2952416e9e5e08c5149ddb1a04f622f9bd446efbcea326b8dfdf0cf715779"
      },
      {
        "address": "0x180cdf0e0",
        "end_exclusive": "0x180cdf107",
        "name": "NPCInteractions.ActivateNPCReroll__2508",
        "managed_signature": "Assembly-CSharp.dll :: NPCInteractions :: System.Void ActivateNPCReroll()",
        "metadata_index": 2508,
        "token": "0x60009cd",
        "source": "Same-build LibCpp2IL metadata/code registration and PE unwind range",
        "evidenceId": "ev_f5ddc66dc262d6e80b42db0de08aa5d4ee1250bb37dab6e5996a6f92417454dc",
        "artifactSha256": "c3e41ba6129ef9111c54917d95d4264b73509642b19ff1a7c9e6da432251b3e4"
      },
      {
        "address": "0x1809e2d30",
        "end_exclusive": "0x1809e2ddc",
        "name": "RandomRecipeDiscovery.TriggerReroll__7974",
        "managed_signature": "Assembly-CSharp.dll :: RandomRecipeDiscovery :: System.Void TriggerReroll()",
        "metadata_index": 7974,
        "token": "0x6001f27",
        "source": "Same-build LibCpp2IL metadata/code registration and PE unwind range",
        "evidenceId": "ev_6919fd771104f161adef74b0f4025ac6d1821200cfa723ebc3a145d62afbbcdb",
        "artifactSha256": "5c977f423ec3cc4b895ebe0570527a61b3eda960ddc10758775b042aed0f10f2"
      },
      {
        "address": "0x1810d34a0",
        "end_exclusive": "0x1810d359c",
        "name": "Runes.UpgradeRune__27488",
        "managed_signature": "Assembly-CSharp.dll :: Runes :: System.Void UpgradeRune(ref Rune rune)",
        "metadata_index": 27488,
        "token": "0x6006b61",
        "source": "Same-build LibCpp2IL metadata/code registration and PE unwind range",
        "evidenceId": "ev_a5ec7bd6f85f54d4d794aec8c4c6dccc88558decb3d9739dfa905c6b1107396e",
        "artifactSha256": "b0c3ecbd426ea2fb53bbeda0e738ae9cdc9e4da8088cb32ac72b5b43c782ec9f"
      },
      {
        "address": "0x180807990",
        "end_exclusive": "0x180807a55",
        "name": "Forge.UpgradeRune__4317",
        "managed_signature": "Assembly-CSharp.dll :: Forge :: System.Void UpgradeRune()",
        "metadata_index": 4317,
        "token": "0x60010de",
        "source": "Same-build LibCpp2IL metadata/code registration and PE unwind range",
        "evidenceId": "ev_262899df6f1a194db171ade6d0ad700e70bbf5680167ef12889f78f0a30038de",
        "artifactSha256": "7de8f9ef30d9d87db814117b2d42dfacf23cab4f29f745fb6952a3079d3c70f6"
      }
    ],
    "fieldOffsets": [
      {
        "type": "RuneSlotDefinition",
        "name": "SlotType",
        "field_type": "Runes+SlotType",
        "offset": 16
      },
      {
        "type": "RuneSlotDefinition",
        "name": "PrimaryStats",
        "field_type": "System.Collections.Generic.List`1<Runes+Stat>",
        "offset": 24
      },
      {
        "type": "RuneSlotDefinition",
        "name": "SecondaryStats",
        "field_type": "System.Collections.Generic.List`1<Runes+Stat>",
        "offset": 32
      }
    ],
    "inputsExecuted": false,
    "sourceUnchanged": true,
    "sessionsClosed": true
  },
  "findings": [
    "GenerateRuneStats looks up the set and slot, chooses one PrimaryStats entry, and uses SecondaryStats for secondary rolls. Secondary selection excludes the primary and already-used secondary IDs.",
    "GetRandomSecondaryStat uses the same set/slot secondary list when upgrading, excluding primary and existing secondaries. All published lists have enough distinct candidates to avoid empty-list fallbacks.",
    "Forge.UpgradeRune spends essence and calls Runes.UpgradeRune. The latter preserves existing stat IDs, improves values and may append a new secondary up to six.",
    "NPC reroll opens RandomRecipeDiscovery and performs a recipe exchange, not an equipment-affix reroll."
  ],
  "limitations": [
    "Static definitions and eight named native routines, not live gameplay, save inspection or exhaustive whole-program analysis.",
    "The 344 entries are 43 set-by-slot definitions, not 344 fixed-stat unique items. Numeric roll ranges, individual option probabilities and every current acquisition route are not published.",
    "Acquisition links use encounters.json and filter by both set and slot. Missing routes are unconfirmed, not proof that a piece is unobtainable.",
    "No player-facing equipment-affix reroll was identified in the inspected scope. Future builds or uninspected paths may differ."
  ]
}
