---
-A [Claude Code](https://docs.anthropic.com/en/docs/claude-code) skill/plugin (also Codex, Gemini, Cursor, Windsurf, Cline, Copilot, 30+ more) that makes agent talk like caveman — cuts **~50–65% of output tokens, measured** (65% average vs default verbose replies, ~50% median vs a plain "answer concisely" baseline — real Claude API token counts, see [Benchmarks](#benchmarks)), keeps full technical accuracy. Brain still big. Mouth small.
-
-> **Honest number warning:** caveman shrink **output** tokens only. Input tokens untouched by skill — whole-session savings smaller than the output number, and on terse tasks can be negative. Full truth: [docs/HONEST-NUMBERS.md](./docs/HONEST-NUMBERS.md).
+Caveman is a skill/plugin for [Claude Code](https://docs.anthropic.com/en/docs/claude-code), Codex, Gemini, Cursor, Windsurf, Cline, Copilot, and 30+ other agents. Install once. Agent drops the filler and answers in tight caveman-speak, keeping code, commands, and errors byte-for-byte exact. You save output tokens on every reply, forever.
## Before / After
-
+
🗣️ Normal agent — 69 tokens
+
Caveman agent — 19 tokens
+
+
+
-### 🗣️ Normal Claude (69 tokens)
-
-> "The reason your React component is re-rendering is likely because you're creating a new object reference on each render cycle. When you pass an inline object as a prop, React's shallow comparison sees it as a different object every time, which triggers a re-render. I'd recommend using useMemo to memoize the object."
+> The reason your React component is re-rendering is likely because you're creating a new object reference on each render cycle. When you pass an inline object as a prop, React's shallow comparison sees it as a different object every time, which triggers a re-render. I'd recommend using useMemo to memoize the object.
-
+
-### Caveman Claude (19 tokens)
-
-> "New object ref each render. Inline object prop = new ref = re-render. Wrap in `useMemo`."
+> New object ref each render. Inline object prop = new ref = re-render. Wrap in `useMemo`.
-
+
-### 🗣️ Normal Claude
-
-> "Sure! I'd be happy to help you with that. The issue you're experiencing is most likely caused by your authentication middleware not properly validating the token expiry. Let me take a look and suggest a fix."
+> Sure! I'd be happy to help you with that. The issue you're experiencing is most likely caused by your authentication middleware not properly validating the token expiry. Let me take a look and suggest a fix.
-
+
-### Caveman Claude
-
-> "Bug in auth middleware. Token expiry check use `<` not `<=`. Fix:"
+> Bug in auth middleware. Token expiry check use `<` not `<=`. Fix:
-**Same fix. Half the word — sometimes way less. Brain still big.**
+Same fix. Third of the words. Nothing technical lost.
```
-┌──────────────────────────────────────┐
-│ OUTPUT TOKENS SAVED █████ 50-65% │
-│ INPUT TOKENS SAVED ─ 0% │
-│ TECHNICAL ACCURACY ████████ 100% │
-│ VIBES ████████ OOG │
-└──────────────────────────────────────┘
+┌────────────────────────────────────────────┐
+│ output tokens saved █████████ 50–65% │
+│ input tokens saved ░░░░░░░░░ 0% │
+│ technical accuracy █████████ 100% │
+│ vibes █████████ OOG │
+└────────────────────────────────────────────┘
```
-Pick your level of grunt — `lite` (drop filler), `full` (default caveman), `ultra` (telegraphic), or `wenyan` (classical Chinese, even shorter). One command switch. Cost go down forever.
-
-**Speak your tongue.** Caveman keep your language. You write Portuguese, caveman grunt Portuguese. Spanish, French, same. Compress the *style*, not the language. Code, command, error string stay exact.
-
-> "Novo ref de objeto cada render. Prop inline = novo ref = re-render. Envolva com `useMemo`."
-
-
-
-
-### Like this trick? Now get whole agent — **caveman-code**
-
-This skill shrink what agent **say**. **[caveman-code](https://github.com/JuliusBrussee/caveman-code)** shrink **everything** — full terminal coding agent, caveman top to bottom. **~2× fewer tokens than Codex** on identical tasks. 20+ providers · plan mode · autopilot goal loop · MIT.
-
-```bash
-npm install -g @juliusbrussee/caveman-code
-```
-
-[**▶ Try caveman-code now →**](https://github.com/JuliusBrussee/caveman-code) — *why use many token when whole agent save*
-
-
-
+Caveman no make brain smaller. Caveman make *mouth* smaller. Shrinks what the agent **says**, not what it knows.
## Install
-One line. Find every agent. Install for each.
+**One command. Finds every agent on your machine. Installs for each.**
```bash
-# macOS / Linux / WSL / Git Bash
+# macOS · Linux · WSL · Git Bash
curl -fsSL https://raw.githubusercontent.com/JuliusBrussee/caveman/main/install.sh | bash
+```
-# Windows (PowerShell 5.1+)
+```powershell
+# Windows · PowerShell 5.1+
irm https://raw.githubusercontent.com/JuliusBrussee/caveman/main/install.ps1 | iex
```
-~30 seconds. Needs Node ≥18. Skip agent you no have. Safe to re-run.
+~30 seconds. Needs Node ≥18. Skips agents you no have. Safe to re-run.
-**Trigger:** type `/caveman` or say "talk like caveman". Stop with "normal mode".
+> [!TIP]
+> **Turn it on:** type `/caveman` or say *"talk like caveman"*. **Turn it off:** say *"normal mode"*. On Claude Code, Codex, and Gemini it's already on from message one. No command needed.
-One agent only, manual command, or any of 30+ other agents → [**INSTALL.md**](./INSTALL.md).
-Install break? Open agent, say *"Read CLAUDE.md and INSTALL.md, install caveman for me."* Agent fix own brain.
+
+Install for one agent, or any of 30+ others
-## What You Get
+
-| Skill | What |
+Every agent has its own path (plugin, extension, rule file, or `npx skills add`). The full per-agent matrix, all flags, dry-run, and uninstall live in **[INSTALL.md](./INSTALL.md)**. A few common ones:
+
+```bash
+# Claude Code plugin
+claude plugin marketplace add JuliusBrussee/caveman && claude plugin install caveman@caveman
+
+# Gemini CLI extension
+gemini extensions install https://github.com/JuliusBrussee/caveman
+
+# Cursor / Windsurf / Cline / Codex / 30+ more, via the skills registry
+npx skills add JuliusBrussee/caveman -a cursor
+```
+
+**Install broke?** Open your agent in this repo and say: *"Read CLAUDE.md and INSTALL.md, install caveman for me."* Agent read repo, agent fix own brain. Snake eat tail.
+
+
+
+## Pick your grunt
+
+Six levels. Switch anytime with `/caveman `. Level sticks until you change it or the session ends.
+
+| Level | Same sentence, shrunk |
|---|---|
-| `/caveman [lite\|full\|ultra\|wenyan]` | Compress every reply. Levels stick until session end. |
-| `/caveman-commit` | Conventional Commit messages, ≤50 char subject. Why over what. |
+| *normal agent* | You should wrap the object in `useMemo`, since a new reference is created on every render. |
+| `lite` | Wrap object in `useMemo`. New ref created every render. |
+| `full` *(default)* | New ref each render. Wrap object in `useMemo`. |
+| `ultra` | New ref/render. `useMemo` it. |
+| `wenyan` | New ref every render, so wrap in `useMemo` — rendered in classical Chinese, shorter still. |
+
+> [!NOTE]
+> **Speak your tongue.** Caveman keeps your language. Write Portuguese, caveman grunt Portuguese. Spanish, French, same. It compresses the *style*, never translates. `wenyan` mode is the exception on purpose: classical Chinese packs the most meaning per token.
+
+## What you get
+
+| Command | What it does |
+|---|---|
+| `/caveman [lite\|full\|ultra\|wenyan]` | Compress every reply. Level sticks for the session. |
+| `/caveman-commit` | Conventional Commit messages, ≤50-char subject. Why over what. |
| `/caveman-review` | One-line PR comments: `L42: 🔴 bug: user null. Add guard.` |
-| `/caveman-stats` | Real session token usage + lifetime savings + USD. Tweetable line via `--share`. |
-| `/caveman-compress ` | Rewrite memory file (e.g. `CLAUDE.md`) into caveman-speak. Cuts ~46% input tokens every session. Code/URLs/paths byte-preserved. |
-| `caveman-shrink` | MCP middleware. Wraps any MCP server, compresses tool descriptions. [npm](https://www.npmjs.com/package/caveman-shrink). |
-| `cavecrew-*` | Caveman subagents (investigator/builder/reviewer). ~60% fewer tokens than vanilla, main context lasts longer. |
+| `/caveman-stats` | Real session token usage, lifetime savings, USD. Tweetable line with `--share`. |
+| `/caveman-compress ` | Rewrite a memory file (like `CLAUDE.md`) into caveman-speak. Cuts ~46% input tokens **every session after**. Code, URLs, paths byte-preserved. |
+| `caveman-shrink` | MCP middleware. Wraps any MCP server, compresses its tool descriptions. [npm](https://www.npmjs.com/package/caveman-shrink). |
+| `cavecrew-*` | Caveman subagents (investigator, builder, reviewer). ~60% fewer tokens than vanilla, so main context lasts longer. |
-**Statusline badge** — Claude Code shows `[CAVEMAN] ⛏ 12.4k` (lifetime tokens saved). Updates every `/caveman-stats` run. Set `CAVEMAN_STATUSLINE_SAVINGS=0` to silence.
-
-Auto-activate every session: Claude Code, Codex, Gemini (built-in). Cursor / Windsurf / Cline / Copilot get always-on rule files via `--with-init`. Other agents trigger with `/caveman` per session. Full feature matrix in [INSTALL.md](./INSTALL.md#what-you-get).
+> [!TIP]
+> On Claude Code the statusline shows `[CAVEMAN] ⛏ 12.4k` — that's your lifetime tokens saved, updated on every `/caveman-stats`. Silence it with `CAVEMAN_STATUSLINE_SAVINGS=0`.
## Benchmarks
-Real token counts from the Claude API. Average **65% output reduction** across 10 prompts (range 22-87%) — measured against default (verbose) replies. Against a plain `Answer concisely.` control the median is **~50%** (committed eval snapshot in [`evals/`](./evals/), tiktoken `o200k_base`). Both numbers are output tokens only.
+Real token counts from the Claude API. Average **65% output reduction** across 10 prompts (range 22–87%), measured against default verbose replies. Against a plain `Answer concisely.` control, the median is **~50%**. Both are output tokens only, and both are committed and reproducible in [`benchmarks/`](./benchmarks/) and [`evals/`](./evals/).
| Task | Normal | Caveman | Saved |
@@ -153,9 +169,15 @@ Real token counts from the Claude API. Average **65% output reduction** across 1
| **Average** | **1214** | **294** | **65%** |
-Raw data and reproduction script: [`benchmarks/`](./benchmarks/). Three-arm eval harness (baseline / terse / skill) lives in [`evals/`](./evals/) — caveman compared against `Answer concisely.` not against verbose default, so the delta is honest.
+> [!IMPORTANT]
+> **Honest number warning.** Caveman only shrinks **output** tokens. Input and reasoning tokens are untouched, and the skill itself adds ~1–1.5k input tokens per turn. So whole-session savings run smaller than the output number, and on already-terse workloads they can go net-negative. The real win is **readability and speed**. Cost savings are the bonus. When caveman wins, when it loses, and how to measure it yourself: **[docs/HONEST-NUMBERS.md](./docs/HONEST-NUMBERS.md)**.
-**caveman-compress receipts** (real memory files):
+Turns out short isn't just cheaper. A March 2026 paper, [*Brevity Constraints Reverse Performance Hierarchies in Language Models*](https://arxiv.org/abs/2604.00025), tested 31 models and found that constraining large models to brief answers **improved accuracy by ~26 points** on some benchmarks. Sometimes less word = more correct.
+
+
+caveman-compress receipts — real memory files, cutting input tokens forever
+
+
| File | Original | Compressed | Saved |
|---|---:|---:|---:|
@@ -166,121 +188,107 @@ Raw data and reproduction script: [`benchmarks/`](./benchmarks/). Three-arm eval
| `mixed-with-code.md` | 888 | 560 | **36.9%** |
| **Average** | **898** | **481** | **46%** |
-> [!IMPORTANT]
-> Caveman only affects output tokens — input and thinking/reasoning tokens untouched. The skill itself adds ~1–1.5k input tokens per turn (the rules block), so whole-session savings are smaller than the output number, and terse workloads can come out net-negative. Caveman no make brain smaller. Caveman make *mouth* smaller. Biggest win is **readability and speed**, cost savings a bonus. When caveman wins, when caveman loses, how to measure yourself: [docs/HONEST-NUMBERS.md](./docs/HONEST-NUMBERS.md).
+Every session after, that file loads ~46% smaller. Input tokens saved forever, not just one reply.
-A March 2026 paper ["Brevity Constraints Reverse Performance Hierarchies in Language Models"](https://arxiv.org/abs/2604.00025) found that constraining large models to brief responses **improved accuracy by 26 points** on certain benchmarks. Verbose not always better. Sometimes less word = more correct.
+
-## How It Work
+## The whole cave
-1. Install drop skill file in agent.
-2. Skill tell agent: drop filler, keep substance, use fragments.
-3. For Claude Code, hook also write tiny flag file each session — agent see flag, talk caveman from message one. No need say `/caveman`.
-4. Stats command read Claude Code session log, count tokens saved, write number to statusline.
-5. Caveman-compress sub-skill rewrite memory files (CLAUDE.md, project notes) so each session start with smaller context. Save tokens forever, not just one reply.
+
+
-Maintainer detail (hook architecture, file ownership, CI sync) live in [CLAUDE.md](./CLAUDE.md).
+### Want the whole agent, not just its mouth? → caveman-code
-## Lobster, Meet Rock 🦞
-
-[**OpenClaw**](https://openclaw.ai) the self-host gateway. One box, many agent inside (Claude Code, Codex, Pi, OpenCode), wired to your Slack / Discord / iMessage / Telegram / whatever. Tagline: *"The lobster way."* Lobster strong. Lobster smart. Lobster also talk a lot.
-
-Caveman teach lobster brevity — same canonical installer, scoped to one agent:
+This skill shrinks what an agent **says**. **[caveman-code](https://github.com/JuliusBrussee/caveman-code)** shrinks **everything** — a full terminal coding agent, caveman top to bottom. **~2× fewer tokens than Codex** on identical tasks. 20+ providers, plan mode, autopilot goal loop, MIT.
```bash
-# macOS / Linux / WSL
-curl -fsSL https://raw.githubusercontent.com/JuliusBrussee/caveman/main/install.sh | bash -s -- --only openclaw
-
-# Windows (PowerShell): no Node? install Node ≥18 first, then
-npx -y github:JuliusBrussee/caveman -- --only openclaw
+npm install -g @juliusbrussee/caveman-code
```
-Two thing happen, no more:
+[**▶ Try caveman-code →**](https://github.com/JuliusBrussee/caveman-code)
-1. **Skill drop** at `~/.openclaw/workspace/skills/caveman/SKILL.md` — spec-correct frontmatter (`version`, `always: true`), discoverable by `openclaw skills list`. Skill not auto-inject (OpenClaw load skill on demand) — that why we also do step 2.
-2. **SOUL.md nudge.** Tiny marker-fenced block appended to `~/.openclaw/workspace/SOUL.md`. OpenClaw inject SOUL.md into *every* turn under "Project Context" (12K-per-file, 60K total — block well under). Lobster terse from message one. No `/caveman` per session. No nag.
+
+
-```
-~/.openclaw/workspace/
-├── skills/caveman/SKILL.md ← full ruleset, on-demand load
-└── SOUL.md ← ...
- ↑ auto-inject every turn
-```
+Five tools, one idea: **agent do more with less.**
-Custom workspace path? `OPENCLAW_WORKSPACE=/your/path` before the command. Uninstall: same one-liner with `--uninstall` — skill folder gone, SOUL.md block ripped out cleanly, your other workspace content stay untouched. Idempotent re-runs (frontmatter not double-prepended, marker block not duplicated).
-
-Lobster claw still sharp. Lobster mouth now small. Brain still big.
-
-## Caveman Ecosystem
-
-Five tools. One philosophy: **agent do more with less**.
-
-| Repo | What |
+| Repo | What it shrinks |
|------|------|
-| [**caveman**](https://github.com/JuliusBrussee/caveman) *(you here)* | Output compression — *why use many token when few do trick* |
-| [**caveman-code**](https://github.com/JuliusBrussee/caveman-code) | Whole terminal coding agent — *why use many token when whole agent can save* |
-| [**cavemem**](https://github.com/JuliusBrussee/cavemem) | Cross-agent memory — *why agent forget when agent can remember* |
-| [**cavekit**](https://github.com/JuliusBrussee/cavekit) | Spec-driven build loop — *why agent guess when agent can know* |
-| [**cavegemma**](https://github.com/JuliusBrussee/finetune-caveman) | Gemma 4 31B fine-tuned on caveman pairs — *why prompt every turn when weight remember* |
+| [**caveman**](https://github.com/JuliusBrussee/caveman) *(you here)* | What the agent **says** |
+| [**caveman-code**](https://github.com/JuliusBrussee/caveman-code) | The **whole agent**, end to end |
+| [**cavemem**](https://github.com/JuliusBrussee/cavemem) | What the agent **remembers**, across sessions |
+| [**cavekit**](https://github.com/JuliusBrussee/cavekit) | The **build loop** — spec-driven, no guessing |
+| [**cavegemma**](https://github.com/JuliusBrussee/finetune-caveman) | The compression **baked into weights** (Gemma fine-tune) |
-Compose: cavekit drive build, caveman compress what agent *say*, cavemem compress what agent *remember*, cavegemma bake compression into weight, caveman-code ship it all as one terminal agent. One rock. Two rock. Three rock. Four rock. Five rock. That it.
+
+Also: five sibling skills, one install
-## More Skill From Same Cave
+
-Caveman has siblings. [**JuliusBrussee/skills**](https://github.com/JuliusBrussee/skills) — five skills, one install, works in Claude Code, Cursor, Gemini, Cline, Copilot, 40+ agents:
+[**JuliusBrussee/skills**](https://github.com/JuliusBrussee/skills) — works in Claude Code, Cursor, Gemini, Cline, Copilot, 40+ agents:
| Skill | What |
|------|------|
| [**caveman**](https://github.com/JuliusBrussee/skills/tree/main/skills/caveman) | This one. Speak less, say more. |
-| [**grill-me**](https://github.com/JuliusBrussee/skills/tree/main/skills/grill-me) | Agent grill your plan *before* you build wrong thing. Checks how much you know first — no condescend, no coddle. |
-| [**interface-kit**](https://github.com/JuliusBrussee/skills/tree/main/skills/interface-kit) | Build UI that look good, load fast, work for everyone. |
-| [**junior-to-senior**](https://github.com/JuliusBrussee/skills/tree/main/skills/junior-to-senior) | Adversarial review pass. Junior output go in, senior output come out. |
-| [**loop-factory**](https://github.com/JuliusBrussee/skills/tree/main/skills/loop-factory) | Spec-driven task loop — inbox → active → archive, review gate between. |
+| [**grill-me**](https://github.com/JuliusBrussee/skills/tree/main/skills/grill-me) | Agent grills your plan *before* you build the wrong thing. |
+| [**interface-kit**](https://github.com/JuliusBrussee/skills/tree/main/skills/interface-kit) | Build UI that looks good, loads fast, works for everyone. |
+| [**junior-to-senior**](https://github.com/JuliusBrussee/skills/tree/main/skills/junior-to-senior) | Adversarial review pass. Junior output in, senior output out. |
+| [**loop-factory**](https://github.com/JuliusBrussee/skills/tree/main/skills/loop-factory) | Spec-driven task loop — inbox → active → archive. |
```bash
npx skills@latest add JuliusBrussee/skills
```
-One command. Five skill. Cave well stocked.
+
+
+
+🦞 Teach the lobster brevity — OpenClaw integration
+
+
+
+[**OpenClaw**](https://openclaw.ai) is a self-host gateway: one box, many agents inside, wired to Slack / Discord / iMessage / Telegram. Lobster strong. Lobster smart. Lobster also talk a lot.
+
+Same installer, scoped to one agent:
+
+```bash
+curl -fsSL https://raw.githubusercontent.com/JuliusBrussee/caveman/main/install.sh | bash -s -- --only openclaw
+```
+
+Two things happen, no more: a caveman skill lands in the workspace, and a tiny marker-fenced block is appended to `SOUL.md` (OpenClaw injects it every turn, so the lobster is terse from message one — no `/caveman` per session). Custom path? `OPENCLAW_WORKSPACE=/your/path`. Uninstall with the same line plus `--uninstall`; your other workspace content stays untouched. Lobster claw still sharp. Lobster mouth now small.
+
+
+
+## Caveman 2
+
+**Caveman make token small. Caveman 2 make it _provable_.**
+
+Today's savings numbers (including `/caveman-stats`) are local estimates. Caveman 2 measures and verifies them across a whole team — real receipts, real dashboard, real proof the tokens went down. Building it now.
+
+[**Join the waitlist → caveman.so**](https://caveman.so)
+
+## How it works
+
+1. Install drops a skill file into your agent.
+2. Skill tells agent: drop filler, keep substance, use fragments — but never touch code, commands, or errors.
+3. On Claude Code, a hook writes a tiny flag file each session, so the agent talks caveman from message one without `/caveman`.
+4. `/caveman-stats` reads your session log, counts tokens saved, writes the number to your statusline.
+5. `/caveman-compress` rewrites memory files (like `CLAUDE.md`) so every future session starts with a smaller context. Save tokens forever, not just once.
+
+Hook architecture, file ownership, and CI sync are documented for maintainers in [CLAUDE.md](./CLAUDE.md).
## Privacy
-Caveman no phone home. No telemetry, no analytics, no accounts, no backend. After install, zero network calls — skill is a prompt, hooks are local scripts, `/caveman-stats` reads your session log on your disk. Install-time fetches (GitHub + your agents' own registries) and scanner-warning explanations: [SECURITY.md](./SECURITY.md#privacy--telemetry).
-
-## Links
-
-- [docs/HONEST-NUMBERS.md](./docs/HONEST-NUMBERS.md) — when caveman saves, when caveman costs, how to measure
-- [INSTALL.md](./INSTALL.md) — full install matrix, all flags, per-agent detail
-- [CONTRIBUTING.md](./CONTRIBUTING.md) — how to send patch
-- [CLAUDE.md](./CLAUDE.md) — maintainer guide (file ownership, hook architecture, CI)
-- [docs/](./docs/) — extra guides (Windows install, etc.)
-- [Issues](https://github.com/JuliusBrussee/caveman/issues) — bug, feature, weird behavior
-
-## Caveman 2 (coming soon)
-
-**caveman make tokens small. caveman 2 will prove it.**
-
-Local savings numbers (including `/caveman-stats`) are estimates. Caveman 2 will measure and verify them across a team — [join the waitlist](https://caveman.so).
-
-## Star This Repo
-
-Caveman save you token, save you money. Star cost zero. Fair trade. ⭐
-
-[](https://star-history.com/#JuliusBrussee/caveman&Date)
-
-## Also by Julius Brussee
-
-- **[Revu](https://github.com/JuliusBrussee/revu-swift)** — local-first macOS study app with FSRS spaced repetition. [revu.cards](https://revu.cards)
+Caveman no phone home. No telemetry, no analytics, no accounts, no backend. After install, zero network calls — the skill is a prompt, the hooks are local scripts, and `/caveman-stats` reads a log already on your disk. Install-time fetches (GitHub plus your agents' own registries) are spelled out in [SECURITY.md](./SECURITY.md#privacy--telemetry).
## Sponsors
-caveman free forever. Sponsor keep rock sharp.
+Caveman free forever. Sponsors keep the rock sharp.
-## License
+## Star this repo
+Caveman save you token, save you money. Star cost zero. Fair trade. ⭐
+
+[](https://star-history.com/#JuliusBrussee/caveman&Date)
+
+---
+
+
+Docs:
+Install matrix ·
+Honest numbers ·
+Contributing ·
+Maintainer guide ·
+Issues
+
+Also by Julius Brussee:
+Revu — local-first macOS study app with FSRS spaced repetition (revu.cards)
+
MIT — free like mass mammoth on open plain.
+
diff --git a/docs/assets/caveman-logo-banner.png b/docs/assets/caveman-logo-banner.png
new file mode 100644
index 0000000000000000000000000000000000000000..704b6b8190ddcb472426607c88b392d8123bf597
GIT binary patch
literal 19193
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
literal 0
HcmV?d00001
diff --git a/skills/caveman/SKILL.md b/skills/caveman/SKILL.md
index 3c246e8..d5e5741 100644
--- a/skills/caveman/SKILL.md
+++ b/skills/caveman/SKILL.md
@@ -18,7 +18,7 @@ Default: **full**. Switch: `/caveman lite|full|ultra`.
## Rules
-Drop: articles (a/an/the), filler (just/really/basically/actually/simply), pleasantries (sure/certainly/of course/happy to), hedging. Fragments OK. Short synonyms (big not extensive, fix not "implement a solution for"). No tool-call narration, no decorative tables/emoji, no dumping long raw error logs unless asked — quote shortest decisive line. Standard well-known tech acronyms OK (DB/API/HTTP); never invent new abbreviations reader can't decode. Technical terms exact. Code blocks unchanged. Errors quoted exact.
+Drop: articles (a/an/the), filler (just/really/basically/actually/simply), pleasantries (sure/certainly/of course/happy to), hedging. Fragments OK. Short synonyms (big not extensive, fix not "implement a solution for"). No tool-call narration, no decorative tables/emoji, no dumping long raw error logs unless asked — quote shortest decisive line. Standard well-known tech acronyms OK (DB/API/HTTP); never invent new abbreviations (cfg/impl/req/res/fn) — tokenizer split them same as full word: zero token saved, reader still decode. Full word cheaper AND clearer. No causal arrows (→) either — own token, save nothing. Technical terms exact. Code blocks unchanged. Errors quoted exact.
Preserve user's dominant language. User write Portuguese → reply Portuguese caveman. User write Spanish → reply Spanish caveman. Compress the style, not the language. No forced English openings or status phrases. ALWAYS keep technical terms, code, API names, CLI commands, commit-type keywords (feat/fix/...), and exact error strings verbatim — unless user explicitly ask for translation.
@@ -35,7 +35,7 @@ Yes: "Bug in auth middleware. Token expiry check use `<` not `<=`. Fix:"
|-------|------------|
| **lite** | No filler/hedging. Keep articles + full sentences. Professional but tight |
| **full** | Drop articles, fragments OK, short synonyms. Classic caveman. No tool-call narration, no decorative tables/emoji, no long raw error-log dumps unless asked. Standard acronyms OK; no invented abbreviations |
-| **ultra** | Abbreviate prose words (DB/auth/config/req/res/fn/impl) — prose words only, never real code symbols/function names. Strip conjunctions, arrows for causality (X → Y), one word when one word enough. Code symbols, function names, API names, error strings: never abbreviate |
+| **ultra** | Strip conjunctions when cause-then-effect stay unambiguous. One word when one word enough. State each fact once. NO prose abbreviations (cfg/impl/req/res/fn/auth), NO arrows (X → Y) — measured zero token saving under tokenizer, cost decode clarity. Code symbols, function names, API names, error strings: never touch |
| **wenyan-lite** | Semi-classical. Drop filler/hedging but keep grammar structure, classical register |
| **wenyan-full** | Maximum classical terseness. Fully 文言文. 80-90% character reduction. Classical sentence patterns, verbs precede objects, subjects often omitted, classical particles (之/乃/為/其) |
| **wenyan-ultra** | Extreme abbreviation while keeping classical Chinese feel. Maximum compression, ultra terse |
@@ -43,17 +43,17 @@ Yes: "Bug in auth middleware. Token expiry check use `<` not `<=`. Fix:"
Example — "Why React component re-render?"
- lite: "Your component re-renders because you create a new object reference each render. Wrap it in `useMemo`."
- full: "New object ref each render. Inline object prop = new ref = re-render. Wrap in `useMemo`."
-- ultra: "Inline obj prop → new ref → re-render. `useMemo`."
+- ultra: "Inline obj prop, new ref, re-render. `useMemo`."
- wenyan-lite: "組件頻重繪,以每繪新生對象參照故。以 useMemo 包之。"
- wenyan-full: "每繪新生對象參照,故重繪;以 useMemo 包之則免。"
-- wenyan-ultra: "新參照→重繪。useMemo Wrap。"
+- wenyan-ultra: "新參照則重繪。useMemo 包之。"
Example — "Explain database connection pooling."
- lite: "Connection pooling reuses open connections instead of creating new ones per request. Avoids repeated handshake overhead."
- full: "Pool reuse open DB connections. No new connection per request. Skip handshake overhead."
-- ultra: "Pool = reuse DB conn. Skip handshake → fast under load."
-- wenyan-full: "池reuse open connection。不每req新開。skip handshake overhead。"
-- wenyan-ultra: "池reuse conn。skip handshake → fast。"
+- ultra: "Pool reuse open DB connections. No per-request handshake."
+- wenyan-full: "池蓄已開之連,不逐請而新開,省握手之費。"
+- wenyan-ultra: "池蓄連,免逐請新開,省握手。"
## Auto-Clarity