emma-hermes/tests/agent
fesalfayed 64628ea89b fix(anthropic): demote dead thinking signature when orphan-strip mutates the latest turn
Extended-thinking Claude models (4.6+, e.g. Opus 4.8) emit a signed `thinking`
block on assistant turns that also carry parallel `tool_use` blocks. Anthropic
signs that block against the full, original turn content.

When a parallel tool batch is interrupted before every `tool_result` returns,
`_strip_orphaned_tool_blocks` removes the unanswered `tool_use` on replay — which
mutates the turn. The latest-assistant branch of `_manage_thinking_signatures`
then replays the now-stale signed thinking block verbatim, and Anthropic rejects
the request with a non-retryable HTTP 400:

    messages.N.content.M: `thinking` or `redacted_thinking` blocks in the latest
    assistant message cannot be modified. These blocks must remain as they were
    in the original response.

Because the poisoned turn is rebuilt from the persisted store every turn, the
gateway crash-loops with no self-recovery (a soft session reset does not clear
it). The drifting content index in the error is the changing count of stripped
`tool_use` blocks across rebuilds.

Fix: when orphan-stripping removes a `tool_use` from a turn that also holds a
thinking/redacted_thinking block, flag the turn. `_manage_thinking_signatures`
then demotes every thinking block on that latest turn to a plain text block
(preserving the reasoning text) instead of replaying a signature that can no
longer validate. An intact turn is unaffected — its signed thinking is still
replayed verbatim. The internal flag is stripped before the payload is sent.

Adds two regression tests:
- demotion when an orphaned parallel tool_use is stripped
- control: signed thinking preserved verbatim when nothing is stripped
2026-05-31 06:14:34 -07:00
..
lsp fix(lsp): detect Windows wrapper binaries in installer probes 2026-05-30 02:08:36 -07:00
transports chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
__init__.py
test_anthropic_adapter.py fix(anthropic): demote dead thinking signature when orphan-strip mutates the latest turn 2026-05-31 06:14:34 -07:00
test_anthropic_keychain.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
test_anthropic_mcp_prefix_strip.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
test_anthropic_oauth_pkce.py fix(auth): don't launch a text-mode browser inside the terminal for OAuth (#34479) 2026-05-29 01:23:06 -07:00
test_arcee_trinity_overrides.py
test_async_utils.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
test_auxiliary_client.py fix(auxiliary): stop capping output with max_tokens by default (#34530) (#34845) 2026-05-29 17:24:30 -07:00
test_auxiliary_client_anthropic_custom.py
test_auxiliary_client_azure_foundry.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
test_auxiliary_client_xai_oauth_recovery.py fix(auxiliary): detect xAI OAuth 403 bad-credentials as auth error 2026-05-29 00:28:02 -07:00
test_auxiliary_config_bridge.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
test_auxiliary_main_first.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
test_auxiliary_named_custom_providers.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
test_auxiliary_transport_autodetect.py
test_azure_identity_adapter.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
test_bedrock_1m_context.py feat(azure-foundry): add Microsoft Entra ID auth 2026-05-18 10:14:38 -07:00
test_bedrock_adapter.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
test_bedrock_integration.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
test_codex_cloudflare_headers.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
test_codex_responses_adapter.py feat(prompt): universal task-completion guidance + local Python toolchain probe (#34340) 2026-05-28 22:26:09 -07:00
test_codex_ttfb_watchdog.py fix(codex): relax no-byte TTFB watchdog default from 12s to 120s 2026-05-29 02:02:25 -07:00
test_compress_focus.py
test_compression_concurrent_fork.py fix(compression): fail open when lock subsystem is missing (version skew) (#34475) 2026-05-29 01:32:32 -07:00
test_compressor_historical_media.py Port from Kilo-Org/kilocode#9434: strip historical media after compression (#27189) 2026-05-16 17:18:25 -07:00
test_compressor_image_tokens.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
test_context_compressor.py fix(compression): avoid repeat preflight compaction from rough estimates 2026-05-29 19:05:03 -07:00
test_context_compressor_summary_continuity.py test: cover ci-unblocker production regressions 2026-05-27 22:14:53 -07:00
test_context_engine.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
test_context_engine_host_contract.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
test_context_references.py
test_copilot_acp_client.py
test_copilot_acp_deprecation.py fix(copilot-acp): tighten deprecation detection + sharpen GitHub Models 413 hint 2026-05-16 02:24:48 -07:00
test_credential_pool.py fix(auth): address Nous JWT fallback review 2026-05-29 02:24:48 -07:00
test_credential_pool_routing.py
test_crossloop_client_cache.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
test_curator.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
test_curator_activity.py
test_curator_backup.py
test_curator_classification.py feat(curator): hint at `hermes curator pin` in the rename block (#23212) 2026-05-10 06:44:53 -07:00
test_curator_reports.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
test_custom_provider_extra_body.py fix(custom): pass custom provider extra body 2026-05-21 07:48:53 -07:00
test_deepseek_anthropic_thinking.py chore: ruff auto-fix PLR6201 resweep — tuple → set in membership tests (#27355) 2026-05-17 02:29:41 -07:00
test_direct_provider_url_detection.py
test_display.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
test_display_emoji.py
test_display_todo_progress.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
test_display_tool_failure.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
test_error_classifier.py fix(agent): fallback immediately on provider content-policy blocks (#33883) 2026-05-28 07:28:24 -07:00
test_external_skills.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
test_external_skills_dirs_cache.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
test_file_safety.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
test_file_safety_credentials.py fix(security): block read_file on project-local .env files 2026-05-25 03:40:47 -07:00
test_file_safety_cross_profile.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
test_gemini_cloudcode.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
test_gemini_fast_fallback.py fix: wrap _pool_may_recover_from_rate_limit call through run_agent namespace 2026-05-18 20:04:57 -07:00
test_gemini_free_tier_gate.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
test_gemini_native_adapter.py
test_gemini_schema.py
test_i18n.py feat(i18n): localize all gateway commands + web dashboard, add 8 new locales (16 total) (#22914) 2026-05-10 07:14:14 -07:00
test_image_gen_registry.py
test_image_routing.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
test_insights.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
test_jiter_preload.py fix(agent): preload jiter native parser 2026-05-28 00:20:11 -07:00
test_kimi_coding_anthropic_thinking.py
test_last_total_tokens.py fix(compressor): ABC compliance — total_tokens, api_mode, logger consistency 2026-05-23 17:38:19 -07:00
test_local_stream_timeout.py
test_markdown_tables.py fix(cli): vertical fallback for markdown tables wider than terminal (#23948) 2026-05-11 16:49:13 -07:00
test_memory_provider.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
test_memory_session_switch.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
test_memory_user_id.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
test_minimax_auxiliary_url.py
test_minimax_provider.py
test_model_metadata.py test: remove low-value model-catalog mirror tests 2026-05-29 23:45:05 -07:00
test_model_metadata_local_ctx.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
test_model_metadata_ssl.py
test_models_dev.py test: remove low-value model-catalog mirror tests 2026-05-29 23:45:05 -07:00
test_moonshot_schema.py fix(moonshot): strip $ref siblings and collapse tuple items in tool schemas (#27104) 2026-05-16 13:02:19 -07:00
test_non_stream_stale_timeout.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
test_nous_oauth_401_guidance.py feat(errors): actionable guidance for Nous OAuth 401s (#32082) 2026-05-25 06:06:51 -07:00
test_nous_rate_guard.py
test_onboarding.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
test_openrouter_response_cache.py
test_plugin_llm.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
test_portal_tags.py feat(nous): unified client=hermes-client-v<version> tag on every Portal request (#24779) 2026-05-12 20:49:20 -07:00
test_prompt_builder.py feat(video_gen): wire Nous subscription override into hermes tools UX 2026-05-29 22:26:24 +05:30
test_prompt_caching.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
test_proxy_and_url_validation.py
test_rate_limit_tracker.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
test_redact.py test(redact): assert Discord mentions pass through unchanged 2026-05-30 20:48:41 -07:00
test_resume_stale_active_task.py fix(compressor): strip stale handoff prefix on resume; reconcile #26290+#32787 (#35344) 2026-05-30 07:29:21 -07:00
test_save_url_image.py fix(image_gen): cache xAI ephemeral URL responses to disk (#26942) (#31759) 2026-05-24 18:10:47 -07:00
test_set_runtime_main_custom_provider.py test(auxiliary): e2e routing assertions for custom-provider aux resolution 2026-05-30 02:38:59 -07:00
test_shell_hooks.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
test_shell_hooks_consent.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
test_skill_bundles.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
test_skill_commands.py test: use subprocesses for each test file (#29016) 2026-05-21 16:40:04 +05:30
test_skill_commands_reload.py
test_skill_utils.py fix(skills): load Linux-tagged skills on Termux (android sys.platform) 2026-05-21 19:08:38 -07:00
test_streaming_context_scrubber.py 🐛 fix(memory): require newline after context tag 2026-05-18 10:53:08 -07:00
test_subagent_progress.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
test_subagent_stop_hook.py
test_subdirectory_hints.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
test_summary_prefix_semantics.py fix(compression): drop conflicting 'resume Active Task' directive in summary prefix 2026-05-30 07:29:21 -07:00
test_system_prompt_restore.py perf(prompt-cache): date-only timestamp + loud gateway-DB roundtrip logging 2026-05-17 23:20:37 -07:00
test_think_scrubber.py
test_title_generator.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
test_tool_dispatch_helpers.py feat(security): promptware defense — shared threat patterns + memory load-time scan + tool-result delimiters (#32269) 2026-05-25 14:52:24 -07:00
test_tool_guardrails.py fix: add recovery hints to loop guard warnings 2026-05-19 00:12:12 -07:00
test_tool_result_classification.py fix: classify landed file mutations with diagnostics 2026-05-13 06:46:23 -07:00
test_transcription_registry.py feat(stt): add register_transcription_provider() plugin hook 2026-05-25 01:41:19 -07:00
test_tts_registry.py feat(tts): add register_tts_provider() plugin hook (closes #30398) 2026-05-24 18:04:54 -07:00
test_unsupported_parameter_retry.py
test_unsupported_temperature_retry.py fix(auxiliary): stop capping output with max_tokens by default (#34530) (#34845) 2026-05-29 17:24:30 -07:00
test_usage_pricing.py remove Vercel AI Gateway and Vercel Sandbox (#33067) 2026-05-27 00:43:32 -07:00
test_video_gen_registry.py feat(video_gen): unified video_generate tool with pluggable provider backends (#25126) 2026-05-13 16:39:41 -07:00
test_vision_resolved_args.py
test_vision_routing_31179.py fix(vision): route auxiliary.vision.provider=openai to api.openai.com, skip text-only main (#31452) 2026-05-24 15:01:28 -07:00