Add profile-driven runtime adapter resolution

This commit is contained in:
2026-05-18 20:53:16 +02:00
parent 850979ccf1
commit b36a935f48
6 changed files with 618 additions and 19 deletions

View File

@@ -1,3 +1,6 @@
import json
from pathlib import Path
from phase_memory.models import LifecycleState, MemoryNode
from phase_memory.service import (
HEALTH_REPORT_SCHEMA,
@@ -15,9 +18,17 @@ from phase_memory.service import (
default_conformance_adapters,
health_report,
kontextual_delegation_envelope,
resolve_runtime_adapters,
runtime_from_config,
service_contracts,
)
FIXTURES = Path(__file__).parent / "fixtures"
def _load(name: str):
return json.loads((FIXTURES / name).read_text(encoding="utf-8"))
def test_service_contracts_list_runtime_operations() -> None:
contracts = service_contracts()
@@ -47,6 +58,61 @@ def test_service_runner_handles_health() -> None:
assert response["ok"] is True
def test_profile_driven_runtime_config_resolves_file_backed_adapters(tmp_path) -> None:
config = RuntimeConfig.from_profile(
{
"schema_version": "markitect.memory.profile.v1",
"id": "profile.config",
"stores": {
"graph_store": "file",
"event_log": "jsonl",
},
"activation": {"semantic_index": "memory"},
"policy": {"mode": "allow-all", "trust_zones": ["local", "team"]},
"observability": {"audit_sink": "jsonl", "runtime_registry": "memory"},
"metadata": {"runtime": {"local_store_path": str(tmp_path / "memory-store")}},
}
)
bundle = resolve_runtime_adapters(config)
runtime = runtime_from_config(config)
runtime.graph_store.save_node(MemoryNode("node.config", "decision", "Config-driven node"))
assert config.adapter_mode("graph_store") == "file"
assert config.adapter_mode("event_log") == "jsonl"
assert config.trust_zone_labels == ("local", "team")
assert bundle.to_dict()["graph_store"] == "FileBackedMemoryGraphStore"
assert bundle.to_dict()["event_log"] == "JsonlMemoryEventLog"
assert bundle.to_dict()["semantic_index"] == "InMemorySemanticIndex"
assert (tmp_path / "memory-store" / "nodes" / "node.config.json").exists()
def test_runtime_config_from_fixture_profile_understands_local_aliases() -> None:
config = RuntimeConfig.from_profile(_load("memory-profile.json"), local_store_path=".phase-memory-test")
assert config.adapter_mode("graph_store") == "file"
assert config.adapter_mode("event_log") == "jsonl"
assert config.adapter_mode("package_compiler") == "noop"
assert config.trust_zone_labels == ("project-local",)
def test_missing_external_adapter_blocks_runtime_resolution() -> None:
registry = RuntimeConfig.local_default().adapter_registry.copy()
registry["policy_gateway"] = "external"
config = RuntimeConfig(adapter_registry=registry, policy_mode="external")
bundle = resolve_runtime_adapters(config)
assert "external_adapter_declared" in [diagnostic.code for diagnostic in bundle.diagnostics]
assert "missing_external_adapter" in [diagnostic.code for diagnostic in bundle.diagnostics]
try:
runtime_from_config(config)
except ValueError as exc:
assert "missing_external_adapter" in str(exc)
else:
raise AssertionError("runtime_from_config should require supplied external adapters")
def test_default_adapter_conformance_helpers() -> None:
adapters = default_conformance_adapters()