BoundedCommandTests and BoundedProcessTests failed nondeterministically:
4/20 runs idle, 7/8 under CPU saturation. Three separate causes.
1. #require inside a retry loop. waitForPID polled through readPID with
`try?`, but #require records an issue even when its error is swallowed,
so the first read of a created-but-not-yet-written pid file failed the
test outright. Added a non-recording pollPID for the polling path and
kept the recording read as the authoritative final attempt. The two
single-read call sites now poll too - echo $$ > file creates and writes
in two steps, so any single read can see a missing or empty file.
2. A 0.1s deadline racing process spawn. BoundedCommand starts its timeout
concurrently with the spawn, so the deadline also bounded /bin/sh
starting and publishing its pid; under load the child was killed before
it ever wrote the file. Wait for the pid while the run is in flight and
give the child a deadline well clear of spawn cost.
3. A 1s per-process budget on the concurrent fan-outs. Instrumenting the
deadline showed a stalled run observed all 64 exits at ~3.1s, clustered
within 100ms of each other - a global stall, not a straggler. Those
tests assert that no exit is lost during monitor registration, not
latency, so the timeout should not double as a performance assertion.
A missed exit still fails: the 50ms pollUntilExit fallback would never
complete.
Also widened waitUntilGone, since reaping is asynchronous.
No production code changed. Proof: 30/30 idle and 20/20 under full 32-core
saturation, against 16/20 and 1/8 before.
* refactor(macos): remove the custom menu bar hover card
The status item showed two hover affordances at once: the native AppKit
tooltip and a custom SwiftUI panel rendering an "Idle / No recent activity"
card. Keep the native tooltip and drop the custom HUD.
The HUD was the only consumer of the status item's hover tracking, so the
NSTrackingArea and onHoverChanged plumbing in StatusItemMouseRouter goes
with it; click routing is unchanged. WorkActivityStore.lastToolLabel had no
other reader either.
* chore(i18n): refresh native i18n inventory after hover card removal
Deleting HoverHUD.swift shifted the MenuBar.swift line numbers that
apps/.i18n/native-source.json records. Regenerated with
`pnpm native:i18n:baseline`; only line numbers change, no strings added
or removed.
* refactor(macos): drop the orphaned anchored chat panel
Removing the hover card left WebChatManager.togglePanel() without a caller,
and it was the only thing that created the menu-bar-anchored chat popover.
Delete that presentation path: togglePanel/panelHidden, the panel controller
state, WebChatPresentation, WebChatPanel, presentAnchored and its dismiss
monitor, and WindowPlacement.anchoredBelowFrame.
Chat is unaffected as a window - WebChatManager.show() still backs the Dock
menu, --chat and deep links. The status item highlight that tracked chat
window visibility is preserved, renamed to onChatWindowVisibilityChanged
now that no panel exists to confuse it with.
Periphery reports no unused code.
* chore: drop CHANGELOG edit from this PR
AGENTS.md: CHANGELOG.md is release-only and release generation derives it
from merged PRs. Release-note context lives in the PR body instead.
* chore: restore CHANGELOG to the branch base
Correct the previous commit, which restored CHANGELOG.md from current
origin/main and so pulled in an unrelated entry added after this branch
forked. Reset to the merge-base content: this PR now touches no changelog.