@@ -3884,6 +3884,78 @@ def test_live_visibility_cap_ignores_closed_relations(monkeypatch):
38843884 assert {edge ["id" ] for edge in scene ["edges" ]} == {"edge_bg" }
38853885
38863886
3887+ def test_history_visibility_cap_ignores_edges_learned_after_known_at (monkeypatch ):
3888+ """Future system-time rows must not consume a time-travel visibility budget."""
3889+ service , alpha , beta , _gamma = _seed_service ()
3890+ workspace_id = service .store .get_or_create_workspace ("acme" )
3891+ old_target = service .store .upsert_entity (Node (
3892+ id = "history-old-target" , name = "History Old Target" , ntype = "concept" ,
3893+ workspace_id = workspace_id ,
3894+ ))
3895+ future_target = service .store .upsert_entity (Node (
3896+ id = "history-future-target" , name = "History Future Target" , ntype = "concept" ,
3897+ workspace_id = workspace_id ,
3898+ ))
3899+ service .store .upsert_edge (Edge (
3900+ id = "history-old-edge" , src = alpha , dst = old_target , relation = "old" ,
3901+ workspace_id = workspace_id ,
3902+ ))
3903+ service .store .upsert_edge (Edge (
3904+ id = "history-future-edge" , src = beta , dst = future_target , relation = "future" ,
3905+ workspace_id = workspace_id ,
3906+ ))
3907+ service .store .conn .execute ("UPDATE entities SET created_at=0" )
3908+ service .store .conn .execute (
3909+ "UPDATE edges SET valid_from=0, ingested_at=0 WHERE id='history-old-edge'"
3910+ )
3911+ service .store .conn .execute (
3912+ "UPDATE edges SET valid_from=0, ingested_at=200 WHERE id='history-future-edge'"
3913+ )
3914+ service .store .conn .commit ()
3915+ monkeypatch .setattr (service_module , "MAX_GRAPH_ANALYSIS_EDGES" , 1 )
3916+
3917+ scene = service .graph_scene (
3918+ workspace = "acme" , level = "complete" , include_memory_nodes = False ,
3919+ include_history = True , valid_at = 100 , known_at = 100 ,
3920+ )
3921+
3922+ edge_ids = {edge ["id" ] for edge in scene ["edges" ]}
3923+ assert "history-old-edge" in edge_ids
3924+ assert "history-future-edge" not in edge_ids
3925+
3926+
3927+ def test_live_scene_keeps_entities_before_future_edge_known_at ():
3928+ """An edge learned after known_at must not hide its otherwise unlinked nodes."""
3929+ service = MemoryService .create (":memory:" , graph_extractor = "none" )
3930+ workspace_id = service .store .get_or_create_workspace ("acme" )
3931+ source = service .store .upsert_entity (Node (
3932+ id = "known-source" , name = "Known Source" , ntype = "concept" ,
3933+ workspace_id = workspace_id ,
3934+ ))
3935+ target = service .store .upsert_entity (Node (
3936+ id = "known-target" , name = "Known Target" , ntype = "concept" ,
3937+ workspace_id = workspace_id ,
3938+ ))
3939+ service .store .upsert_edge (Edge (
3940+ id = "future-edge" , src = source , dst = target , relation = "future" ,
3941+ workspace_id = workspace_id ,
3942+ ))
3943+ service .store .conn .execute ("UPDATE entities SET created_at=0" )
3944+ service .store .conn .execute (
3945+ "UPDATE edges SET valid_from=0, ingested_at=200 WHERE id='future-edge'"
3946+ )
3947+ service .store .conn .commit ()
3948+
3949+ scene = service .graph_scene (
3950+ workspace = "acme" , level = "complete" , include_memory_nodes = False ,
3951+ valid_at = 100 , known_at = 100 ,
3952+ )
3953+
3954+ node_ids = {node ["id" ] for node in scene ["nodes" ]}
3955+ assert {source , target } <= node_ids
3956+ assert "future-edge" not in {edge ["id" ] for edge in scene ["edges" ]}
3957+
3958+
38873959def test_live_entity_cap_ignores_closed_edge_only_entities (monkeypatch ):
38883960 """Closed-only endpoints must not consume the live entity candidate cap."""
38893961 service , _alpha , _beta , _gamma = _seed_service ()
0 commit comments