fix(issue-33): subscriber exit codes are named on both sides; wait keeps a spent budget at rc 2; G-8 is deterministic
- job_subscriber.py returns only named codes (RC_COMPLETED 0, RC_ERROR 1, RC_NO_EVENT 2, RC_BROKER_UNAVAILABLE 3, RC_WALL_CLOCK 4). The wrapper mirrors them as SUB_RC_* and compares subscriber codes only by name; a test keeps the mirror equal to the Python constants and forbids numeric comparisons of $sub_rc/$sub_exit and numeric `return` in the subscriber. - `delegate-job wait` passed the subscriber's code straight through, so a spent budget would have reached its callers as 4; it is 2 again (B7 fails without the mapping). - tier1 G-8 gave both clocks 0.5 s and raced; the wall clock now runs out first by construction (idle 30 s) and the test asserts RC_WALL_CLOCK. Other subscriber rc asserts use the names. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
9ec0569401
commit
1673818bb5
6 files changed
+77
-37
No files matched your search
@@ -721,7 +721,7 @@ def test_g5_subscriber_disk_fallback_on_broker_down_exits_0(mam_sandbox, monkeyp
|
||||
"--timeout", "5",
|
||||
"--idle-timeout", "2"
|
||||
])
|
||||
assert rc == 0
|
||||
assert rc == job_subscriber.RC_COMPLETED
|
||||
|
||||
|
||||
def test_g6_subscriber_disk_fallback_outputs_source_tag(mam_sandbox, capsys, monkeypatch):
|
||||
@@ -744,7 +744,7 @@ def test_g6_subscriber_disk_fallback_outputs_source_tag(mam_sandbox, capsys, mon
|
||||
"--job", "g6test01",
|
||||
"--timeout", "5"
|
||||
])
|
||||
assert rc == 0
|
||||
assert rc == job_subscriber.RC_COMPLETED
|
||||
captured = capsys.readouterr()
|
||||
assert "disk-fallback" in captured.out
|
||||
|
||||
@@ -769,7 +769,7 @@ def test_g7_subscriber_disk_fallback_error_status_exits_1(mam_sandbox, monkeypat
|
||||
"--job", "g7test01",
|
||||
"--timeout", "5"
|
||||
])
|
||||
assert rc == 1
|
||||
assert rc == job_subscriber.RC_ERROR
|
||||
|
||||
|
||||
def test_g8_subscriber_wait_any_does_not_exit_early_if_partial_pending(mam_sandbox, monkeypatch):
|
||||
@@ -806,13 +806,15 @@ def test_g8_subscriber_wait_any_does_not_exit_early_if_partial_pending(mam_sandb
|
||||
monkeypatch.setattr(job_subscriber, "make_client", lambda *args, **kwargs: FakeClient())
|
||||
monkeypatch.setattr(mqtt_common, "with_retry", lambda fn, **kwargs: fn)
|
||||
|
||||
# The wall clock (0.5 s) runs out well before the idle window (30 s), so
|
||||
# which timeout ends the wait is decided, not a race (Issue #33 rc split).
|
||||
rc = job_subscriber.main([
|
||||
"--registry-dir", reg_dir,
|
||||
"--wait-any",
|
||||
"--timeout", "0.5",
|
||||
"--idle-timeout", "0.5"
|
||||
"--idle-timeout", "30"
|
||||
])
|
||||
assert rc == 2, "Must timeout waiting for incomplete job2 rather than exiting 0"
|
||||
assert rc == job_subscriber.RC_WALL_CLOCK, "Must timeout waiting for incomplete job2 rather than exiting 0"
|
||||
|
||||
|
||||
def test_g9_subscriber_broker_down_no_disk_terminal_exits_3(mam_sandbox, monkeypatch):
|
||||
@@ -835,14 +837,14 @@ def test_g9_subscriber_broker_down_no_disk_terminal_exits_3(mam_sandbox, monkeyp
|
||||
"--job", "g9test01",
|
||||
"--timeout", "5"
|
||||
])
|
||||
assert rc == 3, f"Expected rc=3 on infrastructure broker down without disk terminal, got {rc}"
|
||||
assert rc == job_subscriber.RC_BROKER_UNAVAILABLE, f"Expected rc=3 on infrastructure broker down without disk terminal, got {rc}"
|
||||
|
||||
|
||||
def test_g10_delegate_job_rc3_not_mistaken_for_error(mam_sandbox):
|
||||
"""G-10: multi-agent-mux-delegate-job maps rc=3 to broker_unavailable and checks disk status."""
|
||||
delegate_script = mam_sandbox / "skills" / "multi-agent-mux-delegate-job" / "multi-agent-mux-delegate-job"
|
||||
content = delegate_script.read_text()
|
||||
assert "elif [[ $sub_rc -eq 3 ]]; then" in content
|
||||
assert "elif [[ $sub_rc -eq $SUB_RC_BROKER_UNAVAILABLE ]]; then" in content
|
||||
assert 'job_status="broker_unavailable"' in content
|
||||
|
||||
|
||||
|
||||
Reference in new issue
Block a user