Skip to content

A failed plan park degrades to vanilla instead of hanging the boot - #136

Merged
roowus merged 1 commit into
mainfrom
fix/boot-park-never-hangs
Aug 29, 2026
Merged

A failed plan park degrades to vanilla instead of hanging the boot#136
roowus merged 1 commit into
mainfrom
fix/boot-park-never-hangs

Conversation

@roowus

@roowus roowus commented Aug 29, 2026

Copy link
Copy Markdown
Owner

What

Follow-up to an owner report (overlay stuck on "Loading TSPML…"). Reproducing their exact four-mod set against production boots clean — frame mounts, game alive, 3decspeed 1/1 applied via the numeric-enum fix, husplits honestly token-not-found — so the hang was client state. But the investigation found the launcher could be bricked by its own diagnostics:

  • The boot park chain had no rejection handler, and planReady gates the iframe mount — so ANY throw while parking (a corrupted stored record, a Cache API failure mid-write) left the overlay spinning forever with nothing in the log.
  • buildUserPatchPlan spread mod.mixins ?? [] / mod.pmlMixins ?? [] — a truthy non-array (hand-edited localStorage, or a record written during one of today's mid-deploy windows) threw in the spread.

The fix — the same degrade the route already applies to a bad plan

  1. The boot park step catches: mount the game vanilla, log the failure loudly (✗ parking the mod plans failed — mounting the game WITHOUT mod patches), set planReady.
  2. Array.isArray guards in buildUserPatchPlan and the page's PML-mixin persist merge: a non-array field reads as nothing, which is the truth of it.

Proof

Portal 735 tests (734 → 735, incl. the non-array record case); tsc clean; smoke typecheck clean after the last script edit.

…g the boot

Follow-up to an owner report (overlay stuck on "Loading TSPML…"). Reproducing
their exact four-mod set against production boots clean (frame mounts, game
alive, 3decspeed 1/1 applied via the numeric-enum fix, husplits honestly
token-not-found), so the hang was client state — but the investigation found
the launcher could be bricked by its own diagnostics: the park chain had no
rejection handler, and planReady gates the iframe mount, so ANY throw while
parking (a corrupted stored record, a Cache API failure) left the overlay
spinning forever with nothing in the log.

Two changes, one philosophy — the same degrade the route already applies to a
bad plan:

- the boot park step catches: mount the game vanilla, log the failure loudly,
  set planReady.
- buildUserPatchPlan and the page's PML-mixin persist merge read non-array
  mixins/pmlMixins fields as nothing (Array.isArray, not ?? []) — a hand-edited
  or mid-deploy record can no longer throw in the spread.

Portal 734 -> 735 tests.
@vercel

vercel Bot commented Aug 29, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
tspml Ready Ready Preview Aug 29, 2026 7:13am

@roowus
roowus merged commit 0b8048f into main Aug 29, 2026
5 checks passed
@roowus
roowus deleted the fix/boot-park-never-hangs branch August 29, 2026 07:21
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant