From e204008f10aab36b321d71dc8fea5e583b00e145 Mon Sep 17 00:00:00 2001 From: Teknium <127238744+teknium1@users.noreply.github.com> Date: Wed, 2 Sep 2026 16:57:22 -0700 Subject: [PATCH] refactor(delegate): _knob() unifies config>env>default int/float knobs; timeout diagnostic sections -> _diag_sizes/_diag_threads + attr table; drop dead _handle_child_wait_failure re-import --- .../mock._session_db.db_path/136309983742096 | Bin 0 -> 237568 bytes .../136309983742096.fts_rebuild.lock | 0 .../136309983742096.quarantine.lock | 0 .../mock._session_db.db_path/136310003043600 | Bin 0 -> 237568 bytes .../136310003043600.fts_rebuild.lock | 0 .../136310003043600.quarantine.lock | 0 tools/delegate_tool.py | 1 - tools/delegate_tool_child_run.py | 167 +++++++++--------- tools/delegate_tool_config.py | 86 +++++---- 9 files changed, 125 insertions(+), 129 deletions(-) create mode 100644 MagicMock/mock._session_db.db_path/136309983742096 create mode 100644 MagicMock/mock._session_db.db_path/136309983742096.fts_rebuild.lock create mode 100644 MagicMock/mock._session_db.db_path/136309983742096.quarantine.lock create mode 100644 MagicMock/mock._session_db.db_path/136310003043600 create mode 100644 MagicMock/mock._session_db.db_path/136310003043600.fts_rebuild.lock create mode 100644 MagicMock/mock._session_db.db_path/136310003043600.quarantine.lock diff --git a/MagicMock/mock._session_db.db_path/136309983742096 b/MagicMock/mock._session_db.db_path/136309983742096 new file mode 100644 index 0000000000000000000000000000000000000000..762f3ba96b498b08c5e55dddd58cb587e8ece9fc GIT binary patch literal 237568 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 literal 0 HcmV?d00001 diff --git a/MagicMock/mock._session_db.db_path/136309983742096.fts_rebuild.lock b/MagicMock/mock._session_db.db_path/136309983742096.fts_rebuild.lock new file mode 100644 index 0000000000..e69de29bb2 diff --git a/MagicMock/mock._session_db.db_path/136309983742096.quarantine.lock b/MagicMock/mock._session_db.db_path/136309983742096.quarantine.lock new file mode 100644 index 0000000000..e69de29bb2 diff --git a/MagicMock/mock._session_db.db_path/136310003043600 b/MagicMock/mock._session_db.db_path/136310003043600 new file mode 100644 index 0000000000000000000000000000000000000000..7d1ccd14a961eb95669b47656b12f32381eda69b GIT binary patch literal 237568 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 literal 0 HcmV?d00001 diff --git a/MagicMock/mock._session_db.db_path/136310003043600.fts_rebuild.lock b/MagicMock/mock._session_db.db_path/136310003043600.fts_rebuild.lock new file mode 100644 index 0000000000..e69de29bb2 diff --git a/MagicMock/mock._session_db.db_path/136310003043600.quarantine.lock b/MagicMock/mock._session_db.db_path/136310003043600.quarantine.lock new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tools/delegate_tool.py b/tools/delegate_tool.py index 7d68a0583f..e24f6a3c88 100644 --- a/tools/delegate_tool.py +++ b/tools/delegate_tool.py @@ -47,7 +47,6 @@ from tools.delegate_tool_child_run import ( # noqa: F401 _dump_subagent_timeout_diagnostic, _emit_child_complete, _fabricated_entry, - _handle_child_wait_failure, _lease_child_credential, _make_text_relay, _merge_late_steer, diff --git a/tools/delegate_tool_child_run.py b/tools/delegate_tool_child_run.py index c2293846eb..d2b4b3a5d0 100644 --- a/tools/delegate_tool_child_run.py +++ b/tools/delegate_tool_child_run.py @@ -112,6 +112,72 @@ def _format_thread_stack(frame: Any, indent: str) -> List[str]: ] +_DIAG_CHILD_ATTRS = ( + "model", "provider", "api_mode", "base_url", "max_iterations", + "quiet_mode", "skip_memory", "skip_context_files", "platform", + "_delegate_role", "_delegate_depth", +) + + +def _diag_sizes(child: Any) -> List[str]: + lines: List[str] = ["## Prompt / schema sizes"] + try: + sys_prompt = getattr(child, "ephemeral_system_prompt", None) or getattr(child, "system_prompt", None) or "" + lines.append(f" system_prompt_bytes: {len(sys_prompt.encode('utf-8')) if isinstance(sys_prompt, str) else 'n/a'}") + lines.append(f" system_prompt_chars: {len(sys_prompt) if isinstance(sys_prompt, str) else 'n/a'}") + except Exception as exc: + lines.append(f" system_prompt: ") + try: + tools_schema = getattr(child, "tools", None) + if tools_schema is not None: + lines.append(f" tool_schema_count: {len(tools_schema)}") + lines.append(f" tool_schema_bytes: {len(json.dumps(tools_schema, default=str).encode('utf-8'))}") + except Exception as exc: + lines.append(f" tool_schema: ") + return lines + + +def _diag_threads(worker_thread: Optional[threading.Thread]) -> List[str]: + """Worker stack plus all other live threads (bounded to 40): the worker is + often parked on a helper thread, so a pre-HTTP wedge is indistinguishable + from a slow provider without the full picture.""" + import sys as _sys + import threading as _threading + + lines = ["## Worker thread stack at timeout"] + frames = _sys._current_frames() + if worker_thread is not None and worker_thread.is_alive(): + worker_frame = frames.get(worker_thread.ident) + lines.extend( + _format_thread_stack(worker_frame, " ") if worker_frame is not None + else [" "] + ) + elif worker_thread is None: + lines.append(" ") + else: + lines.append(" ") + lines += ["", "## All thread stacks at timeout"] + try: + frames = _sys._current_frames() + by_ident = {th.ident: th for th in _threading.enumerate() if th.ident} + worker_ident = worker_thread.ident if worker_thread else None + dumped = 0 + for ident, frame in frames.items(): + if ident == worker_ident: + continue # already dumped above + if dumped >= 40: + lines.append(f" <{len(frames) - dumped - 1} more threads omitted>") + break + th = by_ident.get(ident) + name = th.name if th else f"ident={ident}" + lines.append(f" --- {name}{' daemon' if (th and th.daemon) else ''} ---") + lines.extend(_format_thread_stack(frame, " ")) + dumped += 1 + except Exception as exc: + lines.append(f" ") + return lines + + def _dump_subagent_timeout_diagnostic( *, child: Any, @@ -130,8 +196,6 @@ def _dump_subagent_timeout_diagnostic( try: from hermes_constants import get_hermes_home import datetime as _dt - import sys as _sys - import threading as _threading logs_dir = get_hermes_home() / "logs" try: @@ -159,97 +223,32 @@ def _dump_subagent_timeout_diagnostic( "", "## Child config", ] - _w = lines.append - for attr in ( - "model", "provider", "api_mode", "base_url", "max_iterations", - "quiet_mode", "skip_memory", "skip_context_files", "platform", - "_delegate_role", "_delegate_depth", - ): + for attr in _DIAG_CHILD_ATTRS: try: - _w(f" {attr}: {getattr(child, attr, None)!r}") + lines.append(f" {attr}: {getattr(child, attr, None)!r}") except Exception: - _w(f" {attr}: ") - _w("") - - _w("## Toolsets") - _w(f" enabled_toolsets: {getattr(child, 'enabled_toolsets', None)!r}") + lines.append(f" {attr}: ") + lines += ["", "## Toolsets", f" enabled_toolsets: {getattr(child, 'enabled_toolsets', None)!r}"] tool_names = getattr(child, "valid_tool_names", None) if tool_names: - _w(f" loaded tool count: {len(tool_names)}") + lines.append(f" loaded tool count: {len(tool_names)}") try: - _w(f" loaded tools: {sorted(tool_names)}") + lines.append(f" loaded tools: {sorted(tool_names)}") except Exception: pass - _w("") - - _w("## Prompt / schema sizes") + lines += [""] + _diag_sizes(child) + ["", "## Activity summary"] try: - sys_prompt = getattr(child, "ephemeral_system_prompt", None) or getattr(child, "system_prompt", None) or "" - _w(f" system_prompt_bytes: {len(sys_prompt.encode('utf-8')) if isinstance(sys_prompt, str) else 'n/a'}") - _w(f" system_prompt_chars: {len(sys_prompt) if isinstance(sys_prompt, str) else 'n/a'}") + lines += [f" {k}: {v!r}" for k, v in child.get_activity_summary().items()] except Exception as exc: - _w(f" system_prompt: ") - try: - tools_schema = getattr(child, "tools", None) - if tools_schema is not None: - _w(f" tool_schema_count: {len(tools_schema)}") - _w(f" tool_schema_bytes: {len(json.dumps(tools_schema, default=str).encode('utf-8'))}") - except Exception as exc: - _w(f" tool_schema: ") - _w("") - - _w("## Activity summary") - try: - for k, v in child.get_activity_summary().items(): - _w(f" {k}: {v!r}") - except Exception as exc: - _w(f" ") - _w("") - - _w("## Worker thread stack at timeout") - frames = _sys._current_frames() - if worker_thread is not None and worker_thread.is_alive(): - worker_frame = frames.get(worker_thread.ident) - lines.extend( - _format_thread_stack(worker_frame, " ") if worker_frame is not None - else [" "] - ) - elif worker_thread is None: - _w(" ") - else: - _w(" ") - _w("") - - # All other live threads (bounded to 40): the worker is often parked on - # a helper thread, so a pre-HTTP wedge is indistinguishable from a slow - # provider without the full picture. - _w("## All thread stacks at timeout") - try: - frames = _sys._current_frames() - by_ident = {th.ident: th for th in _threading.enumerate() if th.ident} - worker_ident = worker_thread.ident if worker_thread else None - dumped = 0 - for ident, frame in frames.items(): - if ident == worker_ident: - continue # already dumped above - if dumped >= 40: - _w(f" <{len(frames) - dumped - 1} more threads omitted>") - break - th = by_ident.get(ident) - name = th.name if th else f"ident={ident}" - _w(f" --- {name}{' daemon' if (th and th.daemon) else ''} ---") - lines.extend(_format_thread_stack(frame, " ")) - dumped += 1 - except Exception as exc: - _w(f" ") - _w("") - - _w("## Notes") - _w(" This file is written ONLY when a subagent times out with 0 API calls.") - _w(" 0-API-call timeouts mean the child never reached its first LLM request.") - _w(" Common causes: oversized prompt rejected by provider, transport hang,") - _w(" credential resolution stuck. See issue #14726 for context.") - + lines.append(f" ") + lines += [""] + _diag_threads(worker_thread) + [ + "", + "## Notes", + " This file is written ONLY when a subagent times out with 0 API calls.", + " 0-API-call timeouts mean the child never reached its first LLM request.", + " Common causes: oversized prompt rejected by provider, transport hang,", + " credential resolution stuck. See issue #14726 for context.", + ] dump_path.write_text("\n".join(lines), encoding="utf-8") return str(dump_path) except Exception as exc: diff --git a/tools/delegate_tool_config.py b/tools/delegate_tool_config.py index f2429684dc..9a27b31d12 100644 --- a/tools/delegate_tool_config.py +++ b/tools/delegate_tool_config.py @@ -71,40 +71,49 @@ def _get_subagent_approval_callback(): return _subagent_auto_deny +def _knob(key: str, env_var: str, parse, default, warn_invalid): + """delegation. > > default. A config value that fails ``parse`` + calls ``warn_invalid(value)`` and yields the default; an env value that fails + is silently ignored.""" + val = _cfg().get(key) + if val is not None: + try: + return parse(val) + except (TypeError, ValueError): + warn_invalid(val) + return default + env_val = os.getenv(env_var) + if env_val: + try: + return parse(env_val) + except (TypeError, ValueError): + pass + return default + + def _get_max_concurrent_children() -> int: """delegation.max_concurrent_children > DELEGATION_MAX_CONCURRENT_CHILDREN env > 10. Floor of 1 is the only bound enforced; there is no ceiling. """ - val = _cfg().get("max_concurrent_children") - if val is not None: - try: - result = max(1, int(val)) - except (TypeError, ValueError): + result = _knob( + "max_concurrent_children", "DELEGATION_MAX_CONCURRENT_CHILDREN", lambda v: max(1, int(v)), + _DEFAULT_MAX_CONCURRENT_CHILDREN, + lambda val: logger.warning( + "delegation.max_concurrent_children=%r is not a valid integer; using default %d", + val, _DEFAULT_MAX_CONCURRENT_CHILDREN, + ), + ) + if result > 10 and _cfg().get("max_concurrent_children") is not None: + global _HIGH_CONCURRENCY_WARNED + if not _HIGH_CONCURRENCY_WARNED: + _HIGH_CONCURRENCY_WARNED = True logger.warning( - "delegation.max_concurrent_children=%r is not a valid integer; " - "using default %d", - val, - _DEFAULT_MAX_CONCURRENT_CHILDREN, + "delegation.max_concurrent_children=%d: each child consumes API tokens " + "independently. High values multiply cost linearly.", + result, ) - return _DEFAULT_MAX_CONCURRENT_CHILDREN - if result > 10: - global _HIGH_CONCURRENCY_WARNED - if not _HIGH_CONCURRENCY_WARNED: - _HIGH_CONCURRENCY_WARNED = True - logger.warning( - "delegation.max_concurrent_children=%d: each child consumes API tokens " - "independently. High values multiply cost linearly.", - result, - ) - return result - env_val = os.getenv("DELEGATION_MAX_CONCURRENT_CHILDREN") - if env_val: - try: - return max(1, int(env_val)) - except (TypeError, ValueError): - return _DEFAULT_MAX_CONCURRENT_CHILDREN - return _DEFAULT_MAX_CONCURRENT_CHILDREN + return result def _get_worktree_isolation() -> bool: @@ -151,23 +160,12 @@ def _get_child_timeout() -> Optional[float]: staleness monitor. delegation.child_timeout_seconds > 0 opts in (floor 30 s); 0 or negative disables. Env fallback: DELEGATION_CHILD_TIMEOUT_SECONDS. """ - val = _cfg().get("child_timeout_seconds") - if val is not None: - try: - return _parse_timeout(val) - except (TypeError, ValueError): - logger.warning( - "delegation.child_timeout_seconds=%r is not a valid number; " - "using default (no timeout)", - val, - ) - env_val = os.getenv("DELEGATION_CHILD_TIMEOUT_SECONDS") - if env_val: - try: - return _parse_timeout(env_val) - except (TypeError, ValueError): - pass - return DEFAULT_CHILD_TIMEOUT + return _knob( + "child_timeout_seconds", "DELEGATION_CHILD_TIMEOUT_SECONDS", _parse_timeout, DEFAULT_CHILD_TIMEOUT, + lambda val: logger.warning( + "delegation.child_timeout_seconds=%r is not a valid number; using default (no timeout)", val, + ), + ) def _get_max_spawn_depth() -> int: