@@ -42,6 +42,10 @@ def parse_timestamp(raw_value: str, *, label: str) -> datetime:
4242 return parsed .astimezone (UTC )
4343
4444
45+ def occurrence_sort_key (raw_value : str , * , label : str , tie_breaker : str ) -> tuple [datetime , str ]:
46+ return parse_timestamp (raw_value , label = label ), tie_breaker
47+
48+
4549def read_runtime_ledger (path : Path , * , workspace_id : str ) -> list [dict [str , Any ]]:
4650 if not path .exists ():
4751 return []
@@ -64,7 +68,13 @@ def read_runtime_ledger(path: Path, *, workspace_id: str) -> list[dict[str, Any]
6468 )
6569 parse_timestamp (occurred_at , label = f"{ path } :{ line_number } :occurred_at" )
6670 events .append (payload )
67- events .sort (key = lambda event : (event ["occurred_at" ], str (event .get ("event_id" , "" ))))
71+ events .sort (
72+ key = lambda event : occurrence_sort_key (
73+ str (event ["occurred_at" ]),
74+ label = f"{ path } :occurred_at" ,
75+ tie_breaker = str (event .get ("event_id" , "" )),
76+ )
77+ )
6878 return events
6979
7080
@@ -84,7 +94,11 @@ def summarize_run_outcomes(events: list[dict[str, Any]]) -> list[RunOutcome]:
8494 if not terminal_events :
8595 continue
8696 terminal_events .sort (
87- key = lambda event : (event ["occurred_at" ], str (event .get ("event_id" , "" )))
97+ key = lambda event : occurrence_sort_key (
98+ str (event ["occurred_at" ]),
99+ label = "terminal runtime-ledger occurred_at" ,
100+ tie_breaker = str (event .get ("event_id" , "" )),
101+ )
88102 )
89103 last_event = terminal_events [- 1 ]
90104 event_type = last_event .get ("event_type" )
@@ -129,7 +143,13 @@ def summarize_run_outcomes(events: list[dict[str, Any]]) -> list[RunOutcome]:
129143 )
130144 )
131145
132- outcomes .sort (key = lambda outcome : (outcome .occurred_at , outcome .run_id ))
146+ outcomes .sort (
147+ key = lambda outcome : occurrence_sort_key (
148+ outcome .occurred_at ,
149+ label = "runtime-ledger outcome occurred_at" ,
150+ tie_breaker = outcome .run_id ,
151+ )
152+ )
133153 return outcomes
134154
135155
0 commit comments