memory-sync
Skill7 starsChanged 5 months agoMITView on GitHub
Persist new context, terms, learnings, and settled lightweight decisions. Use when the user says remember this, save this for later, add to glossary, note this down, or at session end to consolidate what was learned — that goes to the memory layer (CLAUDE.md hot cache, docs/memory/, docs/inbox.md). Also use to record a decision or remember this decision when the call is a lightweight one shipped outside a spec slice: UI strings, visual and CSS choices, copy, or translation fixes. Those go to docs/decisions/lightweight-decisions.md via decisions.py. Also use when revising, updating, or re-pricing an already-recorded decision: judge whether it now warrants an ADR and promote it if so, rather than editing it in place. Also auto-fires at session end. Do not use for updating specs or code comments. For a NEW load-bearing decision, one with rejected alternatives, or any the user wants written up as an ADR, use `/jig:adr-workflow`; an already-recorded entry that outgrew this home is promoted from here.
2 other projects use a version of this.
Adopted by
Most recently taken up by
- TheElephantCoder/agent-harnesstheir own version, first seen Sep 20, 2026
- TransitionMatrix/godot-dap-mcp-servertheir own version, first seen Nov 8, 2025
Other versions2 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 2
- TransitionMatrix/godot-dap-mcp-server★ 4same name
- TheElephantCoder/agent-harness★ 3same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository21 other files it gives its agents.
- AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- adr-workflowSkill
- analyzeSkill
- arch-reviewSkill
- bug-fixSkill
- clarifySkill
- code-healthSkill
- contractsSkill
- explainSkill
- independent-reviewSkill
- migrateSkill
- orientSkill
- pr-reviewSkill
- reframeSkill
- scaffold-initSkill
- security-reviewSkill
- slice-landSkill
- spec-workflowSkill
- tdd-loopSkill
- vision-elicitationSkill
The file
We split this skill into the rules it gives an agent
3 rules. About 0 are common, 2 are distinctive, and 1 is very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈2
Distinctive · estimate
This author's own choices. Worth a look.
1
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 45
When you see a capitalized reference, acronym, or project-specific term you don't recognize, follow this flow before asking the user:
- Distinctive: line 217
Inbox > glossary: when in doubt. An inbox entry can be promoted later.
- Very specific: line 225
If docs/memory/ or docs/inbox.md don't exist (pre-scaffold-init project), the helper creates them.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Spec 002 (memory layer) is fully closed — all four slices DONE: 002-01 (explicit-sync), 002-02 (lookup-pattern), 002-03 (auto-detect-hooks), 002-04 (reconciliation-integration). 002-04's reconciliation integration is now the Memory-sync gate in the spec-workflow reconciliation checklist.
What this skill does
Persists session-derived context to the memory layer via a deterministic helper.
Claude makes the what / where decisions; memory.py does the file I/O,
idempotency, and self-healing of missing memory structure.
When to invoke
- User says "remember this", "save this for later", "add this to the glossary", "note this down", or similar (→ persist flow below).
- User explicitly invokes
/jig:memory-sync. - An unknown capitalized reference appears in the conversation (→ lookup-pattern flow below).
- Session-end consolidation (after slice 002-03 auto-trigger ships).
- The session settled a non-spec shipped decision — a UI string, visual/CSS choice, translation correction, or scoped brand/icon call made outside a spec slice (→ lightweight-decision flow below). This is the forcing function for out-of-spec work, which has no reconciliation phase to catch it.
Lookup-pattern flow
When you see a capitalized reference, acronym, or project-specific term you don't recognize, follow this flow before asking the user:
seen unknown reference X
↓
python3 memory.py lookup "X" .
↓ exit 0 → use the printed definition; do not ask
↓ exit 2 → ask the user once: "I don't recognize X — what is it?"
↓ user answers
↓
python3 memory.py add-term "X" "<definition>" . (or promote if high-frequency)
↓ next time X appears, lookup hitsConcretely, the commands are:
python3 "${CLAUDE_PLUGIN_ROOT}/skills/memory-sync/memory.py" lookup "<term>" "<target>"
# exit 0 = hit (definition + source on stdout)
# exit 2 = miss (proceed to ask the user)The lookup is case-insensitive and checks hot cache first, then glossary. Hot cache hits win when a term exists in both (the user has explicitly elevated it).
Do not ask twice. Once a term is persisted (via add-term or promote),
future lookups in the same or later sessions resolve without re-asking. If the
user says "I told you this already," check whether you forgot to persist last
time, then persist now.
How to use
- Identify candidate items from the recent session:
- New domain terms — anything the user defined or that needed explaining.
- Learnings — failed approaches, dead ends, "we tried X" gotchas.
- Parked ideas — things mentioned but not yet decided on.
- Frequently-referenced terms — anything used ≥3 times this session.
- Non-spec shipped decisions (spec 083) — UI strings, visual/CSS choices, translation corrections, scoped brand/icon calls settled outside a spec slice. Conditional, to avoid noise: only surface this when the session actually touched such product/UI/out-of-spec work — skip it entirely for pure backend/refactor/spec sessions.
- Load-bearing decision escape hatch (spec 083-06 / ADR-0031) — the enumerated surface list above is not a closed gate. This session-end prompt is the only judgment owner for out-of-spec load-bearing decisions (which have no reconciliation phase), so also surface — regardless of which surface was touched — any decision the canonical ADR trigger covers. Canonical wording — single-sourced from ADR-0031, drift-tested verbatim across all four surfaces: A load-bearing design choice with rejected alternatives — one a future agent would need to know about to avoid undoing it — warrants an ADR even when it changes no module boundary or public contract.
- Decide per item which file it belongs in:
- Niche/domain term → glossary
- Failed approach / gotcha → learnings
- Unresolved/unfinished thought → inbox
- High-frequency term → hot cache (in CLAUDE.md)
- Non-spec shipped decision →
docs/decisions/lightweight-decisions.md
Invoke
memory.pyonce per item with the right command. Always quote the term/definition/body arguments — terms may contain spaces, definitions often contain punctuation:python3 "${CLAUDE_PLUGIN_ROOT}/skills/memory-sync/memory.py" add-term "<name>" "<definition>" "<target>" python3 "${CLAUDE_PLUGIN_ROOT}/skills/memory-sync/memory.py" add-learning "<title>" --body "<text>" "<target>" python3 "${CLAUDE_PLUGIN_ROOT}/skills/memory-sync/memory.py" add-inbox "<text>" "<target>" python3 "${CLAUDE_PLUGIN_ROOT}/skills/memory-sync/memory.py" add-refinement-todo "<raw-markdown-chunk>" "<target>" python3 "${CLAUDE_PLUGIN_ROOT}/skills/memory-sync/memory.py" promote "<term>" "<definition>" "<target>"add-refinement-todoappends raw text (caller composes the markdown chunk — H2 category, deferred-/resolution-trigger structure, etc.) todocs/refinement-todo.mdunder the parallel-session file lock (slice 028-02). Where<target>is the project root (usually.).Non-spec shipped decisions use
decisions.py, notmemory.py(spec 083-05): the file lives indocs/decisions/, notdocs/memory/. Record one with the idempotent helper (it appends in the file's### [Date] — [Title]/ Decision / Context / Scope / Commit template; re-running with the same title is a no-op):python3 "${CLAUDE_PLUGIN_ROOT}/skills/memory-sync/decisions.py" add-lightweight \ --title "<short title>" --decision "<what>" --context "<why>" \ --scope "<which screen / component / string / asset>" [--commit "<SHA/PR>"]The helper seeds
lightweight-decisions.mdfrom jig's template when the project has none (bug 012) and says so — a project that adopted jig before the feature landed never received the file. Never hand-write the file yourself: if the helper refuses because an existing file is not in jig's format, it names both remedies — follow one, don't invent a third.Confirm with the user before writing — it's their decision to record, not yours to infer. If the decision clears the ADR trigger above, route it to an ADR (
adr.py new) instead of here.Revising an already-recorded entry — re-ask the routing question first (spec 100-01 / ADR-0042). A decision's weight can change after it was filed: #121 reports one recorded as bounded, later re-priced by review into a module-boundary change with rejected alternatives, edited in place, and never re-routed. Routing is asked once at first write and never again — so you ask it again here. Before revising, judge the entry as it will read after the change against the canonical ADR trigger quoted above:
Clears the trigger → promote it; do not revise it in place:
python3 "${CLAUDE_PLUGIN_ROOT}/skills/memory-sync/decisions.py" promote \ --title "<existing title>" --no-push [--slug "<adr-slug>"]This creates the ADR via
adr.py new, seeds it from the entry's own fields, and leaves a forward-linking stub so old references still land on a record.--no-pushis shown because you are almost always on a feature branch. Push mode reserves the ADR number onorigin/mainfrom an ephemeral worktree, so the file never lands in your working copy and there is nothing to seed —promoterefuses up-front rather than stranding a reserved ADR on the trunk. Drop--no-push(or use--pr) only when promoting frommainitself; the local ADR lands with the rest of your branch's work.- Still settled, local, and bounded (one screen / component / string /
asset, no real rejected alternatives) → revise it in place. Omitted
fields keep their recorded values:
python3 "${CLAUDE_PLUGIN_ROOT}/skills/memory-sync/decisions.py" update \ --title "<existing title>" [--decision "<what>"] [--context "<why>"] \ [--scope "<where>"] [--commit "<SHA/PR>"]
Judge meaning, not vocabulary. A UI-copy or translation decision saying "X instead of Y" is naming a wording preference, not a rejected architectural alternative — it belongs here. The trigger is about a load-bearing choice a future agent could undo by accident. As with recording, confirm a promotion with the user before running it.
To sweep records written before this guidance existed,
decisions.py lintreports entries whose text reads as ADR-worthy. It is advisory — it matches wording, not meaning, so treat a finding as a prompt to judge, never as a verdict.- Report a summary at the end:
python3 "${CLAUDE_PLUGIN_ROOT}/skills/memory-sync/memory.py" summary <target> - Re-check the team signal as the final step (spec 050-01). This
re-runs scaffold-init's exact team detection (≥2 distinct mailmap git
authors, monorepo-guarded). When the project has grown past solo and
docs/memory/people.mdis absent (and no.jig/no-people-mdopt-out marker is present), the helper surfaces a structured nudge:
The advisory offers three options —python3 "${CLAUDE_PLUGIN_ROOT}/skills/memory-sync/memory.py" team-check <target>[y]bootstrap people.md now,[n]skip this run,[never]suppress future nudges. In an interactive terminal the helper prompts and acts. In agent (non-TTY) context it prints the advisory and exits 0 without blocking — you must surface the advisory to the user, ask which option they want, and relay their choice by re-running with the matching flag:# user chose [y] — create docs/memory/people.md from the template: python3 "${CLAUDE_PLUGIN_ROOT}/skills/memory-sync/memory.py" team-check --bootstrap <target> # user chose [never] — write the opt-out marker, never ask again: python3 "${CLAUDE_PLUGIN_ROOT}/skills/memory-sync/memory.py" team-check --never <target> # user chose [n] — do nothing this run (they'll be asked next memory-sync).team-checkis a no-op whenpeople.mdalready exists, when.jig/no-people-mdis present, or when the project is still solo — so it is safe to run unconditionally at the end of every memory-sync.
Judgment guidance
- Don't over-persist. Persisting trivia bloats memory files. If you wouldn't want to read it back in a future session, don't write it.
- "≥3 references" is your judgment. The helper does not track session counts — you decide when a term has been used enough to deserve hot-cache promotion.
- Inbox > glossary when in doubt. An inbox entry can be promoted later; a premature glossary entry pollutes the searchable terminology.
- The reviewer subagent cannot run this skill. Reviewers read from memory but
must not write — defining the glossary is not the reviewer's job (see
agents/reviewer.md).
Self-healing
If docs/memory/ or docs/inbox.md don't exist (pre-scaffold-init project),
the helper creates them. If CLAUDE.md is absent, promote falls back to
add-term (writes to glossary) and warns on stderr. The skill works on
unscaffolded projects, though scaffold-init is the recommended setup.
Gotchas
add-termandadd-learningare idempotent on the exact heading text. Re-running with the sameterm/titleis a no-op. To genuinely update an existing entry, edit the file by hand or use Edit.add-inboxis NOT idempotent — it always appends. The inbox is a stream; near- duplicates are tolerated and triaged later.promoteis idempotent on a line-anchored- **<term>**match. If a term is in the Key terms list with a slightly different label or hyphenation, it counts as new.promoteinserts new bullets immediately after the### Key termsheading (LIFO — newest first). This is intentional: the most recently promoted term is the most likely to be referenced in the next session. If alphabetical or chronological order is preferred later, this is a design point worth revisiting.- Definitions are stored as-is; markdown is allowed but be conservative — these files are scanned by humans more often than parsed.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

