Conversation
…#200) Subscription plans already carry subscriptionType on LimitStatus; the dollar figures are ModelPricing × tokens, not a bill. Qualify popover rows only — menu bar and a Settings price field stay out of this PR.
|
Thanks for implementing this, and for taking the conservative half of #200 — label only, no user-entered plan price, no hardcoded price table. That was the right slice to try first. I'm not taking it, for two reasons. The label lands on providers it isn't true for. The predicate reads the Claude subscription, but The part that motivated #200 isn't in it. The issue's argument was the leverage ratio — "$100/mo against $610 of API-equivalent tokens, 6.1×" — which is what makes the number instructive for someone learning token economics. Without it we pay the UI cost (a caption on every cost row, seven localization columns to maintain) and don't get the payoff. Meanwhile the bare number is the convention in this category and subscription users already read it as "what this would have cost on API". I'm closing this and leaving #200 open — the underlying observation is fair, it just needs a different shape. Thanks again, and sorry for the slow answer on this one. |
|
Follow-up for the two close reasons is in a new PR, not a reopen of this branch: Per-provider |
Summary
$610.30) now read$610.30 (API-equiv.)so they are not mistaken for a bill. The number is unchanged — it is stillModelPricing× tokens.reportsCost = false(Codex / Cursor / Copilot / …) keep today's presentation.Z×, and the menu-bar compact cost. Happy to follow up once those are decided.Predicate lives on
LimitStatus(wheresubscriptionTypealready lives) so generic today/week/month totals do not grow aproviderID ==branch.Type of change
UI changes
$610.30on Max/Pro/Team(API-equiv.)(localized). API-key and Free unchanged. Menu bar$9.5unchanged.Checklist
swift buildandswift testpass locallyTests
LimitStatus.labelsCostAsAPIEquivalent— max/pro/team (incl. case fold) on; free/api/empty/nil off. A=false and B=true both locked.TokenFormatter.cost(_:labeled:)— suffix appended; nil/empty suffix does not add a trailing space.UsageStore.labelsCostAsAPIEquivalent— follows the injected Claude plan after refresh (Max/Team on, Free and no-limits off).L.apiEquivalentCaption; menu-barcostCompactstays unlabeled.APIand is parenthetical in everyAppLanguage.allCases(ko/en/ja/es/fr/pt)../scripts/test-gate.sh: 786 pass, 10 skipped, 0 failures. Logic-core line coverage 90.52%.How to verify
On a Max/Pro/Team Claude login with official limits loaded, open the popover: today / week / month (and the Claude row) should show
(API-equiv.)next to$. Switch the language in Settings — the qualifier localizes; the$figure does not. Menu bar cost toggle should still be the compact$9.5/$311form.Label-only slice of #200 (Settings price / leverage and menu-bar labeling left for a follow-up).