Repository navigation
Plan mismatch UX: calm popup, detected display, overrides, aliases - #304
Conversation
- Popup shows the transparent colour mark with CodeCaps beside it (About-style asset, not the app icon). - Popup fires at most once an hour; Don't show this again checkbox (unchecked default) silences repeats but never first sightings of a new provider or changed detected plan. - Platform pages show Detected: <plan> under Plan Name, with Use detected and Keep mine actions; an explicit choice never warns again. Plan mismatch warnings toggle on Alerts & Alarms re-enables the popup. - Alias rules: anything with pro lite/prolite is prolite (Codex); anything with ultra is unified_ultra (Cursor); generic Grok Bot Plan never mismatches. - Window title always CodeCaps Dashboard; sidebar group back to SETTINGS. Boards CC-176, CC-179.
This comment has been minimized.
This comment has been minimized.
| Autofix run https://github.com/Simple-With-Us/CodeCaps/actions/runs/39714598094 started for `sentry[bot]`'s tagged request. Owner/sentry request: exempt from the per-bot cap (owner rule 2026-10-20). |
Official outline mark cut to the family triplets (256px color, light-ink, dark-ink PNGs plus the source SVG), wired into the Mac provider map as a single-colour template mark, added to the iOS asset catalog with model mapping, and covered by the triplet and resolution tests. Missing-mark retry now re-probes at 1s for the first three attempts so a late-arriving bundle heals faster.
|
Added: official-outline GitHub Copilot mark (Mac triplets + source SVG, iOS imageset + mapping, test coverage) and faster early missing-mark retries (1s x3, then 5s/60s). Re the unofficial purple/3D renders: left out of the bundle deliberately (IP + template-mark reasons); they work as personal Custom marks under Logo Style. |
|
Settings tooltip has a non-NBSP sentence gap The tooltip violates the approved NBSP-based sentence spacing. Build it by concatenating with Kody rule violation: Sentence gap by surface: two ASCII spaces in files, U+00A0 plus a space in rendered copy and GitHub text Prompt for LLM |
|
Task description is insufficient for business logic validation. 🤔 Insufficient Task ContextI found a task linked to this PR, but it only contains minimal information (title only, no description or acceptance criteria). To perform a meaningful business rules validation, I need more details. 🔍 What I need to validate:
💡 How to improve the task context:
|
icon-1024-textured.png and icon-512-alternate-teal.png have no references anywhere. Everything else stays: the three brand SVGs, the black menu-bar template, the release icon master + icns, and the two bundled Resources PNGs the app loads at runtime.
This comment has been minimized.
This comment has been minimized.
Five appiconset PNGs were unreferenced by the manifest and mixed a light treatment into an otherwise dark set. assets/README.md now maps every logo file to its surface and regeneration path so the next seat does not have to guess.
Swift requires call-site argument order to match the declaration: QuotaWindow declares remainingPercent/remainingUnknown ahead of window, and both Copilot call sites passed window first, failing the Mac package build with 'argument must precede argument window' at lines 64 and 80. Reordered only; no values change.
|
Build fix from the fleet lane: the Mac package build has been failing since 03:40 UTC on the two Copilot QuotaWindow call sites - Swift requires declaration order, and QuotaWindow declares remainingPercent/remainingUnknown ahead of window. Pushed 92125ba reordering the arguments only (no values change). The 9 open Kody threads stay with the feature lane. |
This comment has been minimized.
This comment has been minimized.
NSAlert.suppressionButton is NSButton?, so both accesses failed to compile: the title assignment and the state read. Optional-chained both; when the button is absent the title set is a no-op and the state read falls through, which is the same behavior the unwrapped code intended.
This comment has been minimized.
This comment has been minimized.
Three review findings on the plan-mismatch and Copilot-mark code: - The one-hour throttle never engaged because lastPresentedAt was read but never written. It is now stamped when the alert is actually shown, next to record(warnings). (Two threads.) - A model change can re-enter checkPlanMismatches while the modal is visible (NSAlert.runModal spins a nested run loop): warnings() returns [] for a cycle already presenting, and the empty branch then cleared isPresenting under the visible alert, letting a second modal stack. The empty branch now only finishes a cycle this call did not open. - preloadBundledMarks() mutates PlatformLogoImage's cachedBundle and lastFailure on a background queue while the main thread reads them. Both are now guarded by a stateLock, with bundle resolution kept outside the lock.
This comment has been minimized.
This comment has been minimized.
jaywedgeworth22
left a comment
There was a problem hiding this comment.
[GB-Designer] UI pass: nits, not blocking. The calm popup, the CodeCaps Dashboard title and the Plan Mismatch Warnings toggle all look right, and the help text already uses two spaces. Two button labels need Title Case and a shorter form.
- currentBundle() could revive a stale pin: a resolve that started
before an invalidation pinned its result after the clear, undoing
it. A generation counter now bumps on every invalidation and the
pin only lands when no invalidation raced the resolve.
- The plan-override buttons use title case ("Use Detected", "Keep
Mine") and the Settings footnote names the same action.
This comment has been minimized.
This comment has been minimized.
…popup Three review findings on the mismatch flow: - "Keep Mine" recorded the accepted triple, but only AppDelegate's filter honored it, and only for the modal. The acceptance check now lives inside PlanWarningCycle.warnings, so accepted pairs never become warnings for any consumer, and AppDelegate's redundant filter is removed. - The page's "Detected:" picked the provider's first window while the popup names the disagreeing one, so the two could identify different plans. detectedPlan now prefers the candidate that disagrees with the entered value, falling back to the first. - An accepted pair still showed as a live mismatch on the page with a resolution action. planMismatch now returns false for accepted triples, matching the override's documented intent.
Kody Review CompleteGreat news! 🎉 Keep up the excellent work! 🚀
|
| Options | Enabled |
|---|---|
| Bug | ✅ |
| Performance | ✅ |
| Security | ✅ |
| Business Logic | ✅ |
…et copilot, generator targets, catalog test, copy rule
Owner requests 2026-10-21/22, OpenCode (Codex at cap; CC-176 + CC-179 claimed by OPENCODE).
Boards: CC-176, CC-179. CI is the compile gate (no Swift toolchain on this Linux seat). String grep confirms no stray Dashboard/Settings leftovers.
Summary
This PR makes plan-name mismatch handling calmer and more actionable. Users can now see the provider-detected plan alongside their entered value, resolve mismatches directly, and persist explicit choices to prevent repeated interruptions. It also standardizes the dashboard window title and terminology.
Functional changes
Tests
Added
PlanComparisoncoverage for OpenAI Pro Lite aliases, Cursor Ultra aliases, genuine tier mismatches, and generic Grok Bot plans.Outstanding review findings
lastPresentedAtis read but never written, so unsuppressed prompts can appear more frequently than once per hour.finishPresentation()clears the active presentation state while the alert modal is still in flight.Summary
github-copilotandcopilotas aliases for the Copilot platform mark and classifies them for monochrome rendering.Test Coverage
PlatformLogoTestsProviderMarkResolutionTestsProviderMarkTripletTestsReview-Identified Follow-ups
Summary
"monthly"quota window, including when the remaining percentage is unknown.Review Findings
preloadBundledMarks()mutatesPlatformLogoImagestatic cache state from a background queue without synchronization.Summary
Impact
This hardens the plan mismatch warning dialog’s “Don’t show this again” behavior without changing the warning or navigation flow.
Summary
Review Note
A remaining race was identified in
PlatformLogo: bundle resolution occurs outside the lock, so an in-flight resolution can repin a bundle after invalidation has cleared it. The review finding should be addressed before merge to fully prevent stale bundle pinning.Summary
Simplifies the plan-mismatch controls and fixes a resource-bundle cache race that could allow stale logo assets to remain pinned after cache invalidation.
Changes
Known Limitation
Summary
Impact
Previously acknowledged mismatches no longer resurface in popups or other warning views. The provider detail page now identifies the same mismatching plan shown by the popup and avoids presenting already-resolved combinations as unresolved issues.