Basic Memory report verification
Type: agentic-system-analyses/types/agentic-system-verification.md
Verification
The runtime, memory, epistemic, workflow and reconciliation members support a bounded source-level account. No material correction is required. The accepted boundary is complete artifact, partial loop, not whole-system coverage. I rechecked SRC-1's checkout HEAD against the frozen revision and found no working-tree changes. I read every supplied member, the four empty correction-answer files and the structural report, which reports none. There are no structural findings requiring routing and no declined objections to adjudicate.
I checked every declared record's referent, source anchors, load-bearing passages, evidence strength and consequential qualifications, and compared the annotations and reconciliation against those declarations. Independent source inspection addressed the mechanisms below; the analysts' reported validation passes were not treated as semantic verification. Source findings use SRC-1 at the registered revision. Nothing in this verification establishes target execution, deployed configuration, model compliance or causal benefit.
Runtime and workflow
- RT-RTE-note-write and RT-RTE-note-materialization: traced the MCP/client/router handoff, path ownership, service transaction, mutation runner, local queue and guarded writer. SRC-1 anchors include
src/basic_memory/mcp/tools/write_note.py,src/basic_memory/mcp/clients/knowledge.py,src/basic_memory/api/v2/routers/note_write_router.py,src/basic_memory/services/note_content_writes.py,src/basic_memory/indexing/accepted_note_mutation_runner.py,src/basic_memory/index/note_content_materialization.py,src/basic_memory/indexing/note_materialization_runner.pyandsrc/basic_memory/runtime/note_materialization.py. Occupied-path refusal, conditional replacement, the collaboration-relay exception and production deferred work support the stated distinctions. Checksum checking is not universal rejection of stale relay writes; file checking and writing are not an atomic compare-and-swap. The report preserves both qualifications. Queue serialization is process-local, and acceptance is not completed file/index/vector publication. The wired implementation and uninspected operation statuses are supported. - RT-RTE-context-build: checked the tool, URI router, context service and hydration seam at
src/basic_memory/mcp/tools/build_context.py,src/basic_memory/api/v2/routers/memory_router.py,src/basic_memory/services/context_service.pyandsrc/basic_memory/api/v2/utils.py. Exact/wildcard lookup, strict fallback, page/related-result bounds and compact shaping support a requested graph-context route. They do not establish a global model-window budget, complete-note replay or relevance quality. - RT-RTE-pi-checkpoint, RT-RTE-hook-checkpoint, RT-BAP-recall-data and the workflow account: independently checked the Pi callback ordering, formatter and subprocess helper in
integrations/pi/extensions/index.ts,integrations/pi/extensions/session.tsandintegrations/pi/extensions/bm-cli.ts, plus the selected Python hook bodies insrc/basic_memory/cli/commands/hook.py. Automatic trust gates differ from manual-command gates. Only user/assistant text reaches the direct draft. Recall selects five results with clipped excerpts; its automatic-attempt flag is consumed before search. Zero exit and JSON parsing do not establish a successful-write discriminant. Workflow retains that delivery weakness rather than promoting a capture notification into verified persistence or task completion. Hook capture precedes checkpoint gates, and fail-open handling does not catch KeyboardInterrupt. No contradiction was found between the workflow annotations and runtime. - RT-CLM-persistent-notes and RT-BAP-server-instructions: checked
src/basic_memory/mcp/server.py. The instruction string supplies persistence and consent guidance, not a service-level human-approval gate. Server/CLI draining and routing code support the qualified lifecycle account. Factory/cloud routing insrc/basic_memory/mcp/async_client.pyalso prevents inferring air-gapped operation from the local path. - RT-CMP-fastembed-provider, RT-CMP-openai-provider and RT-CMP-litellm-provider: checked constructor/model selection and inference calls in their named provider modules and
src/basic_memory/repository/embedding_provider_factory.py. Model names and request identities are not immutable weight identities. Inference-only adapter findings do not settle provider-internal updates or learning through retained text.
Memory parts and host-specific consumers
MEM-OBJ-markdown-content, MEM-OBJ-sync-state and MEM-OBJ-graph-publication have distinct consumers and completion boundaries. Checked fields in src/basic_memory/models/knowledge.py and the pending generation marker/publication payload in src/basic_memory/indexing/accepted_note_write_runner.py. MEM-RTE-note-reload correctly narrows runtime's open read-source question: src/basic_memory/mcp/note_reads.py uses None-only fallback and separately handles slices; src/basic_memory/mcp/tools/read_note.py retains different ordinary text/resource behavior. No universal cache or response-equivalence guarantee is inferred.
MEM-OBJ-envelope and MEM-RTE-trace-archive were checked against src/basic_memory/hooks/envelope.py, src/basic_memory/hooks/inbox.py and src/basic_memory/hooks/archive.py. Metadata, replay accounting, movement and age pruning do not constitute graph-memory promotion. MEM-RTE-note-withdrawal matches the mutation/delete path and search/vector cleanup in the accepted-note runners. skills/memory-lifecycle/SKILL.md prescribes archiving with an explicit mistaken-note exception; it does not prohibit the implemented delete API. Neither deletion nor archive bookkeeping revokes copied host context.
The independent host records remain separate. Checked MEM-CMP-tau-summarizer, MEM-OBJ-capture-record and MEM-RTE-tau-handoff against integrations/tau/continuity.py, registration in integrations/tau/extension.py and the chunk setting in integrations/tau/bridge.py. Previous handoffs actually enter later synthesis; pending/confirmed receipts control recovery; orient reads saved bodies. Instructions request rationale preservation, but do not prove synthesis fidelity. Checked MEM-RTE-hermes-continuity against the capture, prefetch and endpoint-summary functions in integrations/hermes/__init__.py: its summary is extractive, not Tau-style synthesis. Checked MEM-RTE-openclaw-context against the registered context engine, recall formatter and client/capture seams. systemPromptAddition is a real delivery channel, while compaction is delegated and child-note creation does not establish child read-back. These findings support host-specific positive witnesses, not cross-host equivalence.
Epistemic routes and record integration
Checked EPI-OBJ-note-content and EPI-OBJ-capture-draft against the write and Pi formatter routes. Both Part of: relations are semantically valid payload containment despite their route parents. The broad note-content container remains valid alongside memory's narrower body/state/publication parts; no split or further supersession is needed. EPI-OBJ-memory-skills, EPI-RTE-research-note and EPI-RTE-reflect-notes match the shipped research/reflection skills. Source checking, saving approval, durability selection, disagreement preservation and later reflection checkpoints are prescribed. Claimed implementation and doctrine-only architectural status are consistent here. They are not evidence of exercised factual acceptance, installed recurrence or content-directed theory criticism.
Checked EPI-OBJ-inference-result, EPI-OBJ-validation-result, EPI-RTE-schema-inference, EPI-RTE-schema-validation, EPI-RTE-schema-drift and MEM-RTE-schema-report against the three Picoschema engines, schema router/tool and observer seam. Frequency arithmetic warrants claims about supplied representations; policy suggestions are separate. Warning-mode pass can coexist with missing required fields. The core observer is a no-op, and reports do not automatically veto writes or certify factual truth. The reconciliation's single supersession correctly identifies duplicate validation-route identity without discarding either analyst's qualifications.
Checked EPI-OBJ-qa-case, EPI-RTE-qa-answer and EPI-RTE-qa-judge against benchmarks/src/basic_memory_benchmarks/scoring/qa.py. Answer context differs from judge inputs; boolean parsing and metric consumption are implemented. The rubric permits additional noncontradictory assertions. Rejudging is not note revision or model training. The memory evaluator discussion has separate support in the artifact writer and bounded grading search; it does not establish persistence of these particular QA cases. Reconciliation correctly declines that untraced join.
The claim comparisons for EPI-CLM-never-forgets, EPI-CLM-schema-patterns, EPI-CLM-reflect-knowledge and EPI-CLM-qa-accuracy preserve the distinction between promotional/design wording, implementation and results. Indeterminate model-output relations are not mislabeled as demonstrated ampliative conjectures. No evidenced-absence records were declared; uninspected paths are not used as negative witnesses. I found no unresolved source-set conflict or missing material part that invalidates the declared containers. The remaining reconciliation dispositions accurately preserve host differences, reload refinement, withdrawal limits and integration issues rather than selecting stronger statuses.
Omission questions and stopping decision
I used the frozen tracked tree, CLI/MCP registrations, shipped host packages, prompts and producer/consumer dependencies to select three challenges: whether alternate callers defeat the operational admission account; whether other continuity paths defeat Pi-only transformation/delivery conclusions; and whether schema/skill/evaluator outputs license stronger epistemic acceptance or improvement claims. The traced CRUD/relay/file/import alternatives preserve the reports' explicit lack of all-admission coverage. Tau, Hermes and OpenClaw confirm that the reports correctly avoid extending Pi's extraction or delivery semantics across hosts. Schema, research/reflection and QA inspection supports their separated warrants, not a production evaluator-to-update loop.
Additional inspection of SRC-1's src/basic_memory/cli/commands/hook.py and src/basic_memory/mcp/prompts/continue_conversation.py found continuity surfaces not individually inventoried as routes; the local inventory limit below records their consequence. Further omission expansion stopped because the selected challenges now have supported dispositions, no identified contradiction remains, and the emitted conclusions explicitly retain partial-loop scope. Full importer, watcher, cache, remote-worker, host and evaluator inventories would expand coverage but are not needed to preserve these bounded positive findings. Their uninspected behavior cannot be compared as absent, equivalent, safe or effective.
Blockers
none
Limits
- The continuity-route inventory is partial beyond RT-RTE-hook-checkpoint, RT-RTE-context-build and the memory coverage inventory. In SRC-1,
src/basic_memory/cli/commands/hook.pysupplies a Codex post-compaction request for an agent-authored handoff rather than taking the Pi extractive branch;src/basic_memory/mcp/prompts/continue_conversation.pyimplements another requested search/recent-activity delivery path, with 300-character topic-result excerpts and instructions to read more. These are additional instruction/retrieval surfaces, not evidence of successful checkpointing or an additional verified knowledge-production loop. The selected Pi workflow and the separately evidenced host routes remain supported; readers should withhold exhaustive continuity-route counts, complete cross-host transformation comparisons and any inference that every checkpoint uses the common extractive formatter. The reports already leave these surfaces incompletely inspected, so this omission does not invalidate an emitted system-complete value.
"Basic Memory checkpoint required after compaction. Use the " "
codex:bm-checkpointskill now to write one deliberate, durable handoff " ---src/basic_memory/cli/commands/hook.pycontent = content[:300] + "..." if len(content) > 300 else content ---
src/basic_memory/mcp/prompts/continue_conversation.py