<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Kiasi releases</title>
  <id>https://raj-rangani.github.io/kiasi/releases/</id>
  <updated>2026-10-17T08:58:47Z</updated>
  <link href="https://raj-rangani.github.io/kiasi/releases/" rel="alternate" />
  <link href="https://raj-rangani.github.io/kiasi/releases.xml" rel="self" />
  <entry>
    <title>Kiasi 0.9.0</title>
    <id>https://raj-rangani.github.io/kiasi/releases/#v0.9.0</id>
    <link href="https://raj-rangani.github.io/kiasi/releases/#v0.9.0" rel="alternate" />
    <updated>2026-10-17T08:58:47Z</updated>
    <content type="html">&lt;p&gt;The dashboard&amp;#x27;s days bought back no longer overcount, the benchmark compares every cut with what Claude Code alone sends, and the README&amp;#x27;s before-and-after line says where the smaller context comes from. Details in the &lt;a href="https://github.com/raj-rangani/kiasi/blob/main/CHANGELOG.md#090---2026-10-17"&gt;0.9.0 changelog&lt;/a&gt;.&lt;/p&gt;&lt;h3&gt;Highlights&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;An honest bought-back figure.&lt;/b&gt; A cut&amp;#x27;s avoided re-reads now stop at the session&amp;#x27;s next compaction, because after a compaction the cut output would not have been re-sent anyway. The days bought back, the Your month card, the weekly digest, the session receipt and the postmortem all used the old count. On one month of heavy use the figure drops from 9.3 days to 1.1.&lt;/li&gt;&lt;li&gt;&lt;b&gt;A benchmark against Claude Code alone.&lt;/b&gt; Every scenario is measured against what Claude Code alone sends under its documented output limits, not against the raw output. Kiasi sends more on three of the nine scenarios, and the tables say so. A benchmark page at &lt;code&gt;/benchmark/&lt;/code&gt; renders the same data.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Before and after, attributed.&lt;/b&gt; The README gives the measured 232k → 108k tokens per step (2.1× less) instead of an unreproducible 201k → 31k (6.5×). It says that almost all of the drop comes from the 200k compaction window on a 1M-context model, and that Kiasi&amp;#x27;s own cuts keep out about 5%. &lt;code&gt;docs/launch.md&lt;/code&gt; now leads with the measurement and the free setting.&lt;/li&gt;&lt;li&gt;&lt;b&gt;A new website.&lt;/b&gt; The landing page is one scroll story with the Kiasi mark as the hero. It also has a releases page with an Atom feed, and a results section where users post their month cards through an issue form.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Bug fixes&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Dashboard&lt;/b&gt;: days bought back and every figure built on them credited a cut on every later step of the session, past compactions. They now stop at the next compaction.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Out-of-context tools&lt;/b&gt;: two &lt;code&gt;run&lt;/code&gt;, &lt;code&gt;distill&lt;/code&gt; or &lt;code&gt;fetch&lt;/code&gt; saves in the same second no longer overwrite each other. Saved file names end in six random hex characters, and cleanup still recognises the old names.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Upgrade notes&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Update with &lt;code&gt;/plugin marketplace update kiasi&lt;/code&gt; then &lt;code&gt;/plugin update kiasi&lt;/code&gt;, or &lt;code&gt;git pull&lt;/code&gt; in a local checkout, then restart Claude Code.&lt;/li&gt;&lt;li&gt;Expect the days bought back, the Your month card and the session receipts to drop at the next report build. That is the fix, not a regression. The context-per-request factor is measured before and after install and does not change.&lt;/li&gt;&lt;li&gt;No re-run of &lt;code&gt;/kiasi:limits setup&lt;/code&gt; is needed; the status line is unchanged.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Known issues&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Counting stops at every compaction, including a prune that kept the cut output, so the bought-back figure leans low.&lt;/li&gt;&lt;li&gt;Before and after is measured on your machine against the days before you installed. It is not a paired A/B on the same tasks, and nothing yet shows whether Claude finishes the same work with the smaller context.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a href="https://github.com/raj-rangani/kiasi/compare/v0.8.0...v0.9.0"&gt;Full changelog&lt;/a&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Kiasi 0.8.0</title>
    <id>https://raj-rangani.github.io/kiasi/releases/#v0.8.0</id>
    <link href="https://raj-rangani.github.io/kiasi/releases/#v0.8.0" rel="alternate" />
    <updated>2026-10-09T09:02:07Z</updated>
    <content type="html">&lt;p&gt;Install is now one command after the plugin, the Overview says what the re-reads Kiasi avoided are worth in dollars, and the README leads with the weekly limit and a comparison. Details in the &lt;a href="https://github.com/raj-rangani/kiasi/blob/main/CHANGELOG.md#080---2026-10-09"&gt;0.8.0 changelog&lt;/a&gt;.&lt;/p&gt;&lt;h3&gt;Highlights&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;One-step install.&lt;/b&gt; &lt;code&gt;/kiasi:limits setup&lt;/code&gt; now writes the two settings Kiasi needs, &lt;code&gt;CLAUDE_CODE_AUTO_COMPACT_WINDOW=200000&lt;/code&gt; and &lt;code&gt;CLAUDE_CODE_ENABLE_FUNCTION_HOOKS=1&lt;/code&gt;, into the &lt;code&gt;env&lt;/code&gt; block of &lt;code&gt;~/.claude/settings.json&lt;/code&gt; along with the status line. Your other env keys stay, and the command says which settings it added. The session-start reminder for a missing setting names the command instead of a JSON snippet.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Worth in dollars.&lt;/b&gt; The Overview&amp;#x27;s Bought back line adds what the avoided re-reads would have cost at public API rates, priced at the cache-read rate of the models you used in the window, weighted by their reads. The tooltip shows the rate. On an API key it is money; on a flat plan it is what the limit would have spent.&lt;/li&gt;&lt;li&gt;&lt;b&gt;A README that starts with the problem.&lt;/b&gt; The pain in bytes, Quick start first, four things it cuts, three benchmark rows, a comparison with RTK, Context Mode and the compaction window alone, and the rules with the turn-budget trade-off stated. Settings and development notes moved to &lt;code&gt;docs/&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Launch copy.&lt;/b&gt; &lt;code&gt;docs/launch.md&lt;/code&gt; has the Show HN post, the reply for weekly-limit threads and the awesome-list PR text, for anyone who wants to tell others.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Bug fixes&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;None in this release.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Upgrade notes&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Update with &lt;code&gt;/plugin marketplace update kiasi&lt;/code&gt; then &lt;code&gt;/plugin update kiasi&lt;/code&gt;, or &lt;code&gt;git pull&lt;/code&gt; in a local checkout, then restart Claude Code.&lt;/li&gt;&lt;li&gt;Run &lt;code&gt;/kiasi:limits setup&lt;/code&gt; once after updating. It now writes the two env settings, so you can delete them from your own settings if you prefer the command to own them; it leaves them alone if they are already set.&lt;/li&gt;&lt;li&gt;The dollar line appears on the Overview at the next report build after restart. It is left out when no model in the window has a known price.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Known issues&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;The dollar figure is an estimate of what tokens that were never sent would have cost, at today&amp;#x27;s public rates; it is not read from a bill.&lt;/li&gt;&lt;li&gt;The comparison table describes RTK and Context Mode from their READMEs at the time of writing; open an issue if either has changed.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a href="https://github.com/raj-rangani/kiasi/compare/v0.7.0...v0.8.0"&gt;Full changelog&lt;/a&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Kiasi 0.7.0</title>
    <id>https://raj-rangani.github.io/kiasi/releases/#v0.7.0</id>
    <link href="https://raj-rangani.github.io/kiasi/releases/#v0.7.0" rel="alternate" />
    <updated>2026-10-09T06:38:38Z</updated>
    <content type="html">&lt;p&gt;The Overview now tells you what to cut next and whether your last cut worked, and a new &lt;code&gt;/kiasi:floor&lt;/code&gt; skill finds what to trim from the startup floor. Details in the &lt;a href="https://github.com/raj-rangani/kiasi/blob/main/CHANGELOG.md#070---2026-10-09"&gt;0.7.0 changelog&lt;/a&gt;.&lt;/p&gt;&lt;h3&gt;Highlights&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;One week on one axis.&lt;/b&gt; The Overview leads with the runway in a sentence, then the weekly limit as a cumulative burn line and the context sent per day on the same Monday-to-Sunday axis, so used, pace, run-out and the days that caused it line up. The forecast continues dashed to the run-out or the reset.&lt;/li&gt;&lt;li&gt;&lt;b&gt;What to cut next, with trend.&lt;/b&gt; A tinted bar of what the context is made of, then three rows. Each row shows the change against the seven days before, names the biggest single piece behind it (the largest piece of your floor, the one file whose read cost most, the hook that attaches most) and opens its panel.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Startup floor and system reminders panels.&lt;/b&gt; The floor per project with its pieces and a per-day line that shows a settings change as a step. The reminders split by the hook or notice that attached them, with how often each fired.&lt;/li&gt;&lt;li&gt;**&lt;code&gt;/kiasi:floor&lt;/code&gt;.** Audits the last 30 days for skills, MCP servers, agents and hooks that sessions were offered but never used, prints what each costs, and writes a fix script for you to read and run. &lt;code&gt;scripts/once.py&lt;/code&gt; makes a prompt hook attach its text once per session instead of on every prompt.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Session receipt, weekly digest and month card.&lt;/b&gt; A desktop notification at session end with what the session sent and what it would have sent without Kiasi; a weekly digest at startup; and &amp;quot;Share your month&amp;quot; on the Overview as text or an SVG image.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Bug fixes&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Overview chart:&lt;/b&gt; the now label no longer straddles the band&amp;#x27;s floor, the runs-out label no longer runs into the reset label, and the ledger rows stay on one line.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Panels:&lt;/b&gt; closing the Startup floor or System reminders panel clears it from the address, so a refresh no longer reopens it.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Rules:&lt;/b&gt; the breakdown column wrapped again after a shared class name leaked the Overview ledger&amp;#x27;s grid onto it.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Timestamps:&lt;/b&gt; event-log stamps (local time) and transcript stamps (UTC) are read through one parser, so a cut is no longer shifted against its session&amp;#x27;s steps by the local offset.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Upgrade notes&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Update with &lt;code&gt;/plugin marketplace update&lt;/code&gt; then &lt;code&gt;/plugin update kiasi&lt;/code&gt;, or &lt;code&gt;git pull&lt;/code&gt; in a local checkout. No settings change is needed.&lt;/li&gt;&lt;li&gt;The trend on each &amp;quot;What to cut next&amp;quot; row appears once the share history is a week old; before that the rows show no change figure.&lt;/li&gt;&lt;li&gt;The per-day floor line and the share history live in &lt;code&gt;floor-history.json&lt;/code&gt; and &lt;code&gt;share-history.json&lt;/code&gt; next to the other Kiasi data.&lt;/li&gt;&lt;li&gt;Run &lt;code&gt;/kiasi:floor&lt;/code&gt; to get the audit and its fix script. The script backs every file up and only moves things the audit saw unused; read it before running it.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Known issues&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;The floor audit counts a skill or server as used only when a transcript in the window shows it; a tool you use rarely can be listed as unused. The fix script only moves such things to project scope, it deletes nothing.&lt;/li&gt;&lt;li&gt;Image files read with the Read tool count as file reads in the attribution.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a href="https://github.com/raj-rangani/kiasi/compare/v0.6.0...v0.7.0"&gt;Full changelog&lt;/a&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Kiasi 0.6.0</title>
    <id>https://raj-rangani.github.io/kiasi/releases/#v0.6.0</id>
    <link href="https://raj-rangani.github.io/kiasi/releases/#v0.6.0" rel="alternate" />
    <updated>2026-10-07T09:27:32Z</updated>
    <content type="html">&lt;p&gt;Rule outcomes on the dashboard, a holdout experiment, and a ready subagent brief when kiasi says delegate. Full list in the &lt;a href="https://github.com/raj-rangani/kiasi/blob/main/CHANGELOG.md#060---2026-10-07"&gt;changelog&lt;/a&gt;.&lt;/p&gt;&lt;h3&gt;Highlights&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Every rule gets an outcome.&lt;/b&gt; The Rules tab shows how often each rule fired, how often Claude followed it, and the measured effect: re-read paid against the estimate for delegated turns, steps after a turn warning, the restored session&amp;#x27;s first context after a handoff notice, and whether a compact nudge or task-switch notice was acted on within three prompts. Each figure carries a note on how it was judged.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Holdout experiment.&lt;/b&gt; Set &lt;code&gt;holdout&lt;/code&gt; in &lt;code&gt;.kiasi.json&lt;/code&gt; or &lt;code&gt;CLAUDE_PLUGIN_OPTION_HOLDOUT&lt;/code&gt; to &lt;code&gt;reread_check&lt;/code&gt;, &lt;code&gt;turn_budget&lt;/code&gt;, &lt;code&gt;context_notices&lt;/code&gt;, &lt;code&gt;output_cap&lt;/code&gt; or &lt;code&gt;sandbox&lt;/code&gt;. Sessions whose id hashes odd run with that rule off, and an Experiment section on the Rules tab compares the two halves on context, re-read and steps per prompt once each side has ten sessions.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Delegating is one call.&lt;/b&gt; When the re-read check says delegate, kiasi writes the task file and hands Claude a ready brief with the path, goal, working directory, step budget and report format. The turn-budget pause and the &amp;quot;hand to a subagent&amp;quot; choice carry the same brief.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Upgrade notes&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;No settings change is needed. The holdout is off until you set it.&lt;/li&gt;&lt;li&gt;Outcome lines appear as data accumulates. On a fresh install the re-read and handoff outcomes stay empty until a delegate-mode check or a task-file restore happens.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Known issues&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;The handoff outcome is judged by a task-file restore in the same project within 60 minutes. A handoff to a different machine or a restore after a longer break counts as ignored.&lt;/li&gt;&lt;li&gt;The compact nudge and task-switch outcomes are open-ended when fewer than three prompts follow the notice.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>Kiasi 0.5.0</title>
    <id>https://raj-rangani.github.io/kiasi/releases/#v0.5.0</id>
    <link href="https://raj-rangani.github.io/kiasi/releases/#v0.5.0" rel="alternate" />
    <updated>2026-10-07T09:02:31Z</updated>
    <content type="html">&lt;h3&gt;Highlights&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;One task file per task.&lt;/b&gt; The pause, the compaction note, the stop note and the new &lt;code&gt;/kiasi:handoff&lt;/code&gt; skill all write it under &lt;code&gt;.kiasi/checkpoints/&lt;/code&gt;, and the next session restores it. &lt;code&gt;/clear&lt;/code&gt; no longer loses the task.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Context notices.&lt;/b&gt; At 150k tokens Kiasi says &amp;quot;run &lt;code&gt;/kiasi:handoff&lt;/code&gt;, then &lt;code&gt;/clear&lt;/code&gt;&amp;quot; and names the floor the session would restart from. On return after the cache has gone cold with a large context, it says the next prompt rewrites all of it. A task-switch notice fires once when a prompt after a break shares few words with the task file&amp;#x27;s goal.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Smaller floor.&lt;/b&gt; The SessionStart block is 7 lines instead of about 40; &lt;code&gt;/kiasi:rules&lt;/code&gt; loads the full rules on demand. The compaction pruner keeps the last three exchanges verbatim and reduces older ones to prompt, outcome and archive pointer.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Context meter in the status line.&lt;/b&gt; &lt;code&gt;ctx 118k (floor 46k) · turn 12/60 1.4M · cache warm 52m · idle 3m&lt;/code&gt;, amber at 150k and red at 200k.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Dashboard.&lt;/b&gt; Median and p90 context beside the mean, a &amp;quot;past 200k&amp;quot; flag with the auto-compact window recommendation, a per-project floor audit, a per-day context chart, cache-gap and model-switch rewrites, and an effort comparison that controls for difficulty and recommends a lower effort only when output per step, extra tokens and steps per prompt all clear named thresholds.&lt;/li&gt;&lt;li&gt;Synthetic transcript entries are classified and the replay cause is confirmed from every transcript on this machine: 99.8% are history replayed on resume, with zero usage.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Bug fixes&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;The turn-budget warning, pause and resume name the task file instead of Claude&amp;#x27;s own checklist, and writing it is allowed at the pause.&lt;/li&gt;&lt;li&gt;The shared temp checklist folder is per user and private. Cleanup removes stale pause records after 14 days. A failed &lt;code&gt;run&lt;/code&gt; no longer counts as saved tokens.&lt;/li&gt;&lt;li&gt;Session state and report writes retry briefly on Windows when a file is held open. Sandbox outputs from a session with no id are cleaned up.&lt;/li&gt;&lt;li&gt;A file a subagent read, or a Kiasi search returned, counts as read back. Resumed sessions are marked &amp;quot;earlier part not shown&amp;quot;.&lt;/li&gt;&lt;li&gt;Compaction no longer leaves a long result uncut because its last line starts with &lt;code&gt;[kiasi &lt;/code&gt;; every saved-file pointer in a dropped part is kept, up to five. Searching for a bare &lt;code&gt;--&lt;/code&gt; works.&lt;/li&gt;&lt;li&gt;Report tests use local days and pass in four time zones at both midnights.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Upgrade notes&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;The status line script changed (context meter). It is a copy under the data folder, so run &lt;code&gt;/kiasi:limits setup&lt;/code&gt; again after updating to get the meter.&lt;/li&gt;&lt;li&gt;Two Claude Code settings are worth setting: &lt;code&gt;CLAUDE_CODE_AUTO_COMPACT_WINDOW=200000&lt;/code&gt; and, on an API key, &lt;code&gt;CLAUDE_CODE_PROMPT_CACHE_TTL=1h&lt;/code&gt;. The README&amp;#x27;s Settings section explains both.&lt;/li&gt;&lt;li&gt;The stored daily history is recounted once on the first dashboard build after updating.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Known issues&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;The pruner&amp;#x27;s 200k-character reduction gate was measured at one in twenty compactions below it and kept; it will be re-measured after a month of data.&lt;/li&gt;&lt;li&gt;The effort recommendation is based on one week of prompts; a second week may change it.&lt;/li&gt;&lt;li&gt;Windows has still not been run on a real machine.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>Kiasi 0.4.2</title>
    <id>https://raj-rangani.github.io/kiasi/releases/#v0.4.2</id>
    <link href="https://raj-rangani.github.io/kiasi/releases/#v0.4.2" rel="alternate" />
    <updated>2026-10-07T05:31:57Z</updated>
    <content type="html">&lt;p&gt;Bug-fix release. Closes the four known issues listed on 0.4.1. Full list in &lt;a href="https://github.com/raj-rangani/kiasi/blob/main/CHANGELOG.md#042---2026-10-07"&gt;CHANGELOG.md&lt;/a&gt;.&lt;/p&gt;&lt;h3&gt;Highlights&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;A paused turn is never ended by one response.&lt;/b&gt; Parallel refused calls count as one refusal in every mode, matched by the response they belong to, so the three-refusal backstop only trips on three separate responses.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Subagent reports survive compaction in every shape.&lt;/b&gt; A hand-back that arrives as an agent message or inside a system notice is kept whole or archived, like a task notification.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Problems are visible.&lt;/b&gt; The Rules tab shows a Problems block when a pause could not be saved, a lock timed out or a &lt;code&gt;.kiasi.json&lt;/code&gt; value was ignored.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Bug fixes&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Refusals at a pause count once per response, by the response id from the transcript or by a 3-second window when there is none. Before the first tool batch of a session, three parallel refused calls used to end the turn.&lt;/li&gt;&lt;li&gt;The backstop no longer depends on a tool batch arriving, so a response whose every call is refused is counted too.&lt;/li&gt;&lt;li&gt;Agent-message hand-backs and task notifications wrapped in a system notice are detected and kept or archived. With no archive available, the head is kept and a final line says how many characters of the report were trimmed, instead of a silent cut to 200 characters.&lt;/li&gt;&lt;li&gt;Error events are grouped by kind with a plain explanation, count, last seen and last message, in a block that is hidden when there are none.&lt;/li&gt;&lt;li&gt;The status line locks its limits files, so two sessions no longer log the same reading twice.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Upgrade notes&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;**Run &lt;code&gt;/kiasi:limits setup&lt;/code&gt; again** if you use the status line. The script is a copy under the data folder and this release changed it.&lt;/li&gt;&lt;li&gt;Behaviour change: in batched mode the third refused response ends the turn when its calls are refused, before the batch arrives. It used to wait for the batch.&lt;/li&gt;&lt;li&gt;Update with &lt;code&gt;/plugin marketplace update kiasi&lt;/code&gt; or &lt;code&gt;claude plugin update kiasi@kiasi&lt;/code&gt;, then restart Claude Code.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Known issues&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;The Problems block was tested on the report side only, not rendered in a browser before release.&lt;/li&gt;&lt;li&gt;Windows support as a whole is still untested on a real Windows machine.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a href="https://github.com/raj-rangani/kiasi/compare/v0.4.1...v0.4.2"&gt;Full changelog&lt;/a&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Kiasi 0.4.1</title>
    <id>https://raj-rangani.github.io/kiasi/releases/#v0.4.1</id>
    <link href="https://raj-rangani.github.io/kiasi/releases/#v0.4.1" rel="alternate" />
    <updated>2026-10-07T05:24:31Z</updated>
    <content type="html">&lt;p&gt;Bug-fix release. Three audit rounds swept the plugin for the bug classes fixed in 0.4.0 and reviewed the fixes. Full list in &lt;a href="https://github.com/raj-rangani/kiasi/blob/main/CHANGELOG.md#041---2026-10-07"&gt;CHANGELOG.md&lt;/a&gt;.&lt;/p&gt;&lt;h3&gt;Highlights&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;A paused turn keeps its work.&lt;/b&gt; The checklist written at the warning is the one a stop, a subagent brief or a later &amp;quot;continue&amp;quot; points at, and Claude can now read and edit it at the pause instead of being refused.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Pauses are per session.&lt;/b&gt; Two sessions in one project no longer overwrite each other&amp;#x27;s pause record, a pause resumes once, and cleanup leaves alone any state a live pause still protects.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Subagent reports survive compaction.&lt;/b&gt; A hand-back report is kept whole or archived with a pointer, never cut to a 200-character stub.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Dashboard days are local days.&lt;/b&gt; Every figure now uses your local calendar day, with a one-time recount of stored history.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Bug fixes&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Three parallel refused calls in one response count as one refused response, not three.&lt;/li&gt;&lt;li&gt;A pause that cannot be written to disk logs an error and still trips, instead of silently never pausing.&lt;/li&gt;&lt;li&gt;Subagent turn entries from older prompts are dropped from session state instead of growing forever.&lt;/li&gt;&lt;li&gt;The checklist fallback folder moved out of &lt;code&gt;~/.claude&lt;/code&gt;, which Claude Code refuses to write.&lt;/li&gt;&lt;li&gt;Session state, daily history, savings and sync status are written to a temp file and renamed, with a lock around the history merge. A rebuild overlapping a Sync click no longer resets history to one day.&lt;/li&gt;&lt;li&gt;A bad value in a project &lt;code&gt;.kiasi.json&lt;/code&gt; falls back for that key only, instead of silently turning every hook off.&lt;/li&gt;&lt;li&gt;The pruner recognises every Kiasi digest marker, so an output the caps already cut is not cut again and its saved-file pointer survives.&lt;/li&gt;&lt;li&gt;Nested tool inputs are shrunk too, and compaction archives are named per agent, so they no longer overwrite each other within a second.&lt;/li&gt;&lt;li&gt;Quoted search phrases match as phrases, and words starting with &lt;code&gt;-&lt;/code&gt; work.&lt;/li&gt;&lt;li&gt;A failing command in the run tool is flagged as an error. The quiet-flag rewrite leaves quoted text alone.&lt;/li&gt;&lt;li&gt;A session resumed today no longer brings its old steps and bill into today&amp;#x27;s totals.&lt;/li&gt;&lt;li&gt;Delegation is credited only when a subagent actually started; a retried skip and a read-back cap save nothing.&lt;/li&gt;&lt;li&gt;Figures with too little data show a dash instead of &amp;quot;0 k&amp;quot; or &amp;quot;−100%&amp;quot;.&lt;/li&gt;&lt;li&gt;The build survives a transcript deleted mid-read or a bad line, and marks stale or stuck rebuilds as such.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Upgrade notes&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;**Run &lt;code&gt;/kiasi:limits setup&lt;/code&gt; again** if you use the status line. The script is a copy under the data folder and this release changed it.&lt;/li&gt;&lt;li&gt;The history recount runs once on the first dashboard build. A stored day whose transcripts are already gone loses its row; on a 28-day test history that was one day with 2 steps.&lt;/li&gt;&lt;li&gt;Update with &lt;code&gt;/plugin marketplace update kiasi&lt;/code&gt; or &lt;code&gt;claude plugin update kiasi@kiasi&lt;/code&gt;, then restart Claude Code.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Known issues&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Before the first tool batch of a session is seen, three parallel refused calls still end a paused turn.&lt;/li&gt;&lt;li&gt;Hand-back reports delivered as an agent-message block, rather than a task notification, are still cut at compaction.&lt;/li&gt;&lt;li&gt;Error events (pause record, lock timeout, bad setting) are logged but not yet shown on the dashboard.&lt;/li&gt;&lt;li&gt;No Windows file lock for the status line&amp;#x27;s limits files.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a href="https://github.com/raj-rangani/kiasi/compare/v0.4.0...v0.4.1"&gt;Full changelog&lt;/a&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Kiasi 0.4.0</title>
    <id>https://raj-rangani.github.io/kiasi/releases/#v0.4.0</id>
    <link href="https://raj-rangani.github.io/kiasi/releases/#v0.4.0" rel="alternate" />
    <updated>2026-10-07T04:34:38Z</updated>
    <content type="html">&lt;p&gt;Install or update: &lt;code&gt;/plugin marketplace update kiasi&lt;/code&gt;, or &lt;code&gt;claude plugin update kiasi@kiasi&lt;/code&gt;, then restart Claude Code.&lt;/p&gt;&lt;h3&gt;Changes&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;The dashboard counts what the rules did over whole days. Rule events were counted over the last 168 hours while the token bill was counted by calendar day, so the first day of a period showed its bill but none, or only part, of what the rules did that day.&lt;/li&gt;&lt;li&gt;The same question is put at the warning, before the pause: Claude follows the warning and so seldom reaches the pause, and used to choose between ending the turn and a subagent itself. Continue there renews the budget; stop or a subagent pauses the turn at that point, so replying continue later resumes it.&lt;/li&gt;&lt;li&gt;At a pause Claude now asks how to go on, where it used to only end the turn: continue here with a fresh budget, hand the rest to a subagent, or stop. The checklist is written first, and Kiasi reads the answer. Continue renews the budget in place; the other two leave the turn paused, so replying continue later still resumes it. The question is asked in the terminal, the VS Code extension and the desktop app; a headless run and a subagent are paused as before. &lt;code&gt;pause_question&lt;/code&gt; (auto, always or off; also in &lt;code&gt;.kiasi.json&lt;/code&gt;) sets it.&lt;/li&gt;&lt;li&gt;A desktop notification when Kiasi pauses a turn, and when it ends one after refused calls, in the VS Code extension and the desktop app. Their chat shows the pause as one grey line, which is easy to miss in a background window. It uses &lt;code&gt;notify-send&lt;/code&gt; on Linux, &lt;code&gt;osascript&lt;/code&gt; on macOS and a PowerShell toast on Windows; the terminal keeps its own notification and bell. The new &lt;code&gt;pause_notification&lt;/code&gt; setting (auto, always, off) says where it shows.&lt;/li&gt;&lt;li&gt;The turn budget counts steps, not tool calls. The tool calls Claude makes in one response are one step: the next request re-reads the context once for all of them. Each call used to count on its own and add the whole context to the re-read total, so a turn that worked in parallel reached its budget early. Kiasi counts at Claude Code&amp;#x27;s &lt;code&gt;PostToolBatch&lt;/code&gt; hook, which runs once per response. Until the first one arrives in a session the calls count one by one, and that batch gives the extra counts back. A batch of calls that were all refused at the pause is not a step. Subagent budgets count the same way. The notices, the session rules and the subagent briefs say &amp;quot;steps&amp;quot; and say that parallel calls count once.&lt;/li&gt;&lt;li&gt;Dashboard: a delegation saving is credited only when an Agent call followed the instruction before the next prompt. It was credited whenever the instruction was shown, whether or not Claude delegated. An instruction that was not followed is listed with the checks shown, as &amp;quot;delegate, no Agent call&amp;quot;.&lt;/li&gt;&lt;li&gt;Dashboard: &amp;quot;Avoidable misses&amp;quot; no longer counts a cache that expired while the session was idle; those misses are shown beside it. The extra cost still covers them, since they were paid for.&lt;/li&gt;&lt;li&gt;Dashboard: the &amp;quot;each step costs N× less than before&amp;quot; headline waits for 300 steps both before and after the install, and until then says how many there are. It used to show a factor after a few dozen steps.&lt;/li&gt;&lt;li&gt;When the dashboard&amp;#x27;s sync reaches its timeout, the report scripts it started are stopped with it. Only the sync itself was stopped, so a hung report script kept running.&lt;/li&gt;&lt;li&gt;When Claude keeps calling tools after a pause and Kiasi ends the turn, the developer is told so in a system message: &amp;quot;Kiasi ended this turn: Claude kept calling tools after the pause&amp;quot;, with both ways to resume. VS Code does not show a hook&amp;#x27;s stop reason, so the turn ended there after three refused calls with no explanation.&lt;/li&gt;&lt;li&gt;On Windows, a dashboard that an older version left running is replaced at the next session start. It had been started with no console, so it kept opening an empty window at every 30-minute rebuild until it was stopped by hand. Like the rest of the Windows support, this is untested on a real Windows machine.&lt;/li&gt;&lt;li&gt;&lt;code&gt;tests/e2e_parallel_compact.py&lt;/code&gt; resumes the session once more after the compaction and checks the batch again.&lt;/li&gt;&lt;li&gt;Turn checklists are written to &lt;code&gt;.kiasi/checkpoints/&lt;/code&gt; in the project, a folder that git ignores. Claude Code refuses Claude&amp;#x27;s writes anywhere under &lt;code&gt;~/.claude&lt;/code&gt; as edits to a sensitive file, so a checklist in Kiasi&amp;#x27;s data folder was never saved in headless runs, and sessions that accept edits got a permission prompt at the pause. A session without a writable project folder still uses the data folder. Search and the state restored after compaction look in both. The daily cleanup moves idle project checklists to trash like the ones in the data folder, finding their folders through the turn events, which now name the checklist path; a restore puts them back in their project, and the storage tab counts them.&lt;/li&gt;&lt;li&gt;A pause in a turn resumed with &amp;quot;continue&amp;quot; keeps the task and edited files of the pause it resumed, so resuming it again without a checklist still has them. A new task prompt drops them.&lt;/li&gt;&lt;li&gt;The turn budget has a mode, &lt;code&gt;turn_budget_mode&lt;/code&gt;: &lt;code&gt;pause&lt;/code&gt; (the default) pauses the turn as before, &lt;code&gt;warn&lt;/code&gt; only warns, before and at the budget, and refuses nothing, and &lt;code&gt;off&lt;/code&gt; only counts calls. Subagent budgets, the session rules, subagent briefs and the status line follow it. The token budget is a setting too (&lt;code&gt;turn_token_budget&lt;/code&gt;, 8M by default), and &lt;code&gt;.kiasi.json&lt;/code&gt; can also set &lt;code&gt;turn_warn_tokens&lt;/code&gt;. The session rules now state the configured budgets instead of the defaults.&lt;/li&gt;&lt;li&gt;Replying &amp;quot;continue&amp;quot; after a pause resumes it. Kiasi adds the saved checklist (up to 2,000 characters) to that prompt, asks Claude to check &lt;code&gt;git status&lt;/code&gt; first and to keep each item open until it is verified, and shows &amp;quot;Kiasi: resuming from &amp;lt;path&amp;gt;&amp;quot;. After &lt;code&gt;/clear&lt;/code&gt;, or in a new session of the same project, the session start says that work is waiting, and the first &amp;quot;continue&amp;quot; there resumes it the same way. Any other first prompt is only told where the checklist is. If Claude never wrote the checklist, the resume starts from the paused turn&amp;#x27;s task and the files it edited. The pause notice now says to reply &amp;quot;continue&amp;quot; after &lt;code&gt;/clear&lt;/code&gt; as well.&lt;/li&gt;&lt;li&gt;The turn budget warning now comes 10 calls before the pause (at 50 of 60) or at 80% of the token limit, instead of at 30 calls or half the tokens, so a turn keeps its working room. It says about how many calls are left, counting the tokens a wide context re-reads, and asks Claude to finish the item in progress and keep the checklist current. A subagent is warned 10 calls before its own limit (30 of 40). &lt;code&gt;turn_warn_steps&lt;/code&gt; in &lt;code&gt;.kiasi.json&lt;/code&gt; still sets the warning outright.&lt;/li&gt;&lt;li&gt;When a paused turn ends and Claude&amp;#x27;s last message does not name the checklist, the Stop hook asks Claude once to close with the pause line. Hook messages may not show in the desktop app or VS Code, but Claude&amp;#x27;s reply does. The reminder is hook context, not a Stop block, so it never shows as an error, and it is skipped when the refused calls have already ended the turn.&lt;/li&gt;&lt;li&gt;A turn that reaches its budget is paused instead of blocked. The developer gets a notice with the cause, where the remaining work is saved and both ways to resume (reply &amp;quot;continue&amp;quot;, or &lt;code&gt;/clear&lt;/code&gt; and resume from the checklist), plus a desktop notification and a bell; the warning at 30 calls is shown to the developer too. Every call except Write and Agent is refused before it runs, and the third refused call ends the turn with the same notice. A paused subagent has its calls refused as well, but never ends the developer&amp;#x27;s turn. Before, the stop was a PostToolUse block: the call had already run, nothing was stopped, and the terminal showed a hook error, so the chat looked dead.&lt;/li&gt;&lt;li&gt;A subagent is held to its own budget of 40 tool calls, the figure its brief already gave it: it is warned at 20 and stopped at 40. Nothing enforced that figure, and since subagents got their own count they ran to the main turn&amp;#x27;s 60. At the stop it is told to write its checklist and reply to its caller, since a subagent cannot start another subagent. The new &lt;code&gt;subagent_call_budget&lt;/code&gt; option sets the figure; &lt;code&gt;turn_call_budget&lt;/code&gt; no longer changes it. The dashboard leaves subagent warnings and stops out of the turn-budget figures, and the budget report counts them on their own lines.&lt;/li&gt;&lt;li&gt;A session&amp;#x27;s hooks no longer overwrite each other&amp;#x27;s turn counts. Each hook loads the session&amp;#x27;s state, changes it and saves it, and parallel tool calls and subagents run their hooks at the same time, so one save could drop the calls another hook had just counted, and the turn budget fired late or not at all. A hook now holds the session&amp;#x27;s lock file, &lt;code&gt;sessions/&amp;lt;session id&amp;gt;.lock&lt;/code&gt;, while it runs, on Windows too. It waits at most 3 seconds for the lock, then goes ahead without it, so a hook never hangs a tool call. Cleanup removes the lock file with the rest of the session&amp;#x27;s state.&lt;/li&gt;&lt;li&gt;On Windows, the dashboard counts saved outputs, pastes and checklists that were read back. It looked for &lt;code&gt;outputs/&lt;/code&gt;, &lt;code&gt;pastes/&lt;/code&gt; and &lt;code&gt;checkpoints/&lt;/code&gt; with a forward slash, which a Windows path never contains, so Recall showed none read back and marked every row &amp;quot;could be tighter&amp;quot;, and Storage counted every saved file as unread.&lt;/li&gt;&lt;li&gt;The before-and-after table shows &amp;quot;–&amp;quot; for re-read tokens per day until a full day has passed since the install. It showed 0 and −100% on the first day after it.&lt;/li&gt;&lt;li&gt;A subagent&amp;#x27;s tool calls count toward its own turn budget, not the turn that started it. Claude Code sends a subagent&amp;#x27;s calls with the main session&amp;#x27;s transcript path, so they were added to the parent turn&amp;#x27;s call count and measured at the parent&amp;#x27;s context size: parallel subagents used up the parent&amp;#x27;s budget, and once a turn was stopped the general-purpose subagent its stop message hands the checklist to was told the budget was exhausted within its first five calls. Turns are now keyed by &lt;code&gt;agent_id&lt;/code&gt;, a subagent&amp;#x27;s re-read size comes from its own transcript, and a new prompt starts every count afresh.&lt;/li&gt;&lt;li&gt;On Windows, the dashboard no longer opens an empty terminal window every 30 minutes. The server was started with no console at all (&lt;code&gt;DETACHED_PROCESS&lt;/code&gt;), so each 30-minute rebuild, which starts &lt;code&gt;python sync.py&lt;/code&gt;, made Windows give it a new visible console window, titled with the Python path and empty because the output goes to the log. Detached processes now get a hidden console that everything they start inherits. A dashboard that is already running keeps opening windows until it is stopped once.&lt;/li&gt;&lt;li&gt;The sandbox tools no longer fail at their longest timeout. Claude Code&amp;#x27;s &lt;code&gt;process.run&lt;/code&gt; takes at most 600000 ms, and &lt;code&gt;run&lt;/code&gt;, &lt;code&gt;distill&lt;/code&gt; and &lt;code&gt;fetch&lt;/code&gt; asked for their timeout plus 10 seconds of headroom, so &lt;code&gt;timeout_s: 600&lt;/code&gt; asked for 610000 ms: the hook threw and the call failed with &amp;quot;no tool.call hook answered this call&amp;quot;. The longest timeout is now 590 seconds, derived from the host limit (&lt;code&gt;PROCESS_RUN_MAX_TIMEOUT_MS&lt;/code&gt;), and the tool schemas advertise it.&lt;/li&gt;&lt;li&gt;Compaction shortens a text that only mentions its marker. A text was left whole whenever it contained &lt;code&gt;[kiasi pruned&lt;/code&gt; anywhere, so a large tool result showing Kiasi&amp;#x27;s own source, its tests or a transcript was never shortened at any compaction. Only a text whose last line is a marker, which is how an earlier compaction leaves it, is now kept as it is.&lt;/li&gt;&lt;li&gt;A second compaction keeps the sizes the first one wrote. The pruner replaces the content of older Write, Edit and NotebookEdit calls with its size, such as &lt;code&gt;[9000 chars]&lt;/code&gt;, and the next compaction measured that marker as if it were the content, so &lt;code&gt;[9000 chars]&lt;/code&gt; became &lt;code&gt;[12 chars]&lt;/code&gt;. A value that is already a size marker is now kept as it is.&lt;/li&gt;&lt;li&gt;Every turn checklist goes to a new file. Claude Code refuses to overwrite a file outside the working directory without a read record, and a hook compaction clears those records and restores none. After a compaction, a stop or reminder that named the turn&amp;#x27;s existing checklist got &amp;quot;File has not been read yet&amp;quot;, and the stop rules out the Read that would get past it. &lt;code&gt;checkpoint_path&lt;/code&gt; now names the next free &lt;code&gt;&amp;lt;session&amp;gt;-&amp;lt;turn&amp;gt;-&amp;lt;n&amp;gt;.md&lt;/code&gt; once the turn&amp;#x27;s file exists, and cleanup matches the numbered names.&lt;/li&gt;&lt;li&gt;Compaction keeps every result of parallel tool calls. Claude Code writes a parallel batch as one assistant entry per call, sharing one message id, and the pruner rebuilt each entry as its own message with a fresh id, so the batch loaded as separate messages and every call but the last came back as &lt;code&gt;[Tool result missing due to internal error]&lt;/code&gt;; on the maintainer&amp;#x27;s machine that hit 46 of 61 compactions in 7 days and lost 488 results, mostly web searches, Bash and fetches. &lt;code&gt;hooks/prune.js&lt;/code&gt; now rebuilds each batch as one message ahead of all its results, also when a result was written between two of its calls, and the recent messages it keeps unchanged never start inside a batch. New tests in &lt;code&gt;hooks/compact.test.ts&lt;/code&gt; cover the layouts Claude Code writes, and &lt;code&gt;tests/e2e_parallel_compact.py&lt;/code&gt; replays the case against a real session (about eight Haiku calls).&lt;/li&gt;&lt;li&gt;Landing page: a new Fig. 04 &amp;quot;the everyday&amp;quot; section between the rules and the dashboard, with a status line mock (ctx, turn, 5h, wk with reset time and pace, kiasi −kept) and a legend, then six cards for the status line, run, distill, fetch and search, the login-time dashboard autostart and cleanup; later figures renumbered. Section headings now put the figure label across both columns and top-align the lede with the heading. The limit cap line at the end of the simulator rails is gone.&lt;/li&gt;&lt;li&gt;Windows support (untested on a real Windows machine): every hook command runs through &lt;code&gt;scripts/run.sh&lt;/code&gt;, which picks &lt;code&gt;py -3&lt;/code&gt;, &lt;code&gt;python&lt;/code&gt; or &lt;code&gt;python3&lt;/code&gt;, so the hard-coded &lt;code&gt;python3&lt;/code&gt; is gone from hooks.json, the skills and the status line command (which now records the interpreter that ran setup); the function hooks try &lt;code&gt;python3&lt;/code&gt;, &lt;code&gt;python&lt;/code&gt; and &lt;code&gt;py -3&lt;/code&gt; in turn; cleanup takes its lock with &lt;code&gt;msvcrt&lt;/code&gt; where &lt;code&gt;fcntl&lt;/code&gt; is missing and bails out from a timer thread where &lt;code&gt;SIGALRM&lt;/code&gt; is missing; the dashboard and cleanup detach with &lt;code&gt;DETACHED_PROCESS&lt;/code&gt; on Windows instead of &lt;code&gt;start_new_session&lt;/code&gt;, which Windows ignored, so they no longer die with the session that started them.&lt;/li&gt;&lt;li&gt;&lt;code&gt;/kiasi:dashboard autostart on|off|status&lt;/code&gt;: the dashboard can run from login with no Claude Code session at all. &lt;code&gt;on&lt;/code&gt; writes a small launcher to &lt;code&gt;~/.claude/kiasi&lt;/code&gt; and registers it with the system&amp;#x27;s login starter: a systemd user service on Linux (XDG autostart where there is no user systemd), a LaunchAgent on macOS, a script in the Startup folder on Windows. The launcher reads &lt;code&gt;plugin-root&lt;/code&gt; and &lt;code&gt;data-dir&lt;/code&gt; from &lt;code&gt;~/.claude/kiasi&lt;/code&gt;, both recorded at every session start, so it survives plugin updates. The session-start hook keeps starting the dashboard when nothing answers, so a session alone is still enough.&lt;/li&gt;&lt;li&gt;Landing page: everything below the hero re-imagined as six figures: an interactive week-on-your-plan simulator (light/typical/heavy, two rails racing to the limit), one tool output collapsing live from 38k to 2.1k chars, a rules marquee with six hook cards, a tilting dashboard screenshot, a three-step install beside a terminal that types itself with a copy button, a trust row and a closing command box. No external requests. The install terminal has a Terminal tab and a VS Code tab: the VS Code extension has no &lt;code&gt;/plugin&lt;/code&gt; command, so that tab carries the extension&amp;#x27;s &lt;code&gt;vscode://anthropic.claude-code/install-plugin&lt;/code&gt; link as a button, the &lt;code&gt;/plugins&lt;/code&gt; dialog path, and a copy-link button. README quick start gains the same link and the &lt;code&gt;claude plugin&lt;/code&gt; shell commands.&lt;/li&gt;&lt;li&gt;README rewritten to match the landing page: small logo, one number-led paragraph, key features, quick start, how it works, dashboard, privacy, settings, requirements. Landing page cost section gained presets, a per-step strip for each scenario, animated counts and a savings badge; the install section is a timeline that lights up on scroll with timed steps, an animated copy tick and a what-happens-next row.&lt;/li&gt;&lt;li&gt;Landing page (docs/index.html) rebuilt around one story: hero with an animated session demo, a re-read cost calculator, six leaks and rules, dashboard proof, three-step install, privacy, and a collapsed reference. Same palette, no external requests. Dashboard screenshot refreshed.&lt;/li&gt;&lt;li&gt;Per-day history: budget.py merges every build into &lt;code&gt;history.json&lt;/code&gt; in the data dir, so days outlive the report window and Claude Code&amp;#x27;s transcript retention; the Overview before-and-after block reads it and no longer disappears a week after install. Report window &lt;code&gt;BUDGET_DAYS&lt;/code&gt; raised from 7 to 30 days and used by the dashboard&amp;#x27;s rebuild too.&lt;/li&gt;&lt;li&gt;Restructured the plugin layout, no behaviour change: &lt;code&gt;scripts/kiasi.py&lt;/code&gt; is now a thin hook dispatcher over the &lt;code&gt;scripts/core/&lt;/code&gt; package (constants, events, transcript, caps, prompt, turn, reads, session, launch); the report builders moved to &lt;code&gt;scripts/reports/&lt;/code&gt; (&lt;code&gt;budget.py&lt;/code&gt;, &lt;code&gt;lens.py&lt;/code&gt;, &lt;code&gt;sync.py&lt;/code&gt;); &lt;code&gt;limits.py&lt;/code&gt; is &lt;code&gt;statusline_install.py&lt;/code&gt; and &lt;code&gt;usage_limits.py&lt;/code&gt; is &lt;code&gt;limits_data.py&lt;/code&gt;; the slash commands became skills under &lt;code&gt;skills/&lt;/code&gt; (still &lt;code&gt;/kiasi:dashboard&lt;/code&gt;, &lt;code&gt;/kiasi:sync&lt;/code&gt;, &lt;code&gt;/kiasi:limits&lt;/code&gt;); the five redirect stubs in &lt;code&gt;dashboard/&lt;/code&gt; are gone; &lt;code&gt;SHIPPING.md&lt;/code&gt; moved to &lt;code&gt;docs/dev-notes.md&lt;/code&gt;; &lt;code&gt;tests/test_kiasi.py&lt;/code&gt; is split into one test file per module with a shared &lt;code&gt;tests/helpers.py&lt;/code&gt;; &lt;code&gt;scripts/README.md&lt;/code&gt; describes the scripts.&lt;/li&gt;&lt;li&gt;Dashboard starts itself: the SessionStart hook probes &lt;code&gt;127.0.0.1:8787&lt;/code&gt; (and the port recorded in the data directory&amp;#x27;s &lt;code&gt;dashboard.json&lt;/code&gt;) and, when no Kiasi dashboard answers, starts &lt;code&gt;dashboard.py&lt;/code&gt; detached in its own session, so it outlives the Claude Code process and keeps the 30-minute rebuild running. Before this, nothing in the plugin started the server: &lt;code&gt;/kiasi:dashboard&lt;/code&gt; ran it as a background shell that died with the session, so on any machine without a hand-made systemd unit the pages went dark after the session ended and the auto-rebuild never fired. &lt;code&gt;/kiasi:dashboard&lt;/code&gt; now runs &lt;code&gt;dashboard.py --ensure&lt;/code&gt; (same probe, returns at once with the URL). &lt;code&gt;KIASI_DASHBOARD=off&lt;/code&gt; disables the autostart. The server also rebuilds the reports on start when they are missing or older than 30 minutes, records pid and port in &lt;code&gt;dashboard.json&lt;/code&gt;, logs only failed requests to &lt;code&gt;dashboard.log&lt;/code&gt; (truncated past 200 KB), and sends a &lt;code&gt;Server: kiasi-dashboard&lt;/code&gt; header the probe recognises. The dashboard status line now says &amp;quot;last rebuild failed&amp;quot; with the error from &lt;code&gt;sync.json&lt;/code&gt; instead of silently showing an old build time, and two stale error texts in &lt;code&gt;sync.js&lt;/code&gt; that still named &lt;code&gt;sync.php&lt;/code&gt; are gone.&lt;/li&gt;&lt;li&gt;Sandbox routing: while the sandbox tools are registered (&lt;code&gt;CLAUDE_CODE_ENABLE_FUNCTION_HOOKS=1&lt;/code&gt;), a PreToolUse hook on Bash and WebFetch refuses a raw call once and names the sandbox call to make instead — &lt;code&gt;mcp__kiasi__run&lt;/code&gt; for a command whose output would only be scanned (tests, builds, installs, lint, curl, git log, docker logs, long tails; a command that already limits its output with &lt;code&gt;| head&lt;/code&gt;, &lt;code&gt;-5&lt;/code&gt;, &lt;code&gt;--oneline&lt;/code&gt; or a redirect stays raw), &lt;code&gt;mcp__kiasi__fetch&lt;/code&gt; for a page. The identical call repeated goes through, like the big-file Read nudge. Events &lt;code&gt;routed&lt;/code&gt; and &lt;code&gt;route_retry&lt;/code&gt; show in the dashboard under a new Sandbox routing rule, so compliance is visible. Context-mode reports this blocking step as the difference between prompting alone (~60% compliance) and routing (~98%); four days of this install&amp;#x27;s logs showed the sandbox tools used zero times with prompting alone.&lt;/li&gt;&lt;li&gt;New sandbox tool &lt;code&gt;mcp__kiasi__fetch&lt;/code&gt;: downloads a URL, strips HTML to text, saves the whole page under &lt;code&gt;outputs/&lt;/code&gt; (searchable, cleaned up like other saved outputs) and returns only the first 3,000 chars plus the lines matching the &lt;code&gt;find&lt;/code&gt; words, with line numbers. Its saving is logged as a cap like the other sandbox tools.&lt;/li&gt;&lt;li&gt;Dashboard empty states: a tab with nothing to show no longer renders its headings over blank charts. Before the first report exists each tab explains what it will show and offers a &amp;quot;Build the report&amp;quot; button that runs the sync; a report with no session in range says so and offers &amp;quot;Rebuild now&amp;quot;; the plan-limits strip stays visible on the Budget tab. Copy lives in &lt;code&gt;EMPTY_STATES&lt;/code&gt; in &lt;code&gt;lens-constants.js&lt;/code&gt;, the renderer in &lt;code&gt;lens-common.js&lt;/code&gt;. The per-section &amp;quot;No … in range yet&amp;quot; lines share one wording.&lt;/li&gt;&lt;li&gt;The Overview tab is rebuilt around what was measured, in three sections. &amp;quot;What you paid&amp;quot;: four figures, each with a line per day (re-read tokens paid, re-read per prompt, first-request context, cache hit rate), and the bill per day. &amp;quot;Before and after Kiasi&amp;quot;: a bar per day over the whole history with the switch-on day marked, and the comparison table; the &amp;quot;N× less&amp;quot; headline is gone, because the two periods are different work and nothing was held constant. &amp;quot;What Kiasi did&amp;quot;: counts from the log. The avoided estimate is no longer on the Overview. It multiplies every cut by all later steps of its session, as if no compaction came in between, and added up to several times the measured bill; the per-day chart no longer stacks it on the bill, and the rules show how often they fired and the tokens they cut. The rows on context and steps over the warning size say they are main-session figures. The report&amp;#x27;s &lt;code&gt;since&lt;/code&gt; block gains &lt;code&gt;series&lt;/code&gt;, one point per history day, and &lt;code&gt;steps_per_day&lt;/code&gt;. The detail of Cache and Recall moved to the Rules tab, and the mean steps after a pause is on the Turn budget rule too. Amber no longer marks a figure that got worse; that is red. The Rules tab lists each rule as one row: fired, tokens cut, a line of its fires per day with the count under each day, and the breakdown; the per-rule daily graphs moved there from the Overview. The steps chart there names the band its note and legend count (60+), where the note said 50+. The Overview now uses one colour per measure in both themes: re-read tokens blue, tokens per prompt violet, first-request context teal, cache hit rate orange, steps per day pink; the days before Kiasi stay grey, and green, red and amber keep their meaning of better, worse and warning. The Rules tab draws steps per prompt as paired bars, each band&amp;#x27;s share of the prompts next to its share of the re-read tokens on one scale, with the cost of one prompt of that length. Fixed: the reports counted the messages a pruned compaction writes back into the transcript as new steps and prompts, which inflated steps, prompts and the 60+ band and lowered the mean context per step; those zero-usage entries are no longer steps, a prompt is counted once per prompt id, and prompts out of time order no longer give a negative step count. The stored daily history is recounted once after the upgrade, from the transcripts that still exist; a day whose transcripts are gone keeps its stored row. The summary of a built-in compaction is no longer a prompt, and a tool output replayed by a pruned compaction is listed once among the big outputs.&lt;/li&gt;&lt;/ul&gt;</content>
  </entry>
</feed>
