Canonical governance surface for deterministic C:\dev workspace provisioning.
Build and gate lanes run with an always-isolated workspace policy:
git-worktreeprimary provisioning- detached-clone fallback
- deterministic root selection (
D:\devpreferred,C:\devfallback) - git trust bootstrap via
scripts\Ensure-GitSafeDirectories.ps1(including worktrees) - cleanup runs under
if: always()after artifact upload - published installer defaults remain unchanged (
ci-only-selector)
This repository owns:
workspace-governance.json(machine-readable remote/branch/commit contract)workspace-governance-payload\workspace-governance\*(canonical payload copied intoC:\devby installer runtime)workspace-governance-payload\tools\cdev-cli\*(bundled control-plane CLI assets for offline deterministic operation)AGENTS.md(human policy contract)- validation scripts in
scripts/ - drift and contract workflows in
.github/workflows/
Preferred operator interface:
pwsh -NoProfile -File C:\dev\tools\cdev-cli\win-x64\cdev-cli\scripts\Invoke-CdevCli.ps1 helpCore commands:
repos doctorinstaller exerciseinstaller install --mode releaseinstaller upgradeinstaller rollbackpostactions collectlinux deploy-ni --docker-context desktop-linux --image nationalinstruments/labview:latest-linux
The NSIS payload bundles pinned CLI assets for both win-x64 and linux-x64 and release preflight verifies their hashes against workspace-governance.json.
Workspace SHA Drift Signal runs on a schedule and on demand. It fails when any governed repo default branch SHA differs from its pinned_sha in workspace-governance.json.
Workspace SHA Refresh PR is the default remediation workflow. It updates pinned_sha values, reuses branch automation/sha-refresh, and creates or updates a single refresh PR to main.
Auto-refresh policy:
- Auto-merge is enabled by default for refresh PRs with squash strategy.
- Maintainer approval is not required for
labview-cdev-surfacerefresh merges (required_approving_review_count = 0). - Required status checks remain strict (
CI Pipeline,Workspace Installer Contract,Reproducibility Contract,Provenance Contract). workspace-sha-drift-signal.ymlusesWORKFLOW_BOT_TOKENfor cross-repo default-branch SHA reads.workspace-sha-refresh-pr.ymlrequires repository secretWORKFLOW_BOT_TOKENfor branch mutation and PR operations.- If
WORKFLOW_BOT_TOKENis missing or misconfigured, refresh automation fails fast with an explicit error. - Refresh CI propagation is PR-event-driven; refresh automation does not explicitly dispatch
ci.yml. - Manual refresh PR flow is fallback only for platform outages, not routine check propagation.
pwsh -NoProfile -File .\scripts\Test-WorkspaceManifestBranchDrift.ps1 `
-ManifestPath .\workspace-governance.json `
-OutputPath .\artifacts\workspace-drift\workspace-drift-report.jsonpwsh -NoProfile -File .\scripts\Test-PolicyContracts.ps1 `
-WorkspaceRoot C:\dev `
-FailOnWarningRun a fast local iteration (build + transfer bundle, skip smoke install):
pwsh -NoProfile -File .\scripts\Invoke-WorkspaceInstallerIteration.ps1 `
-Mode fast `
-Iterations 1Prerequisites for full installer qualification:
- LabVIEW 2020 (32-bit and 64-bit) installed for PPL capability.
- LabVIEW 2020 (64-bit) installed for VIP capability.
g-cli,git,gh,pwsh, anddotnetavailable on PATH.- NSIS installed at
C:\Program Files (x86)\NSIS(or pass an override).
Run a full local qualification (build + isolated smoke install + bundle):
pwsh -NoProfile -File .\scripts\Invoke-WorkspaceInstallerIteration.ps1 `
-Mode full `
-Iterations 1Watch mode for agent iteration without manual reruns:
pwsh -NoProfile -File .\scripts\Invoke-WorkspaceInstallerIteration.ps1 `
-Mode fast `
-Watch `
-PollSeconds 10 `
-MaxRuns 10CI Pipeline always runs on GitHub-hosted Linux and is the required merge check.
Self-hosted contract jobs are opt-in via repository variable ENABLE_SELF_HOSTED_CONTRACTS=true.
If no self-hosted runner is configured, these jobs stay skipped and do not block merge policy.
The workflow uses concurrency dedupe keyed by workflow/repo/ref to avoid duplicate active runs on the same branch.
When enabled, Workspace Installer Contract compiles:
lvie-cdev-workspace-installer.exe
The job stages a deterministic workspace payload, builds a manifest-pinned runner-cli bundle, and validates that NSIS build tooling can produce the installer on the self-hosted Windows lane.
Installer runtime is a hard gate for post-install capability in this order:
runner-cli ppl buildwith LabVIEW 2020 x86.runner-cli ppl buildwith LabVIEW 2020 x64.runner-cli vipc assert/apply/assertandrunner-cli vip buildwith LabVIEW 2020 x64.
Additional supply-chain contract jobs:
Reproducibility Contract: validates bit-for-bit determinism forrunner-clibundles (win-x64,linux-x64) and installer output.Provenance Contract: generates and validates SPDX + SLSA provenance artifacts linked to installer/bundle/manifest hashes.
integration-gate.yml provides a single Integration Gate context for:
pushtomainandintegration/*pull_requesttargetingmainandintegration/*- manual dispatch
It polls commit check-runs and only passes when these contexts are successful (or intentionally skipped):
CI PipelineWorkspace Installer ContractReproducibility ContractProvenance ContractRelease Race Hardening Drill
installer-harness-self-hosted.yml runs deterministic installer qualification on self-hosted-windows-lv with dedicated label installer-harness for:
pushtointegration/*workflow_dispatch(optionalrefoverride)
The harness run sequence:
- Runner baseline lock (
Assert-InstallerHarnessRunnerBaseline.ps1) - Machine preflight pack (
Assert-InstallerHarnessMachinePreflight.ps1) - Full local iteration (
Invoke-WorkspaceInstallerIteration.ps1 -Mode full -Iterations 1) - Report validation for smoke post-actions:
ppl_capability_checks.32 == passppl_capability_checks.64 == passvip_package_build_check == pass
Published evidence artifacts include:
iteration-summary.jsonexercise-report.jsonworkspace-install-latest.json(smoke)lvie-cdev-workspace-installer-bundle.zipharness-validation-report.json
Promotion policy:
- Keep
Installer Harnessnon-required initially. - Promote to required check after 3 consecutive green integration runs and at least 1 green manual dispatch run.
Runner drift recovery (only when baseline lock fails):
$token = gh api -X POST repos/LabVIEW-Community-CI-CD/labview-cdev-surface/actions/runners/registration-token --jq .token
Set-Location C:\actions-runner-cdev
.\config.cmd --url https://github.com/LabVIEW-Community-CI-CD/labview-cdev-surface --token $token --name DESKTOP-6Q81H4O-cdev-surface --labels self-hosted,windows,self-hosted-windows-lv --work _work --unattended --replace --runasservice
Set-Location C:\actions-runner-cdev-2
.\config.cmd --url https://github.com/LabVIEW-Community-CI-CD/labview-cdev-surface --token $token --name DESKTOP-6Q81H4O-cdev-surface-2 --labels self-hosted,windows,self-hosted-windows-lv,windows-containers --work _work --unattended --replace --runasservice
Set-Location C:\actions-runner-cdev-harness2
.\config.cmd --url https://github.com/LabVIEW-Community-CI-CD/labview-cdev-surface --token $token --name DESKTOP-6Q81H4O-cdev-surface-harness --labels self-hosted,windows,self-hosted-windows-lv,installer-harness --work _work --unattended --replace
Start-Process -FilePath cmd.exe -ArgumentList '/c run.cmd' -WorkingDirectory C:\actions-runner-cdev-harness2 -WindowStyle MinimizedArtifact upload reliability:
- Self-hosted artifact uploads run with deterministic two-attempt retry behavior.
- Operator escalation is required only when both upload attempts fail.
After the installer hard gate is consistently green, extend CI with a Docker Desktop Windows-image lane that:
- Installs the workspace via
lvie-cdev-workspace-installer.exe /S. - Uses bundled
runner-clifrom the installed workspace. - Runs
runner-cli ppl buildandrunner-cli vip buildon the LabVIEW-enabled Windows image. - Fails the lane on command-surface regressions or PPL/VIP capability loss.
Use local Docker Desktop Linux mode to iterate faster on runner-cli command-surface and policy contracts before running the full Windows LabVIEW image lane:
pwsh -NoProfile -File .\scripts\Invoke-DockerDesktopLinuxIteration.ps1 `
-DockerContext desktop-linux `
-Runtime linux-x64 `
-Image mcr.microsoft.com/powershell:7.4-ubuntu-22.04This lane bundles manifest-pinned runner-cli for linux-x64, runs runner-cli --help and runner-cli ppl --help inside the container, and optionally executes core Pester contract tests.
If Docker Desktop cannot start, verify Windows virtualization features are enabled (Microsoft-Hyper-V-All, VirtualMachinePlatform, Microsoft-Windows-Subsystem-Linux) and reboot after feature changes.
Build the NSIS self-test image (optional) and run a full build + silent install in the same Windows container.
The runtime is aligned to nationalinstruments/labview:2026q1-windows:
pwsh -NoProfile -File .\scripts\Invoke-WindowsContainerNsisSelfTest.ps1 `
-BuildLocalImage `
-Image labview-cdev-surface-nsis-selftest:localThis wrapper fails fast with windows_container_mode_required unless Docker reports OSType=windows.
The runtime stages manifest-pinned cdev-cli assets before building the installer, then executes the installer in silent mode (/S) inside the same container.
Outputs are written under:
artifacts\release\windows-container-nsis-selftestcontainer-report.jsonwindows-container-nsis-selftest-report.json
Publish the Windows parity image to GHCR with deterministic tags and pre-publish silent-install gating:
- Workflow:
.github/workflows/publish-windows-nsis-parity-image.yml - Trigger mode: manual
workflow_dispatch(publish contract is still validated by hosted-runner CI) - Image repo:
ghcr.io/labview-community-ci-cd/labview-cdev-surface-nsis-windows-parity - Default tags:
sha-<12-char-commit>,2026q1-windows-<yyyymmdd> - Optional manual tags:
latest(promote_latest=true) andadditional_tag
Use the Linux parity runtime aligned to nationalinstruments/labview:2026q1-linux:
pwsh -NoProfile -File .\scripts\Invoke-LinuxContainerNsisParity.ps1 `
-BuildLocalImage `
-Image labview-cdev-surface-nsis-linux-parity:local `
-DockerContext desktop-linuxThis lane validates Linux toolchain parity (labviewcli, pwsh, dotnet, git, makensis) and compiles a minimal NSIS smoke installer.
Installer execution is intentionally skipped on Linux (windows_installer_not_executable_on_linux).
The parity image uses an apt-driven dependency model aligned to NI's Linux custom-image guidance (labview-for-containers/docs/linux-custom-images.md).
Publish the Linux parity image to GHCR with deterministic tags:
- Workflow:
.github/workflows/publish-linux-nsis-parity-image.yml - Image repo:
ghcr.io/labview-community-ci-cd/labview-cdev-surface-nsis-linux-parity - Default tags:
sha-<12-char-commit>,2026q1-linux-<yyyymmdd> - Optional manual tags:
latest(promote_latest=true) andadditional_tag
Use manual workflow dispatch for release publication:
- Run
.github/workflows/release-with-windows-gate.yml. - Provide a new
release_tag:- Preferred SemVer:
vX.Y.Z(stable),vX.Y.Z-rc.N(prerelease),vX.Y.Z-canary.N(canary). - Legacy migration compatibility:
v0.YYYYMMDD.N.
- Preferred SemVer:
- Keep
allow_existing_tag=false(default). Settrueonly for break-glass overwrite operations. - Set
prereleaseto match the tag family (truefor prerelease/canary tags,falsefor stable tags). - Keep
allow_gate_override=false(default). - Set
release_channelexplicitly for canary tags (canary) to satisfy channel/tag consistency checks.
Automated flow:
repo_guardverifies release runs only inLabVIEW-Community-CI-CD/labview-cdev-surface.windows_gateruns Windows-container installer acceptance.gate_policyhard-blocks publish on gate failure.release_publishruns only when gate policy succeeds.
Controlled override (exception only):
- Set
allow_gate_override=true. - Provide non-empty
override_reason. - Provide
override_incident_urlpointing to a GitHub issue/discussion. - Workflow appends an "Override Disclosure" section to release notes.
Release packaging still:
- Builds
lvie-cdev-workspace-installer.exe. - Signs installer when signing certificate secrets are configured.
- Computes SHA256.
- Runs determinism gates and fails on hash drift.
- Generates
workspace-installer.spdx.jsonandworkspace-installer.slsa.json. - Generates
release-manifest.json. - Creates the GitHub release if missing and binds the tag to the exact workflow commit SHA.
- Uploads installer + SHA + provenance + reproducibility +
release-manifest.jsonassets to the release. - Writes release notes including SHA256 and the install command:
lvie-cdev-workspace-installer.exe /SVerify downloaded asset integrity by matching the local hash against the SHA256 value published in the release notes.
Tag immutability policy: existing release tags fail by default to prevent mutable release history.
Fallback entrypoint: .github/workflows/release-workspace-installer.yml (wrapper to _release-workspace-installer-core.yml).
Use the release client runtime for one-command install/upgrade/rollback from release assets:
pwsh -NoProfile -File .\scripts\Install-WorkspaceInstallerFromRelease.ps1 `
-Mode Install `
-Channel stableInstall a specific release tag:
pwsh -NoProfile -File .\scripts\Install-WorkspaceInstallerFromRelease.ps1 `
-Mode Install `
-Tag v0.1.1Upgrade from the current state file to latest stable:
pwsh -NoProfile -File .\scripts\Install-WorkspaceInstallerFromRelease.ps1 `
-Mode Upgrade `
-Channel stableRollback to previous release state:
pwsh -NoProfile -File .\scripts\Install-WorkspaceInstallerFromRelease.ps1 `
-Mode Rollback `
-RollbackTo previousValidate local release policy file:
pwsh -NoProfile -File .\scripts\Install-WorkspaceInstallerFromRelease.ps1 `
-Mode ValidatePolicyRelease client contract paths:
- Policy:
C:\dev\workspace-governance\release-policy.json - State:
C:\dev\artifacts\workspace-release-state.json - Latest report:
C:\dev\artifacts\workspace-release-client-latest.json
Default allowed installer release repositories:
LabVIEW-Community-CI-CD/labview-cdev-surfacesvelderrainruiz/labview-cdev-surface
Fork/upstream cdev-cli synchronization policy starts with full sync metadata:
- Primary CLI repo:
svelderrainruiz/labview-cdev-cli - Mirror repo:
LabVIEW-Community-CI-CD/labview-cdev-cli - Strategy:
fork-and-upstream-full-sync
Runtime image metadata is codified in installer_contract.release_client.runtime_images:
- cdev-cli runtime canonical repository:
ghcr.io/labview-community-ci-cd/labview-cdev-cli-runtime - cdev-cli runtime source repo/commit:
LabVIEW-Community-CI-CD/labview-cdev-cli@8fef6f9192d81a14add28636c1100c109ae5e977 - cdev-cli runtime digest:
sha256:0506e8789680ce1c941ca9f005b75d804150aed6ad36a5ac59458b802d358423 - ops runtime repository:
ghcr.io/labview-community-ci-cd/labview-cdev-surface-ops - ops runtime base repository/digest:
ghcr.io/labview-community-ci-cd/labview-cdev-cli-runtime@sha256:0506e8789680ce1c941ca9f005b75d804150aed6ad36a5ac59458b802d358423
Release channel metadata can be set during publish with workflow input release_channel (stable, prerelease, canary).
ops-monitoring.yml is scheduled hourly and supports manual dispatch. It runs scripts/Invoke-OpsMonitoringSnapshot.ps1 and fails on:
- runner availability drift (
runner_unavailable) - cdev-cli sync-guard drift/failure (
sync_guard_failed,sync_guard_stale,sync_guard_missing,sync_guard_incomplete)
Control-plane runner health is intentionally decoupled from Docker Desktop parity labels:
scripts/Invoke-ReleaseControlPlane.ps1andscripts/Invoke-OpsAutoRemediation.ps1call ops monitoring with release-runner labels only (self-hosted,windows,self-hosted-windows-lv).ops-monitoring.ymlkeeps strict defaults for Docker Desktop Windows gate visibility (self-hosted,windows,self-hosted-windows-lv,windows-containers,user-session,cdev-surface-windows-gate).
Incident lifecycle is deterministic and shared by ops workflows via scripts/Invoke-OpsIncidentLifecycle.ps1:
- failure: create/reopen/comment the workflow-specific incident issue
- recovery: comment and close the open incident issue
Every run uploads ops-monitoring-report.json.
canary-smoke-tag-hygiene.yml is scheduled daily and supports manual dispatch. It runs scripts/Invoke-CanarySmokeTagHygiene.ps1 in dual-mode:
legacy_date_window: keeps latestv0.YYYYMMDD.Ncanary smoke tag(s) for the selected UTC date.semver: keeps latest SemVer canary tags (vX.Y.Z-canary.N).auto(default): applies both policies in one deterministic pass.
ops-autoremediate.yml is scheduled hourly and supports manual dispatch. It runs scripts/Invoke-OpsAutoRemediation.ps1 to:
- auto-dispatch and verify cdev-cli sync-guard when sync drift is detected
- re-evaluate health after remediation
- fail with deterministic reason codes when manual intervention is still required
release-control-plane.yml is the autonomous orchestrator. It runs scripts/Invoke-ReleaseControlPlane.ps1 with modes:
CanaryCyclePromotePrereleasePromoteStableFullCycleValidate
Control-plane behavior:
- Runs ops health gate and optional auto-remediation.
- Dispatches release workflow with deterministic SemVer channel tags:
- canary:
vX.Y.Z-canary.N - prerelease:
vX.Y.Z-rc.N(promoted from latest semver canary) - stable:
vX.Y.Z(promoted from latest semver prerelease during policy window)
- canary:
- Verifies run completion and promotion source integrity (
assets + source commit == branch head). - Performs post-dispatch release verification (
required assets + release-manifest channel/tag/provenance checks). - Verifies promotion lineage for
PromotePrereleaseandPromoteStable(source/target channel + SemVer core + commit SHA). - Applies canary smoke tag hygiene with
tag_family=semverafter canary publish. - Reads SemVer gate policy from
installer_contract.release_client.ops_control_plane_policy.tag_strategy.semver_only_enforce_utc(default2026-07-01T00:00:00Z). - Reads stable promotion window policy from
installer_contract.release_client.ops_control_plane_policy.stable_promotion_window(default: full-cycle Mondays only, override allowed with audited reason). - Supports manual emergency override for FullCycle stable promotion via workflow_dispatch inputs:
force_stable_promotion_outside_window=trueforce_stable_promotion_reason=<structured reason with ticket/change reference, validated by policy regex>
- Emits explicit override audit artifact
release-control-plane-override-audit.jsonfor every run. - Auto-opens incident title
Release Control Plane Stable Override Alertwhenever decision code isstable_window_override_applied. - Emits deterministic migration warnings when legacy
v0.YYYYMMDD.Ntags are still present before the gate and fails withsemver_only_enforcement_violationafter the gate. - Loads GA policy contract
installer_contract.release_client.ops_control_plane_policy.schema_version=2.0and emits state-machine execution evidence (state_machine.transitions_executed) in every report. - Executes deterministic rollback orchestration (
Invoke-RollbackDrillSelfHealing.ps1) when configured trigger reason codes are hit. - Emits deterministic decision-trail evidence artifact
release-control-plane-decision-trail.json(report hash + state-machine + rollback evidence fingerprint).
Top-level release-control-plane deterministic failure reason codes include:
ops_health_gate_failedops_unhealthypromotion_source_missingpromotion_source_not_prereleasepromotion_source_asset_missingpromotion_source_not_at_headpromotion_lineage_invalidstable_window_override_invalidrelease_dispatch_report_invalidrelease_dispatch_watch_timeoutrelease_dispatch_watch_failedrelease_verification_failedcanary_hygiene_failedsemver_only_enforcement_violationcontrol_plane_runtime_error
weekly-ops-slo-report.yml emits machine-readable weekly SLO evidence via scripts/Write-OpsSloReport.ps1.
ops-slo-gate.yml is scheduled daily and supports manual dispatch. It runs scripts/Invoke-OpsSloSelfHealing.ps1 to enforce:
- 7-day lookback by default
- 100% success-rate target for
ops-monitoring,ops-autoremediate, andrelease-control-plane - max sync-guard success age of 12 hours
- hard error-budget defaults:
- 7-day budget window
- max failed runs:
0 - max failure-rate percent:
0
- alert thresholds for severity classification:
- warning minimum workflow success rate:
99.5 - critical minimum workflow success rate:
99 - warning reason codes:
workflow_missing_runs,workflow_success_rate_below_threshold - critical reason codes:
workflow_failure_detected,sync_guard_missing,sync_guard_stale,slo_gate_runtime_error,error_budget_exhausted,error_budget_failure_rate_exceeded
- warning minimum workflow success rate:
- bounded self-healing by dispatching
ops-autoremediate.ymland re-verifying SLO status - deterministic reason codes on failure:
auto_remediation_disabledremediation_verify_failedslo_self_heal_runtime_error
Underlying SLO evaluator scripts/Test-OpsSloGate.ps1 still emits deterministic reason_codes:
workflow_missing_runsworkflow_failure_detectedworkflow_success_rate_below_thresholdsync_guard_missingsync_guard_staleerror_budget_exhaustederror_budget_failure_rate_exceeded
ops-policy-drift-check.yml is scheduled hourly and supports manual dispatch. It runs scripts/Test-ReleaseControlPlanePolicyDrift.ps1 and fails on:
- root/payload release-client policy drift
- missing runtime image metadata
- missing control-plane policy metadata
- deterministic reason codes on failure:
release_client_driftruntime_images_missingops_control_plane_policy_missingops_control_plane_schema_version_invalidops_control_plane_state_machine_missingops_control_plane_state_machine_version_missingops_control_plane_rollback_orchestration_missingops_control_plane_decision_trail_missingops_control_plane_decision_trail_schema_version_missingops_control_plane_error_budget_missingops_control_plane_error_budget_window_days_invalidops_control_plane_slo_alert_thresholds_missingops_control_plane_self_healing_missingops_control_plane_guardrails_missingops_control_plane_stable_window_missingops_control_plane_stable_window_reason_pattern_missingops_control_plane_stable_window_reason_example_missing
release-rollback-drill.yml is scheduled daily and supports manual dispatch. It runs scripts/Invoke-RollbackDrillSelfHealing.ps1 to validate deterministic rollback readiness:
- channel-scoped latest/previous release candidates
- required release assets for rollback safety (
installer,.sha256,reproducibility-report.json, SPDX/SLSA,release-manifest.json) - bounded self-healing for
rollback_candidate_missingby dispatching one canary release and re-verifying rollback readiness - deterministic reason codes on failure:
auto_remediation_disabledno_automatable_actionremediation_verify_failedrollback_self_heal_runtime_error
Underlying rollback evaluator scripts/Invoke-ReleaseRollbackDrill.ps1 still emits deterministic reason_codes:
rollback_candidate_missingrollback_assets_missing
release-race-hardening-drill.yml runs on:
- weekly schedule
- manual dispatch
It runs scripts/Invoke-ReleaseRaceHardeningDrill.ps1 to prove release-tag collision handling under parallel dispatch pressure:
- dispatches a contender
release-workspace-installer.ymlrun at predicted next SemVer canary tag - dispatches
release-control-plane.ymlinCanaryCyclemode immediately after - watches both runs and downloads
release-control-plane-report-<run_id>artifact - requires collision evidence in control-plane execution (
collision_retries >= 1and/or collision attempt statuses) - requires release verification evidence from control-plane report (
release_verification.status=pass) - deterministic failure reason codes include:
control_plane_collision_not_observedcontender_dispatch_report_invalidcontrol_plane_dispatch_report_invalidcontrol_plane_watch_timeoutcontrol_plane_report_download_failedcontrol_plane_report_missingcontrol_plane_run_failed
Operational behavior:
- uploads
release-race-hardening-drill-report.json - emits weekly-review artifact
release-race-hardening-weekly-summary.json - uses incident lifecycle automation (
Invoke-OpsIncidentLifecycle.ps1) with issue titleRelease Race Hardening Drill Alerton failure/recovery
release-race-hardening-gate.yml provides the required branch-protection context (Release Race Hardening Drill) for:
pushtomainandintegration/*pull_requesttargetingmainandintegration/*
It runs scripts/Test-ReleaseRaceHardeningGate.ps1 and fails when:
- no recent successful drill run exists
- latest drill report is missing or not
reason_code=drill_passed - latest drill report does not include collision evidence
branch-protection-drift-check.yml continuously validates release branch-protection policy via scripts/Test-ReleaseBranchProtectionPolicy.ps1 and reports drift for:
mainintegration/*
Use scripts/Set-ReleaseBranchProtectionPolicy.ps1 to deterministically apply/repair required check contracts.
Branch-protection workflows require repository secret WORKFLOW_BOT_TOKEN and fail fast with workflow_bot_token_missing when absent.
Branch-protection query failures remain deterministic with classified reason codes:
branch_protection_query_failedbranch_protection_authentication_missingbranch_protection_authz_denied
release-guardrails-autoremediate.yml is scheduled hourly and supports manual dispatch. It runs scripts/Invoke-ReleaseGuardrailsSelfHealing.ps1 to:
- evaluate branch-protection drift and release race-hardening freshness in one pass
- auto-apply branch-protection policy via
Set-ReleaseBranchProtectionPolicy.ps1when mismatch/missing rules are detected - auto-dispatch
release-race-hardening-drill.ymlwhen drill freshness is missing or stale, then re-verify gate health - fail with deterministic reason codes:
already_healthyremediatedauto_remediation_disabledno_automatable_actionremediation_execution_failedremediation_verify_failedguardrails_self_heal_runtime_error
- include
remediation_hintsin the report when guardrails cannot self-heal (for token/authz and stale drill guidance)
Guardrails policy is codified in installer_contract.release_client.ops_control_plane_policy.self_healing.guardrails:
remediation_workflowrace_drill_workflowwatch_timeout_minutesverify_after_remediationrace_gate_max_age_hours
Incident lifecycle title for this lane is Release Guardrails Auto-Remediation Alert.
workflow-bot-token-drill.yml is scheduled weekly and supports manual dispatch. It runs scripts/Test-WorkflowBotTokenHealth.ps1 to verify that WORKFLOW_BOT_TOKEN can execute required control-plane API operations (repo read, actions runners read, and branch-protection GraphQL read).
- deterministic reason codes:
token_missingtoken_invalidtoken_scope_insufficienttoken_health_runtime_error
- incident lifecycle title for this lane:
Workflow Bot Token Health Alert
Run the local Docker harness (safe default, validate + dry-run):
pwsh -NoProfile -File .\scripts\Invoke-ReleaseControlPlaneLocalDocker.ps1 `
-Repository LabVIEW-Community-CI-CD/labview-cdev-surface-fork `
-Branch main `
-Mode Validate `
-DryRun `
-RunContractTestsThis executes scripts/Exercise-ReleaseControlPlaneLocal.ps1 in the portable ops container image and writes artifacts under:
artifacts\release-control-plane-local- Default container image:
ghcr.io/labview-community-ci-cd/labview-cdev-surface-ops:v1 - 2-image hierarchy:
- Base:
ghcr.io/labview-community-ci-cd/labview-cdev-cli-runtime@sha256:0506e8789680ce1c941ca9f005b75d804150aed6ad36a5ac59458b802d358423 - Derived ops runtime:
ghcr.io/labview-community-ci-cd/labview-cdev-surface-ops
- Base:
For offline or container runtime fallback on the host:
- add
-HostFallback
publish-ops-runtime-image.yml publishes the portable ops runtime container to:
ghcr.io/labview-community-ci-cd/labview-cdev-surface-ops
Deterministic tags:
sha-<12-char-commit>v1-YYYYMMDDv1(whenpromote_v1=true)
Ops runtime build policy:
- Base image is digest-pinned to canonical cdev-cli runtime:
ghcr.io/labview-community-ci-cd/labview-cdev-cli-runtime@sha256:0506e8789680ce1c941ca9f005b75d804150aed6ad36a5ac59458b802d358423
- Canonical consumer path remains org namespace:
ghcr.io/labview-community-ci-cd/labview-cdev-surface-ops
Manual publish:
gh workflow run publish-ops-runtime-image.yml `
-R LabVIEW-Community-CI-CD/labview-cdev-surface-fork `
-f promote_v1=trueRunbook for incidents:
docs/runbooks/release-ops-incident-response.md
nightly-supplychain-canary.yml runs on a nightly schedule and on demand. It executes:
- Docker Desktop Linux iteration (
desktop-linuxcontext). - Runner-cli determinism checks (
win-x64andlinux-x64). - Installer determinism check.
On failure, it updates a single tracking issue (Nightly Supply-Chain Canary Failure) with the failing run link.
windows-labview-image-gate.yml is dispatch-only and wraps ./.github/workflows/_windows-labview-image-gate-core.yml for standalone diagnostics.
The core gate requires the runner to already be in Windows container mode (non-interactive CI does not switch Docker engine), validates host/image OS-version compatibility via docker manifest inspect --verbose, then pulls nationalinstruments/labview:2026q1-windows by default (override with repo variable LABVIEW_WINDOWS_IMAGE), installs the NSIS workspace installer in-container, runs bundled runner-cli ppl build and runner-cli vip build, and verifies PPL + VIP output presence.
The core gate is pinned to dedicated labels so it runs only on the intended user-session runner lane: self-hosted, windows, self-hosted-windows-lv, windows-containers, user-session, cdev-surface-windows-gate.
Isolation behavior is controlled by LABVIEW_WINDOWS_DOCKER_ISOLATION:
auto(default): process isolation when host/image OS versions match, automatic Hyper-V fallback on mismatch.process: strict process isolation only (mismatch fails).hyperv: force Hyper-V isolation.
When validating Microsoft-Hyper-V and Containers feature setup for Docker Desktop:
- Classify
Enable-WindowsOptionalFeature ... -NoRestartwarning output as informational. - Verify features with a per-feature loop (single
-FeatureNameper call), not by passing an array directly. - Emit these explicit reporting fields:
features_enabled,reboot_pending,docker_daemon_ready.