midi-harbor/specs/013-windows-support/tasks.md
2026-09-28 13:59:10 -05:00

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-gnu with 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/ so zeroconf, which cannot build for Windows, is left out there — done.
  • T203 Add run-time DLL loading in crates/platform/src/dll.rs for interfaces a machine may lack — done.
  • T204 Add scripts/windows-test.sh to 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.rs and crates/daemon/src/server.rs — done: stops gracefully from another session once the event moved to the global namespace (R-087).
  • T207 Clear IPV6_V6ONLY on session sockets — done: the IPv4-peer test fails on Windows without it (R-085).
  • T208 Claim session ports with SO_EXCLUSIVEADDRUSE on 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 --supervise in crates/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 in crates/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