Repository navigation
v0.6.4
context-guru v0.6.4
Keep-alive no longer pays to write the whole conversation again after a sweep question. On one laptop, those re-writes cost $97.97 in 3.9 days, more than half of what Context Guru saved there. The summary checkpoint now survives a proxy restart and a long pause. The Ping button shows only when a press can help.
Items marked [Notice] change something you will see, or need an action from you.
New and changed
- [Notice] Keep-alive never shortens the cache strategy (#776, #777, #779).
- The problem: the sweep question, and the summarizer's keep-alive call, could take a planned ping. They read the cache, but did not keep the turn's own cache entry alive. So the next ping wrote the whole conversation again.
- On one laptop, ping 2 re-wrote the conversation in 26% of cases: $97.97 in 3.9 days. On Sonnet 5.5 it was 54% of ping 2s.
- After a turn that ends at a tool result (#777): the question now keeps the turn's cache breakpoint. In a live check, ping 2 then read 31,542 tokens and wrote 0, where main wrote 18,053.
- After a turn that ends at text (#779): every planned ping stays a plain ping, as the strategy plans. The sweep question or the summary goes out once after the last planned ping, 210 s later on the 5-minute defaults. Nothing is sent after it.
- When a summary and the sweep question are both due in one idle period, only the summary goes.
- The cost: one extra small request for each idle period after a text turn, about $0.01 to $0.02.
- The cover: a user who comes back inside the strategy's warm period is covered exactly as without the sweep.
- The rule is now written in
docs/design.md("Keep-alive: the cache strategy comes first"), and a guard test checks it for every keep-alive request.
- [Notice] The summary checkpoint survives a restart and a long pause (#769, #770, #775).
- Before, a proxy restart, or 2.8 hours with no request, deleted the summary checkpoint. The next turn sent the full transcript. On a large session that could be over the window, so the provider refused it and Claude Code compacted the conversation itself.
- Now the proxy also keeps this state in the dashboard database, in its own
session_statetable, and keeps it 24 hours in memory. A session that comes back gets its state from the table. - It is on whenever the dashboard is on, which is every plugin install.
--session-state=falseturns it off. - What is stored: at the "everything" level, the summary text and the other content the proxy keeps between turns. At "metadata only" (
--session-state-metadata-only), only counts and hashes. The copies forexpandare never written to disk. - State rows expire after 30 days, or when the dashboard deletes or archives their session.
- [Notice] After a proxy restart, a thread is protected by its own last request (#766, #767). In v0.6.3, a thread's first request after a restart was kept unchanged if it came within one cache lifetime of the restart. Now it is kept unchanged only if the thread's own last request, or a ping that refreshed its cache, was within one cache lifetime. A new thread is not protected. Observe-mode tenants, and a proxy with no dashboard, keep the v0.6.3 rule. The dashboard database gets a new column,
session_alias. - [Notice] The Ping button shows only when a press can help (#771, #773). Claude Code plugin 0.6.4.
- The button hides while an automatic ping is due before the cache expires. The band shows
↻ next ping m:ssinstead, or↻ pinging…at the planned moment. - After a cache miss, a refused ping or a route failure, the button shows again while the cache is warm and the proxy still holds the request.
- While the route or the key is marked as failing, the button stays hidden, and the band says
ping off: upstream failing. - The
/pingcommand is removed. The Ping button does the same. - The pane follows the same rule as the band.
- The button hides while an automatic ping is due before the cache expires. The band shows
- [Notice] The Overview shows one total and one card per saving (#774). The total is the money Context Guru saved, out of what the same traffic would cost without it. Below it, one card for each part: Cache, Preset, and the tools and skills filter. Percents are now of spend plus savings, so the cards add up to the total. The savings themselves are counted as before.
Fixed
- The insights commands crashed on a new install (#781, #782).
insights,insights details,insights cache details,insights toolsandinsights tools detailsexited with an error on a dashboard with no cache expiry yet, or no tool data. The API now sends an empty list as[], and the plugin reads an empty answer from an older proxy as empty too.insights cache detailsalso crashed on any dashboard with a real cache re-write; that is fixed as well. - The restart grace missed some conversations (#767). A conversation that sends a session header on some turns and none on others was not always found after a restart. Both ids are now checked, with one rule on both sides.
- The dashboard could delete state a live session still used (#775). A session that is deleted keeps its state rows while another session still uses the same id. The per-tenant row limit now also cleans up state rows, and the in-use check uses a new index.
How to upgrade
- Update the proxy:
/context-guru:update. - Update the plugins from the marketplace: Claude Code plugin 0.6.4, Codex plugin 0.2.8.
- If you used
/ping, press the Ping button instead. - If you do not want the summary text in the dashboard database, start the proxy with
--session-state=falseor--session-state-metadata-only. - For code that imports the library:
modes.Tracker.TurnFromtakes 2 more arguments, andTracker.SetLastSeenis new (#767).
Known limits
- Ping 2 is not measured yet after #777 and #779. #778 measures it on real traffic before the next release, and then the ping limit is decided.
- The 22 laptop misses after a text turn did not show in short live sessions on main. #779 follows the cache strategy in every case, and #778 checks the result on large conversations.
- On Opus 5.5 with
claude -p --resume, a real turn can miss the cache 3 s after the turn before it, with no ping between. The pings are not the cause. - The dashboard's savings after a restart can read too high (#766 part 2). It waits for the counterfactual library (#592).
--dashboard-content-capcannot raise the 4,000-byte limit on stored change text (#765).- Small clean-ups after the history import removal are open (#762).
- After the sweep removes outputs on a cold request, the next turns can re-write the conversation to the cache (#729). It showed once, in the v0.6.0 check.
- Two threads with identical requests can still send identical pings (#718).
- On a shared proxy with many users, 320 MB may not hold every large thread (#704).
Changelog
- 1ce2d4c: chore(plugin): bump the plugins for v0.6.4 (Claude Code 0.6.4, Codex 0.2.8) (#780) (@amiddavid)
- a834c74: feat(dash): one total and one card per saving on the Overview (#774) (@OsherElhadad)
- 85919a8: feat(mod): hide the Ping button while an automatic ping fires before the cache expires (#773) (@amiddavid)
- 8cc5b84: feat(store): keep session state through a restart and a long pause (#769) (#770) (@amiddavid)
- 8fbc19c: fix(cheapmodel): the prefix question keeps the turn's breakpoint (#776) (#777) (@amiddavid)
- 2843f44: fix(dash): send empty spend lists as [], and read a null list as empty (#781) (#782) (@amiddavid)
- 1081a06: fix(dash): session-state follow-ups from #770 (#775) (@amiddavid)
- 0c33b7a: fix(keepalive): the sweep question takes the last ping, never ping 1 (#776) (#779) (@amiddavid)
- 3a94f4f: fix: the restart grace uses the thread's last request time (#767) (@amiddavid)
Install
No Go toolchain and no C compiler are needed — the binary is statically linked.
Download the tarball for your platform, untar it, and put context-guru-proxy on your
PATH. The archive unpacks into its own directory, so this is safe to run anywhere:
tar xzf context-guru_*_darwin_arm64.tar.gz
install -m 755 context-guru_*/context-guru-proxy ~/.local/bin/
Then see docs/get-started/quickstart-proxy.md.