Repository navigation
fix(plugins): retain selected quotas and support row severity - #4627
Conversation
Keep user plugin IDs through merged Current selection rendering and observation, sharing the existing first-party renderer paths. Add optional per-row severity using native progress colors and existing warning labels, preserving it through decoding, localization, and privacy filtering.
|
🦞👀 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 SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
|
Codex review: needs changes before merge. What this changesThis PR retains selected plugin quotas in merged icons and adds optional severity styling to plugin detail rows. Example: Select Fixture Meter with 25% remaining while Codex has 80% remaining.
Review scores
ProductKind: Bug fix · Worth it: Yes · Fix scope: Complete Merge readiness⛔ Needs changes before merge - 1 item remains Keep open: this maintainer-authored PR addresses two concrete plugin presentation gaps absent from current main; no actionable code defect was found, but GitHub reports a merge conflict. Priority: P2 Before merge
FindingsNone. Tests
Agent review detailsHow this fits togetherPlugin snapshots enter the shared mapper and detail model, then feed menu-card rows and the selected merged status icon. flowchart LR
A[Plugin engines] --> B[Snapshot mapper]
B --> C[Usage snapshots]
C --> D[Detail row renderer]
C --> E[Merged icon resolver]
F[Switcher selection] --> E
E --> G[Status item]
Technical reviewBest possible solution: Land the scoped instance-ID selection fix and optional host-themed severity through the existing rendering owners. Do we have a high-confidence way to reproduce the issue? Current-main source deterministically discards plugin selections before merged-icon rendering; the PR reports a failing baseline regression, but this read-only review ran no target code. Is this the best way to solve the issue? The implementation reuses the switcher quota policy and built-in renderer, and adds semantic severity without inferring thresholds or changing progress meaning. AGENTS.md: found and applied where relevant. Codex review notes: model internal, reasoning medium; reviewed against 7e31e74ea662. Provenance checked
TestingProof path: in-process harness. SecurityNone. EvidenceWhat I checked:
Likely related people:
Review metrics
LabelsLabel changes:
Label justifications:
Rank-up movesOptional improvements that raise the rating; they are not merge blockers.
Rating scale6/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. WorkflowClawSweeper edits this one comment on every review. Comment Reviewed October 19, 2026, 12:16 AM ET / 04:16 UTC. |
# Conflicts: # CHANGELOG.md
Merged Current selection icons now retain the selected user plugin and show its quota, including an unavailable state before the first snapshot. The selector previously discarded plugin IDs through the first-party conversion. This uses the existing switcher quota policy and shares the built-in icon rendering paths while preserving their animation and cache behavior.
Plugin detail rows also accept optional
severity: "normal" | "warning" | "critical". This reuses system colors, native progress bars, and existing translated warning labels; plugins compute their thresholds, and progress remains consumed usage. Absent severity keeps the existing appearance. The mapper validates the field on both engines, and Codable, localization, and privacy transformations preserve it.Both changes are documented in
docs/plugins.mdand the 0.77.1 Unreleased changelog. Thanks @soimy for reporting the selection bug and @DamonYoungWork for the severity request.Verification
All Swift commands ran with the repository test environment scrubbed, under the host-wide build lock, without real-account probes or relaunching the app.
swift test --build-system native --jobs 2 -Xswiftc -gnone --filter UserPluginQuotaPresentationTests— 6 tests, 5 passed and the new plugin-selection regression failed. The extraction used to expose the selector preserved the original first-party filter.swift test --build-system native --jobs 2 -Xswiftc -gnone --filter 'UserPluginQuotaPresentationTests|UserProviderPluginTests|UnifiedIconSourceSettingsTests|FrontmostProviderMonitorTests|MergedIconPresentationTests|StatusItemAnimationSignatureTests|StatusItemBalanceDisplayTests|MenuBarCountdownRefreshTests|ProviderDetailSeverityTests|ProviderDetailSectionsContentTests|ProviderDetailSectionTests|WidgetDetailSnapshotTests|ProviderArchitectureGatekeeperTests'—Test run with 205 tests in 13 suites passed after 53.351 seconds.make check: passed;Done linting! Found 0 violations, 0 serious in 3052 files.git diff --check: clean.Synthetic UI proof
The images below are native offscreen renders using fictional data. No proof artifacts or screenshot-only tests are committed.
CI status is unverified: a GitHub REST rate limit was encountered during this lane, so status polling was stopped.
Fixes #4604
Fixes #4602
Refs #4591