Repository navigation
Refuse an AOD screen with no thumbnail, count Pro 3 slots, let a gone dial go - #84
Merged
Merged
Conversation
… dial go Three of the four open points in #49: - The FMC face that crash-loops a Watch 3 Pro on AOD (market 6vkrot44d1oxb19) has an AOD screen with no 0x28 preview node. Every stock AOD screen has one: 129/129 on the Pro 3, 94/94 on the Pro 2. The face reported as working (f4uj4uqrpefo4f2) has one too. assertFlashable now refuses such a file before any install, and the editor's export puts a blank preview back (withPreviews) and bakes it, so opening the face in the editor and flashing it from there fixes it. The tree lets the Preview layer be deleted, which is how a face loses it. - The slot count is per model: 7 on a Watch 3 Pro, as the reporter counted after a factory reset, 6 otherwise. Neither number is measured here. - A dial flashed from this browser stays in the watch list until FMC itself overwrites it. a055 never lists side-loaded dials, so the list only knows them from a local claim, and deleting one on the watch can't reach that claim. Those dials now get a remove button that drops the claim. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018vSR9vwRaYBqnq7ioL9dQ1
The 480 px cap from #78 refused a factory Watch 3 Pro face (Gravity_well, 576x530), so it was stricter than what the firmware accepts. Every other stock face, Pro 2 and Pro 3, stays at or under 470. The hard limit is now 580. Between 470 and 580, flashFx holds the upload and the new size dialog says what the risk is. The face goes to the watch only after "Install anyway". Accepting marks the pending payload, so a full watch's slot dialog retry doesn't ask again. Closing the dialog any other way drops the flash. On the marketplace this turns about 56 refusals into confirmations. Faces over 580 are still refused. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018vSR9vwRaYBqnq7ioL9dQ1
freethinkel
force-pushed
the
issue-49-pro3-aod-slots
branch
from
October 20, 2026 13:26
fb2e843 to
8eac0ca
Compare
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.
Refs #49. This covers the four points from redoxahmii's latest comment, plus a follow-up on #78's image-size cap (section 5). Two are fixed on evidence, one is fixed on the reporter's count, and one is unverified (details below).
1. AOD crash loop on the Watch 3 Pro
I downloaded both market files and compared their AOD screens with each other and with every stock AOD screen. The parser is the one in
core/format.0x28preview6vkrot44d1oxb19(Pipboy, crashes)[group, full-screen image]f4uj4uqrpefo4f2(CR7, works)Pro_3_Watchfaces.zip)None of the other features I checked separates them. Full-screen AOD images are normal in stock (86 of 129 Pro 3 AODs have one, and cf 5 appears there too). Groups appear in 104 stock AODs. The editor lets you delete the Preview layer in the tree, and that is how a face ends up like Pipboy.
What changed:
assertFlashable, the one gate before every install (editor and marketplace), refuses a file whose AOD screen has no0x28. The message tells the user to open the face in the editor and flash it from there.binOf→withPreviews) puts a blank preview on any screen that lacks one and bakes it like the others, so that route fixes the face.Blast radius: 24 of the 501 marketplace files have an AOD screen without a preview and are now refused on direct install. Some of them were already refused for image size.
Unverified, marked
ponytail:inbin.ts: the cause is inferred from a single crashing file. Pipboy's AOD also has a group frame at y=282 that is 466 px tall, reaching 282 px below the panel. No stock face has a group more than 3 px off-panel. If the reporter still sees the loop after re-flashing from the editor, check that next.2. Device info on connection: not fixed, unverified
Name, battery, firmware and serial are what the watch reports:
fwRetbytes joined with dots, theserialRetstring, and battery from0x2a19/0x005c. The screenshot showsCMF Watch 3 Pro-9A9D, 100 %,1.0.1.77,CI0420…, and I can't tell which of these is wrong without the watch's own settings screen to compare. The parts of that screenshot that are provably wrong are the dial list and the6/6(points 3 and 4). The draft reply asks which field differs.3. Stale slot list
The list is the a055 notification the watch sends at connect, plus local claims for dials flashed from this browser (a055 leaves side-loaded dials out;
mergeDials). Only an FMC overwrite or a refusal from the watch drops a claim, and FMC never hears about a deletion on the watch or in Nothing X. That is why Pipboy was still listed. Dials flashed from here now get a small remove button in the watch panel (dialRemoved→unclaimDial+mergeDials). Removing one that is actually still on the watch costs at most one refused upload, which then lands in the slot dialog.4. Slot count
capacityOf(name): 7 for a Watch 3 Pro / Watch Pro 3 by advertised name, 6 otherwise. It is used by the pre-flight gate, the panel header and the troubleshooting page. The 7 is the reporter's count after a factory reset, not measured here (ponytail:inble.ts). The07in the a055 header may be the watch reporting this itself, which needs a second sample to confirm.5. Image size: confirm instead of refuse
The 480 px cap from #78 refused a factory Pro 3 face,
Gravity_well_1753771909031_WatchFace.bin(576×530), so it was stricter than what the firmware accepts. Every other stock face, Pro 2 and Pro 3, stays at or under 470 px.MAX_IMAGE_SIDEis now 580, a hard refusal as before.SAFE_IMAGE_SIDE(470) and 580,flashFxholds the upload and a new dialog (size-dialog.svelte) explains the risk. Nothing goes to the watch until the user presses "Install anyway". Closing or cancelling drops the flash. Accepting marks the pending payload, so a full watch's slot-dialog retry doesn't ask again.Neither number is a measured firmware limit. The
ponytail:onMAX_IMAGE_SIDEstill applies.Checks
npm run check: 0 errors.oxlintandoxfmt --checkare clean on the touched files.tests/flashable.test.ts(an AOD without a preview is refused, andwithPreviewsmakes the rebuilt file pass; 576×530 passes the gate but needs a confirmation),tests/flash-size-confirm.browser.test.ts(the model holds an oversized flash untilsizeConfirmed, and a decline sends nothing) andtests/watch-dials.browser.test.ts(capacityOf).npm test: 321 passed, 0 failed (57 files). Earlier runs had flaky menu-animation failures under load, and they didn't recur here.tests/__fixtures__16/16 pass.Draft reply to the reporter
🤖 Generated with Claude Code
https://claude.ai/code/session_018vSR9vwRaYBqnq7ioL9dQ1