Overview
TheGraphStore provides unified storage for entities, timepoints, graphs, dialogs, and all simulation artifacts. Built on SQLModel (Pydantic + SQLAlchemy) with SQLite backend and WAL mode for concurrent access.
Module: storage.py
Database: timepoint.db (SQLite with WAL mode)
Initialization
Signature:- Automatic table creation from SQLModel schemas
- WAL mode enabled for concurrent reads/writes
- 30-second busy timeout for write locks
Transactions
transaction()
Atomic database operations with automatic commit/rollback. Signature:save_entity(entity: Entity) -> Entitysave_timepoint(timepoint: Timepoint) -> Timepointsave_exposure_event(event: ExposureEvent) -> ExposureEventsave_exposure_events(events: list[ExposureEvent])save_dialog(dialog: Dialog) -> Dialogsave_relationship_trajectory(trajectory: RelationshipTrajectory)save_timeline(timeline: Timeline) -> Timelinesave_query_history(query_history: QueryHistory)save_prospective_state(prospective_state: ProspectiveState)
Entity Operations
save_entity()
Save or update an entity. Signature:- If
entity_idexists: Updates all fields - If new: Inserts entity
- Marks
entity_metadataas modified (JSON column)
get_entity()
Retrieve entity by ID. Signature:get_all_entities()
Retrieve all entities. Signature:Exposure Events (M3)
save_exposure_event()
Save a single exposure event. Signature:save_exposure_events()
Batch save exposure events. Signature:get_exposure_events()
Get exposure events for an entity. Signature:entity_id: Entity identifierlimit: Maximum events to return (most recent first)
get_exposure_events_by_run()
Get all exposure events for a simulation run. Signature:get_entity_knowledge_at_timepoint()
Get what an entity knew at a specific timepoint. Signature:Timepoint Operations
save_timepoint()
Save a timepoint. Signature:get_timepoint()
Get timepoint by ID (with LRU caching). Signature:get_all_timepoints()
Get all timepoints ordered by timestamp. Signature:get_timepoints_by_run()
Get all timepoints for a simulation run. Signature:get_timepoints_in_range()
Get timepoints within a time range. Signature:get_successor_timepoints()
Get timepoints that have this timepoint as causal parent. Signature:get_predecessor_timepoints()
Get causal parent(s) of a timepoint. Signature:Graph Operations
save_graph()
Serialize NetworkX graph to database. Signature:load_graph()
Deserialize NetworkX graph from database. Signature:Dialog Storage (M11)
save_dialog()
Save a dialog conversation. Signature:get_dialog()
Get dialog by ID. Signature:get_dialogs_at_timepoint()
Get all dialogs at a timepoint. Signature:load_all_dialogs()
Load all dialogs (for narrative export). Signature:Relationship Trajectories (M13)
save_relationship_trajectory()
Save relationship evolution over time. Signature:get_relationship_trajectory_between()
Get most recent trajectory between two entities. Signature:get_entity_relationships()
Get all relationships involving an entity. Signature:Timeline Management (M12)
save_timeline()
Save a timeline (for counterfactual branching). Signature:get_timeline()
Get timeline by ID. Signature:get_child_timelines()
Get all child timelines of a parent. Signature:Query History (M5)
save_query_history()
Save query history for resolution tracking. Signature:get_query_history_for_entity()
Get query history for an entity. Signature:get_entity_query_count()
Get total queries for an entity. Signature:get_entity_elevation_count()
Get number of resolution elevations. Signature:Prospective State (M15)
save_prospective_state()
Save entity’s expectations and forecasts. Signature:get_prospective_states_for_entity()
Get all prospective states for an entity. Signature:Convergence Evaluation
save_convergence_set()
Save convergence analysis results. Signature:get_convergence_sets()
Get convergence sets with filtering. Signature:get_convergence_stats()
Get aggregate convergence statistics. Signature:total_sets: Number of convergence setsaverage_score: Mean convergence scoremin_score: Minimum scoremax_score: Maximum scoregrade_distribution: Count by grade (A/B/C/D/F)template_coverage: Count by template
SQLite Schema
Tables:entity: Entities with resolution levels and metadatatimepoint: Temporal events with causal chainsexposureevent: Knowledge exposure trackingdialog: Dialog conversationsrelationshiptrajectory: Relationship evolutiontimeline: Timeline branching (counterfactuals)queryhistory: Query pattern trackingprospectivestate: Entity expectationsconvergenceset: Cross-run causal analysissystemprompt: Prompt templatesvalidationrule: Validation configurationsenvironmententity: Scene environmentsatmosphereentity: Scene atmospherecrowdentity: Crowd dynamics
entity_id(unique on entity)timepoint_id(unique on timepoint)timeline_id(on timepoint)causal_parent(on timepoint)run_id(on timepoint, exposureevent, dialog)
Performance
WAL Mode Benefits:- Multiple readers + one writer simultaneously
- Faster writes (no lock blocking)
- Better concurrency
get_timepoint()cached (500 entries)- Speeds up temporal traversal
save_exposure_events()for bulk insertssave_dialogs()for batch dialog storage- Transaction contexts for atomic multi-table writes
Best Practices
- Use transactions for multi-table operations
- Batch exposure events instead of one-by-one
- Set run_id for convergence analysis
- Check entity existence before updates
- Use LRU cache by calling get_timepoint()
- Clean old data periodically with _clear_database()
- Monitor database size (WAL can grow)
Example Workflow
Related
- Schemas - Data models
- Orchestrator - Scene compilation
- LLM Client - Entity population
- Workflows - Entity training

