claude-token-saver 3.34.0 โ 3.35.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/README.en.md +24 -261
- package/README.md +41 -371
- package/bin/cli.js +60 -1
- package/package.json +1 -1
- package/src/formatters/statusline.js +29 -3
- package/src/litellm-budget.js +223 -0
- package/src/month-spend.js +47 -0
- package/src/window-labels.js +3 -0
package/README.en.md
CHANGED
|
@@ -14,6 +14,12 @@
|
|
|
14
14
|
npm i -g claude-token-saver
|
|
15
15
|
```
|
|
16
16
|
|
|
17
|
+
Three numbers are the whole pitch.
|
|
18
|
+
|
|
19
|
+
- **โ18.6% cost**: measured before/after adopting the Harness principles ([evidence](#real-world-impact--beforeafter-report))
|
|
20
|
+
- **510,000 tokens on one document**: a 30MB deck read as Markdown instead of raw XML ([evidence](#-doc2md--documents-become-markdown-before-the-model-reads-them))
|
|
21
|
+
- **Routing savings are a per-run ledger**: the price difference of each delegated run, not an estimate ([evidence](#-the-savings-figure-is-a-ledger-entry-not-an-estimate))
|
|
22
|
+
|
|
17
23
|
## Four parts, working together
|
|
18
24
|
|
|
19
25
|
| | What it does | Effect |
|
|
@@ -154,9 +160,11 @@ With an empty ledger (no measured delegation yet) row 1 is not drawn and the lay
|
|
|
154
160
|
| `๐ค` | Active model |
|
|
155
161
|
| `๐
ท 5/5` | Harness principle score ([Harness mode](#-harness-mode)) |
|
|
156
162
|
| `๐ง ` | Cache hit rate (green at 85%+) |
|
|
157
|
-
| `โณ` | Cache TTL countdown โ send a message before expiry to keep the cache warm |
|
|
163
|
+
| `โณ` | Cache TTL countdown โ send a message before expiry to keep the cache warm. Ticking while idle requires Claude Code v2.1.97+ (see [If the countdown looks frozen](#how-it-works--environment)) |
|
|
158
164
|
| `โฆ current` / `๐
weekly` | 5-hour / 7-day rate-limit window usage + reset time |
|
|
159
165
|
| `๐ฆ` | Context usage (e.g. `Ctx 68% of 1M`) โ colored by fill. Current models default to 1M with no premium, but token volume itself drives per-turn cost and 5H/7D burn |
|
|
166
|
+
| `๐ต Sep $42` | **Estimated spend since 00:00 on the 1st of this month** (local time). Summed per session with that session's model pricing; always shown, even on gateways with no 5h/7d caps (v3.35.0) |
|
|
167
|
+
| `๐ budget` | **LiteLLM key budget gauge.** When stdin carries no rate_limits, shows the key's `spend` against `max_budget` as `๐ budget โฐโฑ 34% $34/$100` (v3.35.0, [below](#-behind-a-gateway-bedrock--vertex)) |
|
|
160
168
|
| `๐ฐ` | Cumulative savings from prompt caching โ a **different** number from row 1's `๐` (model routing) |
|
|
161
169
|
| `v3.24.0` | The version you are running. Gray, at the tail, when it is the latest one |
|
|
162
170
|
| `โฌ v3.24.0 โ 3.25.0` | A newer release exists. Actionable, so it moves to the front of the line ([Update notifications](#-update-notifications)) |
|
|
@@ -584,6 +592,16 @@ Since v3.26.0 the gateway is detected from the model ids in the transcript, whic
|
|
|
584
592
|
|
|
585
593
|
If the detection is wrong, pin it with `claude-token-saver mode ttl=5m` (or `ttl=1h`). An explicit value outranks the measurement.
|
|
586
594
|
|
|
595
|
+
### LiteLLM: your key budget stands in for the missing 5h/7d caps (v3.35.0)
|
|
596
|
+
|
|
597
|
+
Behind a LiteLLM proxy (Bedrock and friends), Claude Code's stdin never carries `rate_limits`, so the `โฆ current` / `๐
weekly` gauges simply do not exist. LiteLLM does track per-key budgets, so the statusline draws a budget gauge in their place.
|
|
598
|
+
|
|
599
|
+
- Detection: `ANTHROPIC_BASE_URL` points somewhere other than the official endpoint, and `ANTHROPIC_AUTH_TOKEN` (or `ANTHROPIC_API_KEY`) is set.
|
|
600
|
+
- The proxy is asked via `GET /key/info` and `GET /user/info` โ only the calling key's own data. Renders read a cache file; a detached background process refreshes it every 5 minutes (same shape as the update check), so the statusline never waits on the network.
|
|
601
|
+
- Budget source priority follows real-world usage: the **team-membership budget** (`team_memberships[].spend` + its linked budget table row) first, then the key's own `max_budget`, then the internal-user budget. Verified against a Dockerized LiteLLM, including memberships whose budget diverges from the team max into a separate budget-table row.
|
|
602
|
+
- Unlimited keys (no `max_budget`) get no gauge. The `๐ต` monthly-spend segment still shows, since it comes from session logs.
|
|
603
|
+
- Inspect with `claude-token-saver litellm-budget` (cached) or `litellm-budget --refresh` (query now).
|
|
604
|
+
|
|
587
605
|
One related non-bug: if your session model is already sonnet, a sonnet-delegation (T1) rule can never save anything, because there is no price gap to capture. That is correct, but `route-scan rules` displayed it identically to "no delegations yet", so it now says outright that the rule does not apply at the current default model.
|
|
588
606
|
|
|
589
607
|
## Spike issue codes
|
|
@@ -655,6 +673,8 @@ Node.js โฅ 18 ยท macOS / Linux / Windows / WSL ยท **zero dependencies**.
|
|
|
655
673
|
|
|
656
674
|
**IntelliJ Claude Code plugin** โ the statusline widget fuses frames at the character level when emoji are present (`59:548` artifacts). v2.8.5+ detects `TERMINAL_EMULATOR=JetBrains-JediTerm` and falls back to text mode automatically.
|
|
657
675
|
|
|
676
|
+
**If the countdown looks frozen:** ticking while idle requires Claude Code to re-run the statusline command on a timer, controlled by `statusLine.refreshInterval` (seconds, Claude Code v2.1.97+) in `~/.claude/settings.json`. Without it the line only redraws when the conversation updates. If behavior differs per terminal, check three things: โ that machine's Claude Code is โฅ 2.1.97; โก no project `.claude/settings.json` / `settings.local.json` overrides `statusLine` without a refreshInterval; โข the statusline wrapper actually finds `claude-token-saver` on PATH instead of falling back to a multi-second `npx` run on every render (typical when nvm is not loaded in non-login shells). Re-running `claude-token-saver install` restores refreshInterval=5.
|
|
677
|
+
|
|
658
678
|
**Migration from claude-cache-monitor:**
|
|
659
679
|
```bash
|
|
660
680
|
npm uninstall -g claude-cache-monitor && npm i -g claude-token-saver
|
|
@@ -666,267 +686,10 @@ Also update `statusLine.command` in `~/.claude/settings.json` to `claude-token-s
|
|
|
666
686
|
|
|
667
687
|
## Release notes
|
|
668
688
|
|
|
669
|
-
|
|
670
|
-
- **The output language is chosen at install time.** With nothing recorded it used to fall back to English in silence, so a Korean user read English reports until they happened to find `mode ko`. A terminal install now proposes the system locale and asks whether to use Korean; an unattended install records what the locale says. Once recorded it is never asked again, and a scripted install can pin it with `CTS_LANG=ko|en`.
|
|
671
|
-
- **Fixed a locale-detection defect.** An explicit `LANG=en_US.UTF-8` was overruled on macOS, where detection went on to read the system locale (`AppleLocale`) and answered "Korean". A POSIX locale variable that is set now counts as the answer; the system locale is consulted only when all of them are empty, which is the macOS GUI-shell case the fallback was for.
|
|
672
|
-
- Language is the first step of the install, so the harness, doc2md and seed notices below it all print in the chosen language.
|
|
673
|
-
|
|
674
|
-
### v3.33.0 (2026-09-10)
|
|
675
|
-
- **`seed`: delegation works from the first session.** The model-fitting ratchet started empty, so a fresh install delegated nothing for days โ until enough of the user's own history accumulated and a candidate was approved. The package now bundles **9 model-fitting presets** (`presets/model-rules.json`) and **6 ratchet presets** (`presets/ratchet-rules.json`), and the SessionStart hook hands the pending ones to the model in the first session after an install or upgrade so it can ask about them **one at a time**.
|
|
676
|
-
- **Answers are recorded for good.** A declined preset is not re-offered after an upgrade; only presets a later release actually added show up. A preset is withheld entirely when a rule of the same tier and category is already registered. Commands: `seed`, `seed accept <id> --global|--project`, `seed skip <id>`, `seed reset`.
|
|
677
|
-
- **A seeded rule does not report someone else's statistics as yours.** It reads `preset (curated)` until a scan measures real firings and delegations, then those numbers take over. Its delegated error rate gets the same review flag as any other rule.
|
|
678
|
-
- **Ratchet presets are bilingual now.** `presets/ratchet-rules.md` became `presets/ratchet-rules.json` with both languages per rule: the text is injected into the model's context, so a Korean-only rule pulled an English session's answers into Korean. Ids come from the Korean text, so revising an English wording keeps the user's answer.
|
|
679
|
-
- **One template for rule sentences.** route-scan and seed both compose through `modelRuleBaseText()`, so a reworded rule cannot mean two different things depending on which producer wrote it.
|
|
680
|
-
|
|
681
|
-
### v3.32.0 (2026-09-10)
|
|
682
|
-
- **The context warning moved from 200k to 500k.** A brand-new session clears 200k from the system prompt plus a couple of file reads, so `โ Ctx 200k+` was on almost permanently and therefore said nothing. The chip is now `โ Ctx 500k+` and fires only when a single request really carried more than 500k input tokens. The `๐ฆ Ctx` segment also waits for 500k before turning yellow โ being on a 1M window is no longer a warning by itself.
|
|
683
|
-
- **Old history still resolves.** The legacy `โ Ctx 200k+` chip and the old detail string (`Single-request context exceeded 200k`) are still parsed.
|
|
684
|
-
- **doc2md is enabled by the install.** Registering the hooks is two entries in `settings.json` and costs nothing until a document appears, yet until now only people who found `doc2md on` themselves benefited. The converter (a markitdown venv) takes minutes to build, so it is offered at a terminal and merely printed as a command on an unattended install. Opt out with `doc2md off` or `CTS_NO_DOC2MD=1`.
|
|
685
|
-
- **Documented which features the install turns on and which stay manual.** The only manual ones left are `compact-window set` (writes Claude Code settings and needs an explicit scope) and approving model-fitting rules.
|
|
686
|
-
|
|
687
|
-
### v3.27.0 (2026-09-04)
|
|
688
|
-
- **A document path in the prompt is finally caught.** The 3.26.x `PreToolUse(Read)` hook never reached the formats it was written for: Claude Code refuses pptx/xlsx/docx as binary *before* running any hook. Measured โ a `.pdf` Read fires the hook, a `.pptx` Read in the same session leaves no hook log entry. Interception now also happens at `UserPromptSubmit`, which sees the raw prompt: paths there are converted and the conversion is handed back as context. `@path`, quoted and relative forms all count.
|
|
689
|
-
- **A session-start note was added.** It tells the model two things it cannot work out alone: that a binary-file refusal is answered by `doc2md <path>`, and that if the user attached a document, they should be asked for a path next time. An attachment bills its entire contents into the context, and no hook event receives attachment content, so there is nothing the tool itself can do about it.
|
|
690
|
-
- **`doc2md on` registers both hooks**, and `off` removes only its own entries from both.
|
|
691
|
-
|
|
692
|
-
### v3.26.2 (2026-09-04)
|
|
693
|
-
- **The converter installs itself.** The old instruction was `pip install`, which asks the user to modify a system interpreter โ and if they skipped it, the hook sat registered and did nothing. `doc2md install-converter` builds a dedicated venv and puts markitdown in it.
|
|
694
|
-
- **`doc2md` status now reports hook registration too.** Showing only the converter made "hook but no converter" and "converter but no hook" look identical, and both look like a broken feature.
|
|
695
|
-
- **An unknown subcommand under `--hook` prints nothing.** A 3.25.0 global install meeting a settings.json written by 3.26.0 did not recognise `doc2md`, fell through to the default report, and pushed a full statistics table into the hook stream on every `Read`.
|
|
696
|
-
|
|
697
|
-
### v3.26.0 (2026-09-04)
|
|
698
|
-
- **Attached documents are converted to Markdown before the model reads them.** Reading a pptx/xlsx/pdf/docx put unreadable bytes into the context window. `doc2md on` registers a `Read` hook that converts the file once, caches it outside your project, and points the model at the Markdown. A missing converter is announced once and then gets out of the way, zip bombs are refused, and workbooks past 50,000 rows are converted head-first with the truncation stated. See [doc2md](#-doc2md--documents-become-markdown-before-the-model-reads-them).
|
|
699
|
-
- **TTL display fixed for Bedrock/Vertex sessions.** Gateways never report the per-bucket split, and the fallback assumed an hour โ twelvefold too long for a 5-minute-only backend. The gateway is now detected from the model ids, the fallback follows that evidence, and the label reads `5m?` to mark it as inferred. Pin it manually with `mode ttl=5m` if the detection is wrong.
|
|
700
|
-
- **Delegated runs are no longer discarded in silence.** Runs excluded for an unpriceable model id surface as `๐ N unresolved` on the statusline; previously that was indistinguishable from never having delegated, so an entire tier of rules could report zero with no way to find out why. Environment variables set to a `foundation-model` ARN now resolve as well.
|
|
701
|
-
- **The Korean guidance stopped contradicting itself.** The injected scope claimed code comments while the vendored text disclaimed them twice, leaving the model nothing to decide on. The vendored wording is untouched; the block now states which side wins. The em dash in the attribution line โ a mark that guidance itself forbids โ became a colon.
|
|
702
|
-
|
|
703
|
-
### v3.25.0 (2026-09-04)
|
|
704
|
-
- **The statusline now shows which version is running** โ until now the version lived only in the table report's footer, so "which version am I on" meant running a full report. A `--version` flag was added alongside it.
|
|
705
|
-
- **A new release asks at session start** โ a statusline cannot open a dialog, so telling and asking are split. The statusline only reports (`โฌ v3.24.0 โ 3.25.0`); the SessionStart hook injects a line telling the model to ask the user whether to upgrade. On yes it runs `claude-token-saver upgrade`, which uses the package manager that installed this copy; on no, `update-check --dismiss` mutes that version until a newer one ships.
|
|
706
|
-
- **The check never blocks a render** โ the registry lookup runs at most once every 24h in a detached background process, and the render path only reads the cache file. A failed check still stamps its timestamp, so an offline machine backs off instead of retrying every render. Disable with `CTS_NO_UPDATE_CHECK=1` or `NO_UPDATE_NOTIFIER`.
|
|
707
|
-
|
|
708
|
-
### v3.21.0 (2026-08-22)
|
|
709
|
-
- **The install shows what it is about to enable, then asks** โ the harness 5 principles and the Korean writing guidance used to be switched on by the installer, leaving the user with the result rather than the choice. The install now prints the five principle headings, and for the Korean guidance what it changes plus its per-session cost and source, before asking. Locale detection is demoted from an answer to the question's default, so an English-locale machine used for Korean work can enable it on the spot.
|
|
710
|
-
- **Unattended installs behave exactly as before** โ npm `postinstall`, CI, piped stdin and `CTS_NO_INPUT=1` skip the question and apply the old defaults, because a blocked prompt hangs an install. `--yes` and `--no-input` force that path explicitly. A non-interactive install on a non-Korean machine now leaves the setting undecided instead of recording an answer nobody gave, so a later run at a terminal still asks.
|
|
711
|
-
- **The Korean-guidance statusline chip is now `โ๏ธ`, not `๊ฐ`** โ every other chip is an emoji, so a bare syllable read as a stray character rather than a status indicator.
|
|
712
|
-
|
|
713
|
-
### v3.20.0 (2026-08-22)
|
|
714
|
-
- **The README opening is now scannable** โ prose replaced by a one-line summary, the screenshot, and the install command up top. The three parts (routing, harness, ratchet) are a table; how a saving is computed (before โ after โ gap) is a diagram. The old 30-second pitch table, which repeated all of it, now lists only what the statusline additionally catches.
|
|
715
|
-
|
|
716
|
-
### v3.19.0 (2026-08-22)
|
|
717
|
-
- **Korean writing guidance** โ corrects how Claude writes Korean (dropped sentence parts, noun-stopped sentences, translationese, em-dash overuse), injected once per session. Claude Code's output styles occupy a single global slot and must be configured per machine; this ships the guidance in the package and delivers it through the SessionStart hook already installed, so it **applies in every project and leaves the output-style slot free.** Text vendored from [fluent-korean](https://github.com/snflkd/fluent-korean) (Copyright (c) 2026 snflkd, MIT), license included.
|
|
718
|
-
- **Decided at install time** โ a Korean system locale turns it on; anything else leaves it off. Your own on/off choice is preserved, so upgrades never override it. Skip with `CTS_NO_KOREAN=1`. (From v3.21.0 the install asks instead of deciding for you.)
|
|
719
|
-
- **Corrected an overstated README claim** โ routing savings were described as "the whole product", but the measured โ18.6% comes from the harness and ratchet. The relationship between the three is now stated accurately.
|
|
720
|
-
|
|
721
|
-
### v3.18.0 (2026-08-22)
|
|
722
|
-
- **Korean documentation rewritten for clarity** โ full sentences with explicit predicates, and em dashes replaced by colons and conjunctions where they were compressing too much meaning.
|
|
723
|
-
- **Added why realtime model routing can cost more** โ prompt caches are per-model, so a mid-session switch cancels the savings via cache loss; this is why the tool delegates to subagents only.
|
|
724
|
-
|
|
725
|
-
### v3.17.0 (2026-08-22)
|
|
726
|
-
- **One install now sets up the ๐
ท Harness too** โ until now `harness init` was a separate step, without which the ๐
ท score and ratchet-rule delivery did nothing. The install **appends** the 5-principle block to `~/.claude/CLAUDE.md` (existing content backed up and preserved; an existing block is left alone). Skip with `CTS_NO_HARNESS=1`, undo with `harness uninit --global`.
|
|
727
|
-
- **The README leads with the real statusline screenshot** โ the capture replaces the code block at the top, and the duplicate image further down was removed.
|
|
728
|
-
|
|
729
|
-
### v3.16.0 (2026-08-22)
|
|
730
|
-
- **README restructured around routing savings** โ `๐ Routing saved` now opens the page, with how the figure is derived (before / after / gap) and the real `route-scan savings` output alongside it. Channel and homepage badges moved to a "Who makes this" section at the bottom.
|
|
731
|
-
- **Statusline screenshot refreshed to the current two-row layout** โ captured from real output rather than mocked up. Regenerate with `npm run docs:statusline` (headless Chrome; no dependencies added).
|
|
732
|
-
|
|
733
|
-
### v3.15.0 (2026-08-22)
|
|
734
|
-
- **The statusline headline is one lifetime figure** โ `๐ Routing saved $2.09 | fableโsonnet 1ร $0.72 ยท opusโhaiku 1ร $0.57 โฆ`. The weekly and monthly sums are gone: the per-model breakdown that follows is a lifetime split, and next to a row of rolling windows it read as a breakdown of whichever one it touched. One timeframe for the whole line leaves nothing to mismatch. The rolling windows are still in `route-scan savings`.
|
|
735
|
-
- **The per-model breakdown is gray** โ green is reserved for the lifetime total. Repeating that green on every component flattened the line into one loud block with nothing to land on first.
|
|
736
|
-
|
|
737
|
-
### v3.14.0 (2026-08-22)
|
|
738
|
-
- **The statusline headline names the model changes behind the total** โ `๐ Routing saved weekly $1.4 ยท monthly $2.1 ยท total $2.1 | fableโsonnet 1ร $0.72 ยท opusโhaiku 1ร $0.57 โฆ`. Versions are dropped (`claude-opus-4-5-20251101-v1:0` โ `opus`) since they bump constantly and add nothing here. **Every** pair is listed rather than a top-N: the amounts sit next to a total, so a truncated list misstates what that total is made of. Families collapse the list on their own, so it stays short without being cut.
|
|
739
|
-
- **New `route-scan savings`** โ the evidence behind the headline: a per-model-change rollup (from, to, runs, dollars) and the per-run log (date, amount, model change, the rule that caused it).
|
|
740
|
-
- **Baselines are the model that handled a category most, not the priciest seen** โ transcripts routinely carry more than one model (a mid-session switch), and taking the priciest let a single Fable record set the baseline for a category Opus had handled thirty times, inflating every later saving. Ties break toward the pricier model. Baselines written under the old definition are recomputed once.
|
|
741
|
-
- **The ledger is written after the rule refresh** โ writing it first made a changed baseline take two scans to settle: the first stored the new baseline but billed against the old one.
|
|
742
|
-
|
|
743
|
-
### v3.13.0 (2026-08-22)
|
|
744
|
-
- **Routing savings are now priced "model before the rule โ model that ran it"** โ previously the counterfactual was the session's priciest model, which booked a saving even when that model had never handled work of this shape. Each rule now remembers the **model that handled its category before promotion** (its baseline) and prices only against that. The baseline is sticky once set: as a rule takes effect fewer episodes stay on the expensive model, so a recomputed baseline would drift down and shrink the very saving the rule produces.
|
|
745
|
-
- **Delegations no rule covers are excluded** โ `Explore`, hand-written agents, and plugin subagents were all being counted, crediting this tool for routing it never did. Ledger events now carry `rule` / `from` / `to`, so every dollar is traceable to the rule and model change behind it.
|
|
746
|
-
- **Ledger schema version 2** โ v1 events used the old counterfactual and are discarded rather than migrated; the next `route-scan` refills whatever is genuinely attributable.
|
|
747
|
-
- **House alias model ids no longer price as Sonnet by accident** โ when a gateway reports an alias carrying no family name (`prod-large`), the pricing table's default made it Sonnet, fabricating or erasing savings. Both sides of a comparison must now be recognizable ids. Bedrock (`anthropic.claude-opus-4-5-v1:0`), Vertex (`claude-opus-4-5@20251101`), and the `[1m]` suffix are recognized as-is; house aliases come back into the aggregate with one line in `modelAliases` (wildcards supported).
|
|
748
|
-
- `harness check` also reports CLAUDE.md size and whether a `.claudeignore` exists (advisory; the ๐
ท score is unaffected).
|
|
749
|
-
|
|
750
|
-
### v3.12.1 (2026-08-22)
|
|
751
|
-
- **Routing-savings headline reads more clearly** โ the amounts are now in the savings green (the one unambiguously good number on the line), `wk`/`mo`/`all` are spelled out as `weekly`/`monthly`/`total`, and the period now leads the amount. Three bare amounts in a row read as a single number until the eye found the trailing marker.
|
|
752
|
-
|
|
753
|
-
### v3.12.0 (2026-08-22)
|
|
754
|
-
- **Routing saved now leads the statusline with weekly / monthly / lifetime totals** โ `๐ Routing saved weekly $1.3 ยท monthly $2.0 ยท total $9.8`. Each delegated subagent run's saving is recorded in a ledger (`delegation-ledger.json`) keyed by its transcript path, so overlapping re-scans upsert instead of double-counting; the statusline sums 7-day, 30-day, and lifetime windows on line 1 while the other chips move to line 2. An empty ledger keeps the legacy one-line layout, and `--single-line` forces it (some macOS Claude Code builds render only the first line). Totals start accruing from the release โ no back-fill.
|
|
755
|
-
- **`harness check` reports context weight** โ the approximate per-request token cost of CLAUDE.md (warns over the ~4k guideline) and whether a `.claudeignore` exists. Advisory only; the ๐
ท N/5 score is unaffected.
|
|
756
|
-
- **Self-describing ARNs resolve without learning** โ `foundation-model/anthropic.claude-โฆ` and system cross-region profiles (`inference-profile/us.anthropic.claude-โฆ`) embed the model id yet resolved to `unknown`, dropping delegation and cost aggregation entirely on gateway machines that hadn't accumulated learning samples. They now pass straight to the existing tier classifier; opaque application-profile ids keep the override/learning path.
|
|
757
|
-
|
|
758
|
-
### v3.11.0 (2026-08-21)
|
|
759
|
-
- **Routing savings chip in the statusline** โ `๐ Routing saved $3.2`. Cumulative savings from model routing, placed right after the model name so it reads early in the line. The existing `๐ฐ Cache saved` covers the prompt cache and is a different number. Zero or missing data hides the chip entirely, so nothing changes for direct-API users. The statusline only reads `model-rules.json` โ it never triggers a scan (it re-renders every few seconds). Segment name: `delegated`.
|
|
760
|
-
- **Role-learning mis-classification fixed** โ subagent records sometimes land in the parent transcript without an `isSidechain` flag, and that circumstantial evidence could outvote stated evidence, confirming a haiku profile as the session model (measured: 16 against 1, agreement exactly at the 80% line). Stated evidence (`Task(model:)` parameters, agent-definition frontmatter) and inferred evidence are now tallied separately, and an inference is not adopted when stated evidence contradicts it. Undecided ids stay `unknown` and leave the aggregate.
|
|
761
|
-
|
|
762
|
-
### v3.10.0 (2026-08-20)
|
|
763
|
-
- **Model tiers are detected again behind a Bedrock / LiteLLM gateway** โ when the transcript's model id is an inference-profile ARN there is no `opus` or `haiku` in the string, so it fell back to Sonnet. Since `worthDelegating()` requires `rank > target`, **every T1 rule was rejected**, savings aggregated to zero, and cost was under-counted by roughly 1.67x. The profile id is now learned as a role (parent `Task` call joined to the subagent run by `toolUseId`) and mapped back to the alias your environment declares. The pricing table, the ranks, and the tiering logic are untouched.
|
|
764
|
-
- **No confident mapping means no guess** โ under three observations, or below 80% agreement, the id stays `unknown` and leaves the delegation aggregate. Quietly calling it Sonnet was the worse failure.
|
|
765
|
-
- **Manual override** โ `modelAliases` in `<userDataDir>/profile-map.json`, wildcards allowed. No profile id or AWS account id is ever hardcoded in this package.
|
|
766
|
-
- Direct-API machines behave **exactly as before** and no new file is written.
|
|
767
|
-
|
|
768
|
-
### v3.9.2 (2026-08-01)
|
|
769
|
-
- **Added a LICENSE file (MIT)** โ the field existed in `package.json` but the file did not, which blocked license review for company adoption. It ships in the npm tarball now via `files`.
|
|
770
|
-
- **Package description and keywords rewritten for what this actually does** โ leftover cache-monitoring copy meant it never surfaced for `model-routing` / `delegation` / `subagent`.
|
|
771
|
-
- **A 60-second on-ramp at the top of the README** โ that this is post-hoc analysis rather than a router, plus the three commands from install to seeing your own numbers.
|
|
772
|
-
- **One-time note in `route-scan`** โ prints the explainer link exactly once. Disable with `CTS_NO_NOTE=1`.
|
|
773
|
-
|
|
774
|
-
### v3.9.1 (2026-08-01)
|
|
775
|
-
- **compact-window now recommends a 400kโ700k band instead of a single 400k** โ 400k proved too tight in practice and compacted too often. The advice is a range now, and **a window inside it (or below it) is never warned about**; only an unset value or one above 700k raises `๐
ทโ compact-window?` and the briefing. `set` defaults to 500k (mid-band); pick your own with `--value 600k`.
|
|
776
|
-
|
|
777
|
-
### v3.9.0 (2026-08-01)
|
|
778
|
-
|
|
779
|
-
Compared this tool's design against manifest.build's "Everyone is building LLM routers, we deprecated ours" (a retrospective on 4 months across 7,000 users) and closed the four of their failure modes that were not already ruled out here. Full comparison in [TIER_CRITERIA.md ยง3.9](./docs/TIER_CRITERIA.md).
|
|
780
|
-
|
|
781
|
-
- **rule-health now watches real delegations** โ the old error rate's denominator was "episodes the expensive model handled directly that merely *looked* delegable by shape". It never measured whether a rule succeeded **when it actually fired**, so a rule could fail every single time without moving the signal. Claude Code writes each subagent run to `<session>/subagents/`, and its meta `toolUseId` joins exactly onto the parent's Task call โ so the outcome of a real delegation is now counted directly. Once 5 measured runs accumulate, they replace the shape-based proxy, and the warning says which evidence it is using. (Author's 14-day log: 4 of 106 sessions, 18 runs, 100% join rate.)
|
|
782
|
-
- **Per-rule savings** โ the tokens a delegated run spent are re-priced at the session model's rate, and the difference is reported over the 14-day window as `~$` in `route-scan rules` and `ratchet-model.md`. You can only prune rules that aren't worth their keep if you can see which ones those are. A rule with no measured delegations shows `โ`, not `$0` โ the two mean opposite things.
|
|
783
|
-
- **Tiers are now relative to the session model** โ the only gate used to be "is it haiku?", so a Sonnet session produced T1 rules telling it to delegate to Sonnet: a subagent rebuilding context for zero price difference, which is a net loss. Candidates are now only created when the target tier is genuinely cheaper (haiku 0 ยท sonnet 1 ยท opus 2 ยท fable 3).
|
|
784
|
-
- **Probe-then-commit budgets** โ a rule is derived from statistics but **fires on the request text alone**, and most of what makes a task hard only shows up after the first tool call. That gap can't be closed, so the cost of getting it wrong is capped instead: every rule now carries a calibrated limit (T2: 8 tool calls / p25 output, T1: p75 output), and a run likely to exceed it โ or hitting an error โ stops there, reports partial progress, and hands back to the main model. The clause is composed at render time rather than baked into the stored rule, so **rules promoted before this release get it too**, and the promote preview can never drift from what lands in the file.
|
|
785
|
-
|
|
786
|
-
### v3.8.2 (2026-08-01)
|
|
787
|
-
- **Fixed: the context tier never came back down after compaction** โ the tier was kept as a high-water mark, so a session that compacted at 80% stayed at tier 1 even though its context had just been emptied, and it refilled to the cap with no signal at all. The tier now follows the measurement down and warns again on the next climb.
|
|
788
|
-
- **Both windows are named** โ with `autoCompactWindow` at 400k the briefing measured against 400k (80%) while Claude Code's own display measured against 1M (33%); two irreconcilable numbers for one session. The text now reads `์๋ ์์ถ ์ฐฝ(400k)์ 80% (โฆ ํ๋ฉด์ 1M ์ฐฝ ๊ธฐ์ค์ผ๋ก๋ 33%)`.
|
|
789
|
-
- **No "start a new session" advice when a compact window is set** โ that threshold is exactly where compaction runs on its own, so the briefing suggests writing decisions and next steps to a file instead.
|
|
790
|
-
|
|
791
|
-
### v3.8.1 (2026-07-31)
|
|
792
|
-
- **Fixed: 1M sessions were judged against a 200k window** โ the briefing inferred the window from the largest request seen so far, so a 1M session counted as 200k until it had already grown past 250k. At 160k of input it announced "past 80% of the 200k window" โ really 16%. The window now comes from the configured model id, and when `autoCompactWindow` is set that is where the session actually turns over, so the percentage is measured against it (the text says `(autoCompactWindow ๊ธฐ์ค)`). The observed-size heuristic remains only as the fallback for an unreadable model id.
|
|
793
|
-
|
|
794
|
-
### v3.8.0 (2026-07-31)
|
|
795
|
-
- **New `compact-window` โ 1M sessions had no compaction cap** โ Claude Code compacts near `min(autoCompactWindow, model max context)`. On a 1M window with that value unset, compaction only fires around 800k, and every request until then re-bills the entire context. A 1M model with the value unset or above 400k now raises `๐
ทโ compact-window?` on the statusline plus a session briefing, and `compact-window set --global|--project` pins 400k. 200k sessions are exempt โ the setting cannot change anything for them.
|
|
796
|
-
|
|
797
|
-
### v3.7.0 (2026-07-29)
|
|
798
|
-
- **Fixed: delegation rules named subagents that may not exist** โ generated T2 rules hard-coded preset names like `haiku-explore` / `haiku-runner`, which live in each user's own `~/.claude/agents/` and are not shipped by this package. On a machine without them, the rule told the model to delegate to a nonexistent agent. The default phrasing is now `model: haiku` (matching T1's `model: sonnet`), and the name is added only when the agent file is really present, e.g. `haiku-explore(model: haiku)`. Project-level `.claude/agents/` counts too. `ratchet-model.md` re-renders with the new phrasing on the next `route-scan`.
|
|
799
|
-
|
|
800
|
-
### v3.6.4 (2026-07-29)
|
|
801
|
-
- **Fixed: false `๐
ทโ ratchet-unloaded`** โ the import check looked at a single CLAUDE.md. When the project file carried the harness block, only that file was inspected, so the common layout of block-in-project + `@` imports-in-global raised the warning even though the rules loaded fine. Claude Code loads both files, so the flags are now the union of the two, and `importSource` (`project`/`global`/`both`) says which file carries them. The warning fires only when neither file imports.
|
|
802
|
-
|
|
803
|
-
### v3.6.3 (2026-07-27)
|
|
804
|
-
- **Fixed: approved ratchet rules never reached the session** โ `harness promote` appended rules to `ratchet.md`, but nothing ever read that file. Claude Code loads `CLAUDE.md` (plus whatever it imports) and the harness block carried no import line, so "approved rules apply automatically from the next session" was unimplemented. The block now imports `@.claude/ratchet.md` (project) / `@~/.claude/ratchet.md` (global). Re-running `harness init` upgrades an existing block in place.
|
|
805
|
-
- **`ratchet-model.md` is imported explicitly too** โ delegation rules now travel the same declared path instead of relying on a host that happens to pick the file up. To keep the import from dangling, `harness init` seeds an empty file and `syncAllFiles` empties rather than deletes a target that loses its last rule.
|
|
806
|
-
- **New `๐
ทโ ratchet-unloaded` warning** โ all five sections can be present while the rules are dead weight, so a missing import is reported separately from `N/5`. `harness check` says the same thing and prints the fix.
|
|
807
|
-
- **New `harness prune`, plus ratchet size in `check`** โ an imported ratchet costs tokens on every request. `harness check` now reports rule count and per-request tokens and warns past ~2,000. Trim with `harness prune [--tag <t>] [--older-than <months>] [--dry-run]`, which moves rules to `ratchet-archive.md` rather than deleting them. Prefix a rule with `[tags]` (`- 2026-05-08: [video] ...`) to prune by topic. (`@` imports are static, so load-time filtering is not possible โ the only lever is fewer rules.)
|
|
808
|
-
|
|
809
|
-
### v3.6.2 (2026-07-26)
|
|
810
|
-
- Docs-only release โ restores the missing v3.4.0โv3.5.3 release notes below. Published because the npm package page renders the README of the published version. No code changes.
|
|
811
|
-
|
|
812
|
-
### v3.6.1 (2026-07-26)
|
|
813
|
-
- **Fixed state files splitting apart on macOS and Windows** โ `route-scan.json`, `model-rules.json`, and `brief-state.json` each carried a private copy of the path resolver, and those copies honored `XDG_CONFIG_HOME` on Linux only. With XDG set on macOS or Windows, `config.json` and the session cache moved while those three stayed at the platform default, so delegation-candidate briefings and promoted rules silently vanished. All of them now resolve through `paths.js`. (Caught by the 3-OS CI added in v3.6.0; a regression test now keeps a fourth copy from reappearing.)
|
|
814
|
-
- Fixed `npm test` failing on Node 22 โ Node 22 resolves the directory argument of `node --test test/` as a module path.
|
|
815
|
-
|
|
816
|
-
### v3.6.0 (2026-07-26)
|
|
817
|
-
- **Statusline refreshes stop re-parsing everything** โ parsed sessions are now cached under a `(path, mtime, size)` key. Transcripts are append-only, so that triple is a sound identity for a parse result. On a 217MB / 226-file 30-day window every refresh used to spend ~3s re-reading files that could not have changed; now only the files that actually grew (in practice, the current session) are read. A stale or corrupt cache is never fatal โ every read path falls back to a full parse.
|
|
818
|
-
- **ratchet-model.md renders in English** โ the model reads this file as instructions, so a Korean-only file dragged English sessions into Korean. Header, rule text, and rule-health warnings now follow the `language` setting. Category labels and rule text are stored in both languages at scan time, so switching languages takes effect immediately without a rescan.
|
|
819
|
-
- **Tests and CI** โ `npm test` runs 22 `node:test` cases, and GitHub Actions runs them across ubuntu/macOS/Windows ร Node 18/22. The cross-platform user-path handling (XDG / APPDATA / Application Support) is exactly what a single-OS run would miss.
|
|
820
|
-
- **bin/cli.js split up** โ the 1,000-line CLI is now `src/commands/*` (install, harness, route-scan, brief, handoff, history, last, mode) plus arg-parsing and stdin-payload helpers. No behavior change.
|
|
821
|
-
|
|
822
|
-
### v3.5.3 (2026-07-22)
|
|
823
|
-
- **rule-health: self-corrected and harness-guard errors excluded** โ edit-ordering guards and self-correction errors (`File not read yet`, `String to replace not found`, `modified since read`, `Blocked:`, Task lifecycle) are part of a flow the model recovers from on its own, not a difficulty signal. Continues the permission-noise cleanup from v3.4.2. Ambiguous `Exit code N` / `File does not exist` stay counted.
|
|
824
|
-
|
|
825
|
-
### v3.5.2 (2026-07-21)
|
|
826
|
-
- **Session-start briefing is delivered proactively** โ the SessionStart hook's wording was conditional ("when you relay this"), so the model could file it away as background. It now explicitly asks for a summary at the end of the first response under a `โป [claude-token-saver]` label, even when the user's opening message is unrelated small talk.
|
|
827
|
-
- **Fixed a brief-seeding race** โ the brief hook used to swallow every route/rule-health event on its first run; it now swallows only the signatures SessionStart actually briefed (`seedSessionBriefed()`). When a background rescan finishes just after session start and produces a new candidate, it used to go unmentioned for the whole session โ now it's briefed on the next prompt.
|
|
828
|
-
|
|
829
|
-
### v3.5.1 (2026-07-14)
|
|
830
|
-
- **Hook install no longer overwrites schema-violating values** โ a non-array `hooks.SessionStart` / `hooks.UserPromptSubmit` used to be replaced with an empty array. It's now skipped with a reason, to protect user data. Normal array merging (append, idempotent) is unchanged.
|
|
831
|
-
|
|
832
|
-
### v3.5.0 (2026-07-14)
|
|
833
|
-
- **Per-session change briefing hook (UserPromptSubmit)** โ the model cannot see statusline chips, so mid-session state changes (context threshold crossed, new route candidate, rule-health flip) went unexplained until the user asked. Runs on every prompt submit and stays **completely silent when nothing changed** (zero context cost).
|
|
834
|
-
- Context measurement and briefing markers are both keyed by session_id โ window auto-detection (200k/1M), tiers at 80% and 95%, each announced once.
|
|
835
|
-
- route/rule-health are seeded at the session's first event so they don't duplicate the SessionStart briefing; only what appears mid-session is injected.
|
|
836
|
-
- The installer registers the UserPromptSubmit hook idempotently, and session state untouched for 7 days is pruned.
|
|
837
|
-
|
|
838
|
-
### v3.4.3 (2026-07-14)
|
|
839
|
-
- **Write-dominant episodes are no longer delegation candidates** โ editing work (Edit/Write dominant) leaked into read/explore through generic keywords. Measured: a 5-edit doc session classified as read/T1 and generated 67% error-rate noise. A write-dominant episode now maps to translate only with explicit translate keywords, and otherwise to nothing at all.
|
|
840
|
-
|
|
841
|
-
### v3.4.2 (2026-07-14)
|
|
842
|
-
- **rule-health numerator cleaned up โ permission-class errors excluded** โ user tool denials, auto-mode classifier denials, and permission-denied errors reflect user intent and policy, not task difficulty. A full 14-day audit found ~25% of 142 `is_error` events were this class, and they were what pinned a 24% โ flag on the global run/T1 rule (18% after exclusion, clearing it; the real run/T1 error rate went 23% โ 8%).
|
|
843
|
-
|
|
844
|
-
### v3.4.1 (2026-07-14)
|
|
845
|
-
- **Minimum-sample guard for rule-health (`HEALTH_MIN_SAMPLE=10`)** โ 1 error out of 4 samples (25%) was enough to raise a review flag. Below 10 eligible episodes in the window the rate is noise, so the flag is withheld.
|
|
846
|
-
|
|
847
|
-
### v3.4.0 (2026-07-14)
|
|
848
|
-
- **Behavior-first categorization** โ `categorize()` rewritten from first-match regexes into three stages: paste gate โ tool-usage histogram (`behaviorPool`) to narrow the candidate pool โ weighted keyword scoring. **What the episode actually did outranks how the prompt was worded** ("check whether the tests pass" that really ran `npx playwright test` is a run episode regardless of phrasing).
|
|
849
|
-
- Added irreversible/external keywords to ESCALATE_RE (submit, deploy, release, merge, โฆ) โ they can look like light run episodes in the logs, but delegating them defeats the harness's default-safe-path rule.
|
|
850
|
-
- rule-health statistics keyed by `tier|category|project` โ removes the double counting that happened when a category's T2 and T1 rules shared one bucket.
|
|
851
|
-
- ratchet-model.md rendering: a category's T2 and T1 rules are emitted as **one merged rule carrying the decision criteria at request time** (haiku by default โ sonnet when multi-step โ main model when irreversible).
|
|
852
|
-
|
|
853
|
-
### v3.3.1 (2026-07-13)
|
|
854
|
-
- **Plain language instead of codes** โ bare `R1`/`T2` codes were unreadable for first-time users. Every user-facing listing (SessionStart hook briefing, `route-scan` candidates, `route-scan rules`) now spells tiers out as `T2 (simple โ haiku-class is enough)` and scopes as `this project only` / `all projects (global)`. The hook briefing also instructs the model to relay the spelled-out explanation, not the codes. (Statusline chips keep the terse `route? R1` for width; the session briefing carries the meaning.)
|
|
855
|
-
|
|
856
|
-
### v3.3.0 (2026-07-13)
|
|
857
|
-
- **Delegation visibility & briefing** โ the whole model-fitting loop is now surfaced to the user:
|
|
858
|
-
- The SessionStart hook injects, per candidate, **the exact rule text that would be written to ratchet-model.md** โ you see precisely what you're approving.
|
|
859
|
-
- Rules flipped to review (delegated-category error rate over 20%) are announced on **both** the statusline (`๐
ทโ rule-health R<N>` chip โ implementing the item from the design doc; precedence: session-quality warnings > rule-health > route? candidates) and the session-start briefing.
|
|
860
|
-
- The ratchet-model.md header now instructs the model to prefix each delegation with `๐ [claude-token-saver] model-fitting: "<category>" โ <agent>` โ making it visible which tool is saving your tokens.
|
|
861
|
-
- README updated to the 3.x identity (model-fitting delegation in the top pitch, collapsible research-evidence section under route-scan); fixed a stale comment in model-rules.js.
|
|
862
|
-
|
|
863
|
-
### v3.2.2 (2026-07-13)
|
|
864
|
-
- **No re-proposing registered rules** โ (tier|category|project) combinations that already have a model-fitting rule are excluded from scan candidates (a global rule covers every project). Fixes rules registered outside the promote flow (e.g. migrations) resurfacing as candidates.
|
|
865
|
-
|
|
866
|
-
### v3.2.1 (2026-07-13)
|
|
867
|
-
- **Instant pattern analysis on first setup** โ `install` (including npm postinstall) analyzes your existing session logs inline when no cache exists, so tier-delegation candidates appear from the very first Claude Code session (previously the second).
|
|
689
|
+
The full history moved to [CHANGELOG.md](./CHANGELOG.md) (Korean; version headings and command names are language-neutral). Recent changes:
|
|
868
690
|
|
|
869
|
-
|
|
870
|
-
- **
|
|
871
|
-
- **Model-fitting ratchet separated** โ promoted delegation rules live in their own file (`.claude/ratchet-model.md` / `~/.claude/ratchet-model.md`), file-level-separated from hand-written rules, managed via `route-scan rules [rm <N>]`; the harness CLAUDE.md block references both files.
|
|
872
|
-
- **Log-driven auto-refresh + rule-health** โ every rescan recomputes each registered rule's recurrence count and error rate (over delegation-shaped episodes) and rewrites the file. An error rate >20% flags the rule with `โ rule-health`, suggesting narrowing or removal.
|
|
873
|
-
- **Data-triggered rescans** โ the fixed 24h TTL is gone; new transcript volume triggers rescans (~5MB โ immediately, a trickle โ daily, no change โ skip, 1h minimum interval, one immediate refresh after promote).
|
|
874
|
-
|
|
875
|
-
### v3.1.0 (2026-07-13)
|
|
876
|
-
- **frugon integration removed** โ the `claude-token-saver frugon` JSONL-export subcommand is gone. An external analyzer's aggregate report can't be turned into ratchet rules (condition โ action), so it never fed the delegation pipeline; 3.x instead invests in **first-party tier classification over session logs**. route-scan is unaffected (the shared parser moved to `src/session-records.js`).
|
|
877
|
-
|
|
878
|
-
### v3.0.1 (2026-07-13)
|
|
879
|
-
- **`harness pull` redefined** โ v3.0.0's "copy global ratchet โ project" was pointless (the global ratchet already applies to every project as the upper layer of the hierarchy) and is removed. `pull` now registers the **author-curated ratchet rules** bundled with the package (`presets/ratchet-rules.md`) into your global ratchet โ six general-purpose rules promoted from real recurring mistakes; opt-in and idempotent.
|
|
880
|
-
|
|
881
|
-
### v3.0.0 (2026-07-13)
|
|
882
|
-
- **Major bump** โ with v2.19's frugon integration and v2.20's route-scan, the product's character shifted from "after-the-fact token monitor" to "a routing layer that pushes recurring easy work down to cheaper models", so this ships as a major. No breaking changes (every existing command and setting remains compatible).
|
|
883
|
-
- **route-scan promote fix** โ `harness promote R<N> --project` now writes the rule into the `.claude/ratchet.md` of the project the candidate was **detected in** (previously it landed in whatever directory the CLI ran from). The scan stores each candidate's real session path (`projectPath`); promoting a foreign-project candidate from a pre-3.0 cache without that field is refused with a pointer to `route-scan --refresh`.
|
|
884
|
-
- **New `harness pull`** โ redefined in v3.0.1 (see above).
|
|
885
|
-
|
|
886
|
-
### v2.20.0 (2026-07-13)
|
|
887
|
-
- **route-scan**: detect recurring easy work on expensive models โ `๐
ทโ route? R<N>` chip + SessionStart hook context injection + `harness promote R<N> --project|--global` to promote haiku-delegation ratchet rules.
|
|
888
|
-
|
|
889
|
-
### v2.19.0 (2026-07-12)
|
|
890
|
-
- **frugon integration**: `claude-token-saver frugon` โ export session transcripts as [frugon](https://github.com/Rodiun/frugon)-compatible JSONL for model-routing savings analysis (`--run` to analyze immediately; cache-weighted tokens by default).
|
|
891
|
-
|
|
892
|
-
### v2.18.0 (2026-07-02)
|
|
893
|
-
- **1M-context warning re-scoped** โ current models (Fable 5, Opus 4.6โ4.8, Sonnet 5) all default to a 1M window with no long-context premium since Opus 4.7, so the "1M mode ON = expensive" framing is retired. The warning is now a **usage signal**: `โ 1M ON` โ `โ Ctx 200k+` (a single request actually exceeded 200k), and remediation is reordered to lead with `/compact`/`/clear` + `/effort` instead of "disable 1M". The incorrect "long-context pricing kicks in past 200k" copy is fixed.
|
|
894
|
-
- **๐ฆ segment shows live usage** โ reads `context_window.used_percentage` from Claude Code's stdin and renders `๐ฆ Ctx 68% of 1M`, colored by fill (green <70 / yellow 70โ89 / red 90+). Falls back to transcript-inferred size when stdin is absent (1M now yellow, not red).
|
|
895
|
-
- Back-compat: the legacy `โ 1M ON` chip and old detail strings in existing history files still resolve.
|
|
896
|
-
|
|
897
|
-
### v2.17.0 (2026-07-02)
|
|
898
|
-
- **Fable 5 pricing tier** โ `claude-fable-5`/`claude-mythos-5` previously fell through to the Sonnet tier ($3/$15), under-estimating costs ~3ร. Now priced at the real rates ($10 input / $50 output / $12.50 5m-write / $20 1h-write / $1 read).
|
|
899
|
-
- README overhaul โ top-level impact summary, segment table, harness scope-flag docs, pricing table brought current.
|
|
900
|
-
|
|
901
|
-
### v2.16.0 (2026-07-02)
|
|
902
|
-
- **Statusline fixes** โ when two rate-limit windows are โฅ90% at once, only the cap-warn-promoted window is suppressed (the other stayed hidden before); `--no-color` output is truly ANSI-free; the no-session fallback line keeps cap-warn / ๐
ท / model chips.
|
|
903
|
-
- **Harness warning accuracy** โ ๐
ทโ warnings expire after 30 minutes (previously lingered indefinitely); session cwd normalized to the project root (subdirectory launches match); no-cwd states no longer leak into every project.
|
|
904
|
-
- **Fewer PEV-skip false positives** โ only mutating tools count; windows sliced by assistant turns.
|
|
905
|
-
|
|
906
|
-
<details>
|
|
907
|
-
<summary>Older versions (v2.8.5 โ v2.15.0)</summary>
|
|
908
|
-
|
|
909
|
-
### v2.15.0 (2026-06-13)
|
|
910
|
-
- **Global harness init** โ `harness init --global` installs the 5 sections into `~/.claude/CLAUDE.md` (+ `~/.claude/ratchet.md`), applying to every project. `harness check` honors global as a fallback (`๐
ท 5/5 (covered by global)`).
|
|
911
|
-
- npm homepage change; @DeepPulseEN + homepage badges.
|
|
912
|
-
|
|
913
|
-
### v2.13.x (2026-05-04)
|
|
914
|
-
- "Real-world impact" restructured as the harness+ratchet before/after report; statusline screenshot + impact chart; npm metadata cleanup; YouTube handle fix.
|
|
915
|
-
|
|
916
|
-
### v2.11.0 (2026-05-02)
|
|
917
|
-
- `harness list` / `harness rm <N>` (auto `.bak`, "narrow the condition first" guidance).
|
|
918
|
-
|
|
919
|
-
### v2.9.x (2026-04-27)
|
|
920
|
-
- Output language toggle (`mode ko`/`en`) for `last`/`history`/advice; Skill responds in the configured language; Node.js prerequisite block; Skill workflow guide; `language` config location cleanup.
|
|
921
|
-
|
|
922
|
-
### v2.8.6 (2026-04-27)
|
|
923
|
-
- **Skill auto-registers on install** via postinstall hook.
|
|
924
|
-
|
|
925
|
-
### v2.8.5
|
|
926
|
-
- IntelliJ plugin frame-fusion workaround โ auto text mode under JediTerm.
|
|
927
|
-
|
|
928
|
-
Older versions: see `git log`.
|
|
929
|
-
</details>
|
|
691
|
+
- **v3.35.0**: A `๐ต Sep $42` segment now shows estimated spend since 00:00 on the 1st of the current month, always on โ including gateway setups with no 5h/7d caps. LiteLLM gateway users get a `๐ budget โฐโฑ 34% $34/$100` gauge built from the key's budget (`GET /key/info` + `GET /user/info`, team-membership budget first, then key, then internal user โ verified against a Dockerized LiteLLM).
|
|
692
|
+
- **v3.34.0**: seed presets offered one at a time, output-language choice at install, context warning raised to 500k.
|
|
930
693
|
|
|
931
694
|
## License
|
|
932
695
|
|