"""Canonical paths for the integrated behavioral-fingerprinting component.""" from __future__ import annotations from pathlib import Path from ...paths import PROFILE_RESULTS_ROOT, PROJECT_ROOT, model_profile_path SOURCE_DIR = Path(__file__).resolve().parent WORKSPACE_ROOT = PROJECT_ROOT INPUT_DATA_ROOT = WORKSPACE_ROOT / "data" / "model-preference" / "behavioral-fingerprinting" PROMPTS_DIR = INPUT_DATA_ROOT / "AI-comm-records" # All generated artifacts live together, separate from immutable input data. OUTPUT_ROOT = PROFILE_RESULTS_ROOT / "model-preference" / "behavioral-fingerprinting" RESULTS_DIR = OUTPUT_ROOT / "responses" EVALUATIONS_DIR = OUTPUT_ROOT / "evaluations" ARTIFACTS_DIR = OUTPUT_ROOT / "artifacts" CHARTS_DIR = ARTIFACTS_DIR / "charts" REPORTS_DIR = ARTIFACTS_DIR / "reports" # Canonical Profile JSON files sit directly below model-preference by model. PROFILES_DIR = PROFILE_RESULTS_ROOT / "model-preference" def workspace_relative(path: Path) -> str | None: """Return a stable workspace-relative path for an existing artifact.""" if not path.exists(): return None try: return str(path.relative_to(WORKSPACE_ROOT)) except ValueError: return str(path)