midi-bug-reports
Skill721 starsChanged 14 days agoMITView on GitHub
Scope, reproduce and write up a Windows MIDI Services defect, or design a test plan for one.
We split this skill into the rules it gives an agent
7 rules. About 0 are common, 3 are distinctive, and 4 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈3
Distinctive · estimate
This author's own choices. Worth a look.
4
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 21
Use the plain word: If an everyday word means the same thing as the impressive one, use the everyday one.
- Very specific: line 32
Write "2 of 2 devices tested" or "reproduced on the Foo X only.
- Very specific: line 33
Test at least one contrasting device: a different driver (usbmidi2.sys vs usbaudio.sys vs a vendor driver) or a different transport (KS, …
- Very specific: line 34
Put the scope in the title.
- Very specific: line 67
If mididiag exits with code 5, the service stopped answering.
- Distinctive: line 81
Search existing issues first.
- Distinctive: line 85
Use references/report-template.md for the write-up.
≈ “Common” is an estimate: at least 1 in 5 of the 308,232 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Filing a Windows MIDI Services bug report
How the report should read: short, plain, and free of jargon
The two things that make an agent-written report useless are jargon and length. Fix both before you worry about anything else.
- Be brief. Include the detail a developer needs and stop. Do not bury a fact in a paragraph of setup, do not restate the problem three ways, and do not summarize what you just wrote. A reader should be able to find the failure, the scope and the repro without skimming.
- Be technical, not clever. Component names, error codes, message contents and driver versions are all welcome. Figures of speech are not. Do not write load-bearing, smoking gun, deep dive, surface it, unpack, low-hanging fruit, rabbit hole or move the needle. Say what actually happens: "removing it breaks device arrival", "this is the proof", "show it in the UI".
- Use the plain word. If an everyday word means the same thing as the impressive one, use the everyday one.
- Do not hard-wrap the prose. One line per paragraph, per bullet and per table row. The full rule is under Repository rules below, and it applies to reports filed against other repositories too.
Getting the claim right
Three mistakes account for nearly every unusable report. Each has a hard rule below. Do not skip a rule because the failure "obviously" applies everywhere — that judgment is exactly what these rules exist to block.
Rule 1: scope the claim to what you actually tested
One device or one driver failing is a device-scoped or driver-scoped defect until a second, differently-plumbed device also fails. Windows MIDI Services spans several independent transports and two USB drivers; a fault in one says nothing about the others.
- Write "2 of 2 devices tested" or "reproduced on the Foo X only; the Bar Y on the same driver is unaffected". Never write "all devices", "every vendor driver", "MIDI is broken", "no MIDI works".
- Test at least one contrasting device: a different driver (
usbmidi2.sysvsusbaudio.sysvs a vendor driver) or a different transport (KS, KSA, LOOP, BLOOP, NET2UDP, BLEMIDI, DIAG, APP). If you cannot, say so explicitly: "no second device available; scope unverified". - Put the scope in the title.
[BUG]: SysEx over 512 bytes truncated on Foo X under usbaudio.sys/KSAis actionable.[BUG]: SysEx is brokenis not. - Words that require enumerated evidence in the same report: all, every, always, no, completely, regression, affects all users. If you did not enumerate the set, do not use them.
- A loopback or virtual endpoint failing does not implicate hardware transports, and the reverse.
Rule 2: a WinMM report is incomplete until the native path is tested
The paths differ, so which one fails localizes the fault:
| Path | Route | Test with |
| Native UMP (Windows MIDI Services) | app -> SDK -> midisrv -> transport -> driver | midi endpoint monitor, MIDI Monitor (midi2monitor) |
| WinRT MIDI 1.0 | app -> WinRT MIDI 1.0 -> midisrv -> transport -> driver | midi1rtmonitor.exe for input, a WinRT MIDI 1.0 app for output |
| WinMM (classic) | app -> wdmaud2.drv -> midisrv -> transport -> driver | midi1monitor.exe, midi1enum.exe |
- Native UMP also fails -> the defect is in the service, transport or driver. File it there and note WinMM as an affected consumer. Do not title it as a WinMM bug.
- Native UMP succeeds, WinMM fails -> the defect is in the WinMM client or the MIDI 1.0 translation (port mapping, port naming, message translation, buffer sizes). Different component, different fix. Say so.
- The reverse also applies: when reporting a native-path defect, state whether WinMM sees it.
- Report the result for every cell you tested and mark the rest not tested. An empty cell is information; a missing table is not.
Rule 3: report the API mode, and tell the user about Legacy API mode
UseLegacyMidi in HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32 selects 0 = Full Windows MIDI Services (default), 1 = Legacy, 2 = Hybrid. See docs/kb/how-to-change-api-mode.md.
- Record the mode the repro ran under:
midi api-mode get. - For any WinMM-path failure, also try Legacy mode. It removes midisrv and
wdmaud2.drvfrom the path entirely, so the result is diagnostic:- Fails in Legacy too -> not a Windows MIDI Services regression. Look at the device, the vendor driver, or the application.
- Works in Legacy -> the defect is in the new stack, and the report should say which component the Rule 2 matrix pointed at.
- Tell the user in the report that Legacy mode is a supported way to get unblocked while the bug is open, and state the cost so the choice is informed: no multi-client sharing, no built-in loopbacks, no Network MIDI 2.0 or Bluetooth LE MIDI, no USB MIDI 2.0 devices in MIDI 2.0 mode, and no new-style or custom MIDI 1.0 port names.
- Switching:
midi api-mode set legacyfrom an elevated prompt, then reboot. Return withmidi api-mode set fulland reboot. Do not run MIDI Console, MIDI Settings ormidicheckservicewhile in Legacy mode — they try to start the service.
Evidence every report needs
- Full
mididiagreport, attached as a zip: MIDI Troubleshooting and Repair > Diagnostics > Save as zip, ormididiag > mididiag.txtzipped by hand. The whole text is usually longer than an issue body allows. It carries the Windows build, component versions, API mode, service crash history and afindingssection near the end; read the findings first and quote them in the write-up.mididiagis safe to run in Legacy mode: it skips the sections that would start the service. - If
mididiagexits with code 5, the service stopped answering. Before the user restarts, have them save a memory dump from the banner the same app shows, and keep it out of the public issue: it can hold device names and network MIDI passwords. - Device make, model, connection, and the driver in use with its version.
- The transport code from the endpoint's device instance id (
MIDIU_<CODE>_...). - Monitor output from each path tested, not a paraphrase of it.
- A repro using a simple tool (
midi.exe,midi1monitor.exe, MIDI Monitor, Pocket MIDI) rather than only a DAW. DAWs have their own defects.
Test plans
A test plan for client-visible behavior covers the same three axes: API path (native UMP / WinRT MIDI 1.0 / WinMM), device and driver (at least two, differently plumbed), and API mode where the behavior could plausibly differ. State the axes you deliberately excluded and why.
Repository rules that apply to the write-up
- The issue form requires AI-generated analysis to be tagged "AI Generated Content". Tag it.
- The "personal observation that led to the bug report" field must be the user's own words. Do not draft it for them; ask them for it.
- Search existing issues first; duplicates are closed.
- en-US spelling, per .github/instructions/en-us-spelling.instructions.md.
- Do not hard-wrap the prose. A paragraph is a single line, however long; so is a bullet, including its continuation text; so is a table row. Newlines go only between blocks. Code fences keep their own line breaks. A report gets edited by hand before it is filed, and a wrapped paragraph reflows badly and produces an unreadable diff. This applies to reports filed against other repositories too.
Use references/report-template.md for the write-up.
In this repository3 other files it gives its agents.
- AGENTS.mdAGENTS.md
- docs/llms.txtllms.txt
- midi-contributingSkill
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
Reviews can't be read right now.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

