Skip to content

Commit bdabc54

Browse files
committed
merge latest refactoring and improve test coverage
2 parents f37879c + bb1ed5f commit bdabc54

15 files changed

Lines changed: 226 additions & 367 deletions

File tree

src/omen/analysis/actor/__init__.py

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,11 @@
33
from __future__ import annotations
44

55
from .query import build_events_snapshot, build_status_snapshot, snapshot_by_year
6-
7-
8-
def generate_persona_insight(*args, **kwargs):
9-
from .insight import generate_persona_insight as _generate_persona_insight
10-
11-
return _generate_persona_insight(*args, **kwargs)
6+
from .insight import generate_persona_insight
127

138
__all__ = [
149
"build_events_snapshot",
1510
"build_status_snapshot",
1611
"generate_persona_insight",
1712
"snapshot_by_year",
18-
]
13+
]

src/omen/analysis/actor/formation.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ def extract_strategic_actor_identity(payload: dict[str, Any]) -> tuple[str, str]
151151
)
152152

153153

154-
def extract_strategic_actor_style_payload(payload: dict[str, Any]) -> dict[str, Any]:
154+
def strategic_style(payload: dict[str, Any]) -> dict[str, Any]:
155155
strategic_actor = find_strategic_actor(payload)
156156
profile = strategic_actor.get("profile") or {}
157157
style = profile.get("strategic_style") or {}

src/omen/cli/main.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@
4343
)
4444
from omen.simulation.engine import run_simulation
4545
from omen.simulation.deterministic import (
46-
try_run_deterministic_compare_from_scenario_input,
47-
try_run_deterministic_simulate_from_scenario_input,
46+
run_compare,
47+
run_simulate_with_actor,
4848
)
4949
from omen.simulation.precision_gate import evaluate_precision_gates
5050
from omen.simulation.precision_metrics import evaluate_repeatability
@@ -397,7 +397,7 @@ def _print_deferred_scope_message(exc: Exception) -> None:
397397

398398
if args.command == "simulate":
399399
try:
400-
deterministic_payload = try_run_deterministic_simulate_from_scenario_input(
400+
deterministic_payload = run_simulate_with_actor(
401401
scenario_path=args.scenario,
402402
actor_profile_ref=args.actor_profile_ref,
403403
calculation_policy_version=args.calc_policy_version,
@@ -440,7 +440,7 @@ def _print_deferred_scope_message(exc: Exception) -> None:
440440
print(f"Saved explanation to {output_path}")
441441
elif args.command == "compare":
442442
try:
443-
deterministic_payload = try_run_deterministic_compare_from_scenario_input(
443+
deterministic_payload = run_compare(
444444
scenario_path=args.scenario,
445445
actor_profile_ref=args.actor_profile_ref,
446446
calculation_policy_version=args.calc_policy_version,

src/omen/cli/situation.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
save_situation_artifact,
2121
save_situation_markdown,
2222
)
23-
from omen.scenario.planner import plan_scenarios_from_situation
23+
from omen.scenario.planner import from_situation
2424
from omen.scenario.planner import ScenarioDecompositionValidationError
2525
from omen.ingest.synthesizer.services.situation import (
2626
LLMJsonValidationAbort,
@@ -424,7 +424,7 @@ def handle_scenario_command(args: Any) -> int:
424424
else _resolve_splitter_default_output_path(situation_path, pack_id)
425425
)
426426

427-
ontology = plan_scenarios_from_situation(
427+
ontology = from_situation(
428428
situation_artifact=situation_artifact,
429429
pack_id=pack_id,
430430
pack_version=str(args.pack_version),

src/omen/ingest/synthesizer/builders/situation.py

Lines changed: 0 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,7 @@
22

33
from __future__ import annotations
44

5-
from datetime import datetime
65
from pathlib import Path
7-
from typing import Any
8-
9-
from omen.ingest.reporter.markdown import render_situation_brief
106
from omen.scenario.ingest_validator import DeferredScopeFeatureError
117

128

@@ -47,49 +43,6 @@ def validate_situation_source_or_raise(situation_file: str | Path) -> None:
4743
_validate_source_scope_or_raise(text)
4844

4945

50-
def build_scenario_ontology_from_situation_artifact(
51-
*,
52-
situation_artifact: dict[str, Any],
53-
llm_decomposition: dict[str, Any],
54-
pack_id: str,
55-
pack_version: str,
56-
) -> dict[str, Any]:
57-
from omen.scenario.planner import normalize_llm_scenarios_with_policy
58-
59-
scenarios = normalize_llm_scenarios_with_policy(
60-
list(llm_decomposition.get("scenarios") or []),
61-
source_hint=f"Derived from situation artifact: {situation_artifact.get('id', 'unknown')}",
62-
)
63-
source_meta = dict(llm_decomposition.get("source_meta") or {})
64-
source_meta.setdefault(
65-
"source_path",
66-
str((situation_artifact.get("source_meta") or {}).get("source_path") or ""),
67-
)
68-
source_meta.setdefault("generated_at", datetime.now().isoformat())
69-
source_meta["generated_from"] = "situation_artifact"
70-
71-
return {
72-
"pack_id": pack_id,
73-
"pack_version": pack_version,
74-
"derived_from_situation_id": str(situation_artifact.get("id") or "unknown"),
75-
"ontology_version": str(llm_decomposition.get("ontology_version") or "scenario_ontology_v1"),
76-
"planning_query_ref": str(llm_decomposition.get("planning_query_ref") or "traces/planning_query.json"),
77-
"prior_snapshot_ref": str(llm_decomposition.get("prior_snapshot_ref") or "traces/prior_snapshot.json"),
78-
"scenarios": scenarios,
79-
"source_meta": source_meta,
80-
}
81-
82-
83-
def situation_artifact_to_markdown(situation: dict[str, Any], config_path: str = "config/llm.toml") -> str:
84-
return render_situation_brief(situation, config_path=config_path)
85-
86-
87-
def scenario_ontology_to_deterministic_pack(ontology: dict) -> dict:
88-
from omen.ingest.synthesizer.services.scenario import scenario_ontology_to_deterministic
89-
90-
return scenario_ontology_to_deterministic(ontology)
91-
92-
9346
def scenario_ontology_to_markdown(ontology: dict) -> str:
9447
lines: list[str] = []
9548
lines.append(f"# Scenario Ontology: {ontology.get('derived_from_situation_id', 'unknown')}")

src/omen/ingest/synthesizer/services/scenario.py

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ def _is_filled_field(field_name: str, value: Any) -> bool:
123123
return bool(str(value or "").strip())
124124

125125

126-
def _assess_scenario_decomposition_quality(payload: dict[str, Any]) -> dict[str, Any]:
126+
def _assess_quality(payload: dict[str, Any]) -> dict[str, Any]:
127127
scenarios = payload.get("scenarios")
128128
coerced = _coerce_slot_payloads(scenarios)
129129
by_slot: dict[str, Any] = coerced["by_slot"]
@@ -181,7 +181,7 @@ def _assess_scenario_decomposition_quality(payload: dict[str, Any]) -> dict[str,
181181
}
182182

183183

184-
def _normalize_decomposition_payload(payload: dict[str, Any]) -> dict[str, Any]:
184+
def _normalize(payload: dict[str, Any]) -> dict[str, Any]:
185185
scenarios = payload.get("scenarios")
186186
normalized_scenarios: list[Any]
187187

@@ -235,7 +235,7 @@ def _normalize_decomposition_payload(payload: dict[str, Any]) -> dict[str, Any]:
235235
return payload
236236

237237

238-
def decompose_scenario_from_situation(
238+
def planning(
239239
*,
240240
situation_artifact: dict[str, Any],
241241
pack_id: str,
@@ -259,8 +259,8 @@ def decompose_scenario_from_situation(
259259
config_path=config_path,
260260
stage="situation_decompose_prompt",
261261
)
262-
payload = _normalize_decomposition_payload(payload)
263-
quality = _assess_scenario_decomposition_quality(payload)
262+
payload = _normalize(payload)
263+
quality = _assess_quality(payload)
264264

265265
retries = 0
266266
if quality["schema_completeness_ratio"] < 0.5:
@@ -275,8 +275,8 @@ def decompose_scenario_from_situation(
275275
config_path=config_path,
276276
stage="situation_decompose_prompt",
277277
)
278-
payload = _normalize_decomposition_payload(payload)
279-
quality = _assess_scenario_decomposition_quality(payload)
278+
payload = _normalize(payload)
279+
quality = _assess_quality(payload)
280280
retries = 1
281281

282282
payload.setdefault("pack_id", pack_id)
@@ -299,14 +299,14 @@ def decompose_scenario_from_situation(
299299
return payload
300300

301301

302-
def load_scenario_ontology_slice_payload(path: str | Path) -> dict[str, Any]:
302+
def load(path: str | Path) -> dict[str, Any]:
303303
scenario_path = Path(path)
304304
payload = json.loads(scenario_path.read_text(encoding="utf-8"))
305305
validated = validate_scenario_ontology_slice_or_raise(payload)
306306
return validated.model_dump()
307307

308308

309-
def scenario_ontology_to_deterministic(ontology: dict[str, Any]) -> dict[str, Any]:
309+
def pack(ontology: dict[str, Any]) -> dict[str, Any]:
310310
scenarios: list[dict[str, Any]] = []
311311
for scenario in ontology.get("scenarios", []):
312312
if not isinstance(scenario, dict):
@@ -336,9 +336,9 @@ def scenario_ontology_to_deterministic(ontology: dict[str, Any]) -> dict[str, An
336336
}
337337

338338

339-
def prepare_deterministic_inputs_from_scenario(path: str | Path) -> tuple[dict[str, Any], dict[str, dict[str, Any]]]:
340-
ontology = load_scenario_ontology_slice_payload(path)
341-
deterministic_pack = scenario_ontology_to_deterministic(ontology)
339+
def prepare(path: str | Path) -> tuple[dict[str, Any], dict[str, dict[str, Any]]]:
340+
ontology = load(path)
341+
deterministic_pack = pack(ontology)
342342
validated_pack = validate_deterministic_scenario_pack_or_raise(deterministic_pack)
343343
planned_scenarios = {
344344
str(item.get("scenario_key") or ""): dict(item)

src/omen/ingest/validators/scenario.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,26 @@ def is_scenario_ontology_input_path(path: str | Path) -> bool:
9292
return is_scenario_ontology_input_payload(payload)
9393

9494

95+
def is_situation_planned_scenario_payload(payload: Any) -> bool:
96+
if not is_scenario_ontology_input_payload(payload):
97+
return False
98+
if not isinstance(payload, dict):
99+
return False
100+
101+
situation_id = str(payload.get("derived_from_situation_id") or "").strip()
102+
planning_query_ref = str(payload.get("planning_query_ref") or "").strip()
103+
prior_snapshot_ref = str(payload.get("prior_snapshot_ref") or "").strip()
104+
return bool(situation_id and planning_query_ref and prior_snapshot_ref)
105+
106+
107+
def is_situation_planned_scenario_path(path: str | Path) -> bool:
108+
try:
109+
payload = json.loads(Path(path).read_text(encoding="utf-8"))
110+
except Exception:
111+
return False
112+
return is_situation_planned_scenario_payload(payload)
113+
114+
95115
class ResultArtifactContract(BaseModel):
96116
scenario_id: str = Field(min_length=1)
97117
outcome_class: str = Field(min_length=1)

src/omen/scenario/loader.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88

99
from omen.ingest.synthesizer.builders.situation import (
1010
scenario_ontology_to_markdown,
11-
situation_artifact_to_markdown,
1211
)
12+
from omen.ingest.reporter.markdown import render_situation_brief
1313
from omen.ingest.validators.scenario import (
1414
ScenarioConfig,
1515
validate_case_package_or_raise,
@@ -122,7 +122,7 @@ def save_situation_markdown(path: str | Path, payload: dict[str, Any], config_pa
122122
output_path = Path(path)
123123
validated = validate_situation_artifact_or_raise(payload)
124124
output_path.parent.mkdir(parents=True, exist_ok=True)
125-
markdown = situation_artifact_to_markdown(validated.model_dump(), config_path=config_path)
125+
markdown = render_situation_brief(validated.model_dump(), config_path=config_path)
126126
output_path.write_text(markdown, encoding="utf-8")
127127
return output_path
128128

0 commit comments

Comments
 (0)