|
| 1 | +--- |
| 2 | +description: Manage Compound V decision preferences — your OWN dated past-reasoning memory (memory + challenge, never a clone). Present-only, observe-in-output / control-via-CLI. `stats` shows override/disagreement rates and demoted/expired patterns; `distill` regenerates the in-repo (secret+PII-scrubbed) preferences.md; `show` prints the current distilled model; `purge` wipes the LOCAL raw log (irreversible). Mode is set by .claude/compound-v.json `brainstorm.preferences` (off|on-demand|marked). |
| 3 | +--- |
| 4 | + |
| 5 | +You are managing **Compound V decision preferences** — the maker's OWN dated past reasoning at a brainstorm |
| 6 | +fork. This is **memory + challenge, not a clone**: it recalls "you decided X before" only to trigger |
| 7 | +**re-examination**, always paired with a divergent counter-move — never "reason as the creator", never a |
| 8 | +pre-selected default. It has **no routing influence**. Every subcommand here is read-only-ish observation and |
| 9 | +LOCAL model management; the live fork surface is wired into the elicitation driver, not this command. |
| 10 | + |
| 11 | +**Split storage (state it honestly):** |
| 12 | + |
| 13 | +- The **raw `decisions.jsonl`** — the full free-text `why` + question context, the PII-prone part — lives |
| 14 | + **LOCAL** under `~/.claude/compound-v/preferences/` and is **NEVER committed / never shipped**. It is |
| 15 | + purgeable. |
| 16 | +- The **distilled `preferences.md`** lives **in-repo** at `docs/superpowers/preferences/preferences.md`, |
| 17 | + git-tracked and **V-memory-indexed** (recallable via [`/v:remember`](v-remember.md)) — the "all in one |
| 18 | + memory" path. It is **secret+PII-scrubbed at `distill` time** before it is written, so the committed copy |
| 19 | + carries no flagged token (the honest caveat: the scrubbed distillate DOES ship with the plugin). |
| 20 | + |
| 21 | +Deterministic mechanics live in [`scripts/compound-v-preferences.py`](../scripts/compound-v-preferences.py) |
| 22 | +(pure stdlib, `--selftest`-gated). **Anti-ruflo:** counts only ("4/5 similar forks"), **never a fabricated |
| 23 | +confidence %**; drift + staleness are surfaced, never hidden. |
| 24 | + |
| 25 | +Args: `{{args}}` — one of `stats` (default) · `distill` · `show` · `purge`. |
| 26 | + |
| 27 | +## Branch on `{{args}}` |
| 28 | + |
| 29 | +- **`stats`** (default) — per-pattern override/disagreement rates plus demoted/expired flags, from the LOCAL log: |
| 30 | + ``` |
| 31 | + python3 scripts/compound-v-preferences.py stats |
| 32 | + ``` |
| 33 | + Render each pattern's dominant choice with its sample size (counts only), the recency-weighted last-K |
| 34 | + disagreement (`N/M diverged`, **not** an all-time ratio), and any `demoted` (your reasoning here may have |
| 35 | + shifted → stops surfacing) or `expired` (past the staleness window → stops surfacing until refreshed) banner. |
| 36 | + Never print a `%` confidence. |
| 37 | + |
| 38 | +- **`distill`** — regenerate the in-repo `docs/superpowers/preferences/preferences.md` from the LOCAL jsonl, |
| 39 | + **secret+PII-scrubbed before write**: |
| 40 | + ``` |
| 41 | + python3 scripts/compound-v-preferences.py distill --repo . |
| 42 | + ``` |
| 43 | + Only **unprompted** rationales appear as "your reasoning" — a `borrowed` (candidate-tapped) why is excluded. |
| 44 | + Print the written path + pattern count. Commit the result so V-memory can index it (then it surfaces via |
| 45 | + `/v:remember`); re-index with [`/v:memory-refresh`](v-memory-refresh.md). |
| 46 | + |
| 47 | +- **`show`** — print the current distilled model (the committed, scrubbed in-repo view): |
| 48 | + ``` |
| 49 | + cat docs/superpowers/preferences/preferences.md |
| 50 | + ``` |
| 51 | + If it is absent, say so and suggest running `distill` first. `distill` always writes the in-repo |
| 52 | + `preferences.md` — a placeholder (`_No decisions captured yet._`) when the local log is empty, or the |
| 53 | + distilled, PII-scrubbed pattern model once decisions exist. This is the shared, aggregated model — the raw |
| 54 | + per-decision log (local `~/.claude`) is never shown here. |
| 55 | + |
| 56 | +- **`purge`** — wipe the **LOCAL** raw `decisions.jsonl` in one command. **State that it is IRREVERSIBLE** |
| 57 | + (per the base rule for destructive actions — say WHY and confirm intent before running): it deletes the full |
| 58 | + free-text history under `~/.claude/compound-v/preferences/`. The already-committed distillate is untouched. |
| 59 | + ``` |
| 60 | + python3 scripts/compound-v-preferences.py purge |
| 61 | + ``` |
| 62 | + |
| 63 | +## Modes — `.claude/compound-v.json` `brainstorm.preferences` |
| 64 | + |
| 65 | +The fork surface (in the elicitation driver, not this command) is governed by `brainstorm.preferences`, |
| 66 | +resolved fail-closed by [`scripts/compound-v-project-config.py`](../scripts/compound-v-project-config.py) |
| 67 | +(`resolve_brainstorm`) — a bad/missing value degrades to the safe `on-demand`, never silently to `marked`: |
| 68 | + |
| 69 | +- **`off`** — nothing surfaces. |
| 70 | +- **`on-demand`** (default) — the human/driver **pulls** history ("have I decided something like this |
| 71 | + before?"); no unsolicited surface. A pull can't nudge. |
| 72 | +- **`marked`** — a *qualifying* fork's past-matching option carries a **falsifiable dated soft badge** |
| 73 | + (`↩ your past pick: N/M · date`), rendered **together with the mandatory divergent challenge** and |
| 74 | + **never pre-selected** — a label beside a neutral choice, not a default you must un-tick. |
| 75 | + |
| 76 | +Authority doc: [`skills/compound-v/decision-preferences.md`](../skills/compound-v/decision-preferences.md). |
| 77 | +Wiring: [`skills/compound-v/brainstorm-elicitation.md`](../skills/compound-v/brainstorm-elicitation.md). |
0 commit comments