fix(issue-9,14): sanitize herdr server env and confirm accepted prompt delivery
- Drop per-session agent runtime markers (CLAUDECODE, CLAUDE_CODE_CHILD_SESSION, CLAUDE_CODE_SESSION_ID, Claude Code messaging/bridge/pid markers, and the agy/hermes/grok/opencode session ids) from the environment lib.sh's shim hands to a bootstrapped `herdr --session <name> server`; user configuration such as CLAUDE_PROJECT_DIR still inherits - Add MAM_NO_AUTOSTART=1 so query-only callers never bootstrap a server as a side effect; status.sh and reconcile.sh export it, and the shim's `ls` reports a down server as "no server running" so reconcile keeps herdr_confirmed instead of freezing drift detection for every server - send_keys_safe: treat `timeout` / `agent_prompt_stalled` from `agent prompt --wait` as an accepted submission and confirm delivery for SKS_DELIVERY_GRACE_S (default 15 s) via agent_status working, a busy token the pane did not show before, or the pane moving on from its pre-submit snapshot; no signal at all still fails closed (rc 4). Codex under herdr 0.9.0 never reports `working`, so every delivered prompt was closed as agent_blocked and its later started/completed events refused - delegate wrapper: before closing an unconfirmed inject as agent_blocked, honour the registry's own acknowledgement for MAM_INJECT_ACK_GRACE_S (default 10 s) - Switch T1-7's failure trigger to transport_error (timeout now means accepted); add test_issue9_server_env.py (5 cases) and test_issue14_delivery_ack.py (7) - Verified live: a freshly bootstrapped multi-agent-mux server carries no markers and the claude panes save transcripts again; codex job d04ebcb5 had its started/completed accepted with no agent_blocked Closes #9 Closes #14 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VCgu9Fa9iT7TbJUSzdq4Ff
This commit is contained in:
1 parent
4d444ce6cd
commit
497633f64a
9 files changed
+551
-18
No files matched your search
@@ -259,12 +259,15 @@ def test_t1_7_custom_registry_dir_inject_failure(tmp_path, mock_herdr):
|
||||
# Set up mock herdr with an agent, but prompt will fail
|
||||
state_file = Path(mock_herdr)
|
||||
state = json.loads(state_file.read_text())
|
||||
# A transport-level RPC failure is a definite inject failure. (`timeout` is
|
||||
# not: since Issue #14 it means herdr accepted the submission and only its
|
||||
# status watch timed out, which send_keys_safe then confirms via the pane.)
|
||||
state["agents"]["fail-agent"] = {
|
||||
"agent": "claude",
|
||||
"agent_status": "idle",
|
||||
"prompt_wait_result": "timeout", # will fail prompt
|
||||
"prompt_wait_result": "transport_error", # will fail prompt
|
||||
}
|
||||
state["prompt_wait_result"] = "timeout"
|
||||
state["prompt_wait_result"] = "transport_error"
|
||||
state_file.write_text(json.dumps(state, indent=2))
|
||||
|
||||
res = _run_wrapper(
|
||||
@@ -278,7 +281,7 @@ def test_t1_7_custom_registry_dir_inject_failure(tmp_path, mock_herdr):
|
||||
"--timeout", "15",
|
||||
"--idle-timeout", "10",
|
||||
],
|
||||
env={"SKS_BUSY_TIMEOUT": "1", "SKS_IDLE_TIMEOUT_MS": "500"},
|
||||
env={"SKS_BUSY_TIMEOUT": "1", "SKS_IDLE_TIMEOUT_MS": "500", "MAM_INJECT_ACK_GRACE_S": "1"},
|
||||
cwd=tmp_path,
|
||||
timeout=60,
|
||||
)
|
||||
|
||||
Reference in new issue
Block a user