feat(project): .icceryproj index over basename and cwd + recipe + last ΔE (#149) #154

Merged
gronod merged 1 commits from feat/149-project-file into milestone/m10-studio 2026-09-13 11:30:00 +01:00
Owner

Refs #149

Summary

  • .icceryproj v1 JSON index (ICCeryProject): basename + cwd + optional media_recipe_id / preset_id / calibration_url / printer fields + last_verification ΔE₀₀ snapshot. Strict schema: schema_version != 1 throws before any field is applied; corrupt files are preserved.
  • The project is never a second source of truth: open writes WizardState and re-probes via the existing windowDidBecomeKey path — JSON-vs-disk drift surfaces as the projectChipStale chip state + info banner, never as gating.
  • RecentProjectsStore (recent_projects.json in app data): cap 20, dedupe by path, bookmark+path entries, missing files pruned on submenu build, Clear Menu wipes the recents file only.
  • ProjectSession view model: New/Open/Save/Save As/Close/Save Report flows, dirty tracking with a window title, dirty-gate alert, missing-cwd relocate sheet. Live CAL_ basenames resolve the persisted original or refuse with a banner — CAL_ is never persisted.
  • File menu commands on the existing WindowGroup + a compact sidebar project chip (no new large buttons). Dedicated selectProjectFile / selectProjectSavePath pickers; UITestHooks inject all panel results.

Tests

  • New: ICCeryProjectTests, RecentProjectsStoreTests, ProjectSessionTests, Milestone10ProjectUITests.
  • Targeted gate: all selected unit suites + Milestone10ProjectUITests (4) + AboutHelpUITests (2) — pass, UI tests execute (no attach-skip).
  • Full host-arch suite: ICCeryCoreTests 439/439; ICCeryUITests 48/49 — testSpotReadButtonDisabledDuringChartread timed out once on the mock chartread calibrate prompt and passes standalone (timing flake, unrelated).
  • git diff --check clean; no secrets; Media/Spot/Gamut implementation files untouched (Sidebar/Root observation wiring only).
Refs #149 ## Summary - `.icceryproj` v1 JSON index (`ICCeryProject`): basename + cwd + optional `media_recipe_id` / `preset_id` / `calibration_url` / printer fields + `last_verification` ΔE₀₀ snapshot. Strict schema: `schema_version != 1` throws before any field is applied; corrupt files are preserved. - The project is never a second source of truth: open writes `WizardState` and re-probes via the existing `windowDidBecomeKey` path — JSON-vs-disk drift surfaces as the `projectChipStale` chip state + info banner, never as gating. - `RecentProjectsStore` (`recent_projects.json` in app data): cap 20, dedupe by path, bookmark+path entries, missing files pruned on submenu build, Clear Menu wipes the recents file only. - `ProjectSession` view model: New/Open/Save/Save As/Close/Save Report flows, dirty tracking with a `•` window title, dirty-gate alert, missing-cwd relocate sheet. Live `CAL_` basenames resolve the persisted original or refuse with a banner — `CAL_` is never persisted. - File menu commands on the existing `WindowGroup` + a compact sidebar project chip (no new large buttons). Dedicated `selectProjectFile` / `selectProjectSavePath` pickers; `UITestHooks` inject all panel results. ## Tests - New: `ICCeryProjectTests`, `RecentProjectsStoreTests`, `ProjectSessionTests`, `Milestone10ProjectUITests`. - Targeted gate: all selected unit suites + `Milestone10ProjectUITests` (4) + `AboutHelpUITests` (2) — pass, UI tests execute (no attach-skip). - Full host-arch suite: `ICCeryCoreTests` 439/439; `ICCeryUITests` 48/49 — `testSpotReadButtonDisabledDuringChartread` timed out once on the mock chartread calibrate prompt and passes standalone (timing flake, unrelated). - `git diff --check` clean; no secrets; Media/Spot/Gamut implementation files untouched (Sidebar/Root observation wiring only).
gronod added 1 commit 2026-09-13 11:29:29 +01:00
Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
gronod self-assigned this 2026-09-13 11:29:35 +01:00
gronod added this to the M10 — Studio workflow (media library, gamut compare, spot-read, projects) milestone 2026-09-13 11:29:35 +01:00
gronod merged commit c39afe0dfd into milestone/m10-studio 2026-09-13 11:30:00 +01:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: gronod/iccery-v2-mac#154