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 <noreply@anthropic.com>
This commit is contained in:
GodopuandClaude Opus 5.5 committed 2026-09-24 02:30:13 +00:00
1 parent 1debc7d924
commit 68a5d31381
3 files changed
+46 -11

No files matched your search

+24 -6
View File
@@ -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: