Skip to content

Commit fa979d6

Browse files
committed
Capture evidence collected so far
1 parent b40d92f commit fa979d6

7 files changed

Lines changed: 118 additions & 7 deletions

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ Thumbs.db
3333
*.utm/
3434
evidence/
3535
Evidence/
36+
macoslab-preflight/
37+
macoslab-preflight*.zip
3638
.maclab/
3739
media-cache/
3840
.media-cache/

TODO-Phase-04-Media-Acquisition.md

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,28 @@
88
- **Last Updated:** 2026-05-05
99
- **Scope:** Deferred verification for media discovery and download tooling before implementing Phase 4.
1010

11+
## Confirmed Preflight Evidence
12+
13+
Owner-supplied sanitized preflight evidence from a macOS host confirms:
14+
15+
- Host baseline: Apple Silicon (`arm64`) running macOS 26.4.1 build 25E253.
16+
- `mist` is installed at `/opt/homebrew/bin/mist`.
17+
- `mist --help`, `mist help list`, and `mist help download` work.
18+
- `mist version` is not valid for the installed command surface; use `mist --version` for version capture.
19+
- `mist list firmware --export <path>` produced JSON with 134 firmware rows.
20+
- For macOS Tahoe 26.4.1 build 25E253, `mist` reported compatible firmware rows, including a signed row.
21+
- `mist list installer --compatible --export <path>` produced 11 compatible installer rows on this host: Tahoe 26.1 through 26.4.1 and Sequoia 15.7.2 through 15.7.5. It did not return Sonoma installer rows on this macOS 26.4.1 host.
22+
23+
Do not commit the raw or sanitized preflight capture bundle. Convert it into durable commands, expected fields, fixtures, and redacted examples only.
24+
25+
## Remaining Open Items
26+
27+
- [ ] Re-run and capture `mist --version`; the first preflight captured `mist version`, which usefully proved the wrong syntax but did not capture the installed version string.
28+
- [ ] Capture `mist help download firmware` and verify the exact options for output directory control in the installed `mist-cli` version.
29+
- [ ] Let the in-progress macOS Tahoe 26.4.1 firmware download finish, then record the actual IPSW path, file size, and SHA-256 checksum.
30+
- [ ] Record whether the download lands under the requested cache path or the default `/Users/Shared/Mist` path.
31+
- [ ] Decide whether Phase 4 should treat compatible installer rows as advisory metadata only, because the current Apple-silicon VM path should prefer firmware/IPSW restore images.
32+
1133
## Checklist
1234

13-
- [ ] Owner: Repository owner; Status: Open; Phase gate affected: Phase 4 media acquisition; Why it matters: `mist-cli` syntax and output can change across releases; Action: verify current `mist-cli` list/download syntax and record exact commands for discovering and downloading pinned macOS restore images or provider-appropriate install artifacts; Acceptance condition: the verified commands, version output, and expected metadata fields are documented before `Get-MacLabMedia` implementation; Source: ADR-0005 and spec Section 9.6.
35+
- [ ] Owner: Repository owner; Status: Partially verified; Phase gate affected: Phase 4 media acquisition; Why it matters: `mist-cli` syntax and output can change across releases; Action: use the confirmed preflight facts above, complete the remaining download/version captures, and record exact commands for discovering and downloading pinned macOS restore images or provider-appropriate install artifacts; Acceptance condition: the verified commands, version output, expected metadata fields, actual downloaded artifact path, and checksum are documented before `Get-MacLabMedia` implementation; Source: ADR-0005 and spec Section 9.6.

TODO-Phase-05-Parallels-Provider.md

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,30 @@
88
- **Last Updated:** 2026-05-05
99
- **Scope:** Deferred verification for Parallels Desktop command-line automation before implementing Phase 5.
1010

11+
## Confirmed Preflight Evidence
12+
13+
Owner-supplied sanitized preflight evidence from a macOS host confirms:
14+
15+
- Host baseline: Apple Silicon (`arm64`) running macOS 26.4.1 build 25E253.
16+
- `prlctl` is installed at `/usr/local/bin/prlctl`.
17+
- `prlsrvctl` is installed at `/usr/local/bin/prlsrvctl`.
18+
- `prlctl --version` returns Parallels CLI version 26.3.2 build 57398.
19+
- `prlsrvctl info` reports Parallels Desktop 26.3.2-57398, service started, default VM home under `~/Parallels`, and a valid license. Do not commit license strings from this output.
20+
- `prlctl list -a` returned only the table header, confirming no registered Parallels VMs existed at capture time.
21+
- `prlctl list --help` supports `--all`, `--full`, `--output`, `--list`, `--template`, `--json`, `--no-header`, `--stopped`, and `--name`.
22+
- `prlctl snapshot-list --help` supports `--tree`, `--id`, `--json`, and `--no-header`.
23+
24+
Do not commit the raw or sanitized preflight capture bundle. Convert it into durable commands, expected fields, fixtures, and redacted examples only.
25+
26+
## Remaining Open Items
27+
28+
- [ ] After the pinned IPSW download finishes, create one disposable same-major macOS Tahoe 26.4.1 Parallels VM and capture the exact `prlctl create <name> -o macos --restore-image <path>` behavior.
29+
- [ ] Verify and document VM list/info/start/stop/delete behavior against the disposable VM.
30+
- [ ] Verify and document named snapshot create/list/restore behavior against the disposable VM.
31+
- [ ] Confirm whether this Parallels installation exposes edition as Pro through a parseable CLI field; current evidence proves Desktop 26.3.2-57398 and a valid license, but does not expose a clean "Pro" string.
32+
- [ ] Record the Provider Version Matrix for the disposable VM: host macOS version/build, guest macOS version/build, host/guest classification, Parallels version, IPSW path, IPSW checksum, and date tested.
33+
- [ ] Treat guest macOS versions higher than the host major version as rejected by default. The current macOS 26.4.1 host can verify same-major Tahoe behavior; older guest majors require explicit cross-major evidence only if they remain in scope for this host.
34+
1135
## Checklist
1236

13-
- [ ] Owner: Repository owner; Status: Open; Phase gate affected: Phase 5 Parallels provider; Why it matters: provider automation must match the installed Parallels Desktop Pro command surface and must not assume unsupported host/guest macOS pairings; Action: verify current `prlctl` syntax, version output, edition detection, same-major macOS VM creation behavior, snapshot behavior, and higher-than-host guest rejection or warning behavior on the owner/demo host; Acceptance condition: exact commands, expected outputs, host macOS version/build, guest macOS version/build, Parallels version/edition, and host/guest compatibility classification are documented so provider tests can be written without guessing; Source: ADR-0005, ADR-0011, and spec Sections 8.1.1, 9.6, and 17.4.
37+
- [ ] Owner: Repository owner; Status: Partially verified; Phase gate affected: Phase 5 Parallels provider; Why it matters: provider automation must match the installed Parallels Desktop Pro command surface and must not assume unsupported host/guest macOS pairings; Action: use the confirmed CLI/version facts above, then verify same-major macOS VM creation behavior, snapshot behavior, and rejection/warning behavior on the owner/demo host once the pinned IPSW is available; Acceptance condition: exact commands, expected outputs, host macOS version/build, guest macOS version/build, Parallels version/edition evidence, and host/guest compatibility classification are documented so provider tests can be written without guessing; Source: ADR-0005, ADR-0011, and spec Sections 8.1.1, 9.6, and 17.4.

TODO-Phase-06-UTM-Provider.md

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,30 @@
88
- **Last Updated:** 2026-05-05
99
- **Scope:** Deferred verification for UTM automation and manual-step boundaries before implementing Phase 6.
1010

11+
## Confirmed Preflight Evidence
12+
13+
Owner-supplied sanitized preflight evidence from a macOS host confirms:
14+
15+
- Host baseline: Apple Silicon (`arm64`) running macOS 26.4.1 build 25E253.
16+
- UTM is installed under `/Applications/UTM.app`.
17+
- `defaults read /Applications/UTM.app/Contents/Info.plist CFBundleShortVersionString` reports UTM 4.7.5.
18+
- Gatekeeper accepted the app, with Mac App Store signing reported.
19+
- `utmctl` help is available at `/Applications/UTM.app/Contents/MacOS/utmctl`.
20+
- Top-level `utmctl` help lists `version`, `list`, `status`, `start`, `suspend`, `stop`, `attach`, `file`, `exec`, `ip-address`, `clone`, `delete`, and `usb`.
21+
- Top-level `utmctl` help does not advertise create/import/snapshot primitives. Treat VM creation and snapshot management as manual-step candidates until proven otherwise.
22+
- `utmctl list` returned only the table header, confirming no registered UTM VMs existed at capture time. It may launch or foreground UTM because it controls the installed app.
23+
24+
Do not commit the raw or sanitized preflight capture bundle. Convert it into durable commands, expected fields, fixtures, and redacted examples only.
25+
26+
## Remaining Open Items
27+
28+
- [ ] Capture `/Applications/UTM.app/Contents/MacOS/utmctl version`; the first preflight captured the app bundle version via `defaults`, not the `utmctl` subcommand.
29+
- [ ] After the pinned IPSW download finishes, create one disposable same-major macOS Tahoe 26.4.1 UTM VM using the GUI path and exact IPSW.
30+
- [ ] Verify and document which lifecycle primitives work through `utmctl` against the disposable VM: list, status, start, suspend, stop, IP address, file, exec, clone, and delete. Do not run destructive delete except against a disposable VM.
31+
- [ ] Verify and document which VM creation, import/export, and snapshot actions require manual UI steps.
32+
- [ ] Record whether macOS prompts for Terminal or shell automation permissions when `utmctl` controls UTM.
33+
- [ ] Record the Provider Version Matrix for the disposable VM: host macOS version/build, guest macOS version/build, host/guest classification, UTM version, IPSW path, IPSW checksum, manual-step gaps, and date tested.
34+
1135
## Checklist
1236

13-
- [ ] Owner: Repository owner; Status: Open; Phase gate affected: Phase 6 UTM provider; Why it matters: UTM automation may not mirror Parallels CLI parity, manual gaps must be explicit, and macOS guests on Apple silicon must respect Apple Virtualization host/guest compatibility constraints; Action: verify current UTM and `utmctl` automation surface, including VM creation, launch, stop, snapshot, import/export, Apple Virtualization enforcement, host/guest macOS compatibility behavior, and any manual-step requirements; Acceptance condition: UTM capability matrix, manual-step gaps, host macOS version/build, guest macOS version/build, UTM version, and host/guest compatibility classification are documented before provider implementation; Source: ADR-0005, ADR-0011, and spec Sections 8.1.1, 9.6, and 17.5.
37+
- [ ] Owner: Repository owner; Status: Partially verified; Phase gate affected: Phase 6 UTM provider; Why it matters: UTM automation may not mirror Parallels CLI parity, manual gaps must be explicit, and macOS guests on Apple silicon must respect Apple Virtualization host/guest compatibility constraints; Action: use the confirmed app/version/command-surface facts above, then verify current UTM and `utmctl` automation against a disposable same-major VM, including VM creation, launch, stop, snapshot, import/export, Apple Virtualization enforcement, host/guest macOS compatibility behavior, and any manual-step requirements; Acceptance condition: UTM capability matrix, manual-step gaps, host macOS version/build, guest macOS version/build, UTM version, and host/guest compatibility classification are documented before provider implementation; Source: ADR-0005, ADR-0011, and spec Sections 8.1.1, 9.6, and 17.5.

TODO-Phase-07-Evidence-Pipeline.md

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,28 @@
88
- **Last Updated:** 2026-05-05
99
- **Scope:** Deferred replacement of the temporary worked-example schema with the real macOSLab evidence-bundle schema.
1010

11+
## Confirmed Preflight Evidence
12+
13+
Owner-supplied sanitized host preflight evidence confirms the future evidence model needs to represent at least:
14+
15+
- Host OS version/build and architecture.
16+
- Tool paths and version output for `mist`, `prlctl`, `prlsrvctl`, and UTM/`utmctl`.
17+
- Provider command-surface captures, such as help output and list output.
18+
- Media discovery JSON from `mist`.
19+
- Provider inventory states where no VMs are registered yet.
20+
- Sanitization status for hostnames, user paths, UUIDs, MAC addresses, email addresses, license material, and other local identifiers.
21+
- A distinction between raw local captures, sanitized review bundles, and durable evidence summaries that are safe to commit.
22+
23+
Do not commit the raw or sanitized preflight capture bundle. The committed evidence schema should store redacted summaries and deterministic fixture data, not private host captures.
24+
25+
## Remaining Open Items
26+
27+
- [ ] Decide whether the real evidence schema stores raw command-output attachments, normalized parsed facts, or both.
28+
- [ ] Add fields for host/guest macOS compatibility classification and provider manual-step gaps.
29+
- [ ] Add redaction assertions that reject license strings, hardware identifiers, local usernames, VM UUIDs, MAC addresses, tenant identifiers, and device identifiers.
30+
- [ ] Add fixtures for "tool installed but no VMs registered" states for Parallels and UTM.
31+
- [ ] Add fixtures for "Defender intentionally absent on host; validate inside guest" states if Phase 8 uses host/guest evidence separation.
32+
1133
## Checklist
1234

13-
- [ ] Owner: Repository owner; Status: Open; Phase gate affected: Phase 7 evidence pipeline; Why it matters: Phase 0 keeps the worked-example schema only to exercise validation tooling; Action: replace `schemas/example-config.schema.json` and its example fixtures with the real evidence-bundle schema from spec Section 25, then update `.pre-commit-config.yaml`, data-file CI, schema docs, and examples together; Acceptance condition: valid evidence examples pass schema validation, invalid examples are rejected by an explicit test or validation script, and the worked example is fully removed; Source: `docs/phase-0-bootstrap-codex-instructions.md` and spec Section 25.
35+
- [ ] Owner: Repository owner; Status: Open with preflight inputs captured; Phase gate affected: Phase 7 evidence pipeline; Why it matters: Phase 0 keeps the worked-example schema only to exercise validation tooling; Action: replace `schemas/example-config.schema.json` and its example fixtures with the real evidence-bundle schema from spec Section 25, then update `.pre-commit-config.yaml`, data-file CI, schema docs, and examples together; Acceptance condition: valid evidence examples pass schema validation, invalid examples are rejected by an explicit test or validation script, redaction failures are caught, and the worked example is fully removed; Source: `docs/phase-0-bootstrap-codex-instructions.md` and spec Section 25.

TODO-Phase-08-Validation-Loop.md

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,19 @@
88
- **Last Updated:** 2026-05-05
99
- **Scope:** Deferred verification for Defender health evidence before implementing Phase 8.
1010

11+
## Confirmed Preflight Evidence
12+
13+
The owner does not want Microsoft Defender for Endpoint installed on the daily-driver host Mac. Host-side `mdatp` output is therefore intentionally unavailable and should not be treated as missing evidence.
14+
15+
Defender validation evidence should be collected inside a disposable macOS guest VM after the pinned VM build exists. This keeps the host clean and better matches the lab's purpose: validating Defender, PPPC/FDA, onboarding, and health from inside the managed guest.
16+
17+
## Remaining Open Items
18+
19+
- [ ] After a disposable VM exists, install or deploy Defender for Endpoint inside the guest using the intended demo path.
20+
- [ ] Capture `mdatp health` output before and after onboarding, after required system extension and Full Disk Access approvals, and after any intentionally broken policy state used in the demo.
21+
- [ ] Sanitize tenant, device, machine, user, and cloud identifiers before using the output as fixtures.
22+
- [ ] Decide whether Defender should be present in the `Pre-Enroll` snapshot or deployed live by Intune; do not accidentally hide the behavior the demo is meant to show.
23+
1124
## Checklist
1225

13-
- [ ] Owner: Repository owner; Status: Open; Phase gate affected: Phase 8 validation loop; Why it matters: Defender `mdatp health` output can change and evidence fixtures must not leak real tenant or device data; Action: verify the current Defender `mdatp health` output shape and create sanitized fixtures for evidence tests; Acceptance condition: fixture fields needed by validation code are documented, sanitized, and covered by tests before Defender validation ships; Source: ADR-0005 and spec Section 9.6.
26+
- [ ] Owner: Repository owner; Status: Open, guest-only by design; Phase gate affected: Phase 8 validation loop; Why it matters: Defender `mdatp health` output can change and evidence fixtures must not leak real tenant or device data; Action: verify the current Defender `mdatp health` output shape inside a disposable macOS guest and create sanitized fixtures for evidence tests; Acceptance condition: fixture fields needed by validation code are documented, sanitized, and covered by tests before Defender validation ships; Source: ADR-0005 and spec Section 9.6.

docs/planning/macos-imaging-05c-recommended-software-step-by-step-revised.md

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -527,7 +527,7 @@ Do this **before** you spend time building or snapshotting VMs. Catching a broke
527527
pwsh --version
528528
code --version
529529
mist --help
530-
mist version
530+
mist --version
531531
mist help list
532532
mist help download
533533
prlctl --version
@@ -543,6 +543,8 @@ Do this **before** you spend time building or snapshotting VMs. Catching a broke
543543
tart --version
544544
```
545545

546+
`utmctl` may launch or foreground UTM because it controls the installed app. Treat that as normal unless the command hangs, fails to return output, or prompts for an automation permission that you cannot approve.
547+
546548
3. Launch and confirm the following open correctly:
547549
- Visual Studio Code
548550
- UTM
@@ -828,7 +830,7 @@ The concrete commands below use the **firmware / IPSW** path because current Par
828830

829831
```bash
830832
mkdir -p ~/Demo/Installers
831-
mist version > ~/Demo/Installers/mist-version.txt 2>&1 || true
833+
mist --version > ~/Demo/Installers/mist-version.txt 2>&1 || true
832834
mist --help > ~/Demo/Installers/mist-help.txt 2>&1 || true
833835
mist help list > ~/Demo/Installers/mist-help-list.txt 2>&1 || true
834836
mist help download > ~/Demo/Installers/mist-help-download.txt 2>&1 || true
@@ -841,6 +843,8 @@ The concrete commands below use the **firmware / IPSW** path because current Par
841843
mist list installer --compatible --export ~/Demo/Installers/mist-installers-compatible.json
842844
```
843845

846+
Owner preflight evidence from a macOS 26.4.1 Apple-silicon host showed `mist list installer --compatible` returning Tahoe 26.1 through 26.4.1 and Sequoia 15.7.2 through 15.7.5, but no Sonoma installer rows. Treat that as host-specific discovery evidence, not as a global support matrix. Older macOS targets still need their own same-major or otherwise documented host/provider preflight.
847+
844848
3. In `mist-firmware.json`, choose the firmware row for the pinned build. Prefer a row that is:
845849
- the exact macOS version and build you intend to demo
846850
- compatible with the host according to `mist`

0 commit comments

Comments
 (0)