Files
SilverMetal/windows/installer
sysadmin 45939e1e9f
All checks were successful
Build SilverMetal Enhanced - Windows ISO / build (pull_request) Successful in 4m45s
fix(kiosk): call WESL_UserSetting methods class-level (was bricking first boot)
VM e2e caught a reboot loop: Configure-Kiosk used `Invoke-CimMethod -InputObject $wesl`
for SetDefaultShell/SetCustomShell, but WESL_UserSetting exposes STATIC methods and
Get-CimInstance returns null — so those calls threw "InputObject is null" while the
class-level SetEnabled($true) had already succeeded. Result: Shell Launcher enabled with
NO shell configured -> every logon (incl. OOBE defaultuser0) gets a broken shell -> the
"Why did my PC restart?" OOBE loop.

Fix: call SetEnabled/SetDefaultShell/SetCustomShell all class-level (-Namespace/-ClassName).
Setting the DEFAULT shell to explorer.exe is what keeps OOBE/normal logons alive; only
sm-bootstrap gets the kiosk launcher. Added GetCustomShell verification + a fail-open
rollback (SetEnabled false + RunOnce launch of the Welcome app) so a WMI hiccup can never
brick the box again. Same class-level fix applied to BootstrapService.RevertKioskAsync.

Found via VM 102 disk logs (silvermetal-firstboot.log + silvermetal-kiosk.log).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-09 16:05:28 +01:00
..

windows/installer

The custom packed-ISO build pipeline. See ../iso-builder.md for the design.

File Role
build.ps1 Pipeline orchestrator (7 stages). Run on Windows + Windows ADK.
inputs.manifest.json Pinned inputs — base ISO SHA-256, driver-pack/Stack/tool versions. The Microsoft ISO is an input, never committed.
autounattend/autounattend.xml OOBE automation — local account (no MSA), regional, BitLocker-ready disk layout, hands off to first-boot.
oem/SetupComplete.cmd First-boot entry point — runs the shared ../hardening/ modules, then schedules Verify.

Usage (M2+):

.\build.ps1 -SourceIso 'D:\Win11_IoT_Enterprise_LTSC_x64.iso'

Current status: M0 scaffold — stages 27 throw NotImplemented until M2/M3.