Implements Milestone 2 (issues #7–#11) as a single commit on feat/7-targen-argv — the per-issue branches were collapsed because the work is interleaved across TargetWorkflowViewModel, RootView, and ProcessManager.
What's in it
#7 targen: TargenConfig + TargenArgs argv builder (-v -d 2/4, -f, -e, -B, optional advanced flags, CMYK-only -l 1–400, never -u), ArgyllRunner streaming over ProcessManager with ARGYLL_NOT_INTERACTIVE=1, Stage1View with disk-gated Generate and process log.
#8 resume: Open Existing → .ti1 resumes to Stage 2, .ti2 resumes to the Stage 3 shell with a persistent Resumed from .ti2 banner; .ti2 without its sibling .ti1 is rejected with a notice.
#9 printtarg: PrinttargConfig/PrinttargArgs (-v -u, -i, -p, deterministic -R 1 default, -r raster precedence, -t/-T + DPI, -K/-I builder support with CAL_ protection), Stage2View with instrument/page-size/bit-depth/DPI/layout-order/label controls, CM warning banner, stubbed disabled print panel (M3).
#10 manifest/gallery: PrinttargManifest Codable parsing of the pretty-printed event: manifest JSON from accumulated stdout, path-safe TIFF resolution, host-side TiffPreview PNG previews, per-page stubbed Print buttons, non-zero exit stays on Stage 2.
xcodebuild test -scheme ICCery -destination 'platform=macOS' ARCHS='arm64 x86_64' ONLY_ACTIVE_ARCH=NO — 124/124 Core tests (Swift Testing) + 11/11 Milestone2UITests (XCTest) pass. No hardware, no downloads, no $PATH lookup: UI tests use committed fixture sidecars at Tests/ICCeryUITests/Fixtures/bin/ and an isolated test root via ICCERY_TEST_ROOT/ICCERY_ARGYLL_BINARY_DIR.
Notable fixes found by UI-test bring-up
Container-level accessibilityIdentifier propagates to and overrides descendant identifiers — .accessibilityElement(children: .contain) added so child AX ids survive (also fixes VoiceOver).
ProcessError now conforms to LocalizedError so spawn failures surface the real posix_spawn reason.
XCTest-runner container allows read/write/stat but not exec — hence the committed fixture scripts.
Implements Milestone 2 (issues #7–#11) as a single commit on `feat/7-targen-argv` — the per-issue branches were collapsed because the work is interleaved across `TargetWorkflowViewModel`, `RootView`, and `ProcessManager`.
## What's in it
- **#7 targen**: `TargenConfig` + `TargenArgs` argv builder (`-v -d 2/4`, `-f`, `-e`, `-B`, optional advanced flags, CMYK-only `-l 1–400`, never `-u`), `ArgyllRunner` streaming over `ProcessManager` with `ARGYLL_NOT_INTERACTIVE=1`, `Stage1View` with disk-gated Generate and process log.
- **#8 resume**: Open Existing → `.ti1` resumes to Stage 2, `.ti2` resumes to the Stage 3 shell with a persistent `Resumed from .ti2` banner; `.ti2` without its sibling `.ti1` is rejected with a notice.
- **#9 printtarg**: `PrinttargConfig`/`PrinttargArgs` (`-v -u`, `-i`, `-p`, deterministic `-R 1` default, `-r` raster precedence, `-t`/`-T` + DPI, `-K`/`-I` builder support with `CAL_` protection), `Stage2View` with instrument/page-size/bit-depth/DPI/layout-order/label controls, CM warning banner, stubbed disabled print panel (M3).
- **#10 manifest/gallery**: `PrinttargManifest` Codable parsing of the pretty-printed `event: manifest` JSON from accumulated stdout, path-safe TIFF resolution, host-side `TiffPreview` PNG previews, per-page stubbed Print buttons, non-zero exit stays on Stage 2.
- **#11 presets**: typed `ProfilingPreset` + `PresetCatalog` (4 built-ins) + `PresetStore` with legacy `CustomPreset` migration, sidebar picker, save/manage dialogs, import/export, bidirectional DPI binding (draft → 150 dpi).
## Tests
`xcodebuild test -scheme ICCery -destination 'platform=macOS' ARCHS='arm64 x86_64' ONLY_ACTIVE_ARCH=NO` — **124/124 Core tests** (Swift Testing) + **11/11 `Milestone2UITests`** (XCTest) pass. No hardware, no downloads, no `$PATH` lookup: UI tests use committed fixture sidecars at `Tests/ICCeryUITests/Fixtures/bin/` and an isolated test root via `ICCERY_TEST_ROOT`/`ICCERY_ARGYLL_BINARY_DIR`.
## Notable fixes found by UI-test bring-up
- Container-level `accessibilityIdentifier` propagates to and overrides descendant identifiers — `.accessibilityElement(children: .contain)` added so child AX ids survive (also fixes VoiceOver).
- `ProcessError` now conforms to `LocalizedError` so spawn failures surface the real `posix_spawn` reason.
- XCTest-runner container allows read/write/stat but not `exec` — hence the committed fixture scripts.
🤖 Generated with [Devin](https://devin.ai)
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Implements Milestone 2 (issues #7–#11) as a single commit on
feat/7-targen-argv— the per-issue branches were collapsed because the work is interleaved acrossTargetWorkflowViewModel,RootView, andProcessManager.What's in it
TargenConfig+TargenArgsargv builder (-v -d 2/4,-f,-e,-B, optional advanced flags, CMYK-only-l 1–400, never-u),ArgyllRunnerstreaming overProcessManagerwithARGYLL_NOT_INTERACTIVE=1,Stage1Viewwith disk-gated Generate and process log..ti1resumes to Stage 2,.ti2resumes to the Stage 3 shell with a persistentResumed from .ti2banner;.ti2without its sibling.ti1is rejected with a notice.PrinttargConfig/PrinttargArgs(-v -u,-i,-p, deterministic-R 1default,-rraster precedence,-t/-T+ DPI,-K/-Ibuilder support withCAL_protection),Stage2Viewwith instrument/page-size/bit-depth/DPI/layout-order/label controls, CM warning banner, stubbed disabled print panel (M3).PrinttargManifestCodable parsing of the pretty-printedevent: manifestJSON from accumulated stdout, path-safe TIFF resolution, host-sideTiffPreviewPNG previews, per-page stubbed Print buttons, non-zero exit stays on Stage 2.ProfilingPreset+PresetCatalog(4 built-ins) +PresetStorewith legacyCustomPresetmigration, sidebar picker, save/manage dialogs, import/export, bidirectional DPI binding (draft → 150 dpi).Tests
xcodebuild test -scheme ICCery -destination 'platform=macOS' ARCHS='arm64 x86_64' ONLY_ACTIVE_ARCH=NO— 124/124 Core tests (Swift Testing) + 11/11Milestone2UITests(XCTest) pass. No hardware, no downloads, no$PATHlookup: UI tests use committed fixture sidecars atTests/ICCeryUITests/Fixtures/bin/and an isolated test root viaICCERY_TEST_ROOT/ICCERY_ARGYLL_BINARY_DIR.Notable fixes found by UI-test bring-up
accessibilityIdentifierpropagates to and overrides descendant identifiers —.accessibilityElement(children: .contain)added so child AX ids survive (also fixes VoiceOver).ProcessErrornow conforms toLocalizedErrorso spawn failures surface the realposix_spawnreason.exec— hence the committed fixture scripts.🤖 Generated with Devin