@@ -312,10 +312,25 @@ def parse_ts(s: str | None) -> datetime | None:
312312 return datetime .fromisoformat (s .replace ("Z" , "+00:00" ))
313313
314314
315- def days_since (ts : datetime | None ) -> int | None :
315+ def seconds_since (ts : datetime | None ) -> int | None :
316316 if ts is None :
317317 return None
318- return max (0 , (datetime .now (timezone .utc ) - ts ).days )
318+ return max (0 , int ((datetime .now (timezone .utc ) - ts ).total_seconds ()))
319+
320+
321+ def activity_age (ts : datetime | None ) -> str :
322+ seconds = seconds_since (ts )
323+ if seconds is None :
324+ return "?"
325+ minutes = seconds // 60
326+ if minutes < 1 :
327+ return "<1m"
328+ if minutes < 60 :
329+ return f"{ minutes } m"
330+ hours = minutes // 60
331+ if hours < 24 :
332+ return f"{ hours } h"
333+ return f"{ hours // 24 } d"
319334
320335
321336def truncate (s : str , n : int = MAX_BODY_CHARS ) -> str :
@@ -519,7 +534,8 @@ def compute_facts(raw: dict[str, Any], author: str) -> dict[str, Any]:
519534 "ci_failing_count" : len (failing ),
520535 "ci_pending_count" : len (pending ),
521536 "conflicts" : compute_conflicts (pr ),
522- "days_since_last_activity" : days_since (last_activity_ts ),
537+ "seconds_since_last_activity" : seconds_since (last_activity_ts ),
538+ "last_activity_age" : activity_age (last_activity_ts ),
523539 }
524540
525541
@@ -915,7 +931,7 @@ def render_diagnostics_section(results: dict[int, dict[str, Any]]) -> list[str]:
915931 lines .append (f"PR #{ number } " )
916932 lines .append (
917933 f"facts: approved={ facts .get ('approved' )} conflicts={ facts .get ('conflicts' )} "
918- f"days_since_last_activity ={ facts .get ('days_since_last_activity ' )} "
934+ f"last_activity_age ={ facts .get ('last_activity_age ' )} "
919935 )
920936 lines .append ("threads: " + " " .join (f"{ k } ={ v } " for k , v in counts .items ()))
921937 for c in result .get ("classifications" ) or []:
@@ -957,7 +973,7 @@ def render_markdown_compact(
957973 def row_sort_key (pr : dict [str , Any ]) -> tuple [int , int ]:
958974 res = results .get (pr ["number" ]) or {}
959975 facts = res .get ("facts" ) or {}
960- activity = facts .get ("days_since_last_activity " )
976+ activity = facts .get ("seconds_since_last_activity " )
961977 return (activity if isinstance (activity , int ) else - 1 , pr ["number" ])
962978
963979 for side in SIDE_ORDER :
@@ -976,8 +992,7 @@ def row_sort_key(pr: dict[str, Any]) -> tuple[int, int]:
976992 res = results .get (number ) or {}
977993 facts = res .get ("facts" ) or {}
978994 author = facts .get ("author" ) or actor_login (pr .get ("author" ) or {})
979- activity = facts .get ("days_since_last_activity" )
980- activity_cell = "?" if activity is None else f"{ activity } d"
995+ activity_cell = facts .get ("last_activity_age" ) or "?"
981996 pr_cell = f"[{ title } (#{ number } )]({ url } )"
982997 if facts .get ("approved" ):
983998 pr_cell += " ✅"
0 commit comments