This PR is opened so Gitea Actions runs. Merge is deferred; do not merge in this session..gitea/workflows/macos.yml only triggers on PRs targeting develop; this is the only M10 PR with that base. A later session / human merges once CI evidence is reviewed.
Known flakes (testNonZeroExitThrowsToolFailed, testHandheldFixtureChartreadAndAverage, testSpotReadButtonDisabledDuringChartread) all passed without rerun
Sync status
origin/develop (800c980) is still an ancestor of this head — no sync merge needed; the diff is exactly M10.
**This PR is opened so Gitea Actions runs. Merge is deferred; do not merge in this session.** `.gitea/workflows/macos.yml` only triggers on PRs targeting `develop`; this is the only M10 PR with that base. A later session / human merges once CI evidence is reviewed.
## Scope — Milestone 10 (id 32): Studio workflow
| Issue | Feature | Feature PR | Merge SHA on `milestone/m10-studio` |
|---|---|---|---|
| #146 | Media recipe library bound to presets | #151 | `1931da8` |
| #148 | Spot-read console (`spotread`, bundled sidecar only) | #152 | `538ef1e` |
| #147 | Gamut compare: second profile + click-inspect | #153 | `99c0d7e` |
| #149 | `.icceryproj` project file index + recents + report | #154 | `c39afe0` |
| — | Docs hygiene: `default_instrument` seeds Spot Read; README floor macOS 12.0 | #155 | `48d2816` |
| — | M10 tracking (BUILD-PLAN / README rows) | #150 | `2f305c4` |
All four issues are closed (manually, with evidence). Milestone 32 stays **open** — hardware gates (R6) and this merge are deferred.
## Local full host-arch gate (on head SHA `48d2816`)
```
xcodegen generate --spec project.yml
xcodebuild test -scheme ICCery -destination 'platform=macOS' \
-derivedDataPath build/DerivedData-m10-final \
ARCHS="$(uname -m)" CODE_SIGNING_ALLOWED=YES CODE_SIGN_IDENTITY='-'
```
- ICCeryCoreTests: **439 executed, 0 failures**
- ICCeryUITests: **49 executed, 0 failures** — real Automation attach, no skip
- xcresult: `build/DerivedData-m10-final/Logs/Test/Test-ICCery-2026.09.13_12-25-16-+0100.xcresult`
- Known flakes (`testNonZeroExitThrowsToolFailed`, `testHandheldFixtureChartreadAndAverage`, `testSpotReadButtonDisabledDuringChartread`) all passed without rerun
## Sync status
`origin/develop` (`800c980`) is still an ancestor of this head — no sync merge needed; the diff is exactly M10.
Refs #146
Refs #147
Refs #148
Refs #149
Sources/ICCery/SidebarView.swift:40:13: error: extra arguments at positions #11, #12, #13, #14 in call
Sources/ICCery/MediaLibraryDialogs.swift:51:13: error: extra arguments at positions #11, #12, #13 in call
ViewBuilder.buildBlock caps at 10 children on Swift 5.7 (no buildPartialBlock until 5.9). Two M10 view builders exceed it — 14 and 13 children respectively. Local gates missed it because the dev host runs Xcode 15.x. Unit/UI steps were skipped; package never ran.
Issue #146 reopened with the evidence comment (the over-capacity builders are its deliverable). A fix/ branch into milestone/m10-studio is a later session. This PR remains open and unmerged; milestone 32 remains open.
**CI result (Actions run 33666): FAILED at build.** Deterministic product bug, not infrastructure.
`build-and-test` (job 34939), step "Build for testing (host arch)", runner `macos-12` / Xcode 14.2 (Swift 5.7):
```
Sources/ICCery/SidebarView.swift:40:13: error: extra arguments at positions #11, #12, #13, #14 in call
Sources/ICCery/MediaLibraryDialogs.swift:51:13: error: extra arguments at positions #11, #12, #13 in call
```
`ViewBuilder.buildBlock` caps at 10 children on Swift 5.7 (no `buildPartialBlock` until 5.9). Two M10 view builders exceed it — 14 and 13 children respectively. Local gates missed it because the dev host runs Xcode 15.x. Unit/UI steps were skipped; `package` never ran.
Issue #146 reopened with the evidence comment (the over-capacity builders are its deliverable). A `fix/` branch into `milestone/m10-studio` is a later session. **This PR remains open and unmerged; milestone 32 remains open.**
Actions run 33666 (Xcode 14.2, macOS 12) failed to compile: the
sidebar VStack had 14 children and SaveMediaRecipeDialog had 13,
over the Swift 5.7 ViewBuilder 10-child cap. Extracted
layout-transparent Group subviews (header/presetBlock/mediaBlock/
studioButtons/stepperAndProject; fields/readOnlyRows) — no id,
order, or layout change.
Refs #146
Generated with [Devin](https://devin.ai)
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Status update — Actions run 33718 on head 3d8e70b (includes #157 ViewBuilder fix):
Build for testing (host arch): PASS — Xcode 14.2 / Swift 5.7 compiles cleanly; the SidebarView (14→5) and SaveMediaRecipeDialog (13→7) Group splits resolved the run-33666 compile failure.
Unit (ICCeryCoreTests): PASS
UI (ICCeryUITests): real run, 48 tests, 4 failures (Automation attached — no skip):
Milestone10GamutCompareUITests.testCompareGamLoadEnablesToggle — "Compare toggle should enable after load"
Milestone10GamutCompareUITests.testOpenProfileRunsIccgamutForCompare — "Compare toggle should enable after iccgamut"
Milestone10ProjectUITests.testNewProjectClearsBasenameDoesNotDeleteFixtureTi3 — "expected the New or dirty alert"
All four exercise untouched #147/#149 paths (gamutLayer-* toolbar checkboxes, stubbed compare-gamut load, ⌘N File-menu alert) and pass locally on newer macOS/Xcode — first time these tests ran on the macOS 12 CI runner (33666 died at build). Looks environment-specific, needs its own investigation.
Status update — Actions run **33718** on head `3d8e70b` (includes #157 ViewBuilder fix):
- **Build for testing (host arch): PASS** — Xcode 14.2 / Swift 5.7 compiles cleanly; the `SidebarView` (14→5) and `SaveMediaRecipeDialog` (13→7) Group splits resolved the run-33666 compile failure.
- **Unit (ICCeryCoreTests): PASS**
- **UI (ICCeryUITests): real run, 48 tests, 4 failures** (Automation attached — no skip):
- `Milestone10GamutCompareUITests.testLayerTogglesExistWithSRGB`
- `Milestone10GamutCompareUITests.testCompareGamLoadEnablesToggle` — "Compare toggle should enable after load"
- `Milestone10GamutCompareUITests.testOpenProfileRunsIccgamutForCompare` — "Compare toggle should enable after iccgamut"
- `Milestone10ProjectUITests.testNewProjectClearsBasenameDoesNotDeleteFixtureTi3` — "expected the New or dirty alert"
All four exercise untouched #147/#149 paths (`gamutLayer-*` toolbar checkboxes, stubbed compare-gamut load, ⌘N File-menu alert) and pass locally on newer macOS/Xcode — first time these tests ran on the macOS 12 CI runner (33666 died at build). Looks environment-specific, needs its own investigation.
#146 stays open. **Do not merge this PR.**
Actions run 33718 (Xcode 14.2, macOS 12) failed four UI tests that
pass locally. Gamut layer toggles render as disabled placeholders
until the async layer load lands, so waitFor(id) won the race on the
placeholder — added waitUntilEnabled and gate on isEnabled. The
project New test's ⌘N may not reach the CommandGroup and alert
buttons often lack identifiers on macOS 12 — drive New through the
File menu "New Project" item and confirm the alert by button title
with id fallback.
Refs #147#149#146
Generated with [Devin](https://devin.ai)
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Run 33803 still reported the layer toggles disabled after a real
waitUntilEnabled: on macOS 12 the identifier lands on the Toggle's
container element, which never reports isEnabled — combine the
Toggle's children so the a11y leaf is the checkbox itself (checkbox
style unchanged). testPrinttargFixtureGalleryAndStubbedPrint flaked
once on the same runner: wait for btnCreateLayout enabled before
clicking and retry once when the gallery never materialises.
Refs #147#149#146
Generated with [Devin](https://devin.ai)
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
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.
This PR is opened so Gitea Actions runs. Merge is deferred; do not merge in this session.
.gitea/workflows/macos.ymlonly triggers on PRs targetingdevelop; this is the only M10 PR with that base. A later session / human merges once CI evidence is reviewed.Scope — Milestone 10 (id 32): Studio workflow
milestone/m10-studio1931da8spotread, bundled sidecar only)538ef1e99c0d7e.icceryprojproject file index + recents + reportc39afe0default_instrumentseeds Spot Read; README floor macOS 12.048d28162f305c4All four issues are closed (manually, with evidence). Milestone 32 stays open — hardware gates (R6) and this merge are deferred.
Local full host-arch gate (on head SHA
48d2816)build/DerivedData-m10-final/Logs/Test/Test-ICCery-2026.09.13_12-25-16-+0100.xcresulttestNonZeroExitThrowsToolFailed,testHandheldFixtureChartreadAndAverage,testSpotReadButtonDisabledDuringChartread) all passed without rerunSync status
origin/develop(800c980) is still an ancestor of this head — no sync merge needed; the diff is exactly M10.Refs #146
Refs #147
Refs #148
Refs #149
CI result (Actions run 33666): FAILED at build. Deterministic product bug, not infrastructure.
build-and-test(job 34939), step "Build for testing (host arch)", runnermacos-12/ Xcode 14.2 (Swift 5.7):ViewBuilder.buildBlockcaps at 10 children on Swift 5.7 (nobuildPartialBlockuntil 5.9). Two M10 view builders exceed it — 14 and 13 children respectively. Local gates missed it because the dev host runs Xcode 15.x. Unit/UI steps were skipped;packagenever ran.Issue #146 reopened with the evidence comment (the over-capacity builders are its deliverable). A
fix/branch intomilestone/m10-studiois a later session. This PR remains open and unmerged; milestone 32 remains open.Status update — Actions run 33718 on head
3d8e70b(includes #157 ViewBuilder fix):SidebarView(14→5) andSaveMediaRecipeDialog(13→7) Group splits resolved the run-33666 compile failure.Milestone10GamutCompareUITests.testLayerTogglesExistWithSRGBMilestone10GamutCompareUITests.testCompareGamLoadEnablesToggle— "Compare toggle should enable after load"Milestone10GamutCompareUITests.testOpenProfileRunsIccgamutForCompare— "Compare toggle should enable after iccgamut"Milestone10ProjectUITests.testNewProjectClearsBasenameDoesNotDeleteFixtureTi3— "expected the New or dirty alert"All four exercise untouched #147/#149 paths (
gamutLayer-*toolbar checkboxes, stubbed compare-gamut load, ⌘N File-menu alert) and pass locally on newer macOS/Xcode — first time these tests ran on the macOS 12 CI runner (33666 died at build). Looks environment-specific, needs its own investigation.#146 stays open. Do not merge this PR.