arbiterforge/ca-prune
Trim transcript clutter to extend session lifetime — analyze, prune a copy, or toggle the after-each-turn service. Dry-run by default; gains land at resume/compaction, not the current turn.
npx skills add https://github.com/arbiterForge/codeArbiter --skill ca-prune
Long sessions die when their semantic history fills the context window with bulk: oversized tool
outputs, thinking blocks, MCP/shell noise, stale file reads, and host-specific sidecars. The shared
policy trims that bulk at safe quiescence boundaries while each host codec preserves its native
integrity model and the K most recent tool-bearing turns verbatim. Claude keeps byte-safe JSONL
serialization; Pi uses semantic entries and returns a native custom-compaction result.
Gains land at the host's next native resume/restart or compaction boundary, not by mutating the
running session's active file. Pi-native compaction is event-driven and never rewrites an active
Pi session file.
$ARGUMENTS is one of:
status (default) — report cumulative reduction and service state for this session from~/.codearbiter/prune-state.json, and whether CODEARBITER_PRUNE is on/dry/off. When
the service has run in dry mode, every would-be prune is also recorded — one JSONL row per
decision, across all sessions — to the shared data-collection log
~/.codearbiter/metrics/prune-dry.jsonl (override with CODEARBITER_PRUNE_METRICS). That log is
the evidence base for the dry→on decision: a clean record (every row verdict: dry-run,
validation_errors: 0) over a representative set of sessions is the signal that enabling is safe.
Read context_bytes_freed / context_est_tokens_freed for model-context benefit and
file_bytes_freed / file_pct for disk and resume-parse benefit. sidecar-collapse is explicitly
file-only; it must not count toward the context-benefit or cold-cache decision.
The legacy freed_bytes, pct, and est_tokens_before / est_tokens_after fields remain
whole-file compatibility aliases; do not use them as model-context evidence.
dry — create a read-only semantic plan (or analyze a scratch copy where the host exposes aserialized transcript); present the per-strategy reduction table with every strategy labeled
context or file-only. Never writes the active session.
run <path> — prune the target with --execute. Targets a **copy or an old/inactivetranscript only** — the tool refuses an active or recently-modified target by construction.
audit <path> — read-only integrity report: line-parse, uuid chain, tool-pair coverage,condensation markers.
on / off — guidance on enabling or disabling the after-each-turn service. python3 "<plugin-root>/hooks/prune-transcript.py" <subcommand> [<path>] || python "<plugin-root>/hooks/prune-transcript.py" <subcommand> [<path>]
For serialized hosts, dry analyzes <path>.copy.jsonl; Pi active sessions use the native
semantic planner and return a custom compaction result without session-file writes.
python3 "<plugin-root>/hooks/prune-transcript.py" <path> --execute [--tier T] || python "<plugin-root>/hooks/prune-transcript.py" <path> --execute [--tier T]
Present the per-strategy reduction report; follow with audit on the result.
UserPromptSubmit and PreCompact hooksprune at safe quiescence points, always exit 0, and never block the prompt. Tiers: gentle
(sidecar + oversize clamp), standard (+ reasoning fold, aged/MCP/shell), aggressive
(+ stale-read, reminder dedup, image evict). Config via CODEARBITER_PRUNE (off|dry|on,
ships off), CODEARBITER_PRUNE_TIER, CODEARBITER_PRUNE_KEEP_RECENT (the K most recent
tool turns kept verbatim — each turn is an assistant tool_use plus its results),
CODEARBITER_PRUNE_MAXBYTES. Enabling is the user's explicit choice — never set it unbidden.
In dry mode the service writes no transcript but appends each would-be prune to
~/.codearbiter/metrics/prune-dry.jsonl (path override: CODEARBITER_PRUNE_METRICS) for
data collection; in on mode the executed prunes are recorded in ~/.codearbiter/prune.log.
If a prior service-mode prune was killed mid-write, the next run self-heals the transcript
from the newest backup in ~/.codearbiter/prune-backups/ before doing anything else.
Cold-miss nudge [Feature Forge — preview]: when CODEARBITER_PRUNE is on, an
optional submit-time speed bump warns once before a cold cache re-cache lands on bloated
context. Enable with CODEARBITER_PRUNE_NUDGE=on (default off). When all arming conditions
hold (idle ≥ CODEARBITER_PRUNE_NUDGE_IDLE_SECS, default 240 s; estimated model-context
tokens freed ≥
CODEARBITER_PRUNE_NUDGE_MIN_TOKENS, default 80 000), the hook blocks the submit once with
an advisory on stderr and returns exit code 2. File-only sidecar reduction never arms it. The
advisory names the approximate avoidable context-token count and the host-native actions that
move the re-cache to pruned context:
native compaction or a normal exit + resume/restart. Resubmitting immediately proceeds. The block fires at most
once per cold window; a subsequent warm submit (idle < floor) resets the window so the next
genuine cold stretch re-arms. The gate is strictly opt-in, never fires in dry/off mode,
and fails open on any error — a pruner fault will never block the session.
/ca-doctor./ca-status.--execute against the live session's transcript — the tool refuses arecently-modified file by construction; manual run targets copies or old sessions only.
active-file context drop.
CODEARBITER_PRUNE=on) on behalf of the user — explain and letthem decide.
Take arbiterforge/ca-prune from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.