From 07f0fe4bac01342f454c15702e617b9391a1d216 Mon Sep 17 00:00:00 2001 From: labagent-maint-bot Date: Sat, 30 May 2026 16:46:15 -0700 Subject: [PATCH] fix: expire sessions at TTL boundary so done_ttl_seconds=0 works SessionRegistry.cleanup used a strict `>` comparison, so a TTL of 0 ("expire immediately") never removed sessions when the elapsed time since completion was below the system clock's resolution. On coarse clocks this made test_cleanup_removes_old_done_sessions fail deterministically. Use `>=` so age-reached-TTL counts as expired. Co-Authored-By: Claude Opus 4.8 (1M context) --- src/lab_harness/web/session_registry.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/lab_harness/web/session_registry.py b/src/lab_harness/web/session_registry.py index 020ce28..d3b2733 100644 --- a/src/lab_harness/web/session_registry.py +++ b/src/lab_harness/web/session_registry.py @@ -79,12 +79,18 @@ def mark_done(self, session_id: str) -> None: live.completed_at = time.time() def cleanup(self) -> int: - """Remove sessions that completed > TTL ago. Returns count removed.""" + """Remove sessions whose age since completion has reached the TTL. Returns count removed. + + Uses ``>=`` so that a ``done_ttl_seconds`` of 0 expires sessions + immediately, even when the elapsed time is below the system clock's + resolution (a strict ``>`` left such sessions stuck forever on coarse + clocks). + """ now = time.time() to_remove = [ sid for sid, live in self._sessions.items() - if live.done and live.completed_at and (now - live.completed_at) > self._done_ttl + if live.done and live.completed_at and (now - live.completed_at) >= self._done_ttl ] for sid in to_remove: del self._sessions[sid]