---
name: meta-memory-settings
description: Use to view, change, or reset how the bitranox layered memory behaves - on "/memory-settings", "memory settings", "change dream mode", "turn off nudges", "stop promoting to global", "forget less/more", or when the user wants to see or reset these preferences. Reads/writes the one machine-local config the memory hooks and skills obey.
---

# meta-memory-settings

The layered memory has a few habit-dependent choices with no single right answer for everyone. Each
has a recommended default; the user can change any of them, the choice is RECORDED, and it is applied
automatically thereafter (never re-asked). All knobs live in one machine-local file,
`~/.claude/.bitranox-memory.json`; this skill is the front door to it.

## Use the CLI
- **View:** `python3 <this-skill-dir>/settings.py view`
- **Set one knob:** `python3 <this-skill-dir>/settings.py set <key> <value>`
- **Reset all to recommended defaults:** `python3 <this-skill-dir>/settings.py reset`

When the user is deciding, state the option's consequence and the recommendation in one line, set it,
then confirm. Do not edit the JSON by hand - the CLI validates the key AND the value, and
refuses an unknown one (exit 2) naming the legal choices, so a typo like `dream_mode of`
cannot reach the file.

- **Bounds:** `context_handover_pct` 1..100, `context_handover_cap` >= 1, `context_window` 0 or
  >= 1000; every `discovery_roots` entry must be an absolute or `~`-relative path. Anything else
  is refused with exit 2.
- **Arguments:** `view` and `reset` take none, `set` exactly two; a leftover (`reset --dry-run`) is
  refused with exit 2 rather than ignored.
- **A config that is not UTF-8 text or not a JSON object** (a trailing comma, a hand edit gone
  wrong, a file a Windows editor saved as cp1252 or UTF-16) is refused with exit 2 by every verb,
  naming the file, and left untouched, so a `set` never writes defaults over the choices it still
  holds. Fix the file by hand (re-save it as UTF-8), or delete it to start from the defaults. The
  hooks meanwhile read such a file as the defaults, silently, so they never block a turn.
- **Exit 1** means the write failed (for example `~/.claude` is not a writable directory): nothing
  was saved.

## The knobs (recommended default in brackets)

| Key                        | Values                                | What it controls / consequence                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
|----------------------------|---------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `dream_mode`               | `propose` [default], `auto`, `off`    | propose: apply CLAUDE.md consolidation (backed up, reported per file, only where an ancestor covers the rule), self-PR skills. auto: also ship skill changes without asking. off: no nudges, memory-only.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| `privacy`                  | `open` [default], `walled`            | open: a secret/PII scrub only (memory is machine-local, not committed). walled: also keep promotion/gather within one privacy domain. Consequence: a global rule (at the topmost-CLAUDE.md-ancestor tier) is recalled into EVERY session under that tree, including public repos.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| `promotion`                | `corroborated` [default], `eager`     | corroborated: a model-inferred rule must be sighted in >= 2 DISTINCT PROJECTS before it reaches the global layer at the topmost-CLAUDE.md ancestor (recalled into every session under that tree). Re-dreaming ONE project never corroborates: the dwell store is idempotent per project, so a second run there adds no evidence. user-stated rules promote eagerly either way. eager: promote inferred rules on first sight (higher blast radius).                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
| `skill_placement`          | `lowest` [default], `user`, `project` | ADVISORY - no shipped code reads this knob; it records your preference, and the authoring skills follow the same rule by convention: a newly created skill goes to the LOWEST scope that fits (a repo's own `.claude/skills/` extension before user scope `~/.claude/skills/`). Setting it to another value changes nothing today. Proposing a skill to the public marketplace is ALWAYS ask-first, regardless.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| `nudges`                   | `true` [default], `false`             | session-start nudges (consolidation-due, new-project bootstrap). Switch off if they are noise.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| `track_private`            | `false` [default], `true`             | git-track the memory (the `CLAUDE.local.md` pointer block + the anchor's `.claude-memory/` central bodies) on a PRIVATE repo (portable/shared memory). Public/default ALWAYS gitignore `CLAUDE.local.md` + `.claude-memory/` (this knob does not override that).                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| `mcp_search`               | `auto` [default], `off`               | `auto`: if a memory MCP (e.g. `basic-memory`, correctly configured read-only over the local files) is present, use it as a full-text+graph index to sharpen CROSS-project recall; else fall back to the keyword scan. `off`: keyword scan only.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| `cross_tree_search`        | `true` [default], `false`             | may the per-prompt recall hook scan OTHER knowledge trees (machine-global over `discovery_roots`)? `false` walls recall into the CURRENT tree (its own projects + tree top only; the machine-local native tier counts as outside); cross-tree knowledge then moves only via the explicit paths (`bitranox:meta-collect-knowledge` import, dream-global). Use `false` when independent trees (e.g. two clients) must not see each other's notes.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| `context_window`           | `0` [default -> detect]               | the session's total token budget, used to decide when a handover is due. `0` DETECTS it from the model. Set a real token count ONLY to override a wrong detection - the symptom is a percentage that cannot be right (a 1M-context model left on a 200k default). `bitranox:meta-context-watcher` sends you here for exactly this.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
| `context_handover_pct`     | `70` [default]                        | the PERCENTAGE leg of the handover threshold. The trigger is `min(context_handover_pct` of the window, `context_handover_cap)`, so on a large window the cap usually wins and this one does nothing. Lower it to be warned earlier.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| `context_handover_cap`     | `400000` [default]                    | the ABSOLUTE leg of the same threshold, in tokens, set at the measured onset of context rot. On a 1M window this is what actually fires, at 40 percent rather than 70. Raise it only with a reason - past it, accuracy is already falling.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
| `discovery_roots`          | `[]` [default -> derived]             | filesystem roots to walk when DISCOVERING knowledge trees (ensure-all-trees, cross-tree gather/recall) and other projects' curated stores (each level's `CLAUDE.local.md` pointer block + the anchor's `.claude-memory/` bodies) (JSON list or comma-separated). Empty -> derive `$HOME`. Never ship absolute maintainer paths in the tracked default.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
| `classifier_backend`       | `off` [default], `jev`                | master switch for the opt-in text classifier (TypeSafe's Jev, `api.typesafe.ai`). `jev` does nothing on its own: each site below must ALSO be set to `shadow` (or, for the skill router only, `decide`). Shadow NEVER changes a hook's decision - the regex still decides, and a detached process logs Jev's verdict beside it in `~/.claude/self-improve-audit/classifier-shadow-<UTC date>.jsonl`, one file per UTC day; each write deletes whole days older than 30, then the oldest days past 200 MB in total, never the current day's. Needs an API key: the keyfile `~/.credentials/typesafe.key` (mode 600) or `TYPESAFE_API_KEY`.                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| `classifier_model`         | `jev-latest` [default]                | the TypeSafe model id sent with each request. Pin a version only to compare runs across a model release.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| `classifier_stop_signal`   | `off` [default], `shadow`             | shadow the self-improve Stop gate's learning-signal regexes. SENT: the last user message and the last assistant reply, each capped at 4000 characters, secrets replaced by `[REDACTED]`.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| `classifier_skill_router`  | `off` [default], `shadow`, `decide`   | shadow the skill router's keyword match. SENT: the prompt, the reply it answers, the project's scope line, recent tool activity and skills already used (each capped, redacted), one question whether the prompt starts a new task, and ONE choice whose options are the descriptions of the skills installed in the session (this plugin's own when that list cannot be read). `decide`: for a typed prompt, the same request is asked while the prompt WAITS (1.5 s at most) and Jev's answer chooses the nudge - its one pick, or NO nudge when it picks nothing (the keyword match is not consulted then). Only when Jev does not answer (timeout, HTTP error, no key, malformed answer), or picks a skill the session may no longer have (read from the project's cached skill list and not this plugin's own), does the keyword match nudge, exactly as with `off`. A background-task notification is handled exactly as with `off`: Jev is not asked. Each decide prompt logs one row to the same shadow log, naming which path nudged. No other site has `decide`. |
| `classifier_recall_rerank` | `off` [default], `shadow`             | shadow recall's keyword ranking. SENT: the prompt and up to 30 matching memory notes (600 characters each, redacted), one request per note.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |

## Notes
- A reset restores every knob to the recommended default above.
