import json from pathlib import Path from phase_memory.activation import activation_action, plan_activation from phase_memory.contracts import graph_from_markitect from phase_memory.models import LifecycleActionKind def test_activation_planner_emits_markitect_selection_under_budget() -> None: graph_data = json.loads((Path(__file__).parent / "fixtures" / "memory-graph.json").read_text(encoding="utf-8")) graph = graph_from_markitect(graph_data).value plan = plan_activation( graph, max_items=2, max_tokens=18, profile_id="phase-memory-fixture-profile", priority_node_ids=("decision.boundary",), ) assert plan.selected_node_ids[0] == "decision.boundary" assert len(plan.selected_node_ids) <= 2 assert plan.token_estimate <= 18 assert plan.selection["schema_version"] == "markitect.memory.selection.v1" assert plan.selection["profile"] == "phase-memory-fixture-profile" assert plan.omitted def test_activation_action_wraps_selection_for_context_package_boundary() -> None: graph = graph_from_markitect(json.loads((Path(__file__).parent / "fixtures" / "memory-graph.json").read_text(encoding="utf-8"))).value plan = plan_activation(graph, max_items=1, max_tokens=20) action = activation_action(plan) assert action.action == LifecycleActionKind.ACTIVATE assert action.metadata["selection"]["id"] == plan.plan_id