cctally 1.96.2 → 1.98.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -5,6 +5,46 @@ based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
5
5
 
6
6
  ## [Unreleased]
7
7
 
8
+ ## [1.98.0] - 2026-08-14
9
+
10
+ ### Changed
11
+ - The stats-rebuild memory gate now rejects compact per-observation projections, not only full decoded-record retention. Its 512-byte overhead ceiling is derived from repeated production-shaped measurements on both remote runners, and a controlled coordinate-projection mutant freezes the regression class (#508).
12
+ - Every cross-provider aggregate on the dashboard's `All` view now states the range it covers and carries its provider attribution. The Projects leaderboard used to concatenate a Claude ranking bounded by the subscription week with a Codex ranking bounded by roughly thirty days, sort the union by cost, and print "(N this week)" over the result — so a Codex project could outrank a Claude project because of the window rather than the cost. Both providers are now folded over one shared absolute range, and the panel names its resolved dates in the header and in its empty state. The percentage beside each row is named in a legend on every tab: a share of the week's quota under Claude, a share of the ranked cost under Codex and All. Each row's accessible name carries its cost and that named percentage, which the decorative cost bar had been credited with conveying and did not (#556).
13
+ - A ranked project row that the drill-down cannot reach no longer offers one. A project active between a week's rollover and the projects envelope re-anchoring is in the ranking and in no route-visible collection, so clicking it opened a detail view reporting nothing. The row keeps its rank, its label and its cost, and simply has no detail affordance. When a Claude project drill does open from `All`, it now states the span it actually reported in resolved dates, because that window is anchored to whole weeks and is wider than the thirty-day ranking the row was priced over (#556).
14
+ - Monthly is no longer merged across providers under `All`. Two providers' calendar months were joined into one row per label, which nulled the Claude row's `Used %` and `$/1%` only when Codex happened to have that month, and recomputed one model split across two vendors' model families. Each provider now keeps its own months in its own section, and the modal's table and navigator name the provider so two rows sharing a label are tellable apart (#556).
15
+ - Weekly and Monthly now foot their combined cost with the span it covers and each provider's share. Weekly states exact dates, which its rows carry; Monthly states a month-label span, because monthly rows carry no bounds and the current month's read ends at the current instant rather than at the month's end (#556).
16
+ - A combined daily row no longer publishes a cache-hit percentage or a model split. Claude counts cache reads outside its input total and Codex counts them inside, so no ratio over their sum describes anything, and one model stack over two vendors' families shares a denominator that means nothing. The day's detail now breaks the combined figure back down per provider instead (#556).
17
+ - Five-hour blocks under `All` interleave both providers in time order rather than listing every Claude window above every Codex one, so a block from this morning can no longer render below one from last week. The footer keeps its total and states the interval the shown windows span plus each provider's count and cost — never a shared reset cycle, because the two providers' five-hour clocks are independent (#556).
18
+ - Weekly and Monthly table sorting is now per table. One shared preference meant a sort chosen on the weekly table applied to the monthly table, which does not have the `Used %` or `$/1%` columns at all. Under `All` the ordering applies inside each provider section rather than interleaving two providers' independent histories into one ranked list. An existing shared preference is reset rather than guessed at, because nothing recorded which table it came from (#556).
19
+ - When a cross-provider aggregate cannot be computed, the dashboard says so and names the missing fact, instead of rendering an empty table that reads as "no activity yet" or an error that reads as a broken instance. A version of the server the page has not seen before is handled the same way rather than rendering nothing (#556).
20
+ - A cross-provider span never names a day that has not happened yet. The Claude project drill and the `Weekly` footer both state calendar windows rather than data extents — the drill window runs to the current week's Sunday and the current weekly row ends at its reset — so on six days in seven they named future dates beside a cost figure. The stated end is now clamped to the instant the page was generated. The Codex project detail also states the window its totals cover, which is wider than the shared range the ranked row beside it is priced over, so the two figures no longer read as contradicting each other (#556).
21
+ - Recent alerts under `All` now lists both providers in one true chronological order. The union was ordered by a timestamp only the Codex side ever wrote, so every Claude row sank below every Codex row and a Claude alert from a minute ago rendered beneath a Codex alert from six days ago in a panel titled "Recent alerts". Alerts are now ordered — and truncated — by the instant each one fired, which is also the instant each row prints. Codex alert rows published the moment a threshold was crossed rather than the moment the alert fired, which are different moments, and now publish the firing instant (#556).
22
+ - The Codex budget alert chip now reads `BUDGET` rather than `CODEX`. It sat immediately beside a source chip already reading `Codex`, so the row said the same thing twice and named neither the metric nor anything the source chip did not already say. The chip names the metric; the source chip names the provider; the two budget chips stay distinguishable by colour (#556).
23
+ - The Recent Sessions panel now states its composition under `All`, on the same wrapping sub-line the Weekly, Monthly, Daily, Projects and Blocks panels already use. It was the last panel whose content changed under `All` without saying so, leaving the row-level provider chips as the only disclosure that two providers' sessions share one table. The note claims no ordering, because the table is recency-ordered only until a column header is clicked. The Claude and Codex tabs are unchanged (#572).
24
+ - Nothing under `All` is rendered but unreachable any more. At a 1440x900 desktop the Current Usage and Trend modals showed their content clipped with no scrollbar anywhere in the card: six of sixty Claude milestone rows were visible, the five-hour milestone table could not be reached at all, and Claude's Older-block and Newer-block controls sat entirely below the cut, although the identical controls work on the Claude tab. Both modals now scroll as one scrollport. The Weekly and Monthly modals are unchanged and keep their pinned left pane with a scrolling table (#556).
25
+ - The `All` Forecast panel now shows each provider's own detail. It rendered neither of Claude's two per-day budget figures nor Codex's confidence and budget pace, although both were already computed, so the combined panel showed strictly less than either provider tab. On an install with more than one Codex account the confidence line stays withheld, because it describes one arbitrarily chosen account's history and would reconcile against no account card and no tab (#556).
26
+ - A provider with no forecast is no longer reported as `unavailable` in the `All` Forecast panel. It now renders the same labelled dash structure its own tab renders, and keeps the sentence naming why it contributed nothing (#556).
27
+ - The Projects window pills now look disabled when they are. Under Codex and `All` the 1w / 4w / 8w / 12w buttons are inert, because provider-native project history has no week window, but they rendered pixel-identical to the working buttons beside them and still showed a pointer cursor on hover (#556).
28
+ - On an install with a single Codex account, the Codex cycle navigator in the Current Usage modal is announced in cycle vocabulary. Its two buttons were named "Older week" and "Newer week" for both providers, so a screen reader heard a Claude concept everywhere the visible labels said cycle (#556).
29
+ - Every provider section under `All` is now announced by a heading naming it, so the view can be navigated by heading instead of reading as one flat block beneath its panel or modal title. Nothing changes visually (#556).
30
+ - The Help overlay now says how to open the Current Usage modal, which no digit shortcut can reach, and no longer carries a "the current source doesn't show" block that could never list anything. The dashboard documentation's four false statements about `All` are corrected: which panels each source shows, how the persisted card order works, what the digit keys open, and how the side-by-side provider sections are navigated (#556).
31
+
32
+ ## [1.97.0] - 2026-08-13
33
+
34
+ ### Changed
35
+ - Reveal-mode share exports now allow project directories whose basename is exactly a UUID or source-root-shaped hex token, while the same value outside a typed project field still fails the document-wide privacy guard (#521).
36
+ - Fix UI-QA provenance for subagent-driven UI work by allowing a durable report-only certification commit to name and verify the exact already-committed target, and stop unrelated linked worktrees from perturbing the QA cleanup fingerprint (#558).
37
+ - The dashboard's `All` headline now states a quantity you can check. It is the sum of each provider's own current billing period — Claude's subscription week plus Codex's native seven-day cycle — instead of a thirty-day Claude accounting rollup added to a seven-day Codex cycle under no period label, which on one production install read $18,401.71 beside provider tabs showing about $1,704 and about $4,108. The heading names the cycles it covers and names only the providers actually contributing, each provider block carries its own labelled reset, and the per-provider split is on the hero itself rather than behind a modal. Because the two legs are each provider's own cycle, the figure steps down twice a week at two different reset instants and is not comparable against itself across a reset (#556).
38
+ - The `All` staleness marker no longer sits on the figure permanently. The dashboard's `hero` freshness axis now means "the current cycle resolves and its counters are publishable" rather than "how old the last percent observation is", and percent age moved to the `quota` axis, which is what it always described. The two axes were being combined across clocks forty times apart — ninety seconds against one hour — so the marker was on almost always. A published combined figure is now qualified only by a real qualification, and the self-contradicting pairing of "combined totals are unavailable" with "combined totals use retained actuals" is gone (#556).
39
+ - On an install with more than one account on either provider, the `All` combined total is withheld with a named reason saying which provider has several accounts on separate cycles, and points at the per-account cards that carry each account's own spend. Publishing a single number there would have reproduced the same defect inside the decorated path, because it could not be reconciled against any tab. A count that cannot be read withholds the figure too, rather than assuming a single account (#556).
40
+
41
+ ### Fixed
42
+ - Deep doctor diagnostics and `db journal-repair` now preserve the same physical journal positions as rebuild when fingerprinting structural correction violations, so irrelevant observations can no longer make one path reject another path's durable resolution audit (#508).
43
+ - Root and setup help now describe both Claude and Codex, expose provider-aware `--source` analytics and native Codex quota commands, and name setup-managed Codex handlers (#555).
44
+ - The concurrent stats-heal writer-storm regression now waits for the detached worker's terminal success event before reading the rebuilt index, instead of racing publication artifacts that can become visible while the worker is still finishing under load (#559).
45
+ - CI no longer reports a reader jump as stranded when the reader is merely still travelling toward it. The transient-drain-failure regression measured whether the linked turn sat inside the reader viewport as soon as the turn mounted, but mounting only means the backward walk has reached it, not that the walk has stopped scrolling; the measurement now waits for the scroll to settle, the way every other jump assertion in that suite already did.
46
+ - The dashboard refreshes far more often on installs with a large Codex history, so newly recorded milestones and every other panel stop lagging minutes behind the database. A per-file lookup in the Codex source panel matched on the provider root alone, and because a machine normally has exactly one Codex root that lookup read every Codex usage row for every rollout file. On one real store of 2,324 files and 151,903 entries it took 57 seconds of an 84-second snapshot rebuild, which the dashboard's work-proportional cooldown then doubled into a staleness window of roughly 170 seconds. A composite index over the two columns the lookup actually matches makes it linear again, measured at 57.20s to 0.208s, which cuts the whole rebuild to about 32 seconds. The index is re-derivable, so an existing cache gains it on the next open with no migration, no data rewrite and no measurable size increase.
47
+
8
48
  ## [1.96.2] - 2026-08-13
9
49
 
10
50
  ### Fixed
@@ -52,6 +92,7 @@ based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
52
92
  - The sanctioned local test escape hatch now runs the same contract as a remote run. `CCTALLY_TEST_LOCAL=1` previously left the `agentmem`-gated tests skipping while every remote run required them, so a local green and a remote green were different claims and no document said so. The local path now pins the same policy. If `agentmem` is genuinely absent the run still completes rather than dying, but it states which contract it ran and how many tests that skipped, and classifies itself non-authoritative under a named reason (#529).
53
93
 
54
94
  ### Fixed
95
+ - Share charts now use an AA-compliant light warning colour and keep stacked segments distinguishable without colour (#524).
55
96
  - Remote test routing no longer mistakes runners last provisioned by different branches for a toolchain divergence; parity now compares the caller's declared Python closure while retaining live host-runtime checks (#548).
56
97
  - The stats-corruption epic test now waits for the heal worker's terminal outcome instead of racing the earlier request-marker cleanup, and its maintenance-holder handshake uses bounded readiness and release pipes rather than wall-clock guesses. Sanitized pytest failure extracts now retain safe assertion structure and normalized traceback locations while continuing to redact private paths and dynamic values (#552).
57
98
  - Remote test runs now refuse a conflicted checkout before contacting a runner, name the unmerged git index and its normal `git add` recovery, and always explain a manifest mismatch even when duplicate path records were the only difference (#550).