trampler: hash lifecycle RE'd via live round-trip (client recomputes all 5 on save)

- All 5 walker hashes are recomputed client-side on save from the local
  CompartmentsDatabase + CompartmentDefinitionDto (same build => byte-identical
  hashes; no per-walker secret). Wiping any/all hashes loads/opens/edits fine;
  one in-editor save regenerates everything (+ new file UUID & UniqueId).
- VERSION flag (WalkerBlueprintContainer.ValidateVersion) depends only on the
  structural Compartments/Connections hashes, not the Definition hashes; ERRORS
  is a separate structural check. Hashes = integrity/version-staleness markers,
  not security. Server upsert validation still untested.
- Document the 5-hash table (3 top-level + 2 per-part) and offline-computability
  in docs/TRAMPLER.md + CLAUDE.md; include experiment artifacts + baseline.
This commit is contained in:
DownloadPizza
2026-06-16 09:48:50 +02:00
parent aa7425221f
commit bd01d6753a
5 changed files with 163 additions and 6 deletions

View File

@@ -0,0 +1,87 @@
{
"note": "Baseline hash state to diff against after the game loads/re-saves the test walker. Test walker 'Scientific Sentinel' has Definition* hashes wiped to ''. Watch which fields the game fills back in.",
"source_01260e82_Cranky_Third": {
"DefinitionsHash": "A94FBF71596E2E5FC3595F38C310AB68",
"CompartmentsHash": "54319EC1DDFFAF5CAE17A0FA8B0D6750",
"ConnectionsHash": "36777484B669177C2B402DC0830EF1BD",
"per_part": [
{
"EpbId": "walker_compChassis_SmallLong4_Metal_2x3_epb",
"DefinitionHash": "64677F77ED55788CA579CDC5D5EDC53C",
"CompartmentHash": "D1EBE5DDB86BD898DA22A558F5199922"
},
{
"EpbId": "walker_compSteering_Square_Open_1x1_epb",
"DefinitionHash": "8AD614A669C43EC06EC49FB2C0C9F56D",
"CompartmentHash": "93901C77B060FA462EB1C415D7304E07"
},
{
"EpbId": "walker_compReactor_Round_Open_2x1_epb",
"DefinitionHash": "5744B05118A9CF470EEB77DC2FB8C62D",
"CompartmentHash": "BDADD1B66303873E30F8D031EE1F99A1"
},
{
"EpbId": "walker_compCaptainCrew_Wood_1x1_epb",
"DefinitionHash": "37F659D0A1EDBFEF11138B059BA87630",
"CompartmentHash": "CA0A7339EC20ADAAD07B756BA3206F77"
},
{
"EpbId": "walker_compDeck_Square_Open_1x1_epb",
"DefinitionHash": "04E304846A06AF8E3209DF1054D1E784",
"CompartmentHash": "0B8CC69BD1392E6EA7EA37BE5DE6C372"
},
{
"EpbId": "walker_compDeck_Square_Open_1x1_epb",
"DefinitionHash": "04E304846A06AF8E3209DF1054D1E784",
"CompartmentHash": "0B8CC69BD1392E6EA7EA37BE5DE6C372"
},
{
"EpbId": "walker_compSpecial_Entry_Frame_1x1_epb",
"DefinitionHash": "CB2209E5C634FBC37C242DE4ED91B70C",
"CompartmentHash": "9FB555D20A1BADBBD3AD73DFC989F9B6"
}
]
},
"test_6a804acb_Scientific_Sentinel_NODEFHASH": {
"DefinitionsHash": "",
"CompartmentsHash": "B0DC03D36083E9A6A7C86DFC1E87D978",
"ConnectionsHash": "36777484B669177C2B402DC0830EF1BD",
"per_part": [
{
"EpbId": "walker_compChassis_SmallLong4_Metal_2x3_epb",
"DefinitionHash": "",
"CompartmentHash": "D1EBE5DDB86BD898DA22A558F5199922"
},
{
"EpbId": "walker_compSteering_Square_Open_1x1_epb",
"DefinitionHash": "",
"CompartmentHash": "93901C77B060FA462EB1C415D7304E07"
},
{
"EpbId": "walker_compReactor_Round_Open_2x1_epb",
"DefinitionHash": "",
"CompartmentHash": "BDADD1B66303873E30F8D031EE1F99A1"
},
{
"EpbId": "walker_compCaptainCrew_Wood_1x1_epb",
"DefinitionHash": "",
"CompartmentHash": "CA0A7339EC20ADAAD07B756BA3206F77"
},
{
"EpbId": "walker_compDeck_Square_Open_1x1_epb",
"DefinitionHash": "",
"CompartmentHash": "0B8CC69BD1392E6EA7EA37BE5DE6C372"
},
{
"EpbId": "walker_compDeck_Square_Open_1x1_epb",
"DefinitionHash": "",
"CompartmentHash": "0B8CC69BD1392E6EA7EA37BE5DE6C372"
},
{
"EpbId": "walker_compSpecial_Entry_Frame_1x1_epb",
"DefinitionHash": "",
"CompartmentHash": "9FB555D20A1BADBBD3AD73DFC989F9B6"
}
]
}
}