stratless 0.2.4 — the cost release: synthesis when due + an honest meter
Changed
updatenow rebuilds the profile only when it's due — the cost release. The synthesis is the
expensive read (~32 judge calls' worth, measured on real usage); it used to run after every
session, even for a handful of new exchanges. Sessions now accumulate: the profile rebuilds after
25 new judgments (STRATLESS_SYNTH_EVERYoverrides), when it's over a week stale and anything
new arrived, when no profile exists yet, or onstratless update --now. A skipped rebuild
still judges what's new and still guarantees the profile stays loaded — the skip is invisible,
only the cost is missing.- The profile is written by Sonnet, pinned — same deliberate read, ~4–6x cheaper. Synthesis used
to ride whatever your default model is; a frontier default spent ~$0.62 API-equivalent per rebuild
(thinking billed at frontier rates), which was ~80% of everything stratless spent. Sonnet thinks
just as hard about who you are for ~$0.10–0.15.STRATLESS_SYNTH_MODELbrings your default back
if you want it. - The judge now reads the END of a long assistant turn — the part you actually reacted to. Long
turns were cut from the head, so the judge read the opening preamble and then your reaction to a
conclusion it never saw. Measured on real history: 83% of turns were longer than the judge's view.
Already-judged exchanges are not re-read; only the truncated ones re-judge, gradually, in the
background budget. - Reactions that carry no signal (
none— logistics, a thank-you) no longer reach the writer.
They stay cached like everything else; they just stop diluting the profile. profilenow says where the load stands. The split is deliberate —profileandreport
look,updateloads — butprofileused to end in silence, leaving the impression the
printed profile was live. It now closes with the honest state:not loaded yet — load it into your assistant: stratless update, or the loaded path and how to refresh it.- Every printed next-step now works in your shell. Run stratless via
npxand the hints say
npx stratless profile; run it installed and they stay bare. (Followingnpx stratless init
with the suggestedstratless profileused to hitcommand not found.) stoppoints back the right way. Its parting hint now names what actually reverses it
(stratless updateto reload,stratless init --autofor background refresh) — plaininit
no longer arms the refresh since 0.2.3, andstatussaid the same stale thing.
Fixed
- The usage meter no longer under-reports by ~2,000x. It recorded only plain input tokens and
dropped the cache tokens where the real consumption lives (~17–24k tokens of Claude Code harness
overhead per borrowed call) — the ledger showed 484 input tokens where reality was over a million.
statusnow reports real tokens first (a subscription spends quota, not dollars), the
API-equivalent cost clearly labelled, and the judging / profile-build split. Existing tallies
survive the upgrade untouched. - A hand-edited
~/.claude/settings.jsonno longer crashesinit. Malformed JSON (the classic
trailing comma) used to become a raw stack trace — and could not be distinguished from a file worth
overwriting.initnow refuses with a clear message and touches nothing;stoptreats it as
"nothing to remove". init --autowarns when the background refresh can't actually run — the hook calls the bare
stratless, which an npx-only install doesn't put on your PATH. It now says so and names the fix
instead of failing silently every session.- The "report this" links printed when stratless refuses on format drift pointed at the repo's old
name and led to a 404. They point at the real repository now.
Published to npm over Trusted Publishing (OIDC, no token) with Sigstore provenance — verify with npm audit signatures.