7.2 KiB
7.2 KiB
| description |
|---|
| Task list for Windows support |
Tasks: Windows support
Input: Design documents from /specs/013-windows-support/
Prerequisites: plan.md, spec.md, research.md
Tests: Mandatory, as in specs 001 to 010 (Constitution Principle VI).
Format: [ID] [P?] [Story] Description
Task IDs continue after the original specification's, so every T number in the project names one task.
Phase 1: Setup
- T201 Cross-compile for
x86_64-pc-windows-gnuwith mingw-w64 from macOS, configured in.cargo/config.toml— done: the whole workspace builds, the interface included (R-089). - T202 Move advertising behind
crates/platform/src/responder/sozeroconf, which cannot build for Windows, is left out there — done. - T203 Add run-time DLL loading in
crates/platform/src/dll.rsfor interfaces a machine may lack — done. - T204 Add
scripts/windows-test.shto build test binaries here and run them on a Windows machine, mirroring the tree for tests that read compiled-in paths — done (R-089).
Phase 2: Foundational
- T205 Carry the contract over a named pipe with a recorded random name in
crates/ipc/src/transport/windows.rs, with tests for binding, a live pipe, a stale record, a missing daemon and a planted record — done (R-087). - T206 Stop the daemon through a named event, and on Ctrl-C, console close, logoff and
shutdown, in
crates/platform/src/stop.rsandcrates/daemon/src/server.rs— done: stops gracefully from another session once the event moved to the global namespace (R-087). - T207 Clear
IPV6_V6ONLYon session sockets — done: the IPv4-peer test fails on Windows without it (R-085). - T208 Claim session ports with
SO_EXCLUSIVEADDRUSEon Windows — done, with a test that fails without it (R-088).
Phase 3: User Story 1 — Virtual ports (P1)
- T209 [US1] teVirtualMIDI ports in
crates/platform/src/midi/tevirtual.rs, loaded at run time, with the capability reported unavailable without the driver — done. - T210 [US1] Retire destroyed ports until the next port exists, and keep closed ports' names
out of the device list, in
crates/platform/src/midi/retire.rs— done: the eight-rename test failed five of five runs without it and passed five of five with it (R-086). - T211 [US1] Windows integration tests in
crates/platform/tests/windows_midi.rs— done: seven tests, MIDI and a 6 KB dump both ways through another backend.
Phase 4: User Story 2 — Devices (P1)
- T212 [US2] WinMM inputs and outputs in
crates/platform/src/midi/winmm.rs, the input callback limited to scanning into the ring — done. - T213 [US2] Identity, pairing and message packing in
crates/platform/src/midi/winmm_identity.rs, tested on every platform — done; every test was mutation-checked. - T214 [US2] The backend in
crates/platform/src/midi/windows.rs: a watcher comparing lists once a second, stable enumeration, opens checked against the handle's own position — done. - T215 [US2] Replug USB MIDI hardware on Windows and confirm the route resumes
Phase 5: User Story 3 — Network sessions (P1)
- T216 [US3] Advertise through the DNS Client service, with dots sent as hyphens — done: Avahi on the same subnet resolved the Windows port (R-084).
- T217 [US3] Join a session between Windows and Linux — done: joined at 1.0 ms after T207; the Windows daemon discovered the Linux port.
- T218 [US3] A session started by another machine inviting the Windows one — done once the owner allowed Midi Harbor through Windows Defender Firewall: a Linux daemon invited the Windows port by address and joined at 0.9 ms.
Phase 6: User Story 4 — Service (P2)
- T219 [US4] Task Scheduler backend in
crates/service/src/taskscheduler.rs— done: installs as a standard task, no window, starts at logon. - T220 [US4]
daemon --superviseincrates/service/src/supervisor.rs— done: a killed daemon was running again 2.4 s later and answering 7.3 s after the kill (R-083). - T221 [US4] A daemon that will not stop is ended with its supervisor — done, with a test that fails when the supervisor is left alone.
Phase 7: User Story 5 — Sleep and wake (P2)
- T222 [US5] Power manager notifications in
crates/platform/src/sysevents/windows.rs— done; registers on the test machine. - T223 [US5] Detect a suspend from Windows' unbiased interrupt time rather than
Instant— done, with a test that fails on a wrong unit. - T224 [US5] Sleep and wake a Windows machine with sessions up
Phase 8: User Story 6 — Bluetooth and the interface (P3)
- T225 [US6] Build and run the interface on Windows, releasing a console only it uses — done: the Endpoints page listed the daemon's ports, with no console window beside it.
- T226 [US6] The Bluetooth central role on Windows with a radio, and the peripheral role — the central role is built and reports no adapter correctly; the peripheral role is reported not built on Windows, as the constitution records.
Phase 9: Found on the way
-
T229 Close every port and device before the daemon exits — done after a daemon stopped cleanly and never finished exiting (R-090); the cause is not confirmed, and fifteen cycles since exited.
-
T230 Refuse moving a network port to a taken UDP pair before stopping it — done after the Linux gate failed twice on the undo path (R-091); the test fails without the change.
Phase 10: Polish
- T227 Constitution amendment 1.1.0, AGENTS.md, and the user documentation — done.
- T228 All gates on macOS, Linux and Windows — done at 7389ff2: fmt, clippy, the full test suite and the headless build pass on macOS (357 s) and on the Arch VM (238 s); on Windows, clippy passes for the full and headless builds, all 46 test binaries pass, and the seven teVirtualMIDI integration tests pass.
Phase 11: Windows MIDI Services
- T231 [US1] Virtual ports through Windows MIDI Services in
crates/platform/src/midi/wms/, replacing teVirtualMIDI and the retirement T210 added for it: the in-box API when Windows registers it, the App SDK otherwise, with UMP translation incrates/platform/src/midi/ump.rs— done: through the App SDK RC4, six of the seven integration tests pass, each alone with the service restarted before it (R-093). - T232 [US1] Wait on no call into the service for more than a bounded time, and refuse virtual ports while one is stalled — done: with all seven tests in one process, the first passed and the other six were refused within 7.4 s in total, where before the second waited for good.
- T233 [US1] Recognise this process's ports under the group names the service gives them — done: the multi-connector and own-port tests pass, and the naming tests fail when the suffix or the cut is changed.
- T234 [US1] Refuse a name one of this process's ports shows before asking the service — done: the conflict test failed without it.
- T235 [US1] With Windows' late-2026 update on the test machine, confirm the in-box API is chosen with the App SDK runtime still installed, all seven integration tests pass in one run, and which names WinMM shows