150 lines
5.2 KiB
Python
150 lines
5.2 KiB
Python
|
|
import json
|
||
|
|
from pathlib import Path
|
||
|
|
|
||
|
|
from phase_memory.ops_warden import (
|
||
|
|
OPS_WARDEN_ACTIVATION_SCHEMA,
|
||
|
|
OPS_WARDEN_MEMORY_STATUS_SCHEMA,
|
||
|
|
OPS_WARDEN_PROFILE_ID,
|
||
|
|
OPS_WARDEN_RUNTIME_SCHEMA,
|
||
|
|
OPS_WARDEN_SESSION_EVENT_SCHEMA,
|
||
|
|
activate_ops_warden_memory,
|
||
|
|
build_session_event,
|
||
|
|
memory_enabled,
|
||
|
|
ops_warden_adapter_pack,
|
||
|
|
ops_warden_coordination_profile,
|
||
|
|
ops_warden_evaluation_metrics,
|
||
|
|
record_session_event,
|
||
|
|
resolve_session_kind,
|
||
|
|
session_kind_for_agent,
|
||
|
|
stabilized_route_match,
|
||
|
|
validate_memory_write,
|
||
|
|
validate_ops_warden_profile,
|
||
|
|
)
|
||
|
|
from phase_memory.external_adapters import validate_adapter_pack_manifest
|
||
|
|
|
||
|
|
FIXTURES = Path(__file__).parent / "fixtures"
|
||
|
|
|
||
|
|
|
||
|
|
def test_ops_warden_profile_validates_with_activation_budget() -> None:
|
||
|
|
profile = ops_warden_coordination_profile(FIXTURES / "ops-warden-coordination-profile.json")
|
||
|
|
validation = validate_ops_warden_profile(profile)
|
||
|
|
|
||
|
|
assert profile["id"] == OPS_WARDEN_PROFILE_ID
|
||
|
|
assert profile["policy"]["secrets_allowed"] is False
|
||
|
|
assert validation["valid"] is True
|
||
|
|
|
||
|
|
|
||
|
|
def test_validate_memory_write_rejects_secret_like_payload() -> None:
|
||
|
|
ok, diagnostics = validate_memory_write(
|
||
|
|
{
|
||
|
|
"command": "access",
|
||
|
|
"outcome": "resolved",
|
||
|
|
"metadata": {"token": "super-secret-token"},
|
||
|
|
}
|
||
|
|
)
|
||
|
|
|
||
|
|
assert ok is False
|
||
|
|
assert diagnostics[0].code == "ops_warden_memory_secret_field_rejected"
|
||
|
|
|
||
|
|
|
||
|
|
def test_session_kind_supports_known_and_future_agents() -> None:
|
||
|
|
assert session_kind_for_agent("grok") == "warden.agent.grok"
|
||
|
|
assert session_kind_for_agent(None) == "warden.operator"
|
||
|
|
assert resolve_session_kind({"WARDEN_AGENT_ID": "claude"}) == "warden.agent.claude"
|
||
|
|
assert resolve_session_kind({"WARDEN_SESSION_KIND": "warden.worker"}) == "warden.worker"
|
||
|
|
|
||
|
|
|
||
|
|
def test_record_and_activate_ops_warden_memory_round_trip(tmp_path) -> None:
|
||
|
|
store = tmp_path / "memory"
|
||
|
|
record_session_event(
|
||
|
|
store,
|
||
|
|
build_session_event(
|
||
|
|
command="route find",
|
||
|
|
session_kind="warden.agent.grok",
|
||
|
|
outcome="resolved",
|
||
|
|
need="openrouter api key",
|
||
|
|
route_id="openrouter-llm-connect",
|
||
|
|
agent_id="grok",
|
||
|
|
session_id="sess-1",
|
||
|
|
),
|
||
|
|
)
|
||
|
|
record_session_event(
|
||
|
|
store,
|
||
|
|
build_session_event(
|
||
|
|
command="route find",
|
||
|
|
session_kind="warden.agent.grok",
|
||
|
|
outcome="resolved",
|
||
|
|
need="openrouter api key",
|
||
|
|
route_id="openrouter-llm-connect",
|
||
|
|
agent_id="grok",
|
||
|
|
session_id="sess-1",
|
||
|
|
),
|
||
|
|
)
|
||
|
|
|
||
|
|
activation = activate_ops_warden_memory(
|
||
|
|
store,
|
||
|
|
session_kind="warden.worker",
|
||
|
|
need="openrouter api key",
|
||
|
|
session_id="worker-1",
|
||
|
|
)
|
||
|
|
|
||
|
|
assert activation["schema_version"] == OPS_WARDEN_ACTIVATION_SCHEMA
|
||
|
|
assert activation["stabilized_route"]["route_id"] == "openrouter-llm-connect"
|
||
|
|
assert activation["llm_calls_avoided"] is True
|
||
|
|
|
||
|
|
|
||
|
|
def test_cross_runtime_continuity_is_visible_to_worker_activation(tmp_path) -> None:
|
||
|
|
store = tmp_path / "memory"
|
||
|
|
record_session_event(
|
||
|
|
store,
|
||
|
|
build_session_event(
|
||
|
|
command="route find",
|
||
|
|
session_kind="warden.agent.codex",
|
||
|
|
outcome="resolved",
|
||
|
|
need="npm token",
|
||
|
|
route_id="openbao-api-key",
|
||
|
|
agent_id="codex",
|
||
|
|
),
|
||
|
|
)
|
||
|
|
activation = activate_ops_warden_memory(store, session_kind="warden.worker", need="npm token")
|
||
|
|
|
||
|
|
kinds = {item.get("session_kind") for item in activation["selected_episodes"] if item.get("kind") == "episode"}
|
||
|
|
assert "warden.agent.codex" in kinds
|
||
|
|
|
||
|
|
|
||
|
|
def test_ops_warden_evaluation_metrics_and_adapter_pack() -> None:
|
||
|
|
scenarios = json.loads((FIXTURES / "ops-warden-evaluation-scenarios.json").read_text(encoding="utf-8"))
|
||
|
|
events = scenarios["scenarios"][0]["events"]
|
||
|
|
metrics = ops_warden_evaluation_metrics(events)
|
||
|
|
pack = ops_warden_adapter_pack()
|
||
|
|
diagnostics = validate_adapter_pack_manifest(pack)
|
||
|
|
|
||
|
|
assert metrics["cross_runtime_continuity"] == 1.0
|
||
|
|
assert metrics["routing_repeat_accuracy"] > 0
|
||
|
|
assert not any(item.severity == "error" for item in diagnostics)
|
||
|
|
assert pack.name == "ops-warden-coordination"
|
||
|
|
|
||
|
|
|
||
|
|
def test_stabilized_route_match_requires_confirmations() -> None:
|
||
|
|
events = [
|
||
|
|
{"need_fingerprint": "abc", "route_id": "openbao-api-key", "outcome": "resolved"},
|
||
|
|
{"need_fingerprint": "abc", "route_id": "openbao-api-key", "outcome": "resolved"},
|
||
|
|
]
|
||
|
|
|
||
|
|
assert stabilized_route_match(events, need_fingerprint_value="abc")["route_id"] == "openbao-api-key"
|
||
|
|
assert stabilized_route_match(events[:1], need_fingerprint_value="abc") is None
|
||
|
|
|
||
|
|
|
||
|
|
def test_memory_enabled_honors_opt_out() -> None:
|
||
|
|
assert memory_enabled({"WARDEN_MEMORY": "1"}) is True
|
||
|
|
assert memory_enabled({"WARDEN_MEMORY": "0"}) is False
|
||
|
|
|
||
|
|
|
||
|
|
def test_ops_warden_evaluation_report_passes_fixture_scenarios() -> None:
|
||
|
|
from phase_memory.ops_warden import ops_warden_evaluation_report
|
||
|
|
|
||
|
|
scenarios = json.loads((FIXTURES / "ops-warden-evaluation-scenarios.json").read_text(encoding="utf-8"))
|
||
|
|
report = ops_warden_evaluation_report(scenarios)
|
||
|
|
|
||
|
|
assert report["valid"] is True
|
||
|
|
assert report["metrics"]["scenario_count"] == 3
|