Follow-up from #882 (MAL-57 Layer 1).
ServiceHealthChecker.isVHIDDaemonConfiguredCorrectly() now requires ProcessType=Interactive in /Library/LaunchDaemons/com.keypath.karabiner-vhiddaemon.plist, but it is only consumed by the repair postflight (ServiceBootstrapper.repairVHIDDaemonServices), where it trivially passes because repair just rewrote the plist.
Nothing feeds plist-content validation into the wizard's health model: getServiceStatus() computes vhidDaemonServiceHealthy from launchctl runtime state only, and SystemInspector.appendComponentIssues() never emits the (defined but dormant) vhidDaemonMisconfigured issue. Users who installed before #882 keep the stuck-key starvation bug until some unrelated event triggers a VHID repair.
Wanted: wire isVHIDDaemonConfiguredCorrectly() into SystemContext.components / SystemInspector so a stale plist surfaces as a wizard issue with auto-fix routing to the existing VHID repair (which rewrites the plist unconditionally).
Cautions:
isServiceHealthy has a test-mode path that treats plist-existence as healthy; wizard/validator test fixtures will need updating (writeVHIDPlist(programPath:processType:) helper already exists in ServiceHealthCheckerTests).
- Respect ADR-026 validation ordering and keep
SMAppService.status out of hot paths.
Evidence and full causal chain: docs/bugs/MAL-57-duplicate-keypresses.md (2026-06-10 Incident Evidence section).
Follow-up from #882 (MAL-57 Layer 1).
ServiceHealthChecker.isVHIDDaemonConfiguredCorrectly()now requiresProcessType=Interactivein /Library/LaunchDaemons/com.keypath.karabiner-vhiddaemon.plist, but it is only consumed by the repair postflight (ServiceBootstrapper.repairVHIDDaemonServices), where it trivially passes because repair just rewrote the plist.Nothing feeds plist-content validation into the wizard's health model:
getServiceStatus()computesvhidDaemonServiceHealthyfrom launchctl runtime state only, andSystemInspector.appendComponentIssues()never emits the (defined but dormant)vhidDaemonMisconfiguredissue. Users who installed before #882 keep the stuck-key starvation bug until some unrelated event triggers a VHID repair.Wanted: wire
isVHIDDaemonConfiguredCorrectly()intoSystemContext.components/SystemInspectorso a stale plist surfaces as a wizard issue with auto-fix routing to the existing VHID repair (which rewrites the plist unconditionally).Cautions:
isServiceHealthyhas a test-mode path that treats plist-existence as healthy; wizard/validator test fixtures will need updating (writeVHIDPlist(programPath:processType:)helper already exists in ServiceHealthCheckerTests).SMAppService.statusout of hot paths.Evidence and full causal chain: docs/bugs/MAL-57-duplicate-keypresses.md (2026-06-10 Incident Evidence section).