Skip to content

Add notch hover usage overlay - #3164

Open
wdmitchelluk wants to merge 72 commits into
steipete:mainfrom
wdmitchelluk:notch-usage-overlay
Open

wdmitchelluk wants to merge 72 commits into
steipete:mainfrom
wdmitchelluk:notch-usage-overlay

Conversation

@wdmitchelluk

@wdmitchelluk wdmitchelluk commented Aug 24, 2026 •

Copy link
Copy Markdown
Contributor

What this adds

An opt-in usage dashboard at the MacBook camera notch, configured in Settings → Notch. Hover or an optional Toggle/Hold shortcut shows real provider usage and an optional agent-session section. The feature is off by default. Disabled mode creates no windows, performs no screen lookup, and installs no shortcut handlers.

Optional notch ears

The Notch ears toggle extends the same popover to the top of the screen, using the space on either side of the camera. Ears and dashboard share one opaque background and one animation, with square top corners. Turning ears off removes only that upper row; the main dashboard remains available.

The ears intentionally cover and receive clicks in the menu-bar area they occupy while expanded. This is a deliberate, optional tradeoff: the popover appears only after hovering the notch or using the shortcut, and the extra space provides useful at-a-glance information without taking space from provider tiles. Covered menu items become accessible again when the panel closes or ears are disabled. Collapse disables mouse handling immediately, including during the closing animation. The camera-sized hover trigger never widens.

Each ear has its own picker, grouped by provider. Codex and Claude offer Limit Reset Credits and Limit Reset Credits + Expiry separately. Expiry includes days when space permits, falls back to the count in narrower layouts, and retains full details for accessibility/help. Explicit selections keep the provider logo and 0 available for a known empty inventory; missing data remains Unavailable. Claude already had live reset-inventory fetching; this change preserves a valid empty/spent/expired inventory as known zero while still rejecting malformed-only data. The menu's existing zero-hiding behavior is unchanged.

Independent agent sessions

Agent sessions can be enabled in the notch while disabled in Settings → Menu. This lets the menu focus on usage and the notch focus on running work, avoiding forced duplication. Both surfaces use the same session store and scanner. Current main's separate remote-sessions consent still governs discovery and SSH polling.

The agent section has its own column setting: Match providers by default, 1–4 columns, or Column per harness (one column per tool). It also has independent height/scrolling and above/below placement. Provider columns, order, visibility, and height remain separately configurable.

Provider tiles continue to use shared first-party presentation, provider-owned labels, visibility preferences, account-scoped data, reset formatting, error redaction, and the existing brand/monochrome logo assets. No synthetic providers or second scanner were introduced.

Integration and verification

Updated to upstream main 8928b6ee4c8069f283d4621486ffbeaf8086cb12 in merge commit 935420784af5e5611dd7e7a9e93d181a237f7370, preserving the existing contributor and maintainer commits. Main gained nine commits after the previous update. The only manual conflict was in the changelog: all upstream entries were retained, and the notch entry was moved lower in the same Unreleased section to reduce repeated conflicts when main prepends entries. The auto-merged translation catalogs retain main's Ukrainian corrections and the notch strings.

  • GitHub confirms this head is mergeable against main 8928b6ee4.
  • make check: passed, zero violations across 3,105 Swift files, including localization and repository checks. The merged app compiled successfully.
  • Focused notch, reset-inventory, agent-session scheduler, provider architecture, localization, Soniox, and Trae CN checks: 240 Swift Testing tests in 22 suites passed. XCTest: 1 passed, 2 opt-in render exports skipped, zero failures.
  • New-head CI run 39860415668: change detection, lint, and GitGuardian passed; Linux builds are in progress and macOS tests are queued. No final CI conclusion is claimed. The full repository suite for this merge is left to CI.
  • git diff --check passes and the worktree is clean.

The preceding head 95e5707c3 passed 322 Swift Testing tests in 30 suites, plus 1 XCTest check (2 opt-in render exports skipped). It also fixed a test-only dependency on the host's Low Power Mode: both scheduler test factories inject normal power and nominal thermal state through the existing seam. Production behavior and system settings are unchanged. Final test commands use the Bash Scripts/test_environment.sh with Keychain suppression and session-file isolation explicitly checked.

Main also includes #4576's clearer guidance for a temporarily unavailable Keychain cache. It changes no credential read path or prompt policy.

Earlier integration and validation (21b143b25)

The earlier main integration resolved shared settings, launch lifecycle, agent-session, changelog, and localization conflicts.

That earlier main integration also exposed a Swift Charts overload/availability error with the current SDK. Moving conditional bar styling into an explicit @ChartContentBuilder helper preserves rendering and the macOS 14 deployment target; the OpenAI live-usage tests are included in verification.

The following full-suite and native-bundle results are for the earlier head 21b143b25aa8805b7c774c69d282e520adbd6c5e, not the latest main update:

  • make check: passed, zero violations across 3,084 Swift files, including localization and repository checks.
  • Focused notch, agent-session scheduling/remote opt-in, reset-credit, shortcut, provider architecture, localization, and OpenAI live-usage tests: 274 Swift Testing tests in 24 suites passed. XCTest: 1 passed, 2 opt-in render exports skipped, zero failures.
  • Full repository suite: all 1,741 selections in 157 groups passed on the first attempt, with zero failures, retries, or timeouts; 762.0 seconds total. Command: ./Scripts/test.sh --swift-command <native-wrapper> --direct-workers 4; the wrapper forwards build/test to Swift with --build-system native --jobs 4 -Xswiftc -gnone.
  • Swift tests use Scripts/test_environment.sh for credential scrubbing, session-file isolation, and Keychain suppression.
  • Fresh final-source debug bundle packaged, signed, signature verified, and relaunched separately from the installed main app. Hover opening and dismissal were rechecked after the final rebuild. git diff --check passes and the worktree is clean.

CI for that earlier head was started at the previous publication: run 39689208838. At that publication, change detection passed; macOS tests, Linux builds, lint, and GitGuardian were in progress. No final CI conclusion is claimed.

Native evidence

Native captures from signed bundles on a notched Mac, using real provider accounts. These captures predate the latest main update; the post-merge captures below are from 21b143b25. The ears-enabled and single-session-column screenshots use the earlier verified live Claude 0 available state, captured before the main-branch merge. The settings screenshots, ears-disabled screenshot, and interaction recordings are from the merged build. Additional QA agent sessions are inert local test processes. Screenshots and recordings are cropped to the relevant UI.

Ears enabled and disabled

Ears enabled: one opaque panel, square top corners, provider logos, Codex reset credits, Claude 0 available, and sessions grouped by harness. This is the earlier live capture before the main-branch merge.

Ears enabled with Claude zero credits

Ears disabled: the same dashboard begins below the camera/menu-bar row.

Ears disabled

Separate post-merge native window inspection confirms the same expanded window ID in both states: enabled (679, 0, 690, 408) at layer 26; disabled (679, 40, 690, 368) at layer 25. Enabling ears adds exactly the 40-point camera row while preserving the dashboard's bottom edge. The separate nonactivating trigger remains camera-sized (913, 0, 222, 40).

Ear values, grouped by provider

Grouped ear options with separate reset count and expiry choices

Independent agent-session controls

Separate provider and agent-session settings

Agent-session column menu

The notch screenshots above have sessions enabled while Menu sessions are disabled:

Menu sessions disabled

Two provider columns with one independently configured session column and Claude 0 available. This is the earlier live capture before the main-branch merge:

Independent provider and agent-session columns with Claude zero credits

Native interaction recordings

  • Hover, grace period, unified animation, and Toggle shortcut: a brief entry does not open; sustained hover opens; crossing the ears/body keeps it open; brief exit/re-entry preserves it; sustained exit closes. Toggle stays open after key release and closes on the next activation.
  • Opaque ears and click ownership: controlled native probe windows underneath each ear receive one baseline click each, receive no additional clicks while covered, then receive a second click each after dismissal. This checks native event delivery to underlying windows; it is not a claim that every third-party menu extra was tested.
  • Hold shortcut and hover handoff: releasing outside closes; releasing over the panel hands off to hover, then leaving closes.
  • Independent provider/session scrolling: each section scrolls while the other remains fixed, using temporary short section heights and additional inert agent processes.
  • Disablement and shutdown: disabling removes both windows and prevents hover/shortcut activation; re-enabling restores the feature; quitting while expanded leaves no preview windows. The installed main app stays running.

Earlier live Claude zero-credit state

This is an earlier native capture after an explicitly approved credential refresh, before the main-branch merge. It proves the live known-zero presentation with the Claude logo. The merged-build interaction recordings retain Unavailable after restart under the no-prompt credential policy. The replacement screenshots use the actual earlier live zero-credit state.

Earlier live Claude zero-credit state

Remaining review scope

This updates the previous click-through design: enabled ears intentionally own the covered pixels; ears-off and collapsed states release them. The native evidence documents that boundary for maintainer review. This PR remains open for the owner's normal review and merge decision.

Native checks used the built-in notched display in dark appearance. Fullscreen apps, additional displays, display hot-plugging, and light appearance were not exercised. The observed Claude Unavailable state after restart came from the preview launcher forcing Never prompt (and manual refresh), rather than demonstrating a reset-refresh bug. Reset inventory is intentionally live-only; the CLI fallback supplies usage but no reset inventory. Never prompt prevents OAuth-cache recovery/delegated refresh, so absent inventory correctly remains unknown instead of being displayed as zero. The normal app default is Only on user action. No new live credential/restart check was performed for this diagnosis, and no authentication-policy change was added. Temporary QA processes were stopped and the chosen preview settings restored. CI status is reported separately from local verification.

@clawsweeper

clawsweeper Bot commented Aug 24, 2026 •

Copy link
Copy Markdown

🦞👀
ClawSweeper picked this up.

Pull request received. I will update this pull request when review starts.

ClawSweeper review complete

ClawSweeper finished reviewing this revision. The review result is being finalized.

View the workflow run.

@clawsweeper clawsweeper Bot added P2 Normal priority bug or improvement with limited blast radius. proof: 📸 screenshot Contributor real behavior proof includes screenshot evidence. proof: sufficient Contributor real behavior proof is sufficient. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. labels Aug 24, 2026
@clawsweeper

clawsweeper Bot commented Aug 24, 2026 •

Copy link
Copy Markdown

Codex review: needs real behavior proof before merge.

What this changes

Adds an opt-in notch dashboard with provider usage, configurable summaries, agent sessions, and hover or keyboard activation.

Example: On a notched MacBook, enable the overlay and hover over the camera housing for 350 milliseconds.

  • Before: Usage is available through the existing menu surfaces.
  • After: A dashboard opens with provider usage and optional agent sessions; enabled ears also occupy adjacent menu-bar space.

Review scores

Measure Result What it means
Overall readiness 🦐 gold shrimp (3/6) The inspected source has no discrete correctness finding and has focused coverage; native interaction verification remains incomplete in this review, and the expanded product direction needs an owner decision.
Proof confidence 🦐 gold shrimp (3/6) Real behavior proof is necessary before merge. See Before merge.
Patch quality 🐚 platinum hermit (4/6) No actionable review findings were identified.

Product

Kind: Feature · Worth it: Needs a maintainer decision
User problem: Users want to glance at multiple providers and running agent sessions by hovering over the notch.
Reason: The original dashboard has recorded owner support, but the later interaction and configuration expansion goes beyond that approved design.

Merge readiness

⛔ Blocked before merge - 2 items remain

Keep open: this PR contains useful, owner-engaged feature work absent from main, but its later ears and independent-session additions need a scoped product decision.

Priority: P3
Reviewed head: 21b143b25aa8805b7c774c69d282e520adbd6c5e
Owner decision: Required. See Decision needed.

Decision needed

  • Question: Should this PR include default-on ears that intercept covered menu-bar clicks and independently enabled notch sessions beyond the previously approved overlay?
  • Recommendation: Retain the previously approved scope: Defer the ears and independent-session expansion and retain the owner's below-menu-bar dashboard design.
  • Why: The owner approved and repaired the earlier below-menu-bar design, while the contributor explicitly changed that interaction boundary afterward; no subsequent owner approval covers the expanded direction.

Before merge

  • Resolve real behavior proof assessment - Native screenshots demonstrate the real provider dashboard, ears on/off, and settings on a notched Mac; the earlier Claude-zero capture is explicitly distinguished from the merged build. Five interaction recordings are supplied, but this review could not inspect them: the prepared manifest includes only four images, local download failed, and attempted browser retrieval returned Cache miss. This is a review infrastructure limitation, not a request for replacement contributor proof. After adding proof, update the PR body, then request a new review with @clawsweeper re-review. The PR author or someone with repository write access can request it.
  • Resolve maintainer decision - Resolve the maintainer decision shown above before merge.

Findings

None.

Tests

  • Missing end-to-end proof: The posted interaction recordings need direct inspection to verify hover crossing, shortcuts, click ownership, independent scrolling, and teardown; review-side media access prevented that inspection.
Agent review details

How this fits together

The AppKit overlay controller receives hover, shortcut, settings, and display events, then renders SwiftUI content from the existing usage and agent-session stores.

flowchart TD
    A[Settings and shortcuts] --> B[Overlay controller]
    C[Notch hover and display events] --> B
    D[Usage store] --> E[Overlay model]
    F[Shared agent session store] --> E
    E --> G[SwiftUI dashboard and ears]
    B --> G
Loading

Technical review

Best possible solution:

Retain the shared-store, opt-in dashboard and settle the later ears and independent-session scope with the owner before landing.

Do we have a high-confidence way to reproduce the issue?

This PR adds a new interaction surface rather than addressing a reported current-main failure.

Is this the best way to solve the issue?

Reusing shared provider presentation and the existing session scanner is appropriate; expanding into interactive menu-bar space requires a separate owner choice.

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning medium; reviewed against 3eda0841d85f.

Provenance checked

  • Menu-bar interaction boundary changes intended behavior with a stated reason (e04d443: The owner's repair separated the camera-sized trigger from content below the menu bar to preserve neighboring menu interaction; the contributor now explains why optional opaque ears should own covered pixels.)
  • Agent-session scanning and remote consent keeps the original intent (fix(sessions): preserve VPN state during host discovery #4636: Remote monitoring requires its separate opt-in and cancellation safeguards; notch visibility joins the existing monitoring owner without removing that requirement.)
  • Shared shortcut recorder keeps the original intent (Fix shortcut recorder app-language mismatch #3190: The recorder follows the app-selected language throughout editing; generalizing its shortcut name retains the coordinator and localization lifecycle.)
  • Claude reset inventory keeps the original intent (Show Claude limit resets from the Web source #4048: Reset inventory is live-only and malformed grants must not become available credits; the new known-zero representation retains those boundaries and existing menu zero-hiding.)
  • OpenAI live chart styling keeps the original intent (feat(openai): live tokens-per-minute usage with org limits #4495: The chart distinguishes output, cached input, and model series; the explicit ChartContentBuilder helper preserves the same styling branches.)

Testing

Proof path: shipped entry point.

Security

None.

Evidence

What I checked:

Likely related people:

  • Peter Steinberger: Raw commit 0f67e2a adds Sources/CodexBar/AgentSessionsStore.swift:145 relative to its recorded parents. This identifies author metadata, not feature responsibility or a PR merger. (role: source-line author; confidence: high; commits: 0f67e2a7ccb1; files: Sources/CodexBar/AgentSessionsStore.swift)
  • hhh2210: Raw commit 2c0a414 adds Sources/CodexBar/AgentSessionsStore.swift:63 relative to its recorded parents. This identifies author metadata, not feature responsibility or a PR merger. (role: source-line author; confidence: medium; commits: 2c0a41479602; files: Sources/CodexBar/AgentSessionsStore.swift)

Labels

Label changes:

  • add rating: 🦐 gold shrimp: Overall readiness is 🦐 gold shrimp; proof is 🦐 gold shrimp and patch quality is 🐚 platinum hermit.
  • add status: needs maintainer proof decision: A ClawSweeper-authored PR needs a maintainer proof capture or override decision.
  • remove status: 📣 needs proof: Current PR status label is status: needs maintainer proof decision.
  • remove rating: 🦪 silver shellfish: Current PR rating is rating: 🦐 gold shrimp, so this older rating label is no longer current.
  • remove merge-risk: 🚨 other: Current PR review selected no merge-risk labels.

Label justifications:

  • P3: This is an optional presentation feature that defaults off and does not repair an urgent broken workflow.
  • rating: 🦐 gold shrimp: Overall readiness is 🦐 gold shrimp; proof is 🦐 gold shrimp and patch quality is 🐚 platinum hermit.
  • status: needs maintainer proof decision: A ClawSweeper-authored PR needs a maintainer proof capture or override decision.
  • proof: 📸 screenshot: Contributor real behavior proof includes screenshot evidence.

Rank-up moves

Optional improvements that raise the rating; they are not merge blockers.

  • Inspect the already-posted native interaction recordings against their declared scenarios.

Rating scale

6/6 🦀 challenger crab · 5/6 🦞 diamond lobster · 4/6 🐚 platinum hermit · 3/6 🦐 gold shrimp · 2/6 🦪 silver shellfish · 1/6 🧂 unranked krab. Overall follows the weaker of proof and patch quality; ✨ marks media proof (a screenshot, video, or linked artifact) that directly shows the changed behavior.

Workflow

ClawSweeper edits this one comment on every review. Comment @clawsweeper re-review for a fresh review only. Repair and merge execution lanes are retired.

History

Review history (45 earlier review cycles; latest 8 shown)
  • reviewed 2026-08-31T08:36:56.911Z sha 79cae8b :: needs real behavior proof before merge. :: none
  • reviewed 2026-08-31T09:31:48.480Z sha 8c2b161 :: needs real behavior proof before merge. :: none
  • reviewed 2026-08-31T12:33:27.289Z sha d33314c :: needs real behavior proof before merge. :: [P1] Move the feature note out of the shipped 0.56.2 section
  • reviewed 2026-08-31T13:32:41.006Z sha 46d0535 :: needs real behavior proof before merge. :: [P1] Keep the feature note under Unreleased
  • reviewed 2026-08-31T14:25:49.355Z sha 5163850 :: needs real behavior proof before merge. :: [P1] Move the feature entry to Unreleased
  • reviewed 2026-08-31T18:32:44.783Z sha 22e4ece :: needs real behavior proof before merge. :: [P1] Move the feature entry back to Unreleased
  • reviewed 2026-08-31T19:46:24.072Z sha 3e7531a :: needs real behavior proof before merge. :: [P1] Move the feature note to Unreleased
  • reviewed 2026-08-31T20:28:06.183Z sha 1f54bb2 :: needs real behavior proof before merge. :: none

Reviewed October 21, 2026, 7:13 PM ET / 23:13 UTC (Revision 46).

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: d2f342ed97

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread Sources/CodexBar/NotchUsageOverlayController.swift
Comment thread Sources/CodexBar/NotchUsageOverlayView.swift Outdated
@wdmitchelluk

Copy link
Copy Markdown
Contributor Author

Both review findings are fixed in f3b6fec, and the branch is rebased onto current main (merge state is clean now):

  • Shortcut collapse frame — the collapse animation task now restores the collapsed frame whenever the panel is still collapsed, instead of gating on pointer position. A toggle-collapse under a hovering pointer can no longer leave the expanded frame behind as an invisible click target; re-expansion cancels the task, so it never fights a reopened panel.
  • Hotkey with no notched screen — handleHotkeyDown() returns before mutating hotkey or view state when no panel exists, so isExpanded can't be stranded while the lid is closed.
  • VoiceOver — provider tiles now announce name, status, and every bar via ProviderRow.accessibilitySummary (unit-tested).

make check clean, 27 notch tests pass. @clawsweeper please re-review.

@wdmitchelluk

Copy link
Copy Markdown
Contributor Author

Fixed in ab83688: all three bar factories (makeBar, makeCostBar, makeCreditBar) now derive the accessibility label from the visible pieces — title, percentText, and resetText when present — through one shared helper, so VoiceOver hears the same figures a sighted user sees. Tests go through bars() as requested: bar accessibility labels speak the visible values asserts the derived labels (including the reset text and the no-reset case), and the summary test now composes ProviderRow from factory-built bars instead of injecting pre-detailed labels.

make check clean, 28 notch tests pass. @clawsweeper please re-review.

@clawsweeper clawsweeper Bot added rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. and removed status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. labels Aug 24, 2026

@steipete steipete left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Really nice work overall — the self-reported sizing approach and the no-global-monitor/no-AX design are exactly right, and the focused suites plus make check all pass on a merge with latest main. Four findings before this can land, two of them blocking:

P1 — Disabled feature still registers a global shortcut. NotchUsageOverlayController.swift:54 installs the KeyboardShortcuts handlers unconditionally, and the dependency registers any saved shortcut system-wide the moment a handler is attached. Disabling the overlay never unregisters it, and PreferencesNotchPane.swift:38 allows recording a shortcut while the feature is off. That breaks the off-by-default guarantee and can steal shortcuts from other apps. Handlers should only exist while the overlay is enabled.

P1 — Any settings change destroys an expanded overlay. The activation observation (NotchUsageOverlayController.swift:123) reads a computed property backed by the whole observable defaults struct, so unrelated preference changes re-fire it; at line 143 an existing panel is preserved only when collapsed — an expanded panel is closed and recreated, losing hover/shortcut state. Please narrow the observation to the fields that actually affect activation, and preserve an expanded panel across benign changes.

P2 — Controller restarts accumulate shortcut handlers. Handlers registered at line 71 are never removed on stop; each stop/start adds another callback, and in Toggle mode two callbacks make one press open-and-immediately-close the panel. The dependency ships KeyboardShortcuts.removeHandler(for:) for exactly this lifecycle.

P2 — Codex credits aren't actually a fallback. NotchUsageOverlayModel.swift:191 appends monthly credits whenever fewer than four bars exist, even when the extra window/spend bar was already chosen — a Codex account with two ordinary windows shows both, contradicting the documented mutually-exclusive fallback. Gate the append on the fallback slot being unfilled.

Happy to merge once these are addressed — the feature itself is a great addition.

@wdmitchelluk

Copy link
Copy Markdown
Contributor Author

Addressed all four findings in 8fb9030 (rebased onto current main):

  1. Disabled feature / global shortcut — handler installation now follows isStarted && notchUsageSummaryEnabled; disabling removes and unregisters the handlers. The shortcut recorder now explicitly drives RecorderCocoa.isEnabled, so it cannot record while the feature is off.
  2. Broad activation observation / expanded-panel teardown — the controller observes a dedicated notchActivationRevision, incremented only when enablement actually changes, rather than the whole value-type defaults state. Same-screen activation checks now update collapsed or expanded panels in place; a pure lifecycle seam covers both states.
  3. Restart handler accumulation — stop() calls KeyboardShortcuts.removeHandler(for:); installation removes any stale handler before registering and is guarded by hotkeyHandlersInstalled. A serialized regression test verifies disabled → enabled → stop → restart → stop registration state.
  4. Credits fallback — monthly Codex credits append only when neither a known extra window nor valid spend projection has occupied the mutually-exclusive other slot. Regression coverage exercises extra-window, spend, and true-credit-fallback cases through the full overlay model.

Verification on the rebased head:

  • 32 notch tests across 4 suites pass
  • ProviderArchitectureGatekeeperTests: 38 pass
  • make check: formatting clean, 22 locale catalogs OK, 0 lint violations

@clawsweeper please re-review the current head.

@wdmitchelluk
wdmitchelluk requested a review from steipete August 24, 2026 09:34
@wdmitchelluk

Copy link
Copy Markdown
Contributor Author

@steipete I have addressed all four findings in 8fb9030 (rebased onto current main).

# Conflicts:
#	Sources/CodexBar/Resources/ar.lproj/Localizable.strings
#	Sources/CodexBar/Resources/ca.lproj/Localizable.strings
#	Sources/CodexBar/Resources/de.lproj/Localizable.strings
#	Sources/CodexBar/Resources/en.lproj/Localizable.strings
#	Sources/CodexBar/Resources/es.lproj/Localizable.strings
#	Sources/CodexBar/Resources/fa.lproj/Localizable.strings
#	Sources/CodexBar/Resources/fr.lproj/Localizable.strings
#	Sources/CodexBar/Resources/gl.lproj/Localizable.strings
#	Sources/CodexBar/Resources/id.lproj/Localizable.strings
#	Sources/CodexBar/Resources/it.lproj/Localizable.strings
#	Sources/CodexBar/Resources/ja.lproj/Localizable.strings
#	Sources/CodexBar/Resources/ko.lproj/Localizable.strings
#	Sources/CodexBar/Resources/nl.lproj/Localizable.strings
#	Sources/CodexBar/Resources/pl.lproj/Localizable.strings
#	Sources/CodexBar/Resources/pt-BR.lproj/Localizable.strings
#	Sources/CodexBar/Resources/ru.lproj/Localizable.strings
#	Sources/CodexBar/Resources/sv.lproj/Localizable.strings
#	Sources/CodexBar/Resources/th.lproj/Localizable.strings
#	Sources/CodexBar/Resources/tr.lproj/Localizable.strings
#	Sources/CodexBar/Resources/uk.lproj/Localizable.strings
#	Sources/CodexBar/Resources/vi.lproj/Localizable.strings
#	Sources/CodexBar/Resources/zh-Hans.lproj/Localizable.strings
#	Sources/CodexBar/Resources/zh-Hant.lproj/Localizable.strings
@clawsweeper clawsweeper Bot added rating: 🦞 diamond lobster Very strong PR readiness with only minor maintainer review expected. and removed status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. labels Aug 28, 2026
@clawsweeper clawsweeper Bot added rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. and removed rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. labels Aug 31, 2026
@wdmitchelluk

Copy link
Copy Markdown
Contributor Author

@steipete Do you want me to close this PR / you don't plan on adding this functionality?, or should I just leave it open to be looked at for a future release?

Bring the opt-in notch overlay forward without changing the status-item
lifecycle. Use shared provider visibility, reset labels, and icon resources;
reuse the settings recorder and inject shortcut registration in tests.

Fit both scrolling sections inside the screen-clamped content window and
add isolated synthetic renders and regression coverage. Keep the existing
native interaction review hold explicit.

Co-authored-by: William Mitchell <wdmitchell.uk@gmail.com>
@steipete

steipete commented Oct 8, 2026

Copy link
Copy Markdown
Owner

Thanks @wdmitchelluk. The overlay has been reviewed and improved in place at 7fa0df8 (your commits are preserved): it is opt-in, self-contained, uses public AppKit APIs, installs no shortcuts and performs no screen lookups while disabled, and the focused and full local suites pass. What remains is the native interaction proof the owner asked for earlier in this thread, which synthetic renders cannot provide; the PR stays open until that hover check on a notch Mac is done.

wdmitchelluk commented Oct 21, 2026 •

Copy link
Copy Markdown
Contributor Author

@steipete — I merged current main and resolved all conflicts at 21b143b25, preserving the existing contributor/maintainer history. GitHub now reports the branch as conflict-free.

The PR description now includes eight native screenshots and five short recordings from a notched Mac: ears on/off, provider-grouped ear options, independent session settings/columns, hover and both shortcut modes, native click ownership, independent scrolling, disablement, and shutdown. Providers are real; extra QA agent sessions were inert local processes.

The updated design intentionally changes the earlier click-through requirement: optional notch ears extend the same opaque popover and animation into the space beside the camera. They own the covered menu-bar pixels only while the panel is expanded by hover or shortcut; dismissal releases that area. This makes room for reset credits and expiry without consuming the main dashboard. Independent notch/Menu session toggles let the two surfaces serve different purposes without forced duplication, with separate session columns or one column per harness.

Validation passed: make check, 274 focused Swift Testing tests, and the full 1,741 selections across 157 groups with zero failures, retries, or timeouts. A fresh signed final-source bundle was relaunched and checked. CI is still running.

The description also records the limits: native click delivery was checked with controlled underlying windows; fullscreen/external-display/light-appearance checks were not run. The Claude reset screenshots now use the earlier verified live 0 available captures; the merged-build recordings retain the no-prompt restart's Unavailable state. The PR remains open for your review.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

P3 Low-risk cleanup, docs, polish, ergonomics, or speculative feature. proof: 📸 screenshot Contributor real behavior proof includes screenshot evidence. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: needs maintainer proof decision A ClawSweeper-authored PR needs a maintainer proof capture or override decision.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants