test(coverage): split gap rows into owed work and accepted limitations
Summary
One rule for platform command-coverage gaps: every gap row is either owed work (known-gap, carrying a trackingIssue that names an open owning issue) or an accepted limitation (new accepted-gap level, carrying a non-empty reason why no evidence lane will cover it and no tracking issue). A shared manifest gate, assertCoverageGapRowsAreOwned, enforces both, mirroring the gap: waiver rule ADR 0011 already enforces for interaction guarantees.
Linux's 9 gap rows and web's 1 pointed at the closed #1915 and #1900; each now states its permanent limitation as an accepted limitation, and the closed constants are removed:
- Linux
shutdown,logs,install,reinstall,push,record,install-from-source: the Linux runtime declares those operation familiesunsupported-platform-leaf(verified viainspectFacts), so the commands refuse at admission and no lane can observe success. - Linux
artifacts: local-CLI lane outputs are caller-owned paths; request finalization only inventories remote-transport artifacts or the sparse-snapshot fallback screenshot, which no Linux lane observes. - Linux
trace:handleTraceCommandnever binds a device runtime, and neither Linux lane carries a trace step.
macOS moves doctor, shutdown, events, trace, and react-native to accepted limitations, each reason checked against the lanes (the replay and both provider scenarios carry no such step); find, fill, type, focus, longpress, swipe, diff, batch, test, and replay stay known-gap on the open #1916, so the one-constant assertion still holds. tvOS keeps all 38 rows as owed work on #1914 (fact inspection shows those operations are admitted on tvOS; none is clearly not applicable). Test-only; no runtime behavior. 10 files touched, all in test/integration/command-coverage/ with its platform manifests and smoke tests.
Validation
Tested at 8f4a7b7aa99d1a88f2a609062b805e8e26e6164f. Planted-red proof under the new rule before reclassification: a known-gap row without a tracking issue failed with macOS replay: a known-gap row must carry a tracking issue that owns the work; an accepted row with an empty reason failed with macOS trace: an accepted-gap row must carry a non-empty reason. Both reverted; all six coverage suites then passed (Linux 6, web 8, macOS 7, tvOS 7, Android 10, iOS 14), and the web entry type dropping its known-gap variant makes a regressed row a compile error.
pnpm check:affected --run --head 8f4a7b7aa ā all runnable checks passed with exactCommit=true (format, lint, typecheck, fallow, integration-node, macos-coverage, vitest-related; device/GitHub-authoritative lanes are CI's obligation). At the first head 2f9c56f, pnpm check:affected --run --head 2f9c56f1a passed the same way and CI went green after one rerun of an unrelated iOS deep-link flake (APP_NOT_RUNNING in the fixture smoke). Published classification summaries are unchanged in all four buckets. Not device-facing; no device run applies.
š¤ Generated with Claude Code