fix(atlas): keep the UniqueId, and make a landmark value name one landmark #35
Reference in New Issue
Block a user
No description provided.
Delete Branch "fix/atlas-unique-id-and-landmark-values"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Two defects the Phase 16b re-verify found in the released
v1.2.1bundle — the leg that installs the module through core's own https installer and then actually authors something. Each makes a shipped feature unusable, and no test saw either.1. The aggregator discarded the
UniqueId, so no property lease was authorablelistSpawnersfiltersunique_id IS NOT NULL, so that source was an empty dropdown — and it is the only option source for the Phase 12b object-property leases, so noSpawner.MaxCount/MinDelay/MaxDelaylease could be authored at all, with nothing on the form to say why. Same shape as the atlas defect Phase 16a fixed.Every part of the path was already right except one line. The spawn files carry
<UniqueId>(~6,374 of them);parsePointsreturns it — I ran it, 2,525 of 2,572 intrammel.xml; the column exists and the insert passesp.uniqueId || null.buildAtlasrebuilds each point from an explicit field list anduniqueIdwas not on it — the word appears nowhere in that file.The sharpest part:
PARSER_VERSION = 4's own note reads "a spawn point keeps itsUniqueId, which is what a property lease targets (Phase 12b)". That version bump exists specifically to re-read trees for this field. The intent shipped as a comment while the code dropped the field one function later.PARSER_VERSION→ 5, because the bump is the only thing that re-reads an already-imported tree:sameSourcescompares the tree's hashes, and they have not changed — only what is kept from them. Proven on the rig, where the boot after the fix loggedspawn atlas refreshed from ServUO treeon an unchanged tree and the manual import then correctly answeredunchanged.2. A landmark option value named 23 places at once
The source emitted
value: facet/nameandlandmarkPointresolved withrows.find(...)— first match wins — so 22 of those 23 were unreachable. An author who picked "Entrance — Destard" got Blighted Grove, and the run succeeded with no warning. The group was already the disambiguator: shown in the dropdown, left out of the value.The value is now
facet/group/name, distinct across all 558.landmarkPointtries that form first and keeps the two-part read as a fallback, because every event published before this fix storesfacet/nameand a published version is immutable — refusing to parse those would break runs rather than correct them. The fallback keeps the old first-match behaviour deliberately: it is imprecise in exactly the way it always was, and silently relocating a live event's spawn point is worse than repeating a known imprecision. A three-part value whose group is gone refuses rather than falling back to the name, because it asked for one particular place and the operator needs to know it moved.(A name containing a slash reads as three parts too —
Felucca/Odd/Name— which is why the three-part attempt falls through silently rather than erroring, and the two-part read is what resolves it. Tested.)Verification, on the released-artefact rig
Installer → bundle 2026.09.10 → stock 57.4 tree → protocol-7 sidecar → core at
mainwith this module:Each new test was confirmed to FAIL without its fix. The atlas test asserts the field on the aggregator's output rather than the parser's, which is the whole point of it — and the fixture had no
<UniqueId>at all until now, which is exactly why a green suite said nothing about this for two phases. The landmark test asserts an inequality between two resolved points rather than a literal value string, so it survives another change of format as long as two options still address two places.One thing stated precisely rather than overclaimed: that a three-part value resolves to its own coordinates is proven by the unit test and by
landmarkPointreturning the matched row'sx/y; I did not read the coordinates back off the shard, because teardown had already removed the creatures by the time the run finished.Found by
EVENTS_PLAN.mdPhase 16b. Recorded indocs#231.🤖 Generated with Claude Code
https://claude.ai/code/session_016wDDVXWMDz82WqE1i969r4