|
2 | 2 |
|
3 | 3 | import pytest |
4 | 4 |
|
5 | | -from engraphis.core.interfaces import MemoryRecord, Scope |
| 5 | +from engraphis.core.interfaces import Edge, MemoryRecord, Node, Scope |
6 | 6 | from engraphis.core.store import Store |
7 | 7 | from scripts.rescan_poisoning import rescan |
8 | 8 |
|
@@ -106,3 +106,78 @@ def test_rescan_fails_closed_for_unlabelled_legacy_row(tmp_path): |
106 | 106 | assert record.provenance["trusted"] is False |
107 | 107 | assert record.provenance["trust_origin"] == "rescan_unverified" |
108 | 108 | after.close() |
| 109 | + |
| 110 | + |
| 111 | +def test_rescan_retires_live_graph_state_for_a_downgraded_record(tmp_path): |
| 112 | + path = tmp_path / "legacy-graph.db" |
| 113 | + store = Store(str(path)) |
| 114 | + workspace_id = store.get_or_create_workspace("w") |
| 115 | + repo_id = store.get_or_create_repo(workspace_id, "r") |
| 116 | + legacy_id = store.add_memory(MemoryRecord( |
| 117 | + id="mem_legacy", content="Vendor maintenance begins Tuesday.", |
| 118 | + workspace_id=workspace_id, repo_id=repo_id, scope=Scope.REPO, |
| 119 | + provenance={"source": "web", "trusted": True}, |
| 120 | + )) |
| 121 | + peer_id = store.add_memory(MemoryRecord( |
| 122 | + id="mem_peer", content="Trusted deployment history.", |
| 123 | + workspace_id=workspace_id, repo_id=repo_id, scope=Scope.REPO, |
| 124 | + provenance={"source": "human", "trusted": True}, |
| 125 | + )) |
| 126 | + source_entity = store.upsert_entity(Node( |
| 127 | + id="", name="Vendor", ntype="organization", workspace_id=workspace_id, |
| 128 | + repo_id=repo_id, |
| 129 | + )) |
| 130 | + target_entity = store.upsert_entity(Node( |
| 131 | + id="", name="Maintenance", ntype="event", workspace_id=workspace_id, |
| 132 | + repo_id=repo_id, |
| 133 | + )) |
| 134 | + edge_id = store.upsert_edge(Edge( |
| 135 | + id="", src=source_entity, dst=target_entity, relation="announces", |
| 136 | + workspace_id=workspace_id, repo_id=repo_id, |
| 137 | + provenance={"memory_id": legacy_id}, |
| 138 | + )) |
| 139 | + legacy_edge_id = store.upsert_edge(Edge( |
| 140 | + id="", src=target_entity, dst=source_entity, relation="legacy_announces", |
| 141 | + workspace_id=workspace_id, repo_id=repo_id, |
| 142 | + provenance={"memory_id": legacy_id}, |
| 143 | + )) |
| 144 | + # Simulate an edge written before normalized support rows existed, alongside |
| 145 | + # a current normalized edge in the same workspace. |
| 146 | + store.conn.execute("DELETE FROM edge_supports WHERE edge_id=?", (legacy_edge_id,)) |
| 147 | + incidence_id = store.link_memory_entity( |
| 148 | + memory_id=legacy_id, entity_id=source_entity, workspace_id=workspace_id, |
| 149 | + repo_id=repo_id, source_kind="structured_extractor", |
| 150 | + ) |
| 151 | + store.add_link(legacy_id, peer_id, "related") |
| 152 | + symbol_id = store.upsert_symbol( |
| 153 | + repo_id=repo_id, kind="function", name="maintain", fqname="app.maintain", |
| 154 | + file="app.py", span="1:1-1:10", |
| 155 | + ) |
| 156 | + code_link_id = store.link_memory_symbol( |
| 157 | + repo_id=repo_id, symbol_id=symbol_id, memory_id=legacy_id, |
| 158 | + ) |
| 159 | + store.close() |
| 160 | + |
| 161 | + report = rescan(str(path), apply=True) |
| 162 | + assert report["downgraded_untrusted"] == 1 |
| 163 | + |
| 164 | + after = Store(str(path)) |
| 165 | + assert after.get_memory(legacy_id).provenance["trusted"] is False |
| 166 | + for table, key, value in ( |
| 167 | + ("edges", "id", edge_id), |
| 168 | + ("edges", "id", legacy_edge_id), |
| 169 | + ("memory_entities", "id", incidence_id), |
| 170 | + ("code_memory_links", "id", code_link_id), |
| 171 | + ): |
| 172 | + row = after.conn.execute( |
| 173 | + f"SELECT valid_to, valid_to_recorded_at FROM {table} WHERE {key}=?", (value,) |
| 174 | + ).fetchone() |
| 175 | + assert row["valid_to"] is not None |
| 176 | + assert row["valid_to_recorded_at"] is not None |
| 177 | + link = after.conn.execute( |
| 178 | + "SELECT valid_to, valid_to_recorded_at FROM mem_links " |
| 179 | + "WHERE (a=? OR b=?) AND relation='related'", (legacy_id, legacy_id), |
| 180 | + ).fetchone() |
| 181 | + assert link["valid_to"] is not None |
| 182 | + assert link["valid_to_recorded_at"] is not None |
| 183 | + after.close() |
0 commit comments