acdream/docs/plans
Erik a34e8f2a17 fix #420: seed face-segment media states so character select stops crashing the client
Every launcher-started play session on 2026-08-19 died a few seconds after
login. The user's own session evidence shows it three times in a row:
started -> connected -> characterList -> exited code 1 "crashed", with
client.err.log carrying

  System.ArgumentNullException: Value cannot be null. (Parameter 'key')
     at System.Collections.Generic.Dictionary`2.FindValue(TKey key)
     at AcDream.App.UI.UiButton.OnDraw(UiRenderContext ctx)

UiButton allocated its per-face-segment media-state array as `new string[n]`,
leaving every element null, while the single-face sibling _faceMediaState was
correctly seeded to "" (DirectState). NextMediaState returns `current`
unchanged on three of its four arms — including retail's own "committed state
authored with an empty media array keeps the previous media playing" rule — so
on a multi-segment button whose committed state carries no media the null
survived the first SyncMediaStates and reached
ElementInfo.StateMedia.TryGetValue(null), throwing mid-paint and taking the
process down.

Seed the array with "" at construction. That is what the constructor's
existing comment already claimed the media machine did ("the media machine
begins on the element's BASE media"); only the segment array was left out.

Verified by reverting the one-line fix: the new regression test throws
ArgumentNullException from UiButton.ActiveFile, the same frame as the live
crash. AcDream.App.Tests UiButton filter: 41 passed, 3 skipped.

Found while investigating Campaign LU item 4 ("launching the selected
character doesn't work") — this is why nothing worked. Also lands the Campaign
LU plan doc, whose recon section records the mechanisms the remaining slices
build on.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-19 18:32:28 +02:00
..
2026-04-10-phase-1-terrain-and-plugin-scaffold.md docs: phase 1 implementation plan 2026-04-10 09:17:49 +02:00
2026-04-10-phase-2-static-meshes-design.md docs(phase-2): refine design after DatReaderWriter spike 2026-04-10 17:18:43 +02:00
2026-04-10-phase-2-static-meshes-plan.md docs: phase 2 implementation plan (tasks 1-10 full, 11-18 sketch) 2026-04-10 17:27:53 +02:00
2026-04-10-phase-2b-design.md docs: phase 2b design — atlas textures, neighbors, dual cameras, plugin api 2026-04-10 20:00:23 +02:00
2026-04-10-phase-2b-plan.md docs: phase 2b implementation plan (9 tasks) 2026-04-10 20:13:03 +02:00
2026-04-10-phase-3c-terrain-blending-plan.md docs(plan): Phase 3c terrain blending plan 2026-04-10 23:43:04 +02:00
2026-04-10-phase-4-networking-design.md docs(plan): Phase 4 networking design 2026-04-10 22:31:26 +02:00
2026-04-10-plugin-architecture-design.md docs: plugin architecture design 2026-04-10 09:11:52 +02:00
2026-04-11-roadmap.md docs(launcher): prepare Campaign LA user gate 2026-08-15 02:16:41 +02:00
2026-04-13-rendering-rebuild.md fix(movement): jump works locally (airborne velocity preserved) 2026-04-14 00:12:11 +02:00
2026-04-23-sky-weather-lightning-port.md docs(sky): port plan for PhysicsScript/fog/lightning/crossfade 2026-04-24 10:53:46 +02:00
2026-04-24-ui-framework.md docs(ui): align architecture with retained runtime 2026-07-10 16:57:44 +02:00
2026-04-27-phase-c1-pes-particles.md feat(vfx): Phase C.1 — PES particle renderer + post-review fixes 2026-04-28 22:47:11 +02:00
2026-04-29-movement-collision-conformance.md docs(phys L.2g): slice 1 shipped handoff + B.4 gap discovery + plan-of-record 2026-05-12 23:17:05 +02:00
2026-04-30-sky-pes-port.md docs(plans): #36 sky-PES dispatch port plan + .gitignore for retail-debugger scratch 2026-04-30 23:00:46 +02:00
2026-05-08-phase-n5-perf-baseline.md phase(N.5): retirement amendment — InstancedMeshRenderer + StaticMeshRenderer + WbFoundationFlag deleted 2026-05-08 22:01:36 +02:00
2026-05-09-phase-n5b-perf-baseline.md docs(N.5b T10): roadmap + ISSUES + CLAUDE.md + perf baseline updates 2026-05-09 13:03:14 +02:00
2026-05-10-perf-tiers-2-3-roadmap.md docs(perf): roadmap for Tier 2 + Tier 3 entity-dispatcher optimizations 2026-05-10 09:38:38 +02:00
2026-05-11-phase-n6-perf-baseline.md docs(perf #N6.1): apply final-review fixes — spec, baseline doc, issue #55 2026-05-11 12:51:10 +02:00
2026-05-12-milestones.md docs: hand off placement campaign finish 2026-08-03 12:54:47 +02:00
2026-05-12-phase-c1.5b-handoff.md docs(vfx #C.1.5b): handoff for next slice (issue #56 + EnvCell statics) 2026-05-11 18:22:01 +02:00
2026-06-11-building-render-port-plan.md test: separate diagnostic apparatus from release gates 2026-08-18 11:06:08 +02:00
2026-07-02-retail-motion-animation-rewrite.md fix(motion): restore retail object manager order 2026-07-19 21:40:14 +02:00
2026-07-20-automated-world-lifecycle-gate.md docs(runtime): close deterministic world lifecycle gate 2026-07-21 00:00:31 +02:00
2026-07-21-gamewindow-slice-1-selection-interaction.md docs(architecture): close selection extraction slice 2026-07-21 09:04:31 +02:00
2026-07-21-gamewindow-slice-2-live-animation-presentation.md docs(architecture): close live animation slice 2026-07-21 10:03:20 +02:00
2026-07-21-gamewindow-slice-3-live-session.md docs(architecture): close live-session ownership slice 2026-07-21 12:44:48 +02:00
2026-07-21-gamewindow-slice-4-live-entity-integration.md docs(plan): complete GameWindow slice 4 2026-07-21 19:29:04 +02:00
2026-07-21-gamewindow-slice-5-landblock-presentation.md docs(architecture): close GameWindow slice 5 2026-07-21 23:45:45 +02:00
2026-07-21-gamewindow-slice-6-update-frame-orchestration.md docs(architecture): close GameWindow slice 6 2026-07-22 03:54:11 +02:00
2026-07-22-gamewindow-slice-7-render-frame-orchestration.md docs(architecture): close GameWindow render slice 2026-07-22 08:40:52 +02:00
2026-07-22-gamewindow-slice-8-checkpoint-g-runtime-settings.md refactor(settings): own two-phase runtime settings 2026-07-22 13:30:22 +02:00
2026-07-22-gamewindow-slice-8-checkpoint-h-resource-ownership.md refactor(lifetime): own render resource prefixes 2026-07-22 14:42:14 +02:00
2026-07-22-gamewindow-slice-8-checkpoint-i-ordered-composition.md refactor(app): close ordered startup composition 2026-07-22 19:20:20 +02:00
2026-07-22-gamewindow-slice-8-checkpoint-i6-ui-live-presentation.md refactor(app): compose live presentation startup 2026-07-22 17:55:15 +02:00
2026-07-22-gamewindow-slice-8-checkpoint-i7-session-player.md refactor(app): compose session and player startup 2026-07-22 18:28:32 +02:00
2026-07-22-gamewindow-slice-8-checkpoint-i8-frame-roots-session-start.md refactor(app): make session start terminal 2026-07-22 19:06:00 +02:00
2026-07-22-gamewindow-slice-8-checkpoint-j-lifetime-shutdown.md refactor(app): extract focused window lifetime 2026-07-22 19:43:52 +02:00
2026-07-22-gamewindow-slice-8-checkpoint-k-canonical-soak.md docs(architecture): record GameWindow automated closeout 2026-07-22 20:52:25 +02:00
2026-07-22-gamewindow-slice-8-checkpoint-l-closeout.md docs(architecture): record GameWindow automated closeout 2026-07-22 20:52:25 +02:00
2026-07-22-gamewindow-slice-8-composition-lifecycle.md docs(architecture): record GameWindow automated closeout 2026-07-22 20:52:25 +02:00
2026-07-23-world-interaction-completion.md docs: world-interaction program CLOSEOUT — all six slices complete, vendors user-accepted end to end 2026-08-08 17:56:42 +02:00
2026-07-24-modern-runtime-architecture.md docs: reconcile project state and refresh README 2026-07-27 12:53:31 +02:00
2026-07-24-modern-runtime-slice-b-envcell-dedup.md docs(perf): close Slice B with full-bake evidence 2026-07-24 14:10:50 +02:00
2026-07-24-modern-runtime-slice-c-prepared-assets.md perf(content): close prepared asset cutover 2026-07-24 15:49:24 +02:00
2026-07-24-modern-runtime-slice-d-unified-residency.md docs(render): close unified residency slice 2026-07-24 17:06:17 +02:00
2026-07-24-modern-runtime-slice-e-cost-budgeted-streaming.md fix(streaming): preserve portal destination ownership 2026-07-25 08:35:12 +02:00
2026-07-24-modern-runtime-slices-f-g-render-scene.md docs(rendering): close retained-scene G5 2026-07-25 13:55:38 +02:00
2026-07-25-modern-runtime-slice-h.md fix(streaming): preserve portal destination ownership 2026-07-25 08:35:12 +02:00
2026-07-25-modern-runtime-slice-i.md fix(physics): traverse prepared indoor portal topology 2026-07-27 00:02:44 +02:00
2026-07-25-modern-runtime-slice-j.md docs(runtime): close Slice J and activate Slice K 2026-07-27 01:01:41 +02:00
2026-07-25-modern-runtime-slice-j2.md docs(runtime): close J2 session lifetime gate 2026-07-25 19:46:47 +02:00
2026-07-25-modern-runtime-slice-j3-object-table.md docs(runtime): close J3.4 and plan J3.5 2026-07-26 06:09:28 +02:00
2026-07-25-modern-runtime-slice-j3-projection-store.md docs(runtime): close J3.3 and hand off J3.4 2026-07-25 22:29:34 +02:00
2026-07-25-modern-runtime-slice-j3.md docs(runtime): close canonical entity object lifetime 2026-07-26 07:35:42 +02:00
2026-07-26-modern-runtime-slice-j3-delta-stream.md docs(runtime): close J3.5 and plan J3.6 2026-07-26 06:54:47 +02:00
2026-07-26-modern-runtime-slice-j3-hardening.md docs(runtime): close canonical entity object lifetime 2026-07-26 07:35:42 +02:00
2026-07-26-modern-runtime-slice-j4.md docs(runtime): close gameplay-state ownership 2026-07-26 10:17:39 +02:00
2026-07-26-modern-runtime-slice-j5.md docs(runtime): close simulation ownership 2026-07-26 16:29:28 +02:00
2026-07-26-modern-runtime-slice-j6.md docs(runtime): close exact world host ownership 2026-07-26 18:41:24 +02:00
2026-07-26-modern-runtime-slice-j7.md docs(runtime): close the accepted J7 visual gate 2026-07-27 00:12:26 +02:00
2026-07-26-modern-runtime-slice-j8.md docs(runtime): close Slice J and activate Slice K 2026-07-27 01:01:41 +02:00
2026-07-26-modern-runtime-slice-k.md docs(headless): close modern runtime slice K 2026-07-27 11:31:19 +02:00
2026-07-26-modern-runtime-slice-l.md docs(linux): park Slice L at L1 checkpoint 2026-07-27 12:35:47 +02:00
2026-07-27-vulkan-campaign.md docs(render): Campaign V is closed - the deferred reruns pass on the GL-free tree 2026-07-29 07:49:29 +02:00
2026-07-29-network-transport-campaign.md docs: Campaign N CLOSED - user-accepted; #260 closed; #262 filed 2026-07-29 17:48:45 +02:00
2026-07-29-physics-parity-campaign.md test(physics): harden TS-4 production chronology 2026-07-31 14:08:51 +02:00
2026-07-29-post-vulkan-work-intake.md docs: VTank requirements research - the plugin-automation milestone model 2026-07-29 16:29:49 +02:00
2026-07-30-physics-parity-visual-matrix.md docs(physics): close Campaign P visual matrix 2026-07-31 10:20:48 +02:00
2026-08-02-placement-cutover.md docs: close the placement cutover ledger — #280 user-passed, remaining gates NOT RUN 2026-08-06 11:05:49 +02:00
2026-08-03-recent-regression-cleanup.md docs: close the recent-regression cleanup plan 2026-08-03 14:34:07 +02:00
2026-08-06-collision-fidelity-campaign.md test(physics): S6 — the camera provably reaches both PerfectClip TOI tails; contained, not dormant 2026-08-07 09:21:40 +02:00
2026-08-07-morning-gate-checklist.md docs: morning gate G1 user-passed — AD-65 downhill slope feel accepted 2026-08-07 06:50:58 +02:00
2026-08-08-audio-parity-campaign.md feat(audio): Ctrl+M instant mute + inn-chatter investigation closed as server content 2026-08-09 14:09:24 +02:00
2026-08-09-chat-parity-campaign.md fix(ui): round-5 review polish — S1 block outline pass, S2 non-UiText outline paths, S3 citation fix 2026-08-10 22:15:20 +02:00
2026-08-10-options-panel-campaign.md docs: park Campaign OP — gate-4 fixes committed, user re-check owed at resume 2026-08-11 23:11:43 +02:00
2026-08-11-fellowship-allegiance-campaign.md docs: FA7 closeout — Campaign FA CODE-COMPLETE 2026-08-12 10:30:19 +02:00
2026-08-14-launcher-campaign.md Merge campaign-cc2: CC2 CharacterCreate wire, review-closed 2026-08-15 13:39:08 +02:00
2026-08-15-character-creation-campaign.md docs: Campaign CC connected gate PASSED — campaign CLOSED user-accepted 2026-08-16 2026-08-16 19:13:36 +02:00
2026-08-18-release-stabilization.md docs: record stabilization merge handoff 2026-08-18 17:49:09 +02:00
2026-08-19-launcher-usability-campaign.md fix #420: seed face-segment media states so character select stops crashing the client 2026-08-19 18:32:28 +02:00
animation-system-audit.md docs(anim): Phase L.1a animation system audit 2026-04-28 10:38:58 +02:00