hyf

Context-aware query service for Radroots
git clone https://radroots.dev/git/hyf.git
Log | Files | Refs | README | LICENSE

commit b735c5353090c32b337d309f9eade01a8a44c630
parent 627b4424acceba823637eb92c1fd533c89225f9a
Author: triesap <tyson@radroots.org>
Date:   Thu, 18 Jun 2026 20:11:50 -0700

test: define fallback reason taxonomy

Diffstat:
Mtests/test_stdio_contract.mojo | 94+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 94 insertions(+), 0 deletions(-)

diff --git a/tests/test_stdio_contract.mojo b/tests/test_stdio_contract.mojo @@ -54,6 +54,10 @@ def _assert_provider_runtime_fallback_meta( response["meta"]["fallback_reason"].string_value(), expected_reason, ) + assert_true( + _business_fallback_reason_family(expected_reason) != "undeclared" + ) + assert_true(expected_reason != "non_2xx") def _assert_no_top_level_fallback_meta(response: Value) raises: @@ -61,6 +65,45 @@ def _assert_no_top_level_fallback_meta(response: Value) raises: assert_true(not _has_key(response["meta"], "fallback_reason")) +def _business_fallback_reason_family(reason: String) -> String: + if reason == "timeout": + return "provider_io" + if reason == "connection_failed": + return "provider_io" + if reason == "invalid_url": + return "provider_io" + if reason == "provider_non_2xx": + return "provider_io" + if reason == "provider_error_payload": + return "provider_io" + if reason == "provider_invalid_json": + return "provider_io" + if reason == "provider_schema_invalid": + return "provider_io" + if reason == "provider_empty_choices": + return "provider_io" + if reason == "provider_missing_content": + return "provider_io" + if reason == "provider_error": + return "provider_io" + if reason == "invalid_config": + return "runtime_config" + if reason == "disabled_by_runtime_config": + return "runtime_config" + if reason == "provider_unconfigured": + return "runtime_config" + if reason == "unsupported_capability": + return "capability_routing" + return "undeclared" + + +def _assert_declared_business_fallback_reason( + reason: String, expected_family: String +) raises: + assert_equal(_business_fallback_reason_family(reason), expected_family) + assert_true(reason != "non_2xx") + + def _max_local_runtime_config_toml_with_urls( base_url: String, health_url: String, request_timeout_ms: Int ) -> String: @@ -326,6 +369,57 @@ def _assert_invalid_runtime_config_load_error( ) +def test_business_fallback_reason_taxonomy_declares_provider_io_family() raises: + _assert_declared_business_fallback_reason("timeout", "provider_io") + _assert_declared_business_fallback_reason( + "connection_failed", "provider_io" + ) + _assert_declared_business_fallback_reason("invalid_url", "provider_io") + _assert_declared_business_fallback_reason( + "provider_non_2xx", "provider_io" + ) + _assert_declared_business_fallback_reason( + "provider_error_payload", "provider_io" + ) + _assert_declared_business_fallback_reason( + "provider_invalid_json", "provider_io" + ) + _assert_declared_business_fallback_reason( + "provider_schema_invalid", "provider_io" + ) + _assert_declared_business_fallback_reason( + "provider_empty_choices", "provider_io" + ) + _assert_declared_business_fallback_reason( + "provider_missing_content", "provider_io" + ) + _assert_declared_business_fallback_reason( + "provider_error", "provider_io" + ) + + +def test_business_fallback_reason_taxonomy_declares_runtime_family() raises: + _assert_declared_business_fallback_reason( + "invalid_config", "runtime_config" + ) + _assert_declared_business_fallback_reason( + "disabled_by_runtime_config", "runtime_config" + ) + _assert_declared_business_fallback_reason( + "provider_unconfigured", "runtime_config" + ) + + +def test_business_fallback_reason_taxonomy_declares_capability_family() raises: + _assert_declared_business_fallback_reason( + "unsupported_capability", "capability_routing" + ) + + +def test_business_fallback_reason_taxonomy_excludes_control_health_reason() raises: + assert_equal(_business_fallback_reason_family("non_2xx"), "undeclared") + + def test_status_success() raises: var response = run_hyf_stdio( load_scenario_request_json("scenarios/status_ok.json")