From 8102a88537769bffd85e1522a69c9bcd34994967 Mon Sep 17 00:00:00 2001 From: T3782834 Date: Tue, 22 Sep 2026 21:27:41 -0300 Subject: [PATCH] bugfix: handoff --- ...EFORE_TERMINAL_WORKFLOW_RESUME_20260922.md | 65 +++++++++++ .../routing/enterprise_router.py | 106 ++++++++++++++++++ .../__pycache__/__init__.cpython-313.pyc | Bin 389 -> 389 bytes .../__pycache__/idempotency.cpython-313.pyc | Bin 8890 -> 8890 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 191 -> 191 bytes .../cache/__pycache__/cache.cpython-313.pyc | Bin 16501 -> 16501 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 192 -> 192 bytes .../__pycache__/settings.cpython-313.pyc | Bin 13926 -> 13926 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 293 -> 284 bytes .../mcp_gateway_client.cpython-313.pyc | Bin 3319 -> 3310 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 1488 -> 1479 bytes .../__pycache__/base.cpython-313.pyc | Bin 1362 -> 1353 bytes .../__pycache__/config_loader.cpython-313.pyc | Bin 9147 -> 9138 bytes .../__pycache__/custom_rails.cpython-313.pyc | Bin 4391 -> 4382 bytes .../framework_llm_client.cpython-313.pyc | Bin 19660 -> 19651 bytes .../__pycache__/llm_rails.cpython-313.pyc | Bin 5874 -> 5910 bytes .../output_supervisor.cpython-313.pyc | Bin 24293 -> 24284 bytes .../parallel_executor.cpython-313.pyc | Bin 21849 -> 21840 bytes .../__pycache__/pipeline.cpython-313.pyc | Bin 10876 -> 10867 bytes .../__pycache__/rail_action.cpython-313.pyc | Bin 641 -> 632 bytes .../__pycache__/rail_decision.cpython-313.pyc | Bin 1592 -> 1583 bytes .../__pycache__/rail_result.cpython-313.pyc | Bin 991 -> 982 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 2981 -> 2972 bytes .../__pycache__/_compat.cpython-313.pyc | Bin 2432 -> 2423 bytes .../contestation_validation.cpython-313.pyc | Bin 2164 -> 2155 bytes .../__pycache__/contracts.cpython-313.pyc | Bin 6888 -> 6879 bytes .../__pycache__/input_size.cpython-313.pyc | Bin 3636 -> 3627 bytes .../__pycache__/llm_adapter.cpython-313.pyc | Bin 3786 -> 3777 bytes .../__pycache__/llm_client.cpython-313.pyc | Bin 7441 -> 7432 bytes .../__pycache__/llm_rails.cpython-313.pyc | Bin 8881 -> 8872 bytes .../output_sanitization.cpython-313.pyc | Bin 13897 -> 13888 bytes .../__pycache__/pipeline.cpython-313.pyc | Bin 12648 -> 12639 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 460 -> 451 bytes .../__pycache__/_context.cpython-313.pyc | Bin 5858 -> 5849 bytes .../ausencia_oferta_proativa.cpython-313.pyc | Bin 12192 -> 12183 bytes .../__pycache__/coerencia.cpython-313.pyc | Bin 4144 -> 4135 bytes .../__pycache__/dlex_in.cpython-313.pyc | Bin 1291 -> 1282 bytes .../__pycache__/dlex_out.cpython-313.pyc | Bin 1802 -> 1793 bytes .../__pycache__/fallback.cpython-313.pyc | Bin 17639 -> 17630 bytes .../__pycache__/fraseologia.cpython-313.pyc | Bin 7620 -> 7611 bytes .../__pycache__/out_of_scope.cpython-313.pyc | Bin 17480 -> 17471 bytes .../prompts/__pycache__/pinj.cpython-313.pyc | Bin 8411 -> 8402 bytes .../__pycache__/ragsec.cpython-313.pyc | Bin 1107 -> 1098 bytes .../__pycache__/revprec.cpython-313.pyc | Bin 3137 -> 3128 bytes .../prompts/__pycache__/tox.cpython-313.pyc | Bin 631 -> 622 bytes .../toxicidade_output.cpython-313.pyc | Bin 915 -> 906 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 1650 -> 1641 bytes .../rails/__pycache__/alcada.cpython-313.pyc | Bin 4986 -> 4977 bytes .../rails/__pycache__/anatel.cpython-313.pyc | Bin 9135 -> 9126 bytes .../__pycache__/confirmation.cpython-313.pyc | Bin 11029 -> 11020 bytes .../rails/__pycache__/dlex_in.cpython-313.pyc | Bin 3266 -> 3257 bytes .../__pycache__/dlex_out.cpython-313.pyc | Bin 3318 -> 3309 bytes .../rails/__pycache__/ragsec.cpython-313.pyc | Bin 5449 -> 5440 bytes .../rails/__pycache__/revprec.cpython-313.pyc | Bin 5457 -> 5448 bytes .../rails/__pycache__/tox.cpython-313.pyc | Bin 8280 -> 8271 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 520 -> 511 bytes .../rules/__pycache__/alcada.cpython-313.pyc | Bin 1868 -> 1859 bytes .../__pycache__/pinj_patterns.cpython-313.pyc | Bin 3717 -> 3708 bytes .../__pycache__/tox_blocklist.cpython-313.pyc | Bin 1493 -> 1484 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 395 -> 386 bytes .../__pycache__/mcp_mapper.cpython-313.pyc | Bin 4679 -> 4670 bytes .../__pycache__/models.cpython-313.pyc | Bin 3131 -> 3122 bytes .../__pycache__/resolver.cpython-313.pyc | Bin 4700 -> 4691 bytes .../llm/__pycache__/__init__.cpython-313.pyc | Bin 454 -> 454 bytes .../llm/__pycache__/base.cpython-313.pyc | Bin 1601 -> 1601 bytes .../structured_output.cpython-313.pyc | Bin 7437 -> 7437 bytes .../llm/__pycache__/types.cpython-313.pyc | Bin 1252 -> 1252 bytes .../mcp/__pycache__/__init__.cpython-313.pyc | Bin 460 -> 451 bytes .../mcp/__pycache__/client.cpython-313.pyc | Bin 18413 -> 18404 bytes .../mcp/__pycache__/models.cpython-313.pyc | Bin 2123 -> 2114 bytes .../mcp/__pycache__/registry.cpython-313.pyc | Bin 4727 -> 4718 bytes .../__pycache__/tool_policy.cpython-313.pyc | Bin 5672 -> 5663 bytes .../__pycache__/tool_router.cpython-313.pyc | Bin 14176 -> 14167 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 1113 -> 1113 bytes .../message_history.cpython-313.pyc | Bin 8337 -> 8337 bytes .../summary_memory.cpython-313.pyc | Bin 12462 -> 12498 bytes .../__pycache__/summary_store.cpython-313.pyc | Bin 9498 -> 9498 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 192 -> 192 bytes .../__pycache__/session.cpython-313.pyc | Bin 2686 -> 2686 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 1381 -> 1372 bytes .../__pycache__/code_mapper.cpython-313.pyc | Bin 21434 -> 21425 bytes .../__pycache__/context.cpython-313.pyc | Bin 7373 -> 7364 bytes .../__pycache__/event_bus.cpython-313.pyc | Bin 3619 -> 3610 bytes .../guardrail_events.cpython-313.pyc | Bin 2037 -> 2028 bytes .../__pycache__/ic_events.cpython-313.pyc | Bin 612 -> 603 bytes .../__pycache__/judge_events.cpython-313.pyc | Bin 1397 -> 1388 bytes .../langgraph_telemetry.cpython-313.pyc | Bin 4950 -> 4941 bytes .../__pycache__/llm_advisors.cpython-313.pyc | Bin 2924 -> 2915 bytes .../__pycache__/noc_contract.cpython-313.pyc | Bin 5061 -> 5052 bytes .../__pycache__/otel.cpython-313.pyc | Bin 3398 -> 3389 bytes .../streaming_events.cpython-313.pyc | Bin 1821 -> 1812 bytes .../__pycache__/telemetry.cpython-313.pyc | Bin 52414 -> 52405 bytes .../__pycache__/token_cost.cpython-313.pyc | Bin 8677 -> 8668 bytes .../workflow_events.cpython-313.pyc | Bin 3316 -> 3307 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 197 -> 197 bytes .../__pycache__/sqlite_store.cpython-313.pyc | Bin 14996 -> 14996 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 634 -> 625 bytes .../__pycache__/config_loader.cpython-313.pyc | Bin 2676 -> 2667 bytes .../__pycache__/continuity.cpython-313.pyc | Bin 15920 -> 15911 bytes .../enterprise_router.cpython-313.pyc | Bin 82129 -> 87602 bytes .../__pycache__/models.cpython-313.pyc | Bin 2433 -> 2424 bytes .../__pycache__/multi_intent.cpython-313.pyc | Bin 20253 -> 20244 bytes .../pending_topics.cpython-313.pyc | Bin 16119 -> 16110 bytes .../routing/enterprise_router.py | 106 ++++++++++++++++++ .../__pycache__/__init__.cpython-313.pyc | Bin 326 -> 326 bytes .../__pycache__/agent_runtime.cpython-313.pyc | Bin 211730 -> 211766 bytes .../transaction_parameters.cpython-313.pyc | Bin 19561 -> 19561 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 856 -> 856 bytes .../__pycache__/graph.cpython-313.pyc | Bin 1393 -> 1393 bytes .../input_contract.cpython-313.pyc | Bin 8768 -> 8768 bytes .../__pycache__/models.cpython-313.pyc | Bin 7647 -> 7647 bytes .../__pycache__/registry.cpython-313.pyc | Bin 2339 -> 2339 bytes .../__pycache__/repository.cpython-313.pyc | Bin 2692 -> 2692 bytes .../__pycache__/runtime.cpython-313.pyc | Bin 36130 -> 36130 bytes .../__pycache__/tool_executor.cpython-313.pyc | Bin 1944 -> 1944 bytes .../conftest.cpython-313-pytest-9.0.2.pyc | Bin 785 -> 785 bytes ...on_parameters.cpython-313-pytest-9.0.2.pyc | Bin 43623 -> 43602 bytes ...ce_delegation.cpython-313-pytest-9.0.2.pyc | Bin 14947 -> 14932 bytes ...ic_classifier.cpython-313-pytest-9.0.2.pyc | Bin 39387 -> 47326 bytes ...me_precedence.cpython-313-pytest-9.0.2.pyc | Bin 67366 -> 67355 bytes ...te_rules_8_16.cpython-313-pytest-9.0.2.pyc | Bin 0 -> 14554 bytes ..._interruption.cpython-313-pytest-9.0.2.pyc | Bin 28284 -> 28268 bytes ...test_expected_input_semantic_classifier.py | 78 +++++++++++++ 123 files changed, 355 insertions(+) create mode 100644 agent_framework_oci/docs/FIX_CONTEXTUAL_REENTRY_BEFORE_TERMINAL_WORKFLOW_RESUME_20260922.md create mode 100644 agent_framework_oci/tests/__pycache__/test_reconciliation_state_rules_8_16.cpython-313-pytest-9.0.2.pyc diff --git a/agent_framework_oci/docs/FIX_CONTEXTUAL_REENTRY_BEFORE_TERMINAL_WORKFLOW_RESUME_20260922.md b/agent_framework_oci/docs/FIX_CONTEXTUAL_REENTRY_BEFORE_TERMINAL_WORKFLOW_RESUME_20260922.md new file mode 100644 index 00000000..0cdbfe93 --- /dev/null +++ b/agent_framework_oci/docs/FIX_CONTEXTUAL_REENTRY_BEFORE_TERMINAL_WORKFLOW_RESUME_20260922.md @@ -0,0 +1,65 @@ +# Fix: contextual reentry before terminal workflow resume + +## Problem + +A paused workflow with a declarative `expected_input.semantic_classifier` could receive a +compound reply such as: + +```text +ainda nao. Eu nao contratei esse neymar jr +``` + +If the classifier returned only `NAO`, the framework immediately resumed the paused workflow. +A backend workflow was then free to enter a terminal branch (for example human handoff) before +the substantive remainder of the same user turn was reinterpreted by normal routing. + +This is an orchestration problem in the framework, not a domain rule for billing and not a +frontend problem. + +## Corrected precedence + +Literal `expected_input` matches keep absolute precedence and are unchanged. For non-literal +semantic matches, when the workflow itself declares an option with +`option_actions.