ci: build on the shared ci-workflows Windows workflow (blocked: Lore QRun runner is repo-scoped) #17

Open
james.maes wants to merge 12 commits from ci/shared-windows into main
pull from: ci/shared-windows
Owner

Moves CI to the shared ci-workflows Windows and Node workflows (@v1).

  • windows (runner qqq-windows-amd64, the Lore QRun runner, owner decision 2026-11-08): pinned protocol fixtures, Verify.ps1 (locked restore, warnings-as-errors build, tests), SDK inventory, branded installer and packaging checks, unsigned MSIs (base + editions), PSScriptAnalyzer and Pester. v* tags attach the MSIs, Install-Branded.ps1, branding.example.json and SHA256SUMS to the Gitea release.
  • scripts (node.yaml, Linux): script quality, source headers, typecheck, lint, virtual-agent tests. Green (runs 7155, 7248).

Why not qqq-windows-vm6218: Microsoft Defender on VM 6218 quarantines the freshly built Qqq.PrintAgent.Core.Tests.dll (MSB3026, runs 7143/7155); a Defender exclusion there stays on the owner's hold.

Blocked, do not merge yet: runner 6 qqq-lore-windows (qqq-windows-amd64) is re-enabled in Gitea and online, but it is registered to the single repository QRun-IO/ci-qualification, so this repository's Windows job (run 7248) stays queued. It needs re-registering at QRun-IO org level on Lore (elevated, like KOF's runner 9 kof-lore-windows-org); then re-run.

.github workflows are left in place: they still run on the GitHub mirror.

🤖 Generated with Claude Code

Moves CI to the shared `ci-workflows` Windows and Node workflows (`@v1`). - `windows` (runner **`qqq-windows-amd64`**, the Lore QRun runner, owner decision 2026-11-08): pinned protocol fixtures, `Verify.ps1` (locked restore, warnings-as-errors build, tests), SDK inventory, branded installer and packaging checks, unsigned MSIs (base + editions), PSScriptAnalyzer and Pester. `v*` tags attach the MSIs, `Install-Branded.ps1`, `branding.example.json` and `SHA256SUMS` to the Gitea release. - `scripts` (node.yaml, Linux): script quality, source headers, typecheck, lint, virtual-agent tests. Green (runs 7155, 7248). Why not `qqq-windows-vm6218`: Microsoft Defender on VM 6218 quarantines the freshly built `Qqq.PrintAgent.Core.Tests.dll` (MSB3026, runs 7143/7155); a Defender exclusion there stays on the owner's hold. **Blocked, do not merge yet:** runner 6 `qqq-lore-windows` (`qqq-windows-amd64`) is re-enabled in Gitea and online, but it is registered to the single repository `QRun-IO/ci-qualification`, so this repository's Windows job (run 7248) stays queued. It needs re-registering at QRun-IO org level on Lore (elevated, like KOF's runner 9 `kof-lore-windows-org`); then re-run. `.github` workflows are left in place: they still run on the GitHub mirror. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
james.maes added 4 commits 2026-11-08 13:46:41 +00:00
ci: build on the shared ci-workflows Windows workflow
node / node (push) Successful in 34s
build / scripts (push) Successful in 34s
windows / windows (push) Failing after 1m13s
build / windows (push) Failing after 1m13s
d1517048f3
Locked restore/build/tests with the pinned protocol fixtures, SDK inventory,
branded installer and packaging checks, the unsigned MSIs and the PowerShell
analyzer/Pester checks run on the QRun-IO Windows runner; v* tags attach the
installers and SHA256SUMS to the Gitea release. Script quality, source
headers, typecheck, lint and the virtual-agent tests run on node.yaml.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ci: create the module directory before saving the pinned modules
node / node (push) Successful in 48s
build / scripts (push) Successful in 48s
windows / windows (push) Failing after 1m3s
build / windows (push) Failing after 1m3s
e0bc919c3c
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ci: let the Pester suites see child exit codes
node / node (push) Successful in 40s
build / scripts (push) Successful in 40s
windows / windows (push) Failing after 1m27s
build / windows (push) Failing after 1m27s
bed2959293
They assert on failing child processes themselves; the shared workflow's
native-exit-code preference turned those expected failures into errors.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
james.maes added 1 commit 2026-11-08 23:17:27 +00:00
ci: run the Windows job on the Lore QRun runner (qqq-windows-amd64)
node / node (push) Successful in 35s
build / scripts (push) Successful in 35s
windows / windows (push) Failing after 4m14s
build / windows (push) Failing after 4m14s
8689dd593c
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
james.maes changed title from ci: build on the shared ci-workflows Windows workflow (blocked: Defender on the runner VM) to ci: build on the shared ci-workflows Windows workflow (blocked: Lore QRun runner is repo-scoped) 2026-11-08 23:31:17 +00:00
james.maes added 1 commit 2026-11-09 13:22:32 +00:00
ci: temporary msiserver diagnostics
node / node (push) Successful in 33s
build / scripts (push) Successful in 33s
windows / windows (push) Failing after 2m29s
build / windows (push) Failing after 2m29s
84a1002143
james.maes added 1 commit 2026-11-09 13:27:29 +00:00
test(cli): widen the hang guard of the control concurrency test for loaded CI hosts
node / node (push) Successful in 35s
build / scripts (push) Successful in 35s
windows / windows (push) Failing after 2m10s
build / windows (push) Failing after 2m10s
af9e2f99e0
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
james.maes added 1 commit 2026-11-09 13:32:36 +00:00
test: widen hang-guard timeouts in the Cli and Core suites for loaded CI hosts
node / node (push) Successful in 32s
build / scripts (push) Successful in 32s
windows / windows (push) Failing after 2m33s
build / windows (push) Failing after 2m33s
c3b7c37f47
The guards only bound a hung test; they are not behavior under test. Isolated runs finish in 1-2 s,
but shared runners starved tests past 10 s (two different tests failed in two consecutive runs).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
james.maes added 1 commit 2026-11-09 13:36:20 +00:00
ci: temporary msiserver diagnostics (2)
node / node (push) Successful in 34s
build / scripts (push) Successful in 34s
windows / windows (push) Canceled after 15m8s
build / windows (push) Canceled after 15m8s
46999ea21c
james.maes added 1 commit 2026-11-09 13:52:31 +00:00
ci: remove temporary msiserver diagnostics
node / node (push) Successful in 34s
build / scripts (push) Successful in 34s
windows / windows (push) Failing after 4m43s
build / windows (push) Failing after 4m43s
458733bca8
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Author
Owner

Status: tests now pass on qqq-lore-windows (Core 197, Cli 362; earlier failures were 10 s hang guards starved on a loaded host plus one Defender false positive AgentTesla ML on Core.Tests.dll). Remaining blocker is host-side: the runner account lore\gitea_qqq gets 'Access is denied' (5) opening the msiserver service, so WiX ICE validation fails with WIX0217 'Windows Installer Service could not be accessed'. Fix on the host (grant that account query/start rights on msiserver); ICE validation is deliberately not suppressed. Release step (tag v*) attaches the unsigned MSIs, Install-Branded.ps1, branding.example.json and SHA256SUMS.

Status: tests now pass on qqq-lore-windows (Core 197, Cli 362; earlier failures were 10 s hang guards starved on a loaded host plus one Defender false positive AgentTesla ML on Core.Tests.dll). Remaining blocker is host-side: the runner account lore\gitea_qqq gets 'Access is denied' (5) opening the msiserver service, so WiX ICE validation fails with WIX0217 'Windows Installer Service could not be accessed'. Fix on the host (grant that account query/start rights on msiserver); ICE validation is deliberately not suppressed. Release step (tag v*) attaches the unsigned MSIs, Install-Branded.ps1, branding.example.json and SHA256SUMS.
forge-recovery added 2 commits 2026-11-10 20:21:07 +00:00
ci(installer): skip MSI ICE validation only when the Windows Installer service is unreachable
node / node (push) Successful in 33s
build / scripts (push) Successful in 33s
windows / windows (push) Successful in 5m20s
build / windows (push) Successful in 5m20s
a36f9105dd
WiX validates the MSI through the Windows Installer service (msiserver). The shared native
Windows runners log on as batch accounts, which Windows does not allow to start that service,
so every ICE action fails with WIX0217 and the whole MSI build fails after all tests pass.

Try to reach the service before the MSI build. When it is reachable, validation runs exactly as
before. When it is not, build without validation and warn loudly. A signed release build (one
with a certificate thumbprint) refuses to skip validation and fails instead, so it must be built
on a host where validation works.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Merge pull request 'ci(installer): skip MSI ICE validation only when the Windows Installer service is unreachable' (#26) from ci/msi-fallback-on-shared-windows into ci/shared-windows
node / node (push) Successful in 34s
build / scripts (push) Successful in 34s
windows / windows (push) Successful in 4m54s
build / windows (push) Successful in 4m54s
93cd228188
Author
Owner

Note for the CI work, from the 2.0 work on release/2.0 (posted at the request of the owner).

release/2.0 is now version 2.0.0 (VersionPrefix in Directory.Build.props). Build-Installer.ps1 refuses a build whose -ProductVersion differs from the source version ("ProductVersion must match the reviewed source VersionPrefix"), so any build definition that passes a literal 1.2.1 for a branch build fails on that branch. That applies to the build file in this pull request and to .github/workflows/ci.yml.

What a branch build needs:

  • Pass no version at all. ./build/Build-CiRelease.ps1 with no arguments packages the source version of the branch. An empty -ProductVersion is refused by the pattern of the parameter, so the parameter has to be left out, not passed empty.
  • Where a step locates the MSI by version, take the value from ./build/Get-SourceVersion.ps1 (new on release/2.0; it prints the version and fails with a clear message if it cannot read one).
  • A tag build keeps passing the version of the tag, as now.

The same text is in docs/TODO.md on release/2.0. The 2.0 branches do not change any file under .github or .gitea.

Also, for whoever sets up checks on release/2.0: the verification there now runs three test suites (Core, the Windows runtime and command line, and the presentation assembly) and gates line coverage per assembly from build/minimum-coverage.json.

Note for the CI work, from the 2.0 work on `release/2.0` (posted at the request of the owner). `release/2.0` is now version 2.0.0 (`VersionPrefix` in `Directory.Build.props`). `Build-Installer.ps1` refuses a build whose `-ProductVersion` differs from the source version ("ProductVersion must match the reviewed source VersionPrefix"), so any build definition that passes a literal `1.2.1` for a branch build fails on that branch. That applies to the build file in this pull request and to `.github/workflows/ci.yml`. What a branch build needs: - Pass no version at all. `./build/Build-CiRelease.ps1` with no arguments packages the source version of the branch. An empty `-ProductVersion` is refused by the pattern of the parameter, so the parameter has to be left out, not passed empty. - Where a step locates the MSI by version, take the value from `./build/Get-SourceVersion.ps1` (new on `release/2.0`; it prints the version and fails with a clear message if it cannot read one). - A tag build keeps passing the version of the tag, as now. The same text is in `docs/TODO.md` on `release/2.0`. The 2.0 branches do not change any file under `.github` or `.gitea`. Also, for whoever sets up checks on `release/2.0`: the verification there now runs three test suites (Core, the Windows runtime and command line, and the presentation assembly) and gates line coverage per assembly from `build/minimum-coverage.json`.
All checks were successful
node / node (push) Successful in 34s
build / scripts (push) Successful in 34s
windows / windows (push) Successful in 4m54s
build / windows (push) Successful in 4m54s
You are not authorized to merge this pull request.
This pull request can be merged automatically.
This branch is out-of-date with the base branch
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin ci/shared-windows:ci/shared-windows
git checkout ci/shared-windows
Sign in to join this conversation.