From eb4613b88060eaf293fc193c05569381d17ed3aa Mon Sep 17 00:00:00 2001
From: modusensus
Date: Fri, 13 Nov 2026 01:39:47 +0800
Subject: [PATCH] docs(readme): rebuild both READMEs in the magazine layout
Root README becomes a short entrance page: hero, terminal block, six
flat-square badges that swap with the color scheme, and seven numbered
sections (what it is / why you can trust it / install / panel / elsewhere /
docs / version history), Chinese first and English below.
The package README gets the same header (banner, terminal block, badges,
language switch) while its 800-line reference body stays as it was, since
its section anchors are linked from the TOC.
Privacy text moves into its own section in both halves, and the test badge
goes back to the tests-%20total shape that the badge sync script matches.
---
README.md | 679 +++++++++++---------------------------------
dsh-mneme/README.md | 27 +-
2 files changed, 181 insertions(+), 525 deletions(-)
diff --git a/README.md b/README.md
index 8782ef3b..b5e8ca15 100644
--- a/README.md
+++ b/README.md
@@ -2,639 +2,288 @@
-
dsh-mneme
+```
+$ whoami
+mneme — the memory that dreams
+
+$ cat /etc/mneme
+cross-session memory for DeepSeek Harness
+every memory keeps its provenance
+conflicts freeze until you decide
+the only copy stays on your machine
+
+$ ls ~/.dsh/memory
+memory.db constraints.md decisions.md documents.md history.md
+patterns.md pitfalls.md preferences.md projects.md
+rejected-solutions.md summary.md
+```
-> **How does it compare with Zep / Mem0 / Letta / Hindsight?** There is a row-by-row table — storage, retrieval, write-time extraction, offline consolidation, conflicts, forgetting, scoping, auditability, multi-host, offline, license: 11 rows, and **"—" does not mean "worse"**: [capability comparison](docs/COMPARISON.md) (Chinese).
+---
-## 5-minute quickstart
+
-```bash
-# Install the plugin (the easy path: npm package name)
-dsh plugin --profile web add @modusensus/dsh-mneme
-dsh web
```
-
-### Four install sources
-
-**Settings → Plugins → Add plugin** and `dsh plugin add` accept four kinds of spec — whatever you paste is what gets installed. This repository is a **multi-package repo**: the `package.json` at the root is only a **repo shell** (`private`, no `dsh` field), while the installable plugin lives in `dsh-mneme/`. So Git and tarball specs must point at that subdirectory; otherwise you install the shell itself.
-
-> Why ship an uninstallable shell at the repo root? Because some multi-package detectors (dshfind's plugin probe, for one) only look at the root manifest — without it this repository is judged "not an installable plugin package," which says nothing about whether it actually installs. The root manifest is `private` + `0.0.0` + carries no `dsh` field precisely so such tools can find the real subpackage while it can **never** be installed or published as the plugin itself.
-
-| Source | Paste this | Note |
-|--------|-----------|------|
-| **npm name** | `@modusensus/dsh-mneme` | Recommended; a version range works too (`@0.9.0`) |
-| **Git repo** | `git+https://github.com/slow-stack/mneme.git#path:/dsh-mneme` | `#path:` is not optional. Without it you get the root shell (`0.0.0`, no `dsh` field) — the host does not treat it as a plugin |
-| **tarball** | `C:\\path\\to\\modusensus-dsh-mneme-0.9.0.tgz` | Produced by `npm pack` inside `dsh-mneme/`; `pnpm pack` fails on the bin script's CRLF line endings |
-| **local directory** | `C:\\path\\to\\mneme\\dsh-mneme` | **Must be absolute** — a relative path is rejected outright (`a local path must be absolute`) |
-
-```bash
-# From source (local directory; edit code, restart, done)
-git clone https://github.com/slow-stack/mneme.git
-dsh plugin --profile web add "$(pwd)/mneme/dsh-mneme"
-
-# Or straight from Git (no checkout; good for just running a version)
-dsh plugin --profile web add 'git+https://github.com/slow-stack/mneme.git#path:/dsh-mneme'
+$ whoami
+mneme — the memory that dreams
+
+$ cat /etc/mneme
+cross-session memory for DeepSeek Harness
+every memory keeps its provenance
+conflicts freeze until you decide
+the only copy stays on your machine
```
-> The "Install guide and examples" panel only demonstrates the npm form; all four above are verified. Git and tarball sources get one repository-reachability check at install time (5-second timeout by default).
-
-It works out of the box. To feel its value in five minutes:
-
-1. **Chat** — start a session and tell the AI something about your preferences or a project (e.g. "I prefer 4-space indentation.").
-2. **Verify** — close the window, open a new one. If it recalls what you said, the memory has landed.
-3. **Optional** — injection and background consolidation are on from install; touch nothing first. Only if you want fully-offline embeddings, entity extraction, or per-agent isolation, open **Settings → Memory Settings** and change what you need (see Quick config). Note that entity extraction is already on for bundle installs and off for manual installs — trust what the settings page shows.
+### 01 · What it is
-## Quick config (optional)
+*Every new chat, the AI meets you for the first time.*
-| Need | Config key | Default | Change |
-|------|-----------|---------|--------|
-| Fully offline | `embedProvider` | `openai` | Change to `local` |
-| Background consolidation | `autoDream` | `true` | Change to `false` to disable |
-| Structured entity extraction | `entityExtractionEnabled` | `false` (`true` for bundle installs) | Manual installs change it to `true`; bundle installs already have it on, change it to turn it off |
-| Memory isolation per agent / workspace | `scopeEnabled` (add `strictScope` for stronger isolation — hard blocking applies to explicit declarations only) | `false` | Change to `true` |
+**dsh-mneme** gives [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) cross-session memory. Projects you discussed, preferences you mentioned, decisions you made — close the window, open it later, and it still remembers.
-> All of these live in DSH Settings → Memory Settings. Full config docs in the [Configuration section](dsh-mneme/README.md) (Chinese, bilingual file).
+It is not a vector store. Memories live in a local SQLite file, with a Markdown mirror beside it: a file you can open, read, and edit, and your edits are not overwritten by the machine.
-### Where to put the memory library
+### 02 · Why you can trust it
-The library defaults to `~/.dsh/memory`, which is naturally outside any host profile scope; the actual location follows your `memoryDir` config. If it points inside a profile scope (a path like `…/profiles//…`), the library is taken away along with the profile when the host cleans or migrates it (an actual incident recorded in #218). The plugin logs a warning at startup when it detects such a location — **advisory only, it never moves your data**. Safe practice: keep `memoryDir` outside profiles (the default already is); to migrate, stop writing → copy the whole directory → point the config at the new location → restart.
+*The parts you never see decide whether it holds up over months.*
-## Upgrading (your settings survive)
+- **Every memory carries its provenance** — which conversation it came from, when it changed, who touched it. Consolidation leaves a receipt too: input snapshot, decision detail, result hash, so the same run can be replayed.
+- **Conflicts are not decided for you** — when two memories disagree, both are frozen and shown side by side, and you pick which one stays.
+- **Your edits win** — memories are local Markdown; hand-edited text is kept when it is merged back into the store.
+- **It works when you are idle** — frequently used memories stay hot, stale ones compress into summaries, old ones archive. The store gets leaner, not fatter.
+- **Isolation and offline** — memories can be scoped per agent and workspace; point the embedder at a local model and semantic search runs fully offline, with no API key.
+- **Delete the session ≠ delete the memory** — memories are cross-session knowledge; clearing a chat window leaves what was saved alone.
-**An upgrade replaces code, not your memories or settings.**
+> How does it compare with Zep / Mem0 / Letta / Hindsight? There is an 11-row table — storage, retrieval, write-time extraction, offline consolidation, conflicts, forgetting, scoping, auditability, multi-host, offline, license. **"—" does not mean "worse"**: [capability comparison](docs/COMPARISON.md) (Chinese).
-Settings and memories are tables in the **same SQLite file** (`user_settings`, `memories`, …). Its location is set by `memoryDir` and defaults to `~/.dsh/memory` — **not inside the plugin install directory**. Removing and adding the plugin never touches it.
-
-Upgrading means reinstalling over the top, then restarting once:
+### 03 · Install
```bash
-# replace "web" with the profile name you originally installed into; web is the default
-dsh plugin --profile web remove @modusensus/dsh-mneme
dsh plugin --profile web add @modusensus/dsh-mneme
dsh web
```
-> The commands above are for an npm install; if you installed from Git, a tarball or a local directory, reinstall from the same source (see "Four install sources" above). The only requirement is **remove first, then add**.
-> Do not reinstall DSH itself; that rewrites your profile, which is a much larger change and unrelated to the plugin version.
-> Do not `add` without `remove` first — the host may reuse a cached copy, and the version badge not changing is the sign it did.
-
-**This was measured, not assumed**: a database built and filled by v0.12.0 (profile, rules, persona card, four feature flags) opened by the code in this release reads every one of them back unchanged. The reverse was checked too — a database written by this release is readable by v0.12.0. Upgrading and rolling back both keep your settings.
-
-The one way to lose data is pointing the library **inside** your profile scope (`…/profiles//…`), where a profile cleanup takes it along — see "Where to put the memory library" below.
+Two hard requirements — without them it will not install:
-## The memory loop in one diagram
+- **Node 24+** — the store uses `node:sqlite`; on Node 22 the database will not open.
+- **DSH 0.1.x or 0.2.x** — both lines are in range, and CI is green on the 0.2 line.
-```
- write ──► quality filter (drop noise first)
- │
- ▼
- SQLite + local Markdown mirror
- │ (when idle)
- ├─ autoDream : dedupe / merge / archive / fix / freeze-conflict
- └─ Sleep Mode : tiered compression + pattern discovery + relation completion (opt-in)
- │
- ▼
- recall (hybrid search + rerank) ──► inject into the conversation
-```
+> This repository is a **multi-package repo**: the installable plugin lives in `dsh-mneme/`, and the root `package.json` is only a repo shell (`private`, no `dsh` field). Git and tarball specs must point at the subdirectory, or you install the shell itself. All four install sources are in the [full docs](dsh-mneme/README.md) (Chinese).
-## 🧭 M.O.: make "how it's done" live in the repo (v0.9 beta; retired from the panel in v0.13.0)
+Where it lands on your machine:
-> **Status (v0.13.0)**: this group is no longer rendered in the settings panel. The three flags (`actionPipelineEnabled` / `actionRunEnabled` / `actionNudgeEnabled`), the `/mo-run` command and the seat-registration logic are all unchanged — to bring the UI back, add the group back to `FEATURE_GROUPS` and `FEATURE_FIRST_SCREEN`. What follows is the original design write-up.
+| Path | What it is |
+|------|------------|
+| `~/.dsh/memory` | The store itself: the SQLite original plus ten hand-editable Markdown mirrors |
+| `~/.dsh/mneme` | Local embedding model and runtime cache; delete it and it refetches |
+| `~/.dsh-mneme` | CLI / MCP connection settings (url and token) |
-The memory store remembers **why** a thing was done that way, but not **how the thing actually runs**. Where a workflow lives decides whether it can be changed at all: as a line in the memory store it has no diff; as a session prompt it exists once; in someone's head it can't be edited and leaves no trace.
+To remove it:
-So v0.9 moves workflows into the project repository — one file per workflow:
-
-```
-/.mneme/pipelines/.json ← project layer (commit, diff, PR, readable by CI)
-/pipelines/.json ← global layer (fallback; the package ships none today, on purpose)
+```bash
+dsh plugin --profile web remove @modusensus/dsh-mneme
```
-One sentence of division of labour: **memory is the "why", the repo is the "how", the graph is the "what it looks like"**.
-
-- **Guardrails, not tracks** — the graph must leave a legal escape hatch: when the agent judges this path wrong *this time*, the risk tier decides whether it goes ahead and records it, or stops and asks. *Skipped* means this step wasn't needed (≥3 times → propose deleting the step); *bypassed* means the whole path was wrong (≥3 times → propose revisiting the path). **Counted separately** — merged together, neither proposal can ever fire.
-- **Candidates never enter the repo** — drafts live in `/candidates//`, local only. Ten a day, nine dead: in the repo that's just garbage. Promotion requires **both** "walked twice (at least once successfully)" and "can state the counterfactual"; even then the system only *proposes* — commit and push stay a human gate.
-- **The panel and the agent read the same data** — render-only means the agent reads nothing. Node states (`refuted` / `trusted` / `stale` / `candidate`) are derived from run records, never authored; there is no run-record sink yet, so every node is `candidate` — which is exactly why that beta label has to be on the surface.
-
-Off by default (`actionPipelineEnabled`). Design trade-offs and pitfalls: [docs/WORKFLOWS.md](dsh-mneme/docs/WORKFLOWS.md) (Chinese).
-
-## Screenshots
+The plugin directory goes away, the memories in `~/.dsh/memory` stay — delete that directory yourself if you want them gone. The three names are easy to mix up: [directories](dsh-mneme/docs/DIRECTORIES.md).
-> The panel is bilingual and follows your DSH interface language. English shots below; see the [Chinese](#中文) section for the localized UI.
+### 04 · The panel
-
+ Record, browse and filter your memories.
-
- Entities are extracted from your memories, building a relation graph with attributes.
+
+ Entities are distilled from your memories into a relation graph with attributes.
-
- The status panel shows your vector index, LLM spend and consolidation activity at a glance.
+
+ Vector index, LLM spend and consolidation activity at a glance.
-
-
- Retrieval, entity extraction and consolidation toggles are all configured in one place.
-
-
-
-
- Optional write-protect token and feedback channels for a fully local, auditable setup.
-
-
-## Privacy
-
-- Memories stay on your machine: a local SQLite store plus editable Markdown mirrors, with no mneme server in the path
-- Memories are Markdown files, human-readable and editable
-- No mneme API key required; consolidation and summarization use the host model you already configured (`autoDream` / `autoSummarize` are on by default)
-- Want consolidation fully offline too? Point the host at a local model **and** clear `dreamProvider` / `dreamModel` plus `summarizeProvider` / `summarizeModel` (setting those routes talks straight to that provider, so switching the host alone will not help) — or just turn off `autoDream` / `autoSummarize`
-- No telemetry, no analytics, no remote logging
-
-## Use it in other AI tools (MCP)
-
-The plugin ships a zero-dependency stdio MCP server (standalone npm package **`mneme-memory`**, bin `mneme-mcp`). Any MCP client can mount the six memory tools (`memory_save` / `memory_search` / `memory_list` / `memory_get` / `memory_update` / `memory_delete`).
-
-**One-time prerequisites**:
-
-1. DSH is running with the plugin installed (the MCP data plane goes through the plugin's standalone API at `127.0.0.1:8790`)
-2. Generate a token in the DSH panel under **Settings → External API**
+### 05 · Elsewhere
-**Per-client setup** (replace `` with the value from the previous step):
+| Way in | What you get |
+|--------|--------------|
+| **MCP** | A zero-dependency stdio server (standalone package `mneme-memory`); Claude Code / Cursor / Codex / OpenCode and any other MCP client can mount the six memory tools |
+| **Standalone daemon** | `dsh-mneme-serve` keeps the store running: with DSH closed, scripts, web bridges and your own panels read and write the same memories |
+| **Community adapters** | Such as [Mneme-Bridge](https://github.com/SternChiri/Mneme-Bridge), which brings the DeepSeek web chat into the same store |
-| Client | Setup |
-|--------|-------|
-| **Claude Code** | Project-root `.mcp.json`: `{"mcpServers": {"mneme-memory": {"command": "mneme-mcp", "env": {"MNEME_TOKEN": ""}}}}` |
-| **Cursor** | Settings → MCP → Add Server; command `mneme-mcp`, env `MNEME_TOKEN` |
-| **Codex** | `~/.codex/config.toml`: `[mcp_servers.mneme-memory]` section, `command = "mneme-mcp"`, `env = { MNEME_TOKEN = "" }` |
-| **Hermes** | `mcp_servers:` section of `~/.hermes/config.yaml`: `mneme-memory: {command: "mneme-mcp", env: {MNEME_TOKEN: ""}}`, then restart |
-| **OpenCode** | `opencode.json`: `{"mcp": {"mneme-memory": {"type": "local", "command": ["mneme-mcp"], "environment": {"MNEME_TOKEN": ""}}}}` |
-| **OpenClaw** | `openclaw mcp add mneme-memory --command mneme-mcp --env MNEME_TOKEN=`, or Control UI → Settings → MCP |
+### 06 · Docs
-> **Legacy mounts keep working**: `dsh-mneme-mcp` + `DSH_MNEME_TOKEN` remain supported (both the bin and env vars are preserved; no migration needed). If the npm package is not installed globally, use `npx` as the command with args `-p mneme-memory mneme-mcp` (an args array in Claude Code/OpenCode; `args = ["-p", "mneme-memory", "mneme-mcp"]` in Codex). Full config details and security notes: [full docs](dsh-mneme/README.md#mcp-server任意-mcp-客户端接入) (Chinese).
+| To learn | Where |
+|----------|-------|
+| Features, install, config, architecture (full) | [dsh-mneme/README.md](dsh-mneme/README.md) |
+| Every configuration key | [Configuration](dsh-mneme/docs/CONFIGURATION.md) |
+| Which directory is which: `~/.dsh/memory` ≠ `~/.dsh/mneme` | [Directories](dsh-mneme/docs/DIRECTORIES.md) |
+| Head-to-head with Zep / Mem0 / Letta / Hindsight | [Comparison](docs/COMPARISON.md) |
+| Version history | [CHANGELOG](dsh-mneme/CHANGELOG.md) |
-## Serve memories without DSH (standalone daemon)
+### 07 · The road here
-`dsh-mneme-serve` runs the memory store as a long-lived data plane — with DSH closed, third-party integrations (web-bridge tools, scripts, your own panels) still read and write the same memories: the Bearer token is shared with the DSH panel/CLI, routes mirror the external API, and a busy port is a hard error (pick either the daemon or DSH's external API, not both). Phase 1 is LLM-free (consolidation/distillation stay with the DSH host); retrieval defaults to local embeddings (runtime + model auto-provisioned on first boot, `--embed off` to disable).
-
-```bash
-npm i -g @modusensus/dsh-mneme
-dsh-mneme-serve # defaults: ~/.dsh/memory + 127.0.0.1:8790
-```
-
-## Community adapters
-
-Community projects that wire mneme into more platforms — not part of this repository; compatibility is tracked by their maintainers:
-
-| Project | Platform | Description |
-|---------|----------|-------------|
-| [Mneme-Bridge](https://github.com/SternChiri/Mneme-Bridge) | DeepSeek web | Browser extension + local service: web chats are distilled into the mneme store and DSH memories are injected back by topic, so both sides share one memory. Embedded (mounts the lib) and remote (standalone API — pairs with the daemon above) modes |
-
-> Want your project listed? Open a Discussion or send a PR adding a row to this table.
-
-## Docs
-
-| Doc | Path |
-|-----|------|
-| Full plugin docs (features / install / config / architecture) | [dsh-mneme/README.md](dsh-mneme/README.md)(中文) |
-| stdio MCP server — plug the six memory tools into any MCP client (Claude Code / Cursor / …) | [dsh-mneme/README.md · MCP Server](dsh-mneme/README.md#mcp-server任意-mcp-客户端接入)(中文) |
-| Standalone daemon (serve memories without DSH) | [dsh-mneme/docs/DAEMON.md](dsh-mneme/docs/DAEMON.md)(中文) |
-| Configuration reference (all keys) | [dsh-mneme/docs/CONFIGURATION.md](dsh-mneme/docs/CONFIGURATION.md)(中文) |
-| Directory ownership: which directory is what (`~/.dsh/memory` ≠ `~/.dsh/mneme` ≠ `~/.dsh-mneme`) | [dsh-mneme/docs/DIRECTORIES.md](dsh-mneme/docs/DIRECTORIES.md)(中文) |
-| Distill record retention & memory-level provenance (#399) | [dsh-mneme/docs/DISTILL.md](dsh-mneme/docs/DISTILL.md)(中文) |
-| Memory share pack: export and import (`dsh-mneme share` / `receive` / `undo-share`) | [dsh-mneme/docs/SHARE.md](dsh-mneme/docs/SHARE.md)(中文) |
-| Entity structure design | [dsh-mneme/docs/ENTITIES.md](dsh-mneme/docs/ENTITIES.md) |
-| Workflows (M.O.): the workflow lives in the repo, the evidence in memory | [dsh-mneme/docs/WORKFLOWS.md](dsh-mneme/docs/WORKFLOWS.md)(中文) |
-| Semantic architecture | [dsh-mneme/docs/SEMANTIC.md](dsh-mneme/docs/SEMANTIC.md) |
-| Local model guide | [dsh-mneme/docs/LOCAL_MODEL.md](dsh-mneme/docs/LOCAL_MODEL.md) |
-| Capability comparison vs Zep / Mem0 / Letta / Hindsight | [docs/COMPARISON.md](docs/COMPARISON.md)(中文) |
-| Changelog | [dsh-mneme/CHANGELOG.md](dsh-mneme/CHANGELOG.md) |
-| Security | [SECURITY.md](SECURITY.md) |
-| Code of Conduct (attribution, evidence over identity) | [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md) |
-
-## 🗺️ Roadmap
-
-```
-🧬 Gene → 🛡️ Audit hardening → 💤 Sleep maintenance → 🕸️ Recall fusion & graph → ✨ Panel enhancement → 🌡️ Self-evolving memory → 🔐 Scope isolation → 🌐 Ecosystem (MCP / daemon) → 🧭 M.O. (project-level workflows)
-```
+*Rows are maintained by the release-prep script; the current one is updated with the tag.*
| Version | Theme | Status |
|---------|-------|--------|
-| **v0.3** | Gene: entities / time-boxed attributes / relations | ✅ |
-| **v0.4** | Sleep Mode: idle 4-phase deep maintenance | ✅ |
-| **v0.5** | Recall fusion & visualization: BM25 + graph + hot memory | ✅ |
-| **v0.6** | Session lifecycle: delete session ≠ delete memory | ✅ |
-| **v0.7** | Self-evolving memory: heat decay + sleep dual-protection + desktop workbench/feature toggles | ✅ |
-| **v0.8** | Scope isolation (agent/workspace stamping + retrieval weighting + opt-in hard filter) + conflict review queue + explicit attribution + ecosystem (stdio MCP server / graph recall axis / cold-start bootstrap / injection truncation & status bar / distill reliability / injection shaping & agent-driven organize / configuration reference & issue templates) | ✅ Released (up to v0.8.16) |
-| **v0.9** | M.O. (Modus Operandi) beta: project-level workflows + candidate tiering & promotion criteria + panel list-and-graph view; settings panel re-folded at "beyond the newcomer" (#427); security & supply-chain hardening (declarative route auth, OSV gate, signed releases); **v0.9.1 adds the write side**: execution windows, run ledger, attribution candidates, observation sidecar with drift detection, step `assert`/`optional`, draft mining from session logs, persona page (per-agent cards); **v0.9.2 makes silent failures visible**: feature-flag third state "pending restart", scope-level reversible gate (#471), automatic max_tokens downgrade for consolidation (#478); **v0.9.3 wires up auto-distillation**: resolves the project bucket from the session header's `cwd`, hooks `turn/end`, 10-minute cooldown, 4-second budget, proposals only and never drafts (#489), and fixes the scope reverse-lookup that had been silently degrading since v0.8.0 (#487), the `/nudge` write gate missing `PATCH`/`DELETE`, and a multi-frame zstd counter-assertion bound to Node's whole-buffer decode semantics (#490); **v0.9.4 supplies the missing last link on three chains**: the agent-driven organizing interface finally gets a tool (`memory_organize`, behind `organizeEnabled`, off by default — off means the model cannot even see it), the profile can be drafted from memory (`profileExtractEnabled`, off by default; a draft only — applying it is another user action, and hand-written text is never rewritten by the model), and the persona `default` card is no longer handed to identities that simply have no card (#497, `personaStrictAddressing`, off by default); the panel's "injected text" card is now rendered by a single backend source, plus the distillation transcript fence and parse-failure guard (#494); **v0.9.5 makes memory shareable and recallable**: the `mneme.share/v1` pack (active rows only, no scopes or home prefixes, secret/PII rows dropped whole, report before file, 3 MiB watermark, one bad row rejects the whole pack, dry-run by default, idempotent on `share_external_id`, withdrawal deletes rather than archives), a single predicate guarding "local consolidation never rewrites someone else's imported text" at the dedupe choke point and nine row pools, the provenance read endpoint `GET /memory/provenance` (@z2Ace0107, with 409 and 503 kept as two different answers), plus fixes for duplicate same-title writes (#505), a starved pattern-scan window (#515), five unfenced consolidation prompts (#501/#493) and a merge guard skipping whole categories (#521), and a sticky settings section index (#518) | ✅ Released (v0.9.5) |
-| **v0.10** | Attribution and gates: distillation provenance gains a **run** identity (`distill_runs` per window plus `memory_mints` per row; historical rows left NULL rather than guessed), provenance gains the reverse direction `?sessionId=`, a per-session incognito gate (`sessionGateEnabled`, keyed on the host's own delegation markers with a bounded ledger), anti-sycophancy rules reaching the write side (stance and narration discipline in distillation and overview), `differentiate` moving to a ledger instead of rewriting text (#533), an input budget and catch-up for the sleep conflict phase (#529), the "last consolidation" card no longer showing organize receipts (#495), and the panel's first mobile and 481–519px breakpoints (#542) | ✅ Released (v0.10.0) |
-| **v0.13** | Emotion finally has a place to live: "anxious this time" and "an anxious person" no longer look identical in storage. A new `affective_context` relation carries the emotion word and its attribution; a new sleep phase promotes an emotion to a stable trait only after three independent sessions, downgrading rather than discarding when it falls short, with every downgrade and drop accounted for. Edges for the same occasion merge by session instead of being rewritten each run. Same release: the diary, M.O. removed from the panel, several panel fixes | ✅ Released (v0.13.0) |
-| **v0.14** | Images and emotion both become memory: image descriptions get a provenance table (`image_sources`, so a summary can point back to the picture it came from), and one-off occasions get an injection path (`affectiveInjectEnabled`); recall loses two silent truncations — a 500-row lexical corpus and a 200-row injection pool — now full-width with incremental indexing; and every background LLM call carries a `sessionId`, so strict gateways stop answering 400 (#668) | ✅ Released (v0.14.0) |
-| **v0.12** | Explicit pinning (a `pinned_memories` table behind `memory_pin` — release with `unpin: true` — so pinned rows take their place in the injected block instead of relying on their type; `pinnedInjectBudget` defaults to 0, which leaves the pin pool off) + pinned rows no longer squeezed out by the vector path's `poolSize` cap + automatic facts for "you as the agent sees it" (`profileFactsEnabled`, off by default) + an embedding-resolution cache that follows the working set (hit rate 0% → 100%, single-round retrieval 5.6x faster, storage on `Float32Array`) + #579 chorography tool error paths and "cannot read" no longer answered as "no match" + #590 strict addressing no longer reading "no card was ever created" as "no card for this identity" | ✅ Released (v0.12.0) |
-
-> Full per-minor-version changelog in [CHANGELOG](dsh-mneme/CHANGELOG.md).
-
-## 🧪 Local development
-
-```bash
-cd dsh-mneme && npm install
-npm test # 3446 tests
-npm run stress # three-axis stress test
-npm run sync # src → lib sync
-```
+| **v0.14** | Images and moods became memories; two silent recall truncations removed (500-row lexical corpus, 200-row injection pool) | ✅ Released (v0.14.0) |
+| **v0.13** | Moods finally had somewhere to live: one-off occasions kept apart from stable tendencies | ✅ Released (v0.13.0) |
+| **v0.12** | Explicit pins (`memory_pin`) and an adaptive context budget | ✅ Released (v0.12.0) |
+| **v0.9 / v0.10** | Attribution and gates: distillation runs carry an identity, session-level no-trace gate, anti-sycophancy on the write path | ✅ Released |
---
-## Acknowledgements
+## Privacy
-Provenance of the autoDream concept (ideas credited, implementation original):
+- **Local only.** A SQLite store plus an editable Markdown mirror, with no mneme server in the path.
+- **Memory is a file you can open.** Markdown, human-readable and hand-editable; your edits win when it merges back.
+- **No mneme API key of its own.** Consolidation and summarization use the host model you already configured (`autoDream` / `autoSummarize` are on by default).
+- **Fully offline if you want it** — point the host at a local model *and* clear `dreamProvider` / `dreamModel` plus `summarizeProvider` / `summarizeModel` (setting those routes talks straight to that provider, so switching the host alone will not help), or just turn both switches off.
+- **No telemetry, no analytics, no remote logging.**
-- **[Auto Dream in Claude Code](https://code.claude.com/docs/en/memory)** (Anthropic, Memory 2.0): the conceptual origin — a background sub-agent consolidates memory files between sessions (dedupe, resolve contradictions, prune decay).
-- **[Sleep-time Compute: Beyond Inference Scaling at Test-time](https://arxiv.org/abs/2504.13171)** (UC Berkeley & Letta, arXiv:2504.13171): the academic thread behind the offline-consolidation idea.
-- **cc-haha**: an early reference for the implementation approach.
+
\ No newline at end of file
diff --git a/dsh-mneme/README.md b/dsh-mneme/README.md
index 39b24fa1..4109ed93 100644
--- a/dsh-mneme/README.md
+++ b/dsh-mneme/README.md
@@ -2,18 +2,25 @@
-