Files
multi-agent-mux/.agents/reports/canary-projects-multi-agent-mux-creator-cline/report-b9d12a14.md
T

15 KiB
Raw Blame History

📋 Cross-Code Review Report: Job b9d12a14

  • Reviewer: cline (session: herdr:canary-projects-multi-agent-mux-creator-cline)
  • Job ID: b9d12a14
  • Scope: Uncommitted working-tree changes (6 files) implementing the refined architecture for session creation, UUID extraction, and multi-tier verification. This is a further-refined iteration: reconcile.sh now consolidates the per-agent pin/resume/drift logic into a shared _pin_and_verify_resume() helper, and both reconcile.sh and resume_session.sh gained --dry-run help text.
  • Target: Conduct lint, behavioral, and loss-prevention cross-code review. Provide final verdict.

1. Files in Scope

git diff HEAD --stat (6 files, 384 insertions / 174 deletions):

.agents/skills/lib.sh                              | 290 ++++++++++++++-------
.agents/skills/multi-agent-mux-create/scripts/create_session.sh |  16 +-
.agents/skills/multi-agent-mux-monitor/SKILL.md    |   3 +-
.agents/skills/multi-agent-mux-monitor/scripts/reconcile.sh     | 209 +++++++++-----
.agents/skills/multi-agent-mux-resume/scripts/resume_session.sh |  38 ++-
.agents/skills/multi-agent-mux-resume/scripts/update_yaml_resumed.sh | 2 +-

2. Lint / Syntax Validation

All five shell files pass bash -n: lib.sh , create_session.sh , reconcile.sh , resume_session.sh , update_yaml_resumed.sh . The embedded VERIFY_SESSION_PYTHON string validated with python3 -c "import ast; ast.parse(...)" → valid Python . All functions source correctly from lib.sh.


3. Architecture Review: 4-Stage Integrity Verification

3.1 verify_session_uuid() — Stages 13 with mode parameter (lib.sh)

The verify_session_uuid() function (lib.sh, embedded VERIFY_SESSION_PYTHON) accepts a mode parameter ("discover" default, or "revalidate"). The agy last_conversations.json cache check is gated by mode == "discover" only — correct, because in revalidation of an already-pinned UUID the cache file may have moved to a different concurrent conversation, causing a false negative. The revalidate path relies on Stages 13 (mtime, workspace key, payload) which are sufficient.

Stage 1 — mtime: if epoch and os.path.getmtime(path) < epoch: return False. Skips when epoch is 0/falsy. Correct.

Stage 2 — workspace key: if workspace_key(cwd) != workspace_key(ws): return False. Consistent workspace_key() (replaces / and _ with -) used across bash and Python.

Stage 3 — payload (per-agent):

  • claude: JSONL first-line sessionId == uuid, cwd == cwd.
  • agy: .db exists, SELECT count(*) FROM steps >= 1.
  • hermes: SELECT 1 FROM sessions WHERE id=?.
  • cline: session JSON session_id == uuid.

All wrapped in defensive try/except returning False. Isolation-aware path resolution (iso root vs home) correct for all agents.

3.2 verify_tui_viewport() — Stage 4 (lib.sh)

Tri-state return: 0 (match), 1 (mismatch), 2 (not possible — session gone or capture empty). Correctly documented and handled by all callers.

3.3 _pin_and_verify_resume() helper (reconcile.sh) — NEW in this iteration

This is the key new improvement. The helper (lines 395-416) consolidates the pin → resume dry-run → drift-class logic that was previously duplicated across all four agents:

def _pin_and_verify_resume(s, agent, cwd, uuid, degraded=False):
    own_key = { 'claude': 'claude_session_id_own', 'agy': 'agy_conversation_id_own',
                'hermes': 'hermes_conversation_id_own', 'cline': 'cline_conversation_id_own' }[agent]
    s[own_key] = uuid
    s['last_visible_status'] = 'pinned'
    resume_cmd = ['bash', os.path.join(skills_dir, 'multi-agent-mux-resume', 'scripts', 'resume_session.sh'),
                  '--workspace', cwd, '--agent', agent, '--session', s['name'], '--dry-run']
    res = subprocess.run(resume_cmd, capture_output=True, text=True)
    if res.returncode == 0:
        s['last_visible_status'] = 'resume_verified'
    else:
        s['last_visible_status'] = f"resume dry-run failed: {res.stderr.strip() or res.stdout.strip()}"
    id_name = 'session' if agent in ('claude', 'cline') else 'conversation'
    if not degraded:
        drifts.append({'class': 'C', 'name': s['name'], 'msg': f"{s['name']}: {id_name} id materialized: {uuid}"})
    else:
        drifts.append({'class': 'C-degraded', 'name': s['name'], 'msg': f"{s['name']}: TUI viewport check unavailable, pinned via stage 1-3 only"})
    actions.append(f"updated {id_name} id: {uuid}")

Analysis:

  • own_key mapping correct for all four agents.
  • last_visible_status sequence: pinned → (resume_verified | resume dry-run failed: ...) correct.
  • id_name: session for claude/cline, conversation for agy/hermes — matches the existing drift message conventions.
  • degraded flag: emits C (full pin) or C-degraded (stages 1-3 only) correctly.
  • Scope: skills_dir (line 76), drifts, and actions are all module-level, available in the helper's closure scope.
  • DRY: eliminates ~4× duplicated blocks (was ~25 lines each per agent in the prior iteration; now each agent's drift-C loop is ~8 lines of TUI dispatch). Good simplification.

3.4 Three-way TUI viewport handling (all agents, via helper)

Each agent's drift-C loop now dispatches TUI results to the helper:

rc Action Drift class last_visible_status
0 (match) _pin_and_verify_resume(..., degraded=False) C pinnedresume_verified/error
1 (mismatch) Do NOT pin, log warning C-warn unchanged (retry next cycle)
2 (unavailable) _pin_and_verify_resume(..., degraded=True) C-degraded pinnedresume_verified/error
  • rc == 1 (TUI shows a different workspace): correctly does NOT pin — the candidate passed stages 1-3 but TUI shows a different workspace, possibly a stale artifact. Retrying next cycle is correct.
  • rc == 2 (TUI capture unavailable): correctly pins via stages 1-3 only with C-degraded class. The disk evidence is strong enough when TUI can't be checked, and the resume dry-run still validates the full path.
  • Applied consistently across claude, agy, hermes, cline (8 call sites: 4 normal + 4 degraded).

4. Verification Cycle Review

4.1 Onboarding Prompt (create_session.sh)

  • ONBOARD=1 is now the default (line 53), with --no-onboard to disable (line 67).
  • Onboarding prompt: "Without making any non-standard pre-preparations or modifying files directly, proceed immediately to align yourself..." — prevents spurious file mods before UUID creation.
  • Initial last_visible_status = "unverified" for all four agents.
  • Background reconcile trigger (bash reconcile.sh --once >/dev/null 2>&1 &) before watchdog starts (line 412).

4.2 YAML/DB Pinning + Resume Test (reconcile.sh)

Each agent's drift-C loop: filter running sessions without own-id → resolve isolation-aware dir → scan candidates → filter through verify_session_uuid(mode="discover") (stages 1-3) → require exactly 1 valid candidate → verify_tui_viewport (stage 4) → three-way dispatch to _pin_and_verify_resume. MAM_VERIFY_PY correctly threaded to the Python block via env vars at lines 722/724.

4.3 Resume Dry-Run Test (resume_session.sh)

  • --dry-run flag added (line 21). Full help text added (lines 8-13).
  • Early exit for already-running session in dry-run (line 52): [dry-run] herdr '$SESSION_NAME' already running — nothing to validate → exit 0. Correctly avoids side effects.
  • Runs full resolution path (UUID → herdr check → isolation → binary → quarantine → CMD_FULL) then prints [dry-run] would spawn: $CMD_FULL and exits 0.
  • Isolation root validation: if [ -n "$ISO_ROOT" ] && [ ! -d "$ISO_ROOT" ]; then ERROR; exit 1; fi.
  • Binary existence/executable validation.
  • Unsupported-agent catch-all (*) echo ERROR; exit 2).
  • Uses command -v "$AGENT" for all agents (no hardcoded nvm path).

4.4 reconcile.sh --dry-run help text (NEW)

The -h|--help output now uses a heredoc (lines 43-49) with an Options: section documenting --dry-run as read-only mode guaranteeing no database/file writes. Header comment (line 11) also clarifies the read-only guarantee.

4.5 update_yaml_resumed.sh — _herdr fix

herdr list-panes_herdr list-panes — uses the library wrapper that respects HERDR_SERVER_NAME. Correct bugfix.


5. find_workspace_uuid() Refactoring (lib.sh)

The function uses the unified verify_session_uuid() with the mode parameter:

  • Target-mode path: verify_session_uuid(ws, agent, cand, s, mode="revalidate") — passes the session row s for mtime context.
  • Own-id check: verify_session_uuid(ws, agent, cand, s, mode="revalidate") — revalidates existing pinned UUIDs.
  • Disk scan: verify_session_uuid(ws, agent, cand) — default mode="discover" for new discovery.
  • agent_identities cache: verify_session_uuid(ws, agent, cand, mode="revalidate") — called WITHOUT the row parameter, so epoch defaults to 0 (mtime check skipped) and cwd defaults to ws. Stages 2-3 still enforced. Acceptable for revalidating a cached identity.

The old helpers (jsonl_exists, db_exists, hermes_exists, cline_exists, own_exists) were removed. No orphaned references remain.


6. Loss Prevention Review

6.1 No orphaned functions/variables

  • Removed helpers (jsonl_exists, db_exists, hermes_exists, cline_exists, own_exists) — no remaining references in lib.sh or reconcile.sh.
  • The running_ids exclusion set and emit() function are preserved in find_workspace_uuid.
  • The time.time() - os.path.getmtime(latest) > 300 staleness check (old claude drift-C) was removed — now replaced by the verify_session_uuid stage-1 mtime check which is stricter (compares to herdr_session_epoch). No regression.

6.2 No behavioral regression

  • find_workspace_uuid collision avoidance (never returns a UUID pinned to another running session) is preserved.
  • The --once and --emit-diff modes of reconcile.sh still work via the env_python/atomic_dump_yaml split with MAM_VERIFY_PY added.

6.3 Idempotency

  • Reconcile drift-C loops skip sessions that already have an *_own id set. No re-pinning on every cycle.
  • verify_session_uuid is pure (no side effects).
  • _pin_and_verify_resume mutates only the in-memory dict s and appends to drifts/actions — the final YAML write happens once via atomic_dump_yaml.

6.4 exec(os.environ['MAM_VERIFY_PY']) pattern

The reconcile Python block starts with exec(os.environ['MAM_VERIFY_PY']) (line 317), injecting workspace_key() and verify_session_uuid() definitions. Same pattern as the verify_session_uuid() bash wrapper in lib.sh. Consistent.


7. Issues Found

7.1 SKILL.md does not document C-warn / C-degraded drift classes (Non-blocking)

The SKILL.md was updated to document last_visible_status as free-form with the new states (unverified, pinned, resume_verified), which is good. However, the Drift classes section (lines 112-168) still only describes classes A, B, C, and D. The new C-warn and C-degraded sub-classes introduced by the three-way TUI viewport handling are not documented. Workers reading the SKILL.md will encounter C-warn/C-degraded in the emitted JSON drifts[] without prior documentation.

Impact: Low — the drift msg fields are self-documenting ("TUI viewport mismatch..." / "TUI viewport check unavailable, pinned via stage 1-3 only"), so workers can understand the meaning from the message. Non-blocking.

7.2 Cline drift-C loop: break after first valid candidate (reconcile.sh line 663) (Non-blocking)

for j in candidates:
    uuid = os.path.basename(j)[:-5]
    if verify_session_uuid(cwd, 'cline', uuid, s, mode="discover"):
        valid_candidates.append(uuid)
        break  # ← breaks after first valid

The claude, agy, and hermes loops collect ALL valid candidates before checking len(valid_candidates) == 1. The cline loop breaks after the first valid candidate, so valid_candidates can only be 0 or 1. If multiple valid cline sessions exist for the same workspace, the len == 1 check always passes (taking the first/most-recent one).

Impact: Low. In practice, cline sessions are isolated (one per isolation root), so multiple valid candidates for the same workspace is unlikely. The pinned UUID is still fully verified through all 4 stages. Non-blocking.

7.3 ~/* pattern in resume_session.sh binary validation (Non-blocking)

if [ -f "$RESOLVED_BIN" ] || [[ "$RESOLVED_BIN" == /* ]] || [[ "$RESOLVED_BIN" == ~/* ]]; then

The ~/* pattern in [[ ]] is a literal string match (no tilde expansion in [[ ]]). The -f "$RESOLVED_BIN" test above it would fail for a ~/... path since -f doesn't expand ~. In practice, $RESOLVED_BIN is always set to an absolute path (from command -v), so this branch is never hit with a ~/ value. Non-blocking — dead code path, no functional impact.


8. Summary

Check Result
All 6 files pass bash -n PASS
VERIFY_SESSION_PYTHON valid Python PASS
Stage 1 (mtime) correctly implemented PASS
Stage 2 (workspace key) consistent PASS
Stage 3 (payload) per-agent correct PASS
Stage 4 (TUI viewport) tri-state correct PASS
mode parameter (discover/revalidate) sound PASS
_pin_and_verify_resume helper consolidates logic PASS
Three-way TUI handling (pin/warn/degrade) via helper PASS
Onboarding default + "unverified" status PASS
Reconcile verification cycle (pin → dry-run) PASS
find_workspace_uuid unified refactoring PASS
resume_session.sh --dry-run + validation + help PASS
reconcile.sh --dry-run help text (NEW) PASS
update_yaml_resumed.sh _herdr fix PASS
MAM_VERIFY_PY threaded to reconcile PASS
SKILL.md last_visible_status documented PASS
No orphaned functions/variables PASS
No behavioral regression PASS
SKILL.md missing C-warn/C-degraded docs ⚠️ Non-blocking
Cline break inconsistency ⚠️ Non-blocking
~/* dead code path ⚠️ Non-blocking

The implementation correctly realizes the refined architecture plan. This iteration's key improvement — the _pin_and_verify_resume() helper — eliminates ~4× duplicated pin/resume/drift blocks across the agent drift-C loops, reducing reconcile.sh from 253 to 209 changed lines while preserving identical behavior. The mode parameter correctly distinguishes discovery from revalidation, the three-way TUI viewport handling is a sound degradation strategy, the --dry-run help text additions improve usability, and the SKILL.md was updated to document last_visible_status semantics. All syntax checks pass, all functions source correctly, the embedded Python is valid, and the three minor issues are non-blocking (the pinned UUIDs are always fully verified through all applicable stages regardless). No redesign or re-planning is needed.

[VERDICT: PASS]