- Introduce finalize_unfinished in multi-agent-mux-delegate-job for fail-closed atomic transitions - Enforce CAS dispatch_token and attempt_id pinning across engine, CLI, and lifecycle scripts - Integrate Herdr wait_for_agent_idle turn handshake to prevent prompt loss and race conditions - Resolve bash 3.2 set -u empty array expansion compatibility in lib.sh - Preserve Issue #5 R2 contract in CAS transition engine (engine.py, publish_event.py, service.py) - Add comprehensive regression suites (test_issue6_fail_closed.py, test_issue6_turn_handshake.py) - Bump lockstep framework and skills to v4.4.1 across lib.sh, eager.py, VERSIONS.md, 8 SKILL.md - Synchronize documentation (IMPROVEMENTS.md, MESSAGING.md, state-transitions.md, task.md, phase5-e2e.md) - Unanimous PASS achieved across 4 reviewer team leaders (Claude, Codex, OpenCode, Grok) Closes #6
2.2 KiB
2.2 KiB
Issue #6 Phase 1–5 9th-round consensus review (uncommitted vs 7b761be)
- Reviewer:
reviewer-creator-grok-01 - Job:
f0607b93 - HEAD:
7b761be(Issue #6 work still uncommitted) - Prior Grok round:
eb76c119NOT PASS (T1-1, T2-9TimeoutExpired) - Lockstep:
lib.sh/eager.py/VERSIONS.md/ 8×SKILL.md= 4.4.1 - Static:
git diff --check 7b761beclean
1. Round-8 product items (unchanged, still hold)
| Item | This turn |
|---|---|
| B1 bash 3.2 empty arrays | lib.sh:1913, :2007 ${extra[@]+"${extra[@]}"} only |
| B2 R2 | Named expected_attempt still fail-closes if the record has none. Unpinned terminal refuse is attempt_id > 1 + token present + non-operator |
| P2 stop/create pin | stop_session.sh / create_session.sh pass token and attempt into delegate_publish_event; cli.py forwards flags; MAM_JOBS_DIR → --registry-dir |
| N1 | delegate_wrapper in OPERATOR_SOURCES and state-transitions.md / MESSAGING.md §5.1 |
2. The two previous failures
_run_wrapper default and the listed cases (t1_1, t1_2, t1_4, t1_5, t1_7, t1_8, t1_14, t1_15, t1_16, t1_20, t2_8, t2_9) now use timeout=60.
This turn:
- Isolated T1-1 + T2-9: 2 passed in 11.49s
- Brief suite: 211 passed in 211.39s, 0 failed
The hang class from eb76c119 did not reproduce under this load. The original Issue #6 3900s wait_for_job stall is not what those two tests were hitting; they were subprocess deadlines around a slow subscriber connect / idle handshake.
3. Residuals (non-blocking)
- Test budget, not a tighter product bound. Subscriber
connectis stillwith_retry(3 attempts) and is not clipped to--timeout 6/--idle-timeout 2. Under a loaded machine the wrapper can still take tens of seconds before fail-closed runs. 60s pytest headroom hides that; it does not cap connect. Worth a later bound (min(TIMEOUT, connect retries)), not a reason to block this round. - T1-25 still calls
delegate_publish_eventwith a pinned token, not thestop_session.shbinary. Script wiring was read and is correct. - Full 793-suite not re-run this turn (211 targeted).
No [ESCALATE: PLANNER].
[VERDICT: PASS]