Mission state for pydantic-graph.
@notice: |
Mission state for pydantic-graph.
@dev: |
See module for implementation details and extension points.
@graph:
id: agent_k.mission.state
provides:
- agent_k.mission.state:MissionState
- agent_k.mission.state:MissionResult
- agent_k.mission.state:GraphContext
pattern: mission-state
@similar:
- id: agent_k.mission.nodes
when: "Nodes drive phase transitions; this module holds state."
@agent-guidance:
do:
- "Use agent_k.mission.state as the canonical home for this capability."
do_not:
- "Create parallel modules without updating @similar or @graph."
@human-review:
last-verified: 2026-01-26
owners:
- agent-k-core
(c) Mike Casale 2025.
Licensed under the MIT License.
MissionState
Bases: BaseModel
State flowing through the mission graph.
@pattern:
name: mission-state
rationale: "Single source of truth for mission progression."
violations: "Phase-specific state stored elsewhere causes drift."
@concurrency:
model: asyncio
safe: false
reason: "Mutable state shared across graph nodes."
@invariants:
- "current_phase reflects the latest active phase."
- "phases_completed is append-only."
Source code in agent_k/mission/state.py
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103 | class MissionState(BaseModel):
"""State flowing through the mission graph.
@pattern:
name: mission-state
rationale: "Single source of truth for mission progression."
violations: "Phase-specific state stored elsewhere causes drift."
@concurrency:
model: asyncio
safe: false
reason: "Mutable state shared across graph nodes."
@invariants:
- "current_phase reflects the latest active phase."
- "phases_completed is append-only."
"""
model_config = ConfigDict(validate_assignment=True, arbitrary_types_allowed=True)
schema_version: str = Field(default=SCHEMA_VERSION, description="Schema version")
mission_id: MissionId = Field(description="Unique mission identifier")
competition_id: CompetitionId | None = Field(default=None, description="Selected competition id")
criteria: MissionCriteria = Field(default_factory=MissionCriteria, description="Mission selection criteria")
current_phase: MissionPhase = Field(default="discovery", description="Current mission phase")
phases_completed: list[MissionPhase] = Field(default_factory=list, description="Completed phases")
discovered_competitions: list[Competition] = Field(
default_factory=list, description="Competitions found during discovery"
)
selected_competition: Competition | None = Field(default=None, description="Competition selected for execution")
research_findings: ResearchFindings | None = Field(
default=None, description="Research findings from scientist phase"
)
prototype_code: str | None = Field(default=None, description="Prototype solution code")
prototype_score: float | None = Field(default=None, description="Prototype evaluation score")
evolution_state: EvolutionState | None = Field(default=None, description="Evolution phase state")
final_submission_id: str | None = Field(default=None, description="Final submission identifier")
final_score: float | None = Field(default=None, description="Final leaderboard score")
final_rank: int | None = Field(default=None, description="Final leaderboard rank")
errors: list[dict[str, Any]] = Field(default_factory=list, description="Collected error details")
started_at: datetime = Field(default_factory=lambda: datetime.now(UTC), description="Mission start time")
phase_started_at: datetime | None = Field(default=None, description="Current phase start time")
memory: MemoryState = Field(default_factory=MemoryState, description="Mission memory state")
phases: list[PhasePlan] = Field(default_factory=list, description="Phase plans for UI display")
current_task_id: TaskId | None = Field(default=None, description="Current task identifier")
overall_progress: float = Field(default=0.0, ge=0.0, le=100.0, description="Overall mission progress (percentage)")
|
MissionResult
Bases: BaseModel
Final result of mission execution.
@pattern:
name: output-model
rationale: "Stable schema for mission results."
violations: "Ad-hoc outputs hinder UI/reporting."
Source code in agent_k/mission/state.py
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126 | class MissionResult(BaseModel):
"""Final result of mission execution.
@pattern:
name: output-model
rationale: "Stable schema for mission results."
violations: "Ad-hoc outputs hinder UI/reporting."
"""
model_config = ConfigDict(frozen=True)
schema_version: str = Field(default=SCHEMA_VERSION, description="Schema version")
success: bool = Field(..., description="Whether mission completed successfully")
mission_id: MissionId = Field(..., description="Mission identifier")
competition_id: CompetitionId | None = Field(default=None, description="Competition identifier")
final_rank: int | None = Field(default=None, description="Final leaderboard rank")
final_score: float | None = Field(default=None, description="Final leaderboard score")
total_submissions: int = Field(default=0, description="Number of submissions made")
evolution_generations: int = Field(default=0, description="Evolution generations completed")
duration_ms: int = Field(default=0, description="Mission duration in milliseconds")
phases_completed: list[MissionPhase] = Field(default_factory=list, description="Phases completed during mission")
error_message: str | None = Field(default=None, description="Error message when mission fails")
|
GraphContext
dataclass
Context passed to graph execution.
@pattern:
name: dependency-container
rationale: "Bundles runtime services for graph execution."
violations: "Hidden globals make graph runs brittle."
Source code in agent_k/mission/state.py
129
130
131
132
133
134
135
136
137
138
139
140
141
142 | @dataclass(slots=True)
class GraphContext:
"""Context passed to graph execution.
@pattern:
name: dependency-container
rationale: "Bundles runtime services for graph execution."
violations: "Hidden globals make graph runs brittle."
"""
event_emitter: EventEmitter | None = None
http_client: httpx.AsyncClient | None = None
platform_adapter: PlatformAdapter | None = None
agents: dict[str, Agent[Any, Any]] | None = None
|