Synaptic documentation

Repository Memory

Source: GitHub Wiki · Published Edit this article

Synaptic repository memory is a durable, revision-aware overlay on the code graph. It preserves what happened around the graph -- changes, failures, regressions, decisions, conventions, and verification outcomes -- without turning summaries into ungrounded graph facts.

The graph remains the current structural truth. Memory records live separately under .synaptic/memory/records/ and join back to graph symbols through revision-aware anchors. Every record must cite at least one source artifact.

Why an overlay

graph.json is a replaceable snapshot of the repository at one revision. Repository memory has a different lifecycle: it must survive graph rebuilds, retain obsolete observations for audit, and distinguish an active decision from one that was superseded. Keeping the stores physically separate prevents stale history from masquerading as a current static dependency while still allowing symbol-scoped retrieval.

issues / commits / reviews / agents / ADRs
                    |
                    v
       .synaptic/memory/records/*.json
                    |
        revision-aware SymbolAnchor
                    |
                    v
         current Synaptic code graph

Data contract

A memory record contains:

  • a stable ID derived from repository identity plus an idempotency key;
  • a typed kind, title, compact summary, repository, branch, commit, and occurrence/recording timestamps;
  • one or more source artifacts, each with a stable URI and optional revision and digest;
  • affected symbol anchors containing node ID, label, source path, repository, revision, and anchor confidence;
  • typed old/new symbol transitions for inferred renames across revisions;
  • verification status, commands, and notes;
  • memory confidence, lifecycle, access scope, private-record owner, and typed links to other memories.

Records are immutable observations. A correction is another record with a supersedes link. Normal searches hide records that are retracted, explicitly superseded, or targeted by an active supersedes link.

Supported kinds cover the four memory families:

  • episodic: change_episode, issue, incident, pull_request, review_finding, ci_run, regression, release, customer_report, agent_task;
  • semantic: semantic_summary, plus decisions and invariants that describe stable subsystem responsibility;
  • procedural: procedure and convention;
  • negative: failed_attempt, regression, rejected review_finding, and relevant incident records.

Typed links include changed, introduced, fixed, regressed, motivated_by, reviewed_by, failed_because, verified_by, supersedes, implements_decision, violates_decision, similar_to, observed_in, rolled_back_by, applies_to, and derived_from.

Persistence guarantees

Each record is serialized independently as versioned JSON. Writes create and sync a unique temporary file before an atomic rename. Repeating the same repository/idempotency key with identical content succeeds as already_present; outcome APIs ignore only their server-generated occurrence and recording timestamps when checking a later retry. Reusing the key with different source-grounded content fails. This makes hook and agent retries safe. Schema-version-only differences are normalized during retry comparison, so an older on-disk record remains idempotent after an upgrade.

The local store is deliberately not a vector database. MVP retrieval is deterministic lexical ranking plus exact/substring symbol-anchor filtering, confidence, verification, recency tie-breaking, kind filters, and lifecycle filtering. The source artifact remains visible in every human-readable MCP result.

Automatic and manual capture

synaptic memory ingest <revision> resolves the exact commit, records its subject, timestamp and changed files, and anchors current graph symbols whose source files changed. Git rename/copy detection retains typed old/new path lineage, so history remains searchable through a pre-move path. Structurally equivalent deleted/added declaration lines are also compared against the current graph. A one-identifier transition such as refresh_token to refresh_session produces revision-aware old/new symbol anchors, making the episode searchable through either name.

Installed post-commit and post-merge hooks capture HEAD into an environment variable before starting background work, then run:

synaptic update
synaptic memory ingest "$SYNAPTIC_COMMIT"
synaptic memory refresh

Capturing the SHA before the asynchronous work prevents a later commit from being attributed to the earlier hook event. Git ingestion is idempotent by commit SHA.

synaptic memory ingest-docs scans explicit ADR/decision and procedure/runbook/playbook directories plus root CONTRIBUTING.md, DEVELOPMENT.md, RELEASING.md, and AGENTS.md conventions. It uses the first heading as the title, the first prose paragraph as the compact summary, and the file bytes as a BLAKE3 source digest. An optional metadata line grounds the document to current graph symbols:

Synaptic-Symbols: MemoryStore, affected

A changed document creates a new immutable record that supersedes the previous record from the same source URI.

synaptic memory refresh combines that extraction with deterministic semantic summaries for every labeled graph community. Summaries cite the graph artifact, retain its commit, anchor representative symbols, and supersede the prior community summary when the graph changes.

External systems use synaptic memory import-artifacts --file <JSON>. The synaptic.memory-artifacts/v1 envelope supports issue, pull-request, review, CI-run, incident, release, customer-report, regression, failed-attempt, and agent-task records. Each item requires an external ID, source URI, repository, timestamp, title, and summary; its exact canonical payload is digested. Changed versions of the same source supersede earlier observations.

Agents and CI can record a verified outcome explicitly:

synaptic memory record \
  --idempotency-key agent-task-42 \
  --title "Refresh lock attempt failed" \
  --summary "Holding the session mutex across network I/O deadlocked refresh." \
  --outcome failed \
  --source-uri agent://task/42 \
  --symbol refresh_token \
  --verification-status failed \
  --verification-command "cargo test auth_refresh"

Use a stable issue, task, run, or patch identifier as the idempotency key. source-uri should be a resolvable artifact locator, not a description invented for the memory.

MCP surface

When synaptic serve starts, it opens <source-root>/.synaptic/memory. Five read-only tools are always added:

ToolIntended question
search_memoryWhat source-grounded history is relevant to this query?
explain_historyWhat happened previously around this symbol or file?
find_similar_changeWhich earlier changes had similar intent and outcomes?
known_pitfallsWhich failures, regressions, incidents, or review findings apply?
explain_decisionWhich active ADRs, invariants, conventions, or procedures govern this?

record_change_outcome is not advertised or callable unless the trusted operator starts the server with --allow-memory-write. It requires a stable idempotency key and source URI. This gate is independent of --allow-exec.

All six tools return a concise evidence rendering and typed structuredContent. The record response resolves affected symbol names against the loaded graph when possible; unresolved names remain lower-confidence raw anchors instead of being discarded.

get_node, affected, and predict_edit append a bounded repository-memory evidence block when their subject has anchored history. predict_impact, working_changes_impact, and get_pr_impact aggregate the same evidence over their entire changed-file set, deduplicate immutable records, and retain the matching subjects. Pitfalls sort first, followed by decisions and ordinary history; every row cites its source. Typed responses mirror the block under structuredContent.memory_evidence.

Indexed retrieval

The store builds a lazy in-process index over immutable records. Text tokens, symbol/path tokens, and kinds narrow the candidate set before exact scoring and lifecycle filtering. Parsed records and indexes are reused across calls.

Each query fingerprints the sorted record filenames, lengths, and modification times. A record appended by a hook, CLI, or another MCP process invalidates the cached view deterministically on the next query. The index changes performance, not ranking or result semantics.

synaptic memory compact writes a checksum-verified index.compact-v1.json snapshot. Immutable record files remain the audit source of truth; a process uses the snapshot only while its full record fingerprint matches, and safely falls back after any append.

Reads can federate additional stores with memory search --peer <STORE> or serve --memory-peer <STORE>. Replicated identical IDs deduplicate; divergent content under one ID fails closed. memory export and memory sync exchange a checksummed synaptic.memory-bundle/v1 file, preserving source, lifecycle, ownership, and access scope while filtering exports and imports through the configured principal.

Access and trust boundary

Access scope is stored on every record (private, repository, or a named workspace). Private records retain an owner. Library, CLI, and MCP reads filter before totals, candidate diagnostics, supersession, or rendering, so hidden records do not leak through counts or lifecycle effects. Writes enforce the same policy.

Omitting principal options keeps trusted local operator behavior. A restricted server uses --memory-principal, repeated --memory-repository-claim and --memory-workspace-claim, and optional --memory-allow-private. The principal is server configuration, never a caller-controlled tool argument. Continue to use API keys and filesystem isolation for HTTP transport security.

Evaluation

synaptic memory eval --manifest <JSON> runs synaptic.memory-benchmark/v1 cases against source URIs and reports recall@1, recall@5, mean reciprocal rank, mean candidate fraction, and per-case misses. --min-recall-at-5, --min-mrr, and --max-candidate-fraction make the report a CI gate. The manifest is corpus-neutral, so historical repository incidents or SWE-bench-style task sets can supply the cases.

Memory summaries are evidence pointers, not authority. Agents should inspect the cited artifact when a decision is consequential, consider confidence and verification, and include superseded records only when explicitly investigating history.

Implementation completeness

The table is the current implementation contract, not a roadmap presented as finished work.

CapabilityStatusCurrent boundary
Versioned record model, source requirement, lifecycle, typed links, confidence, verification, scopeCompleteLibrary model and JSON schema are implemented.
Durable local persistence and idempotent retryCompleteAtomic per-record JSON, schema-upgrade retry compatibility, and verified compact snapshots.
Deterministic lexical/symbol retrieval and supersession filteringCompleteNo embedding or learned reranker.
Exact-revision Git commit ingestionCompleteCaptures commits and graph anchors for changed files.
Git file rename/copy lineageCompleteStores typed old/new paths and retrieves an episode through either path.
Post-commit and post-merge captureCompleteInstalled hooks record the captured SHA and refresh semantic/procedural memory after graph update.
CLI memory workflowCompleteIngest, import, refresh, authorized/federated search and record, compact, export/sync, status, and eval are implemented.
Five read MCP tools plus gated outcome writerCompleteTool contracts and structured responses are integration-tested.
Current-graph symbol groundingCompleteMCP outcome writes resolve nodes; Git ingestion anchors changed-file nodes.
Rename/move identity across revisionsCompleteFile lineage and conservative one-identifier symbol rename inference retain old/new revision anchors.
Access-scope enforcementCompletePrincipal policy covers private ownership, repository/workspace claims, reads, diagnostics, supersession, exports, imports, and writes.
Issue, PR, review, CI, incident, release, agent-task, and ADR adaptersCompleteCanonical external envelopes and repository document adapters are source-digested, anchored, idempotent, and superseding.
Generated semantic subsystem summaries and procedural extractionCompleteRoot conventions and explicit procedure roots are extracted; hooks refresh deterministic community summaries.
Memory evidence injected into graph-impact responsesCompleteSingle-symbol, explicit file-set, working-tree, and PR-impact responses attach bounded deduplicated evidence.
Large-store inverted index, compaction, federation, and team syncCompleteCached indexes, external invalidation, verified snapshots, collision-safe peers, and checksummed bundles are implemented.
Repository-memory benchmark/evaluation harnessCompleteCorpus-neutral localization cases report recall@1/@5, MRR, selectivity, misses, and enforceable CI thresholds.

Second implementation slice

The second implementation pass is complete for its four scoped deliverables:

SliceStatus
Git file rename/copy history with old-path retrievalComplete
Source-grounded ADR/procedure discovery, hashing, anchoring, retry, and supersessionComplete
Bounded memory evidence on symbol and single-symbol impact responsesComplete
Cached inverted retrieval with deterministic external-write invalidationComplete

Completion slice

The final implementation pass completed the remaining production gaps:

SliceStatus
Revision-aware symbol rename inferenceComplete
External issue/PR/review/CI/incident/release/agent adaptersComplete
Generated semantic summaries and automatic refreshComplete
Principal-level private/repository/workspace enforcementComplete
File-set, working-tree, and PR evidence aggregationComplete
Verified compaction, federation, and checksummed team syncComplete
Retrieval benchmark metrics and CI gatesComplete