hermes-bsd/tests/tools
srojk34 795913d3b0 fix(kanban): restrict goal_mode kanban_block to genuine external blockers
The judge gate added for kanban_complete (Issue #38367, PR #38388) only
covers one of the two exit paths out of run_kanban_goal_loop(). The loop
treats status == "blocked" as terminal identically to "done" (and any
other status outside running/ready/done/blocked also stops the loop —
see goals.py's status dispatch). A goal_mode worker that has learned
kanban_complete is gated can simply call kanban_block(reason="anything")
to escape the loop with zero judge involvement, fully defeating the
intent of #38367's fix.

This is Issue #38696, filed as the explicit follow-up by a reviewer on
PR #38388: "kanban_complete is one way out; kanban_block is another...
A worker that learns the complete path is gated can shift to calling
block to escape the loop with the same effect."

Implements the issue's "Option B" (deterministic allowlist, no extra
judge LLM call) using the kind taxonomy that already exists in
kb.VALID_BLOCK_KINDS, rather than inventing a new judge_goal() outcome
type (judge_goal only returns done/continue/wait/skipped — there's no
"is this block legitimate" verdict to hook the issue's "Option A"
pseudocode onto without expanding the judge's contract).

goal_mode tasks may only block with kind in {dependency, needs_input} —
the two kinds that represent a genuine external blocker the worker
cannot resolve itself. `capability`, `transient`, and an unset kind are
rejected with a message directing the worker to kanban_complete instead,
which the judge now gates. Non-goal_mode tasks are completely unaffected.
2026-06-30 14:29:42 -07:00
..
__init__.py
conftest.py
test_accretion_caps.py
test_ansi_strip.py
test_approval.py fix(security): harden heredoc approval, NFKC homograph fold, env-var filter 2026-06-30 02:59:46 -07:00
test_approval_heartbeat.py
test_approval_interrupt.py test(approval): regression for interrupt-unblocks-approval; AUTHOR_MAP 2026-06-21 13:33:48 -07:00
test_approval_plugin_hooks.py
test_async_delegation.py feat(delegation): background fan-out — parallel subagents, one consolidated return (#49734) 2026-06-20 11:27:12 -07:00
test_base_environment.py fix(environments): use $BASHPID for atomic snapshot temp + harden failure path 2026-06-28 02:08:57 -07:00
test_blueprints.py
test_browser_camofox.py fix(browser): force secret-pattern redaction on browser_type display 2026-06-25 22:02:22 -07:00
test_browser_camofox_auth.py fix(browser): send Authorization header in Camofox HTTP calls when CAMOFOX_API_KEY is set 2026-06-29 01:26:24 -07:00
test_browser_camofox_ensure_tab.py fix(tools): send listItemId instead of sessionKey in Camofox tab creation 2026-06-29 01:26:24 -07:00
test_browser_camofox_persistence.py test(camofox): accept headers= kwarg in persistence test mocks 2026-06-29 01:26:24 -07:00
test_browser_camofox_state.py
test_browser_camofox_timeout.py fix(tools): read browser.command_timeout in Camofox HTTP client 2026-06-29 01:26:24 -07:00
test_browser_cdp_override.py fix(security): redact browser CDP endpoint logs 2026-06-29 04:25:26 -07:00
test_browser_cdp_tool.py
test_browser_chromium_autoinstall.py feat(browser): auto-install Chromium binary on local cold-start failure 2026-06-28 12:25:15 -05:00
test_browser_chromium_check.py fix(windows): cover remaining console-flash spawn legs (#54417) 2026-06-28 13:49:08 -07:00
test_browser_cleanup.py
test_browser_cloud_fallback.py
test_browser_cloud_provider_cache.py
test_browser_command_timeout_race.py fix(browser_tool): resolve race in _get_command_timeout cache returning None (#14331) 2026-06-29 02:24:57 -07:00
test_browser_console.py
test_browser_content_none_guard.py
test_browser_eval_ssrf.py fix(browser): close eval return-value SSRF bypass (sibling of #44731) 2026-06-28 02:42:01 -07:00
test_browser_eval_supervisor_path.py
test_browser_get_images_ssrf.py fix(browser): extend private-network guard to browser_get_images 2026-06-28 14:25:10 -07:00
test_browser_hardening.py revert(windows): roll back terminal-popup PRs #53791 #53810 #53829 (#53853) 2026-06-27 15:59:00 -07:00
test_browser_homebrew_paths.py fix(windows): cover remaining console-flash spawn legs (#54417) 2026-06-28 13:49:08 -07:00
test_browser_hybrid_routing.py
test_browser_lightpanda.py
test_browser_open_timeout.py test(browser): cover open timeout diagnostics and failed navigate title 2026-06-28 12:14:21 -05:00
test_browser_orphan_reaper.py fix(browser): verify daemon identity before orphan reaper kills a PID (#14073) 2026-06-21 15:23:47 -07:00
test_browser_secret_exfil.py feat(web_extract): truncate-and-store instead of LLM summarization (#54843) 2026-06-29 10:00:49 -07:00
test_browser_snapshot_ssrf.py fix(browser): allow local sidecar sessions to bypass SSRF guard 2026-06-28 02:42:01 -07:00
test_browser_ssrf_local.py fix(browser): enable SSRF guard when terminal runs in container 2026-06-21 07:26:18 -07:00
test_browser_supervisor.py
test_browser_supervisor_healthcheck.py
test_browser_type_redaction.py fix(browser): force secret-pattern redaction on browser_type display 2026-06-25 22:02:22 -07:00
test_budget_config.py fix(agent): scale tool-output budget to the model context window (#23767) 2026-06-21 17:46:38 +05:30
test_checkpoint_manager.py
test_clarify_gateway.py fix: accept typed clarify choice replies 2026-06-28 04:13:19 -07:00
test_clarify_tool.py fix(clarify): unwrap dict choices at the source so every surface gets clean text 2026-06-19 06:31:08 -07:00
test_clipboard.py
test_code_execution.py fix(security): quote HERMES_TIMEZONE in remote code execution to prevent shell injection 2026-06-21 16:55:12 -07:00
test_code_execution_modes.py
test_code_execution_windows_env.py
test_command_guards.py fix(approval): honor glob command allowlist entries (#43051) 2026-06-18 12:48:36 +10:00
test_computer_use.py Merge remote-tracking branch 'origin/main' into pr-50994 2026-06-22 18:48:07 -05:00
test_computer_use_capture_routing.py feat(computer_use): cross-platform cua-driver (macOS/Windows/Linux) 2026-06-22 06:42:30 -07:00
test_computer_use_vision_routing.py
test_config_null_guard.py
test_container_cwd_sanitize.py fix(file-tools): sanitize host/relative cwd override before it reaches container sandbox (#54447) (#54616) 2026-06-29 15:32:20 +10:00
test_credential_files.py fix(hermes-home): only honour legacy dir layout when it has content 2026-06-27 04:57:15 +05:30
test_credential_pool_env_fallback.py fix(credentials): prefer ~/.hermes/.env over stale os.environ on key rotation (#55528) 2026-06-30 09:49:52 +00:00
test_cron_approval_mode.py
test_cron_prompt_injection.py fix(security): align cron invisible-unicode set with install-time scanner 2026-06-26 01:11:11 -07:00
test_cronjob_run_immediate.py fix(cron): execute job immediately on action='run' 2026-06-21 13:28:04 +05:30
test_cronjob_tools.py fix(cron): tell the user TUI/CLI cron jobs are local-only at create time (#51683) 2026-06-23 23:27:48 -07:00
test_cross_profile_guard.py
test_daytona_environment.py fix(daytona): quote single-upload mkdir parent path (#54440) 2026-06-28 14:33:03 -07:00
test_debug_helpers.py
test_delegate.py fix(tools): prune acp_command from delegate_task schema when no ACP CLI is on PATH 2026-06-30 03:41:46 -07:00
test_delegate_composite_toolsets.py
test_delegate_subagent_timeout_diagnostic.py
test_delegate_summary_budget.py fix(delegation): budget subagent summaries against parent context headroom 2026-06-30 03:07:40 -07:00
test_delegate_toolset_scope.py fix(delegate): route subagent progress lines through _safe_print for ACP stdio 2026-06-30 03:16:22 -07:00
test_discord_tool.py
test_docker_cgroup_limits.py fix(docker): gate resource limit flags on cgroup controller availability (#54516) 2026-06-29 11:01:08 +10:00
test_docker_config_migrate.py test(docker): assert boot migration keeps .env byte-identical across reboots 2026-06-24 15:23:23 +10:00
test_docker_environment.py fix(docker): gate resource limit flags on cgroup controller availability (#54516) 2026-06-29 11:01:08 +10:00
test_docker_find.py
test_docker_orphan_reaper_integration.py
test_dockerfile_immutable_install.py refactor(ci): faster docker builds via --link and chmod removal 2026-06-26 19:15:18 -07:00
test_dockerfile_node_modules_perms.py Harden hosted Docker install tree against self-modification (#47490) 2026-06-18 09:09:21 +10:00
test_dockerfile_pid1_reaping.py
test_env_passthrough.py fix(env-passthrough): fail closed when provider blocklist import fails 2026-06-28 02:05:43 -07:00
test_env_probe.py
test_execute_code_approval_cluster.py
test_feishu_tools.py
test_file_operations.py
test_file_operations_edge_cases.py
test_file_ops_cwd_tracking.py
test_file_read_guards.py fix(file): anchor device symlink guard to task cwd 2026-06-21 12:16:10 -07:00
test_file_staleness.py
test_file_state_registry.py
test_file_sync.py
test_file_sync_back.py
test_file_sync_perf.py
test_file_tools.py fix(security): cover Move and no-space headers in patch_tool sensitive path check 2026-06-30 02:50:24 -07:00
test_file_tools_container_config.py
test_file_tools_cwd_resolution.py fix(file-ops): keep worktree isolation when restoring preserved cwd (#26211) 2026-06-27 19:29:06 -07:00
test_file_tools_live.py
test_file_tools_tilde_profile.py fix(file_tools): resolve tilde using profile home for file operations (#48552) 2026-06-23 03:17:47 +05:30
test_file_write_safety.py fix: use os.pathsep, add tests, update tips for multi-root support 2026-06-27 04:01:12 +05:30
test_find_shell.py fix(terminal): prefer $SHELL over bash for background process spawning (#42203) 2026-06-26 20:45:32 +05:30
test_force_dangerous_override.py
test_fuzzy_match.py fix(fuzzy-match): preserve boundary space after whitespace-normalized match 2026-06-26 01:55:27 +05:30
test_gateway_cwd_contract.py
test_hardline_blocklist.py
test_heartbeat_stale_thresholds.py
test_hermes_subprocess_env.py fix(security): centralize credential-safe subprocess env (#29157) 2026-06-27 20:45:31 -07:00
test_hidden_dir_filter.py
test_homeassistant_tool.py
test_image_generation.py krea 2026-06-25 12:38:33 -07:00
test_image_generation_artifacts.py feat(image-gen): add image-to-image / editing to image_generate (#48705) 2026-06-18 22:13:07 -07:00
test_image_generation_env.py
test_image_generation_image_to_image.py fix(tools): never let a model whitelist strip the prompt / source images 2026-06-19 16:59:54 -07:00
test_image_generation_plugin_dispatch.py
test_init_session_cwd_respect.py
test_interrupt.py
test_kanban_redaction.py fix(security): redact secrets in kanban tool payloads before persistence 2026-06-21 12:02:30 -07:00
test_kanban_tools.py fix(kanban): restrict goal_mode kanban_block to genuine external blockers 2026-06-30 14:29:42 -07:00
test_lazy_deps.py
test_lazy_deps_durable_target.py test(lazy-deps): make durable-target tests network-free 2026-06-25 09:20:13 +10:00
test_line_ending_preservation.py
test_llm_content_none_guard.py feat(moa): expose MoA presets as selectable virtual models (#46081) 2026-06-25 13:52:06 -07:00
test_local_background_child_hang.py
test_local_env_blocklist.py fix(terminal): strip VIRTUAL_ENV/CONDA_PREFIX from terminal subprocess env 2026-06-28 01:04:20 +05:30
test_local_env_cwd_recovery.py
test_local_env_windows_msys.py
test_local_interrupt_cleanup.py fix(desktop): tree-kill Windows terminal descendants 2026-06-30 04:23:27 -05:00
test_local_shell_init.py
test_local_tempdir.py
test_managed_browserbase_and_modal.py
test_managed_media_gateways.py
test_managed_modal_environment.py
test_managed_tool_gateway.py
test_mcp_cancelled_error_propagation.py
test_mcp_capability_gating.py test(mcp): cover 'unknown method' ping keepalive fallback (#50028) 2026-06-21 16:02:56 +05:30
test_mcp_circuit_breaker.py fix(mcp): never permanently wedge the circuit breaker on a dead transport (#53599) 2026-06-27 04:39:54 -07:00
test_mcp_client_cert.py
test_mcp_dynamic_discovery.py
test_mcp_elicitation.py feat(tools): MCP elicitation handler with gateway-aware approval routing 2026-06-19 11:46:25 -07:00
test_mcp_empty_error_message.py
test_mcp_image_content.py
test_mcp_invalid_url.py
test_mcp_loop_profile_override.py
test_mcp_oauth.py fix(mcp): suppress interactive OAuth stdin prompts during background discovery (#35927) 2026-06-27 04:59:23 +05:30
test_mcp_oauth_bidirectional.py
test_mcp_oauth_cold_load_expiry.py
test_mcp_oauth_integration.py
test_mcp_oauth_manager.py test(mcp): make invalid_client tests interactive under hermetic env 2026-06-26 00:35:27 -07:00
test_mcp_oauth_metadata.py
test_mcp_preflight_content_type.py fix(mcp): skip preflight content-type probe for OAuth servers 2026-06-28 04:47:39 -07:00
test_mcp_probe.py
test_mcp_reconnect_signal.py
test_mcp_sse_transport.py
test_mcp_stability.py fix(mcp): skip killpg when child shares gateway's process group (#47134) 2026-06-24 00:52:18 +05:30
test_mcp_structured_content.py
test_mcp_tool.py
test_mcp_tool_401_handling.py
test_mcp_tool_issue_948.py fix(mcp): run OSV malware preflight off the event loop with a bounded timeout (#29184) 2026-06-25 23:30:41 +05:30
test_mcp_tool_session_expired.py
test_mcp_utility_capability_gating.py
test_memory_tool.py fix(memory): degrade gracefully after repeated at-capacity consolidation failures (#42405) 2026-06-30 20:01:16 +05:30
test_memory_tool_import_fallback.py
test_memory_tool_schema.py feat(memory): batch operations for single-turn memory updates (#48507) 2026-06-18 10:19:33 -07:00
test_microsoft_graph_auth.py
test_microsoft_graph_client.py
test_modal_bulk_upload.py
test_modal_sandbox_fixes.py fix(terminal): require approval for host-bound Docker commands (#54483) 2026-06-29 11:35:41 +10:00
test_modal_snapshot_isolation.py
test_notify_on_complete.py fix(process): keep CLI drain dedup after poll goes read-only (#10156) 2026-06-21 11:11:23 -07:00
test_osv_check.py
test_parse_env_var.py
test_patch_failure_tracking.py
test_patch_parser.py
test_pr_6656_regressions.py
test_process_registry.py fix(desktop): tree-kill Windows terminal descendants 2026-06-30 04:23:27 -05:00
test_read_extract.py
test_read_loop_detection.py
test_refresh_agent_mcp_tools.py fix(mcp): address adversarial review round 2 (stale-publish race, parity holes) 2026-06-19 11:57:43 -07:00
test_registry.py test(registry): cover mixed terminal toolset doctor false negative 2026-06-30 17:47:37 +05:30
test_resolve_path.py
test_schema_sanitizer.py
test_search_budget_truncation.py
test_search_error_guard.py fix: warn on line-oriented newline search patterns 2026-06-20 23:23:47 -07:00
test_search_hidden_dirs.py
test_send_message_missing_platforms.py refactor(gateway): migrate slack/dingtalk/whatsapp/matrix/feishu/telegram/wecom/email/sms adapters to bundled plugins 2026-06-20 10:26:45 -07:00
test_send_message_react.py
test_send_message_target_parse.py
test_send_message_telegram_proxy.py
test_send_message_tool.py fix(telegram): chunk formatted messages with UTF-16 length accounting 2026-06-30 03:51:08 -07:00
test_session_search.py fix(session_search): demote cron below interactive sessions in discover ranking (#53597) 2026-06-27 04:41:22 -07:00
test_shared_container_task_id.py
test_signal_media.py refactor(gateway): migrate slack/dingtalk/whatsapp/matrix/feishu/telegram/wecom/email/sms adapters to bundled plugins 2026-06-20 10:26:45 -07:00
test_singularity_preflight.py
test_skill_env_passthrough.py
test_skill_improvements.py
test_skill_manager_tool.py fix(curator): fail closed on unverified skill deletes during consolidation (#53935) 2026-06-27 20:45:57 -07:00
test_skill_provenance.py
test_skill_size_limits.py
test_skill_usage.py fix(curator): protect external skills from background curation 2026-06-25 22:03:02 -07:00
test_skill_view_path_check.py
test_skill_view_traversal.py
test_skills_ast_audit.py
test_skills_guard.py
test_skills_hub.py fix(skills): replace string prefix check with strict path containment 2026-06-28 21:14:01 -07:00
test_skills_hub_browse_sh.py
test_skills_hub_clawhub.py
test_skills_list_modified_diff.py test(skills): cover list-modified + diff for bundled skills 2026-06-18 12:26:20 +05:30
test_skills_sync.py fix(skills): skip shadowing when external_dirs provides the skill 2026-06-27 21:07:53 -07:00
test_skills_tool.py
test_slash_confirm.py
test_smart_approval_injection.py fix(security): harden smart approval guard against prompt injection 2026-06-21 16:39:48 -07:00
test_spotify_client.py docs(spotify): document 6-month re-auth cycle and add client-level invalid_grant test 2026-06-20 23:23:47 -07:00
test_ssh_bulk_upload.py
test_ssh_environment.py
test_stage2_hook_seed_one_symlinks.py fix(docker): skip symlinked stage2 chown targets (#52789) 2026-06-26 12:09:52 +10:00
test_stage2_hook_symlink_chown.py fix(docker): skip symlinked stage2 chown targets (#52789) 2026-06-26 12:09:52 +10:00
test_subprocess_stdin_guard.py
test_symlink_prefix_confusion.py
test_sync_back_backends.py
test_terminal_compound_background.py
test_terminal_config_env_sync.py fix(terminal): bridge docker_extra_args to TERMINAL_DOCKER_EXTRA_ARGS in CLI + gateway (#50631) 2026-06-22 15:41:23 +10:00
test_terminal_exit_semantics.py
test_terminal_foreground_timeout_cap.py
test_terminal_none_command_guard.py
test_terminal_output_transform_hook.py fix(redact): stop DB-connstr redaction from corrupting code output (#33801) (#54061) 2026-06-28 01:15:39 -07:00
test_terminal_requirements.py
test_terminal_task_cwd.py fix(terminal): require approval for host-bound Docker commands (#54483) 2026-06-29 11:35:41 +10:00
test_terminal_timeout_output.py
test_terminal_tool.py test(terminal): cover sudo cache invalidation and multi-invocation piping 2026-06-25 23:08:48 +05:30
test_terminal_tool_pty_fallback.py
test_terminal_tool_requirements.py fix(tools): suppress transient check_fn flakes so subagents keep file/terminal tools 2026-06-27 19:29:00 -07:00
test_threaded_process_handle.py
test_threat_patterns.py fix(security): harden heredoc approval, NFKC homograph fold, env-var filter 2026-06-30 02:59:46 -07:00
test_tirith_security.py fix(security): add circuit breaker for tirith crashes to prevent agent hangs (#41400) 2026-06-26 15:26:08 +05:30
test_todo_tool.py
test_todo_tool_type_coercion.py fix(tools): defensive type coercion in todo_tool for malformed LLM input (#14185) 2026-06-25 23:42:42 +05:30
test_tool_backend_helpers.py
test_tool_output_limits.py
test_tool_result_storage.py
test_tool_search.py
test_transcription.py
test_transcription_command_providers.py
test_transcription_dotenv_fallback.py
test_transcription_plugin_dispatch.py
test_transcription_tools.py
test_tts_command_providers.py
test_tts_dotenv_fallback.py
test_tts_gemini.py
test_tts_kittentts.py
test_tts_max_text_length.py
test_tts_mistral.py
test_tts_opus_routing.py
test_tts_path_traversal.py
test_tts_piper.py feat(tts): expose speaker_id on built-in Piper provider 2026-06-19 07:04:58 -07:00
test_tts_plugin_dispatch.py
test_tts_speed.py
test_tts_xai_speech_tags.py feat(tts): add xAI TTS speed and optimize_streaming_latency config knobs 2026-06-19 07:26:56 -07:00
test_url_safety.py test(url-safety): cover IPv6 scope-ID strip + fail-closed in URL guards 2026-06-21 13:56:35 -07:00
test_video_analyze.py
test_video_generation_dispatch.py feat(xai): Imagine public-URL storage, chaining & video edit/extend 2026-06-29 21:11:58 -07:00
test_video_generation_dynamic_schema.py feat(xai): Imagine public-URL storage, chaining & video edit/extend 2026-06-29 21:11:58 -07:00
test_video_generation_tool_surface_matrix.py feat(xai): Imagine public-URL storage, chaining & video edit/extend 2026-06-29 21:11:58 -07:00
test_vision_native_fast_path.py
test_vision_tools.py fix(vision): narrow the fan-out cap to the CPU encode burst only 2026-06-29 01:27:10 -07:00
test_voice_cli_integration.py
test_voice_mode.py
test_watch_patterns.py
test_web_extract_robustness.py fix(web_extract): bound stored full-text size + give concrete read_file offset 2026-06-30 00:19:49 -07:00
test_web_providers.py feat(web_extract): truncate-and-store instead of LLM summarization (#54843) 2026-06-29 10:00:49 -07:00
test_web_providers_brave_free.py
test_web_providers_ddgs.py fix(ddgs): bound DuckDuckGo search with a wall-clock timeout (#36776) 2026-06-25 01:45:06 +05:30
test_web_providers_searxng.py
test_web_providers_xai.py
test_web_tools_config.py feat(web_extract): truncate-and-store instead of LLM summarization (#54843) 2026-06-29 10:00:49 -07:00
test_web_tools_tavily.py feat(web_extract): truncate-and-store instead of LLM summarization (#54843) 2026-06-29 10:00:49 -07:00
test_web_tools_truncate.py feat(web_extract): truncate-and-store instead of LLM summarization (#54843) 2026-06-29 10:00:49 -07:00
test_website_policy.py feat(web_extract): truncate-and-store instead of LLM summarization (#54843) 2026-06-29 10:00:49 -07:00
test_whatsapp_send_message_media.py feat(send_message): native WhatsApp media delivery via Baileys bridge (#53598) 2026-06-27 04:40:05 -07:00
test_windows_compat.py fix(tools): use start_new_session instead of preexec_fn to prevent SIGSEGV in multi-threaded processes 2026-06-27 03:08:41 +05:30
test_windows_native_support.py revert(windows): roll back terminal-popup PRs #53791 #53810 #53829 (#53853) 2026-06-27 15:59:00 -07:00
test_write_approval.py fix(memory): honor configured char limits in the no-agent on-disk store 2026-06-23 03:10:53 +05:30
test_write_deny.py
test_x_search_tool.py
test_xai_http_storage.py feat(xai): Imagine public-URL storage, chaining & video edit/extend 2026-06-29 21:11:58 -07:00
test_yolo_mode.py
test_zombie_process_cleanup.py fix(session): finalize owned SQLite session rows on AIAgent.close() 2026-06-21 11:35:09 -07:00