@@ -58,6 +58,16 @@ uses `CreateProcessW` with `CREATE_NO_WINDOW`, macOS/Linux the `DclProcesses` na
5858` kill(pid, 0) ` ), not the managed ` Exited ` event. Only the editor keeps the managed ` Process `
5959path (with drained stdout/stderr pipes).
6060
61+ ** Orphan protection** : teardown is cooperative (Dispose kills the child), so a hard crash of the
62+ explorer used to leave the server running — and with the fixed default port an orphan * owns* the
63+ endpoint the next session expects. Two defenses: on Windows (player and editor) every child is
64+ assigned to a kill-on-close Job Object, so the kernel reaps it when the explorer dies for any
65+ reason; and ` StartAsync ` refuses to adopt a foreign listener — after the health check passes it
66+ verifies our own child is still alive, and if the port is answered by anything else (orphan from a
67+ crashed macOS session, unrelated process) it fails fast with an explicit milestone instead of
68+ silently serving stale bundles. macOS has no job-object equivalent; a parent-pid watchdog in abgen
69+ is the tracked upstream complement.
70+
6171Measured (Linux x86_64, CPU encoder): cold whole-entity JIT 0.8s (2-GLB scene) / 5.3s (24-GLB,
627212MB); warm disk-cache hits <1ms; server RSS ~ 16MB idle, 130–435MB peak during converts. v0.16.0's
6373per-file parallelization cut cold whole-scene conversion by ~ 30 s on an M-series Mac against a real
@@ -83,13 +93,30 @@ failure). First run therefore enters the world with bundles already served; outs
8393LSD + ` --local-ab ` the task is pre-completed and boot is unaffected. The wait is absorbed under
8494the splash screen, before the authentication screen.
8595
96+ ** Clean fallback when the sidecar can't be had** : the readiness task resolves to a bool — false
97+ when the server never came up — and ` MainSceneLoader ` then drops the optimized-assets override
98+ (` DecentralandUrlsSource.ClearOptimizedAssetsOverride ` , which also evicts the flag-dependent URL
99+ cache) before any optimized-asset request has resolved. The whole session — scene bundles,
100+ wearables, emotes, LODs, and the registry-composed profile/entities endpoints — falls back to the
101+ production hosts exactly as if ` --local-ab ` had not been passed, instead of hitting the dead
102+ loopback port and recovering per request. A server that turns healthy and dies later keeps the
103+ override (bundles JIT per request; supervision restarts it up to 3×).
104+
86105## Visibility
87106
88107The scene dev console's AB tab mirrors ` /progress/{entity} ` live: the summary shows the server's
89108authoritative ` converted/total ` counter, per-file rows show whatever the 500 ms poll catches
90109(backfilled to the full census when the manifest lands), and milestone rows mark every lifecycle
91110moment — download progress, installed, warm-up started, READY in Ns, already-warm, server-side
92- failures (manifest exitCode), sidecar failed. The sidebar AB button pulses while conversion runs
111+ failures (manifest exitCode), sidecar failed. Content-edit reconversions are mirrored too: the LSD
112+ reload path (` LocalSceneDevelopmentController ` , which already receives the preview server's edit
113+ message — including the changed model's path) raises a consumable signal on
114+ ` AbgenConversionMetrics ` ; the sidecar's session-long watcher (` WatchReconversionsAsync ` ) consumes it
115+ and re-runs the manifest lane, which coalesces with (or triggers) the server's rebuild — the panel
116+ flips back to converting, names the edited file, tracks the rebuild and settles to READY with a
117+ "reconverted in Ns" milestone, accurate even when the rebuild outpaces the progress poll (texture
118+ edits arrive as unnamed whole-scene updates — sdk-commands only names ` .glb/.gltf ` changes).
119+ The sidebar AB button pulses while conversion runs
93120and stays lit after unseen failures. The panel ** opens itself** when long-running work starts
94121(consumable open-request on ` AbgenConversionMetrics ` , consumed by ` DebugMenuController ` ) and
95122** closes itself** a few seconds after a clean READY — any failure keeps it open, and a manual
0 commit comments