666ghj/MiroFish · error · AssertionError
production node pagination did not match raw cursor…
Error message
production node pagination did not match raw cursor traversal
What it means
An AssertionError in the validation script's cross-check: the set of node UUIDs from the production fetch_all_nodes(client, graph_id, page_size=2) must exactly equal the set from _raw_pages(client.graph.node.with_raw_response.get_by_graph_id, graph_id, page_size=2). A mismatch means the production paginator and the raw cursor walk saw different nodes — dropped/duplicated pages or the graph changed between the two traversals. The script is doing its job: proving the pagination contract.
Solutions
- Quiesce the graph — stop updaters/writers and wait for all episodes to process — then rerun the validation.
- Upgrade zep-cloud to the latest version in case one pagination path changed semantics.
- If it persists on an idle graph, dump and diff both UUID sets to see whether nodes are missing or extra, and report to Zep support.
Defensive patterns
Strategy: retry
Try / catch
try:
assert_equal_uuid_sets(baseline_nodes, raw_nodes)
except AssertionError as e:
if "node pagination did not match" in str(e):
# graph may have mutated mid-check; re-fetch both sides back-to-back
baseline_nodes = fetch_all_nodes(client, graph_id, page_size=2)
raw_nodes, _ = _raw_pages(client.graph.node.with_raw_response.get_by_graph_id, graph_id, page_size=2)
assert_equal_uuid_sets(baseline_nodes, raw_nodes)
else:
raise Prevention
- Quiesce the graph before validating: stop updaters and wait for all episodes to process.
- Run the two traversals back-to-back to shrink the mutation window between them.
- Treat repeatable mismatches on an idle graph as an SDK/API pagination bug — report with UUID diffs.
When it happens
Trigger: Running deep validation while the graph is being mutated concurrently between the two traversals; a pagination bug skipping pages in one path; an SDK/API cursor change affecting one path but not the other.
Common situations: The MiroFish updater or another writer still running during validation; zep-cloud SDK upgrade altering one pagination path; Zep Cloud eventual consistency serving different results for back-to-back listings.
Related errors
- production edge pagination did not match raw cursor…
- artifact cursor did not advance
- batch item cursor did not advance
- Graph is in use by active consumer(s)
- MiroFish entity context omitted incoming or outgoing node…
AI-assisted analysis of 666ghj/MiroFish@b5b53acc57 (2026-08-14).
Data as JSON: /api/errors/1080c7650d44205f.
Report an issue: GitHub.
Appendix: source
Thrown at backend/scripts/validate_zep_cloud_integration.py:557
listed_items, batch_pages = _list_batch_items(client, batch_id, page_size=3)
result["batch"] = {
"status": client.batch.get(batch_id=batch_id).status,
"item_count": len(listed_items),
"item_pages_at_size_3": batch_pages,
"episode_uuids": baseline_episode_uuids,
}
print(f"[zep-deep] batch completed pages={batch_pages}", flush=True)
baseline_nodes = fetch_all_nodes(client, graph_id, page_size=2)
baseline_edges = fetch_all_edges(client, graph_id, page_size=2)
raw_nodes, node_pages = _raw_pages(
client.graph.node.with_raw_response.get_by_graph_id, graph_id, page_size=2
)
raw_edges, edge_pages = _raw_pages(
client.graph.edge.with_raw_response.get_by_graph_id, graph_id, page_size=2
)
if {_uuid(item) for item in baseline_nodes} != {_uuid(item) for item in raw_nodes}:
raise AssertionError("production node pagination did not match raw cursor traversal")
if {_uuid(item) for item in baseline_edges} != {_uuid(item) for item in raw_edges}:
raise AssertionError("production edge pagination did not match raw cursor traversal")
if len(baseline_nodes) <= 2 or len(baseline_edges) <= 2:
raise AssertionError("the corpus did not produce enough artifacts to exercise pagination")
baseline_names = {_uuid(node): node.name for node in baseline_nodes}
baseline_ceo = client.graph.search(
graph_id=graph_id,
query="截至2026年4月底,谁担任澜舟科技首席执行官?",
scope="edges",
reranker="cross_encoder",
limit=10,
)
result["baseline"] = {
"node_count": len(baseline_nodes),
"edge_count": len(baseline_edges),
"node_pages_at_size_2": node_pages,
"edge_pages_at_size_2": edge_pages,View on GitHub (pinned to b5b53acc57)