Quest-scroll Item identity correction — 2026-10-15¶
Candidate: RuneSchema-0.7.8.0-alpha-quest-scroll-identity-r1-20261015.zip.
Built/tested and installed on Steam/Game Pass at the user's request (2026-10-15),
with backups and hash verification. Includes the existing r3 quests/NPC-equipment
work and shared RuneSchema.QuestItems content. Helpy and stock UE4SS are unchanged.
Reported failure and evidence boundary¶
Game Pass r3 reported Quest-scroll item identity is not canonical for all
tested board contracts. Its two identity reads shared that message, so the old
log cannot establish whether the asset PersistenceID or Item instance cache was
the failing field. Provider audit found all nine bound IDs canonical and all
installed provider files matching their sealed candidates. No item or quest ID
is regenerated, and no binding/content change is required by this correction.
An isolated Steam menu-only native probe reproduced a valid state that r3
rejects. A disposable /Script/Dominion.Item initialized through native
SetItemData had all of the following:
- Loaded vanilla ItemData PersistenceID
1k8-cj3JqEGeRgu1P7PK2g, with FString storage Num=23, Max=24, trailing NUL. A normal FString copy retained Num=23. - Native
ItemDatapointer matching that asset, andBP_GetItemDatareturning the same exact asset. ItemDataPersistenceIdstill empty (Num=0, Max=0) before and after native initialization and the getter. Flags were0x0048000001002200: SaveGame and Transient, without Net/RepNotify. This is not a mandatory replicated live ID.
This establishes an overstrict runtime check, not a string-copy defect. The probe used a private fixture, a transient Item and private configuration/save directories; no player inventory, world or existing save was opened or changed. It is not a live crafted-item or saved/reloaded Game Pass acceptance test.
Evidence: workspace .cache/quest-scroll-identity-evidence-20261015/native-steam-item-lifecycle.log,
SHA-256 57CE6C73FAD33335DC612A31075C28DA0C8C076DFD2AA35E9CB5768D0EF0BE8E.
Probe source/build/start scripts are workspace .cache/quest-scroll-identity-native-probe.cpp,
build-quest-scroll-identity-native-probe.ps1 and start-quest-scroll-identity-native-probe.ps1.
Only this task's exact private probe processes were stopped after testing.
Runtime policy¶
The asset's ID remains mandatory, canonical, nonempty and equal to the existing binding. Reads borrow reflected FString storage; header, capacity, bounded 22 ASCII characters, terminator and canonical final bits are checked before a copy. Missing fields, changed layouts, corrupt headers, malformed values and populated-but-mismatched cache IDs are rejected before acceptance or payment.
An empty instance cache is allowed only after the existing owned/current/loaded
main-inventory and exact slot checks, live ItemData pointer match, and a new
native Item:BP_GetItemData result matching the same asset. The cache field must
also retain its reflected nonreplicated SaveGame/Transient semantics. The cache
is never repaired, filled, cleared or rewritten. Client forwarding still sends
only the normal owned inventory/slot RPC, not a QuestID, asset or reward.
The UseItem override, original-body suppression, provenance check, positive slot count, controller/pawn/world guards, authority execution, operation guard, acceptance receipt, start-cost handling and payout logic remain in place. Duplicate-active, cooldown, missing-prerequisite and uncertain transactions do not get a new consumption/reward path.
Rejections now identify [QUEST-SCROLL][IDENTITY], field name, object path, class,
expected ID, storage Num/Max, bounded characters and reason. Malformed text is
not unboundedly read or printed as arbitrary log content. A subsequent Game Pass
failure can distinguish the asset from the instance cache without guessing.
Verification and remaining acceptance¶
- 183/183 core tests pass with normal temporary-fixture access, including new bounded-string/cache-policy tests and strengthened routing checks. The initial sandbox run's 11 filesystem-fixture failures passed outside the sandbox.
- 75 generated-schema checks pass; no schema or existing IDs change.
- Native build passes, both DLLs are UPX-compressed/integrity-tested, and all 269 core imports match both installed stock Steam/Game Pass UE4SS hosts.
- Extracted compressed Helpy passes private hidden-window/server-desktop lifecycle, manifest/capability, INI, standalone-import, branding and license checks.
Still required in the installed build: new crafted
and saved/reloaded scrolls, both JobBoard_Jobs and Silver for the Restless,
exactly one scroll consumed on acceptance, duplicate-active and cooldown rejection
without consumption, and authoritative multiplayer routing. If the actual Game
Pass warning is caused by another field/state, preserve the new diagnostic and
investigate it; the old generic warning alone cannot prove the affected field.
Verified ZIP SHA-256: 5279EE59F0D5CC44552C428EBEE2425542AEFA858A121DA07AF5D5FDEAA3BBF6.
Compressed core: 4EB60FF501495F8EFB5AC8E5F8BA04E13B002C2DED70AFE8296B32DB5B84F654.
Helpy: E93C1EC074379A4BBD7EFDA1DECE9D1EEAFF1831BA81BF5A69112F93BCD2287E.