Round 3 at 134fe97: claude, agy, grok and codex all PASS.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VCgu9Fa9iT7TbJUSzdq4Ff
40 lines
5.7 KiB
Markdown
40 lines
5.7 KiB
Markdown
# Issue #19 review — Codex
|
|
|
|
PASS for clean HEAD `134fe9704c63bd9b1f46b64b01868f904f5a33cc`, base `8e7282c`. No new blocking findings. No planner escalation is needed.
|
|
|
|
Reviewed the branch log from the base and cumulative changes, carrying forward the full-file review through `8f9745b` from job `236cc993` and inspecting the entire new `8f9745b..HEAD` diff. Also checked `git diff 8e7282c...HEAD` for the cumulative subscriber implementation and cumulative diff hygiene. The six commits are `ce315d8`, `38d8ccb`, `4da4a50`, `c096cb4`, `8f9745b`, and `134fe97`. Only the subscriber script, its lifecycle tests, monitor documentation, and VERSIONS changed since the last review. HEAD and the tracked worktree remained stable and clean during verification.
|
|
|
|
## Latest corrections
|
|
|
|
- **Bash nounset:** `_sub_stop` now reads the fallback `$!` with nounset temporarily disabled, avoiding the Bash 3.2 unbound-variable failure before the first background child. It restores nounset, skips an empty PID, tolerates an exited child, and exits 143. The regression passed with no child and with an already-executing child on this host's actual **GNU Bash 3.2.57**. This test does not prove every fork-to-exec scheduling race; its comment accurately limits the exercised window.
|
|
- **Connection-phase signals:** Python installs both handlers before configuring/connecting the MQTT client. The CONNACK wait uses the stop event, and connection-error/acceptance-failure branches check the recorded stop signal before choosing rc 3. The new local silent-listener test verifies signal logging, wrapper rc 143, prompt exit, and absence of polling fallback while awaiting CONNACK. Both existing connected-MQTT tests also passed, exercising the subscription-ready path.
|
|
- **Scope of prompt shutdown:** The local test completes the TCP handshake and then waits for CONNACK. It does not exercise stalled DNS resolution or a blocked synchronous TCP/TLS connection operation; setting an event does not itself cancel those operations. Treat the documentation as the intended cleanup path, not a measured latency guarantee for every network stall.
|
|
|
|
## Cumulative review
|
|
|
|
- Python remains a background child of the waiting Bash wrapper. The trap forwards TERM and waits; strict-shell nonzero paths are intentionally tolerated or captured. Workspace checks use `(st_dev, st_ino)`, catch missing paths, and handle `getcwd` failure in the new check.
|
|
- Internal Python statuses remain 0 normally, 3 for broker fallback, and 1 for lock setup errors. The shell still masks non-3 child failures with its final `exit 0`, as the base already did. This preserves existing behavior; it does not provide external lock-error rc 1.
|
|
- Polling intentionally checks directory/lock presence without retaining the Python lock. An active foreground `--once` pass can defer its trap, and an interrupted sleep can survive until its finite interval expires. These limitations are now documented.
|
|
- Literal `MAM_NO_SUBSCRIBER_DAEMON=1` remains the sole opt-out value. Python and legacy paths preserve existing-PID reporting, missing-monitor validation, and empty stdout/single stderr diagnostic when disabled without an existing daemon. Create documentation correctly qualifies when the PID line is empty.
|
|
- The prior whitespace-path cleanup blocker remains fixed. The full-path matcher preserves root boundaries and rejects ordinary prompt-bearing wrappers; whitespace candidates require an existing file. The live-process regression verifies discovery at both fixture and basetemp roots and actual termination. Cleanup still uses a direct-child snapshot rather than recursive ownership tracking. Import-time Popen binding protects teardown from subprocess monkeypatches, and zombie handling avoids treating terminated processes as live.
|
|
- Fixture cleanup is registered first within that fixture, and the session leak guard uses its own basetemp. Existing subprocess patches need not have been undone when cleanup runs, which is why import-time Popen binding matters.
|
|
- There are now 16 lifecycle cases. Port 9 remains an environmental closed-port assumption. The new local listener uses a kernel-selected port. Two MQTT tests can skip when no broker is reachable; neither skipped here. Timing assertions and conftest imports passed on this host.
|
|
- Version 4.4.5 remains synchronized across lib.sh, eager.py, all eight skill frontmatters, VERSIONS current/matrix, README/BOOTSTRAP variants, and MESSAGING. The release commit remains `release(v4.4.5)`. Updated documentation reflects early handler installation and correctly counts 16 lifecycle tests. The changelog's full-suite figure is recorded prior evidence, not a full-suite run conducted for this job.
|
|
|
|
## Validation
|
|
|
|
Fresh run on `134fe97`:
|
|
|
|
```text
|
|
PYTHONDONTWRITEBYTECODE=1 .venv/bin/python -m pytest -p no:cacheprovider tests/test_issue19_subscriber_daemon_lifecycle.py tests/test_version_consistency.py -q
|
|
19 passed in 39.39s
|
|
```
|
|
|
|
`bash -n` passed for reconcile.sh and lib.sh. `git diff --check 8e7282c...HEAD` passed. Post-run raw `pgrep -f 'pytest-of-.*reconcile.sh --subscribe'` produced three matches; filtering for actual Bash/sh subscriber command shape found **zero daemons**. The session leak guard passed.
|
|
|
|
Earlier independent evidence: all five requested test files passed on `c096cb4` (**140 passed in 314.62s**); the lifecycle/version subset passed on `8f9745b` (**17 passed in 39.74s**). These are explicitly prior-commit results. This review reran the lifecycle and version checks affected by the latest correction, not the entire five-file suite.
|
|
|
|
No source edits, commits, production monitor/lock manipulation, real conversation purge, registry scrubbing, push, merge, or issue updates were performed. Workspace writes were limited to this report and authorized lifecycle events.
|
|
|
|
[VERDICT: PASS]
|