From efd27def47a4d67684694ccf43a6ebeede01620f Mon Sep 17 00:00:00 2001 From: Godopu Date: Mon, 12 Oct 2026 10:12:05 +0900 Subject: [PATCH] fix(issue-50): a claimed dry-run job holds its session (review 211037ab F1) open_jobs skips a dry-run record only while it is pending: a pick-pending claim makes it running work, which the admission must wait for. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01VCgu9Fa9iT7TbJUSzdq4Ff --- .agents/skills/lib_py/delegation/wrapper.py | 6 ++++-- tests/test_issue50_dispatch.py | 8 ++++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/.agents/skills/lib_py/delegation/wrapper.py b/.agents/skills/lib_py/delegation/wrapper.py index a6aa42f..386f776 100644 --- a/.agents/skills/lib_py/delegation/wrapper.py +++ b/.agents/skills/lib_py/delegation/wrapper.py @@ -297,9 +297,11 @@ def open_jobs(registry_dir: str, session: str, job_id: str, now: Optional[int] = rec = _load_record(registry_dir, other) if rec is None or _bare(str(rec.get("agent_session") or "")) != sess: continue - if rec.get("dry_run"): # a submit --dry-run is never dispatched (review 1e25cf2f F1) - continue status = rec.get("status") + # a submit --dry-run is never dispatched (review 1e25cf2f F1); once a + # pick-pending claims it, it is running work like any other (211037ab F1) + if rec.get("dry_run") and status == "pending": + continue if status == "running": idle = _int_field(rec, "idle_timeout_sec", DEFAULT_IDLE_TIMEOUT_SEC) if recent_disk_heartbeat(registry_dir, other, idle): diff --git a/tests/test_issue50_dispatch.py b/tests/test_issue50_dispatch.py index d1a5403..12e9d03 100644 --- a/tests/test_issue50_dispatch.py +++ b/tests/test_issue50_dispatch.py @@ -174,8 +174,12 @@ def test_u1e_a_dry_run_record_is_not_an_open_job(tmp_path): me = _register(reg) assert decide.open_jobs(str(reg), "herdr:s", me) == ([], []) assert decide.wait_open_jobs(_ns(reg, me)) == "clear" - # control: the same record without the mark is an `injected` job that holds the session - _edit(reg, dry, dry_run=None) + # claimed by a pick-pending and started, it is running work (review 211037ab F1) + _edit(reg, dry, status="running") + _event(reg, dry, time.time(), event="started") + assert decide.wait_open_jobs(_ns(reg, me)) == f"busy {dry}" + # control: the pending record without the mark is an `injected` job that holds the session + _edit(reg, dry, status="pending", dry_run=None) assert decide.wait_open_jobs(_ns(reg, me)) == f"busy {dry}"