$npx -y skills add JuliusBrussee/cavekit --skill cavemanCaveman encoding for SPEC.md and spec-adjacent writes. Loaded by /spec, /build, /check. Cuts tokens ~75% vs prose while staying precise. Triggers on any write to SPEC.md or when user says "caveman", "compress this", "be brief".
| 1 | # caveman — spec encoding |
| 2 | |
| 3 | Applies to SPEC.md writes, spec-referencing prose, backprop entries. |
| 4 | Does NOT apply to code, error strings, commit messages, PR descriptions. |
| 5 | |
| 6 | ## GRAMMAR |
| 7 | |
| 8 | - Drop articles (a, an, the). |
| 9 | - Drop filler (just, really, basically, simply, actually). |
| 10 | - Drop aux verbs where fragment works (is, are, was, were, being). |
| 11 | - Drop pleasantries. |
| 12 | - No hedging (skip "might", "perhaps", "could be worth"). |
| 13 | - Fragments fine. |
| 14 | - Short synonyms: fix > implement, big > extensive, run > execute. |
| 15 | |
| 16 | ## SYMBOLS |
| 17 | |
| 18 | Prefer over words: |
| 19 | |
| 20 | ``` |
| 21 | → leads to / becomes / on <x> |
| 22 | ∴ therefore / fix |
| 23 | ∀ for all / every |
| 24 | ∃ exists / some |
| 25 | ! must / required |
| 26 | ? may / optional / unknown |
| 27 | ⊥ never / forbidden / nil |
| 28 | ≠ not equal |
| 29 | ∈ in |
| 30 | ∉ not in |
| 31 | ≤ at most |
| 32 | ≥ at least |
| 33 | & and |
| 34 | | or |
| 35 | § section reference |
| 36 | ``` |
| 37 | |
| 38 | ## PRESERVE VERBATIM |
| 39 | |
| 40 | Never compress: |
| 41 | |
| 42 | - Code blocks, snippets, one-liners with backticks. |
| 43 | - Paths: `src/auth/mw.go`. |
| 44 | - URLs. |
| 45 | - Identifiers: function names, variable names, env vars. |
| 46 | - Numbers and versions. |
| 47 | - Error message strings. |
| 48 | - SQL, regex, JSON, YAML. |
| 49 | - Quoted strings. |
| 50 | |
| 51 | ## SHAPES |
| 52 | |
| 53 | **Invariant**: |
| 54 | ``` |
| 55 | V<n>: <subject> <relation> <condition> |
| 56 | V1: ∀ req → auth check before handler |
| 57 | V2: token expiry ≤ current_time → reject |
| 58 | ``` |
| 59 | |
| 60 | **Bug row** (pipe table under §B): |
| 61 | ``` |
| 62 | id|date|cause|fix |
| 63 | B1|2026-04-20|token `<` not `≤`|V2 |
| 64 | ``` |
| 65 | |
| 66 | **Task row** (pipe table under §T): |
| 67 | ``` |
| 68 | id|status|task|cites |
| 69 | T3|x|add auth mw|V1,I.api |
| 70 | ``` |
| 71 | Status: `x` done, `~` wip, `.` todo. Escape literal `|` as `\|`. |
| 72 | |
| 73 | **Interface**: |
| 74 | ``` |
| 75 | <kind>: <name> → <shape> |
| 76 | api: POST /x → 200 {id:string} |
| 77 | cmd: `foo bar <arg>` → stdout JSON |
| 78 | env: FOO_KEY ! set |
| 79 | ``` |
| 80 | |
| 81 | ## EXAMPLES |
| 82 | |
| 83 | **Bad**: |
| 84 | > The system should ensure that every incoming request is properly authenticated before being forwarded to its corresponding handler function. |
| 85 | |
| 86 | **Good**: |
| 87 | > V1: ∀ req → auth check before handler |
| 88 | |
| 89 | **Bad**: |
| 90 | > We discovered that the token expiration check in the middleware was using a strict less-than comparison operator, which meant tokens were being rejected at the exact moment of their expiry. |
| 91 | |
| 92 | **Good**: |
| 93 | > B1: token `<` not `≤` → reject @ expiry boundary. |
| 94 | |
| 95 | **Bad**: |
| 96 | > The POST endpoint at /x accepts a JSON body and returns a 200 response with an object containing the created id. |
| 97 | |
| 98 | **Good**: |
| 99 | > api: POST /x → 200 {id} |
| 100 | |
| 101 | ## BOUNDARIES |
| 102 | |
| 103 | - User asks for prose explanation → switch to normal English. |
| 104 | - Spec documents for external review (RFC, pitch) → normal English. |
| 105 | - Commit message → normal English (git readers expect it). |
| 106 | - Diff comment in code → normal English. |
| 107 | |
| 108 | ## WHEN UNSURE |
| 109 | |
| 110 | If cutting a word loses a fact, keep it. Caveman is compression, not amputation. |