Symptom
Content-band BattleNpcs outlive their content run. During the 2026-07-04 Ubuntu investigation, the five Man0l0 deck-fight actors (0x460C0008–0x460C000C: 3× JellyfishScenarioLimsaLv00, FighterAllyOpeningAttacker, FighterAllyOpeningHealer) spawned by the 06:50:53Z content start appeared in every subsequent session's zone-in bundle for zone 193 — including a brand-new character at quest sequence 0 who had never started the deck fight (map-server.log lines 1329/1474/1629/1800/1944/2109, packet-log census 06:13→07:49Z).
Mechanism
- The only teardown path for the content roster is the director's
ContentFinished (scripts/lua/directors/Quest/QuestDirectorMan0l001.lua). If the owning session dies mid-content (crash, disconnect), nothing despawns the content actors.
- The base-zone neighbour scan has no content-band exclusion: actors carrying
CONTENT_ACTOR_BAND_BIT (0x0004_0000, map-server/src/world_manager.rs:507) are streamed to base-zone viewers who are not in that content instance.
Impact
Before the case-resolution fix (branch feature/ubuntu, f6897e5) this is what converted a one-time content-warp crash into a deterministic kick on every later login (the leaked bit-2 BattleNpcs were re-sent to every session). With the case-resolution fix the client no longer crashes, but unrelated players still see stale battle actors from someone else's abandoned run.
Suggested fix
Either (or both):
- Tear down the content group — despawn its content-band actors — when the owning session ends while a content run is active (
ContentFinished must not be the only teardown path).
- Exclude content-band actors from base-zone zone-in bundles for viewers not participating in that content instance.
Found during the Ubuntu opening-quest root-cause investigation (branch feature/ubuntu, commit f6897e5).
Symptom
Content-band BattleNpcs outlive their content run. During the 2026-07-04 Ubuntu investigation, the five Man0l0 deck-fight actors (
0x460C0008–0x460C000C: 3× JellyfishScenarioLimsaLv00, FighterAllyOpeningAttacker, FighterAllyOpeningHealer) spawned by the 06:50:53Z content start appeared in every subsequent session's zone-in bundle for zone 193 — including a brand-new character at quest sequence 0 who had never started the deck fight (map-server.log lines 1329/1474/1629/1800/1944/2109, packet-log census 06:13→07:49Z).Mechanism
ContentFinished(scripts/lua/directors/Quest/QuestDirectorMan0l001.lua). If the owning session dies mid-content (crash, disconnect), nothing despawns the content actors.CONTENT_ACTOR_BAND_BIT(0x0004_0000,map-server/src/world_manager.rs:507) are streamed to base-zone viewers who are not in that content instance.Impact
Before the case-resolution fix (branch
feature/ubuntu, f6897e5) this is what converted a one-time content-warp crash into a deterministic kick on every later login (the leaked bit-2 BattleNpcs were re-sent to every session). With the case-resolution fix the client no longer crashes, but unrelated players still see stale battle actors from someone else's abandoned run.Suggested fix
Either (or both):
ContentFinishedmust not be the only teardown path).Found during the Ubuntu opening-quest root-cause investigation (branch
feature/ubuntu, commit f6897e5).