Issue #5 (Python core migration, CAS state transitions, shadow watcher, auto-completion gate, eager-import immutable runtime, B-13 freeze removal) is complete and merged to main. This stamps the release. SemVer: MINOR, not MAJOR. The change is large but breaks nothing. Across the whole Issue #5 range there are zero file deletions and zero renames, the event wire schema stays at SCHEMA_VERSION 1, all four literal script paths survive as compatibility shims, the 968-line legacy shell loop is still in run_loop.sh, and every default change reverts through a single environment variable (MAM_DELEGATION_PY / MAM_ENGINE_CAS / MAM_LOOP_PY / MAM_LOOP_FREEZE). The riskiest new feature, auto-completion, ships default-off. No operator has anything to migrate, which is the decisive reason not to call it 5.0.0. The reasoning is recorded in the VERSIONS.md release notes, not just here. Close a gap in the lockstep guard. lib.sh exports MAM_VERSION and eager_load() refuses to start the loop when it disagrees with FRAMEWORK_VERSION, so eager.py is a load-bearing fourth leg — but test_version_consistency.py only checked three, and the sole check on eager.py was a hardcoded literal in the phase 4 test that a release bump has to edit anyway. The lockstep test now covers eager.py, a new test pins the fail-closed gate itself, and the phase 4 test no longer carries a version literal. Fix a latent test-isolation defect the bump exposed. The first full run failed four tests with "MAM_VERSION mismatch: expected 4.4.0, got 4.3.0 in environment" — 4.3.0 was not in the tree, it was inherited from the shell that launched pytest and had sourced the pre-bump lib.sh. Those tests were measuring the runner's shell rather than the tree under test, and only passed until now because the two values always happened to agree. A session-scoped fixture drops the ambient value. Production is unaffected: run_loop.sh:17 sources lib.sh before anything else and lib.sh re-exports MAM_VERSION unconditionally, so a stale inherited value is always overwritten before Python starts. Full suite: 750 passed in 912.50s, 0 failed, 0 skipped. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UrDNJkHmm18uu7n7JwV5Qd
6.6 KiB
name, description, version, author, license, platforms, environments, metadata
| name | description | version | author | license | platforms | environments | metadata | |||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| multi-agent-mux-status | Read-only instant snapshot of all agent herdr sessions — name, YAML status, herdr alive, pane cmd/cwd, resume UUID on disk, and any drift. No mutation. Reuses reconcile.sh --dry-run for the diff logic. Use when you want to know 'what's running RIGHT NOW' without spinning up the monitor loop. | 4.4.0 | godopu | MIT |
|
|
|
Multi-Agent Status — Read-Only Instant Snapshot
Companion skills:
multi-agent-mux-create(start),multi-agent-mux-resume(re-attach),multi-agent-mux-stop(terminate),multi-agent-mux-monitor(live polling). Herdr Isolation:status명령은 YAML의herdr_session필드를 자동으로 파싱하여 상태를 확인하므로,HERDR_SESSION_NAME환경변수를 수동으로 지정하지 않아도 모든 격리 서버의 세션 상태를 통합 조회합니다. Single source of truth:./.mam/agent-sessions.yaml.
What this skill does
Print a single table of every agent herdr session, comparing YAML state to actual herdr state. No mutation. No polling loop.
This is the "what's running right now?" answer — faster than dispatching multi-agent-mux-monitor (which polls every 30s) and safer than reconcile.sh --once --emit-diff (which mutates as a side effect).
Pre-flight
has_real_herdr || { echo "ERROR: herdr not installed"; exit 1; } # lib.sh helper (B-3)
command -v python3
test -f .mam/agent-sessions.yaml
command -v herdrandtype -P herdrboth report success even when herdr is not installed — they match lib.sh'sherdr()function and the.mam/shimwrapper respectively. Always usehas_real_herdr.
If agent-sessions.yaml doesn't exist or is malformed → print clear error, exit 1. Do not create it. (Use multi-agent-mux-create first.)
Workflow
bash .agents/skills/multi-agent-mux-status/scripts/status.sh [--json]
The script:
- Calls
reconcile.sh --once --emit-diff --dry-run(read-only; no YAML mutation) for the drift snapshot - Loads
agent-sessions.yaml(read-only) to enrich the table - For each row in
herdr_sessions[]:- herdr alive? (via
herdr agent get <name>, real native command — the script sourceslib.shinternally, which is what lets it also spell this asherdr has-session -t <name>) - pane cmd, cwd (via
herdr agent get <name>, likewise shimmed asherdr list-panesinternally) - resume UUID on disk? (claude:
$CLAUDE_PROJECT_DIR/<key>/<uuid>.jsonlwith default~/.claude/projects/; agy:$HOME_DIR/.gemini/antigravity-cli/conversations/<uuid>.dbwith default~/.gemini/...)
- herdr alive? (via
- For each herdr session matching
*-creator-*not in YAML → flag as "unregistered" - Prints a table (default) or JSON (with
--json)
Output format (default = aligned table)
agent-sessions status — 2026-06-19T14:20:00Z (herdr_confirmed=True)
========================================================================================================================================
NAME SERVER YAML HERDR CMD RESUME JOB_ID JOB_STATUS DRIFT
----------------------------------------------------------------------------------------------------------------------------------------
lab-landing-page-creator-claude default running alive claude yes - - -
lab-landing-page-creator-agy default terminated dead agy yes 5fe09ba8 completed -
lab-paper-pdf2md-creator-claude default running alive claude scan - - -
========================================================================================================================================
Output format (--json)
{
"yaml_path": "...",
"herdr_sessions_alive": ["..."],
"yaml_entries": [...],
"rows": [
{
"name": "lab-landing-page-creator-claude",
"yaml_status": "running",
"herdr_alive": true,
"pane_cmd": "claude",
"pane_cwd": "/home/.../refer_landing_page",
"resume_uuid_on_disk": true,
"drift": null
},
{
"name": "lab-landing-page-creator-agy",
"yaml_status": "terminated",
"herdr_alive": false,
"drift": "yaml-says-terminated-but-disk-uuid-still-present"
}
],
"unregistered": [],
"drifts": []
}
Drift classes (read-only — never mutates)
| Class | Detection | Meaning |
|---|---|---|
A |
YAML running, herdr dead |
session died without going through multi-agent-mux-stop. Could auto-terminate but won't — that's multi-agent-mux-monitor's job. |
B |
herdr alive, not in YAML | ad-hoc session someone started without multi-agent-mux-create. Suggest: "use multi-agent-mux-create to register, or multi-agent-mux-stop to clean up." |
C |
YAML has claude_session_id_own: null AND a new *.jsonl exists |
new session id materialized; suggest: "run multi-agent-mux-resume or reconcile to register it." |
Pitfalls
- Do NOT use this skill to drive mutations — the output is a snapshot, not a call to action. If you need to fix drifts, run
multi-agent-mux-monitorormulti-agent-mux-resume/multi-agent-mux-stopmanually. - Read-only is enforced by script —
status.shopens the YAML withopen(path)(no'w'), never callsherdr kill-session, never writes anywhere. Thereconcile.sh --dry-runmode is the same path. - If
agent-sessions.yamlis malformed — print the YAML error verbatim and exit 1. Do NOT attempt recovery (that'smulti-agent-mux-stop --purge-conversationor manual edit's job). - Sessions outside the
<workspace>-creator-*naming convention are still shown but taggedad-hoc— they didn't go throughmulti-agent-mux-createand aren't tracked in YAML.
When to use
- "Is the claude session still running?" → this skill, not the monitor
- "What UUID does this workspace have?" → this skill
- "Is there drift between YAML and reality?" → this skill, then dispatch monitor or fix manually
- Quick sanity check before dispatching a long-running job
When NOT to use
- Continuous live tracking →
multi-agent-mux-monitor - Recovering from corruption → manual edit +
.bakrestore - Polling more than once a minute →
multi-agent-mux-monitor(it dedupes)