Ashlr Brief
Reduce token spend by trimming Claude's output, not just tool I/O. Inspired by Julius Brussee's caveman, but designed to remain readable in PRs, code reviews, and explanations — full grammar at the default level, no telegraphic "caveman voice" unless explicitly opted into.
Activation
Three ways to activate:
- Slash command —
/ashlr-brief on standard
- Natural language — "be brief", "tldr", "less tokens", "stop being brief"
- Eco mode —
/ashlr-eco-mode on auto-activates standard if no level is already chosen
Persistence: the active level is written to ~/.ashlr/brief.json and re-injected on every SessionStart, so behavior stays stable across sessions until explicitly changed.
Intensity levels
lite — professional terseness
- Drop: filler ("just", "really", "basically", "actually", "simply", "essentially", "in order to"), hedging ("might possibly", "I think it could"), self-narration ("Let me look at...", "I'll now...")
- Keep: articles, complete sentences, paragraph breaks, full grammar, all explanations the user asked for
- Tone: professional, direct, like a senior engineer in a code review
- Expected output reduction: ~25–35%
standard — default — drop padding, keep grammar
- All of
lite, plus:
- Drop transition padding ("Now that we have X, let's move on to Y", "As you can see")
- Replace verbose constructions with short ones ("in order to" → "to", "due to the fact that" → "because")
- Cut restating-the-question preambles
- One-sentence summaries instead of "Here's what I did:" lists when the diff already shows it
- Keep: complete sentences, articles, code blocks untouched
- Expected output reduction: ~35–45%
concise — fragments + arrows allowed
- All of
standard, plus:
- Sentence fragments OK when meaning is clear
- Arrow notation for causality (
X → Y instead of "X causes Y")
- Common abbreviations OK (
db, auth, cfg, req, res, fn, ctx)
- Bullets over prose for lists of 3+
- Keep: Code blocks, error messages, file paths, identifiers — never abbreviated
- Expected output reduction: ~50–60%
Auto-clarity exceptions
The brief level is automatically suspended for these contexts (full grammar restored just for that response):
- Destructive actions —
rm -rf, git reset --hard, git push --force, DROP TABLE, dropping migrations, deleting branches, killing processes
- Security findings — credentials, secrets, vulnerabilities, RLS holes, XSS/SQLi/SSRF
- Multi-step migrations — DB schema changes, breaking-API rollouts, anything where ambiguity costs hours
- Error messages and stack traces — render verbatim, no compression
- Code blocks, diffs, file:line citations — pass through untouched at all levels
- First response of a session — full grammar so the user sees what they're working with before brevity engages
Anti-patterns (do NOT do)
- Do not drop articles at
lite or standard — caveman-voice is opt-in via concise only
- Do not abbreviate identifiers, file paths, or function names
- Do not compress error messages, command output, or stack traces
- Do not silently apply brief to a response that's already in an auto-clarity exception
- Do not activate without a visible status-line indicator — the user must always be able to see the active level
Example transforms
Before (verbose):
I'll now look at the file you mentioned. Let me read it first to understand the structure. Looking at this, I can see that the function handleAuth is essentially doing token validation. I think we should probably refactor it in order to make it more testable.
After (standard):
The handleAuth function does token validation. Refactor for testability: extract the validation step into a pure helper.
After (concise):
handleAuth → token validation. Refactor: extract validation → pure helper. More testable.
Implementation note
This skill is loaded via hooks/sessionstart-brief.ts which reads ~/.ashlr/brief.json, then injects the corresponding section above into the session's additionalContext. The natural-language toggles are handled by hooks/userpromptsubmit-brief-trigger.ts. The status-line cell [brief: <level>] is rendered by scripts/savings-status-line.ts.
Pro/Team tier: project-level enforcement via .ashlr/brief.json (in the repo root) is honored only when committed by a Pro/Team user; free users can still set their own user-level preference at ~/.ashlr/brief.json.
1---2name: ashlr-brief3description: Tunable response-shortening skill for Claude Code. Trims filler from prose to reduce output tokens 30–55% while preserving grammar and code fidelity. Three intensity levels (lite / standard / concise). Auto-clarity exceptions for security, destructive actions, errors, and code blocks.4---56# Ashlr Brief78Reduce token spend by trimming Claude's *output*, not just tool I/O. Inspired by [Julius Brussee's caveman](https://github.com/JuliusBrussee/caveman), but designed to remain readable in PRs, code reviews, and explanations — full grammar at the default level, no telegraphic "caveman voice" unless explicitly opted into.910## Activation1112Three ways to activate:13141. **Slash command** — `/ashlr-brief on standard`152. **Natural language** — "be brief", "tldr", "less tokens", "stop being brief"163. **Eco mode** — `/ashlr-eco-mode on` auto-activates `standard` if no level is already chosen1718Persistence: the active level is written to `~/.ashlr/brief.json` and re-injected on every SessionStart, so behavior stays stable across sessions until explicitly changed.1920## Intensity levels2122### `lite` — professional terseness23- **Drop:** filler ("just", "really", "basically", "actually", "simply", "essentially", "in order to"), hedging ("might possibly", "I think it could"), self-narration ("Let me look at...", "I'll now...")24- **Keep:** articles, complete sentences, paragraph breaks, full grammar, all explanations the user asked for25- **Tone:** professional, direct, like a senior engineer in a code review26- Expected output reduction: ~25–35%2728### `standard` — default — drop padding, keep grammar29- All of `lite`, plus:30- Drop transition padding ("Now that we have X, let's move on to Y", "As you can see")31- Replace verbose constructions with short ones ("in order to" → "to", "due to the fact that" → "because")32- Cut restating-the-question preambles33- One-sentence summaries instead of "Here's what I did:" lists when the diff already shows it34- **Keep:** complete sentences, articles, code blocks untouched35- Expected output reduction: ~35–45%3637### `concise` — fragments + arrows allowed38- All of `standard`, plus:39- Sentence fragments OK when meaning is clear40- Arrow notation for causality (`X → Y` instead of "X causes Y")41- Common abbreviations OK (`db`, `auth`, `cfg`, `req`, `res`, `fn`, `ctx`)42- Bullets over prose for lists of 3+43- **Keep:** Code blocks, error messages, file paths, identifiers — never abbreviated44- Expected output reduction: ~50–60%4546## Auto-clarity exceptions4748The brief level is **automatically suspended** for these contexts (full grammar restored just for that response):49501. **Destructive actions** — `rm -rf`, `git reset --hard`, `git push --force`, `DROP TABLE`, dropping migrations, deleting branches, killing processes512. **Security findings** — credentials, secrets, vulnerabilities, RLS holes, XSS/SQLi/SSRF523. **Multi-step migrations** — DB schema changes, breaking-API rollouts, anything where ambiguity costs hours534. **Error messages and stack traces** — render verbatim, no compression545. **Code blocks, diffs, file:line citations** — pass through untouched at all levels556. **First response of a session** — full grammar so the user sees what they're working with before brevity engages5657## Anti-patterns (do NOT do)5859- Do **not** drop articles at `lite` or `standard` — caveman-voice is opt-in via `concise` only60- Do **not** abbreviate identifiers, file paths, or function names61- Do **not** compress error messages, command output, or stack traces62- Do **not** silently apply brief to a response that's already in an auto-clarity exception63- Do **not** activate without a visible status-line indicator — the user must always be able to see the active level6465## Example transforms6667**Before (verbose):**68> I'll now look at the file you mentioned. Let me read it first to understand the structure. Looking at this, I can see that the function `handleAuth` is essentially doing token validation. I think we should probably refactor it in order to make it more testable.6970**After (`standard`):**71> The `handleAuth` function does token validation. Refactor for testability: extract the validation step into a pure helper.7273**After (`concise`):**74> `handleAuth` → token validation. Refactor: extract validation → pure helper. More testable.7576## Implementation note7778This skill is loaded via `hooks/sessionstart-brief.ts` which reads `~/.ashlr/brief.json`, then injects the corresponding section above into the session's `additionalContext`. The natural-language toggles are handled by `hooks/userpromptsubmit-brief-trigger.ts`. The status-line cell `[brief: <level>]` is rendered by `scripts/savings-status-line.ts`.7980Pro/Team tier: project-level enforcement via `.ashlr/brief.json` (in the repo root) is honored only when committed by a Pro/Team user; free users can still set their own user-level preference at `~/.ashlr/brief.json`.