dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
A portable memory protocol for AI agents — load it as standing rules; a curation discipline + reference spec + optional cap hook.
English | 简体中文
**An opinionated, zero-infrastructure memory *protocol* for small-scale, local, file-based agent memory — a strict curation discipline plus a validator (`tools/engramory_doctor.py`), loaded as standing rules** (CLAUDE.md / AGENTS.md / your host's rules file). It is not a database, a framework, or a relevance-loaded skill. Memory is a folder of small, human-readable markdown files plus one always-loaded index. No database, no embeddings, no server — just plain-text files you can open, read, edit, and diff in any editor (the live store itself stays git-ignored).
*Engramory* — coined from *engram* (the physical trace a memory leaves in the
brain) + *memory*. Here: one file = one fact.
⚠️ Unrelated projects share this name. *engram + memory* is an obvious
coinage and at least one other repository arrived at it independently. This
project is only evertinqiao-oss/engramory(npm:dsh-engramory); a same-named
repo under a different owner is not a fork, a mirror, or a newer version of it.
🤖 Are you an AI agent, asked to install or check this? Start at
AGENT-SETUP.md, not at the install steps below. It is the
procedure for working out what your host can actually enforce, whether a store
already exists, what you must not touch, and what to tell the user — the parts
agents reliably get wrong when improvising.
Status: 0.12.1 — experimental. The hard index cap (a PreToolUse hook) isdeterministic for the matched direct-edit tools (Edit | Write | MultiEdit) butNOT a global write guard (shell tools — Bash, PowerShell, a background Monitor
command — plus MCP file tools, external editors, and sync clients bypass it);
the discipline loads as standing rules the model follows, so it's
best-effort, not guaranteed on every task (see SKILL.md §8). Assumes a
single writer / serialized writes. Don't rely on it as a "mandatory, reliable,
cross-agent" memory layer yet.
Engramory is not a new memory architecture. The "markdown files + a small index loaded into context + the model curates it" pattern is now the mainstream shape for agent memory, and it ships in several places already. Engramory stands on:
MEMORY.md-index +lazy detail-file pattern; its system prompt even uses the same user | feedback | project | reference type vocabulary (per anthropics/claude-code#58840; the *public docs* describe only the index + topic files). Engramory is a disciplined superset of this default.
source-of-truth, YAML frontmatter type, [[wikilink]] graph, local-first.
claude-memory-compiler ("a loaded index beats vector search at personal scale"), and the broader family of markdown-memory skills.
What Engramory contributes is the opinionated bundle + the discipline, not the primitives. Do not claim novelty on markdown, frontmatter, wikilinks, a loaded index, one-file-per-fact notes, or curation hygiene — all are prior art.
semantic / episodic / procedural split is established prior art — the CoALA taxonomy, and a named procedural type in LangMem and mem0 — so Engramory does not claim the category. What it does is make procedural feedback the *spine* of a deliberately tiny, hand-authored, human-readable set, with required Why: / How to apply: lines, instead of auto-extracting it into a vector/graph store. The contribution is the packaging and discipline, not the ontology.
update-don't-duplicate, delete-when-wrong, and a negative-scope rule ("don't store what git/CLAUDE.md/the code already records"). Surveys consistently name *modify/delete/forget* as the most under-implemented memory operation — Engramory makes it the spine.
Claude Code reads the first 200 lines / 25 KB (documented behavior), so an unbounded index silently drops memories off the end. Engramory warns at 150 lines / 20 KB, compacts-or-asks before 200 / 25 KB, and ships a hard PreToolUse hook backstop (it blocks only *growth* past the cap — shrinking/compaction edits always pass). Both the line and byte caps apply — whichever is hit first triggers (an index can be under the line count yet over on bytes when the lines run long).
Claude Code has since followed up on this natively: v2.1.186 (released 2026-06-22) reminds the agent to compact the index when it nears the cap, and v2.1.210 (released 2026-07-14) turned an over-cap write into an explicit error instead of a silent truncation. Both are after-the-fact alerts, though — the write still lands, and entries past the cap stay invisible until someone compacts. Engramory's hook denies the write *before* it happens, so a write through the matched edit tools never leaves the index over-cap in the first place (writes outside them — a shell, an MCP file tool — are not gated; see the status note above and SKILL.md §8). The native alerts validate the direction and make a welcome second layer — and older versions and other hosts still have neither.
· storage · recall · human-readable · typed ontology · curation discipline · bounded index · infra Engramory · md files · loaded index → open file · ✅ · ✅ role-based (4) · ✅ contract (model-run) · ✅ 150/200 + hook · none CC auto-memory · md files · loaded index → open file · ✅ · ✅ same 4 types · partial (auto) · ~200-line window* · none (built-in) basic-memory · md + SQLite · semantic/FTS search · ✅ · ✅ freeform type · schema + overwrite checks · ❌ (no loaded index) · SQLite + embeddings obsidian-second-brain · md vault · index-first + search · ✅ · folder-typed · ✅ reconcile/lint · partial · none mem0 / Zep · vector/graph DB · semantic · ❌ (DB) · typed (prefs/episodic/proc.; Zep custom) · auto-extract · n/a · DB + embeddings agentmemory · SQLite + vector index (+opt. graph) · hybrid BM25+vector (+opt. graph), RRF · ❌ (DB/engine) · ✅ 4-tier lifecycle (work./epis./sem./proc.) · auto (capture + dedup + decay) · n/a · iii engine (local) + opt. embeddings
Engramory's lane: minimalism + actionable role typing + curation discipline, zero infra. It does *not* try to out-search basic-memory, out-scale mem0, or out-capture agentmemory — those solve a different problem (auto-capture / auto-ingest at volume) at a different cost point. agentmemory is the closest heavyweight foil: also local-first, but it bets on automatic capture (lifecycle hooks) + hybrid retrieval (BM25 + vectors + optional graph) on a SQLite/iii engine, where Engramory bets on hand-curation + a tiny always-loaded index and ships no engine at all.
* Claude Code's memory docs document this exactly: *"the first 200 lines of MEMORY.md, or the first 25KB, whichever comes first, are loaded at the start of every conversation."* Other hosts vary, so the window stays configurable via the hook's env vars.
Engramory is a **portable memory *discipline*, not a product** — not a database, not a framework, not a relevance-loaded skill, not a Claude-Code-only plugin. The plumbing it rides on (a markdown index + one-file-per-fact notes, the user | feedback | project | reference types, a bounded loaded index) is increasingly shipped *natively* by the host — Claude Code's built-in auto-memory already does it. So Engramory's value is the part hosts don't ship: the explicit curation contract (dedup-before-write, delete-when-wrong, don't-store-what-the-repo- already-has), procedural feedback notes with required Why/How, and a portable way to enforce the size cap.
**The goal is the same discipline on *any* agent — by riding the real cross-agent rails, not by inventing a new standard.** Paste rules-snippet.md into the host's always-loaded rules so the discipline fires every task. On a host that only gives you a flat rules file or a raw file store, that is a real upgrade; on a host that already ships structured memory, Engramory is a thin discipline layer on top — and says so.
On MCP: deliberately not the route for a host that can already read files and load standing rules. Serving memory over MCP would (a) open a *second write channel* that bypasses the pre-write hook — the single deterministic guarantee this project has, and one that already lists MCP file tools among the things that slip past it — and (b) demote recall from an index the host loads *every session* to a tool the model has to remember to call, i.e. back to the weakest rung in §8. For a host that lacks files or standing rules, an MCP entry point is the only way in and is worth adding as a supplement; it is not a replacement for the protocol, and it is not the cross-agent plan.
Engramory uses one canonical store. It does not add a handoff type or a parallel handoff folder. An unfinished task may keep at most one live project note — a ceiling, not a quota — holding the current goal, status, decisions, constraints, blockers, and next concrete step needed to resume it. That note is updated in place: never a dated series of state files, and never a per-turn handoff log indexed beside it. A feedback note is narrower: only a correction or workflow that should be reused beyond that task.
Before a deliberate compact, clear, or move to a new thread, the agent performs one continuity sync: scan the task, dedup/update existing notes, refresh project state, promote reusable feedback, keep durable reference pointers, retire stale or completed transient state, run the size check plus doctor, and verify that a cold-started agent could continue from the repo and memory alone. Continuity never duplicates code or git: a note may keep a stable pointer (branch name, issue/PR number, file path) to re-check, and may record a settled fact ("2.0 shipped on 2026-01-15"), but never current state — the version you are on now, the tip commit, the current test count. It records where to read those.
After a write, the agent reports what was added, updated, archived, and skipped (with reasons, identifying any deletion under archived), plus the index size and check result. Host lifecycle hooks can remind, mark a task dirty, or gate a manual transition; they do not perform or guarantee this semantic sync.
Requires Python 3.9+ for the hook and the tools/ scripts. The commands beloware written aspython; on macOS and most Linux distributions a barepythondoes
not exist, so usepython3there (andpythonon Windows, wherepython3is often
a Microsoft Store stub that does nothing).
rules-snippet.md into your always-loaded rules — ~/.claude/CLAUDE.md (all projects) or the project CLAUDE.md — so the protocol fires on every task, not just when a skill happens to load by relevance.
into your Claude Code skills directory as engramory/, so SKILL.md is available on demand as the detailed reference (path in hooks/INSTALL.md).
hooks/ in your settings.json(snippet in hooks/settings.snippet.json).
at your memory directory; ensure it's .gitignore`d ifinside a repo.
Optional — read the transcripts behind a memory. A note holds the conclusion;
the host's transcripts hold what was actually said. When a note is terse and you
want the reasoning, when you suspect it is stale and want the original evidence, or
when something was discussed but never written down, tools/engramory_trace.pysearches those transcripts — local and read-only, nothing uploaded, indexed, or
embedded:
```bash
python tools/engramory_trace.py "streaming parser" # search this project
python tools/engramory_trace.py --show # replay one session
`By default it searches only what was *said*, not tool output — otherwise a term
taken from a memory matches every turn that re-injected that memory, burying the
discussion that produced it. Where the host stamps an origin session onto a note,
--show goes straight to it. Claude Code only: it parses that host's JSONL layout.This is a convenience for you, not part of the protocol — the discipline in