hyf

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

commit 9cb37af4ec8e8b01340d28ed7b99dc2c3a08f5ef
parent 46cf5906392d873058f27416b72dacfc0b03639c
Author: triesap <tyson@radroots.org>
Date:   Sun, 12 Apr 2026 01:25:11 +0000

assist: route query_rewrite through fake bridge

Diffstat:
Msrc/hyf_assist/bridge.mojo | 67+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
Msrc/hyf_assist/contract.mojo | 16++++++++++++++++
Msrc/hyf_core/backends/selector.mojo | 18++++++++++++++++++
Msrc/hyf_core/capabilities/query_analysis.mojo | 14+++++++++++++-
Msrc/hyf_core/capabilities/query_rewrite.mojo | 122+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
Msrc/hyf_core/capabilities/registry.mojo | 19+++++++++++++++++++
Msrc/hyf_core/metadata.mojo | 2+-
Msrc/hyf_core/provenance.mojo | 12++++++++++++
Msrc/hyf_stdio/control/status.mojo | 16++++++++--------
Msrc/hyf_stdio/meta.mojo | 14++++++++++++++
Msrc/hyf_stdio/server.mojo | 25++++++++++++++++++-------
Mtests/fixtures/v1/scenarios/assisted_backend_unavailable.json | 21+++++++++++++++++----
Mtests/fixtures/v1/scenarios/status_ok.json | 2+-
Mtests/test_hyf.mojo | 2+-
Mtests/test_stdio_contract.mojo | 193+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
15 files changed, 515 insertions(+), 28 deletions(-)

diff --git a/src/hyf_assist/bridge.mojo b/src/hyf_assist/bridge.mojo @@ -1,8 +1,17 @@ from mojson import Value, loads +from hyf_core.capabilities.query_analysis import ( + ExtractedFilters, + QueryAnalysis, + analyze_query_text, + copy_string_list, +) +from hyf_core.request_context import RequestContext from hyf_assist.contract import ( + AssistQueryRewriteResult, AssistBridgeStatus, assist_bridge_contract_version, + assist_bridge_fake_endpoint_prefix, assist_bridge_runtime_id, assist_bridge_supported_business_capabilities, ) @@ -13,13 +22,25 @@ from hyf_runtime.config import ( ) +def _fake_bridge_endpoint_is_reachable(endpoint: String) -> Bool: + var trimmed = String(endpoint).strip() + return trimmed.startswith(assist_bridge_fake_endpoint_prefix()) + + def resolve_assist_bridge_status( config: HyfLoadedRuntimeConfig, ) -> AssistBridgeStatus: var configured = assist_bridge_configured(config) var state = "disabled_by_runtime_config" + var reachable = False if assisted_execution_enabled(config): - state = "unavailable" if configured else "unconfigured" + if configured: + reachable = _fake_bridge_endpoint_is_reachable( + config.effective.assist.endpoint + ) + state = "ready" if reachable else "unavailable" + else: + state = "unconfigured" return AssistBridgeStatus( id=assist_bridge_runtime_id(), @@ -29,7 +50,7 @@ def resolve_assist_bridge_status( endpoint=String(config.effective.assist.endpoint), backend_kind="fake", configured=configured, - reachable=False, + reachable=reachable, state=state, fallback_contract="deterministic_baseline_preserved", supported_business_capabilities=assist_bridge_supported_business_capabilities(), @@ -86,3 +107,45 @@ def serialize_assist_bridge_status_value( capabilities.append(Value(String(capability))) value.set("supported_business_capabilities", capabilities) return value^ + + +def execute_query_rewrite_via_assist_bridge( + bridge_status: AssistBridgeStatus, + text: String, + context: RequestContext, +) raises -> AssistQueryRewriteResult: + if not bridge_status.reachable: + raise Error( + "assist bridge '" + String(bridge_status.id) + "' is unavailable" + ) + + var analysis = analyze_query_text(text, context) + var normalization_signals = copy_string_list( + analysis.normalization_signals + ) + normalization_signals.append("assist_bridge_fake") + var ranking_hints = copy_string_list(analysis.ranking_hints) + ranking_hints.append("assist_bridge_route") + + return AssistQueryRewriteResult( + analysis=QueryAnalysis( + original_text=String(analysis.original_text), + normalized_text=String(analysis.normalized_text), + rewritten_text=String(analysis.rewritten_text), + query_terms=copy_string_list(analysis.query_terms), + normalization_signals=normalization_signals^, + ranking_hints=ranking_hints^, + extracted_filters=ExtractedFilters( + local_intent=analysis.extracted_filters.local_intent, + fulfillment=String( + analysis.extracted_filters.fulfillment + ), + time_window=String(analysis.extracted_filters.time_window), + ), + ), + provider="fake", + route="assist_bridge.query_rewrite.fake", + model="fake_query_rewrite_v1", + latency_ms=1, + schema_version=1, + ) diff --git a/src/hyf_assist/contract.mojo b/src/hyf_assist/contract.mojo @@ -1,5 +1,7 @@ from std.collections import List +from hyf_core.capabilities.query_analysis import QueryAnalysis + def assist_bridge_contract_version() -> Int: return 1 @@ -15,6 +17,10 @@ def assist_bridge_supported_business_capabilities() -> List[String]: return capabilities^ +def assist_bridge_fake_endpoint_prefix() -> String: + return "hyf-assistd://fake" + + @fieldwise_init struct AssistBridgeStatus(Copyable, Movable): var id: String @@ -28,3 +34,13 @@ struct AssistBridgeStatus(Copyable, Movable): var state: String var fallback_contract: String var supported_business_capabilities: List[String] + + +@fieldwise_init +struct AssistQueryRewriteResult(Copyable, Movable): + var analysis: QueryAnalysis + var provider: String + var route: String + var model: String + var latency_ms: Int + var schema_version: Int diff --git a/src/hyf_core/backends/selector.mojo b/src/hyf_core/backends/selector.mojo @@ -4,6 +4,9 @@ from hyf_core.backends.heuristic_backend import ( backend_name as heuristic_backend_name, execute_capability as execute_heuristic_capability, ) +from hyf_core.capabilities.registry import ( + execute_registered_business_capability_with_runtime_config, +) from hyf_core.errors import ( CapabilityResult, backend_unavailable_error, @@ -13,6 +16,7 @@ from hyf_core.request_context import ( RequestContext, assisted_execution_requested, ) +from hyf_runtime.config import HyfLoadedRuntimeConfig @fieldwise_init @@ -45,3 +49,17 @@ def execute_capability( return execute_heuristic_capability(capability_id, input, context) return failed_capability(backend_unavailable_error(selection.backend_name)) + + +def execute_capability_with_runtime_config( + capability_id: String, + input: Value, + context: RequestContext, + runtime_config: HyfLoadedRuntimeConfig, +) raises -> CapabilityResult: + if assisted_execution_requested(context) and capability_id != "query_rewrite": + return failed_capability(backend_unavailable_error("assisted_execution")) + + return execute_registered_business_capability_with_runtime_config( + capability_id, input, context, runtime_config + ) diff --git a/src/hyf_core/capabilities/query_analysis.mojo b/src/hyf_core/capabilities/query_analysis.mojo @@ -1,4 +1,4 @@ -from std.collections import List +from std.collections import List, Optional from mojson import Value, loads @@ -357,6 +357,12 @@ def build_deterministic_meta( return CoreResponseMeta( execution_mode="deterministic", backend="heuristic", + provider=None, + route=None, + model=None, + latency_ms=None, + schema_version=Optional[Int](1), + prompt_version=None, provenance=ExecutionProvenance( kind="deterministic", signal_tags=copy_string_list(signal_tags), @@ -369,5 +375,11 @@ def build_deterministic_meta( return CoreResponseMeta( execution_mode="deterministic", backend="heuristic", + provider=None, + route=None, + model=None, + latency_ms=None, + schema_version=Optional[Int](1), + prompt_version=None, provenance=None, ) diff --git a/src/hyf_core/capabilities/query_rewrite.mojo b/src/hyf_core/capabilities/query_rewrite.mojo @@ -1,7 +1,12 @@ -from std.collections import List +from std.collections import List, Optional from mojson import Value, loads +from hyf_assist.bridge import ( + execute_query_rewrite_via_assist_bridge, + resolve_assist_bridge_status, +) +from hyf_assist.contract import AssistQueryRewriteResult from hyf_core.capabilities.query_analysis import ( QueryAnalysis, QueryRewriteRequest, @@ -18,8 +23,14 @@ from hyf_core.errors import ( invalid_input_error, successful_capability, ) -from hyf_core.provenance import ProvenanceSourceRef -from hyf_core.request_context import RequestContext +from hyf_core.provenance import ( + CoreResponseMeta, + ExecutionProvenance, + ProvenanceFallback, + ProvenanceSourceRef, +) +from hyf_core.request_context import RequestContext, assisted_execution_requested +from hyf_runtime.config import HyfLoadedRuntimeConfig def _build_output(analysis: QueryAnalysis) raises -> Value: @@ -40,6 +51,80 @@ def _build_output(analysis: QueryAnalysis) raises -> Value: return output^ +def _base_source_refs( + context: RequestContext, capability_name: String +) -> List[ProvenanceSourceRef]: + var source_refs = List[ProvenanceSourceRef]() + source_refs.append( + ProvenanceSourceRef( + source_kind="local_input", + source_ref=capability_name + ":input", + ) + ) + if context.scope: + source_refs.append( + ProvenanceSourceRef( + source_kind="request_scope", + source_ref="request_context.scope", + ) + ) + return source_refs^ + + +def _build_assisted_meta( + context: RequestContext, result: AssistQueryRewriteResult +) -> CoreResponseMeta: + var provenance: Optional[ExecutionProvenance] = None + if context.return_provenance: + provenance = ExecutionProvenance( + kind="assisted", + signal_tags=query_signal_tags(result.analysis), + source_refs=_base_source_refs(context, "query_rewrite"), + fallback=None, + evidence_set_id=None, + ) + + return CoreResponseMeta( + execution_mode="assisted", + backend="assist_bridge", + provider=Optional[String](String(result.provider)), + route=Optional[String](String(result.route)), + model=Optional[String](String(result.model)), + latency_ms=Optional[Int](result.latency_ms), + schema_version=Optional[Int](result.schema_version), + prompt_version=None, + provenance=provenance^, + ) + + +def _build_deterministic_fallback_meta( + context: RequestContext, analysis: QueryAnalysis, reason: String +) -> CoreResponseMeta: + var provenance: Optional[ExecutionProvenance] = None + if context.return_provenance: + provenance = ExecutionProvenance( + kind="deterministic", + signal_tags=query_signal_tags(analysis), + source_refs=_base_source_refs(context, "query_rewrite"), + fallback=ProvenanceFallback( + fallback_kind="assist_bridge", reason=String(reason) + ), + evidence_set_id=None, + ) + + return CoreResponseMeta( + execution_mode="deterministic", + backend="heuristic", + provider=None, + route=None, + model=None, + latency_ms=None, + schema_version=Optional[Int](1), + prompt_version=None, + provenance=provenance^, + ) + + def execute_query_rewrite( input: Value, context: RequestContext ) raises -> CapabilityResult: @@ -59,3 +144,34 @@ def execute_query_rewrite( ) except e: return failed_capability(invalid_input_error(String(e))) + + +def execute_query_rewrite_with_runtime_config( + input: Value, + context: RequestContext, + runtime_config: HyfLoadedRuntimeConfig, +) raises -> CapabilityResult: + try: + var request: QueryRewriteRequest = parse_query_rewrite_request(input) + if assisted_execution_requested(context): + var bridge_status = resolve_assist_bridge_status(runtime_config) + if bridge_status.reachable: + var assisted_result = execute_query_rewrite_via_assist_bridge( + bridge_status, request.text, context + ) + return successful_capability( + _build_output(assisted_result.analysis), + meta=_build_assisted_meta(context, assisted_result), + ) + + var fallback_analysis = analyze_query_text(request.text, context) + return successful_capability( + _build_output(fallback_analysis), + meta=_build_deterministic_fallback_meta( + context, fallback_analysis, bridge_status.state + ), + ) + + return execute_query_rewrite(input, context) + except e: + return failed_capability(invalid_input_error(String(e))) diff --git a/src/hyf_core/capabilities/registry.mojo b/src/hyf_core/capabilities/registry.mojo @@ -4,6 +4,9 @@ from mojson import Value from hyf_core.capabilities.explain_result import execute_explain_result from hyf_core.capabilities.query_rewrite import execute_query_rewrite +from hyf_core.capabilities.query_rewrite import ( + execute_query_rewrite_with_runtime_config, +) from hyf_core.capabilities.semantic_rank import execute_semantic_rank from hyf_core.errors import ( CapabilityResult, @@ -11,6 +14,7 @@ from hyf_core.errors import ( failed_capability, ) from hyf_core.request_context import RequestContext +from hyf_runtime.config import HyfLoadedRuntimeConfig @fieldwise_init @@ -193,3 +197,18 @@ def execute_registered_business_capability( ) return failed_capability(capability_not_implemented_error(capability_id)) + + +def execute_registered_business_capability_with_runtime_config( + capability_id: String, + input: Value, + context: RequestContext, + runtime_config: HyfLoadedRuntimeConfig, +) raises -> CapabilityResult: + if capability_id == "query_rewrite": + return execute_query_rewrite_with_runtime_config( + input, context, runtime_config + ) + return execute_registered_business_capability( + capability_id, input, context + ) diff --git a/src/hyf_core/metadata.mojo b/src/hyf_core/metadata.mojo @@ -41,5 +41,5 @@ def current_build_identity() raises -> HyfBuildIdentity: protocol_version=hyf_protocol_version(), default_execution_mode="deterministic", deterministic_execution_available=True, - assisted_execution_available=False, + assisted_execution_available=True, ) diff --git a/src/hyf_core/provenance.mojo b/src/hyf_core/provenance.mojo @@ -26,6 +26,12 @@ struct ExecutionProvenance(Copyable, Movable): struct CoreResponseMeta(Copyable, Movable): var execution_mode: String var backend: String + var provider: Optional[String] + var route: Optional[String] + var model: Optional[String] + var latency_ms: Optional[Int] + var schema_version: Optional[Int] + var prompt_version: Optional[String] var provenance: Optional[ExecutionProvenance] @@ -33,5 +39,11 @@ def deterministic_response_meta() -> CoreResponseMeta: return CoreResponseMeta( execution_mode="deterministic", backend="heuristic", + provider=None, + route=None, + model=None, + latency_ms=None, + schema_version=None, + prompt_version=None, provenance=None, ) diff --git a/src/hyf_stdio/control/status.mojo b/src/hyf_stdio/control/status.mojo @@ -89,15 +89,15 @@ def build_status_output_with_runtime_context( var execution_mode_request_behavior = loads("{}") execution_mode_request_behavior.set("deterministic", Value("execute")) + var assisted_request_behavior = "bridge_unavailable" + if assist_bridge.state == "ready": + assisted_request_behavior = "execute" + elif assist_bridge.state == "disabled_by_runtime_config": + assisted_request_behavior = "disabled_by_runtime_config" + elif assist_bridge.state == "unconfigured": + assisted_request_behavior = "bridge_unconfigured" execution_mode_request_behavior.set( - "assisted", - Value("disabled_by_runtime_config") - if assist_bridge.state == "disabled_by_runtime_config" - else ( - Value("bridge_unconfigured") - if assist_bridge.state == "unconfigured" - else Value("bridge_unavailable") - ), + "assisted", Value(String(assisted_request_behavior)) ) output.set( "execution_mode_request_behavior", diff --git a/src/hyf_stdio/meta.mojo b/src/hyf_stdio/meta.mojo @@ -50,6 +50,20 @@ def serialize_core_response_meta(meta: CoreResponseMeta) raises -> Value: var value = loads("{}") value.set("execution_mode", Value(String(meta.execution_mode))) value.set("backend", Value(String(meta.backend))) + if meta.provider: + value.set("provider", Value(String(meta.provider.value()))) + if meta.route: + value.set("route", Value(String(meta.route.value()))) + if meta.model: + value.set("model", Value(String(meta.model.value()))) + if meta.latency_ms: + value.set("latency_ms", Value(meta.latency_ms.value())) + if meta.schema_version: + value.set("schema_version", Value(meta.schema_version.value())) + if meta.prompt_version: + value.set( + "prompt_version", Value(String(meta.prompt_version.value())) + ) if meta.provenance: value.set("provenance", _serialize_provenance(meta.provenance.value())) return value^ diff --git a/src/hyf_stdio/server.mojo b/src/hyf_stdio/server.mojo @@ -13,7 +13,7 @@ from hyf_runtime.startup import ( resolve_startup_context_from_process, ) from hyf_core.backends.selector import ( - execute_capability as execute_backend_capability, + execute_capability_with_runtime_config as execute_backend_capability_with_runtime_config, ) from hyf_core.capabilities.registry import ( canonical_business_capability, @@ -177,16 +177,23 @@ def _dispatch_capability_result( def _dispatch_business_capability( - request: WireRequest, request_id: String + request: WireRequest, + request_id: String, + runtime_context: RuntimeStartupContext, ) raises -> String: - var result = execute_backend_capability( - request.capability, request.input.clone(), request.context.copy() + var result = execute_backend_capability_with_runtime_config( + request.capability, + request.input.clone(), + request.context.copy(), + runtime_context.config, ) return _dispatch_capability_result(request_id, request.trace_id, result) def _route_business_capability( - request: WireRequest, request_id: String + request: WireRequest, + request_id: String, + runtime_context: RuntimeStartupContext, ) raises -> String: var capability = canonical_business_capability(request.capability) if not capability: @@ -197,7 +204,9 @@ def _route_business_capability( return encode_error(_disabled_response(request)) if descriptor.implemented and descriptor.callable: - return _dispatch_business_capability(request, request_id) + return _dispatch_business_capability( + request, request_id, runtime_context + ) return encode_error(_unavailable_response(request)) @@ -246,7 +255,9 @@ def handle_request_with_runtime_context_and_control_builders[ meta=None, ) ) - return _route_business_capability(request.copy(), request_id) + return _route_business_capability( + request.copy(), request_id, runtime_context + ) except e: _emit_internal_diagnostic( request_id, diff --git a/tests/fixtures/v1/scenarios/assisted_backend_unavailable.json b/tests/fixtures/v1/scenarios/assisted_backend_unavailable.json @@ -2,7 +2,7 @@ "fixture_id": "assisted_backend_unavailable", "fixture_namespace": "radroots-canonical-hyf-v1", "schema_version": 1, - "description": "Explicit assisted execution requests fail with a bounded unavailable-backend error.", + "description": "Explicit assisted query rewrite requests fall back to deterministic execution when the assist bridge is unavailable.", "request": { "version": 1, "request_id": "assisted-fixture-1", @@ -15,8 +15,21 @@ } }, "expected": { - "ok": false, - "error_code": "backend_unavailable", - "message_contains": "assisted_execution" + "ok": true, + "equals": { + "version": 1, + "request_id": "assisted-fixture-1", + "output.rewritten_text": "apples", + "meta.execution_mode": "deterministic", + "meta.backend": "heuristic", + "meta.schema_version": 1 + }, + "absent_paths": [ + "error", + "meta.provider", + "meta.route", + "meta.model", + "meta.provenance" + ] } } diff --git a/tests/fixtures/v1/scenarios/status_ok.json b/tests/fixtures/v1/scenarios/status_ok.json @@ -24,7 +24,7 @@ "output.build_identity.protocol_version": 1, "output.build_identity.default_execution_mode": "deterministic", "output.build_identity.deterministic_execution_available": true, - "output.build_identity.assisted_execution_available": false, + "output.build_identity.assisted_execution_available": true, "output.daemon": "hyfd", "output.transport": "stdio", "output.request_framing": "newline_delimited_json", diff --git a/tests/test_hyf.mojo b/tests/test_hyf.mojo @@ -845,7 +845,7 @@ def test_missing_input_returns_invalid_request() raises: ) -def test_assisted_request_returns_backend_unavailable() raises: +def test_assisted_request_falls_back_deterministically_when_bridge_is_unavailable() raises: var result = _dispatch( load_scenario_request_json( "scenarios/assisted_backend_unavailable.json" diff --git a/tests/test_stdio_contract.mojo b/tests/test_stdio_contract.mojo @@ -32,6 +32,13 @@ def _has_key(value: Value, key: String) -> Bool: return False +def _array_contains_string(value: Value, expected: String) raises -> Bool: + for item in value.array_items(): + if item.is_string() and item.string_value() == expected: + return True + return False + + def test_status_success() raises: var response = run_hyf_stdio( load_scenario_request_json("scenarios/status_ok.json") @@ -476,6 +483,192 @@ def test_capabilities_reports_configured_fake_bridge_truthfully() raises: ) +def test_capabilities_reports_ready_fake_bridge_truthfully() raises: + with TemporaryDirectory() as temp_dir: + var startup_config_path = Path(temp_dir) / "explicit-hyf-config.toml" + startup_config_path.write_text( + '[service]\ntransport = "stdio"\n\n' + '[runtime]\ndefault_execution_mode = "deterministic"\nallow_assisted = true\n\n' + '[assist]\nbridge_enabled = true\ntransport = "stdio"\nendpoint = "hyf-assistd://fake-query-rewrite"\n' + ) + with ScopedEnvVar(HYF_PATHS_PROFILE_ENV, "repo_local"): + with ScopedEnvVar(HYF_PATHS_REPO_LOCAL_ROOT_ENV, temp_dir): + var response = run_stdio_entrypoint( + "src/main.mojo", + load_scenario_request_json("scenarios/capabilities_ok.json"), + "--config", + startup_config_path.__fspath__(), + ) + + assert_true(response["ok"].bool_value()) + assert_equal( + response["output"]["business_capabilities"][0][ + "assisted_execution" + ].string_value(), + "enabled", + ) + assert_equal( + response["output"]["business_capabilities"][0][ + "assisted_backend_available" + ].bool_value(), + True, + ) + assert_equal( + response["output"]["assisted_backend_capabilities"][0][ + "state" + ].string_value(), + "ready", + ) + + +def test_status_reports_ready_fake_bridge_truthfully() raises: + with TemporaryDirectory() as temp_dir: + var startup_config_path = Path(temp_dir) / "explicit-hyf-config.toml" + startup_config_path.write_text( + '[service]\ntransport = "stdio"\n\n' + '[runtime]\ndefault_execution_mode = "deterministic"\nallow_assisted = true\n\n' + '[assist]\nbridge_enabled = true\ntransport = "stdio"\nendpoint = "hyf-assistd://fake-query-rewrite"\n' + ) + with ScopedEnvVar(HYF_PATHS_PROFILE_ENV, "repo_local"): + with ScopedEnvVar(HYF_PATHS_REPO_LOCAL_ROOT_ENV, temp_dir): + var response = run_stdio_entrypoint( + "src/main.mojo", + load_scenario_request_json("scenarios/status_ok.json"), + "--config", + startup_config_path.__fspath__(), + ) + + assert_true(response["ok"].bool_value()) + assert_equal( + response["output"]["build_identity"][ + "assisted_execution_available" + ].bool_value(), + True, + ) + assert_equal( + response["output"]["execution_mode_request_behavior"][ + "assisted" + ].string_value(), + "execute", + ) + assert_equal( + response["output"]["assist_bridge"]["state"] + .string_value(), + "ready", + ) + assert_equal( + response["output"]["backend_reachability"][ + "assisted_backend" + ].string_value(), + "ready", + ) + + +def test_query_rewrite_uses_fake_assist_bridge_when_requested() raises: + with TemporaryDirectory() as temp_dir: + var startup_config_path = Path(temp_dir) / "explicit-hyf-config.toml" + startup_config_path.write_text( + '[service]\ntransport = "stdio"\n\n' + '[runtime]\ndefault_execution_mode = "deterministic"\nallow_assisted = true\n\n' + '[assist]\nbridge_enabled = true\ntransport = "stdio"\nendpoint = "hyf-assistd://fake-query-rewrite"\n' + ) + with ScopedEnvVar(HYF_PATHS_PROFILE_ENV, "repo_local"): + with ScopedEnvVar(HYF_PATHS_REPO_LOCAL_ROOT_ENV, temp_dir): + var response = run_stdio_entrypoint( + "src/main.mojo", + '{"version":1,"request_id":"rewrite-assisted-fake-1","trace_id":"rewrite-assisted-fake-1","capability":"query_rewrite","context":{"execution_mode_preference":"assisted","return_provenance":true},"input":{"query":"apples near me with weekend pickup"}}', + "--config", + startup_config_path.__fspath__(), + ) + + assert_true(response["ok"].bool_value()) + assert_equal( + response["meta"]["execution_mode"].string_value(), + "assisted", + ) + assert_equal( + response["meta"]["backend"].string_value(), + "assist_bridge", + ) + assert_equal( + response["meta"]["provider"].string_value(), + "fake", + ) + assert_equal( + response["meta"]["route"].string_value(), + "assist_bridge.query_rewrite.fake", + ) + assert_equal( + response["meta"]["model"].string_value(), + "fake_query_rewrite_v1", + ) + assert_equal( + Int(response["meta"]["schema_version"].int_value()), + 1, + ) + assert_equal( + Int(response["meta"]["latency_ms"].int_value()), 1 + ) + assert_equal( + response["meta"]["provenance"]["kind"].string_value(), + "assisted", + ) + assert_equal( + response["output"]["rewritten_text"].string_value(), + "apples", + ) + assert_true( + _array_contains_string( + response["output"]["normalization_signals"], + "assist_bridge_fake", + ) + ) + + +def test_query_rewrite_falls_back_deterministically_when_bridge_is_unavailable() raises: + with TemporaryDirectory() as temp_dir: + var startup_config_path = Path(temp_dir) / "explicit-hyf-config.toml" + startup_config_path.write_text( + '[service]\ntransport = "stdio"\n\n' + '[runtime]\ndefault_execution_mode = "deterministic"\nallow_assisted = true\n\n' + '[assist]\nbridge_enabled = true\ntransport = "stdio"\nendpoint = "hyf-assistd://local"\n' + ) + with ScopedEnvVar(HYF_PATHS_PROFILE_ENV, "repo_local"): + with ScopedEnvVar(HYF_PATHS_REPO_LOCAL_ROOT_ENV, temp_dir): + var response = run_stdio_entrypoint( + "src/main.mojo", + '{"version":1,"request_id":"rewrite-assisted-fallback-1","trace_id":"rewrite-assisted-fallback-1","capability":"query_rewrite","context":{"execution_mode_preference":"assisted","return_provenance":true},"input":{"query":"apples near me with weekend pickup"}}', + "--config", + startup_config_path.__fspath__(), + ) + + assert_true(response["ok"].bool_value()) + assert_equal( + response["meta"]["execution_mode"].string_value(), + "deterministic", + ) + assert_equal( + response["meta"]["backend"].string_value(), + "heuristic", + ) + assert_true(not _has_key(response["meta"], "provider")) + assert_equal( + response["meta"]["provenance"]["fallback"][ + "fallback_kind" + ].string_value(), + "assist_bridge", + ) + assert_equal( + response["meta"]["provenance"]["fallback"]["reason"] + .string_value(), + "unavailable", + ) + assert_equal( + response["output"]["rewritten_text"].string_value(), + "apples", + ) + + def test_status_reports_configured_but_deferred_custody_truthfully() raises: with TemporaryDirectory() as temp_dir: var identity_dir = Path(temp_dir) / "secrets" / "services" / "hyf"