Releases: JayPokale/Chisle
Release list
v3.4.0
Changelog
All notable changes to Chisle are documented here.
Format loosely follows Keep a Changelog.
[Unreleased]
[3.4.0] - 2026-09-17
Added
- GitHub Copilot CLI tool-output compression. The
postToolUsehook now recognises Copilot CLI's flat camelCase payload (toolName+toolResult.textResultForLlm) and replies withmodifiedResult, reusing the same scrub -> dedup -> elide core as every other agent. Copilot state (dedup/spill/stats) lives under~/.copilotvia a newgetCopilotDir(), never~/.claude. Copilot'sview/create/editare excluded for the same reasonRead/Edit/Writeare. Detection is structural, so the Claude/Pi path is untouched. Thanks @ishaksar (#11).- Installer wiring for Copilot hooks is deliberately not included yet; the compression core is in place but Copilot is not yet advertised as having the input axis.
- OpenCode tool-output compression.
npx chisle --only opencodenow also installs a native OpenCode plugin (~/.config/opencode/plugins/chisle.js+ the zero-dep compressor core inchisle-hooks/). It elides oversized read-only tool output (bash, grep, glob, webfetch, MCPserver_toolresults) via two hooks, reusing the exact scrub+elide core the Claude/Pi hook uses;read/edit/writestay untouched (even underCHISLE_COMPRESS_TOOLS).tool.execute.afterrewritesoutput.outputin place. For outputs under OpenCode's on-disk store limits (~50 KB / 2000 lines) the mutation persists onto the tool part'sstate.output, so every later turn reuses the compressed form.experimental.chat.messages.transformre-applies compression over completed tool parts just before parts become model messages — a request-time safety net for full output the store still holds (e.g. recorded before install). Idempotent: parts already carrying the[chisle:marker are skipped.- Measured on gpt-5.5: a 30 KB / 999-line
cat(kept full by OpenCode) shrank to ~3.3 KB, cutting the tool-ingestion step from 13,382 to 1,747 fresh input tokens (-87%) with a byte-identical, correct answer. - Spill/recovery files live under
~/.config/opencode/. Kill switchCHISLE_COMPRESS=0, disable by default withCHISLE_DEFAULT_MODE=off. Uninstall removes the plugin, its core, and spill/state. This closes the one axis static-rule hosts previously could not get (seedocs/agent-portability.mdfeature map).
- OpenCode support.
npx chisle --only opencodeappends the fenced Chisle ruleset to the global~/.config/opencode/AGENTS.md(existing instructions preserved, refresh only under--force/--update) and copies the bundled skills into~/.config/opencode/skills/for on-demand loading via the nativeskilltool. Noinstructionsentry, no second system message. Uninstall removes only the fenced block and thechisle*skill dirs. - Hermes Agent support.
npx chisle --only hermescopies the bundled skills verbatim into~/.hermes/skills/(Agent Skills standard,/chislecommands). No ruleset injection, no config rewrite. Portable viaCHISLE_HOME; uninstall prunes only owned skill dirs. - Shared
writeFencedRulesethelper: Codex and OpenCode now share one append/refresh path (behavior unchanged, covered by a refactor-guard test).
Fixed
CHISLE_COMPRESS_TOOLScould defeat theRead/Edit/Writeexclusion. The override replaces the allowlist, and on the Claude and Copilot paths it was consulted before any exclusion check — soCHISLE_COMPRESS_TOOLS=Readgenuinely re-enabled compression ofReadoutput. That output feedsEdit'sold_stringmatching, so eliding it can make the model edit text it never saw. The Pi extension (NEVER_COMPRESS) and the OpenCode path (UNSAFE_TOOLS_OPENCODE) always checked first; all four paths now do. The exclusion is a correctness guarantee, not a default.- A failed install reported success.
spawnSyncreturns{ status: null, error: ENOENT }when the target CLI is not onPATH(and{ status: null, signal }on a signal death), and the(r.status || 0) === 0check read thatnullas0. On a machine withoutgeminiorpi,npx chisleprintedinstalled: geminiand exited0while installing nothing. Four call sites shared the pattern; all now require an explicit zero exit.--dry-runstill reports success. - The OpenCode compressor core could fail to load. OpenCode's config dir declares
"type": "module", which Node applies to every.jsbeneath it — including the CommonJS core copied toplugins/chisle-hooks/. It then threwReferenceErroron its firstrequire, taking the plugin with it. The installer now writeschisle-hooks/package.jsonpinning"type": "commonjs". Bun tolerated this; Node did not. - A compressed Copilot tool result was always labelled
success. The reply builder hard-codedresultType: 'success', so compressing the output of a call that errored relabelled it. It now echoes back theresultTypeit was given.
Changed
- Benchmarks publish their results.
benchmarks/README.md,quality/README.mdandagentic/README.mddescribed how to run each suite but printed no numbers. All three now carry result tables regenerated from the committed raw data by the deterministic graders — including both null results (Fisher p = 1.000 on correctness and on the agentic suite) and the agentic cost regression ($0.0276 vs $0.0269). benchmarks/quality/README.mdclaimed 20 maths and 12 coding items; the real counts are 32 and 20. The table predated thehardtier and only ever countedbase.SECURITY.mddeclared Chisle "pre-1.0" and listed0.xas the supported line, several majors out of date.- Support routing:
SUPPORT.mdis now a routing table and.github/ISSUE_TEMPLATE/config.ymlpoints questions at GitHub Discussions Q&A rather than the issue tracker. - CI runs
scripts/build-samples.js --checkalongside the rule and chart checks, in both the test and publish workflows.
[3.3.0] - 2026-09-13
Added
- Elision is recoverable. The compressor used to delete the middle of an oversized
output outright. If the agent then needed a line from it, the only way back was
re-running the command: more expensive than the elision saved, and simply wrong when
the command is not idempotent (a test run, a build, agit logat a moment in time).
The full output now spills to<config>/chisle-spill/first and the marker carries the
path, so recovery is a targeted grep. Newest 40 kept, mode 0600,CHISLE_COMPRESS_SPILL=0
to disable, removed by--uninstall. Best-effort: a failed spill still elides, just
without the escape hatch.
Credit where due: this is the failure mode the
THOL benchmark
names as reason #2 that compressors fail to pay for themselves. No code was taken from
any other project.
[3.2.1] - 2026-09-13
Added
npx chisle --update. Refreshes every agent that already has Chisle and installs it
into none that don't.
Fixed
- The documented upgrade command did nothing. The README said re-running the installer
"is idempotent and overwrites the previous copy". It is not: every install path (Claude
plugin, Claude standalone hooks, Pi, Gemini, Codex, and all five project-rule agents)
skips when Chisle is already present, so an upgrade run printed a success summary and
changed no files.--updatepairs the existing force paths with an installed-or-not
check, and the README and website now document it, including thenpx chisle@latestpin
that stops npx serving a cached copy of the package.
[3.2.0] - 2026-09-13
Added
-
Deliberation budget rule ("Thinking is billed too"). The Pi benchmark exposed a
gap the ruleset never addressed: every rule trimmed what the model writes, nothing
trimmed what it spends getting there. On the six-task Pi run Chisle produced the
smallest visible answers of any arm (814 tokens vs ponytail's 1,027) and still billed
more (1,328 vs 1,265), because 39% of its output was reasoning against ponytail's 19%.
The new rule makes the ladder an explicit stopping rule rather than a checklist to walk
aloud, and it keeps the existing carve-out intact: never think less about understanding
the problem. Added toskills/chisle/SKILL.md, thebuild-rules.jsbody, and
AGENTS.md/GEMINI.md.
Unvalidated: the mechanism is measured, the fix is not. Re-running the Pi arm is
the only thing that settles whether it works. -
npx chisle --stats. The compressor has always kept a savings ledger at
<config>/.chisle-compress-stats.json, but nothing could read it except the statusline
badge, so the answer to "how much did this save me" was a repo clone away
(#8, asked by
@cosjef). The flag prints saved chars, estimated tokens, and
the compressed-output count. Read-only, creates nothing, refuses a symlinked ledger, and
treats a corrupt one as empty rather than trusting it.
It reports the input axis only. Elided chars have a real baseline; the output axis has
none, and is measured with benchmark arms instead. Blending them would invent the number.
Changed
- Em dashes removed from the README, docs, website, and rulesets. Prose only; raw
benchmark transcripts,samples.json, and the compressor's own elision marker are left
byte-exact, since editing those would falsify committed receipts. - Website updated for the Pi release. Agent count, install commands, the Pi package
path, the corrected input-axis claim, and a new benchmark section publishing the Pi arm,
including the billed-output row Chisle lost to ponytail. - Contributor avatars removed from the site. The "Built in the open" section keeps its
copy and links; `getContribut...
v3.3.0
Changelog
All notable changes to Chisle are documented here.
Format loosely follows Keep a Changelog.
[3.3.0] - 2026-09-13
Added
- Elision is recoverable. The compressor used to delete the middle of an oversized
output outright. If the agent then needed a line from it, the only way back was
re-running the command: more expensive than the elision saved, and simply wrong when
the command is not idempotent (a test run, a build, agit logat a moment in time).
The full output now spills to<config>/chisle-spill/first and the marker carries the
path, so recovery is a targeted grep. Newest 40 kept, mode 0600,CHISLE_COMPRESS_SPILL=0
to disable, removed by--uninstall. Best-effort: a failed spill still elides, just
without the escape hatch.
Credit where due: this is the failure mode the
THOL benchmark
names as reason #2 that compressors fail to pay for themselves. No code was taken from
any other project.
[3.2.1] - 2026-09-13
Added
npx chisle --update. Refreshes every agent that already has Chisle and installs it
into none that don't.
Fixed
- The documented upgrade command did nothing. The README said re-running the installer
"is idempotent and overwrites the previous copy". It is not: every install path (Claude
plugin, Claude standalone hooks, Pi, Gemini, Codex, and all five project-rule agents)
skips when Chisle is already present, so an upgrade run printed a success summary and
changed no files.--updatepairs the existing force paths with an installed-or-not
check, and the README and website now document it, including thenpx chisle@latestpin
that stops npx serving a cached copy of the package.
[3.2.0] - 2026-09-13
Added
-
Deliberation budget rule ("Thinking is billed too"). The Pi benchmark exposed a
gap the ruleset never addressed: every rule trimmed what the model writes, nothing
trimmed what it spends getting there. On the six-task Pi run Chisle produced the
smallest visible answers of any arm (814 tokens vs ponytail's 1,027) and still billed
more (1,328 vs 1,265), because 39% of its output was reasoning against ponytail's 19%.
The new rule makes the ladder an explicit stopping rule rather than a checklist to walk
aloud, and it keeps the existing carve-out intact: never think less about understanding
the problem. Added toskills/chisle/SKILL.md, thebuild-rules.jsbody, and
AGENTS.md/GEMINI.md.
Unvalidated: the mechanism is measured, the fix is not. Re-running the Pi arm is
the only thing that settles whether it works. -
npx chisle --stats. The compressor has always kept a savings ledger at
<config>/.chisle-compress-stats.json, but nothing could read it except the statusline
badge, so the answer to "how much did this save me" was a repo clone away
(#8, asked by
@cosjef). The flag prints saved chars, estimated tokens, and
the compressed-output count. Read-only, creates nothing, refuses a symlinked ledger, and
treats a corrupt one as empty rather than trusting it.
It reports the input axis only. Elided chars have a real baseline; the output axis has
none, and is measured with benchmark arms instead. Blending them would invent the number.
Changed
- Em dashes removed from the README, docs, website, and rulesets. Prose only; raw
benchmark transcripts,samples.json, and the compressor's own elision marker are left
byte-exact, since editing those would falsify committed receipts. - Website updated for the Pi release. Agent count, install commands, the Pi package
path, the corrected input-axis claim, and a new benchmark section publishing the Pi arm,
including the billed-output row Chisle lost to ponytail. - Contributor avatars removed from the site. The "Built in the open" section keeps its
copy and links;getContributors()had no other caller and went with them.
[3.1.0] - 2026-09-11
Added
- Pi harness integration. New zero-dependency Pi package extension supplies the always-on ruleset,
/chisleand natural-language toggles, footer savings badge, andtool_resultcompression while preservingdetails,isError, andusage. Parallel sibling results cannot dedup one another;read,edit, andwriteare always untouched. - Pi install and replay support.
npx chisledetects Pi and delegates package settings topi install/pi remove;--only pi,--dry-run, and scoped uninstall are covered.package.jsonexposes the extension and Agent Skills resources. Transcript replay reads Pi session JSONL and reports marginal savings after Pi's native 50KB/2,000-line truncation. - Pi receipts. Committed 24 raw live event streams plus normalized cells. Chisle used 61% of vanilla billed output versus ponytail's 59%, while producing the smallest visible answers (37%) and fewest lines (37%). Local Pi replay measured 27.4% marginal tool-output reduction after native truncation. (#6)
Fixed
CHISLE_DEFAULT_MODE=offblocked explicit activation. It now controls session startup only;/chisleor an activation phrase enables the current Claude Code or Pi session as documented.- Duplicate hook registration made dedup destroy first-seen tool output.
Whenchisle-compress-output.jswas registered twice (plugin manifest plus a
leftover standalone entry insettings.json), both copies ran on the same
tool call and shared one state file: copy A stored the output hash, copy B
matched it and replaced content the model had never seen with a
[chisle: output byte-identical to the previous <tool> result …]marker.
dedupChecknow records the payload'stool_use_idalongside the hash and
skips the marker when the match comes from the same tool call. Old
string-valued state entries still load, and a payload without a
tool_use_idkeeps the previous behaviour. A genuine re-run is a different
tool call, so real dedup still fires.
(#4, reported by
@aermak) - The installer left both registrations live.
installClaude()picked one
wiring path per run and never removed the other's, so a machine that once
fell back to standalone hooks kept them after the plugin installed. The
plugin branch now stripschisle-entries fromsettings.json.
[3.0.0] - 2026-07-28
Changed
- BREAKING: one mode.
lite,fullandultraare gone. Three dials on a
tool whose argument is "fewer knobs" was the joke writing itself, and only the
middle setting was ever benchmarked./chisleturns it on,/chisle off
turns it off. A stray/chisle fullstill just activates, so old habits keep
working.- Compressor thresholds are now fixed at the old
fullvalues
(8k chars, 60 head lines, 40 tail) — the published numbers were measured
there.CHISLE_COMPRESS_*still overrides them. CHISLE_DEFAULT_MODEandconfig.jsondefaultModenow takeon/off.
An existinglite/full/ultravalue is no longer valid and falls through
to the default, which ison— so the tool stays enabled either way, and
SessionStart says once that the setting no longer does anything.- Statusline renders
[CHISLE]only; the[CHISLE:ULTRA]variant is gone. - Note for anyone re-deriving the benchmarks: the injected ruleset changed
with this release (the intensity table left SKILL.md), so a fresh run will
not reproduce the committed cells byte-for-byte.
- Compressor thresholds are now fixed at the old
Fixed
- Tool-output compression never actually applied. The
PostToolUsehook
returned the compressed text as a bare string, but Claude Code validates
updatedToolOutputagainst the tool's own output schema — and object-shaped
results (Bash→{stdout, stderr, …}) rejected it every time with
expected object, received string. The hook ran, reported savings, and the
model still received the full output.rebuildResponse()now puts the
compressed text back into the original shape and skips shapes it cannot
rebuild rather than emitting a replacement the harness will refuse.
Found and diagnosed with transcript evidence, plus the fix, by
@sovdchains (#3). - The stats file counted savings that never happened.
recordSavings()
ran before the replacement was emitted, so.chisle-compress-stats.jsonand
the statusline⇣badge credited every compression the harness went on to
reject. It now records only when a replacement is actually sent. Same report
(#3). - The full ruleset was re-injected on every resume, clear and compact.
SessionStartmatchesstartup|resume|clear|compact, and the hook never
readsource, so all four re-sent the whole ~1.6k-token ruleset. Only
startupnow sends it; the rest get a 27-token reactivation line, since the
per-turnUserPromptSubmitreminder already restates the active behaviour.
Measured across 173 real sessions — including the observation that the
overhead was cancelling most of the compressor's savings, and that the
standing instruction load was competing with the user's actual requests — by
@enc0ded (#2).
[2.0.0] - 2026-07-28
Changed
- Renamed project: RDXmin → Chisle. Package, plugin, skills
(chisle,chisle-audit,chisle-review,chisle-help), commands
(/chisle,/chisle-audit,/chisle-review,/chisle-help), env vars
(CHISLE_*), config path (~/.config/chisle/), and all per-agent rule
mirrors renamed to match. Entries below predate the rename and refer to
the project by its former name, RDXmin.
Published to npm as chisle; rdxmin deprecated with a pointer.
[1.2.2] - 2026-07-11
Added
-...
v3.2.1
Changelog
All notable changes to Chisle are documented here.
Format loosely follows Keep a Changelog.
[3.2.1] - 2026-09-13
Added
npx chisle --update. Refreshes every agent that already has Chisle and installs it
into none that don't.
Fixed
- The documented upgrade command did nothing. The README said re-running the installer
"is idempotent and overwrites the previous copy". It is not: every install path (Claude
plugin, Claude standalone hooks, Pi, Gemini, Codex, and all five project-rule agents)
skips when Chisle is already present, so an upgrade run printed a success summary and
changed no files.--updatepairs the existing force paths with an installed-or-not
check, and the README and website now document it, including thenpx chisle@latestpin
that stops npx serving a cached copy of the package.
[3.2.0] - 2026-09-13
Added
-
Deliberation budget rule ("Thinking is billed too"). The Pi benchmark exposed a
gap the ruleset never addressed: every rule trimmed what the model writes, nothing
trimmed what it spends getting there. On the six-task Pi run Chisle produced the
smallest visible answers of any arm (814 tokens vs ponytail's 1,027) and still billed
more (1,328 vs 1,265), because 39% of its output was reasoning against ponytail's 19%.
The new rule makes the ladder an explicit stopping rule rather than a checklist to walk
aloud, and it keeps the existing carve-out intact: never think less about understanding
the problem. Added toskills/chisle/SKILL.md, thebuild-rules.jsbody, and
AGENTS.md/GEMINI.md.
Unvalidated: the mechanism is measured, the fix is not. Re-running the Pi arm is
the only thing that settles whether it works. -
npx chisle --stats. The compressor has always kept a savings ledger at
<config>/.chisle-compress-stats.json, but nothing could read it except the statusline
badge, so the answer to "how much did this save me" was a repo clone away
(#8, asked by
@cosjef). The flag prints saved chars, estimated tokens, and
the compressed-output count. Read-only, creates nothing, refuses a symlinked ledger, and
treats a corrupt one as empty rather than trusting it.
It reports the input axis only. Elided chars have a real baseline; the output axis has
none, and is measured with benchmark arms instead. Blending them would invent the number.
Changed
- Em dashes removed from the README, docs, website, and rulesets. Prose only; raw
benchmark transcripts,samples.json, and the compressor's own elision marker are left
byte-exact, since editing those would falsify committed receipts. - Website updated for the Pi release. Agent count, install commands, the Pi package
path, the corrected input-axis claim, and a new benchmark section publishing the Pi arm,
including the billed-output row Chisle lost to ponytail. - Contributor avatars removed from the site. The "Built in the open" section keeps its
copy and links;getContributors()had no other caller and went with them.
[3.1.0] - 2026-09-11
Added
- Pi harness integration. New zero-dependency Pi package extension supplies the always-on ruleset,
/chisleand natural-language toggles, footer savings badge, andtool_resultcompression while preservingdetails,isError, andusage. Parallel sibling results cannot dedup one another;read,edit, andwriteare always untouched. - Pi install and replay support.
npx chisledetects Pi and delegates package settings topi install/pi remove;--only pi,--dry-run, and scoped uninstall are covered.package.jsonexposes the extension and Agent Skills resources. Transcript replay reads Pi session JSONL and reports marginal savings after Pi's native 50KB/2,000-line truncation. - Pi receipts. Committed 24 raw live event streams plus normalized cells. Chisle used 61% of vanilla billed output versus ponytail's 59%, while producing the smallest visible answers (37%) and fewest lines (37%). Local Pi replay measured 27.4% marginal tool-output reduction after native truncation. (#6)
Fixed
CHISLE_DEFAULT_MODE=offblocked explicit activation. It now controls session startup only;/chisleor an activation phrase enables the current Claude Code or Pi session as documented.- Duplicate hook registration made dedup destroy first-seen tool output.
Whenchisle-compress-output.jswas registered twice (plugin manifest plus a
leftover standalone entry insettings.json), both copies ran on the same
tool call and shared one state file: copy A stored the output hash, copy B
matched it and replaced content the model had never seen with a
[chisle: output byte-identical to the previous <tool> result …]marker.
dedupChecknow records the payload'stool_use_idalongside the hash and
skips the marker when the match comes from the same tool call. Old
string-valued state entries still load, and a payload without a
tool_use_idkeeps the previous behaviour. A genuine re-run is a different
tool call, so real dedup still fires.
(#4, reported by
@aermak) - The installer left both registrations live.
installClaude()picked one
wiring path per run and never removed the other's, so a machine that once
fell back to standalone hooks kept them after the plugin installed. The
plugin branch now stripschisle-entries fromsettings.json.
[3.0.0] - 2026-07-28
Changed
- BREAKING: one mode.
lite,fullandultraare gone. Three dials on a
tool whose argument is "fewer knobs" was the joke writing itself, and only the
middle setting was ever benchmarked./chisleturns it on,/chisle off
turns it off. A stray/chisle fullstill just activates, so old habits keep
working.- Compressor thresholds are now fixed at the old
fullvalues
(8k chars, 60 head lines, 40 tail) — the published numbers were measured
there.CHISLE_COMPRESS_*still overrides them. CHISLE_DEFAULT_MODEandconfig.jsondefaultModenow takeon/off.
An existinglite/full/ultravalue is no longer valid and falls through
to the default, which ison— so the tool stays enabled either way, and
SessionStart says once that the setting no longer does anything.- Statusline renders
[CHISLE]only; the[CHISLE:ULTRA]variant is gone. - Note for anyone re-deriving the benchmarks: the injected ruleset changed
with this release (the intensity table left SKILL.md), so a fresh run will
not reproduce the committed cells byte-for-byte.
- Compressor thresholds are now fixed at the old
Fixed
- Tool-output compression never actually applied. The
PostToolUsehook
returned the compressed text as a bare string, but Claude Code validates
updatedToolOutputagainst the tool's own output schema — and object-shaped
results (Bash→{stdout, stderr, …}) rejected it every time with
expected object, received string. The hook ran, reported savings, and the
model still received the full output.rebuildResponse()now puts the
compressed text back into the original shape and skips shapes it cannot
rebuild rather than emitting a replacement the harness will refuse.
Found and diagnosed with transcript evidence, plus the fix, by
@sovdchains (#3). - The stats file counted savings that never happened.
recordSavings()
ran before the replacement was emitted, so.chisle-compress-stats.jsonand
the statusline⇣badge credited every compression the harness went on to
reject. It now records only when a replacement is actually sent. Same report
(#3). - The full ruleset was re-injected on every resume, clear and compact.
SessionStartmatchesstartup|resume|clear|compact, and the hook never
readsource, so all four re-sent the whole ~1.6k-token ruleset. Only
startupnow sends it; the rest get a 27-token reactivation line, since the
per-turnUserPromptSubmitreminder already restates the active behaviour.
Measured across 173 real sessions — including the observation that the
overhead was cancelling most of the compressor's savings, and that the
standing instruction load was competing with the user's actual requests — by
@enc0ded (#2).
[2.0.0] - 2026-07-28
Changed
- Renamed project: RDXmin → Chisle. Package, plugin, skills
(chisle,chisle-audit,chisle-review,chisle-help), commands
(/chisle,/chisle-audit,/chisle-review,/chisle-help), env vars
(CHISLE_*), config path (~/.config/chisle/), and all per-agent rule
mirrors renamed to match. Entries below predate the rename and refer to
the project by its former name, RDXmin.
Published to npm as chisle; rdxmin deprecated with a pointer.
[1.2.2] - 2026-07-11
Added
- Website: rdx.jaypokale.me — npm/README homepage
now points there. Site lives insite/, ships in neither the npm package
nor the plugin install.
[1.2.1] - 2026-07-11
Fixed
- Windows statusline never rendered —
rdx-statusline.ps1combined
Get-Content -Raw -TotalCount, which are mutually exclusive in every
PowerShell; the throw was swallowed bySilentlyContinue, the empty mode
hit the whitelist default, and the badge silently exited. Cap the string
after a plain-Rawread instead. Reported by
@TDimovski (#1). rdx-statusline.ps1now refuses symlinked/reparse-point flag and stats
files, matching the.shguard.
[1.2.0] - 2026-07-09
Added
- Major-version update notice on session start (registry check cached 3 days,
RDX_UPDATE_CHECK=0kill switch). - Contributor credits:
package.jsoncontributors, RE...
v3.2.0
Changelog
All notable changes to Chisle are documented here.
Format loosely follows Keep a Changelog.
[3.2.0] - 2026-09-13
Added
-
Deliberation budget rule ("Thinking is billed too"). The Pi benchmark exposed a
gap the ruleset never addressed: every rule trimmed what the model writes, nothing
trimmed what it spends getting there. On the six-task Pi run Chisle produced the
smallest visible answers of any arm (814 tokens vs ponytail's 1,027) and still billed
more (1,328 vs 1,265), because 39% of its output was reasoning against ponytail's 19%.
The new rule makes the ladder an explicit stopping rule rather than a checklist to walk
aloud, and it keeps the existing carve-out intact: never think less about understanding
the problem. Added toskills/chisle/SKILL.md, thebuild-rules.jsbody, and
AGENTS.md/GEMINI.md.
Unvalidated: the mechanism is measured, the fix is not. Re-running the Pi arm is
the only thing that settles whether it works. -
npx chisle --stats. The compressor has always kept a savings ledger at
<config>/.chisle-compress-stats.json, but nothing could read it except the statusline
badge, so the answer to "how much did this save me" was a repo clone away
(#8, asked by
@cosjef). The flag prints saved chars, estimated tokens, and
the compressed-output count. Read-only, creates nothing, refuses a symlinked ledger, and
treats a corrupt one as empty rather than trusting it.
It reports the input axis only. Elided chars have a real baseline; the output axis has
none, and is measured with benchmark arms instead. Blending them would invent the number.
Changed
- Em dashes removed from the README, docs, website, and rulesets. Prose only; raw
benchmark transcripts,samples.json, and the compressor's own elision marker are left
byte-exact, since editing those would falsify committed receipts. - Website updated for the Pi release. Agent count, install commands, the Pi package
path, the corrected input-axis claim, and a new benchmark section publishing the Pi arm,
including the billed-output row Chisle lost to ponytail. - Contributor avatars removed from the site. The "Built in the open" section keeps its
copy and links;getContributors()had no other caller and went with them.
[3.1.0] - 2026-09-11
Added
- Pi harness integration. New zero-dependency Pi package extension supplies the always-on ruleset,
/chisleand natural-language toggles, footer savings badge, andtool_resultcompression while preservingdetails,isError, andusage. Parallel sibling results cannot dedup one another;read,edit, andwriteare always untouched. - Pi install and replay support.
npx chisledetects Pi and delegates package settings topi install/pi remove;--only pi,--dry-run, and scoped uninstall are covered.package.jsonexposes the extension and Agent Skills resources. Transcript replay reads Pi session JSONL and reports marginal savings after Pi's native 50KB/2,000-line truncation. - Pi receipts. Committed 24 raw live event streams plus normalized cells. Chisle used 61% of vanilla billed output versus ponytail's 59%, while producing the smallest visible answers (37%) and fewest lines (37%). Local Pi replay measured 27.4% marginal tool-output reduction after native truncation. (#6)
Fixed
CHISLE_DEFAULT_MODE=offblocked explicit activation. It now controls session startup only;/chisleor an activation phrase enables the current Claude Code or Pi session as documented.- Duplicate hook registration made dedup destroy first-seen tool output.
Whenchisle-compress-output.jswas registered twice (plugin manifest plus a
leftover standalone entry insettings.json), both copies ran on the same
tool call and shared one state file: copy A stored the output hash, copy B
matched it and replaced content the model had never seen with a
[chisle: output byte-identical to the previous <tool> result …]marker.
dedupChecknow records the payload'stool_use_idalongside the hash and
skips the marker when the match comes from the same tool call. Old
string-valued state entries still load, and a payload without a
tool_use_idkeeps the previous behaviour. A genuine re-run is a different
tool call, so real dedup still fires.
(#4, reported by
@aermak) - The installer left both registrations live.
installClaude()picked one
wiring path per run and never removed the other's, so a machine that once
fell back to standalone hooks kept them after the plugin installed. The
plugin branch now stripschisle-entries fromsettings.json.
[3.0.0] - 2026-07-28
Changed
- BREAKING: one mode.
lite,fullandultraare gone. Three dials on a
tool whose argument is "fewer knobs" was the joke writing itself, and only the
middle setting was ever benchmarked./chisleturns it on,/chisle off
turns it off. A stray/chisle fullstill just activates, so old habits keep
working.- Compressor thresholds are now fixed at the old
fullvalues
(8k chars, 60 head lines, 40 tail) — the published numbers were measured
there.CHISLE_COMPRESS_*still overrides them. CHISLE_DEFAULT_MODEandconfig.jsondefaultModenow takeon/off.
An existinglite/full/ultravalue is no longer valid and falls through
to the default, which ison— so the tool stays enabled either way, and
SessionStart says once that the setting no longer does anything.- Statusline renders
[CHISLE]only; the[CHISLE:ULTRA]variant is gone. - Note for anyone re-deriving the benchmarks: the injected ruleset changed
with this release (the intensity table left SKILL.md), so a fresh run will
not reproduce the committed cells byte-for-byte.
- Compressor thresholds are now fixed at the old
Fixed
- Tool-output compression never actually applied. The
PostToolUsehook
returned the compressed text as a bare string, but Claude Code validates
updatedToolOutputagainst the tool's own output schema — and object-shaped
results (Bash→{stdout, stderr, …}) rejected it every time with
expected object, received string. The hook ran, reported savings, and the
model still received the full output.rebuildResponse()now puts the
compressed text back into the original shape and skips shapes it cannot
rebuild rather than emitting a replacement the harness will refuse.
Found and diagnosed with transcript evidence, plus the fix, by
@sovdchains (#3). - The stats file counted savings that never happened.
recordSavings()
ran before the replacement was emitted, so.chisle-compress-stats.jsonand
the statusline⇣badge credited every compression the harness went on to
reject. It now records only when a replacement is actually sent. Same report
(#3). - The full ruleset was re-injected on every resume, clear and compact.
SessionStartmatchesstartup|resume|clear|compact, and the hook never
readsource, so all four re-sent the whole ~1.6k-token ruleset. Only
startupnow sends it; the rest get a 27-token reactivation line, since the
per-turnUserPromptSubmitreminder already restates the active behaviour.
Measured across 173 real sessions — including the observation that the
overhead was cancelling most of the compressor's savings, and that the
standing instruction load was competing with the user's actual requests — by
@enc0ded (#2).
[2.0.0] - 2026-07-28
Changed
- Renamed project: RDXmin → Chisle. Package, plugin, skills
(chisle,chisle-audit,chisle-review,chisle-help), commands
(/chisle,/chisle-audit,/chisle-review,/chisle-help), env vars
(CHISLE_*), config path (~/.config/chisle/), and all per-agent rule
mirrors renamed to match. Entries below predate the rename and refer to
the project by its former name, RDXmin.
Published to npm as chisle; rdxmin deprecated with a pointer.
[1.2.2] - 2026-07-11
Added
- Website: rdx.jaypokale.me — npm/README homepage
now points there. Site lives insite/, ships in neither the npm package
nor the plugin install.
[1.2.1] - 2026-07-11
Fixed
- Windows statusline never rendered —
rdx-statusline.ps1combined
Get-Content -Raw -TotalCount, which are mutually exclusive in every
PowerShell; the throw was swallowed bySilentlyContinue, the empty mode
hit the whitelist default, and the badge silently exited. Cap the string
after a plain-Rawread instead. Reported by
@TDimovski (#1). rdx-statusline.ps1now refuses symlinked/reparse-point flag and stats
files, matching the.shguard.
[1.2.0] - 2026-07-09
Added
- Major-version update notice on session start (registry check cached 3 days,
RDX_UPDATE_CHECK=0kill switch). - Contributor credits:
package.jsoncontributors, README contributors
section with auto-updating contrib.rocks image.
Changed
- CI: actions bumped to v5; publish step idempotent (skips versions already
on npm).
[1.1.0] - 2026-07-07
Same content as 0.2.0 plus the total-bill chart redesign. The version jumps
past 1.0.0 because the repo's very first commit shipped "version": "1.0.0"
before being re-numbered to 0.1.0 — plugin resolvers with that payload cached
treat every 0.x release as a downgrade and silently keep serving the ancient
code. 1.0.0 is skipped forever; nothing may ever claim it again.
[0.2.0] - 2026-07-07
Added
- Tool-output compression (input axis) —
PostToolUsehook
(hooks/rdx-compress-output.js) elides the middle of oversized tool results
befo...
v3.1.0
Changelog
All notable changes to Chisle are documented here.
Format loosely follows Keep a Changelog.
[3.1.0] — 2026-09-11
Added
- Pi harness integration. New zero-dependency Pi package extension supplies the always-on ruleset,
/chisleand natural-language toggles, footer savings badge, andtool_resultcompression while preservingdetails,isError, andusage. Parallel sibling results cannot dedup one another;read,edit, andwriteare always untouched. - Pi install and replay support.
npx chisledetects Pi and delegates package settings topi install/pi remove;--only pi,--dry-run, and scoped uninstall are covered.package.jsonexposes the extension and Agent Skills resources. Transcript replay reads Pi session JSONL and reports marginal savings after Pi's native 50KB/2,000-line truncation. - Pi receipts. Committed 24 raw live event streams plus normalized cells. Chisle used 61% of vanilla billed output versus ponytail's 59%, while producing the smallest visible answers (37%) and fewest lines (37%). Local Pi replay measured 27.4% marginal tool-output reduction after native truncation. (#6)
Fixed
CHISLE_DEFAULT_MODE=offblocked explicit activation. It now controls session startup only;/chisleor an activation phrase enables the current Claude Code or Pi session as documented.- Duplicate hook registration made dedup destroy first-seen tool output.
Whenchisle-compress-output.jswas registered twice (plugin manifest plus a
leftover standalone entry insettings.json), both copies ran on the same
tool call and shared one state file: copy A stored the output hash, copy B
matched it and replaced content the model had never seen with a
[chisle: output byte-identical to the previous <tool> result …]marker.
dedupChecknow records the payload'stool_use_idalongside the hash and
skips the marker when the match comes from the same tool call. Old
string-valued state entries still load, and a payload without a
tool_use_idkeeps the previous behaviour. A genuine re-run is a different
tool call, so real dedup still fires.
(#4, reported by
@aermak) - The installer left both registrations live.
installClaude()picked one
wiring path per run and never removed the other's, so a machine that once
fell back to standalone hooks kept them after the plugin installed. The
plugin branch now stripschisle-entries fromsettings.json.
[3.0.0] — 2026-07-28
Changed
- BREAKING: one mode.
lite,fullandultraare gone. Three dials on a
tool whose argument is "fewer knobs" was the joke writing itself, and only the
middle setting was ever benchmarked./chisleturns it on,/chisle off
turns it off. A stray/chisle fullstill just activates, so old habits keep
working.- Compressor thresholds are now fixed at the old
fullvalues
(8k chars, 60 head lines, 40 tail) — the published numbers were measured
there.CHISLE_COMPRESS_*still overrides them. CHISLE_DEFAULT_MODEandconfig.jsondefaultModenow takeon/off.
An existinglite/full/ultravalue is no longer valid and falls through
to the default, which ison— so the tool stays enabled either way, and
SessionStart says once that the setting no longer does anything.- Statusline renders
[CHISLE]only; the[CHISLE:ULTRA]variant is gone. - Note for anyone re-deriving the benchmarks: the injected ruleset changed
with this release (the intensity table left SKILL.md), so a fresh run will
not reproduce the committed cells byte-for-byte.
- Compressor thresholds are now fixed at the old
Fixed
- Tool-output compression never actually applied. The
PostToolUsehook
returned the compressed text as a bare string, but Claude Code validates
updatedToolOutputagainst the tool's own output schema — and object-shaped
results (Bash→{stdout, stderr, …}) rejected it every time with
expected object, received string. The hook ran, reported savings, and the
model still received the full output.rebuildResponse()now puts the
compressed text back into the original shape and skips shapes it cannot
rebuild rather than emitting a replacement the harness will refuse.
Found and diagnosed with transcript evidence, plus the fix, by
@sovdchains (#3). - The stats file counted savings that never happened.
recordSavings()
ran before the replacement was emitted, so.chisle-compress-stats.jsonand
the statusline⇣badge credited every compression the harness went on to
reject. It now records only when a replacement is actually sent. Same report
(#3). - The full ruleset was re-injected on every resume, clear and compact.
SessionStartmatchesstartup|resume|clear|compact, and the hook never
readsource, so all four re-sent the whole ~1.6k-token ruleset. Only
startupnow sends it; the rest get a 27-token reactivation line, since the
per-turnUserPromptSubmitreminder already restates the active behaviour.
Measured across 173 real sessions — including the observation that the
overhead was cancelling most of the compressor's savings, and that the
standing instruction load was competing with the user's actual requests — by
@enc0ded (#2).
[2.0.0] — 2026-07-28
Changed
- Renamed project: RDXmin → Chisle. Package, plugin, skills
(chisle,chisle-audit,chisle-review,chisle-help), commands
(/chisle,/chisle-audit,/chisle-review,/chisle-help), env vars
(CHISLE_*), config path (~/.config/chisle/), and all per-agent rule
mirrors renamed to match. Entries below predate the rename and refer to
the project by its former name, RDXmin.
Published to npm as chisle; rdxmin deprecated with a pointer.
[1.2.2] — 2026-07-11
Added
- Website: rdx.jaypokale.me — npm/README homepage
now points there. Site lives insite/, ships in neither the npm package
nor the plugin install.
[1.2.1] — 2026-07-11
Fixed
- Windows statusline never rendered —
rdx-statusline.ps1combined
Get-Content -Raw -TotalCount, which are mutually exclusive in every
PowerShell; the throw was swallowed bySilentlyContinue, the empty mode
hit the whitelist default, and the badge silently exited. Cap the string
after a plain-Rawread instead. Reported by
@TDimovski (#1). rdx-statusline.ps1now refuses symlinked/reparse-point flag and stats
files, matching the.shguard.
[1.2.0] — 2026-07-09
Added
- Major-version update notice on session start (registry check cached 3 days,
RDX_UPDATE_CHECK=0kill switch). - Contributor credits:
package.jsoncontributors, README contributors
section with auto-updating contrib.rocks image.
Changed
- CI: actions bumped to v5; publish step idempotent (skips versions already
on npm).
[1.1.0] — 2026-07-07
Same content as 0.2.0 plus the total-bill chart redesign. The version jumps
past 1.0.0 because the repo's very first commit shipped "version": "1.0.0"
before being re-numbered to 0.1.0 — plugin resolvers with that payload cached
treat every 0.x release as a downgrade and silently keep serving the ancient
code. 1.0.0 is skipped forever; nothing may ever claim it again.
[0.2.0] — 2026-07-07
Added
- Tool-output compression (input axis) —
PostToolUsehook
(hooks/rdx-compress-output.js) elides the middle of oversized tool results
before the model reads them: head + tail kept, up to 12 error-like lines
salvaged from the cut. Deterministic, zero LLM, zero network, zero deps.
Allowlist-only for correctness (Bash/Agent/WebFetch/WebSearch/Grep/Glob/
mcp__*— never Read/Edit/Write, whose exact bytes feed later edits).
Thresholds track the/rdxlevel (lite 16k / full 8k / ultra 5k chars);
env-tunable;RDX_COMPRESS=0kill switch. Wired via plugin manifest and the
standalone installer (settings merge grewmatchersupport). - Measured, not estimated: across 171 real transcripts, tool output is
67.5% of context content; the shipped compressor replayed over that corpus
shrinks eligible outputs ~46% (receipts + reproducible replay script:
benchmarks/replay-compress.js,benchmarks/results/2026-07-07-input-axis.md). - Savings ledger (
.rdx-compress-stats.json, measured chars elided) rendered
by both statuslines as⇣9k tok— this one has a real baseline, unlike the
fabricated output-side counter removed in 0.1.0. - Context Diet ruleset section (all 8 agents): fetch the slice, not the
file — Grep before Read, offset/limit reads, filter long output at the
source. Prevention for theReadwhale the compressor must not touch. - 15 new tests (compressor correctness guardrails, allowlist, kill switch,
never-throws). Suite: 49.
Added (2026-07-07, second pass)
- Scrub tier (lossless) in the output compressor: ANSI/OSC escape strip,
blank-run collapse,line repeated N×collapse — applies to medium outputs
below the elision threshold. Techniques adapted from headroom's transform
set, implemented zero-dep. Replay: 53 outputs touched in full mode (was 39),
~61k tokens one-shot on the measured corpus. - Dedup tier: a tool output byte-identical to that tool's previous output
in the same session becomes a one-line marker (the copy is already in
context). Session-scoped by hooksession_id— never fires across sessions,
where the earlier copy wouldn't be in context; skipped when no session id.
0 hits in the replay corpus — labeled speculative,RDX_COMPRESS_DEDUP=0. - README rebuilt around the three-axis story with verified numbers and a
prior-art table (real repo links); CONTRIBUTING corrected (wrong test glob
that matche...
v3.0.0
Changelog
All notable changes to Chisle are documented here.
Format loosely follows Keep a Changelog.
[3.0.0] — 2026-07-28
Changed
- BREAKING: one mode.
lite,fullandultraare gone. Three dials on a
tool whose argument is "fewer knobs" was the joke writing itself, and only the
middle setting was ever benchmarked./chisleturns it on,/chisle off
turns it off. A stray/chisle fullstill just activates, so old habits keep
working.- Compressor thresholds are now fixed at the old
fullvalues
(8k chars, 60 head lines, 40 tail) — the published numbers were measured
there.CHISLE_COMPRESS_*still overrides them. CHISLE_DEFAULT_MODEandconfig.jsondefaultModenow takeon/off.
An existinglite/full/ultravalue is no longer valid and falls through
to the default, which ison— so the tool stays enabled either way, and
SessionStart says once that the setting no longer does anything.- Statusline renders
[CHISLE]only; the[CHISLE:ULTRA]variant is gone. - Note for anyone re-deriving the benchmarks: the injected ruleset changed
with this release (the intensity table left SKILL.md), so a fresh run will
not reproduce the committed cells byte-for-byte.
- Compressor thresholds are now fixed at the old
Fixed
- Tool-output compression never actually applied. The
PostToolUsehook
returned the compressed text as a bare string, but Claude Code validates
updatedToolOutputagainst the tool's own output schema — and object-shaped
results (Bash→{stdout, stderr, …}) rejected it every time with
expected object, received string. The hook ran, reported savings, and the
model still received the full output.rebuildResponse()now puts the
compressed text back into the original shape and skips shapes it cannot
rebuild rather than emitting a replacement the harness will refuse.
Found and diagnosed with transcript evidence, plus the fix, by
@sovdchains (#3). - The stats file counted savings that never happened.
recordSavings()
ran before the replacement was emitted, so.chisle-compress-stats.jsonand
the statusline⇣badge credited every compression the harness went on to
reject. It now records only when a replacement is actually sent. Same report
(#3). - The full ruleset was re-injected on every resume, clear and compact.
SessionStartmatchesstartup|resume|clear|compact, and the hook never
readsource, so all four re-sent the whole ~1.6k-token ruleset. Only
startupnow sends it; the rest get a 27-token reactivation line, since the
per-turnUserPromptSubmitreminder already restates the active behaviour.
Measured across 173 real sessions — including the observation that the
overhead was cancelling most of the compressor's savings, and that the
standing instruction load was competing with the user's actual requests — by
@enc0ded (#2).
[2.0.0] — 2026-07-28
Changed
- Renamed project: RDXmin → Chisle. Package, plugin, skills
(chisle,chisle-audit,chisle-review,chisle-help), commands
(/chisle,/chisle-audit,/chisle-review,/chisle-help), env vars
(CHISLE_*), config path (~/.config/chisle/), and all per-agent rule
mirrors renamed to match. Entries below predate the rename and refer to
the project by its former name, RDXmin.
Published to npm as chisle; rdxmin deprecated with a pointer.
[1.2.2] — 2026-07-11
Added
- Website: rdx.jaypokale.me — npm/README homepage
now points there. Site lives insite/, ships in neither the npm package
nor the plugin install.
[1.2.1] — 2026-07-11
Fixed
- Windows statusline never rendered —
rdx-statusline.ps1combined
Get-Content -Raw -TotalCount, which are mutually exclusive in every
PowerShell; the throw was swallowed bySilentlyContinue, the empty mode
hit the whitelist default, and the badge silently exited. Cap the string
after a plain-Rawread instead. Reported by
@TDimovski (#1). rdx-statusline.ps1now refuses symlinked/reparse-point flag and stats
files, matching the.shguard.
[1.2.0] — 2026-07-09
Added
- Major-version update notice on session start (registry check cached 3 days,
RDX_UPDATE_CHECK=0kill switch). - Contributor credits:
package.jsoncontributors, README contributors
section with auto-updating contrib.rocks image.
Changed
- CI: actions bumped to v5; publish step idempotent (skips versions already
on npm).
[1.1.0] — 2026-07-07
Same content as 0.2.0 plus the total-bill chart redesign. The version jumps
past 1.0.0 because the repo's very first commit shipped "version": "1.0.0"
before being re-numbered to 0.1.0 — plugin resolvers with that payload cached
treat every 0.x release as a downgrade and silently keep serving the ancient
code. 1.0.0 is skipped forever; nothing may ever claim it again.
[0.2.0] — 2026-07-07
Added
- Tool-output compression (input axis) —
PostToolUsehook
(hooks/rdx-compress-output.js) elides the middle of oversized tool results
before the model reads them: head + tail kept, up to 12 error-like lines
salvaged from the cut. Deterministic, zero LLM, zero network, zero deps.
Allowlist-only for correctness (Bash/Agent/WebFetch/WebSearch/Grep/Glob/
mcp__*— never Read/Edit/Write, whose exact bytes feed later edits).
Thresholds track the/rdxlevel (lite 16k / full 8k / ultra 5k chars);
env-tunable;RDX_COMPRESS=0kill switch. Wired via plugin manifest and the
standalone installer (settings merge grewmatchersupport). - Measured, not estimated: across 171 real transcripts, tool output is
67.5% of context content; the shipped compressor replayed over that corpus
shrinks eligible outputs ~46% (receipts + reproducible replay script:
benchmarks/replay-compress.js,benchmarks/results/2026-07-07-input-axis.md). - Savings ledger (
.rdx-compress-stats.json, measured chars elided) rendered
by both statuslines as⇣9k tok— this one has a real baseline, unlike the
fabricated output-side counter removed in 0.1.0. - Context Diet ruleset section (all 8 agents): fetch the slice, not the
file — Grep before Read, offset/limit reads, filter long output at the
source. Prevention for theReadwhale the compressor must not touch. - 15 new tests (compressor correctness guardrails, allowlist, kill switch,
never-throws). Suite: 49.
Added (2026-07-07, second pass)
- Scrub tier (lossless) in the output compressor: ANSI/OSC escape strip,
blank-run collapse,line repeated N×collapse — applies to medium outputs
below the elision threshold. Techniques adapted from headroom's transform
set, implemented zero-dep. Replay: 53 outputs touched in full mode (was 39),
~61k tokens one-shot on the measured corpus. - Dedup tier: a tool output byte-identical to that tool's previous output
in the same session becomes a one-line marker (the copy is already in
context). Session-scoped by hooksession_id— never fires across sessions,
where the earlier copy wouldn't be in context; skipped when no session id.
0 hits in the replay corpus — labeled speculative,RDX_COMPRESS_DEDUP=0. - README rebuilt around the three-axis story with verified numbers and a
prior-art table (real repo links); CONTRIBUTING corrected (wrong test glob
that matched zero files, missing compressor row, stale savings-counter
mention, checklist aligned with the deliberate build-rules mirror).
Verified / Fixed (2026-07-07 re-verification)
- June benchmark numbers reproduced exactly from committed raw cells (billed
usage.output_tokens); metric now stated explicitly — on the alternative
visible-answer metric the June data held one RDXmin over-baseline cell. - Retired the "0 backfires" claim. A fresh 24-cell run against the
installed caveman/ponytail plugins produced one RDXmin backfire
(rest-graphql, 173% billed) vs caveman 5/6 (worst 424%) and ponytail 4/6.
Combined 20-task ledger: RDXmin 1, caveman 6, ponytail 8. All 24 fresh
answers graded correct — no accuracy loss in any arm. - Root-caused the backfire (comparison prompts → headed pro/con bullet walls,
structure the ruleset already banned but too weakly) and hardened the rule;
re-validated live at 93% of a fair 3-trial vanilla baseline (was 145%).
Writeup:benchmarks/results/2026-07-07-verify-rerun.md. - Fixed two-sources-of-truth bug:
scripts/build-rules.jscarried its own
rule BODY, so SKILL.md edits never reached the per-agent copies (CI checked
the copies against the same stale BODY — green while wrong). BODY updated +
labeled as a manual mirror. - Benchmark harness: competitor skills resolve from installed plugin cache,
arms run in parallel per task, fresh-run dir override (run-live.sh [model] [raw-dir],RAW_DIR=foraggregate.js).
[0.1.0] — 2026-06-29
Added
- Unified efficiency mode: zero-fluff prose + YAGNI-first code, always active together.
/rdx-audit— one-shot audit of a diff/file/repo across both axes: over-engineered
code and bloated prose/docs/comments, ranked biggest-cut-first. Neither a code-only
auditor nor a prose compressor does both; this is the union.- Reliability finding (14 tasks, 2 models): RDXmin never exceeded the no-tool token
baseline (worst case 83%), while caveman hit 130% once and ponytail 227% on 4 tasks. The
honest value prop is "no failure mode," not "tersest on every task." See
benchmarks/results/2026-06-29-reliability.md. /rdxcommand withlite/full/ultralevels; natural-language activation.- SessionStart + UserPromptSubmit hooks with symlink-safe flag handling (
O_NOFOLLOW, 0600). - Statusline badge
[RDX]/[RDX:ULTRA](bash + PowerShell). Shows plan rate-limit
usage + reset countdown, or session cost ($) on API keys...
v1.2.2
Changelog
All notable changes to RDXmin are documented here.
Format loosely follows Keep a Changelog.
[1.2.2] — 2026-07-11
Added
- Website: rdx.jaypokale.me — npm/README homepage
now points there. Site lives insite/, ships in neither the npm package
nor the plugin install.
[1.2.1] — 2026-07-11
Fixed
- Windows statusline never rendered —
rdx-statusline.ps1combined
Get-Content -Raw -TotalCount, which are mutually exclusive in every
PowerShell; the throw was swallowed bySilentlyContinue, the empty mode
hit the whitelist default, and the badge silently exited. Cap the string
after a plain-Rawread instead. Reported by
@TDimovski (#1). rdx-statusline.ps1now refuses symlinked/reparse-point flag and stats
files, matching the.shguard.
[1.2.0] — 2026-07-09
Added
- Major-version update notice on session start (registry check cached 3 days,
RDX_UPDATE_CHECK=0kill switch). - Contributor credits:
package.jsoncontributors, README contributors
section with auto-updating contrib.rocks image.
Changed
- CI: actions bumped to v5; publish step idempotent (skips versions already
on npm).
[1.1.0] — 2026-07-07
Same content as 0.2.0 plus the total-bill chart redesign. The version jumps
past 1.0.0 because the repo's very first commit shipped "version": "1.0.0"
before being re-numbered to 0.1.0 — plugin resolvers with that payload cached
treat every 0.x release as a downgrade and silently keep serving the ancient
code. 1.0.0 is skipped forever; nothing may ever claim it again.
[0.2.0] — 2026-07-07
Added
- Tool-output compression (input axis) —
PostToolUsehook
(hooks/rdx-compress-output.js) elides the middle of oversized tool results
before the model reads them: head + tail kept, up to 12 error-like lines
salvaged from the cut. Deterministic, zero LLM, zero network, zero deps.
Allowlist-only for correctness (Bash/Agent/WebFetch/WebSearch/Grep/Glob/
mcp__*— never Read/Edit/Write, whose exact bytes feed later edits).
Thresholds track the/rdxlevel (lite 16k / full 8k / ultra 5k chars);
env-tunable;RDX_COMPRESS=0kill switch. Wired via plugin manifest and the
standalone installer (settings merge grewmatchersupport). - Measured, not estimated: across 171 real transcripts, tool output is
67.5% of context content; the shipped compressor replayed over that corpus
shrinks eligible outputs ~46% (receipts + reproducible replay script:
benchmarks/replay-compress.js,benchmarks/results/2026-07-07-input-axis.md). - Savings ledger (
.rdx-compress-stats.json, measured chars elided) rendered
by both statuslines as⇣9k tok— this one has a real baseline, unlike the
fabricated output-side counter removed in 0.1.0. - Context Diet ruleset section (all 8 agents): fetch the slice, not the
file — Grep before Read, offset/limit reads, filter long output at the
source. Prevention for theReadwhale the compressor must not touch. - 15 new tests (compressor correctness guardrails, allowlist, kill switch,
never-throws). Suite: 49.
Added (2026-07-07, second pass)
- Scrub tier (lossless) in the output compressor: ANSI/OSC escape strip,
blank-run collapse,line repeated N×collapse — applies to medium outputs
below the elision threshold. Techniques adapted from headroom's transform
set, implemented zero-dep. Replay: 53 outputs touched in full mode (was 39),
~61k tokens one-shot on the measured corpus. - Dedup tier: a tool output byte-identical to that tool's previous output
in the same session becomes a one-line marker (the copy is already in
context). Session-scoped by hooksession_id— never fires across sessions,
where the earlier copy wouldn't be in context; skipped when no session id.
0 hits in the replay corpus — labeled speculative,RDX_COMPRESS_DEDUP=0. - README rebuilt around the three-axis story with verified numbers and a
prior-art table (real repo links); CONTRIBUTING corrected (wrong test glob
that matched zero files, missing compressor row, stale savings-counter
mention, checklist aligned with the deliberate build-rules mirror).
Verified / Fixed (2026-07-07 re-verification)
- June benchmark numbers reproduced exactly from committed raw cells (billed
usage.output_tokens); metric now stated explicitly — on the alternative
visible-answer metric the June data held one RDXmin over-baseline cell. - Retired the "0 backfires" claim. A fresh 24-cell run against the
installed caveman/ponytail plugins produced one RDXmin backfire
(rest-graphql, 173% billed) vs caveman 5/6 (worst 424%) and ponytail 4/6.
Combined 20-task ledger: RDXmin 1, caveman 6, ponytail 8. All 24 fresh
answers graded correct — no accuracy loss in any arm. - Root-caused the backfire (comparison prompts → headed pro/con bullet walls,
structure the ruleset already banned but too weakly) and hardened the rule;
re-validated live at 93% of a fair 3-trial vanilla baseline (was 145%).
Writeup:benchmarks/results/2026-07-07-verify-rerun.md. - Fixed two-sources-of-truth bug:
scripts/build-rules.jscarried its own
rule BODY, so SKILL.md edits never reached the per-agent copies (CI checked
the copies against the same stale BODY — green while wrong). BODY updated +
labeled as a manual mirror. - Benchmark harness: competitor skills resolve from installed plugin cache,
arms run in parallel per task, fresh-run dir override (run-live.sh [model] [raw-dir],RAW_DIR=foraggregate.js).
[0.1.0] — 2026-06-29
Added
- Unified efficiency mode: zero-fluff prose + YAGNI-first code, always active together.
/rdx-audit— one-shot audit of a diff/file/repo across both axes: over-engineered
code and bloated prose/docs/comments, ranked biggest-cut-first. Neither a code-only
auditor nor a prose compressor does both; this is the union.- Reliability finding (14 tasks, 2 models): RDXmin never exceeded the no-tool token
baseline (worst case 83%), while caveman hit 130% once and ponytail 227% on 4 tasks. The
honest value prop is "no failure mode," not "tersest on every task." See
benchmarks/results/2026-06-29-reliability.md. /rdxcommand withlite/full/ultralevels; natural-language activation.- SessionStart + UserPromptSubmit hooks with symlink-safe flag handling (
O_NOFOLLOW, 0600). - Statusline badge
[RDX]/[RDX:ULTRA](bash + PowerShell). Shows plan rate-limit
usage + reset countdown, or session cost ($) on API keys — read from Claude's
statusline JSON, no extra API calls. No fabricated "tokens saved" counter (an earlier
build'sturns × 350estimate was removed; a live session has no baseline to measure against). npx rdxmininstaller — auto-detects 8 agents (Claude Code, Gemini, Codex,
Cursor, Windsurf, Cline, Kiro, Copilot) and installs for each. Flags:--list,
--only,--dry-run,--force,--uninstall,--config-dir,--help. Claude path
does a plugin install with automatic fallback to standalone hooks + JSONC-safe
settings.jsonmerge. Idempotent; clean round-trip uninstall.curl | bashandirm | iexshims delegating to the Node installer.- Multi-agent distribution: Cursor, Windsurf, Cline, Kiro, Codex, Gemini, Copilot rule copies, generated from one source via
scripts/build-rules.js. - Live 4-arm benchmark (
benchmarks/run-live.sh+aggregate.js): vanilla vs
caveman vs ponytail vs rdxmin over 24 real model runs, isolated so the arm is the
only variable. Raw outputs committed underbenchmarks/results/raw/. README chart and
numbers are generated from this real data (replacing an earlier chart modeled from
hand-authored examples). Finding: rdxmin is leanest on coding tasks; on pure prose a
dedicated prose compressor wins — stated plainly, not cherry-picked. - Chart generator (
scripts/build-chart.js, reliability worst-case from real cells) + promptfoo config. - npm trusted publishing (OIDC, provenance) + GitHub Release workflow on
v*tags. - Test suite: 34 tests across flag safety, tracker, settings merge, installer integration. CI on Node 18/20/22.
Fixed
- Deactivation no longer triggers on unrelated sentences that merely mention "rdx"
alongside "off"/"stop" (e.g. "use rdx to turn off the logger"). Now requires the
off-verb to target rdx directly. Regression-tested.
Notes
- Statusline reads live rate-limit/cost from Claude's JSON; no per-session "savings" figure is invented.
- Example outputs are representative/illustrative; the measurement over them is reproducible.
Full Changelog: v1.2.1...v1.2.2
v1.2.1
Changelog
All notable changes to RDXmin are documented here.
Format loosely follows Keep a Changelog.
[1.2.1] — 2026-07-11
Fixed
- Windows statusline never rendered —
rdx-statusline.ps1combined
Get-Content -Raw -TotalCount, which are mutually exclusive in every
PowerShell; the throw was swallowed bySilentlyContinue, the empty mode
hit the whitelist default, and the badge silently exited. Cap the string
after a plain-Rawread instead. Reported by
@TDimovski (#1). rdx-statusline.ps1now refuses symlinked/reparse-point flag and stats
files, matching the.shguard.
[1.2.0] — 2026-07-09
Added
- Major-version update notice on session start (registry check cached 3 days,
RDX_UPDATE_CHECK=0kill switch). - Contributor credits:
package.jsoncontributors, README contributors
section with auto-updating contrib.rocks image.
Changed
- CI: actions bumped to v5; publish step idempotent (skips versions already
on npm).
[1.1.0] — 2026-07-07
Same content as 0.2.0 plus the total-bill chart redesign. The version jumps
past 1.0.0 because the repo's very first commit shipped "version": "1.0.0"
before being re-numbered to 0.1.0 — plugin resolvers with that payload cached
treat every 0.x release as a downgrade and silently keep serving the ancient
code. 1.0.0 is skipped forever; nothing may ever claim it again.
[0.2.0] — 2026-07-07
Added
- Tool-output compression (input axis) —
PostToolUsehook
(hooks/rdx-compress-output.js) elides the middle of oversized tool results
before the model reads them: head + tail kept, up to 12 error-like lines
salvaged from the cut. Deterministic, zero LLM, zero network, zero deps.
Allowlist-only for correctness (Bash/Agent/WebFetch/WebSearch/Grep/Glob/
mcp__*— never Read/Edit/Write, whose exact bytes feed later edits).
Thresholds track the/rdxlevel (lite 16k / full 8k / ultra 5k chars);
env-tunable;RDX_COMPRESS=0kill switch. Wired via plugin manifest and the
standalone installer (settings merge grewmatchersupport). - Measured, not estimated: across 171 real transcripts, tool output is
67.5% of context content; the shipped compressor replayed over that corpus
shrinks eligible outputs ~46% (receipts + reproducible replay script:
benchmarks/replay-compress.js,benchmarks/results/2026-07-07-input-axis.md). - Savings ledger (
.rdx-compress-stats.json, measured chars elided) rendered
by both statuslines as⇣9k tok— this one has a real baseline, unlike the
fabricated output-side counter removed in 0.1.0. - Context Diet ruleset section (all 8 agents): fetch the slice, not the
file — Grep before Read, offset/limit reads, filter long output at the
source. Prevention for theReadwhale the compressor must not touch. - 15 new tests (compressor correctness guardrails, allowlist, kill switch,
never-throws). Suite: 49.
Added (2026-07-07, second pass)
- Scrub tier (lossless) in the output compressor: ANSI/OSC escape strip,
blank-run collapse,line repeated N×collapse — applies to medium outputs
below the elision threshold. Techniques adapted from headroom's transform
set, implemented zero-dep. Replay: 53 outputs touched in full mode (was 39),
~61k tokens one-shot on the measured corpus. - Dedup tier: a tool output byte-identical to that tool's previous output
in the same session becomes a one-line marker (the copy is already in
context). Session-scoped by hooksession_id— never fires across sessions,
where the earlier copy wouldn't be in context; skipped when no session id.
0 hits in the replay corpus — labeled speculative,RDX_COMPRESS_DEDUP=0. - README rebuilt around the three-axis story with verified numbers and a
prior-art table (real repo links); CONTRIBUTING corrected (wrong test glob
that matched zero files, missing compressor row, stale savings-counter
mention, checklist aligned with the deliberate build-rules mirror).
Verified / Fixed (2026-07-07 re-verification)
- June benchmark numbers reproduced exactly from committed raw cells (billed
usage.output_tokens); metric now stated explicitly — on the alternative
visible-answer metric the June data held one RDXmin over-baseline cell. - Retired the "0 backfires" claim. A fresh 24-cell run against the
installed caveman/ponytail plugins produced one RDXmin backfire
(rest-graphql, 173% billed) vs caveman 5/6 (worst 424%) and ponytail 4/6.
Combined 20-task ledger: RDXmin 1, caveman 6, ponytail 8. All 24 fresh
answers graded correct — no accuracy loss in any arm. - Root-caused the backfire (comparison prompts → headed pro/con bullet walls,
structure the ruleset already banned but too weakly) and hardened the rule;
re-validated live at 93% of a fair 3-trial vanilla baseline (was 145%).
Writeup:benchmarks/results/2026-07-07-verify-rerun.md. - Fixed two-sources-of-truth bug:
scripts/build-rules.jscarried its own
rule BODY, so SKILL.md edits never reached the per-agent copies (CI checked
the copies against the same stale BODY — green while wrong). BODY updated +
labeled as a manual mirror. - Benchmark harness: competitor skills resolve from installed plugin cache,
arms run in parallel per task, fresh-run dir override (run-live.sh [model] [raw-dir],RAW_DIR=foraggregate.js).
[0.1.0] — 2026-06-29
Added
- Unified efficiency mode: zero-fluff prose + YAGNI-first code, always active together.
/rdx-audit— one-shot audit of a diff/file/repo across both axes: over-engineered
code and bloated prose/docs/comments, ranked biggest-cut-first. Neither a code-only
auditor nor a prose compressor does both; this is the union.- Reliability finding (14 tasks, 2 models): RDXmin never exceeded the no-tool token
baseline (worst case 83%), while caveman hit 130% once and ponytail 227% on 4 tasks. The
honest value prop is "no failure mode," not "tersest on every task." See
benchmarks/results/2026-06-29-reliability.md. /rdxcommand withlite/full/ultralevels; natural-language activation.- SessionStart + UserPromptSubmit hooks with symlink-safe flag handling (
O_NOFOLLOW, 0600). - Statusline badge
[RDX]/[RDX:ULTRA](bash + PowerShell). Shows plan rate-limit
usage + reset countdown, or session cost ($) on API keys — read from Claude's
statusline JSON, no extra API calls. No fabricated "tokens saved" counter (an earlier
build'sturns × 350estimate was removed; a live session has no baseline to measure against). npx rdxmininstaller — auto-detects 8 agents (Claude Code, Gemini, Codex,
Cursor, Windsurf, Cline, Kiro, Copilot) and installs for each. Flags:--list,
--only,--dry-run,--force,--uninstall,--config-dir,--help. Claude path
does a plugin install with automatic fallback to standalone hooks + JSONC-safe
settings.jsonmerge. Idempotent; clean round-trip uninstall.curl | bashandirm | iexshims delegating to the Node installer.- Multi-agent distribution: Cursor, Windsurf, Cline, Kiro, Codex, Gemini, Copilot rule copies, generated from one source via
scripts/build-rules.js. - Live 4-arm benchmark (
benchmarks/run-live.sh+aggregate.js): vanilla vs
caveman vs ponytail vs rdxmin over 24 real model runs, isolated so the arm is the
only variable. Raw outputs committed underbenchmarks/results/raw/. README chart and
numbers are generated from this real data (replacing an earlier chart modeled from
hand-authored examples). Finding: rdxmin is leanest on coding tasks; on pure prose a
dedicated prose compressor wins — stated plainly, not cherry-picked. - Chart generator (
scripts/build-chart.js, reliability worst-case from real cells) + promptfoo config. - npm trusted publishing (OIDC, provenance) + GitHub Release workflow on
v*tags. - Test suite: 34 tests across flag safety, tracker, settings merge, installer integration. CI on Node 18/20/22.
Fixed
- Deactivation no longer triggers on unrelated sentences that merely mention "rdx"
alongside "off"/"stop" (e.g. "use rdx to turn off the logger"). Now requires the
off-verb to target rdx directly. Regression-tested.
Notes
- Statusline reads live rate-limit/cost from Claude's JSON; no per-session "savings" figure is invented.
- Example outputs are representative/illustrative; the measurement over them is reproducible.
Full Changelog: v1.1.1...v1.2.1
v1.2.0
Changelog
All notable changes to RDXmin are documented here.
Format loosely follows Keep a Changelog.
[1.1.0] — 2026-07-07
Same content as 0.2.0 plus the total-bill chart redesign. The version jumps
past 1.0.0 because the repo's very first commit shipped "version": "1.0.0"
before being re-numbered to 0.1.0 — plugin resolvers with that payload cached
treat every 0.x release as a downgrade and silently keep serving the ancient
code. 1.0.0 is skipped forever; nothing may ever claim it again.
[0.2.0] — 2026-07-07
Added
- Tool-output compression (input axis) —
PostToolUsehook
(hooks/rdx-compress-output.js) elides the middle of oversized tool results
before the model reads them: head + tail kept, up to 12 error-like lines
salvaged from the cut. Deterministic, zero LLM, zero network, zero deps.
Allowlist-only for correctness (Bash/Agent/WebFetch/WebSearch/Grep/Glob/
mcp__*— never Read/Edit/Write, whose exact bytes feed later edits).
Thresholds track the/rdxlevel (lite 16k / full 8k / ultra 5k chars);
env-tunable;RDX_COMPRESS=0kill switch. Wired via plugin manifest and the
standalone installer (settings merge grewmatchersupport). - Measured, not estimated: across 171 real transcripts, tool output is
67.5% of context content; the shipped compressor replayed over that corpus
shrinks eligible outputs ~46% (receipts + reproducible replay script:
benchmarks/replay-compress.js,benchmarks/results/2026-07-07-input-axis.md). - Savings ledger (
.rdx-compress-stats.json, measured chars elided) rendered
by both statuslines as⇣9k tok— this one has a real baseline, unlike the
fabricated output-side counter removed in 0.1.0. - Context Diet ruleset section (all 8 agents): fetch the slice, not the
file — Grep before Read, offset/limit reads, filter long output at the
source. Prevention for theReadwhale the compressor must not touch. - 15 new tests (compressor correctness guardrails, allowlist, kill switch,
never-throws). Suite: 49.
Added (2026-07-07, second pass)
- Scrub tier (lossless) in the output compressor: ANSI/OSC escape strip,
blank-run collapse,line repeated N×collapse — applies to medium outputs
below the elision threshold. Techniques adapted from headroom's transform
set, implemented zero-dep. Replay: 53 outputs touched in full mode (was 39),
~61k tokens one-shot on the measured corpus. - Dedup tier: a tool output byte-identical to that tool's previous output
in the same session becomes a one-line marker (the copy is already in
context). Session-scoped by hooksession_id— never fires across sessions,
where the earlier copy wouldn't be in context; skipped when no session id.
0 hits in the replay corpus — labeled speculative,RDX_COMPRESS_DEDUP=0. - README rebuilt around the three-axis story with verified numbers and a
prior-art table (real repo links); CONTRIBUTING corrected (wrong test glob
that matched zero files, missing compressor row, stale savings-counter
mention, checklist aligned with the deliberate build-rules mirror).
Verified / Fixed (2026-07-07 re-verification)
- June benchmark numbers reproduced exactly from committed raw cells (billed
usage.output_tokens); metric now stated explicitly — on the alternative
visible-answer metric the June data held one RDXmin over-baseline cell. - Retired the "0 backfires" claim. A fresh 24-cell run against the
installed caveman/ponytail plugins produced one RDXmin backfire
(rest-graphql, 173% billed) vs caveman 5/6 (worst 424%) and ponytail 4/6.
Combined 20-task ledger: RDXmin 1, caveman 6, ponytail 8. All 24 fresh
answers graded correct — no accuracy loss in any arm. - Root-caused the backfire (comparison prompts → headed pro/con bullet walls,
structure the ruleset already banned but too weakly) and hardened the rule;
re-validated live at 93% of a fair 3-trial vanilla baseline (was 145%).
Writeup:benchmarks/results/2026-07-07-verify-rerun.md. - Fixed two-sources-of-truth bug:
scripts/build-rules.jscarried its own
rule BODY, so SKILL.md edits never reached the per-agent copies (CI checked
the copies against the same stale BODY — green while wrong). BODY updated +
labeled as a manual mirror. - Benchmark harness: competitor skills resolve from installed plugin cache,
arms run in parallel per task, fresh-run dir override (run-live.sh [model] [raw-dir],RAW_DIR=foraggregate.js).
[0.1.0] — 2026-06-29
Added
- Unified efficiency mode: zero-fluff prose + YAGNI-first code, always active together.
/rdx-audit— one-shot audit of a diff/file/repo across both axes: over-engineered
code and bloated prose/docs/comments, ranked biggest-cut-first. Neither a code-only
auditor nor a prose compressor does both; this is the union.- Reliability finding (14 tasks, 2 models): RDXmin never exceeded the no-tool token
baseline (worst case 83%), while caveman hit 130% once and ponytail 227% on 4 tasks. The
honest value prop is "no failure mode," not "tersest on every task." See
benchmarks/results/2026-06-29-reliability.md. /rdxcommand withlite/full/ultralevels; natural-language activation.- SessionStart + UserPromptSubmit hooks with symlink-safe flag handling (
O_NOFOLLOW, 0600). - Statusline badge
[RDX]/[RDX:ULTRA](bash + PowerShell). Shows plan rate-limit
usage + reset countdown, or session cost ($) on API keys — read from Claude's
statusline JSON, no extra API calls. No fabricated "tokens saved" counter (an earlier
build'sturns × 350estimate was removed; a live session has no baseline to measure against). npx rdxmininstaller — auto-detects 8 agents (Claude Code, Gemini, Codex,
Cursor, Windsurf, Cline, Kiro, Copilot) and installs for each. Flags:--list,
--only,--dry-run,--force,--uninstall,--config-dir,--help. Claude path
does a plugin install with automatic fallback to standalone hooks + JSONC-safe
settings.jsonmerge. Idempotent; clean round-trip uninstall.curl | bashandirm | iexshims delegating to the Node installer.- Multi-agent distribution: Cursor, Windsurf, Cline, Kiro, Codex, Gemini, Copilot rule copies, generated from one source via
scripts/build-rules.js. - Live 4-arm benchmark (
benchmarks/run-live.sh+aggregate.js): vanilla vs
caveman vs ponytail vs rdxmin over 24 real model runs, isolated so the arm is the
only variable. Raw outputs committed underbenchmarks/results/raw/. README chart and
numbers are generated from this real data (replacing an earlier chart modeled from
hand-authored examples). Finding: rdxmin is leanest on coding tasks; on pure prose a
dedicated prose compressor wins — stated plainly, not cherry-picked. - Chart generator (
scripts/build-chart.js, reliability worst-case from real cells) + promptfoo config. - npm trusted publishing (OIDC, provenance) + GitHub Release workflow on
v*tags. - Test suite: 34 tests across flag safety, tracker, settings merge, installer integration. CI on Node 18/20/22.
Fixed
- Deactivation no longer triggers on unrelated sentences that merely mention "rdx"
alongside "off"/"stop" (e.g. "use rdx to turn off the logger"). Now requires the
off-verb to target rdx directly. Regression-tested.
Notes
- Statusline reads live rate-limit/cost from Claude's JSON; no per-session "savings" figure is invented.
- Example outputs are representative/illustrative; the measurement over them is reproducible.
Full Changelog: v1.1.2...v1.2.0
v1.1.1
Changelog
All notable changes to RDXmin are documented here.
Format loosely follows Keep a Changelog.
[1.1.0] — 2026-07-07
Same content as 0.2.0 plus the total-bill chart redesign. The version jumps
past 1.0.0 because the repo's very first commit shipped "version": "1.0.0"
before being re-numbered to 0.1.0 — plugin resolvers with that payload cached
treat every 0.x release as a downgrade and silently keep serving the ancient
code. 1.0.0 is skipped forever; nothing may ever claim it again.
[0.2.0] — 2026-07-07
Added
- Tool-output compression (input axis) —
PostToolUsehook
(hooks/rdx-compress-output.js) elides the middle of oversized tool results
before the model reads them: head + tail kept, up to 12 error-like lines
salvaged from the cut. Deterministic, zero LLM, zero network, zero deps.
Allowlist-only for correctness (Bash/Agent/WebFetch/WebSearch/Grep/Glob/
mcp__*— never Read/Edit/Write, whose exact bytes feed later edits).
Thresholds track the/rdxlevel (lite 16k / full 8k / ultra 5k chars);
env-tunable;RDX_COMPRESS=0kill switch. Wired via plugin manifest and the
standalone installer (settings merge grewmatchersupport). - Measured, not estimated: across 171 real transcripts, tool output is
67.5% of context content; the shipped compressor replayed over that corpus
shrinks eligible outputs ~46% (receipts + reproducible replay script:
benchmarks/replay-compress.js,benchmarks/results/2026-07-07-input-axis.md). - Savings ledger (
.rdx-compress-stats.json, measured chars elided) rendered
by both statuslines as⇣9k tok— this one has a real baseline, unlike the
fabricated output-side counter removed in 0.1.0. - Context Diet ruleset section (all 8 agents): fetch the slice, not the
file — Grep before Read, offset/limit reads, filter long output at the
source. Prevention for theReadwhale the compressor must not touch. - 15 new tests (compressor correctness guardrails, allowlist, kill switch,
never-throws). Suite: 49.
Added (2026-07-07, second pass)
- Scrub tier (lossless) in the output compressor: ANSI/OSC escape strip,
blank-run collapse,line repeated N×collapse — applies to medium outputs
below the elision threshold. Techniques adapted from headroom's transform
set, implemented zero-dep. Replay: 53 outputs touched in full mode (was 39),
~61k tokens one-shot on the measured corpus. - Dedup tier: a tool output byte-identical to that tool's previous output
in the same session becomes a one-line marker (the copy is already in
context). Session-scoped by hooksession_id— never fires across sessions,
where the earlier copy wouldn't be in context; skipped when no session id.
0 hits in the replay corpus — labeled speculative,RDX_COMPRESS_DEDUP=0. - README rebuilt around the three-axis story with verified numbers and a
prior-art table (real repo links); CONTRIBUTING corrected (wrong test glob
that matched zero files, missing compressor row, stale savings-counter
mention, checklist aligned with the deliberate build-rules mirror).
Verified / Fixed (2026-07-07 re-verification)
- June benchmark numbers reproduced exactly from committed raw cells (billed
usage.output_tokens); metric now stated explicitly — on the alternative
visible-answer metric the June data held one RDXmin over-baseline cell. - Retired the "0 backfires" claim. A fresh 24-cell run against the
installed caveman/ponytail plugins produced one RDXmin backfire
(rest-graphql, 173% billed) vs caveman 5/6 (worst 424%) and ponytail 4/6.
Combined 20-task ledger: RDXmin 1, caveman 6, ponytail 8. All 24 fresh
answers graded correct — no accuracy loss in any arm. - Root-caused the backfire (comparison prompts → headed pro/con bullet walls,
structure the ruleset already banned but too weakly) and hardened the rule;
re-validated live at 93% of a fair 3-trial vanilla baseline (was 145%).
Writeup:benchmarks/results/2026-07-07-verify-rerun.md. - Fixed two-sources-of-truth bug:
scripts/build-rules.jscarried its own
rule BODY, so SKILL.md edits never reached the per-agent copies (CI checked
the copies against the same stale BODY — green while wrong). BODY updated +
labeled as a manual mirror. - Benchmark harness: competitor skills resolve from installed plugin cache,
arms run in parallel per task, fresh-run dir override (run-live.sh [model] [raw-dir],RAW_DIR=foraggregate.js).
[0.1.0] — 2026-06-29
Added
- Unified efficiency mode: zero-fluff prose + YAGNI-first code, always active together.
/rdx-audit— one-shot audit of a diff/file/repo across both axes: over-engineered
code and bloated prose/docs/comments, ranked biggest-cut-first. Neither a code-only
auditor nor a prose compressor does both; this is the union.- Reliability finding (14 tasks, 2 models): RDXmin never exceeded the no-tool token
baseline (worst case 83%), while caveman hit 130% once and ponytail 227% on 4 tasks. The
honest value prop is "no failure mode," not "tersest on every task." See
benchmarks/results/2026-06-29-reliability.md. /rdxcommand withlite/full/ultralevels; natural-language activation.- SessionStart + UserPromptSubmit hooks with symlink-safe flag handling (
O_NOFOLLOW, 0600). - Statusline badge
[RDX]/[RDX:ULTRA](bash + PowerShell). Shows plan rate-limit
usage + reset countdown, or session cost ($) on API keys — read from Claude's
statusline JSON, no extra API calls. No fabricated "tokens saved" counter (an earlier
build'sturns × 350estimate was removed; a live session has no baseline to measure against). npx rdxmininstaller — auto-detects 8 agents (Claude Code, Gemini, Codex,
Cursor, Windsurf, Cline, Kiro, Copilot) and installs for each. Flags:--list,
--only,--dry-run,--force,--uninstall,--config-dir,--help. Claude path
does a plugin install with automatic fallback to standalone hooks + JSONC-safe
settings.jsonmerge. Idempotent; clean round-trip uninstall.curl | bashandirm | iexshims delegating to the Node installer.- Multi-agent distribution: Cursor, Windsurf, Cline, Kiro, Codex, Gemini, Copilot rule copies, generated from one source via
scripts/build-rules.js. - Live 4-arm benchmark (
benchmarks/run-live.sh+aggregate.js): vanilla vs
caveman vs ponytail vs rdxmin over 24 real model runs, isolated so the arm is the
only variable. Raw outputs committed underbenchmarks/results/raw/. README chart and
numbers are generated from this real data (replacing an earlier chart modeled from
hand-authored examples). Finding: rdxmin is leanest on coding tasks; on pure prose a
dedicated prose compressor wins — stated plainly, not cherry-picked. - Chart generator (
scripts/build-chart.js, reliability worst-case from real cells) + promptfoo config. - npm trusted publishing (OIDC, provenance) + GitHub Release workflow on
v*tags. - Test suite: 34 tests across flag safety, tracker, settings merge, installer integration. CI on Node 18/20/22.
Fixed
- Deactivation no longer triggers on unrelated sentences that merely mention "rdx"
alongside "off"/"stop" (e.g. "use rdx to turn off the logger"). Now requires the
off-verb to target rdx directly. Regression-tested.
Notes
- Statusline reads live rate-limit/cost from Claude's JSON; no per-session "savings" figure is invented.
- Example outputs are representative/illustrative; the measurement over them is reproducible.
Full Changelog: v1.1.0...v1.1.1