Skip to content

feat(autopilot): add interactive hardware hash mode#203

Open
mchave3 wants to merge 50 commits into
mainfrom
feat/autopilot-interactive-device-code
Open

feat(autopilot): add interactive hardware hash mode#203
mchave3 wants to merge 50 commits into
mainfrom
feat/autopilot-interactive-device-code

Conversation

@mchave3
Copy link
Copy Markdown
Collaborator

@mchave3 mchave3 commented May 28, 2026

Summary

  • Adds InteractiveHardwareHashUpload as a first-class Autopilot provisioning mode.
  • Adds Foundry OSD and Foundry.Deploy UI/resource support for the new mode.
  • Keeps JSON profile and certificate-based zero-touch hardware hash upload behavior separate.

Reason

Some environments block customer-managed app registrations or unattended certificate-based Graph authentication. This starts the interactive hardware hash upload path without replacing the existing zero-touch certificate upload flow.

Main Changes

  • Adds readable JSON serialization for interactiveHardwareHashUpload in Core and Deploy.
  • Updates validation and deploy configuration generation so interactive mode does not require a JSON profile, tenant onboarding, certificates, or embedded PFX material.
  • Adds localized UI strings for the app while keeping the future staged PowerShell assistant English-only.
  • Adds an explicit deploy-step guard so Phase 1 does not accidentally fall through to JSON profile staging before the registration assistant is implemented.
  • Adds regression coverage for configuration, deployment preparation, telemetry, and deploy-step behavior.

Testing

  • dotnet test src\Foundry.Core.Tests\Foundry.Core.Tests.csproj -v minimal
  • dotnet test src\Foundry.Deploy.Tests\Foundry.Deploy.Tests.csproj -v minimal
  • dotnet test src\Foundry.Localization.Tests\Foundry.Localization.Tests.csproj -v minimal
  • dotnet build src\Foundry\Foundry.csproj -v minimal
  • dotnet build src\Foundry.Deploy\Foundry.Deploy.csproj -v minimal

Refs #202

@github-actions github-actions Bot added tests Test coverage or test infrastructure change ui User interface or XAML changes project: foundry Changes in the Foundry desktop application project: foundry-deploy Changes in the Foundry.Deploy deployment application project: foundry-core Changes in the Foundry.Core shared business logic library labels May 28, 2026
@mchave3 mchave3 self-assigned this May 28, 2026
@mchave3 mchave3 marked this pull request as ready for review May 28, 2026 14:53
Copilot AI review requested due to automatic review settings May 28, 2026 14:53
@mchave3 mchave3 moved this from New to In Progress in Foundry OSD Development May 28, 2026
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a new interactive Autopilot hardware hash upload provisioning mode across Foundry OSD (media authoring) and Foundry.Deploy (deployment runtime), including JSON serialization, UI strings, deploy-step behavior, telemetry, and regression tests.

Changes:

  • Introduces InteractiveHardwareHashUpload as an AutopilotProvisioningMode with readable JSON (de)serialization in both Core and Deploy.
  • Updates OSD + Deploy UI/view-models and localized resources to surface the new mode and summarize it in preflight/launch screens.
  • Adds deploy-step handling (explicit guard) and tests covering configuration, validation, telemetry, and deploy-step behavior.

Reviewed changes

Copilot reviewed 97 out of 97 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
src/Foundry/Views/AutopilotPage.xaml Adds a new SettingsExpander + ToggleSwitch for interactive hardware-hash upload.
src/Foundry/ViewModels/StartMediaViewModel.cs Passes through the selected Autopilot provisioning mode and formats interactive mode in summaries.
src/Foundry/ViewModels/AutopilotConfigurationViewModel.cs Adds interactive-mode state, toggles, and localized text bindings.
src/Foundry/Strings/ar-SA/Resources.resw Adds localized strings for interactive mode and updates Autopilot description.
src/Foundry/Strings/bg-BG/Resources.resw Adds localized strings for interactive mode and updates Autopilot description.
src/Foundry/Strings/cs-CZ/Resources.resw Adds localized strings for interactive mode and updates Autopilot description.
src/Foundry/Strings/da-DK/Resources.resw Adds localized strings for interactive mode and updates Autopilot description.
src/Foundry/Strings/de-DE/Resources.resw Adds localized strings for interactive mode and updates Autopilot description.
src/Foundry/Strings/el-GR/Resources.resw Adds localized strings for interactive mode and updates Autopilot description.
src/Foundry/Strings/en-GB/Resources.resw Adds localized strings for interactive mode and updates Autopilot description.
src/Foundry/Strings/en-US/Resources.resw Adds localized strings for interactive mode and updates Autopilot description.
src/Foundry/Strings/es-ES/Resources.resw Adds localized strings for interactive mode and updates Autopilot description.
src/Foundry/Strings/es-MX/Resources.resw Adds localized strings for interactive mode and updates Autopilot description.
src/Foundry/Strings/et-EE/Resources.resw Adds localized strings for interactive mode and updates Autopilot description.
src/Foundry/Strings/fi-FI/Resources.resw Adds localized strings for interactive mode and updates Autopilot description.
src/Foundry/Strings/fr-CA/Resources.resw Adds localized strings for interactive mode and updates Autopilot description.
src/Foundry/Strings/fr-FR/Resources.resw Adds localized strings for interactive mode and updates Autopilot description.
src/Foundry/Strings/he-IL/Resources.resw Adds localized strings for interactive mode and updates Autopilot description.
src/Foundry/Strings/hr-HR/Resources.resw Adds localized strings for interactive mode and updates Autopilot description.
src/Foundry/Strings/hu-HU/Resources.resw Adds localized strings for interactive mode and updates Autopilot description.
src/Foundry/Strings/it-IT/Resources.resw Adds localized strings for interactive mode and updates Autopilot description.
src/Foundry/Strings/ja-JP/Resources.resw Adds localized strings for interactive mode and updates Autopilot description.
src/Foundry/Strings/ko-KR/Resources.resw Adds localized strings for interactive mode and updates Autopilot description.
src/Foundry/Strings/lt-LT/Resources.resw Adds localized strings for interactive mode and updates Autopilot description.
src/Foundry/Strings/lv-LV/Resources.resw Adds localized strings for interactive mode and updates Autopilot description.
src/Foundry/Strings/nb-NO/Resources.resw Adds localized strings for interactive mode and updates Autopilot description.
src/Foundry/Strings/nl-NL/Resources.resw Adds localized strings for interactive mode and updates Autopilot description.
src/Foundry/Strings/pl-PL/Resources.resw Adds localized strings for interactive mode and updates Autopilot description.
src/Foundry/Strings/pt-BR/Resources.resw Adds localized strings for interactive mode and updates Autopilot description.
src/Foundry/Strings/pt-PT/Resources.resw Adds localized strings for interactive mode and updates Autopilot description.
src/Foundry/Strings/ro-RO/Resources.resw Adds localized strings for interactive mode and updates Autopilot description.
src/Foundry/Strings/ru-RU/Resources.resw Adds localized strings for interactive mode and updates Autopilot description.
src/Foundry/Strings/sk-SK/Resources.resw Adds localized strings for interactive mode and updates Autopilot description.
src/Foundry/Strings/sl-SI/Resources.resw Adds localized strings for interactive mode and updates Autopilot description.
src/Foundry/Strings/sr-Latn-RS/Resources.resw Adds localized strings for interactive mode and updates Autopilot description.
src/Foundry/Strings/sv-SE/Resources.resw Adds localized strings for interactive mode and updates Autopilot description.
src/Foundry/Strings/th-TH/Resources.resw Adds localized strings for interactive mode and updates Autopilot description.
src/Foundry/Strings/tr-TR/Resources.resw Adds localized strings for interactive mode and updates Autopilot description.
src/Foundry/Strings/uk-UA/Resources.resw Adds localized strings for interactive mode and updates Autopilot description.
src/Foundry/Strings/zh-CN/Resources.resw Adds localized strings for interactive mode and updates Autopilot description.
src/Foundry/Strings/zh-TW/Resources.resw Adds localized strings for interactive mode and updates Autopilot description.
src/Foundry.Deploy/ViewModels/MainWindowViewModel.cs Treats interactive mode as a valid Autopilot selection without requiring a JSON profile.
src/Foundry.Deploy/ViewModels/DeploymentPreparationViewModel.cs Adds interactive-mode state and updates UI summary text to include it.
src/Foundry.Deploy/Strings/ar-SA/Resources.resx Adds localized “interactive” mode label for Deploy preparation summary.
src/Foundry.Deploy/Strings/bg-BG/Resources.resx Adds localized “interactive” mode label for Deploy preparation summary.
src/Foundry.Deploy/Strings/cs-CZ/Resources.resx Adds localized “interactive” mode label for Deploy preparation summary.
src/Foundry.Deploy/Strings/da-DK/Resources.resx Adds localized “interactive” mode label for Deploy preparation summary.
src/Foundry.Deploy/Strings/de-DE/Resources.resx Adds localized “interactive” mode label for Deploy preparation summary.
src/Foundry.Deploy/Strings/el-GR/Resources.resx Adds localized “interactive” mode label for Deploy preparation summary.
src/Foundry.Deploy/Strings/en-GB/Resources.resx Adds localized “interactive” mode label for Deploy preparation summary.
src/Foundry.Deploy/Strings/en-US/Resources.resx Adds localized “interactive” mode label for Deploy preparation summary.
src/Foundry.Deploy/Strings/es-ES/Resources.resx Adds localized “interactive” mode label for Deploy preparation summary.
src/Foundry.Deploy/Strings/es-MX/Resources.resx Adds localized “interactive” mode label for Deploy preparation summary.
src/Foundry.Deploy/Strings/et-EE/Resources.resx Adds localized “interactive” mode label for Deploy preparation summary.
src/Foundry.Deploy/Strings/fi-FI/Resources.resx Adds localized “interactive” mode label for Deploy preparation summary.
src/Foundry.Deploy/Strings/fr-CA/Resources.resx Adds localized “interactive” mode label for Deploy preparation summary.
src/Foundry.Deploy/Strings/fr-FR/Resources.resx Adds localized “interactive” mode label for Deploy preparation summary.
src/Foundry.Deploy/Strings/he-IL/Resources.resx Adds localized “interactive” mode label for Deploy preparation summary.
src/Foundry.Deploy/Strings/hr-HR/Resources.resx Adds localized “interactive” mode label for Deploy preparation summary.
src/Foundry.Deploy/Strings/hu-HU/Resources.resx Adds localized “interactive” mode label for Deploy preparation summary.
src/Foundry.Deploy/Strings/it-IT/Resources.resx Adds localized “interactive” mode label for Deploy preparation summary.
src/Foundry.Deploy/Strings/ja-JP/Resources.resx Adds localized “interactive” mode label for Deploy preparation summary.
src/Foundry.Deploy/Strings/ko-KR/Resources.resx Adds localized “interactive” mode label for Deploy preparation summary.
src/Foundry.Deploy/Strings/lt-LT/Resources.resx Adds localized “interactive” mode label for Deploy preparation summary.
src/Foundry.Deploy/Strings/lv-LV/Resources.resx Adds localized “interactive” mode label for Deploy preparation summary.
src/Foundry.Deploy/Strings/nb-NO/Resources.resx Adds localized “interactive” mode label for Deploy preparation summary.
src/Foundry.Deploy/Strings/nl-NL/Resources.resx Adds localized “interactive” mode label for Deploy preparation summary.
src/Foundry.Deploy/Strings/pl-PL/Resources.resx Adds localized “interactive” mode label for Deploy preparation summary.
src/Foundry.Deploy/Strings/pt-BR/Resources.resx Adds localized “interactive” mode label for Deploy preparation summary.
src/Foundry.Deploy/Strings/pt-PT/Resources.resx Adds localized “interactive” mode label for Deploy preparation summary.
src/Foundry.Deploy/Strings/ro-RO/Resources.resx Adds localized “interactive” mode label for Deploy preparation summary.
src/Foundry.Deploy/Strings/ru-RU/Resources.resx Adds localized “interactive” mode label for Deploy preparation summary.
src/Foundry.Deploy/Strings/sk-SK/Resources.resx Adds localized “interactive” mode label for Deploy preparation summary.
src/Foundry.Deploy/Strings/sl-SI/Resources.resx Adds localized “interactive” mode label for Deploy preparation summary.
src/Foundry.Deploy/Strings/sr-Latn-RS/Resources.resx Adds localized “interactive” mode label for Deploy preparation summary.
src/Foundry.Deploy/Strings/sv-SE/Resources.resx Adds localized “interactive” mode label for Deploy preparation summary.
src/Foundry.Deploy/Strings/th-TH/Resources.resx Adds localized “interactive” mode label for Deploy preparation summary.
src/Foundry.Deploy/Strings/tr-TR/Resources.resx Adds localized “interactive” mode label for Deploy preparation summary.
src/Foundry.Deploy/Strings/uk-UA/Resources.resx Adds localized “interactive” mode label for Deploy preparation summary.
src/Foundry.Deploy/Strings/zh-CN/Resources.resx Adds localized “interactive” mode label for Deploy preparation summary.
src/Foundry.Deploy/Strings/zh-TW/Resources.resx Adds localized “interactive” mode label for Deploy preparation summary.
src/Foundry.Deploy/Services/Deployment/Steps/ProvisionAutopilotStep.cs Adds an explicit guard that blocks interactive mode when the assistant is not staged.
src/Foundry.Deploy/Services/Deployment/DeploymentOrchestrator.cs Reports interactive mode in deployment telemetry properties.
src/Foundry.Deploy/Models/Configuration/AutopilotProvisioningModeJsonConverter.cs Adds JSON read/write support for interactiveHardwareHashUpload.
src/Foundry.Deploy/Models/Configuration/AutopilotProvisioningMode.cs Adds InteractiveHardwareHashUpload enum value and docs.
src/Foundry.Deploy.Tests/ProvisionAutopilotStepTests.cs Adds tests verifying interactive mode is blocked and does not stage JSON profiles.
src/Foundry.Deploy.Tests/DeploymentPreparationViewModelTests.cs Adds tests asserting interactive mode hides JSON/cert UI and doesn’t require profile selection.
src/Foundry.Deploy.Tests/DeploymentLaunchPreparationServiceTests.cs Adds test ensuring interactive mode doesn’t require JSON profile selection to launch.
src/Foundry.Deploy.Tests/DeployConfigurationModelTests.cs Adds test for deserializing interactive provisioning mode from deploy config JSON.
src/Foundry.Core/Services/Telemetry/BootMediaTelemetryPropertyBuilder.cs Adds interactive mode to boot media telemetry mapping.
src/Foundry.Core/Services/Configuration/AutopilotConfigurationValidator.cs Treats interactive mode as “ready” during configuration validation.
src/Foundry.Core/Models/Configuration/AutopilotProvisioningModeJsonConverter.cs Adds JSON read/write support for interactiveHardwareHashUpload.
src/Foundry.Core/Models/Configuration/AutopilotProvisioningMode.cs Adds InteractiveHardwareHashUpload enum value and docs.
src/Foundry.Core.Tests/Configuration/FoundryConfigurationServiceTests.cs Adds round-trip serialization test for interactive provisioning mode.
src/Foundry.Core.Tests/Configuration/DeployConfigurationGeneratorTests.cs Adds test ensuring interactive mode omits certificate/PFX metadata in generated deploy config.
src/Foundry.Core.Tests/Configuration/AutopilotConfigurationValidatorTests.cs Adds test ensuring interactive mode validates as ready without profile/cert metadata.
src/Foundry.Core.Tests/BootMediaTelemetryPropertyBuilderTests.cs Adds test ensuring interactive mode telemetry string is reported.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines 36 to 43
return settings.ProvisioningMode switch
{
AutopilotProvisioningMode.JsonProfile => GetSelectedJsonProfile(settings) is not null
? AutopilotConfigurationValidationResult.Ready(AutopilotConfigurationValidationCode.Ready)
: AutopilotConfigurationValidationResult.Blocked(AutopilotConfigurationValidationCode.JsonProfileMissing),
AutopilotProvisioningMode.HardwareHashUpload => EvaluateHardwareHashUpload(settings.HardwareHashUpload, currentTimeUtc),
AutopilotProvisioningMode.InteractiveHardwareHashUpload => AutopilotConfigurationValidationResult.Ready(AutopilotConfigurationValidationCode.Ready),
_ => AutopilotConfigurationValidationResult.Blocked(AutopilotConfigurationValidationCode.UnsupportedProvisioningMode)
Assert.False(viewModel.IsAutopilotProfileSelectionEnabled);
Assert.False(viewModel.IsHardwareHashGroupTagControlsVisible);
Assert.False(viewModel.IsHardwareHashUploadMessageVisible);
Assert.Contains("Interactive", viewModel.AutopilotModeText, StringComparison.OrdinalIgnoreCase);
@github-actions github-actions Bot added the dependencies Dependency version or package management change label May 28, 2026
mchave3 added 30 commits May 29, 2026 00:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Dependency version or package management change project: foundry Changes in the Foundry desktop application project: foundry-core Changes in the Foundry.Core shared business logic library project: foundry-deploy Changes in the Foundry.Deploy deployment application tests Test coverage or test infrastructure change ui User interface or XAML changes

Projects

Status: In Progress

Development

Successfully merging this pull request may close these issues.

2 participants