Skip to main content

Personal Understanding

Give your AI agent a memory that actually knows you — and can prove where every fact came from.

Verbatim-first · Evidence-chain · Anti-fabrication · Local-first · One folder, zero dependencies

中文文档 · 架构 · 快速开始 · 设计原则

Two skill languages: the repo ships SKILL.md (English) and SKILL.zh-CN.md (中文) — two brains, one shared bilingual engine. Install either by renaming it to SKILL.md in your skills folder. 中文用户可直接用 SKILL.zh-CN.md,配合中文档案效果最佳。

agent-memory mcp claude codex skills local-first personal-knowledge


The problem with every memory system you've tried

Typical agent memory has a dirty secret: the model summarizes first and stores the summary. Your words get paraphrased, compressed, and blended with the model's own interpretations on day one. Six months later, "you" are a stack of lossy summaries — and when the model gets you wrong, you can't even audit why, because the original evidence is gone.

Worse, failures are silent: a corrupted write reports success, an invented date looks plausible, the model's guess about why you are the way you are quietly hardens into "fact".

Personal Understanding flips the pipeline:

Save the exact words first. Derive everything else from them. Prove every path.

Every personal message is captured verbatim and immutably (SHA-256 hashed, timestamped, session-tagged) before anything else happens. Structured understanding — timeline, entities, context cards, causal hypotheses — is then built on top of the evidence, with every derived fact linking back to the quote it came from. When the agent misremembers you, you audit it. When it doesn't know, it says so.

What makes it different

Typical memory tools Personal Understanding
What gets stored first the model's summary your exact words — immutable, hashed
Derived facts traceable to source rarely ✓ every record links back to its verbatim
Model guesses marked as guesses no ✓ hypothesis layer, candidate by default, never silently promoted
Old lossy summaries silently reused ✓ flagged as summary debt — retrieval discloses "this part comes from an old summary"
Says "saved" when the save failed happens ✗ impossible — capture is read back; a hard gate (session_check) must exit 0 before "archive updated" may be claimed
Invented dates, merged people, fake causal edges possible ✗ forbidden by written policy and enforced by validators
Runtime server + vector DB + embeddings one folder, Python stdlib only
Where your data lives often their cloud your machine. Full stop.

Same message, two very different memories

Without Personal Understanding — a typical memory implementation:

You: I finally played my first full song on guitar today. Three weeks until I perform it at my cousin's wedding — honestly less nervous than before. AI: That's awesome, congrats! 🎸 Keep it up!

What got stored: "user played guitar, feeling positive." A lossy summary. No source, no date, no people, no way to check it. Next month it's gone — or worse, silently paraphrased into something you never said.

With Personal Understanding — the same message:

You: I finally played my first full song on guitar today. Three weeks until I perform it at my cousin's wedding — honestly less nervous than before. AI: (first: captures your complete message verbatim — SHA-256-hashed, timestamped, session-tagged — before anything else) (then: derives and links — event "first full song on guitar" · salience supporting · linked to Sara and the wedding goal · updates your current state: performance anxiety ↓) AI: First full song is a real milestone. Last time, performing at the wedding made you nervous — how does it feel now that it's three weeks out?

Every claim traces back to your exact words. Ask "where does that come from?" and the agent shows you the original quote — not a paraphrase of a paraphrase. And when it's the wedding week, the archive checks in by itself.

Highlights

  • 🗣️ Verbatim-first capture — the complete message, word for word, before any summarizing, splitting, or interpreting. Corrections add new captures; nothing is ever silently overwritten.
  • 🔁 Derivation closure — a successful capture is not a finished update. Every capture must be split into records, linked, and closed — or explicitly closed as "nothing new" with a stated reason. Orphans can't slip through.
  • 🧠 Human-like three-layer recallsurvey (a compact routing map) → probe (fan out along entities, context cards, and time neighbors) → deep (verify the exact quote). No vector dumps, no keyword-only search.
  • 📻 Cold recall ladder — for "I forget, we talked about something like this…" moments: probe from any hint, walk time neighbors, then browse a time window like flipping through an old photo album.
  • 🕸️ Entities + context cards — people, schools, places, objects, works, games, concepts, environments — plus cross-entity cards ("school × football") so shared stories are reachable from any side. Vague pronouns are kept as unresolved_referent, never fabricated into fake people.
  • 🔬 Causal hypothesis layer — "why am I like this?" gets a structured answer: claim, mechanism, supports, counterexamples, competing explanations, scope, confidence — always candidate, never presented as fact.
  • Proactive follow-ups — "let's see in a few days" becomes a tracked loop. When it's due, the agent checks back with the original context, not a context-free nag.
  • 🧭 Guided starters — you don't have to know what to say. The skill reads its own gaps (empty domains, open loops, stale current state) and offers one warm, concrete question at a time (python scripts/conversation_starters.py).
  • 🚦 Hard gates, not vibes — three-state validation (clean / warnings / failed), atomic writes everywhere, session_check as a non-zero-exit gate before any "the archive is updated" claim.
  • 📉 Summary debt accounting — legacy material that lost its source is labeled, counted, and disclosed in retrieval. It can never impersonate verbatim.
  • 📊 Audit dashboard — a local, read-only panel: real counts, validation state, and the full chain from any event back to the original words. The point is that you can check the skill follows its own rules.
  • 🔌 Drop-in for your client — an idempotent installer auto-detects and registers a local MCP server across Claude clients, Codex, VS Code / Cursor / Windsurf / Cline / Trae, ZCode, and generic .agents configs.
  • 💾 Backups with integrity — SHA-256-manifested snapshots, mirror-to-second-location support (any rclone remote), and a quarterly salience review that gracefully demotes stale imported weights instead of letting them fossilize.

Architecture

flowchart LR
    A["user message"] --> B{"turn preflight<br/>(router)"}
    B -->|"personal content"| C["immutable verbatim capture<br/>+ SHA-256 · session · source"]
    C --> D["derivation ledger<br/>(pending)"]
    D --> E["derive: events · entities<br/>context cards · hypotheses<br/>follow-ups"]
    E --> F["finalize:<br/>derived / nothing-new"]
    B --> G["survey → probe → deep<br/>progressive retrieval"]
    G --> H["deep = verbatim only<br/>(summary debt disclosed)"]
    F --> I["session_check<br/>hard gate · must exit 0"]
    I --> J["answer"]
    J --> K["feedback loop<br/>helpful / missed / corrected"]
    K -.->|quarterly| L["salience review<br/>+ deep semantic review"]

On disk it's plain files you can read, grep, and back up: sources/conversation/ (immutable verbatim + hashes) and memory/v2/ (fragments, timeline, entities, contexts, follow-ups, hypotheses, decision traces) — with legacy records kept as a compatibility layer and honestly marked summary_only.

Quick start

# 1. clone into your client's skills directory
git clone https://github.com/caix84476-netizen/personal-understanding.git \
    ~/.claude/skills/personal-understanding      # or ~/.codex/skills/ , or your client's equivalent

# 2. bootstrap the archive skeleton (directories + generic domain branches; idempotent)
python scripts/init_archive.py

# 3. register the local MCP server (auto-detects clients; idempotent)
python scripts/install_mcp.py --auto            # Windows: just double-click register-mcp.cmd

# 4. restart your client session — the personal_* tools go live

# 5. open the audit dashboard any time
python scripts/open_dashboard.py                # Windows: double-click open-dashboard.cmd

Requirements: Python 3.10+ · stdlib only, zero pip installs · Windows / macOS / Linux.

Then just talk normally: "I've been feeling…", "remember that…", "why do I keep…" — the skill's description triggers on personal content, captures your words, and takes over from there. Ask "what do you remember about…", or "where does that come from?" and follow the evidence chain.

Your data stays yours

  • Everything is processed locally, in the skill folder. No telemetry, no cloud calls, no embeddings shipped to third parties.
  • The shipped .gitignore blocks memory/, sources/, and backups/ — so you can version-control your skill folder and never commit your private archive by accident.
  • Sensitivity labels (private / highly-private) control relevance, not secrecy-from-you: unrelated questions never leak unrelated private material.

Design principles

These are written policy, enforced by validators — not aspirations:

  1. Verbatim fidelity first — no summary ever poses as the user's words; summary_only is marked as such forever.
  2. No fabricated certainty — uncertain dates stay uncertain; vague pronouns don't become people; single events never become causes.
  3. Newer words outrank older archives — corrections build supersedes / contradicts chains; nothing is silently erased.
  4. One salience axispivotal / key / supporting / passing on a single 0–3 scale; imported weights admit they're heuristics.
  5. Silence is not feedback — only explicit corrections and confirmations, with quotable evidence, feed the feedback loop.
  6. Structure clean ≠ semantically correct — deep review exists precisely because validators can't catch meaning.

Where it came from

Not a framework thought up in one afternoon — a working archive refined through daily use and a dozen hardening rounds (see the CHANGELOG): a salience-decay bug that once shredded frontmatter is why all writes are now atomic and reviewed; survey used to load ~818 KB of legacy catalog per turn — it's a ~90 KB routing map now (~230 ms); the whole derivation-closure and hard-gate machinery exists because "trust me, I saved it" wasn't good enough for real life.

Status

  • Current release: v2.1.0 — schema stable (memory/v2/ v2.0.0), actively maintained.
  • Works with any MCP-capable client; the skill itself works in any language (English by default — it mirrors yours).
  • Roadmap: editable dashboard pages, richer cold-recall ranking, optional encrypted archive-at-rest.

Contributing

Issues and PRs welcome — especially: new client installers for install_mcp.py, dashboard improvements, and i18n of the low-signal detector.

License

MIT © 2026 caix84476-netizen


If Personal Understanding saves you from re-explaining yourself to your AI for the nth time, a star ⭐ helps others find it.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

personal_understanding-2.2.0.tar.gz (114.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

personal_understanding-2.2.0-py3-none-any.whl (121.9 kB view details)

Uploaded Python 3

File details

Details for the file personal_understanding-2.2.0.tar.gz.

File metadata

  • Download URL: personal_understanding-2.2.0.tar.gz
  • Upload date:
  • Size: 114.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.13.15

File hashes

Hashes for personal_understanding-2.2.0.tar.gz
Algorithm Hash digest
SHA256 24c669cd0970433b1a42e9c8831e9b989691aef06b0dff1aa82b016547dab11b
MD5 d789e6c7c5f1322f5d466ef9d0edb076
BLAKE2b-256 2f309f53cc79a9dc9a277b088ed2dc5c86dc2c5fbb9742973d759599101f92df

See more details on using hashes here.

File details

Details for the file personal_understanding-2.2.0-py3-none-any.whl.

File metadata

File hashes

Hashes for personal_understanding-2.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 09a6d9cfabb1ff585e267be522fb6b2ccb05674bb07023e7ca91691e48041165
MD5 78804f98f1b404a53006eba64b311107
BLAKE2b-256 a185c085ff302a5940f71937966836bf59a142134c01ad849bd6ecde4bc91052

See more details on using hashes here.

Release history Release notifications | RSS feed

2.2.2

1 file

2.2.1

1 file

This release

2.2.0 This release

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page