Milestone 5 Bugfixes #52
Notifications
Due Date
No due date set.
Blocks
#23 Stage 4: colprof UI & argv builder
gronod/iccery-v2-mac
#24 Post-profile chain: applycal + iccgamut
gronod/iccery-v2-mac
#25 Stage 5: profcheck verification
gronod/iccery-v2-mac
#26 Verification history & drift analytics
gronod/iccery-v2-mac
#27 System profile installation
gronod/iccery-v2-mac
Reference: gronod/iccery-v2-mac#52
Reference in New Issue
Block a user
Install “Overwrite” from the collision alert is a no-op.
beginInstallProfilesetsforceOverwrite: !askBeforeOverwriteandcollisionPolicy: .overwrite. The alert then callsresolveInstallCollision(policy: .overwrite)without settingforceOverwrite = true.ProfileInstaller.install: existing dest +forceOverwrite == false+.overwritefalls through tocopyFailed("destination already exists"). Rename/Cancel work; Overwrite does not.ProfileInstallerTestsnever callinstall()against a real dest — they reimplement copy/move inline — so this is untested. (#27)VerificationHistoryStore.appendwithoutload()wipes the file.recordsstarts[].appendwrites that plus the new row.Stage5View.onAppear→loadHistory()is a detachedTask. Verify can run first and replaceverification_history.jsonwith one row.load()documents “never overwrite unparseable file”;appendafter a failed load still overwrites.appendmustload()(or refuse) first. (#26)createdProfileURLis session-only.After relaunch, wizard gating can restore Stage 5 from disk
.icc, butcanVerify/ Install requirecreatedProfileURL != nil, which is only set insidecreateProfile(). Resolve fromArtefactProbe.resolveProfileon Stage 4/5 appear. (#23 / #25 / #27)Drift alert is not consecutive and hides the profcheck warning.
Spec: ≥ 2 consecutive Warning runs, distinct UTC days or ≥ 1 hour.
DriftAlert.computepairs any two.poorrecords, ignoring intervening Good/Excellent. Header showsprofcheckWarningonly whendriftAlert == nil, so a drift badge swallows an unparseable-run warning. (#25 / #26)printerNamepersisted as"", displayed as Unknown only in the picker.Spec:
wizardState.printerName or "Unknown".makeVerificationRecorduseswizard.printerName ?? "". Empty-string printers, empty CSV field, filter tag""colliding with “All”. (#26)ApplycalArgsTests.unapplyNotEmittedasserts the opposite of its name.Builder does emit
-uwhenunapply: true. UI never sets it (good). Rename the test; keep a guard thatProfileWorkflowViewModelnever passesunapply: true. (#24)Installer dest is always
{stem}.icc.Source
.icmis copied tostem.icc.#69prefers existing.icm. Preserve extension. Stem checkcontains("..")rejectsfoo..barwhich is not traversal. (#27)#24AC “.gamproduced next to profile” is best-effort in the VM.runIccgamutfailure is an info banner; Create stillgo(to: .verifyInstall). M5 UI test happens to see the mock.gam. Product vs ticket: either weaken #24 AC or fail Create when iccgamut fails.Suggested extra ACs on #50 (process only)
collect()returns after process exit even if a pipe EOF never arrives (timeout).applycalneverreplaceItemAts the input profile; tmp is deleted; original.iccbyte-identical.killAllon quit coverscolprof_*,iccgamut_*,profcheck_*,applycal_*, andchartread_*(XY stillq\n+ 500 ms first).Install overwrite, history wipe, and
createdProfileURLrestore stay off this ticket unless we edit #50 Scope In.