Files
multi-agent-mux/.agents/reports/reviewer-agy-01/report-5420eae1.md
T

5.2 KiB

Issue #60 Code Review Report — Round 3 (0e05b1b)

  • Job ID: 5420eae1
  • Reviewer: agy (herdr:reviewer-agy-01)
  • Branch: fix/issue-60-opencode-v2
  • Base .. Head: 74333f87d0c02888c2b5b281e912d97e74348c01 .. 0e05b1b6777ceb837066454ac688e04a0f5d14a0 (5 commits; Round 3 delta: 0e05b1b)
  • Verification Worktree: /var/folders/q_/68sxgw3j073dgjg8wl9s08vw0000gn/T/mam-review/loop-20261018T073639Z-b5cb7f/1

1. Executive Summary

Commit 0e05b1b cleanly resolves all blocking and non-blocking findings raised in Round 2 (cb5f439) without introducing regressions:

  1. Test isolation & Issue #55 path-variable guard (tests/_agent_home_guard.py):
    • XDG_DATA_HOME is added to DROPPED_VARS, so conftest._isolate_agent_homes drops any ambient XDG_DATA_HOME for every test (preventing a sandbox that overrides HOME from resolving the runner's ambient XDG_DATA_HOME via _data_home(ctx)).
    • watch_dirs(ambient) now watches os.path.join(ambient.get("XDG_DATA_HOME") or os.path.join(home, ".local", "share"), "opencode") so the session leak guard monitors the real opencode data directory even when XDG_DATA_HOME is set in the ambient environment.
    • tests/test_issue55_agent_homes.py::test_l1_every_path_variable_the_code_reads_is_accounted_for passes.
  2. status.sh DB path resolution (.agents/skills/multi-agent-mux-status/scripts/status.sh:108-111, 308-311):
    • Both --json and text modes now resolve the opencode DB path via get_adapter('opencode')._resolve_db(DiscoveryContext(workspace=cwd, agent_name='opencode', home_dir=home)) instead of a hardcoded ~/.local/share/opencode lookup, keeping status.sh consistent with reconcile.sh and the adapter's debug paths / XDG_DATA_HOME resolution.
  3. Real binary --version probe isolation (tests/test_issue60_opencode_v2.py:294-301):
    • _real_opencode() now runs opencode --version inside a tempfile.TemporaryDirectory() with HOME and TMPDIR pointed at that temp dir and XDG_* omitted from env, preventing import-time log writes to the user's real ~/.local/share/opencode/log.

2. Verification of Cumulative Changes (74333f8..0e05b1b)

Area Verification Result
Adapter CLI & Schema (opencode.py) spawn_spec / resume_spec use --auto --standalone (and --session <id> when materialized); _resolve_db parses opencode debug paths with fallback to <_data_home>/opencode/opencode.db; discover (WHERE parent_id IS NULL) and verify_artifact query session_v2.
Purge & Residual (opencode.py) Collects _descendants(db, uuid) from session_v2 and legacy session before invoking opencode session delete --standalone -- <uuid>, deletes _LEGACY_TABLES rows for [uuid] + descendants, and reports remaining session_v2 / legacy rows (tagging child sessions with [child session <id>]).
In-Use & Stall Watch (opencode.py) conversation_in_use ignores serve --service holders of opencode.db while detecting --standalone / --session processes; resident_children = ('opencode',) prevents idle opencode serve --stdio --port 0 from tripping background_children while still detecting tool subprocesses under it.
Shell Scripts (create_session.sh, resume_session.sh, update_yaml_resumed.sh, reconcile.sh, status.sh) All shell launch/resume commands use --auto --standalone without --agent; reconcile.sh drift C queries session_v2 with parent_id IS NULL; status.sh uses the adapter's _resolve_db and queries session_v2.
Tests & Guard (_agent_home_guard.py, _fake_opencode.py, test_issue60_opencode_v2.py, test_a4_adapter_contract.py, test_issue31_purge_residual.py, test_tier2_component.py) XDG_DATA_HOME is in DROPPED_VARS and watched by watch_dirs; _real_opencode() runs --version in an isolated temporary HOME/TMPDIR.

3. Test Execution Summary

All tests were executed in the verification worktree (/var/folders/q_/68sxgw3j073dgjg8wl9s08vw0000gn/T/mam-review/loop-20261018T073639Z-b5cb7f/1) with PYTHONDONTWRITEBYTECODE=1, -p no:cacheprovider, external --basetemp, and isolated environment variables:

  1. Adapter, Guard, Purge/Residual, and Issue #60 Suites:
    • tests/test_issue60_opencode_v2.py (15 passed, including test_real_opencode_2x_contract against real opencode v2.0.32 in isolated HOME/TMPDIR)
    • tests/test_issue55_agent_homes.py (11 passed, including test_l1_every_path_variable_the_code_reads_is_accounted_for)
    • tests/test_a4_adapter_contract.py (33 passed)
    • tests/test_issue31_purge_residual.py (67 passed)
    • Total: 126 passed in 48.31s
  2. Tier 2 Component Suite (opencode or status) with XDG_DATA_HOME Canary:
    • Ran tests/test_tier2_component.py -k "opencode or status" with XDG_DATA_HOME pointed at a canary temp directory.
    • Result: 7 passed in 62.22s, and XDG_CANARY remained completely empty.
  3. Post-check:
    • Verification worktree is clean (git status -s empty, no .mam directory), and no stray opencode test processes remain.

4. Findings

No blocking or non-blocking issues remaining. The branch fix/issue-60-opencode-v2 (74333f8..0e05b1b) is ready to merge.

[VERDICT: PASS]