Sync upstream PR #67: native themes, SpinTexture, alert sounds - #10
Merged
Conversation
Agent/fix player exp progress
Takes itsspin/spinips 31571ab: the Vellum & Ember / Midnight Frost theme system, the SpinTexture companion project, pet illusions, custom alert sounds and the brighter attack pulse. Conflicts resolved: - Alt+Z lockout OCR is retired, as upstream decided. instance_lockout_ocr.py and its tests are deleted, the scan hotkey and its IPC bridge are gone from the desktop shell, and the retired names are out of the audited sources so upstream's new audit_retired_lockout_ocr passes unmodified. The half of "keep every pending raid kill" that cleared the prompt from a scan goes with it; its test is removed. - The multi-kill fix itself stays. A single pending slot silently discarded the first kill when two raid targets died before a difficulty was confirmed, which is a cross-platform engine bug upstream still has. pending_raid_kills and pendingRaidTargets are kept over upstream's single-slot field. - electron/main.ts is hand-merged rather than taken from either side: it keeps this fork's Wayland window naming and the guard that shows the window even when renderer setup fails, and takes upstream's rendererUrl() theme query. Notification stays imported for alerts; globalShortcut goes with the hotkey. - README keeps this fork's Linux-facing header. Verified: release quality gate ALL PASS, upstream's Loremaster desktop audit ALL PASS, worker tests pass, and both tsc projects typecheck. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This was referenced Aug 14, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
First of four staged merges bringing itsspin/spinips up to date. One PR per upstream PR, each merged before the next, so every step has its own CI run and its own revert point (
git revert -m 1 <merge>).31571ab8a4aef1ca5bc5bf04c861What comes in
The Vellum & Ember / Midnight Frost Glass theme system with persistent cross-window themes, the SpinTexture companion project, restored pet illusions, custom alert sounds, and a brighter attack pulse.
Conflict resolutions
Alt+Z lockout OCR is retired, following upstream's decision. They removed the feature and added
audit_retired_lockout_ocr()to the gate, which fails the build if the module exists or the retired names appear in the audited sources. So this deletesinstance_lockout_ocr.pyand its tests, removes the scan hotkey, its IPC handler and the renderer bridge, and leaves upstream's audit passing unmodified. The half of "keep every pending raid kill" that cleared a stale prompt after a scan retires with it, along with its test.The multi-kill fix stays. A single pending slot silently discarded the first kill when two raid targets died before a difficulty was confirmed — a cross-platform engine bug that predates the Linux branch and that upstream still has.
pending_raid_kills/pendingRaidTargetsare kept over upstream's single-slot field. Worth sending upstream separately.electron/main.tsis hand-merged, not taken from either side. It keeps this fork's Wayland window naming (all three windows would otherwise share a caption, and a WM rule needs something to match on) and the guard that shows the window even when renderer setup fails — an invisible window with a live tray icon was indistinguishable from a hang. It takes upstream'srendererUrl()so the theme reaches the renderer.Notificationstays imported for alerts;globalShortcutleft with the hotkey.README keeps this fork's Linux-facing header.
Verification
ALL PASSaudit_loremaster_desktop.py:ALL PASS— including the retired-lockout audit, unmodifiedtest_desktop_worker: 12 passingtsc --noEmitandtsc -p tsconfig.electron.json: both clean, which is what covers the hand-merged main.ts🤖 Generated with Claude Code