How Semantica Tracks Graph Modifications with Its Change Management Workflow
Semantica provides a Git-like versioning system for knowledge graphs through the TemporalVersionManager class, which records immutable snapshots, computes detailed diffs, and supports rollback to any prior state.
The semantica-agi/semantica repository implements a production-ready change management workflow for tracking modifications to knowledge graphs (KGs). At its core lies the TemporalVersionManager in semantica/change_management/managers.py, which transforms volatile graph operations into auditable, tamper-evident version histories suitable for regulatory compliance.
Understanding the TemporalVersionManager Architecture
The change management workflow centers on TemporalVersionManager, a persistent versioning layer that can use either SQLite for production workloads or an in-memory store for testing. Unlike simple logging, this system captures complete graph state snapshots with SHA-256 checksums, enabling cryptographic verification of data integrity.
Each snapshot stores node and edge collections under both legacy (entities, relationships) and modern (nodes, edges) keys, ensuring backward compatibility while supporting evolving data models.
Setting Up the Change Management Workflow
Initialize the Version Manager
Begin by instantiating TemporalVersionManager with a persistent storage path:
from semantica.change_management import TemporalVersionManager
manager = TemporalVersionManager(storage_path="versions.db") # SQLite persistence
Source: [semantica/change_management/managers.py](https://github.com/semantica-agi/semantica/blob/main/semantica/change_management/managers.py)
Enable Automatic Mutation Tracking
For fine-grained audit events, attach the manager to your graph instance:
manager.attach_to_graph(my_graph) # Records every add/remove operation
This injects a record_mutation callback into the graph's mutation_callback hook, capturing granular change events without manual instrumentation.
Source: [semantica/change_management/managers.py](https://github.com/semantica-agi/semantica/blob/main/semantica/change_management/managers.py)
Creating Snapshots Before and After Modifications
Capture Pre-Change State
Before any destructive operation—deduplication, merge, or conflict resolution—create an immutable baseline:
pre_snap = manager.create_snapshot(
graph=my_graph.to_dict(),
version_label="v1.0",
author="alice@example.com",
description="Snapshot before deduplication"
)
The create_snapshot method (lines 20-29 in managers.py) computes a SHA-256 checksum and persists metadata through a ChangeLogEntry object defined in semantica/change_management/change_log.py.
Source: create_snapshot
Apply Graph Modifications
Execute changes using Semantica's graph tool API:
from semantica.mcp.tools.graph import GRAPH_TOOLS
# Example: add a new node
add_entity_tool = next(t for t in GRAPH_TOOLS if t["name"] == "add_entity")
add_entity_tool["_handler"]({"id": "person_42", "label": "John Doe", "type": "Person"})
The GRAPH_TOOLS collection in semantica/mcp/tools/graph.py provides handlers like add_entity, add_relationship, and their removal counterparts.
Source: [semantica/mcp/tools/graph.py](https://github.com/semantica-agi/semantica/blob/main/semantica/mcp/tools/graph.py)
Capture Post-Change State
Record the modified graph under a new version label:
post_snap = manager.create_snapshot(
graph=my_graph.to_dict(),
version_label="v2.0",
author="alice@example.com",
description="After deduplication"
)
Computing Diffs and Verifying Changes
Generate Detailed Difference Reports
The diff method (lines 68-71) compares any two versions and returns a structured report:
diff = manager.diff("v1.0", "v2.0")
print(diff["summary"]) # Contains counts of added/removed/modified entities and relationships
The diff includes:
- Full entity lists for additions and removals
- Relationship change tracking
- Summary statistics for quick overview
Source: diff
Validate Snapshot Integrity
Each snapshot carries a cryptographic checksum. Verify tamper-evidence with:
assert manager.verify_checksum(post_snap), "Data integrity violation detected"
Rolling Back to Previous States
Restore the graph to any prior snapshot using restore_snapshot (lines 80-92):
manager.restore_snapshot(my_graph, "v1.0", require_confirmation=False)
The require_confirmation parameter provides a safety guard against accidental data loss in production environments. When True, the method prompts for explicit operator confirmation before destructive restoration.
Source: restore_snapshot
Audit and Compliance Features
Semantica's change management workflow supports regulatory requirements including HIPAA, SOX, GDPR, and FDA 21 CFR Part 11 through:
ChangeLogEntryvalidation: Enforces author email format, timestamps, and description requirementsMutationRecordgranularity: Tracks individual node/edge mutations viaget_node_history- Immutable checksums: SHA-256 verification prevents undetected tampering
- Complete provenance chains: Every change links to author identity and temporal context
Complete Workflow Example
# 1. Initialise manager with SQLite persistence
from semantica.change_management import TemporalVersionManager
manager = TemporalVersionManager(storage_path="kg_versions.db")
# 2. Attach automatic mutation tracking
manager.attach_to_graph(my_graph)
# 3. Snapshot before change
pre = manager.create_snapshot(
graph=my_graph.to_dict(),
version_label="pre-dedupe",
author="bob@example.com",
description="Baseline before deduplication"
)
# 4. Apply graph modifications
from semantica.mcp.tools.graph import GRAPH_TOOLS
add_tool = next(t for t in GRAPH_TOOLS if t["name"] == "add_entity")
add_tool["_handler"]({"id": "doc_1001", "label": "Medical Report", "type": "Document"})
# 5. Snapshot after change
post = manager.create_snapshot(
graph=my_graph.to_dict(),
version_label="post-dedupe",
author="bob@example.com",
description="After adding new document node"
)
# 6. Analyze changes
diff = manager.diff("pre-dedupe", "post-dedupe")
print("Summary:", diff["summary"])
for ent in diff["entities_added"]:
print("Added entity:", ent["id"])
# 7. Verify integrity
assert manager.verify_checksum(post), "Checksum mismatch!"
# 8. Roll back if needed
manager.restore_snapshot(my_graph, "pre-dedupe", require_confirmation=False)
Key Source Files
| Component | Purpose | Location |
|---|---|---|
managers.py |
TemporalVersionManager, diff computation, snapshot/restore operations |
semantica/change_management/managers.py |
change_log.py |
ChangeLogEntry and MutationRecord definitions, validation logic |
semantica/change_management/change_log.py |
graph.py |
Graph mutation tools that trigger version manager callbacks | semantica/mcp/tools/graph.py |
change_management.md |
User documentation for checksum usage and compliance workflows | docs/reference/change_management.md |
Summary
TemporalVersionManagerprovides the core change management workflow for tracking graph modifications in Semantica- Immutable snapshots with SHA-256 checksums ensure tamper-evident audit trails
- Automatic mutation tracking via
attach_to_graph()captures fine-grained change events - Structured diffs between versions expose exactly what entities and relationships changed
- Protected rollback with confirmation guards prevents accidental data loss
- Regulatory compliance features support HIPAA, SOX, GDPR, and FDA 21 CFR Part 11 requirements
Frequently Asked Questions
How does Semantica prevent accidental data loss during rollbacks?
The restore_snapshot method includes a require_confirmation parameter that defaults to protective behavior. When enabled, operators must explicitly confirm restoration actions before the graph reverts to a previous state. This safety mechanism is implemented in managers.py lines 80-92.
What storage backends does TemporalVersionManager support?
The manager supports SQLite persistence for production workloads via the storage_path parameter, and falls back to an in-memory store when no path is specified (useful for testing). All snapshots persist as immutable records regardless of backend choice.
Can Semantica track changes to individual nodes over time?
Yes. The get_node_history method retrieves per-node mutation histories through MutationRecord objects stored in change_log.py. This granular tracking enables regulatory queries that demand complete provenance for specific entities.
How are snapshot checksums validated?
Each snapshot computes a SHA-256 checksum during creation via create_snapshot. The verify_checksum method recomputes the hash and compares it against the stored value, detecting any post-hoc modification to snapshot data.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →