Files
multi-agent-mux/.agents/reports/reviewer-creator-grok-01/report-dccd6220.md
T
Godopu 94f2e213d2 docs(reports): archive Issue #3 analysis, implementation plan, and multi-agent peer review reports
- Add Rev. 3 technical analysis report from creator-agy-01
- Add implementation plan from planner-reviewer-claude-01
- Add peer review reports across analysis and implementation review loops (Claude, Grok, OpenCode)
2026-08-31 10:30:46 +09:00

2.7 KiB

Cross-review: Issue #3 implementation (daemon detach + Class A resume)

  • Reviewer: reviewer-creator-grok-01
  • Job: dccd6220
  • Diff: lib.sh shim bootstrap, resume_session.sh, update_yaml_resumed.sh, tests (test_uuid_target.py, test_herdr_shim_contract.py)
  • Method: live code + pytest of t8/t14/t15/t16/h26 and full test_uuid_target.py. verify_session.py has no git diff.

1. Daemon spawn (lib.sh / .mam/shim/herdr)

Replaces nohup … & disown with:

_mam_server_pid=$(python3 -c '
import subprocess, sys
p = subprocess.Popen(sys.argv[1:], start_new_session=True, ...)
print(p.pid)
' "$REAL_HERDR" --session "$_MAM_SESSION" server)
  • python3 -csys.argv[0]=='-c', sys.argv[1:] is the herdr argv. Correct.
  • Single-quoted -c body, so $_MAM_SESSION is expanded by bash as an argument, not inside Python. Correct.
  • Child is session-leader via os.setsid; short-lived Python parent exits; herdr is reparented. PGID no longer follows the shim.
  • test_h26 extracts the shipped statement and asserts child PGID ≠ shell PGID.

Met. Portable (no macOS setsid binary).

2. Class A 0-turn resume

Empty UUID: agy|hermes|opencodeFRESH_SPAWN=1 + spawn-spec (not resume-spec). claude|grok still exit 1. YAML update allows empty --uuid, stamps herdr_session_epoch / pending-discovery / session_id_verified: false so reconcile cannot pin a pre-resume transcript.

Tests: t14 (agy dry-run, no --conversation), t15 (claude never-created still RC=1), t16 (live resume bumps epoch).

Met. --role handoff is no longer required for Class A 0-turn recovery.

3. Class B hatch — preserved

verify_session.py:99-101 unchanged (git diff empty). test_t8_resume_unmaterialized_assigned_id passed in this run.

Tests (this reviewer)

pytest tests/test_uuid_target.py \
       tests/test_uuid_target.py::test_t8_… \
       tests/test_uuid_target.py::test_t14_… \
       tests/test_uuid_target.py::test_t15_… \
       tests/test_uuid_target.py::test_t16_… \
       tests/test_herdr_shim_contract.py::test_h26_…
→ 20 passed in 246.19s

bash -n on lib.sh, resume_session.sh, update_yaml_resumed.sh clean.

Residual nits (do not block)

  • Already-running Class A + empty UUID still calls update_yaml_resumed.sh --uuid "", which re-stamps epoch without respawning. Rare (resume-when-alive). Prefer skipping the epoch reset on the has-session attach path.
  • No MAM_VERSION bump (still 4.1.2). Fine if this lands in the same unreleased PATCH; bump to 4.1.3 if 4.1.2 already shipped.
  • Resume SKILL.md still says empty UUID → create. Docs drift only.

No [ESCALATE: PLANNER].


[VERDICT: PASS]