# analysis/timeline_store.py class TimelineStore: def __init__(self): self.events = [] # ----------------------------- # APPEND EVENT (IMMUTABLE LOG) # ----------------------------- def record(self, event): """ Every state transition in the system must go here. """ self.events.append(event) # ----------------------------- # GET EVENTS FOR NODE # ----------------------------- def get_node_events(self, node_name): return [ e for e in self.events if e.get("data", {}).get("node") == node_name ] # ----------------------------- # GET TIMELINE SNAPSHOT # ----------------------------- def snapshot_at(self, index): if index < 0 or index >= len(self.events): return None return self.events[index] # ----------------------------- # FIND LAST STATE BEFORE EVENT # ----------------------------- def rewind_to_event(self, node_name, event_index): history = [] for i in range(event_index + 1): e = self.events[i] if e.get("data", {}).get("node") == node_name: history.append(e) return history # ----------------------------- # FIND LAST SCHEDULER DECISION # ----------------------------- def last_scheduler_state(self, node_name, event_index): for i in range(event_index, -1, -1): e = self.events[i] if e["type"] == "schedule_decision": if e.get("data", {}).get("node") == node_name: return e["data"] return None