"""Scenario — the named retrofit brief the Modelling stage scores against. Built by a user in the scenario-builder UI and persisted before any modelling fires; the pipeline is handed only its id and reads it back via a `ScenarioRepository`. This is the thin slice the Modelling stage uses today: the goal + budget that the Optimiser will consume (#1160) and `is_default` (which drives `plan.is_default`). The legacy file-path / portfolio-aggregate columns are not modelled. Carries no phases — multi-phase is deferred (ADR-0005). See CONTEXT.md. """ from dataclasses import dataclass from typing import Optional @dataclass(frozen=True) class Scenario: """A retrofit brief: its goal, optional budget, and whether it is the Property's default Scenario. `goal` / `goal_value` are the lodged target (e.g. "INCREASING_EPC" → band "C"); carried for the Optimiser, not yet enforced.""" id: int goal: str goal_value: str budget: Optional[float] is_default: bool