Guard source gear namespaces and retain recoverable legacy records (#9)
This commit is contained in:
1 parent
ab37006932
commit
e567910c04
23 files changed
+1203
-66
No files matched your search
@@ -0,0 +1,100 @@
|
||||
# Gear namespaces and recoverable legacy records
|
||||
|
||||
The source runtime distinguishes an item's game namespace from the dungeon that
|
||||
produced its source row. `InventoryItem.contentCategory` is `wow`, `rom`, or
|
||||
`coa`; it stays optional in the TypeScript contract for legacy callers, while
|
||||
new WoW and Runewaker factories explicitly write their own source category.
|
||||
Saved character/class identity chooses the expected owner category. A dungeon
|
||||
selection cannot change it or relabel another game's gear.
|
||||
|
||||
## Item and equipment boundaries
|
||||
|
||||
`lootTypes.ts` exposes an explicit category match and a usability check.
|
||||
RoM usability additionally requires a nonempty payload accepted by the existing
|
||||
`normalizeRomNativeGearStats` normalizer. This is structural validation, not
|
||||
proof of an authenticated item association or authoritative stat ranges.
|
||||
Unidentified and foreign records cannot be equipped or contribute active gear.
|
||||
Contradictory owner-category hints cannot override the source class category.
|
||||
|
||||
Owner-aware loot generation and combat grants filter foreign/unusable records.
|
||||
An unavailable same-game item pool yields no borrowed gear. Boss-card identity
|
||||
continues to use the boss/dungeon source. Native Godot still remaps both loot
|
||||
catalogs to its cards-only adapter; this change does not enable ordinary loot.
|
||||
The generic Runewaker item catalog has source-tagged records without native
|
||||
gear payloads and is not promoted into a playable equipment progression pool.
|
||||
|
||||
Synthetic equipment scoring and internal training gear remain simulation
|
||||
scaffolding. They are not imported live loot. A private training-item identity
|
||||
can preserve existing simulator fallback calculations without authorizing a
|
||||
persisted or copied record as native RoM gear.
|
||||
|
||||
## Profile migration and recovery
|
||||
|
||||
`accountRepository.ts` reads local database versions 1–8 at the existing
|
||||
`healer-man.profile-database.v1` key and writes schema 8. A missing item category
|
||||
may migrate to `wow` only for an explicit WoW owner; the existing normalized
|
||||
numeric item fields and equipment references retain their prior values.
|
||||
Missing categories on RoM/CoA records are not guessed from names, IDs or dungeons.
|
||||
|
||||
Normalized active inventories and assignments contain usable same-game items.
|
||||
Rejected legacy records remain in character-local `gearRecovery.items` with
|
||||
original item data and a reason (`missing-category`, `foreign-category`, or
|
||||
`invalid-native-payload`). `gearRecovery.equipment` retains former owner/slot/
|
||||
instance references. Repeated load/cloud normalization merges recovery without
|
||||
multiplying it, and ordinary gear updates preserve the existing recovery.
|
||||
This schema retains data for a later explicit recovery operation; it does not
|
||||
provide a recovery UI or invent a replacement item.
|
||||
|
||||
Inventory/equipment mutations reject foreign or unusable incoming gear before
|
||||
writing. Rejected mutations leave stored bytes unchanged. Other profiles and
|
||||
owners retain separate inventories and recovery. Cloud serialization carries
|
||||
full profile rows, and hydration queues a save when namespace/recovery migration
|
||||
changes the roster; existing boss-card checkpoint and session-generation behavior
|
||||
remain separate.
|
||||
|
||||
## Native integration and remaining scope
|
||||
|
||||
Shared source issue [#9](https://git.whoagland.com/phenom/healer-man/issues/9)
|
||||
owns the source guards and profile schema. Native checkpoint
|
||||
[#292](https://git.whoagland.com/Codex/healer-man-godot/issues/292) owns reviewed
|
||||
source pins, bridge regressions and installation. Parent native
|
||||
[#124](https://git.whoagland.com/Codex/healer-man-godot/issues/124) remains open:
|
||||
native offline profiles currently store identity/appearance and do not persist
|
||||
runtime item inventory/loadout or expose recovery. RoM entry retains empty gear.
|
||||
Source-backed RoM progression and equipment presentation are not established by
|
||||
the source association catalog. CoA is Ascension Conquest of Azeroth, distinct
|
||||
from supplementary Chronicles of Arcadia references; no native CoA mode is added.
|
||||
|
||||
RoM stat formulas, weights and allocations remain under the separate native
|
||||
[#123](https://git.whoagland.com/Codex/healer-man-godot/issues/123) claim. The
|
||||
existing possibility of non-finite native gear aggregates is tracked separately
|
||||
in shared [#10](https://git.whoagland.com/phenom/healer-man/issues/10); namespace
|
||||
metadata does not establish numeric bounds or source authenticity.
|
||||
|
||||
## Verification
|
||||
|
||||
Validation results and exact inputs are recorded with the owning issues. The
|
||||
focused item/equipment suites pass 39 tests; account/migration/cloud suites pass
|
||||
35; combat/stat regressions pass 120; selected training/slot checks pass three;
|
||||
and the avatar suite passes 56 with verified copied inputs and explicit
|
||||
AppleDouble exclusions. The native source-boundary suite passes seven tests,
|
||||
and the candidate native bundle builds from the composed, pinned source.
|
||||
|
||||
The required browser production build currently stops at the missing
|
||||
`public/assets/game/manastorm` asset-audit input in the isolated review checkout.
|
||||
This is retained as an unmet browser build/visual verification limit; a passing
|
||||
native bundle does not certify the browser release. Source TypeScript and
|
||||
combined native/card/simulator checks are recorded separately. The repository
|
||||
release hygiene check passes. No new GPU capture, live browser roster/dungeon
|
||||
check, manual playthrough or listening is claimed.
|
||||
|
||||
The full source app TypeScript check passes with the original `src` scope and
|
||||
task-local exclusions for AppleDouble companion files. All 21 selected native
|
||||
cases pass across the unchanged 20-case run and the exact missing-catalog case
|
||||
rerun. A serial public-runtime comparison matches all five Ready WoW profiles
|
||||
at level 80 with identical clock and random inputs. Those profiles have empty
|
||||
gear; equipped-item and migration behavior is covered by the focused source
|
||||
suites. Earlier varying mana results came from run-ID-seeded party identities,
|
||||
not a gear formula change; the superseded controls remain in the archive.
|
||||
|
||||
See `gear-namespace-validation.json` for exact source and evidence identities.
|
||||
@@ -0,0 +1,85 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"date": "2026-10-10",
|
||||
"coordinator": "/root",
|
||||
"session": "01a11cd3-fa7c-7510-ba8f-bc7a3d0310a6",
|
||||
"issues": {
|
||||
"native": 292,
|
||||
"nativeParent": 124,
|
||||
"shared": 9
|
||||
},
|
||||
"status": "tested-native-checkpoint-browser-verification-incomplete",
|
||||
"sourceFiles": {
|
||||
"src/game/lootTypes.ts": "36b11682b214bc479267075c720cb4afcdbb5c8ba7ac18c199d706c3f1313baa",
|
||||
"src/game/equipment.ts": "76a9757a9727cb7fa543695d8f77426ab1328688a65f4f2212b6c144afb16f92",
|
||||
"src/game/lootCatalog.ts": "7027dadc2f7f90f6e7b65603b38873b3ad32e09fb4807ceea541caa39278a5f5",
|
||||
"src/game/runewakerLootCatalog.ts": "113008a954c27611e4cc28576290fc721f254dee41427285a355f8e30ba70b9a",
|
||||
"src/game/lootPolicy.ts": "bded57df5de902ba01c365ac021709f572aeb692a7cc8a6c0edfd6494d8cad9d",
|
||||
"src/game/combatStore.ts": "f49b7af337af0fb6e69f6df68ec5ec9ab558cc88fe819ae30c4cf9ad823cd4e5",
|
||||
"src/game/heirloomEquipment.ts": "057da9166c2a29086fc8ef59afc81fb985ee52926b6cf2f91212809c987d0ff8",
|
||||
"src/app/accountRepository.ts": "32f6f63537db2312e553dee4c00cbb24ec04b1b0dc5d3079227a8e30d932f8e3",
|
||||
"src/app/types.ts": "41bb6aac2fd03b7c8c4c4c8e6b475bec4df5d3422627a61489077feada34b628",
|
||||
"src/app/onlineAccountClient.ts": "04eac8950a503ffccebf29f73f981c1d01a9e558e4712200aaf4ff534279acfe"
|
||||
},
|
||||
"composedNativeSourceFiles": {
|
||||
"src/game/lootTypes.ts": "36b11682b214bc479267075c720cb4afcdbb5c8ba7ac18c199d706c3f1313baa",
|
||||
"src/game/equipment.ts": "76a9757a9727cb7fa543695d8f77426ab1328688a65f4f2212b6c144afb16f92",
|
||||
"src/game/lootCatalog.ts": "7027dadc2f7f90f6e7b65603b38873b3ad32e09fb4807ceea541caa39278a5f5",
|
||||
"src/game/runewakerLootCatalog.ts": "113008a954c27611e4cc28576290fc721f254dee41427285a355f8e30ba70b9a",
|
||||
"src/game/lootPolicy.ts": "bded57df5de902ba01c365ac021709f572aeb692a7cc8a6c0edfd6494d8cad9d",
|
||||
"src/game/combatStore.ts": "5afefb58b9a02b564cf07140c19388163a8423d22695f3619d196a9d603eeb7d",
|
||||
"src/game/heirloomEquipment.ts": "057da9166c2a29086fc8ef59afc81fb985ee52926b6cf2f91212809c987d0ff8",
|
||||
"src/app/accountRepository.ts": "32f6f63537db2312e553dee4c00cbb24ec04b1b0dc5d3079227a8e30d932f8e3",
|
||||
"src/app/types.ts": "41bb6aac2fd03b7c8c4c4c8e6b475bec4df5d3422627a61489077feada34b628",
|
||||
"src/app/onlineAccountClient.ts": "04eac8950a503ffccebf29f73f981c1d01a9e558e4712200aaf4ff534279acfe"
|
||||
},
|
||||
"nativeEngineSha256": "6f9a06c8fb46dbc25b5ff7aa1fee77fcc950a8481e2beb8eb9ed69e33d51e15d",
|
||||
"checks": {
|
||||
"sourceFocusedUniqueTests": 253,
|
||||
"sourceGroups": {
|
||||
"itemEquipment": 39,
|
||||
"profileCloud": 35,
|
||||
"combatStats": 120,
|
||||
"targetedTraining": 3,
|
||||
"avatar": 56
|
||||
},
|
||||
"sourceAppTypecheck": "pass: full original src scope; task-local AppleDouble exclusions only",
|
||||
"sourceReleaseHygiene": "pass",
|
||||
"sourceBrowserBuild": "blocked: missing public/assets/game/manastorm in isolated review checkout",
|
||||
"nativeBundleBuild": "pass",
|
||||
"nativeFocusedCases": 21,
|
||||
"nativeCoverageMethod": "20 unchanged cases pass in attempt-03; the one missing-catalog case passes in the exact-case rerun after copying and pinning the installed boss-card catalog",
|
||||
"readyWowParity": "5/5 level-80 public Ready profiles match with fixed clock/RNG and one fresh process per profile; empty gear only",
|
||||
"liveBrowserRosterAndDungeon": "not performed",
|
||||
"newGodotGpuCapture": "not performed"
|
||||
},
|
||||
"artifacts": {
|
||||
"diagnostics/source-worker/attempt-08/source-worker-receipt.json": "8bcae5d6e47e7e3547ac72d5f3d650fa2f7280993f96a77a3a597fd32e696a48",
|
||||
"diagnostics/persistence-worker/final-receipt-attempt-04.json": "241b8423795b3596b3f77fcc93c0d50bf093f0dcfa6043ec9974c1c8050d1b2a",
|
||||
"diagnostics/required-source-checks/combat-regressions-attempt-01/result.json": "8def574f70b9b19ff57f4413eb4382ecd1e29df126d1036173dd092974021e2d",
|
||||
"diagnostics/required-source-checks/avatar-attempt-03/result.json": "74b511dc10bc233f4aaf49c3bf5a5eb6a626e5639b85332b1444a8d50ec08157",
|
||||
"diagnostics/required-source-checks/typecheck-attempt-04/result.json": "cb2f6f49e3f8f2f3c3f44ce02e0a0f644bcb9d69dfe656ba04b78cfb2af517ca",
|
||||
"diagnostics/required-source-checks/release-attempt-01/result.json": "1c0cd604233dfc3ed01ddca47b34770392e917cd5a589efee15a46d1ceb4c230",
|
||||
"diagnostics/required-source-checks/build-attempt-02/result.json": "d068f38485c7a38af27586d1bbd1ad96db9630bf976092da0572fe0c3a7d5255",
|
||||
"diagnostics/native-build/baseline-attempt-02/result.json": "92bf94d5b26fa99c502575d2fb9bd624518f9e5e21b362b697324efd6a6e6d63",
|
||||
"diagnostics/native-build/candidate-attempt-01/result.json": "05bf46066a9429edb2405d4a60ca7937446f1cb978e71e504a1bf0a051b3dbfb",
|
||||
"diagnostics/native-regressions/attempt-03/result.json": "7e31c04b48f9b01e1419c718023ad929a65cc0efdc3c4759e00a3b72e5d6775e",
|
||||
"diagnostics/native-regressions/cards-catalog-rerun-attempt-01/result.json": "23b8d1b0216de53c462ca25ada0443aa9bdd62336dd554b10bc5f0b9dfa19fcf",
|
||||
"diagnostics/persistence-worker/wow-preservation/attempt-10/acceptance-receipt.json": "8533744d44af288149572f7147c69961b50315101e3c7f86e90ee4d0bafc99ea",
|
||||
"diagnostics/native-candidate-integration/attempt-02/result.json": "44d4672f6f1c174563e2524fffe38ab18f1d96b74486b7a0c198bad764990fbe",
|
||||
"diagnostics/native-candidate-integration/attempt-02/hunk-preservation.json": "b2f6c6e236dc6484fd14ee9bada39fd60933b33320b927e721370feff8445e44",
|
||||
"diagnostics/required-source-checks/release-attempt-02/result.json": "daf8d3a2bc4dd0d103127687d6fd44ba5ee30f7e2ff51f518fb88fe80004caa6"
|
||||
},
|
||||
"preservedScopes": [
|
||||
"WoW rigs/animations/models/stats and installed short-GCD work",
|
||||
"#123 RoM formulas/weights/allocation",
|
||||
"native cards-only loot and simulator reward policy",
|
||||
"character category independent from dungeon category"
|
||||
],
|
||||
"remaining": [
|
||||
"Full browser build and live roster/in-dungeon screenshots",
|
||||
"#124 native offline item/loadout persistence and recovery UI",
|
||||
"#124 authenticated RoM item progression and equipment presentation",
|
||||
"Shared #10 non-finite aggregate follow-up"
|
||||
]
|
||||
}
|
||||
Reference in new issue
Block a user