#region: Project Context (Phase 2 dataclasses for cruft_elimination_20260627) @dataclass(frozen=True, slots=True) class ProjectMeta: name: str = "" summary_only: bool = False execution_mode: str = "standard" @dataclass(frozen=True, slots=True) class ProjectOutput: namespace: str = "project" output_dir: str = "" @dataclass(frozen=True, slots=True) class ProjectFiles: base_dir: str = "" paths: tuple[str, ...] = () @dataclass(frozen=True, slots=True) class ProjectScreenshots: base_dir: str = "." paths: tuple[str, ...] = () @dataclass(frozen=True, slots=True) class ProjectDiscussion: roles: tuple[str, ...] = () history: tuple[str, ...] = () @dataclass(frozen=True, slots=True) class ProjectContext: """Typed return type for project_manager.flat_config(). Replaces the dict[str, Any] that flat_config() returned. Per conductor/tracks/cruft_elimination_20260627/SPEC_CORRECTION_phase_2.md.""" project: ProjectMeta = field(default_factory=ProjectMeta) output: ProjectOutput = field(default_factory=ProjectOutput) files: ProjectFiles = field(default_factory=ProjectFiles) screenshots: ProjectScreenshots = field(default_factory=ProjectScreenshots) context_presets: Metadata = field(default_factory=dict) discussion: ProjectDiscussion = field(default_factory=ProjectDiscussion) def to_dict(self) -> Metadata: return { "project": { "name": self.project.name, "summary_only": self.project.summary_only, "execution_mode": self.project.execution_mode, }, "output": { "namespace": self.output.namespace, "output_dir": self.output.output_dir, }, "files": { "base_dir": self.files.base_dir, "paths": list(self.files.paths), }, "screenshots": { "base_dir": self.screenshots.base_dir, "paths": list(self.screenshots.paths), }, "context_presets": dict(self.context_presets), "discussion": { "roles": list(self.discussion.roles), "history": list(self.discussion.history), }, } def __getitem__(self, key: str) -> Any: return self.to_dict()[key] def get(self, key: str, default: Any = None) -> Any: return self.to_dict().get(key, default) EMPTY_PROJECT_CONTEXT: ProjectContext = ProjectContext() #endregion: Project Context