From 68a5d313815a3096c335f058529431962c14f2e0 Mon Sep 17 00:00:00 2001 From: Godopu Date: Thu, 24 Sep 2026 02:30:13 +0000 Subject: [PATCH] fix(issue-36): registry and wrapper accept --prompt-file; the wrapper hands the same path on One argv string is capped at MAX_ARG_STRLEN (131,072 bytes on Linux), so a prompt passed as --prompt could not reach the registry once it carried a large diff. submit now takes --prompt-file and passes the same path to `registry.py register --prompt-file`; the loop type's per-iteration update goes by file too. --prompt keeps working unchanged. Co-Authored-By: Claude Opus 5.5 --- .agents/skills/lib_py/delegation/registry.py | 30 +++++++++++++++---- .../multi-agent-mux-delegate-job/SKILL.md | 2 ++ .../multi-agent-mux-delegate-job | 25 ++++++++++++---- 3 files changed, 46 insertions(+), 11 deletions(-) diff --git a/.agents/skills/lib_py/delegation/registry.py b/.agents/skills/lib_py/delegation/registry.py index e5e4be3..72975ef 100755 --- a/.agents/skills/lib_py/delegation/registry.py +++ b/.agents/skills/lib_py/delegation/registry.py @@ -323,7 +323,11 @@ def _build_parser() -> argparse.ArgumentParser: sub = parser.add_subparsers(dest="command", required=True) p_reg = sub.add_parser("register", help="create a pending job; prints the job id") - p_reg.add_argument("--prompt", required=True) + # Issue #36: a long prompt goes by file - one argv string is capped at + # MAX_ARG_STRLEN (131,072 bytes on Linux). + reg_prompt = p_reg.add_mutually_exclusive_group(required=True) + reg_prompt.add_argument("--prompt") + reg_prompt.add_argument("--prompt-file", help="read the prompt from this file (utf-8)") p_reg.add_argument("--agent", default="claude-code") p_reg.add_argument("--agent-session", default="herdr:claude") p_reg.add_argument("--role", default="Worker", help="logical role for the delegated agent (e.g. Worker, Planner, Reviewer)") @@ -365,7 +369,9 @@ def _build_parser() -> argparse.ArgumentParser: p_update.add_argument("--job", required=True) p_update.add_argument("--status", default=None) p_update.add_argument("--agent-session", default=None) - p_update.add_argument("--prompt", default=None) + upd_prompt = p_update.add_mutually_exclusive_group() + upd_prompt.add_argument("--prompt", default=None) + upd_prompt.add_argument("--prompt-file", default=None, help="read the prompt from this file (utf-8)") p_update.add_argument("--iteration", type=int, default=None) p_update.add_argument("--attempt-id", type=int, default=None) p_update.add_argument("--role", default=None) @@ -473,15 +479,26 @@ def _operator_write(job_id: str, registry_dir: str, **fields) -> int: return 4 +def _prompt_from_args(parser: argparse.ArgumentParser, args: argparse.Namespace) -> Optional[str]: + """The prompt text: from --prompt-file (read verbatim) or from --prompt.""" + if getattr(args, "prompt_file", None) is None: + return args.prompt + try: + return Path(args.prompt_file).read_text(encoding="utf-8") + except (OSError, UnicodeDecodeError) as exc: + parser.error(f"cannot read --prompt-file {args.prompt_file}: {exc}") + + def main(argv: Optional[List[str]] = None) -> int: mqtt_common.ensure_env_loaded() mqtt_common.setup_logging(logging.INFO) - args = _build_parser().parse_args(argv) + parser = _build_parser() + args = parser.parse_args(argv) rd = args.registry_dir if args.command == "register": job_id = register_job( - prompt=args.prompt, + prompt=_prompt_from_args(parser, args), agent=args.agent, agent_session=args.agent_session, role=args.role, @@ -540,8 +557,9 @@ def main(argv: Optional[List[str]] = None) -> int: fields["status"] = args.status if args.agent_session is not None: fields["agent_session"] = args.agent_session - if args.prompt is not None: - fields["prompt"] = args.prompt + prompt = _prompt_from_args(parser, args) + if prompt is not None: + fields["prompt"] = prompt if args.iteration is not None: fields["iteration"] = args.iteration if args.attempt_id is not None: diff --git a/.agents/skills/multi-agent-mux-delegate-job/SKILL.md b/.agents/skills/multi-agent-mux-delegate-job/SKILL.md index fa32a9c..2a73b43 100644 --- a/.agents/skills/multi-agent-mux-delegate-job/SKILL.md +++ b/.agents/skills/multi-agent-mux-delegate-job/SKILL.md @@ -44,6 +44,8 @@ multi-agent-mux-delegate-job submit \ # Liveness contract (Issue #18): the agent heartbeats every N s (automatic), # the job is unresponsive after K x N s (--idle-timeout overrides), `started` # must arrive within T s of the injection or the inject fails closed. + # --prompt-file replaces --prompt for long prompts (Issue #36): one + # argv string is capped at 131,072 bytes on Linux. The loop always uses it. # 1b) Same, for an agent on another host (no herdr pane, no shared disk): # the brief travels over the broker as a signed retained dispatch and a diff --git a/.agents/skills/multi-agent-mux-delegate-job/multi-agent-mux-delegate-job b/.agents/skills/multi-agent-mux-delegate-job/multi-agent-mux-delegate-job index 529be41..0791baf 100755 --- a/.agents/skills/multi-agent-mux-delegate-job/multi-agent-mux-delegate-job +++ b/.agents/skills/multi-agent-mux-delegate-job/multi-agent-mux-delegate-job @@ -109,13 +109,15 @@ usage() { cat <<'EOF' multi-agent-mux-delegate-job [options] - submit --agent --prompt [--workdir ] [--agent-session