Repository navigation
Conversation
…vice Windows applies the Microsoft OS 2.0 registry property (DeviceInterfaceGUIDs) only when it installs an interface. A Windows computer whose interface 1 was set up without it keeps no device path, so WebUSB's claimInterface fails and the site shows its 'another tab' line. A new revision (0x0101) should make Windows set the interfaces up again. Draft: not yet tested on a unit. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…names the computer on Windows The base reports bcdDevice 0x0101: regenerated with --beta --write (browser .bin = build_core.py .bin 25e1bbf7). The descriptor test now requires the new revision and stock's bytes elsewhere. On Windows the busy line adds: install the latest base from the card once (a computer that set up the vendor interface without its GUID can't claim it, with the same NetworkError as a busy unit). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
octatrack:module-packages restamped four; Sidechain 0.2.1 is held, so its requiredBase is set by hand (the base build printed its sha fd275bf2, the committed bytes). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
repeat98
marked this pull request as ready for review
November 12, 2026 16:43
Owner
Author
|
Closed into #1502: all changes that need a new Octatrack base go out as one base update. This branch is merged there with its commits, and its description and test notes are carried over. |
ex1010
pushed a commit
to ex1010/modwerk
that referenced
this pull request
Nov 13, 2026
…vision repairs it The Windows test repeat98#1476 still owed, run on the owner's PC on 13 November 2026: a missing DeviceInterfaceGUIDs breaks the connection and survives a replug; the unit arriving with another bcdDevice writes it back. Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
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.
Draft: waits for one Windows test (below). Base regenerated,
pr:readyReady.claim-failed, never connected), while other Windows computers connect fine.edge://device-log: the composite device enumerates (usbccgp), the audio interfaces bindusbaudio, but for the vendor interface Edge logsFailed to parse device interface GUID:(empty) andInterface 1 has no device path. SoclaimInterfacefails, andOctatrackLink.claim()maps every claim failure tobusyandLINK_BUSY. On a working Windows dev unit the same interface (USB\VID_1935&PID_0002&MI_01) has serviceWINUSBandDeviceInterfaceGUIDs = {4DEA1B9D-6B51-400A-93C9-5CFFC5DF8CF1}from the base's MS OS 2.0 set (usb_base.py msos20(), unchanged since 10 Oct). Windows writes that registry property only when it installs an interface, so a computer that set up interface 1 without it keeps an interface WebUSB can't open. What set it up that way on the affected computer is unknown (octabam's firmware sends no Windows descriptors).bcdDevice0x0101 (BASE_REVISION) instead of stock's 0x0001. A changed revision changes every interface's hardware ID (…&REV_0101&MI_01) and the key of Windows' per-device USB cache (usbflags\19350002xxxx), which should make Windows set the interfaces up again from the MS OS 2.0 set, GUID included, with nothing for the musician to do. WebUSB permission (VID/PID/serial) and Windows' device instance (serial-based) keep their identity. Fallback if the revision isn't enough: a new serial number (a certain fresh setup, but everyone picks the unit in the USB picker once).npm run octatrack:base -- --stock … --beta --write): identity87258f15…(was4854b76c…); browser.bin=build_core.py.bin25e1bbf7…, 782,340 bytes. The descriptor test now requires the new revision and stock's bytes everywhere else.87258f15…(npm run octatrack:module-packages): Output Matrix, CC Map, Recorder Loop Fix, Analog BD; no package bytes changed. Sidechain 0.2.1 is held, so the tool skips it: itsrequiredBaseis set by hand, after the base build printed its shafd275bf2…, the committed bytes.linkBusy(), the same user-agent split asopenFailure()). The rest of the line no longer says another tab is certainly the cause.changelog/2026-11-12-windows-usb-reconnect.md.navigator.locks.query()can't work: the claim runs while this tab holds the USB lock, and another browser or profile never shows up in this profile's locks. Sending the claim error's name withclaim-failedadds nothing: Chromium rejects every failed claim with the sameNetworkError("Unable to claim interface."), whether the interface has no device path or another browser holds it.The Windows test (resume here)
The build folder is on the owner's Mac, outside Git:
~/.cache/modwerk-local/ot/winusb-rev/beta. Rather than rebuild on the Windows PC, RAM-boot the unit from the Mac and move the cable: the Octatrack has its own power, so a RAM boot survives the move.reg query "HKLM\SYSTEM\CurrentControlSet\Enum\USB\VID_1935&PID_0002&MI_01" /s /v DeviceInterfaceGUIDs(note the key and value), thenreg delete "<that key>" /v DeviceInterfaceGUIDs /f. Replug. Expected:pnputil /enum-interfaces /class {4DEA1B9D-6B51-400A-93C9-5CFFC5DF8CF1}lists nothing,edge://device-logshows the two errors above, and the site shows the busy line.npm run device -- boot ~/.cache/modwerk-local/ot/winusb-rev/beta(RAM boot, no flash).reg queryshows the GUID,pnputillists the interface, and the site connects to base87258f15…. If not, restore the value (reg add "<key>" /v DeviceInterfaceGUIDs /t REG_MULTI_SZ /d "{4DEA1B9D-6B51-400A-93C9-5CFFC5DF8CF1}" /f) and the fallback is a new serial number.After a pass: add the Windows trap line to
docs/OCTATRACK_HARDWARE_TRAPS.md, mark ready, merge; base release steps as usual. An affected member can't take a USB base update, so they install the new base from the card once (what the new line says).How I checked it
npm run pr:ready: Ready, after merging main (run without the localdsp_asm, as CI does: with it,test_resident_enginesfails 1004≠1009 as it does on main, anddsp_packages --checkstops on a KeyErrormodulationfrom the local octabam checkout; this branch touches neither).test_recipe.pydescriptor test andoctatrack-link.test.ts/BaseInstallDialog.guide.test.tspass.What the guides lacked or got wrong
docs/OCTATRACK_HARDWARE_TRAPS.md(USB and EP0) says Windows binds WinUSB by itself, but not that Windows keeps an interface's first setup. To add once the Windows test confirms the remedy.🤖 Generated with Claude Code