- 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
47 lines
2.2 KiB
Markdown
47 lines
2.2 KiB
Markdown
# 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**: `eb76c119` NOT PASS (T1-1, T2-9 `TimeoutExpired`)
|
||
- **Lockstep**: `lib.sh` / `eager.py` / `VERSIONS.md` / 8× `SKILL.md` = **4.4.1**
|
||
- **Static**: `git diff --check 7b761be` clean
|
||
|
||
---
|
||
|
||
## 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)
|
||
|
||
1. **Test budget, not a tighter product bound.** Subscriber `connect` is still `with_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.
|
||
2. **T1-25** still calls `delegate_publish_event` with a pinned token, not the `stop_session.sh` binary. Script wiring was read and is correct.
|
||
3. Full 793-suite not re-run this turn (211 targeted).
|
||
|
||
No `[ESCALATE: PLANNER]`.
|
||
|
||
---
|
||
|
||
[VERDICT: PASS]
|