hermes-agent/tests/tools
Teknium 3c070f9f9d
fix(curator): only mark agent-created for background-review sediment (#19621)
Tighten the provenance semantics added in #19618: skills a user asks a
foreground agent to write via skill_manage(create) now stay invisible to
the curator. Only skills the background self-improvement review fork
sediments through skill_manage get the created_by=agent marker.

- tools/skill_provenance.py — new ContextVar module mirroring the
  _approval_session_key pattern: set_current_write_origin / reset /
  get / is_background_review. Default origin is 'foreground'; the
  review fork sets 'background_review'.
- run_agent.py — run_conversation() binds the ContextVar from
  self._memory_write_origin at the top of each call. The review fork
  runs on its own thread (fresh context), so foreground and review
  contexts never cross-contaminate.
- tools/skill_manager_tool.py — skill_manage(action='create') now
  only calls mark_agent_created() when is_background_review(). All
  other cases (foreground create, patch, edit, write_file, delete)
  continue as before.
- tests: test_skill_provenance.py (6 tests covering the ContextVar
  surface), split test_full_create_via_dispatcher into foreground
  vs. review-fork variants, curator status tests now mark-first.

Why: the agent routinely edits existing user skills on the user's
behalf; those writes must never flip provenance. And when a user
explicitly asks the foreground agent to create a skill, that skill
belongs to the user. The curator should only be cleaning up after
its own autonomous sediment from the review nudge loop.
2026-05-04 02:42:16 -07:00
..
__init__.py
…
test_accretion_caps.py fix(ci): recover 38 failing tests on main (#17642) 2026-04-29 20:05:32 -07:00
test_ansi_strip.py
…
test_approval.py fix(approval): close remaining prompt_toolkit deadlock vectors (#15216) 2026-04-27 06:42:32 -07:00
test_approval_heartbeat.py fix(ci): stabilize main test suite regressions (#17660) 2026-04-29 23:18:55 -07:00
test_approval_plugin_hooks.py feat(plugins): add pre_approval_request / post_approval_response hooks (#16776) 2026-04-27 20:08:33 -07:00
test_base_environment.py
…
test_browser_camofox.py
…
test_browser_camofox_persistence.py
…
test_browser_camofox_state.py
…
test_browser_cdp_override.py
…
test_browser_cdp_tool.py
…
test_browser_chromium_check.py fix(browser): detect missing Chromium and fail fast with actionable error (#17039) 2026-04-28 07:03:44 -07:00
test_browser_cleanup.py
…
test_browser_cloud_fallback.py
…
test_browser_console.py
…
test_browser_content_none_guard.py
…
test_browser_hardening.py
…
test_browser_homebrew_paths.py fix(browser): detect missing Chromium and fail fast with actionable error (#17039) 2026-04-28 07:03:44 -07:00
test_browser_hybrid_routing.py
…
test_browser_orphan_reaper.py fix(ci): stabilize main test suite regressions (#17660) 2026-04-29 23:18:55 -07:00
test_browser_secret_exfil.py
…
test_browser_ssrf_local.py fix(security): treat quoted false as false in browser SSRF guards 2026-04-26 18:27:13 -07:00
test_browser_supervisor.py
…
test_browser_supervisor_healthcheck.py test(browser_supervisor): cover cache-hit healthcheck on dead thread/loop 2026-04-30 20:33:33 -07:00
test_budget_config.py
…
test_checkpoint_manager.py feat(checkpoints): auto-prune orphan and stale shadow repos at startup (#16303) 2026-04-26 19:05:52 -07:00
test_clarify_tool.py
…
test_clipboard.py fix(ci): stabilize main test suite regressions (#17660) 2026-04-29 23:18:55 -07:00
test_code_execution.py fix(tools): serialize concurrent hermes_tools RPC calls from execute_code 2026-04-30 03:31:16 -07:00
test_code_execution_modes.py
…
test_command_guards.py feat: add Vercel Sandbox backend 2026-04-29 07:22:33 -07:00
test_config_null_guard.py
…
test_credential_files.py
…
test_credential_pool_env_fallback.py
…
test_cron_approval_mode.py
…
test_cron_prompt_injection.py
…
test_cronjob_tools.py fix(cron): accept list-form deliver values so deliver=['telegram'] works (#17456) 2026-04-29 06:35:34 -07:00
test_daytona_environment.py
…
test_debug_helpers.py
…
test_delegate.py fix(delegate): inherit parent fallback_chain in _build_child_agent 2026-05-04 01:48:56 -07:00
test_delegate_subagent_timeout_diagnostic.py
…
test_delegate_toolset_scope.py
…
test_discord_tool.py test(discord_tool): add regression test for per-token capability cache 2026-04-30 20:37:12 -07:00
test_docker_environment.py feat(docker): run container as host user to avoid root-owned bind mounts 2026-04-29 16:16:43 +10:00
test_docker_find.py
…
test_dockerfile_pid1_reaping.py chore(salvage): strip duplicated/merge-corrupted blocks from PR #17664 2026-04-29 21:56:51 -07:00
test_env_passthrough.py
…
test_feishu_tools.py
…
test_file_operations.py fix(file): strip leaked terminal fences from reads 2026-05-03 16:58:50 -07:00
test_file_operations_edge_cases.py
…
test_file_ops_cwd_tracking.py
…
test_file_read_guards.py fix(file-tools): escalate to BLOCKED on repeated read_file dedup stubs (#16382) 2026-04-27 00:17:26 -07:00
test_file_staleness.py
…
test_file_state_registry.py
…
test_file_sync.py
…
test_file_sync_back.py fix(ci): stabilize current main test regressions 2026-04-30 06:36:50 -07:00
test_file_sync_perf.py
…
test_file_tools.py fix(tools): write_file handler now rejects missing 'content'/'path' args instead of silently writing zero-byte files (#19096) 2026-05-03 08:52:41 -07:00
test_file_tools_container_config.py
…
test_file_tools_live.py
…
test_file_write_safety.py
…
test_force_dangerous_override.py
…
test_fuzzy_match.py
…
test_hardline_blocklist.py fix: address self-review findings for Vercel Sandbox salvage 2026-04-29 07:22:33 -07:00
test_hidden_dir_filter.py
…
test_homeassistant_tool.py
…
test_image_generation.py
…
test_image_generation_env.py
…
test_image_generation_plugin_dispatch.py
…
test_init_session_cwd_respect.py fix(cli): respect terminal.cwd config in local terminal backend 2026-04-28 22:16:08 -07:00
test_interrupt.py
…
test_kanban_tools.py test(kanban): update worker-prompt header assertion to match #19427 2026-05-04 02:00:42 -07:00
test_llm_content_none_guard.py
…
test_local_background_child_hang.py
…
test_local_env_blocklist.py feat: add Vercel Sandbox backend 2026-04-29 07:22:33 -07:00
test_local_interrupt_cleanup.py fix(ci): stabilize main test suite regressions (#17660) 2026-04-29 23:18:55 -07: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_server_tool_support.py
…
test_managed_tool_gateway.py
…
test_mcp_circuit_breaker.py
…
test_mcp_dynamic_discovery.py fix(ci): recover 38 failing tests on main (#17642) 2026-04-29 20:05:32 -07:00
test_mcp_oauth.py
…
test_mcp_oauth_bidirectional.py
…
test_mcp_oauth_cold_load_expiry.py
…
test_mcp_oauth_integration.py
…
test_mcp_oauth_manager.py
…
test_mcp_probe.py
…
test_mcp_reconnect_signal.py
…
test_mcp_stability.py fix(cron): reap orphaned MCP stdio subprocesses after each tick 2026-04-26 18:21:20 -07:00
test_mcp_structured_content.py fix(ci): recover 38 failing tests on main (#17642) 2026-04-29 20:05:32 -07:00
test_mcp_tool.py fix(mcp): preserve nullable schema coercion 2026-04-28 04:58:03 -07:00
test_mcp_tool_401_handling.py
…
test_mcp_tool_issue_948.py
…
test_mcp_tool_session_expired.py fix(mcp): reconnect on terminated sessions 2026-05-03 15:23:33 -07:00
test_memory_tool.py
…
test_memory_tool_import_fallback.py
…
test_mixture_of_agents_tool.py
…
test_modal_bulk_upload.py
…
test_modal_sandbox_fixes.py feat: add Vercel Sandbox backend 2026-04-29 07:22:33 -07:00
test_modal_snapshot_isolation.py
…
test_notify_on_complete.py
…
test_osv_check.py
…
test_parse_env_var.py
…
test_patch_parser.py
…
test_process_registry.py fix(process): reconcile session.exited against real child exit in poll/wait (#17430) 2026-04-29 04:59:21 -07:00
test_read_loop_detection.py
…
test_registry.py test(toolsets): include kanban in expected post-#17805 toolset assertions 2026-04-30 19:43:03 -07:00
test_resolve_path.py
…
test_rl_training_tool.py
…
test_schema_sanitizer.py
…
test_search_hidden_dirs.py
…
test_send_message_missing_platforms.py
…
test_send_message_tool.py feat(gateway/signal): add support for multiple images sending 2026-04-30 04:28:08 -07:00
test_session_search.py fix(session_search): order recent mode by last activity instead of start time 2026-04-30 20:17:15 -07:00
test_shared_container_task_id.py
…
test_signal_media.py
…
test_singularity_preflight.py
…
test_skill_env_passthrough.py
…
test_skill_improvements.py
…
test_skill_manager_tool.py fix(curator): only mark agent-created for background-review sediment (#19621) 2026-05-04 02:42:16 -07:00
test_skill_provenance.py fix(curator): only mark agent-created for background-review sediment (#19621) 2026-05-04 02:42:16 -07:00
test_skill_size_limits.py
…
test_skill_usage.py fix(skills): keep manual skills out of curator 2026-05-04 02:19:28 -07:00
test_skill_view_path_check.py
…
test_skill_view_traversal.py
…
test_skills_guard.py
…
test_skills_hub.py test(skills): add bytes-vs-str equivalence and on-disk hash parity tests 2026-05-04 01:28:12 -07:00
test_skills_hub_clawhub.py
…
test_skills_sync.py
…
test_skills_tool.py fix: address self-review findings for Vercel Sandbox salvage 2026-04-29 07:22:33 -07:00
test_slash_confirm.py feat(gateway,cli): confirm /reload-mcp to warn about prompt cache invalidation 2026-04-29 21:56:47 -07:00
test_spotify_client.py
…
test_ssh_bulk_upload.py test(ssh): update tar pipe assertion for --no-overwrite-dir 2026-04-30 04:32:28 -07:00
test_ssh_environment.py
…
test_symlink_prefix_confusion.py
…
test_sync_back_backends.py
…
test_terminal_compound_background.py
…
test_terminal_config_env_sync.py feat(docker): run container as host user to avoid root-owned bind mounts 2026-04-29 16:16:43 +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
…
test_terminal_requirements.py feat: add Vercel Sandbox backend 2026-04-29 07:22:33 -07:00
test_terminal_timeout_output.py
…
test_terminal_tool.py fix(terminal): skip sudo prompt when local NOPASSWD sudo works 2026-04-30 20:38:09 -07:00
test_terminal_tool_pty_fallback.py
…
test_terminal_tool_requirements.py feat: add Vercel Sandbox backend 2026-04-29 07:22:33 -07:00
test_threaded_process_handle.py
…
test_tirith_security.py fix(ci): stabilize main test suite regressions (#17660) 2026-04-29 23:18:55 -07:00
test_todo_tool.py
…
test_tool_backend_helpers.py fix(cli): coerce use_gateway config flags in tool routing 2026-04-26 19:02:55 -07:00
test_tool_call_parsers.py
…
test_tool_output_limits.py
…
test_tool_result_storage.py
…
test_transcription.py fix(ci): stabilize main test suite regressions (#17660) 2026-04-29 23:18:55 -07:00
test_transcription_dotenv_fallback.py fix(ci): stabilize main test suite regressions (#17660) 2026-04-29 23:18:55 -07:00
test_transcription_tools.py fix(ci): stabilize main test suite regressions (#17660) 2026-04-29 23:18:55 -07:00
test_tts_command_providers.py feat(tts): add Piper as a native local TTS provider (closes #8508) (#17885) 2026-04-30 02:53:20 -07:00
test_tts_dotenv_fallback.py fix(ci): stabilize main test suite regressions (#17660) 2026-04-29 23:18:55 -07:00
test_tts_gemini.py
…
test_tts_kittentts.py
…
test_tts_max_text_length.py
…
test_tts_mistral.py feat(tts): add Piper as a native local TTS provider (closes #8508) (#17885) 2026-04-30 02:53:20 -07:00
test_tts_piper.py feat(tts): add Piper as a native local TTS provider (closes #8508) (#17885) 2026-04-30 02:53:20 -07:00
test_tts_speed.py
…
test_url_safety.py fix(security): treat quoted false as false in browser SSRF guards 2026-04-26 18:27:13 -07:00
test_vercel_sandbox_environment.py feat: add Vercel Sandbox backend 2026-04-29 07:22:33 -07:00
test_video_analyze.py feat: add video_analyze tool for native video understanding (#19301) 2026-05-04 00:04:36 +05:30
test_vision_tools.py
…
test_voice_cli_integration.py fix(cli): avoid voice TTS restart race 2026-05-04 01:36:07 -07:00
test_voice_mode.py
…
test_watch_patterns.py
…
test_web_tools_config.py ✨ feat(web): expose search result limit 2026-04-28 02:09:30 -07:00
test_web_tools_tavily.py
…
test_website_policy.py
…
test_windows_compat.py
…
test_write_deny.py
…
test_yolo_mode.py fix(approval): harden YOLO mode env parsing against quoted-bool strings 2026-04-30 20:37:37 -07:00
test_zombie_process_cleanup.py
…