# A3 — Closeout Fase A3 di `plans/implementation-plan-A-B.md`: pipeline core (clone → build → collect) in Python. Branch: `feature/python-rewrite-phase-a`. ## Stato attuale - [x] `commands/vm.py` esteso con `vm new` (sostituisce `New-BuildVM.ps1`) - [x] `commands/build.py` con `build run` (sostituisce `Invoke-RemoteBuild.ps1`) - [x] `commands/artifacts.py` con `artifacts collect` (sostituisce `Get-BuildArtifacts.ps1`) - [x] Tutti i 3 `.ps1` ridotti a shim verso la CLI Python - [x] Pester `tests/{New-BuildVM,Wait-VMReady,Remove-BuildVM}.Tests.ps1` rimossi (casi negativi coperti dai pytest equivalenti) - [x] 91 pytest, ruff/mypy --strict clean, coverage 78.27% - [x] Hook Fase C: `build run` + `artifacts collect` accettano `VmHandle`/`vmx` opaco; nessuna assunzione path Windows - [ ] Smoke end-to-end manuale: clone WinBuild2025 → build script trivial → collect artifact ZIP - [ ] Smoke end-to-end Linux equivalente ## Definizione di "fatto" A3 | Criterio | Stato | | --- | --- | | Pipeline build completa via Python CLI | ✅ | | Shim PS preservano API per caller esistenti | ✅ | | Smoke build PASS contro VM reale Windows e Linux | ⏳ validazione hardware | | Pester `New-BuildVM.Tests.ps1` rimosso e sostituito | ✅ | ## Cosa resta a carico utente 1. Smoke manuale end-to-end Windows: `python -m ci_orchestrator vm new ... && build run ... && artifacts collect ...` 2. Stesso smoke su Linux template 3. Verificare che `Test-NsinnounpBuild.ps1` continui a passare invocando gli shim