NodePilot 1.2.26
One fix, found while installing 1.2.25 on the lab machine: that release covered a fresh install but not an upgrade.
Fixed
An update no longer reverts the Engine Switcher's server URL. 1.2.25 taught the installer to fill in nodePilot.serverUrl, so the switcher can drive np without a per-user CLI configuration. An update, however, wipes and repopulates the install directory:
Get-ChildItem -LiteralPath $InstallPath -Force | Remove-Item -Recurse -Force
Copy-DirectoryContents -Source $artifactStage -Destination $InstallPathtools\engine-switcher\engine-switcher.json went with it and came back as the shipped template with serverUrl: null. Every upgrade therefore undid the fix, and the switch to NodePilot failed again with No server URL configured.
The update now reads the value before the wipe and writes it back afterwards. An installation that predates the setting has nothing to carry, so it derives one from the first real entry of AllowedHosts and the Kestrel HTTPS port — both from the appsettings.Production.json the update already parses for its health probe. Install and update share one implementation instead of two copies of the same string surgery.
Verified against a real installation
The Engine Switcher was run end to end against System Center Orchestrator 2025 in the lab, in both directions and with the failure path forced:
- To Orchestrator — services started, the listed runbook started, verification settled, exit 0.
- To NodePilot — the running Orchestrator job stopped and verified, services handed over, workflow allowlist verified with the enabled set unchanged, exit 0.
- Reconciliation deadline forced to one second — a described error naming the runbook that did not settle, the fail-closed cleanup, exit 1 and an empty stderr. Before 1.2.25 this path ended in an unhandled
TaskCanceledExceptionthat terminated the process.
Verifying this download
Every file below is listed in NodePilot-1.2.26.SHA256SUMS.txt, the publisher certificate included.
Get-FileHash .\NodePilot-1.2.26.zip -Algorithm SHA256The installers and the standalone switcher are Authenticode-signed with the NodePilot release certificate:
Subject CN=NodePilot Release Signing
Thumbprint 277EAB317A581C88302CE92BE805938C86B4650D
Compare that thumbprint against nodepilot-release-signing.cer, attached here:
(Get-PfxCertificate .\nodepilot-release-signing.cer).Thumbprint
$sig = Get-AuthenticodeSignature .\NodePilot-Server-Setup-1.2.26.exe
$sig.SignerCertificate.Subject
$sig.SignerCertificate.ThumbprintGet-AuthenticodeSignature reports Status: UnknownError, and that is the expected result — the certificate is self-signed, so its root is in nobody's trust store and no chain can be built. What carries the meaning is the pair above: the signer's subject, and a thumbprint equal to the certificate shipped alongside. The checksum file proves the download is intact; the thumbprint is what proves who built it.
SmartScreen
Windows SmartScreen warns on first run of a downloaded installer — "Windows protected your PC". That is expected and unrelated to the signature: the release certificate is self-signed and carries no reputation, so signing does not silence it. Choose More info → Run anyway. SmartScreen ignores antivirus exclusion lists entirely; see the deployment guide for the full explanation.