Graphiti report verification
Type: agentic-system-analyses/types/agentic-system-verification.md
Verification
The current reports support publication of a bounded implementation account, with the local attribute-inventory limit below. All four earlier blockers are repaired. The earlier REST/MCP withdrawal limit is also resolved; the edge-attribute clearing omission remains a limit, not a blocker. These dispositions follow independent source inspection, not the correction answers or the previous verdict alone.
The checkout HEAD matches the boundary. SRC-1 supplies implementation and doctrine/design; no target, notebook, test, provider or database was executed. I read all handed reports, correction answers, contracts and the previous verification completely. The structural report-check contains none, so there is no structural failure to route. The empty workflow answers require no repair: the earlier blockers addressed runtime, memory and epistemic, not workflow.
Records and source support
I assessed every declaration, annotation and epistemic ledger entry for its referent, source support, conditions, ordering, consumer and evidence strength. The following groups cover all declared records; source anchors identify implementation reads unless stated otherwise. Supplied record quotations carry the load-bearing passages except for the additional limit quoted below.
- Components and configuration. SRC-1
graphiti_core/llm_client/openai_client.py,graphiti_core/llm_client/openai_base_client.py,graphiti_core/llm_client/gliner2_client.py,graphiti_core/embedder/openai.py,graphiti_core/cross_encoder/openai_reranker_client.pyand the notebook support the five runtime component identities and their separate inference, endpoint and version qualifications. See RT-CMP-openai-client, RT-CMP-openai-embedder, RT-CMP-openai-reranker-client, RT-CMP-gliner2-client and RT-CMP-chat-openai. Configured names do not pin weights; local GLiNER2 loading and its required LLM delegate are distinct paths. SRC-1graphiti_core/graphiti_types.py,graphiti_core/llm_client/llm_runtime.pyandgraphiti_core/prompts/lib.pysupport exact-prompt/group/default routing, builder precedence and conditional schema enforcement in RT-RTE-prompt-routing and RT-CLM-schema-boundary. Legacy helper and direct SDK paths remain correctly outside that guarantee. - Ingestion and write envelopes. SRC-1
graphiti_core/graphiti.pyandgraphiti_core/utils/bulk_utils.pysupport RT-RTE-episode-ingestion, RT-RTE-bulk-ingestion and RT-CLM-write-envelope. Single ingestion resolves entities/facts and hydrates nodes before core persistence, with saga/community work crossing later write boundaries. Bulk creates or loads episodes, writes them before extraction and writes them again after resolution. The serializer does not remove content. One session write therefore cannot establish whole-invocation atomicity. The corrected MEM-OBJ-episodic-node, coverage, core ideas, ingestion annotation, Write side and Integration issues now correctly restrict configured raw suppression to single ingestion; bulk bypasses it at both writes. The epistemic retention ledger's conditional source-access qualification remains compatible with this distinction. - Service admission. SRC-1
server/graph_service/routers/ingest.py,server/graph_service/zep_graphiti.py,mcp_server/src/services/queue_service.pyand the MCP admission body support RT-RTE-service-admission and RT-CLM-queue-completion. REST captures a request-scoped client and handles cancellation rather than ordinary job exceptions. MCP returns queue acceptance, logs processing failures and sets its worker flag inside the scheduled task. Process-local queues, direct writers and unobserved deployment prevent completion and global-serialization guarantees without negating the wired workers. - Retained objects and summary consumers. SRC-1
graphiti_core/nodes.py,graphiti_core/edges.py,graphiti_core/utils/maintenance/node_operations.py,graphiti_core/utils/maintenance/community_operations.pyandgraphiti_core/driver/neo4j/operations/episode_node_ops.pysupport memory's episode, entity, fact, metadata, vector, community and saga objects and their epistemic counterparts/parts. See MEM-OBJ-entity-node, MEM-OBJ-entity-edge, MEM-OBJ-graph-metadata, MEM-OBJ-graph-embeddings, MEM-OBJ-community-node and MEM-OBJ-saga-node. Content, symbolic selectors, dense inference outputs and provider parameters remain separate. The explicit Neo4j single-save map omits customer episode metadata; the report correctly withholds a universal roundtrip conclusion. Summary appending, model synthesis, community pairwise reduction and saga folding have different inputs and loss conditions. SRC-1graphiti_core/graphiti.pyconfirms the 20-episode window, strict ingestion-time cursor, character and UTF-8 budgets, summary truncation and submitted-input cursor advancement in MEM-RTE-saga-summary and MEM-CLM-saga-losslessness. The implemented read-back remains supported; no-loss/all-episodes doctrine does not. - Epistemic checks and dispositions. SRC-1
graphiti_core/utils/maintenance/edge_operations.py,graphiti_core/utils/maintenance/node_operations.py,graphiti_core/utils/maintenance/dedup_helpers.py,graphiti_core/prompts/extract_edges.pyandgraphiti_core/prompts/dedupe_edges.pysupport all seven epistemic route declarations and their ledger functions. EPI-RTE-fact-extraction materializes missing named endpoints and falls back to all episodes for empty valid attribution. EPI-RTE-fact-comparison distinguishes normalized-string/endpoint reuse from model judgments; the shortcut bypasses contradiction checking. EPI-RTE-fact-disposition filters indices and applies conditional date comparisons, not independent truth acceptance. EPI-RTE-entity-summary correctly separates literal appending from generated text and name/length admission. EPI-RTE-attribute-extraction supports node overlay and applicable edge replacement; the additional clearing branch is retained below. Model output semantics remain indeterminate without particular outputs and source comparisons, rather than becoming conjecture merely because a model is used. Retention and organization are not promoted to warranted acceptance or post-acceptance integration. - Selection and evidence delivery. SRC-1
graphiti_core/search/search.py,graphiti_core/utils/maintenance/graph_data_operations.py, the core search wrapper,server/graph_service/routers/retrieve.py, MCP search/getter bodies andmcp_server/src/utils/formatting.pysupport RT-RTE-context-retrieval, EPI-RTE-provenance-read and MEM-CLM-display-lineage. Prior episodes use time/source/group selection or explicit UUIDs; query recipes selectively compute vectors. MCP fact search/direct edge reads retain episode/time fields while omitting vectors; recent episodes use a different selector. Notebook bare facts omit those fields. These are channel-specific findings, not universal lineage loss or source authentication. SRC-1README.mdsupplies doctrine for EPI-CLM-temporal-provenance; implemented temporal representation does not establish universally true facts or full raw-source availability. - Maintenance and withdrawal. SRC-1
graphiti_core/graphiti.py,graphiti_core/namespaces/nodes.py, REST router/client and MCP deletion code support RT-RTE-maintenance-writes, MEM-CLM-withdrawal-scope, EPI-RTE-episode-removal and EPI-CLM-cleanup-contract. Triplets resolve supplied content; direct node saves bypass episode extraction. Community rebuild removes old state before replacement. MCP/core deletion tests the first episode reference, not sole support; REST directly deletes the episode node instead. The corrected runtime and memory passages now separate these service effects. Neither path establishes global derived-summary/checkpoint retraction or prior-version restoration. - Conversation, workflow and instructions. I independently read every notebook code cell, excluding historical outputs, from SRC-1
examples/langgraph-agent/agent.ipynb. RT-RTE-conversation-loop, MEM-OBJ-episodic-node, its conversation annotation, EPI-OBJ-episodic-node, the acquisition ledger and all dependent conclusions now agree with the workflow account. Every successful model response schedules ingestion, including tool-call responses. The tools-to-agent edge admits post-tool input; the episode's unconditional user-name prefix does not authenticate human origin. Retrieved facts can recirculate. Five-fact context, ten-fact shoe-tool retrieval, tool/no-tool dispatch, widget display and unawaited ingestion are distinct responsibilities. MEM-OBJ-memory-saver is separate framework checkpoint state. RT-BAP-facts-context establishes requested influence, not compliance. SRC-1mcp_server/docs/cursor_rules.mdsupplies doctrine for RT-BAP-memory-instructions, not proven host loading, tool-name mapping or enforcement. - Evaluation. SRC-1
tests/evals/eval_cli.pyandtests/evals/eval_e2e_graph_building.pysupport RT-RTE-evaluation-comparison and MEM-OBJ-graph-results: model-built baseline export/reload, candidate construction, vector-stripped results, character-sliced message context, non-strict pairing and default not-worse scoring. No production successor installation follows in these functions. This is implemented relative scoring, not an independently certified factual oracle, observed benefit or component intervention.
No member declares evidenced absences. Route wired/architectural implemented statuses remain compatible with uninspected operation. None of the checked passages establishes actual activation, successful improvement or causal benefit. The reports' bounded acceptance and self-improvement qualifications do not assert system-complete negatives.
Relations and conflicts
All Part of: relations have supported containment. Saga summarization and episode removal specialize the maintenance container; extraction, comparison, disposition, summary and attribute routes specialize ingestion. Epistemic attributes, summary, temporal fields, source references, vectors and watermarks identify real parts of their local object containers, without transferring status from container to part.
The four amendments in reconciliation correctly equate episode, entity, community and saga referents while preserving specialist assessments and separately declared parts. Edge, metadata and vector records have different extents; keeping valid overlapping containers is warranted. Component/output, route/checkpoint and evaluator/result-artifact distinctions are sound. Workflow adds annotations rather than duplicate declarations.
The earlier notebook-origin conflict is resolved in the current wording, not merely hidden. The corrected reports agree with the scheduling and tool-return source. Raw-retention reconciliation now states the actual single/bulk discrepancy. Source-docstring contradictions about deletion and losslessness remain explicit but are not cross-report disagreements. No current unresolved conflict requires routing to reconciliation; its integration dispositions preserve the remaining uncertainties rather than selecting a stronger status.
Omission searches and stopping decision
The frozen top-level tree, alternate service entry points and producer/consumer dependencies guided three consequential questions. Does the raw-retention flag cover all inspected episode writes? Complete single/bulk write tracing through the serializer confirms the corrected path distinction. Are notebook episodes necessarily completed human/assistant turns? All code cells, unconditional scheduling and the return-from-tools edge confirm the corrected mixed-origin account. Do alternative readers, direct mutations or evaluators overturn the bounded warrant, withdrawal or routing conclusions? MCP getters/formatters, REST direct deletion, triplet/namespace writes and evaluator dispatch preserve those conclusions, with attribute-transition inventory still incomplete as stated below.
I also searched the shipped example/evaluation tree for additional judging, approval and training paths and inspected SRC-1 tests/e2e_prompt_library_ingest.py ingestion/override assertions and its soft search check. These establish representation/routing smoke checks, not an independent factual acceptance gate or a production improvement loop. Search misses are not absence evidence; other example consumers, provider variants and backend details remain selectively inspected as the reports already state.
Further omission expansion stops because the selected questions have supported dispositions and no identified material challenge remains without one. The retained breadth does not claim all-backend parity, every prompt's semantic fidelity, exhaustive evaluator/consumer coverage, deployed host enforcement or effectiveness. Those withheld comparisons do not justify an exhaustive repository audit. The bounded implementation conclusions remain supported with the local inventory limit below.
Blockers
none
Limits
- EPI-RTE-attribute-extraction supports node overlay versus applicable edge replacement, but does not inventory the additional edge-clearing branch in SRC-1
graphiti_core/utils/maintenance/edge_operations.py. After the early-return paths, a supplied schema map without an applicable relation model clears prior attributes. This leaves the reported positive merger findings valid; readers should withhold a complete comparison of schema-transition withdrawal behavior. The branch does not establish uniform clearing across the no-candidate or exact-match shortcuts.elif edge_type_candidates is not None: # Schema map was supplied but this relation has no model. Clear # attributes that belong to a prior schema. Do not wipe when the # caller omitted the map: add_triplet puts caller attributes on the # edge and never passes edge_type_candidates. resolved_edge.attributes = {} ---
graphiti_core/utils/maintenance/edge_operations.py