Phase 3 of the M8 consolidation plan — completes the calibration identity and profile-resolution contracts.
Calibration identity (CalibrationIdentity.parse)
An empty live basename now always produces an empty identity, regardless of any non-empty persisted calibrationOriginalBasename — an empty original must never invent or resurrect a target.
Persisted-original precedence is retained strictly when the live basename carries the CAL_ prefix (Force Quit restoration contract, #29).
All CAL_ logic remains encapsulated in CalibrationIdentity; no second hasPrefix("CAL_") ternary exists elsewhere.
Extension flipping is now restricted strictly to .icc <-> .icm. Missing URLs with unrelated extensions (.mpp, .txt, ...) are returned unchanged — never rewritten.
Explicit-existing URL wins immediately, before any probing or sibling flipping.
New focused suite Tests/ICCeryCoreTests/CalibrationIdentityTests.swift (extracted from JSONFileStoreTests): standard live basename, CAL_ live, persisted-precedence, empty-live + non-empty persisted (asserts empty identity), already-prefixed inputs, and ProcessID.targen == targen_CAL_foo.
ArtefactProbeProfileTests expanded to the full basename-probe and explicit-URL matrices.
ArgyllRunnerCalibrationTests now asserts calibration targen from foo creates CAL_foo.ti1 and runs under process id targen_CAL_foo (observed via the ProcessManager event bus).
WizardCalibrationSessionTests covers Force Quit launch restore: original basename, profile mode, and generate stage all preserved.
## Summary
Phase 3 of the M8 consolidation plan — completes the calibration identity and profile-resolution contracts.
### Calibration identity (`CalibrationIdentity.parse`)
- An **empty live basename now always produces an empty identity**, regardless of any non-empty persisted `calibrationOriginalBasename` — an empty original must never invent or resurrect a target.
- Persisted-original precedence is retained **strictly** when the live basename carries the `CAL_` prefix (Force Quit restoration contract, #29).
- All `CAL_` logic remains encapsulated in `CalibrationIdentity`; no second `hasPrefix("CAL_")` ternary exists elsewhere.
### Profile resolution (`ArtefactProbe.resolveProfile(_:)`)
- Extension flipping is now restricted strictly to `.icc` <-> `.icm`. Missing URLs with unrelated extensions (`.mpp`, `.txt`, ...) are returned unchanged — never rewritten.
- Explicit-existing URL wins immediately, before any probing or sibling flipping.
- Basename probe precedence unchanged: `.icm` first, then `.icc`; neither -> `nil`.
### Tests
- New focused suite `Tests/ICCeryCoreTests/CalibrationIdentityTests.swift` (extracted from `JSONFileStoreTests`): standard live basename, `CAL_` live, persisted-precedence, empty-live + non-empty persisted (asserts empty identity), already-prefixed inputs, and `ProcessID.targen` == `targen_CAL_foo`.
- `ArtefactProbeProfileTests` expanded to the full basename-probe and explicit-URL matrices.
- `ArgyllRunnerCalibrationTests` now asserts calibration targen from `foo` creates `CAL_foo.ti1` and runs under process id `targen_CAL_foo` (observed via the `ProcessManager` event bus).
- `WizardCalibrationSessionTests` covers Force Quit launch restore: original basename, profile mode, and generate stage all preserved.
### Gate
`xcodebuild test -scheme ICCery -destination 'platform=macOS' -only-testing:ICCeryCoreTests/CalibrationIdentityTests -only-testing:ICCeryCoreTests/ArtefactProbeProfileTests -only-testing:ICCeryCoreTests/WizardCalibrationSessionTests -only-testing:ICCeryCoreTests/ArgyllRunnerCalibrationTests -only-testing:ICCeryUITests/Milestone6CalibrationUITests` — **TEST SUCCEEDED** (27 core tests + Milestone 6 calibration UI flow, 0 failures).
Refs #83
gronod
added this to the M7 — Deduplicate & consolidate (develop) milestone 2026-09-11 11:10:33 +01:00
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.
Summary
Phase 3 of the M8 consolidation plan — completes the calibration identity and profile-resolution contracts.
Calibration identity (
CalibrationIdentity.parse)calibrationOriginalBasename— an empty original must never invent or resurrect a target.CAL_prefix (Force Quit restoration contract, #29).CAL_logic remains encapsulated inCalibrationIdentity; no secondhasPrefix("CAL_")ternary exists elsewhere.Profile resolution (
ArtefactProbe.resolveProfile(_:)).icc<->.icm. Missing URLs with unrelated extensions (.mpp,.txt, ...) are returned unchanged — never rewritten..icmfirst, then.icc; neither ->nil.Tests
Tests/ICCeryCoreTests/CalibrationIdentityTests.swift(extracted fromJSONFileStoreTests): standard live basename,CAL_live, persisted-precedence, empty-live + non-empty persisted (asserts empty identity), already-prefixed inputs, andProcessID.targen==targen_CAL_foo.ArtefactProbeProfileTestsexpanded to the full basename-probe and explicit-URL matrices.ArgyllRunnerCalibrationTestsnow asserts calibration targen fromfoocreatesCAL_foo.ti1and runs under process idtargen_CAL_foo(observed via theProcessManagerevent bus).WizardCalibrationSessionTestscovers Force Quit launch restore: original basename, profile mode, and generate stage all preserved.Gate
xcodebuild test -scheme ICCery -destination 'platform=macOS' -only-testing:ICCeryCoreTests/CalibrationIdentityTests -only-testing:ICCeryCoreTests/ArtefactProbeProfileTests -only-testing:ICCeryCoreTests/WizardCalibrationSessionTests -only-testing:ICCeryCoreTests/ArgyllRunnerCalibrationTests -only-testing:ICCeryUITests/Milestone6CalibrationUITests— TEST SUCCEEDED (27 core tests + Milestone 6 calibration UI flow, 0 failures).Refs #83