chore(release): hand-write the v1.14.0 notes - #232
Conversation
Both override files, so `release_notes.sh` ships them verbatim and DeepSeek is skipped on both surfaces. That is the point of writing them rather than generating them for this release. 83 commits since v1.13.3, and the great majority are review-round fixes to code that never shipped — a generated changelog would list "stop two cards stating a terminal answer they had not yet asked" to a user who has never seen either card. The four merged PRs contain three user-facing features and five fixes worth naming; everything else is internal to work that lands whole in this release. Skipping generation also removes the drift this repo has hit before: the two prompts are independent and non-deterministic, so the Sparkle text and the GitHub body could describe the same release differently, and a previous release had its predecessor's fix re-claimed. A verbatim override cannot do either. The "Thanks:" line and GitHub's New Contributors / Full Changelog tail are still appended by the script, so nothing about contributor credit is lost by overriding the body. Content is limited to what the diff supports. The cold-start note is real: the snapshot envelope now records the scan roots that produced it and its schema moved 1 to 2, so the first launch after updating restores nothing.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: d2f97ba221
ℹ️ 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".
The release grew from one merged PR plus the lens to four, so the notes now cover #233, #234 and #235 alongside what was already written. Three additions carry weight beyond describing a change. **#234's downgrade consequence leads the "before you update" section**, ahead of the cold-start note. Upgrading loses nothing — the migration exists so a version bump does not reset everyone's history, and it preserves every sample. Downgrading afterwards does: an older build cannot read schema 4, quarantines the file, and starts from nothing. The distinction that matters to a reader is that usage totals survive because they are recomputed from logs, while pace readings are observations taken over time and cannot be. Weeks of them are what lets a window say "Historically" instead of falling back to an average. The laziness is stated for the same reason a silent behaviour always is: the conversion happens on the next write the app had its own reason to make, so a file still reading `"schemaVersion": 3` after updating is normal. Without that sentence it reads as a migration that did not run, and someone reports it. **#235's token-expiry limit is written as a deliberate trade-off**, not omitted and not softened. An additional account whose token expires is not refreshed in place; the card says so and asks the user to run `claude` under that config directory. The refresh path reloads, validates and saves against the main configuration directory throughout, so routing an additional account through it would overwrite the main account's stored credential and log the user out of it. A limit that is not named in the notes is reported as a bug, and the reader cannot tell a chosen failure from an unnoticed one. **#233 is described by what the user paid**, not by the mechanism: an ordinary launch rebuilt caches it already had. The measurement that says this is not the cold-start regression belongs in the PR, not in notes written for users. Both files stay overrides, so `release_notes.sh` ships them verbatim and DeepSeek is skipped on both surfaces — the two prompts are independent and non-deterministic, and a release this size is the wrong one to let them describe differently.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: df449e3ef4
ℹ️ 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".
The note said downgrading "loses your quota pace history". That overstates what happens, and a release note that overstates a consequence is as much a defect as one that hides it — a user who reads it decides against updating for a reason that is not true. An older build cannot read schema 4, so it moves the file to a `.corrupt-<timestamp>.json` copy beside it and starts accumulating from nothing. The pace cards go back to learning, which is visible and unwelcome. But the copy holds the COMPLETE history and the data is recoverable — that path was walked losslessly on a real store during this cycle, which is how the overstatement was noticed. So the accurate framing is "set aside", with "nothing is deleted" said explicitly rather than left to be inferred from the absence of a stronger word. What is genuinely irreversible about a schema mismatch is nobody noticing it, and a quarantine is the opposite of that: it is loud, it leaves an artifact, and the pace card announces the reset. That is worth preferring over a quieter scheme, and it was nearly traded away for one. The upgrade claim gains its evidence: every sample preserved, verified against a real store of 32 series and 3,117 samples, which without the migration is quarantined outright. Both halves of that came from running it rather than reading it.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 4f5f3c1299
ℹ️ 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".
Two factual errors in hand-written notes, both caught by review, both of the kind that generation would not have made and hand-writing invites. The equivalence estimate was described as the value of ONE percent of the allowance. It is ten: `WindowEquivalence` normalizes per tenth and every row renders "10% of quota ~ …" (`WindowEquivalence.swift:99`, `:112`, `:115`, `:124`). A headline metric wrong by a factor of ten, in both override forms, which ship verbatim. "Past windows" and "Window history" were written as one card. They are two. `QuotaHistoryStripCard` is Past windows — the all-agent view, one row per quota window, a strip of cycle bars, no expansion. `QuotaHistoryCard` is Window history — the open subscription's recent cycles, each expandable to a per-model breakdown. The note attributed the expansion to the wrong surface and told the reader to look where it is not, which is worse than omitting it. "every recorded reset cycle" is also dropped. The list is bounded, and "every" is a promise the card does not keep. Both errors are about what the app IS rather than about what changed, which is the class hand-written notes are worst at: the changes were fresh and the surfaces were assumed. Writing them from the diff and not from the running app is what produced both.
|
Sync: two more PRs merged into #234 — the quota-pace store's on-disk schema moved 3 → 4 (lazy, in-place upgrade; adds an unused #235 — a second Claude account registered via the Settings root added in #230 (already in your notes) now gets its own quota card, symmetric with the primary: pace, duration estimate and historical trend, not just a percentage. Previously the extra account's usage folded into totals with no card of its own. The tightest-window summary line and the Overview history/heatmap controls also now name which account they're showing when two exist. Both are additive to what's already drafted, not corrections to it — nothing in the current text needs walking back. |
…xception #233 grew during review. The note described only its scan-cache half. Registering the Claude directories also dropped the quota throttle and woke every sleeping poller, unconditionally and on every launch — so the cost was not only rebuilding a cache but spending provider requests against an endpoint that rate-limits. Both halves are now gated on the registered set actually differing, and the note says so. The exception is stated rather than omitted. The first registration after a launch still refreshes the quota cards even when the user's list is unchanged, because the engine starts each run with nothing registered — a real change from its point of view, and skipping it could leave the menu bar showing a reading taken before the extra account was known. A note that claimed the work happens "only when something changed" would be wrong about launch, which is the case users will actually observe. Also drops "scan-root list" for "your Claude directories": the internal name described the payload, not the thing the reader configured.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 571345700d
ℹ️ 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".
The note said Overview cards can be hidden individually. `OverviewCard.toggleable` excludes `.chart`, and the Settings copy already tells users so — the note promised an action the app refuses for one of six cards. Qualified rather than deleted, and with the reason, because the exclusion is a design decision worth a reader knowing: Overview is what every hidden lens falls back to (`AppView.effective`), so a fallback that can be emptied leaves nowhere to land. Third factual error in these notes found by review, all of the same kind — about what the app IS rather than what changed. Written from the diff instead of from the running app.
Hand-written notes for v1.14.0, in both override files, so
release_notes.shships them verbatim and DeepSeek is skipped on both surfaces.Why written rather than generated
83 commits since
v1.13.3, and the great majority are review-round fixes to code that never shipped. A generated changelog would tell a user "stop two cards stating a terminal answer they had not yet asked" about two cards they have never seen. The four merged PRs contain three user-facing features and five fixes worth naming; the rest is internal to work that lands whole in this release.Skipping generation also removes a drift this repo has hit before: the two prompts are independent and non-deterministic, so the Sparkle text and the GitHub body could describe the same release differently — and a previous release had its predecessor's fix re-claimed. A verbatim override cannot do either.
The
Thanks:line and GitHub's New Contributors / Full Changelog tail are still appended by the script, so no contributor credit is lost by overriding the body.What the release contains
CLAUDE_CONFIG_DIR-isolated directories registered in Settingsoauth/usagerate limit; stale-account usage after a credential-target change (#223); the running cycle out of past windows; excluded ≠ unclassified; a missing count no longer renders as a measured0Claims
Every item is limited to what the diff supports. The cold-start note is real rather than cautionary: the snapshot envelope now records the scan roots that produced it and its schema moved 1 → 2, so the first launch after updating restores nothing and rebuilds.
No previous release's fix is re-claimed.