fix(linux): list each Antigravity quota pool once - #3799
jsonMartin wants to merge 3 commits into
Conversation
|
🦞👀 Pull request received. I will update this pull request when review starts. ClawSweeper review completeClawSweeper finished reviewing this revision. The review result is being finalized. |
|
Codex review: needs maintainer review before merge. Reviewed September 21, 2026, 3:16 PM ET / 19:16 UTC (Revision 5). ClawSweeper reviewWhat this changesThe PR removes duplicate Antigravity quota rows from Linux and Omarchy while preserving family labels, tray ordering, and pool-specific notification history. Merge readiness✅ Ready for maintainer review Keep open: the duplicate rows remain on current main and in v0.64.0. This is a focused, adequately demonstrated fix with no blocking findings; the earlier representative-order concern is resolved. Priority: P2 Review scores
Verification
How this fits togetherCodexBar’s Linux desktop converts provider CLI JSON into usage rows consumed by native cards, tray indicators, notifications, and Omarchy’s private IPC adapter. Antigravity supplies both named quota pools and representative copies, which this shared model reconciles. flowchart TD
A[Provider CLI JSON] --> B[Shared Linux usage model]
B --> C[Match family representatives]
C --> D[Unique ordered quota rows]
D --> E[Native cards and tray]
D --> F[Quota notifications]
D --> G[Private IPC and Omarchy]
Before mergeNone. Agent review detailsSecurityNone. Review metrics
Root-cause clusterRelationship: Members:
Proposal only: this assessment does not dispatch repair, suppress jobs, mutate sibling items, close, or merge anything. Technical reviewBest possible solution: Keep quota reconciliation in the shared Linux model so every consumer receives unique pools with stable identities and the existing representative ordering. Do we have a high-confidence way to reproduce the issue? Yes: Core’s representative-plus-extras output deterministically produces duplicate rows in the current-main Linux model. Contributor native snapshots and inspected before/after renders corroborate that path; the reviewer did not execute it. Is this the best way to solve the issue? Yes: reconciling copies in the shared model fixes all affected consumers while retaining tray selection, privacy handling, and pool identity; no parallel implementation or new configuration is needed. AGENTS.md: found and applied where relevant. Codex review notes: model internal, reasoning medium; reviewed against 1caaeb8837dd. LabelsLabel justifications:
EvidenceWhat I checked:
Likely related people:
Rating scale
Overall follows the weaker of proof and patch quality. Workflow
HistoryReview history (4 earlier review cycles)
|
Antigravity reports every pool as a quota-summary extra and copies the tightest pool of each model family into its positional windows. The popup listed both, so each representative appeared twice: once under a bare cadence label and again under its family title. Show each representative in its positional slot under its family title and drop its extra copy. The representatives stay first, so the tray meters and summary still report the binding pools, and the extra limit can no longer hide one. The row keeps the pool's own key, so alert history follows a pool when another becomes binding, and families are matched as Core selects them so equal values cannot borrow another family's title.
06e14d8 to
23fa3f9
Compare
…up-duplicates # Conflicts: # Integrations/Linux/Shared/Usage.js # Integrations/Linux/tests/test_desktop.py
Since #3785 the Linux popup and Omarchy panel rendered both the per-family representative bucket and its named copy. The shared Usage.js now keeps each representative first with its family title and bucket key and drops the duplicate, matching only on the Antigravity provider, exact quota-summary ID prefix and equal raw values. Also makes the Linux account-action log test wait for file contents rather than existence. Adopts #3799 and #3839. Co-authored-by: jsonMartin <4033621+jsonMartin@users.noreply.github.com>
Adopt the logo renderer and SVG packaging from #3795 independently of #3794 and #3799. Share compact text segments with the existing summary so quota selection, display mode, ordering, and overflow stay unchanged. Preserve text fallback for missing logos and older IPC backends. Closes #3795 Refs #3794 Co-authored-by: jsonMartin <4033621+jsonMartin@users.noreply.github.com> (cherry picked from commit b6c59b6)
Adopt the logo renderer and SVG packaging from #3795 independently of #3794 and #3799. Share compact text segments with the existing summary so quota selection, display mode, ordering, and overflow stay unchanged. Preserve text fallback for missing logos and older IPC backends. Closes #3795 Refs #3794 Co-authored-by: jsonMartin <4033621+jsonMartin@users.noreply.github.com> (cherry picked from commit b6c59b6)
|
Thanks @jsonMartin. We reproduced the duplicate rows against current main and adopted your fix in #3844, preserving your coauthor credit. Family representatives retain their leading positions and bucket keys, preserving tray values and alert history. We additionally confined matching to Antigravity quota-summary IDs and matched Core’s title tie-breaker for identical same-family windows. All 36 portable model tests and 154 focused Swift tests pass; native desktop/Omarchy CI passed on x86_64 and ARM64, and general CI is green. Landed on main via #3844. |
TL;DR
This removes duplicate Antigravity usage limits from the Linux popup and Omarchy panel. Each limit appears once, with its model family in the label. The tray meters still show the limit with the least remaining allowance in each family, and the tray tooltip still shows the first of them.
What changes
This synthetic example compares
mainwith this PR. It uses four Antigravity pools, meaning separate usage allowances. Gemini weekly has 93% left and Claude/GPT 5-hour has 100% left; these are the selected limits for their families.mainsummaryantigravity 93%antigravity 93%7 day 93·5 hour 100·Gemini 5-hour 97·Gemini weekly 93·Claude/GPT 5-hour 100·Claude/GPT weekly 100Gemini weekly 93·Claude/GPT 5-hour 100·Gemini 5-hour 97·Claude/GPT weekly 100Details
Why the rows appeared twice
Core lists each Antigravity pool as an
antigravity-quota-summary-*extra window. These are the named usage limits reported by Antigravity. Core also copies the limit with the least remaining allowance in each family into theprimary/secondaryslots, usingAntigravityStatusProbe.quotaSummaryRepresentative.The Linux model displayed both copies. One used a duration label, such as "7 day 93%". The other used the family title, such as "Gemini weekly 93%".
rows()now keeps the selected limit in its original slot, uses its family title, and removes the extra copy. It does this before applying the 8-extra limit, so that limit cannot hide a selected pool. Each row keeps the pool's ownextra:<id>key, preserving its alert history when the selected pool changes.Matching follows Core's family selection: Gemini goes in
primary, and Claude/GPT goes insecondary. Equal values therefore cannot give a pool the other family's title. This matching only runs when the named quota-summary extras described above are present.Proof
All data below is synthetic.
Native Linux desktop. I built
codexbar-linuxfrommain(9d3f6bf54) and from this branch. Each build ran with--background --no-trayagainst a fake provider CLI, in an isolated HOME and XDG runtime. I read its private IPC snapshot, the data shared with the UI, usingcodexbar-linux --snapshot.The snapshot carries the same usage rows the native popup and tray use, and the Omarchy panel reads it directly. The tray meters draw its first two windows, and the tray tooltip uses its
summary. The table above shows that each pool appears once while each family's selected limit stays first.Rendered card. The desktop's own
Integrations/Linux/qml/UsageCard.qmlwas rendered offscreen by Qt 6.11. The render usedqml, the software backend andgrabToImage, with the snapshot rows from each branch.mainNative regression test.
test_antigravity_pools_reach_snapshots_once_with_representatives_firstintest_desktop.pyruns this scenario through the real binary. It fails on themainbuild with the duplicated7 day/5 hourrows and passes on this branch.Tests
node --test Integrations/Omarchy/test.mjs Integrations/Omarchy/notifications.test.mjs: 30 pass. The 5 new tests (3 intest.mjs, 2 innotifications.test.mjs) cover the row list, tray/summary order, a selected pool beyond the limit, alert history when the selected pool changes, and equal values across families. They fail onmain.CODEXBAR_LINUX_BINARY=<build of this branch> python3 -m unittest Integrations.Linux.tests.test_desktop: 16 pass, including the new Antigravity scenario, which fails against a build ofmain.Refs #3785.