hyf

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

commit 02dfbf0ec9d9a646f3a1c930daea792e113bc087
parent bf5114b28674e28c465e5c3e43c1f78d660d765e
Author: triesap <tyson@radroots.org>
Date:   Thu,  9 Apr 2026 17:08:25 +0000

runtime: route diagnostics through hyf paths

Diffstat:
Asrc/hyf_runtime/diagnostics.mojo | 76++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/hyf_stdio/diagnostics.mojo | 66+++++++-----------------------------------------------------------
Msrc/hyf_stdio/server.mojo | 99+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------
Msrc/main.mojo | 5++---
Mtests/internal_error_stdio_main.mojo | 10+++++++---
Mtests/stdio_process_helper.mojo | 27+++++++++++++++------------
Mtests/test_hyf.mojo | 216++++++++++++++++++++++++++++++++++++++++++-------------------------------------
Mtests/test_stdio_contract.mojo | 167+++++++++++++++++++++++++++++++++++++++++++------------------------------------
8 files changed, 404 insertions(+), 262 deletions(-)

diff --git a/src/hyf_runtime/diagnostics.mojo b/src/hyf_runtime/diagnostics.mojo @@ -0,0 +1,76 @@ +from std.ffi import c_int, external_call +from std.os import getenv, makedirs +from std.pathlib import Path + +from hyf_runtime.paths import RuntimePaths +from hyf_runtime.startup import resolve_startup_context_from_process + + +comptime _HYF_DIAGNOSTICS_DIR_ENV = "HYF_DIAGNOSTICS_DIR" +comptime _HYF_DIAGNOSTICS_FILE_PREFIX = "hyf-internal-error-pid-" +comptime _HYF_DIAGNOSTICS_FILE_SUFFIX = ".log" +comptime _HYF_DIAGNOSTICS_DIR_MODE = 0o700 +comptime _HYF_DIAGNOSTICS_FILE_MODE = 0o600 + + +def hyf_diagnostics_dir_debug_override_env_name() -> String: + return _HYF_DIAGNOSTICS_DIR_ENV + + +def _current_process_id() -> Int: + return Int(external_call["getpid", c_int]()) + + +def _ensure_directory_mode(path: Path): + var path_str = path.__fspath__() + _ = external_call["chmod", c_int]( + path_str.as_c_string_slice().unsafe_ptr(), + c_int(_HYF_DIAGNOSTICS_DIR_MODE), + ) + + +def _ensure_file_mode(handle: Int): + _ = external_call["fchmod", c_int]( + c_int(handle), c_int(_HYF_DIAGNOSTICS_FILE_MODE) + ) + + +def diagnostics_debug_override_dir_from_env() -> String: + return getenv(_HYF_DIAGNOSTICS_DIR_ENV, "") + + +def diagnostics_dir_for_runtime_paths(paths: RuntimePaths) -> String: + return String(paths.diagnostics_dir) + + +def effective_diagnostics_dir_for_runtime_paths(paths: RuntimePaths) -> String: + var configured = diagnostics_debug_override_dir_from_env() + if configured != "": + return configured + return diagnostics_dir_for_runtime_paths(paths) + + +def effective_diagnostics_dir_from_process_startup() raises -> String: + var startup_context = resolve_startup_context_from_process() + return effective_diagnostics_dir_for_runtime_paths(startup_context.paths) + + +def _diagnostic_log_path(diagnostics_dir: String) raises -> Path: + var dir_path = Path(diagnostics_dir) + makedirs(dir_path, mode=_HYF_DIAGNOSTICS_DIR_MODE, exist_ok=True) + _ensure_directory_mode(dir_path) + return dir_path / ( + _HYF_DIAGNOSTICS_FILE_PREFIX + + String(_current_process_id()) + + _HYF_DIAGNOSTICS_FILE_SUFFIX + ) + + +def append_internal_diagnostic(line: String, diagnostics_dir: String): + try: + var log_path = _diagnostic_log_path(diagnostics_dir) + with open(log_path, "a") as log_file: + _ensure_file_mode(log_file.handle) + log_file.write(line) + except: + pass diff --git a/src/hyf_stdio/diagnostics.mojo b/src/hyf_stdio/diagnostics.mojo @@ -1,65 +1,13 @@ -from std.ffi import c_int, external_call -from std.os import getenv, makedirs -from std.pathlib import Path -from std.tempfile import gettempdir - - -comptime _HYF_DIAGNOSTICS_DIR_ENV = "HYF_DIAGNOSTICS_DIR" -comptime _HYF_DIAGNOSTICS_DIR_NAME = "hyf-diagnostics" -comptime _HYF_DIAGNOSTICS_FILE_PREFIX = "hyf-internal-error-pid-" -comptime _HYF_DIAGNOSTICS_FILE_SUFFIX = ".log" -comptime _HYF_DIAGNOSTICS_DIR_MODE = 0o700 -comptime _HYF_DIAGNOSTICS_FILE_MODE = 0o600 - - -def _current_process_id() -> Int: - return Int(external_call["getpid", c_int]()) - - -def _ensure_directory_mode(path: Path): - var path_str = path.__fspath__() - _ = external_call["chmod", c_int]( - path_str.as_c_string_slice().unsafe_ptr(), - c_int(_HYF_DIAGNOSTICS_DIR_MODE), - ) - - -def _ensure_file_mode(handle: Int): - _ = external_call["fchmod", c_int]( - c_int(handle), c_int(_HYF_DIAGNOSTICS_FILE_MODE) - ) - - -def _default_diagnostics_dir() raises -> Path: - var tmpdir = gettempdir() - if tmpdir: - return Path(tmpdir.value()) / _HYF_DIAGNOSTICS_DIR_NAME - return Path("/tmp") / _HYF_DIAGNOSTICS_DIR_NAME - - -def _diagnostics_dir() raises -> Path: - var configured = getenv(_HYF_DIAGNOSTICS_DIR_ENV, "") - if configured != "": - return Path(configured) - return _default_diagnostics_dir() - - -def _diagnostic_log_path() raises -> Path: - var diagnostics_dir = _diagnostics_dir() - makedirs(diagnostics_dir, mode=_HYF_DIAGNOSTICS_DIR_MODE, exist_ok=True) - _ensure_directory_mode(diagnostics_dir) - return diagnostics_dir / ( - _HYF_DIAGNOSTICS_FILE_PREFIX - + String(_current_process_id()) - + _HYF_DIAGNOSTICS_FILE_SUFFIX - ) +from hyf_runtime.diagnostics import ( + append_internal_diagnostic as append_internal_diagnostic_to_dir, + effective_diagnostics_dir_from_process_startup, +) def append_internal_diagnostic(line: String): try: - var log_path = _diagnostic_log_path() - with open(log_path, "a") as log_file: - _ensure_file_mode(log_file.handle) - log_file.write(line) + append_internal_diagnostic_to_dir( + line, effective_diagnostics_dir_from_process_startup() + ) except: pass diff --git a/src/hyf_stdio/server.mojo b/src/hyf_stdio/server.mojo @@ -4,11 +4,25 @@ from std.sys import stdin from mojson import Value -from hyf_core.backends.selector import execute_capability as execute_backend_capability +from hyf_runtime.diagnostics import ( + append_internal_diagnostic as append_internal_diagnostic_to_dir, + effective_diagnostics_dir_for_runtime_paths, +) +from hyf_runtime.startup import ( + RuntimeStartupContext, + resolve_startup_context_from_process, +) +from hyf_core.backends.selector import ( + execute_capability as execute_backend_capability, +) from hyf_core.capabilities.registry import ( canonical_business_capability, ) -from hyf_core.errors import CapabilityFailure, CapabilityResult, CapabilitySuccess +from hyf_core.errors import ( + CapabilityFailure, + CapabilityResult, + CapabilitySuccess, +) from hyf_core.metadata import hyf_protocol_version from hyf_stdio.codec import ( decode_request, @@ -18,7 +32,6 @@ from hyf_stdio.codec import ( ) from hyf_stdio.control.capabilities import build_capabilities_output from hyf_stdio.control.status import build_status_output -from hyf_stdio.diagnostics import append_internal_diagnostic from hyf_stdio.envelope import ( WireErrorResponse, WireRequest, @@ -78,6 +91,7 @@ def _write_success(response: WireSuccessResponse) raises: def _diagnostic_value(value: String) -> String: return value.replace("\n", "\\n").replace("\r", "\\r") + def _diagnostic_trace_id(trace_id: Optional[String]) -> String: if trace_id: return _diagnostic_value(String(trace_id.value())) @@ -89,17 +103,19 @@ def _emit_internal_diagnostic( trace_id: Optional[String], capability: String, detail: String, + diagnostics_dir: String, ): - append_internal_diagnostic( - "hyf_internal_error request_id=\"" + append_internal_diagnostic_to_dir( + 'hyf_internal_error request_id="' + _diagnostic_value(request_id) - + "\" trace_id=\"" + + '" trace_id="' + _diagnostic_trace_id(trace_id) - + "\" capability=\"" + + '" capability="' + _diagnostic_value(capability) - + "\" detail=\"" + + '" detail="' + _diagnostic_value(detail) - + "\"\n" + + '"\n', + diagnostics_dir, ) @@ -185,8 +201,24 @@ def handle_request_with_control_builders[ status_builder: def() raises -> Value, capabilities_builder: def() raises -> Value, ](request: WireRequest) raises -> String: + return handle_request_with_runtime_context_and_control_builders[ + status_builder, capabilities_builder + ](request, resolve_startup_context_from_process()) + + +@parameter +def handle_request_with_runtime_context_and_control_builders[ + status_builder: def() raises -> Value, + capabilities_builder: def() raises -> Value, +]( + request: WireRequest, + runtime_context: RuntimeStartupContext, +) raises -> String: var request_id = String(request.request_id) var trace_id = request.trace_id + var diagnostics_dir = effective_diagnostics_dir_for_runtime_paths( + runtime_context.paths + ) try: if request.capability == "sys.status": return encode_success( @@ -215,6 +247,7 @@ def handle_request_with_control_builders[ trace_id, String(request.capability), String(e), + diagnostics_dir, ) return encode_error( WireErrorResponse( @@ -232,6 +265,14 @@ def handle_request(request: WireRequest) raises -> String: ](request) +def handle_request_with_runtime_context( + request: WireRequest, runtime_context: RuntimeStartupContext +) raises -> String: + return handle_request_with_runtime_context_and_control_builders[ + build_status_output, build_capabilities_output + ](request, runtime_context) + + @parameter def handle_request_line_with_control_builders[ status_builder: def() raises -> Value, @@ -254,20 +295,58 @@ def handle_request_line_with_control_builders[ ) +@parameter +def handle_request_line_with_runtime_context_and_control_builders[ + status_builder: def() raises -> Value, + capabilities_builder: def() raises -> Value, +](line: String, runtime_context: RuntimeStartupContext) raises -> String: + try: + var request = decode_request(line) + return handle_request_with_runtime_context_and_control_builders[ + status_builder, capabilities_builder + ](request^, runtime_context) + except e: + var correlation = extract_request_correlation(line) + return encode_error( + WireErrorResponse( + version=hyf_protocol_version(), + request_id=correlation.request_id, + trace_id=correlation.trace_id, + error=invalid_request_error(String(e)), + ) + ) + + def handle_request_line(line: String) raises -> String: return handle_request_line_with_control_builders[ build_status_output, build_capabilities_output ](line) +def handle_request_line_with_runtime_context( + line: String, runtime_context: RuntimeStartupContext +) raises -> String: + return handle_request_line_with_runtime_context_and_control_builders[ + build_status_output, build_capabilities_output + ](line, runtime_context) + + def run_stdio_server() raises: + run_stdio_server_with_runtime_context( + resolve_startup_context_from_process() + ) + + +def run_stdio_server_with_runtime_context( + runtime_context: RuntimeStartupContext, +) raises: if stdin.isatty(): return try: var line = _read_request_line() - print(handle_request_line(line)) + print(handle_request_line_with_runtime_context(line, runtime_context)) except e: if String(e) == "EOF": return diff --git a/src/main.mojo b/src/main.mojo @@ -1,8 +1,7 @@ from hyf_runtime.startup import resolve_startup_context_from_process -from hyf_stdio.server import run_stdio_server +from hyf_stdio.server import run_stdio_server_with_runtime_context def main() raises: var startup_context = resolve_startup_context_from_process() - _ = startup_context.paths.config_path - run_stdio_server() + run_stdio_server_with_runtime_context(startup_context) diff --git a/tests/internal_error_stdio_main.mojo b/tests/internal_error_stdio_main.mojo @@ -3,7 +3,10 @@ from std.sys import stdin from mojson import Value, loads -from hyf_stdio.server import handle_request_line_with_control_builders +from hyf_runtime.startup import resolve_startup_context_from_process +from hyf_stdio.server import ( + handle_request_line_with_runtime_context_and_control_builders, +) def _read_request_line() raises -> String: @@ -24,8 +27,9 @@ def main() raises: return var line = _read_request_line() + var startup_context = resolve_startup_context_from_process() print( - handle_request_line_with_control_builders[ + handle_request_line_with_runtime_context_and_control_builders[ _failing_status_output, _unused_capabilities_output - ](line) + ](line, startup_context) ) diff --git a/tests/stdio_process_helper.mojo b/tests/stdio_process_helper.mojo @@ -2,11 +2,13 @@ import std.os from std.os import Pipe, Process from std.ffi import CStringSlice, c_int, external_call from std.sys._libc import close, exit, vfork +from std.tempfile import TemporaryDirectory from mojson import Value, loads -comptime HYF_DIAGNOSTICS_DIR_ENV = "HYF_DIAGNOSTICS_DIR" +comptime HYF_PATHS_PROFILE_ENV = "HYF_PATHS_PROFILE" +comptime HYF_PATHS_REPO_LOCAL_ROOT_ENV = "HYF_PATHS_REPO_LOCAL_ROOT" struct ScopedEnvVar: @@ -48,7 +50,9 @@ def _read_pipe_to_string(mut pipe: Pipe) raises -> String: return output^ -def run_stdio_entrypoint(entrypoint: String, request_json: String) raises -> Value: +def run_stdio_entrypoint( + entrypoint: String, request_json: String +) raises -> Value: var stdin_pipe = Pipe() var stdout_pipe = Pipe() var output = String("") @@ -56,15 +60,9 @@ def run_stdio_entrypoint(entrypoint: String, request_json: String) raises -> Val var include_flag = String("-I") var include_path = String("src") var entrypoint_path = String(entrypoint) - var argv = List[Optional[CStringSlice[ImmutAnyOrigin]]]( - length=6, fill={} - ) - argv[0] = rebind[CStringSlice[ImmutAnyOrigin]]( - command.as_c_string_slice() - ) - argv[1] = rebind[CStringSlice[ImmutAnyOrigin]]( - "run".as_c_string_slice() - ) + var argv = List[Optional[CStringSlice[ImmutAnyOrigin]]](length=6, fill={}) + argv[0] = rebind[CStringSlice[ImmutAnyOrigin]](command.as_c_string_slice()) + argv[1] = rebind[CStringSlice[ImmutAnyOrigin]]("run".as_c_string_slice()) argv[2] = rebind[CStringSlice[ImmutAnyOrigin]]( include_flag.as_c_string_slice() ) @@ -114,4 +112,9 @@ def run_stdio_entrypoint(entrypoint: String, request_json: String) raises -> Val def run_hyf_stdio(request_json: String) raises -> Value: - return run_stdio_entrypoint("src/main.mojo", request_json) + var response = Value(None) + with TemporaryDirectory() as temp_dir: + with ScopedEnvVar(HYF_PATHS_PROFILE_ENV, "repo_local"): + with ScopedEnvVar(HYF_PATHS_REPO_LOCAL_ROOT_ENV, temp_dir): + response = run_stdio_entrypoint("src/main.mojo", request_json) + return response^ diff --git a/tests/test_hyf.mojo b/tests/test_hyf.mojo @@ -116,11 +116,11 @@ def _parse_manifest_quoted_value(value: String) raises -> String: var trimmed = value.strip() if ( trimmed.byte_length() < 2 - or not trimmed.startswith("\"") - or not trimmed.endswith("\"") + or not trimmed.startswith('"') + or not trimmed.endswith('"') ): raise Error("manifest assignment value must be quoted") - return String(trimmed[byte=1 : trimmed.byte_length() - 1]) + return String(trimmed[byte = 1 : trimmed.byte_length() - 1]) def _manifest_workspace_value(target_key: String) raises -> String: @@ -147,7 +147,7 @@ def _manifest_workspace_value(target_key: String) raises -> String: continue return _parse_manifest_quoted_value( - String(line[byte=equals_index + 1 :]) + String(line[byte = equals_index + 1 :]) ) raise Error("missing workspace manifest key '" + target_key + "'") @@ -169,7 +169,8 @@ def _array_string_values(value: Value) raises -> List[String]: def test_decode_request_parses_context_and_input() raises: var request = decode_request( - '{"version":1,"request_id":"req-1","trace_id":"trace-1","capability":"query_rewrite","context":{"consumer":"radroots-cli","execution_mode_preference":"deterministic","return_provenance":true},"input":{"query":"eggs near me"}}' + '{"version":1,"request_id":"req-1","trace_id":"trace-1","capability":"query_rewrite","context":{"consumer":"radroots-cli","execution_mode_preference":"deterministic","return_provenance":true},"input":{"query":"eggs' + ' near me"}}' ) assert_equal(request.version, 1) @@ -177,9 +178,7 @@ def test_decode_request_parses_context_and_input() raises: assert_equal(request.trace_id.value(), "trace-1") assert_equal(request.capability, "query_rewrite") assert_equal(request.context.consumer, "radroots-cli") - assert_equal( - request.context.execution_mode_preference, "deterministic" - ) + assert_equal(request.context.execution_mode_preference, "deterministic") assert_equal(request.context.return_provenance, True) assert_equal(request.input["query"].string_value(), "eggs near me") @@ -213,7 +212,8 @@ def test_decode_request_rejects_unsupported_context_field() raises: def test_decode_request_rejects_unsupported_scope_field() raises: with assert_raises(): _ = decode_request( - '{"version":1,"request_id":"req-scope-1","capability":"semantic_rank","context":{"scope":{"farm_ids":["farm-1"]}},"input":{"query":"eggs","candidates":[{"id":"lst_1","title":"Eggs","farm":"One Farm","delivery":"pickup","distance_km":1.0,"freshness_minutes":5}]}}' + '{"version":1,"request_id":"req-scope-1","capability":"semantic_rank","context":{"scope":{"farm_ids":["farm-1"]}},"input":{"query":"eggs","candidates":[{"id":"lst_1","title":"Eggs","farm":"One' + ' Farm","delivery":"pickup","distance_km":1.0,"freshness_minutes":5}]}}' ) @@ -282,9 +282,7 @@ def test_current_build_identity_matches_manifest_package_surface() raises: assert_equal(package_surface.package_name, manifest_package_name) assert_equal(package_surface.package_version, manifest_package_version) assert_equal(build_identity.package_name, manifest_package_name) - assert_equal( - build_identity.package_version, manifest_package_version - ) + assert_equal(build_identity.package_version, manifest_package_version) def test_repo_local_fixture_manifest_declares_expected_scenarios() raises: @@ -296,9 +294,7 @@ def test_repo_local_fixture_manifest_declares_expected_scenarios() raises: "radroots-canonical-hyf-v1", ) assert_equal(Int(manifest["schema_version"].int_value()), 1) - assert_equal( - manifest["family_kind"].string_value(), "wire_compatibility" - ) + assert_equal(manifest["family_kind"].string_value(), "wire_compatibility") assert_equal(manifest["transport"].string_value(), "stdio") assert_equal( manifest["request_framing"].string_value(), @@ -333,9 +329,7 @@ def test_repo_local_fixture_loader_reads_all_mirrored_scenarios() raises: ) var status_scenario = load_fixture_scenario("scenarios/status_ok.json") - assert_equal( - status_scenario["fixture_id"].string_value(), "status_ok" - ) + assert_equal(status_scenario["fixture_id"].string_value(), "status_ok") assert_equal( status_scenario["request"]["capability"].string_value(), "sys.status", @@ -363,17 +357,20 @@ def test_fixture_loader_reads_top_level_request_and_expected_structurally() rais with TemporaryDirectory() as temp_dir: var scenario_path = Path(temp_dir) / "scenario.json" scenario_path.write_text( - '{' + "{" + '"fixture_id":"shadowed-top-level-fields",' - + '"description":"this description mentions request and expected before the real fields",' + + '"description":"this description mentions request and expected' + ' before the real fields",' + '"request":{"version":1,"request_id":"shadow-1","capability":"sys.status","input":{}},' + '"expected":{"ok":true,"equals":{"output.kind":"status"}}' - + '}' + + "}" ) var scenario = load_fixture_json_file(scenario_path) var request = load_fixture_scenario_request("scenarios/status_ok.json") - var expected = load_fixture_scenario_expected("scenarios/status_ok.json") + var expected = load_fixture_scenario_expected( + "scenarios/status_ok.json" + ) var temp_request = load_fixture_top_level_field_from_path( scenario_path, "request" ) @@ -403,7 +400,9 @@ def test_fixture_loader_reads_top_level_request_and_expected_structurally() rais def test_status_reports_registered_deterministic_ready() raises: - var result = _dispatch(load_scenario_request_json("scenarios/status_ok.json")) + var result = _dispatch( + load_scenario_request_json("scenarios/status_ok.json") + ) assert_matches_scenario_response(result, "scenarios/status_ok.json") @@ -431,12 +430,8 @@ def test_capabilities_output_reflects_registry_truth_for_all_business_capabiliti ) assert_equal( entry["implementation_status"].string_value(), - "implemented" - if capability.implemented - else ( - "not_implemented" - if capability.deterministic_enabled - else "disabled" + "implemented" if capability.implemented else ( + "not_implemented" if capability.deterministic_enabled else "disabled" ), ) if capability.disabled_reason != "": @@ -450,7 +445,9 @@ def test_capabilities_output_reflects_registry_truth_for_all_business_capabiliti def test_disabled_capability_returns_capability_disabled() raises: var result = _dispatch( - load_scenario_request_json("scenarios/deferred_capability_disabled.json") + load_scenario_request_json( + "scenarios/deferred_capability_disabled.json" + ) ) assert_matches_scenario_response( result, "scenarios/deferred_capability_disabled.json" @@ -480,13 +477,13 @@ def test_non_callable_registry_business_capabilities_do_not_route_as_success() r + '","input":{}}' ) assert_equal(Int(result["version"].int_value()), 1) - assert_equal(result["request_id"].string_value(), capability.id + "-routing-1") + assert_equal( + result["request_id"].string_value(), capability.id + "-routing-1" + ) assert_equal(result["ok"].bool_value(), False) assert_equal( result["error"]["code"].string_value(), - "capability_disabled" - if not capability.deterministic_enabled - else "capability_unavailable", + "capability_disabled" if not capability.deterministic_enabled else "capability_unavailable", ) @@ -545,7 +542,8 @@ def test_query_rewrite_returns_deterministic_output() raises: def test_query_rewrite_accepts_query_alias_with_same_behavior() raises: var result = _dispatch( - '{"version":1,"request_id":"rewrite-query-1","capability":"query_rewrite","input":{"query":"eggs near me with weekend pickup"}}' + '{"version":1,"request_id":"rewrite-query-1","capability":"query_rewrite","input":{"query":"eggs' + ' near me with weekend pickup"}}' ) assert_equal(Int(result["version"].int_value()), 1) @@ -573,7 +571,8 @@ def test_query_rewrite_rejects_unknown_input_field() raises: def test_query_rewrite_rejects_text_and_query_together() raises: var result = _dispatch( - '{"version":1,"request_id":"rewrite-bad-dual-1","capability":"query_rewrite","input":{"text":"eggs near me","query":"eggs"}}' + '{"version":1,"request_id":"rewrite-bad-dual-1","capability":"query_rewrite","input":{"text":"eggs' + ' near me","query":"eggs"}}' ) assert_equal(Int(result["version"].int_value()), 1) @@ -598,7 +597,11 @@ def test_semantic_rank_returns_ranked_ids_and_reasons() raises: def test_semantic_rank_scope_listing_ids_remains_effective() raises: var result = _dispatch( - '{"version":1,"request_id":"rank-scope-1","capability":"semantic_rank","context":{"scope":{"listing_ids":["lst_8k1p"]}},"input":{"query":"eggs","candidates":[{"id":"lst_7ak2","title":"Pasture eggs","farm":"La Huerta del Sur","delivery":"pickup","distance_km":3.2,"freshness_minutes":2},{"id":"lst_8k1p","title":"Free range eggs","farm":"Santa Elena","delivery":"delivery","distance_km":8.7,"freshness_minutes":18}]}}' + '{"version":1,"request_id":"rank-scope-1","capability":"semantic_rank","context":{"scope":{"listing_ids":["lst_8k1p"]}},"input":{"query":"eggs","candidates":[{"id":"lst_7ak2","title":"Pasture' + ' eggs","farm":"La Huerta del' + ' Sur","delivery":"pickup","distance_km":3.2,"freshness_minutes":2},{"id":"lst_8k1p","title":"Free' + ' range eggs","farm":"Santa' + ' Elena","delivery":"delivery","distance_km":8.7,"freshness_minutes":18}]}}' ) assert_equal(Int(result["version"].int_value()), 1) @@ -618,7 +621,10 @@ def test_semantic_rank_scope_listing_ids_remains_effective() raises: def test_semantic_rank_rejects_unknown_top_level_field() raises: var result = _dispatch( - '{"version":1,"request_id":"rank-bad-top-1","capability":"semantic_rank","input":{"query":"eggs near me","candidates":[{"id":"lst_7ak2","title":"Pasture eggs","farm":"La Huerta del Sur","delivery":"pickup","distance_km":3.2,"freshness_minutes":2}],"tone":"brief"}}' + '{"version":1,"request_id":"rank-bad-top-1","capability":"semantic_rank","input":{"query":"eggs' + ' near me","candidates":[{"id":"lst_7ak2","title":"Pasture' + ' eggs","farm":"La Huerta del' + ' Sur","delivery":"pickup","distance_km":3.2,"freshness_minutes":2}],"tone":"brief"}}' ) assert_equal(Int(result["version"].int_value()), 1) @@ -626,31 +632,35 @@ def test_semantic_rank_rejects_unknown_top_level_field() raises: assert_equal(result["request_id"].string_value(), "rank-bad-top-1") assert_equal(result["error"]["code"].string_value(), "invalid_request") assert_true( - result["error"]["message"].string_value().find("unexpected field") - >= 0 + result["error"]["message"].string_value().find("unexpected field") >= 0 ) def test_semantic_rank_rejects_unknown_candidate_field() raises: var result = _dispatch( - '{"version":1,"request_id":"rank-bad-candidate-1","capability":"semantic_rank","input":{"query":"eggs near me","candidates":[{"id":"lst_7ak2","title":"Pasture eggs","farm":"La Huerta del Sur","delivery":"pickup","distance_km":3.2,"freshness_minutes":2,"rating":5}]}}' + '{"version":1,"request_id":"rank-bad-candidate-1","capability":"semantic_rank","input":{"query":"eggs' + ' near me","candidates":[{"id":"lst_7ak2","title":"Pasture' + ' eggs","farm":"La Huerta del' + ' Sur","delivery":"pickup","distance_km":3.2,"freshness_minutes":2,"rating":5}]}}' ) assert_equal(Int(result["version"].int_value()), 1) assert_equal(result["ok"].bool_value(), False) - assert_equal( - result["request_id"].string_value(), "rank-bad-candidate-1" - ) + assert_equal(result["request_id"].string_value(), "rank-bad-candidate-1") assert_equal(result["error"]["code"].string_value(), "invalid_request") assert_true( - result["error"]["message"].string_value().find("unexpected field") - >= 0 + result["error"]["message"].string_value().find("unexpected field") >= 0 ) def test_semantic_rank_rejects_duplicate_candidate_ids() raises: var result = _dispatch( - '{"version":1,"request_id":"rank-dup-1","capability":"semantic_rank","input":{"query":"eggs near me","candidates":[{"id":"lst_dup","title":"Pasture eggs","farm":"La Huerta del Sur","delivery":"pickup","distance_km":3.2,"freshness_minutes":2},{"id":"lst_dup","title":"Free range eggs","farm":"Santa Elena","delivery":"delivery","distance_km":8.7,"freshness_minutes":18}]}}' + '{"version":1,"request_id":"rank-dup-1","capability":"semantic_rank","input":{"query":"eggs' + ' near me","candidates":[{"id":"lst_dup","title":"Pasture' + ' eggs","farm":"La Huerta del' + ' Sur","delivery":"pickup","distance_km":3.2,"freshness_minutes":2},{"id":"lst_dup","title":"Free' + ' range eggs","farm":"Santa' + ' Elena","delivery":"delivery","distance_km":8.7,"freshness_minutes":18}]}}' ) assert_equal(Int(result["version"].int_value()), 1) @@ -665,18 +675,18 @@ def test_semantic_rank_rejects_duplicate_candidate_ids() raises: def test_semantic_rank_rejects_invalid_delivery_value() raises: var result = _dispatch( - '{"version":1,"request_id":"rank-bad-delivery-1","capability":"semantic_rank","input":{"query":"eggs near me","candidates":[{"id":"lst_7ak2","title":"Pasture eggs","farm":"La Huerta del Sur","delivery":"ship","distance_km":3.2,"freshness_minutes":2}]}}' + '{"version":1,"request_id":"rank-bad-delivery-1","capability":"semantic_rank","input":{"query":"eggs' + ' near me","candidates":[{"id":"lst_7ak2","title":"Pasture' + ' eggs","farm":"La Huerta del' + ' Sur","delivery":"ship","distance_km":3.2,"freshness_minutes":2}]}}' ) assert_equal(Int(result["version"].int_value()), 1) assert_equal(result["ok"].bool_value(), False) - assert_equal( - result["request_id"].string_value(), "rank-bad-delivery-1" - ) + assert_equal(result["request_id"].string_value(), "rank-bad-delivery-1") assert_equal(result["error"]["code"].string_value(), "invalid_request") assert_true( - result["error"]["message"].string_value().find("must be one of") - >= 0 + result["error"]["message"].string_value().find("must be one of") >= 0 ) @@ -693,7 +703,11 @@ def test_explain_result_returns_deterministic_summary_and_provenance() raises: def test_explain_result_accepts_result_alias() raises: var result = _dispatch( - '{"version":1,"request_id":"explain-result-1","capability":"explain_result","input":{"query":"eggs near me with weekend pickup","result":{"id":"lst_7ak2","title":"Pasture eggs","farm":"La Huerta del Sur","delivery":"pickup","distance_km":3.2,"freshness_minutes":2}}}' + '{"version":1,"request_id":"explain-result-1","capability":"explain_result","input":{"query":"eggs' + " near me with weekend" + ' pickup","result":{"id":"lst_7ak2","title":"Pasture eggs","farm":"La' + " Huerta del" + ' Sur","delivery":"pickup","distance_km":3.2,"freshness_minutes":2}}}' ) assert_equal(Int(result["version"].int_value()), 1) @@ -710,58 +724,59 @@ def test_explain_result_accepts_result_alias() raises: def test_explain_result_rejects_unknown_top_level_field() raises: var result = _dispatch( - '{"version":1,"request_id":"explain-bad-top-1","capability":"explain_result","input":{"query":"eggs near me","candidate":{"id":"lst_7ak2","title":"Pasture eggs","farm":"La Huerta del Sur","delivery":"pickup","distance_km":3.2,"freshness_minutes":2},"tone":"brief"}}' + '{"version":1,"request_id":"explain-bad-top-1","capability":"explain_result","input":{"query":"eggs' + ' near me","candidate":{"id":"lst_7ak2","title":"Pasture' + ' eggs","farm":"La Huerta del' + ' Sur","delivery":"pickup","distance_km":3.2,"freshness_minutes":2},"tone":"brief"}}' ) assert_equal(Int(result["version"].int_value()), 1) assert_equal(result["ok"].bool_value(), False) - assert_equal( - result["request_id"].string_value(), "explain-bad-top-1" - ) + assert_equal(result["request_id"].string_value(), "explain-bad-top-1") assert_equal(result["error"]["code"].string_value(), "invalid_request") assert_true( - result["error"]["message"].string_value().find("unexpected field") - >= 0 + result["error"]["message"].string_value().find("unexpected field") >= 0 ) def test_explain_result_rejects_unknown_candidate_field() raises: var result = _dispatch( - '{"version":1,"request_id":"explain-bad-candidate-1","capability":"explain_result","input":{"query":"eggs near me","candidate":{"id":"lst_7ak2","title":"Pasture eggs","farm":"La Huerta del Sur","delivery":"pickup","distance_km":3.2,"freshness_minutes":2,"rating":5}}}' + '{"version":1,"request_id":"explain-bad-candidate-1","capability":"explain_result","input":{"query":"eggs' + ' near me","candidate":{"id":"lst_7ak2","title":"Pasture' + ' eggs","farm":"La Huerta del' + ' Sur","delivery":"pickup","distance_km":3.2,"freshness_minutes":2,"rating":5}}}' ) assert_equal(Int(result["version"].int_value()), 1) assert_equal(result["ok"].bool_value(), False) - assert_equal( - result["request_id"].string_value(), "explain-bad-candidate-1" - ) + assert_equal(result["request_id"].string_value(), "explain-bad-candidate-1") assert_equal(result["error"]["code"].string_value(), "invalid_request") assert_true( - result["error"]["message"].string_value().find("unexpected field") - >= 0 + result["error"]["message"].string_value().find("unexpected field") >= 0 ) def test_explain_result_rejects_invalid_delivery_value() raises: var result = _dispatch( - '{"version":1,"request_id":"explain-bad-delivery-1","capability":"explain_result","input":{"query":"eggs near me","candidate":{"id":"lst_7ak2","title":"Pasture eggs","farm":"La Huerta del Sur","delivery":"ship","distance_km":3.2,"freshness_minutes":2}}}' + '{"version":1,"request_id":"explain-bad-delivery-1","capability":"explain_result","input":{"query":"eggs' + ' near me","candidate":{"id":"lst_7ak2","title":"Pasture' + ' eggs","farm":"La Huerta del' + ' Sur","delivery":"ship","distance_km":3.2,"freshness_minutes":2}}}' ) assert_equal(Int(result["version"].int_value()), 1) assert_equal(result["ok"].bool_value(), False) - assert_equal( - result["request_id"].string_value(), "explain-bad-delivery-1" - ) + assert_equal(result["request_id"].string_value(), "explain-bad-delivery-1") assert_equal(result["error"]["code"].string_value(), "invalid_request") assert_true( - result["error"]["message"].string_value().find("must be one of") - >= 0 + result["error"]["message"].string_value().find("must be one of") >= 0 ) def test_semantic_rank_invalid_input_returns_invalid_request() raises: var result = _dispatch( - '{"version":1,"request_id":"rank-bad-1","trace_id":"trace-rank-bad-1","capability":"semantic_rank","input":{"query":"eggs near me with weekend pickup","candidates":[]}}' + '{"version":1,"request_id":"rank-bad-1","trace_id":"trace-rank-bad-1","capability":"semantic_rank","input":{"query":"eggs' + ' near me with weekend pickup","candidates":[]}}' ) assert_equal(Int(result["version"].int_value()), 1) @@ -782,19 +797,21 @@ def test_missing_input_returns_invalid_request() raises: assert_equal(Int(result["version"].int_value()), 1) assert_equal(result["ok"].bool_value(), False) assert_equal(result["request_id"].string_value(), "missing-input-1") - assert_equal( - result["trace_id"].string_value(), "trace-missing-input-1" - ) + assert_equal(result["trace_id"].string_value(), "trace-missing-input-1") assert_equal(result["error"]["code"].string_value(), "invalid_request") assert_true( - result["error"]["message"].string_value().find("field 'input' is required") + result["error"]["message"] + .string_value() + .find("field 'input' is required") >= 0 ) def test_assisted_request_returns_backend_unavailable() raises: var result = _dispatch( - load_scenario_request_json("scenarios/assisted_backend_unavailable.json") + load_scenario_request_json( + "scenarios/assisted_backend_unavailable.json" + ) ) assert_matches_scenario_response( result, "scenarios/assisted_backend_unavailable.json" @@ -805,12 +822,8 @@ def test_invalid_request_preserves_request_and_trace_correlation() raises: var result = _dispatch(status_request_with_invalid_version_json()) assert_equal(Int(result["version"].int_value()), 1) - assert_equal( - result["request_id"].string_value(), "status-fixture-1" - ) - assert_equal( - result["trace_id"].string_value(), "trace-status-fixture-1" - ) + assert_equal(result["request_id"].string_value(), "status-fixture-1") + assert_equal(result["trace_id"].string_value(), "trace-status-fixture-1") assert_equal(result["ok"].bool_value(), False) assert_equal(result["error"]["code"].string_value(), "invalid_request") assert_true( @@ -819,25 +832,28 @@ def test_invalid_request_preserves_request_and_trace_correlation() raises: def test_internal_error_is_bounded_on_wire() raises: - var result = loads( - handle_request_line_with_control_builders[ - _failing_status_output, build_capabilities_output - ]( - '{"version":1,"request_id":"status-internal-1","trace_id":"trace-status-internal-1","capability":"sys.status","input":{}}' - ) - ) + with TemporaryDirectory() as temp_dir: + var diagnostics_dir = Path(temp_dir) / "hyf-internal-diagnostics" + with ScopedEnvVar( + _HYF_DIAGNOSTICS_DIR_ENV, diagnostics_dir.__fspath__() + ): + var result = loads( + handle_request_line_with_control_builders[ + _failing_status_output, build_capabilities_output + ]( + '{"version":1,"request_id":"status-internal-1","trace_id":"trace-status-internal-1","capability":"sys.status","input":{}}' + ) + ) + + _assert_internal_error_is_bounded(result) + +def _assert_internal_error_is_bounded(result: Value) raises: assert_equal(Int(result["version"].int_value()), 1) - assert_equal( - result["request_id"].string_value(), "status-internal-1" - ) - assert_equal( - result["trace_id"].string_value(), "trace-status-internal-1" - ) + assert_equal(result["request_id"].string_value(), "status-internal-1") + assert_equal(result["trace_id"].string_value(), "trace-status-internal-1") assert_equal(result["ok"].bool_value(), False) - assert_equal( - result["error"]["code"].string_value(), "internal_error" - ) + assert_equal(result["error"]["code"].string_value(), "internal_error") assert_equal( result["error"]["message"].string_value(), _EXPECTED_INTERNAL_ERROR_MESSAGE, diff --git a/tests/test_stdio_contract.mojo b/tests/test_stdio_contract.mojo @@ -11,7 +11,8 @@ from fixture_assertions import ( status_request_with_invalid_version_json, ) from stdio_process_helper import ( - HYF_DIAGNOSTICS_DIR_ENV, + HYF_PATHS_PROFILE_ENV, + HYF_PATHS_REPO_LOCAL_ROOT_ENV, ScopedEnvVar, run_hyf_stdio, run_stdio_entrypoint, @@ -21,6 +22,8 @@ from stdio_process_helper import ( comptime _EXPECTED_INTERNAL_ERROR_MESSAGE = ( "internal hyf daemon error; inspect local diagnostics" ) + + def _has_key(value: Value, key: String) -> Bool: for candidate in value.object_keys(): if candidate == key: @@ -46,19 +49,17 @@ def test_invalid_envelope_preserves_correlation() raises: var response = run_hyf_stdio(status_request_with_invalid_version_json()) assert_equal(Int(response["version"].int_value()), 1) - assert_equal( - response["request_id"].string_value(), "status-fixture-1" - ) - assert_equal( - response["trace_id"].string_value(), "trace-status-fixture-1" - ) + assert_equal(response["request_id"].string_value(), "status-fixture-1") + assert_equal(response["trace_id"].string_value(), "trace-status-fixture-1") assert_true(not response["ok"].bool_value()) assert_equal(response["error"]["code"].string_value(), "invalid_request") def test_assisted_request_fails_explicitly() raises: var response = run_hyf_stdio( - load_scenario_request_json("scenarios/assisted_backend_unavailable.json") + load_scenario_request_json( + "scenarios/assisted_backend_unavailable.json" + ) ) assert_matches_scenario_response( response, "scenarios/assisted_backend_unavailable.json" @@ -67,7 +68,9 @@ def test_assisted_request_fails_explicitly() raises: def test_deferred_capability_returns_disabled_error() raises: var response = run_hyf_stdio( - load_scenario_request_json("scenarios/deferred_capability_disabled.json") + load_scenario_request_json( + "scenarios/deferred_capability_disabled.json" + ) ) assert_matches_scenario_response( response, "scenarios/deferred_capability_disabled.json" @@ -120,7 +123,10 @@ def test_strict_query_rewrite_failure() raises: def test_strict_semantic_rank_failure() raises: var response = run_hyf_stdio( - '{"version":1,"request_id":"rank-bad-proc-1","capability":"semantic_rank","input":{"query":"eggs near me","candidates":[{"id":"lst_7ak2","title":"Pasture eggs","farm":"La Huerta del Sur","delivery":"pickup","distance_km":3.2,"freshness_minutes":2,"rating":5}]}}' + '{"version":1,"request_id":"rank-bad-proc-1","capability":"semantic_rank","input":{"query":"eggs' + ' near me","candidates":[{"id":"lst_7ak2","title":"Pasture' + ' eggs","farm":"La Huerta del' + ' Sur","delivery":"pickup","distance_km":3.2,"freshness_minutes":2,"rating":5}]}}' ) assert_true(not response["ok"].bool_value()) @@ -133,13 +139,20 @@ def test_strict_semantic_rank_failure() raises: def test_duplicate_candidate_ids_fail_explicitly() raises: var response = run_hyf_stdio( - '{"version":1,"request_id":"rank-dup-proc-1","capability":"semantic_rank","input":{"query":"eggs near me","candidates":[{"id":"lst_dup","title":"Pasture eggs","farm":"La Huerta del Sur","delivery":"pickup","distance_km":3.2,"freshness_minutes":2},{"id":"lst_dup","title":"Free range eggs","farm":"Santa Elena","delivery":"delivery","distance_km":8.7,"freshness_minutes":18}]}}' + '{"version":1,"request_id":"rank-dup-proc-1","capability":"semantic_rank","input":{"query":"eggs' + ' near me","candidates":[{"id":"lst_dup","title":"Pasture' + ' eggs","farm":"La Huerta del' + ' Sur","delivery":"pickup","distance_km":3.2,"freshness_minutes":2},{"id":"lst_dup","title":"Free' + ' range eggs","farm":"Santa' + ' Elena","delivery":"delivery","distance_km":8.7,"freshness_minutes":18}]}}' ) assert_true(not response["ok"].bool_value()) assert_equal(response["error"]["code"].string_value(), "invalid_request") assert_true( - response["error"]["message"].string_value().find("duplicate candidate id") + response["error"]["message"] + .string_value() + .find("duplicate candidate id") >= 0 ) @@ -152,81 +165,85 @@ def test_missing_input_fails_explicitly() raises: assert_true(not response["ok"].bool_value()) assert_equal(response["error"]["code"].string_value(), "invalid_request") assert_true( - response["error"]["message"].string_value().find("field 'input' is required") + response["error"]["message"] + .string_value() + .find("field 'input' is required") >= 0 ) def test_internal_error_is_bounded_on_wire() raises: - var response = run_stdio_entrypoint( - "tests/internal_error_stdio_main.mojo", - '{"version":1,"request_id":"status-internal-proc-1","trace_id":"trace-status-internal-proc-1","capability":"sys.status","input":{}}', - ) + with TemporaryDirectory() as temp_dir: + with ScopedEnvVar(HYF_PATHS_PROFILE_ENV, "repo_local"): + with ScopedEnvVar(HYF_PATHS_REPO_LOCAL_ROOT_ENV, temp_dir): + var response = run_stdio_entrypoint( + "tests/internal_error_stdio_main.mojo", + '{"version":1,"request_id":"status-internal-proc-1","trace_id":"trace-status-internal-proc-1","capability":"sys.status","input":{}}', + ) - assert_equal(Int(response["version"].int_value()), 1) - assert_equal( - response["request_id"].string_value(), - "status-internal-proc-1", - ) - assert_equal( - response["trace_id"].string_value(), - "trace-status-internal-proc-1", - ) - assert_true(not response["ok"].bool_value()) - assert_equal( - response["error"]["code"].string_value(), "internal_error" - ) - assert_equal( - response["error"]["message"].string_value(), - _EXPECTED_INTERNAL_ERROR_MESSAGE, - ) - assert_true( - response["error"]["message"].string_value().find("simulated test-only") - < 0 - ) + assert_equal(Int(response["version"].int_value()), 1) + assert_equal( + response["request_id"].string_value(), + "status-internal-proc-1", + ) + assert_equal( + response["trace_id"].string_value(), + "trace-status-internal-proc-1", + ) + assert_true(not response["ok"].bool_value()) + assert_equal( + response["error"]["code"].string_value(), "internal_error" + ) + assert_equal( + response["error"]["message"].string_value(), + _EXPECTED_INTERNAL_ERROR_MESSAGE, + ) + assert_true( + response["error"]["message"] + .string_value() + .find("simulated test-only") + < 0 + ) -def test_internal_error_records_detail_in_explicit_diagnostics_dir() raises: +def test_internal_error_records_detail_in_canonical_runtime_diagnostics_dir() raises: with TemporaryDirectory() as temp_dir: - var diagnostics_dir = Path(temp_dir) / "hyf-internal-diagnostics" - with ScopedEnvVar( - HYF_DIAGNOSTICS_DIR_ENV, diagnostics_dir.__fspath__() - ): - var response = run_stdio_entrypoint( - "tests/internal_error_stdio_main.mojo", - '{"version":1,"request_id":"status-internal-proc-diag-1","trace_id":"trace-status-internal-proc-diag-1","capability":"sys.status","input":{}}', - ) - - assert_true(not response["ok"].bool_value()) - assert_equal( - response["error"]["code"].string_value(), - "internal_error", - ) - assert_true(exists(diagnostics_dir)) - - var entries = std.os.listdir(diagnostics_dir) - assert_equal(len(entries), 1) - assert_true(entries[0].startswith("hyf-internal-error-pid-")) - - var content = (diagnostics_dir / entries[0]).read_text() - assert_true( - content.find( - 'request_id="status-internal-proc-diag-1"' + var diagnostics_dir = ( + Path(temp_dir) / "logs" / "services" / "hyf" / "diagnostics" + ) + with ScopedEnvVar(HYF_PATHS_PROFILE_ENV, "repo_local"): + with ScopedEnvVar(HYF_PATHS_REPO_LOCAL_ROOT_ENV, temp_dir): + var response = run_stdio_entrypoint( + "tests/internal_error_stdio_main.mojo", + '{"version":1,"request_id":"status-internal-proc-diag-1","trace_id":"trace-status-internal-proc-diag-1","capability":"sys.status","input":{}}', + ) + + assert_true(not response["ok"].bool_value()) + assert_equal( + response["error"]["code"].string_value(), + "internal_error", + ) + assert_true(exists(diagnostics_dir)) + + var entries = std.os.listdir(diagnostics_dir) + assert_equal(len(entries), 1) + assert_true(entries[0].startswith("hyf-internal-error-pid-")) + + var content = (diagnostics_dir / entries[0]).read_text() + assert_true( + content.find('request_id="status-internal-proc-diag-1"') + >= 0 ) - >= 0 - ) - assert_true( - content.find( - 'trace_id="trace-status-internal-proc-diag-1"' + assert_true( + content.find('trace_id="trace-status-internal-proc-diag-1"') + >= 0 ) - >= 0 - ) - assert_true( - content.find( - 'detail="simulated test-only status builder failure"' + assert_true( + content.find( + 'detail="simulated test-only status builder failure"' + ) + >= 0 ) - >= 0 - ) def main() raises: