from __future__ import annotations from control_plane.agents.models import Agent, AgentRole, AgentVersion, PromotionStatus from control_plane.events.bus import EventBus from control_plane.events.models import Event, EventType from control_plane.projects.models import Milestone, Project, ProjectPlan, Task, TaskStatus def test_project_hierarchy_and_events_persist() -> None: project = Project.objects.create(name="Builder V1", goal="Bootstrap Artifex V1") plan = ProjectPlan.objects.create(project=project, version=1, goal=project.goal) milestone = Milestone.objects.create( project=project, plan=plan, key="M1", title="Control Plane", goal="Persist deterministic control-plane state", ) task = Task.objects.create( project=project, milestone=milestone, task_type="implementation", status=TaskStatus.READY, goal="Create persisted Event Bus", acceptance_criteria=["events are stored in PostgreSQL"], ) event = EventBus().publish(EventType.TASK_CREATED, project=project, task=task, actor="test") assert Project.objects.count() == 1 assert project.milestones.count() == 1 assert project.tasks.filter(status=TaskStatus.READY).count() == 1 assert Event.objects.get(id=event.id).event_type == EventType.TASK_CREATED def test_agent_registry_supports_independent_reviewer_and_judge() -> None: reviewer = Agent.objects.create(name="Reviewer", role=AgentRole.REVIEWER) judge = Agent.objects.create(name="Project Judge", role=AgentRole.PROJECT_JUDGE) reviewer_version = AgentVersion.objects.create( agent=reviewer, version=1, model="qwen", system_contract="Review implementation quality.", promotion_status=PromotionStatus.CHAMPION, ) judge_version = AgentVersion.objects.create( agent=judge, version=1, model="qwen", system_contract="Decide whether acceptance contracts pass.", promotion_status=PromotionStatus.CHAMPION, ) assert reviewer_version.agent.role == AgentRole.REVIEWER assert judge_version.agent.role == AgentRole.PROJECT_JUDGE assert reviewer_version.id != judge_version.id