feat(ci): run native Windows checks, off the pull-request path (#392)
Issue #368 asks for `cargo test`, `clippy` and `fmt` on the self-hosted Windows runner. Doing that in ci.yml would have made the problem worse, so this adds a separate workflow and moves the one job that was already breaking the rule. ## Why a new file rather than a job in ci.yml release.yml's header states the rule plainly: this repository is public, self-hosted runners must not be reachable from a pull request, and ci.yml is `pull_request`-triggered so self-hosted runners stay out of it. The Windows service smoke test was the exception. It was gated on `vars.ENABLE_WINDOWS_SERVICE_SMOKE`, which kept it skipped in practice, but a repository variable is not a documented security boundary against a fork pull request. GitHub's own documentation on variables says nothing about fork availability either way, so enabling that gate would have rested a public repository's self-hosted machine on an unverified assumption. Moving the job removes the question instead of answering it. Both triggers here are maintainer-only: `workflow_dispatch` needs write access, and `push` fires only for commits already on main. ## windows-checks Runs on every push to main, because coverage that has to be remembered is coverage that lapses. `fmt`, `clippy --all-targets -- -D warnings`, and `cargo test --lib`. The three check steps carry `continue-on-error` and a final step that fails the job on any of them. That is deliberate and temporary: #366 records four failing `--lib` tests and #367 four clippy sites, both reported from a developer machine rather than from a run anyone else can read, and a job that stopped at `fmt` would hide what the other two have to say. Remove the flags once those close. Two diagnostic steps run alongside. One records what the host actually is, including its display adapters; the other runs `all-smi doctor` on it. #370, #377 and #378 each need specific hardware, and that output is how anyone decides whether this runner can settle them or whether they stay open for want of a machine. ## windows-service Moved unchanged. All six steps are byte-identical; only the header comment and the gating differ. It now runs on request rather than on every push, because it registers and deletes a real machine-wide service and needs an elevated runner. Its first execution is what settles #357. A concurrency group covers both jobs: one box, one persistent CARGO_HOME, and a service registered under a fixed name.
J
Jeongkyu Shin committed
f40937da189a9d25967b506efb2f328e68f3477f
Parent: 6c0baa4
Committed by GitHub <noreply@github.com>
on 8/24/2026, 8:14:07 AM