diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 3490121df..15818add8 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -683,6 +683,8 @@ jobs:
'tools/CompareVI.Tools/CompareVI.Tools.psd1',
'tools/Compare-VIHistory.ps1',
'tools/Compare-RefsToTemp.ps1',
+ 'tools/Get-LabVIEWContainerShellContract.ps1',
+ 'tools/Run-NILinuxContainerCompare.ps1',
'scripts/CompareVI.psm1'
)) {
$candidate = Join-Path $bundleDir.FullName $relativePath
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 639a46e3d..f892c9308 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,27 @@ The format is based on Keep a Changelog, and this project adheres to Semantic Ve
## [Unreleased]
+## [v0.6.9] - 2026-03-30
+
+### Fixed
+
+- The published `CompareVI.Tools` bundle now includes the hosted NI Linux
+ runner helper `tools/Get-LabVIEWContainerShellContract.ps1`, restoring the
+ executable consumer contract for released VI-history downstreams that import
+ the bundle instead of a maintainer checkout.
+
+### Added
+
+- Release-time bundle certification now asserts the hosted NI Linux runner
+ contract files are present in the extracted `CompareVI.Tools` archive before
+ publication succeeds.
+
+### Documentation
+
+- Updated the release helper packet for the `v0.6.9` maintenance cut and
+ recorded the required coordination step to repin `comparevi-history` after
+ publication.
+
## [v0.6.7] - 2026-03-30
### Changed
diff --git a/Directory.Build.props b/Directory.Build.props
index 96c96a247..eb5b0923f 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -7,9 +7,9 @@
false
true
true
- 0.6.7
- 0.6.7.0
- 0.6.7.0
+ 0.6.9
+ 0.6.9.0
+ 0.6.9.0
$(Version)+local
package-first
project
diff --git a/docs/archive/releases/RELEASE_NOTES_v0.6.9.md b/docs/archive/releases/RELEASE_NOTES_v0.6.9.md
new file mode 100644
index 000000000..a93aeba68
--- /dev/null
+++ b/docs/archive/releases/RELEASE_NOTES_v0.6.9.md
@@ -0,0 +1,42 @@
+# Release Notes v0.6.9
+
+`v0.6.9` is a maintenance release that repairs the published
+`CompareVI.Tools` bundle so released VI-history downstreams can execute the
+hosted NI Linux contract without a maintainer checkout.
+
+## Highlights
+
+- The published `CompareVI.Tools` archive now includes
+ `tools/Get-LabVIEWContainerShellContract.ps1`, restoring the executable
+ hosted NI Linux consumer contract in the released bundle.
+- Release-time bundle certification now fails closed if the published archive
+ omits the hosted NI Linux support scripts required by VI-history consumers.
+- This cut is intentionally narrow. It repairs the released bundle contract; it
+ does not broaden the public VI-history product surface.
+
+## Included maintenance slice
+
+- `#2051` fix: ship complete NI Linux bundle contract
+
+## Validation highlights
+
+- Release branch `release/v0.6.9` updates the stable backend version surfaces
+ to `0.6.9`.
+- Direct bundle proof validated the repair before publication:
+ - extracted bundle contains both
+ `tools/Run-NILinuxContainerCompare.ps1`
+ and
+ `tools/Get-LabVIEWContainerShellContract.ps1`
+ - bundle certification summary reports `status: producer-native-ready`
+- Post-publication coordination for this cut is explicit:
+ - repin `comparevi-history` to `v0.6.9`
+ - rerun the canonical `DrawIcon.vi` proof on the released backend
+ - keep the public history surface constrained to characterization until the
+ developer-decision proof is satisfied
+
+## Consumer impact
+
+- Stable consumers should move from `@v0.6.8` to `@v0.6.9` to pick up the
+ repaired hosted NI Linux bundle contract.
+- `comparevi-history` should treat `v0.6.9` as the minimum backend ref for the
+ canonical `DrawIcon.vi` proof going forward.
diff --git a/docs/knowledgebase/VICompare-Refs-Workflow.md b/docs/knowledgebase/VICompare-Refs-Workflow.md
index c66e2dcbf..e2a6bce2f 100644
--- a/docs/knowledgebase/VICompare-Refs-Workflow.md
+++ b/docs/knowledgebase/VICompare-Refs-Workflow.md
@@ -129,10 +129,13 @@
- `compare_fail_fast` (`true`/`false`): stop iterating after the first detected diff (still uploads results, does not fail the job).
- `compare_fail_on_diff` (`true`/`false`): exit the job with failure status if any LVCompare run reports differences.
- `compare_modes` (string): comma-separated compare modes. Recognised values:
- - `default` - compare with no ignore flags (full detail).
- - `attributes` - apply `-noattr` to suppress attribute-only differences when you want a quieter run.
- - `front-panel` - apply `-nofp`/`-nofppos` to suppress front panel layout changes.
- - `block-diagram` - apply `-nobdcosm` to suppress block diagram cosmetic tweaks.
+ - `default` - legacy suppressed bundle (`-nobd -noattr -nofp -nofppos -nobdcosm`).
+ - `attributes` - keep attribute diffs visible while suppressing front panel
+ and block diagram surfaces.
+ - `front-panel` - keep front panel diffs visible while suppressing
+ attributes and block diagram surfaces.
+ - `block-diagram` - keep block diagram diffs visible while suppressing
+ attributes and front panel surfaces.
- `full` - run LVCompare with no ignore flags (`-nobd`, `-noattr`, `-nofp`, `-nofppos`,
`-nobdcosm` all disabled). Use when you need every cosmetic and functional change.
- `all` - alias for `full` (deprecated; the helper rewrites to `full` and emits a warning).
diff --git a/docs/release/PR_NOTES.md b/docs/release/PR_NOTES.md
index 478c4d0d4..84b7391a7 100644
--- a/docs/release/PR_NOTES.md
+++ b/docs/release/PR_NOTES.md
@@ -1,34 +1,34 @@
-# Release v0.6.7 - PR Notes Helper
+# Release v0.6.9 - PR Notes Helper
-Reference sheet for the `v0.6.7` maintenance release. This cut ships the
-merge-aware VI history start-ref repair from `develop` without bundling the
-separate mode-semantics correction work.
+Reference sheet for the `v0.6.9` maintenance release. This cut repairs the
+published `CompareVI.Tools` bundle so released downstream consumers can execute
+the hosted NI Linux VI-history contract without a maintainer checkout.
## 1. Summary
-Release `v0.6.7` focuses on three themes:
+Release `v0.6.9` focuses on three themes:
-- **Merge-aware history anchors**: `tools/Compare-VIHistory.ps1` now preserves
- a requested merge commit as the start of the history window when the target
- VI changed through that merge.
-- **Canonical single-VI recovery**: this is the backend cut required for the
- `comparevi-history` `DrawIcon.vi` proof to render real comparisons instead of
- honestly failing closed with zero executed pairs.
-- **Narrow maintenance scope**: this cut does not claim to solve the separate
- question of which public history modes are decision-useful; that remains the
- next product-semantic slice.
+- **Executable released bundle**: `CompareVI.Tools-v0.6.9.zip` now carries the
+ hosted NI Linux helper `tools/Get-LabVIEWContainerShellContract.ps1` instead
+ of shipping an incomplete runtime contract.
+- **Released-backend recovery**: downstream VI-history consumers can once again
+ rely on the published bundle rather than a maintainer override or local
+ source tree to execute the canonical proof path.
+- **Narrow maintenance scope**: this cut only repairs released bundle
+ executability. It does not expand the public VI-history surface or add new
+ product claims.
## 2. Maintenance Highlights
-- History start-ref resolution now uses merge-aware path detection
- (`git diff-tree --root -m ...`) instead of merge-blind detection, so
- merge-only VI touches stay inside the emitted history plan.
-- The shipped backend can now preserve `startRef=47ae...` for the canonical
- `DrawIcon.vi` proof instead of collapsing that proof to
- `startRef=endRef=fe98...` and zero comparisons.
-- Stable release surfaces now pin `0.6.7`, isolating the backend repair in an
- immutable stable cut before the separate mode-semantics work begins.
+- `tools/Publish-CompareVIToolsArtifact.ps1` now places
+ `tools/Get-LabVIEWContainerShellContract.ps1` in the bundle and advertises it
+ through the published hosted-runner contract metadata.
+- `tools/Test-CompareVIHistoryBundleCertification.ps1` now fails closed if the
+ extracted bundle omits the hosted NI Linux support scripts required by the
+ released consumer path.
+- Stable release surfaces now pin `0.6.9`, isolating the bundle-contract repair
+ in an immutable stable cut after the broken `v0.6.8` publication.
## 3. Validation Snapshot
@@ -38,17 +38,16 @@ Release `v0.6.7` focuses on three themes:
- `smoke-gate`
- `Policy Guard (Upstream) / policy-guard`
- `commit-integrity`
-- [x] Direct backend proof preserved the requested merge-aware history window:
- - real-history stub proof preserved `startRef=47ae...` and processed four
- comparison pairs across the requested modes
- - synthetic merge-history proof preserved a merge commit as `startRef` while
- the legacy probe reported no path touch
-- [ ] `node tools/npm/run-script.mjs release:finalize -- 0.6.7` completes from
+- [x] Direct bundle proof restored the published hosted NI Linux contract:
+ - extracted bundle contains both `tools/Run-NILinuxContainerCompare.ps1` and
+ `tools/Get-LabVIEWContainerShellContract.ps1`
+ - bundle certification summary reports `status: producer-native-ready`
+- [ ] `node tools/npm/run-script.mjs release:finalize -- 0.6.9` completes from
a clean helper lane and writes fresh finalize metadata under
`tests/results/_agent/release/`
-- [ ] Published release `v0.6.7` includes the signed distribution assets,
+- [ ] Published release `v0.6.9` includes the signed distribution assets,
`SHA256SUMS.txt`, `sbom.spdx.json`, and `provenance.json`
-- [ ] `comparevi-history` repins `comparevi-backend-ref.txt` to `v0.6.7`
+- [ ] `comparevi-history` repins `comparevi-backend-ref.txt` to `v0.6.9`
before the canonical `DrawIcon.vi` product proof is rerun
## 4. Reviewer Focus
@@ -57,21 +56,22 @@ Release `v0.6.7` focuses on three themes:
- `package.json`
- `Directory.Build.props`
- `tools/CompareVI.Tools/CompareVI.Tools.psd1`
-- Review the start-ref repair for correctness:
- - `tools/Compare-VIHistory.ps1`
- - `tests/CompareVI.History.Tests.ps1`
+- Review the released bundle contract repair for correctness:
+ - `tools/Publish-CompareVIToolsArtifact.ps1`
+ - `tools/Test-CompareVIHistoryBundleCertification.ps1`
+ - `docs/schemas/comparevi-history-bundle-certification-v1.schema.json`
- Review the release helper packet for consistency:
- `CHANGELOG.md`
- `docs/release/TAG_PREP_CHECKLIST.md`
- - `docs/archive/releases/RELEASE_NOTES_v0.6.7.md`
+ - `docs/archive/releases/RELEASE_NOTES_v0.6.9.md`
## 5. Follow-Up After Stable
-1. Re-pin `comparevi-history` from `v0.6.6` to `v0.6.7` and rerun the
+1. Re-pin `comparevi-history` from `v0.6.8` to `v0.6.9` and rerun the
canonical `DrawIcon.vi` proof on the released backend.
-2. Take the separate mode-semantics correction before treating the emitted
- public history modes as trustworthy decision surfaces.
-3. Reduce the public mode surface if the rerun product proof only justifies a
- narrower mode set.
+2. Re-evaluate the current emitted history surface against the real developer
+ question before treating any mode as decision-ready.
+3. Reduce the public mode surface again if the rerun product proof only
+ justifies a narrower mode set.
---- Updated: 2026-03-30 (prepared for the `v0.6.7` maintenance cut).
+--- Updated: 2026-03-30 (prepared for the `v0.6.9` maintenance cut).
diff --git a/docs/release/TAG_PREP_CHECKLIST.md b/docs/release/TAG_PREP_CHECKLIST.md
index adce2e9c2..78befb22c 100644
--- a/docs/release/TAG_PREP_CHECKLIST.md
+++ b/docs/release/TAG_PREP_CHECKLIST.md
@@ -1,14 +1,14 @@
-# v0.6.7 Tag Preparation Checklist
+# v0.6.9 Tag Preparation Checklist
-Helper reference for cutting or replaying the `v0.6.7` maintenance release.
+Helper reference for cutting or replaying the `v0.6.9` maintenance release.
Aligns with the archived release notes
-(`../archive/releases/RELEASE_NOTES_v0.6.7.md`) and the checked-in stable
+(`../archive/releases/RELEASE_NOTES_v0.6.9.md`) and the checked-in stable
release surfaces.
## 1. Pre-flight Verification
-- [ ] Work from `release/v0.6.7` and ensure it contains the final maintenance
+- [ ] Work from `release/v0.6.9` and ensure it contains the final maintenance
changes.
- [ ] CI is green on the release branch (`lint`, `pester / normalize`,
`smoke-gate`, `Policy Guard (Upstream) / policy-guard`,
@@ -22,29 +22,30 @@ release surfaces.
## 2. Version & Metadata Consistency
- [ ] `CHANGELOG.md` contains a finalized
- `## [v0.6.7] - 2026-03-30` section.
-- [ ] Stable docs reference `v0.6.6` consistently until `v0.6.7` publication
- completes, and the release helper packet references `v0.6.7`
+ `## [v0.6.9] - 2026-03-30` section.
+- [ ] Stable docs reference `v0.6.8` consistently until `v0.6.9` publication
+ completes, and the release helper packet references `v0.6.9`
consistently.
- [ ] `package.json`, `Directory.Build.props`, and
- `tools/CompareVI.Tools/CompareVI.Tools.psd1` all report `0.6.7`.
+ `tools/CompareVI.Tools/CompareVI.Tools.psd1` all report `0.6.9`.
- [ ] `docs/action-outputs.md` still matches `action.yml`.
- [ ] Update `docs/documentation-manifest.json` if release-doc coverage changed.
-## 3. Start-Ref Regression Validation
+## 3. Bundle Contract Regression Validation
-- [ ] Focused history regression tests pass locally:
+- [ ] Focused bundle regression tests pass locally:
```bash
-pwsh -NoLogo -NoProfile -Command "Invoke-Pester -Path 'tests/CompareVI.History.Tests.ps1' -Output Detailed -CI"
+pwsh -NoLogo -NoProfile -File tools/Test-CompareVIHistoryBundleCertification.ps1 -BundleArchivePath tests/results/_agent/bundle-fix/artifacts/CompareVI.Tools-v0.6.9.zip -ResultsDir tests/results/_agent/bundle-fix/certification -SummaryJsonPath tests/results/_agent/bundle-fix/certification/summary.json
```
-- [ ] Confirm the direct backend proofs preserve the requested history start:
+- [ ] Confirm the published bundle preserves the hosted NI Linux consumer contract:
-- [ ] Real-history stub proof preserves `startRef=47ae...` for
- `DrawIcon.vi` and processes four comparison pairs.
-- [ ] Synthetic merge-history proof preserves the merge commit as `startRef`
- while the legacy non-merge-aware probe reports no touch.
+- [ ] The extracted bundle contains:
+ `tools/Run-NILinuxContainerCompare.ps1`
+ and
+ `tools/Get-LabVIEWContainerShellContract.ps1`
+- [ ] Bundle certification reports `status: producer-native-ready`
- [ ] `comparevi-history` pin-bump coordination is queued immediately after
publication so the canonical product proof uses the released backend
instead of a maintainer override.
@@ -52,9 +53,9 @@ pwsh -NoLogo -NoProfile -Command "Invoke-Pester -Path 'tests/CompareVI.History.T
## 4. Release Materials Review
- [ ] `PR_NOTES.md`, this checklist, and
- `../archive/releases/RELEASE_NOTES_v0.6.7.md` are consistent.
-- [ ] `README.md` and `docs/USAGE_GUIDE.md` still treat `v0.6.6` as the
- previously released stable pin until `v0.6.7` publication completes.
+ `../archive/releases/RELEASE_NOTES_v0.6.9.md` are consistent.
+- [ ] `README.md` and `docs/USAGE_GUIDE.md` still treat `v0.6.8` as the
+ previously released stable pin until `v0.6.9` publication completes.
## 5. Tag Creation
@@ -62,7 +63,7 @@ pwsh -NoLogo -NoProfile -Command "Invoke-Pester -Path 'tests/CompareVI.History.T
```pwsh
node tools/npm/run-script.mjs priority:release:signing:readiness
-node tools/npm/run-script.mjs priority:release:conductor -- --apply --channel stable --version 0.6.7
+node tools/npm/run-script.mjs priority:release:conductor -- --apply --channel stable --version 0.6.9
```
- [ ] Confirm `tests/results/_agent/release/release-signing-readiness.json`
@@ -73,31 +74,31 @@ node tools/npm/run-script.mjs priority:release:conductor -- --apply --channel st
- [ ] Create an annotated stable tag:
```pwsh
-git tag -a v0.6.7 -m "v0.6.7: publish merge-aware VI history start-ref repair"
+git tag -a v0.6.9 -m "v0.6.9: repair CompareVI.Tools hosted bundle contract"
```
- [ ] Push the tag:
```pwsh
-git push origin v0.6.7
+git push origin v0.6.9
```
## 6. Validation After Publish
-- [ ] Run `node tools/npm/run-script.mjs release:finalize -- 0.6.7` from a
+- [ ] Run `node tools/npm/run-script.mjs release:finalize -- 0.6.9` from a
clean helper lane to fast-forward `main` and `develop`, then record the
finalize metadata.
-- [ ] Install the action via `@v0.6.7` in a sample workflow and confirm a
- merge-aware VI history run preserves the requested start ref.
-- [ ] Re-pin `comparevi-history` to `v0.6.7` and confirm the canonical
- `DrawIcon.vi` proof reaches real comparisons instead of failing closed on
- zero executed pairs.
+- [ ] Install the bundle via `@v0.6.9` in a sample workflow and confirm the
+ released hosted NI Linux VI-history contract executes without a local
+ source-tree override.
+- [ ] Re-pin `comparevi-history` to `v0.6.9` and confirm the canonical
+ `DrawIcon.vi` proof reaches real comparisons on the released backend.
## 7. Communication
-- [ ] Announce the maintenance cut, calling out the merge-aware history
- start-ref repair and the required `comparevi-history` repin.
-- [ ] Notify consumers that `v0.6.7` supersedes `v0.6.6` as the supported
+- [ ] Announce the maintenance cut, calling out the released bundle-contract
+ repair and the required `comparevi-history` repin.
+- [ ] Notify consumers that `v0.6.9` supersedes `v0.6.8` as the supported
stable pin.
---- Updated: 2026-03-30 (prepared for the `v0.6.7` maintenance cut).
+--- Updated: 2026-03-30 (prepared for the `v0.6.9` maintenance cut).
diff --git a/docs/schemas/comparevi-history-bundle-certification-v1.schema.json b/docs/schemas/comparevi-history-bundle-certification-v1.schema.json
index e0a4f0886..f2b0967c0 100644
--- a/docs/schemas/comparevi-history-bundle-certification-v1.schema.json
+++ b/docs/schemas/comparevi-history-bundle-certification-v1.schema.json
@@ -145,7 +145,12 @@
"bundleImportPath",
"bundleImportPathExists",
"releaseAssetPattern",
- "contractPathResolutions"
+ "contractPathResolutions",
+ "hostedRunnerEntryScriptPath",
+ "hostedRunnerEntryScriptExists",
+ "hostedRunnerSupportScriptPaths",
+ "hostedRunnerSupportScriptsExist",
+ "hostedRunnerMissingSupportScripts"
],
"properties": {
"status": {
@@ -236,6 +241,24 @@
},
"additionalProperties": false
}
+ },
+ "hostedRunnerEntryScriptPath": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "hostedRunnerEntryScriptExists": {
+ "type": "boolean"
+ },
+ "hostedRunnerSupportScriptPaths": {
+ "$ref": "#/$defs/stringArray"
+ },
+ "hostedRunnerSupportScriptsExist": {
+ "type": "boolean"
+ },
+ "hostedRunnerMissingSupportScripts": {
+ "$ref": "#/$defs/stringArray"
}
},
"additionalProperties": false
@@ -276,6 +299,8 @@
"bundleContractPinResolved",
"bundleImportPathExists",
"bundleContractPathsResolved",
+ "hostedRunnerEntryScriptExists",
+ "hostedRunnerSupportScriptsExist",
"passed"
],
"properties": {
@@ -342,6 +367,12 @@
"bundleContractPathsResolved": {
"type": "boolean"
},
+ "hostedRunnerEntryScriptExists": {
+ "type": "boolean"
+ },
+ "hostedRunnerSupportScriptsExist": {
+ "type": "boolean"
+ },
"passed": {
"type": "boolean"
}
diff --git a/docs/test-requirements/vi-history-reporting.md b/docs/test-requirements/vi-history-reporting.md
index 0e0a1bc80..10440c25b 100644
--- a/docs/test-requirements/vi-history-reporting.md
+++ b/docs/test-requirements/vi-history-reporting.md
@@ -8,10 +8,16 @@ This document tracks the atomic test requirements for `tools/Compare-VIHistory.p
1. Manifest shall record `mode` equal to the requested value.
1. Each comparison entry shall record `mode` equal to the requested value.
1. `manifest.flags` shall contain the expected flag bundle per mode:
- - `default`: no ignore flags present.
- - `attributes`: includes `-noattr` only.
- - `front-panel`: includes `-nofp`, `-nofppos` only.
- - `block-diagram`: includes `-nobdcosm` only.
+ - `default`: includes the legacy suppression bundle
+ (`-nobd`, `-noattr`, `-nofp`, `-nofppos`, `-nobdcosm`).
+ - `attributes`: keeps attribute diffs visible while still suppressing
+ block-diagram and front-panel surfaces
+ (`-nobd`, `-nofp`, `-nofppos`, `-nobdcosm`).
+ - `front-panel`: keeps front-panel diffs visible while still suppressing
+ attributes and block-diagram surfaces (`-nobd`, `-noattr`,
+ `-nobdcosm`).
+ - `block-diagram`: keeps block-diagram diffs visible while still suppressing
+ attributes and front-panel surfaces (`-noattr`, `-nofp`, `-nofppos`).
- `full`: no ignore flags present (all ignore flags disabled).
- `all`: legacy alias for `full` (the tooling rewrites it and warns).
- `custom`: flag list matches explicit inputs.
diff --git a/package-lock.json b/package-lock.json
index 421ff4d8f..cceb48561 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "compare-vi-cli-action",
- "version": "0.6.7",
+ "version": "0.6.9",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "compare-vi-cli-action",
- "version": "0.6.7",
+ "version": "0.6.9",
"license": "BSD-3-Clause",
"dependencies": {
"argparse": "^2.0.1",
diff --git a/package.json b/package.json
index a73212210..2fd6d5c5b 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"name": "compare-vi-cli-action",
"private": true,
- "version": "0.6.7",
+ "version": "0.6.9",
"license": "BSD-3-Clause",
"type": "module",
"scripts": {
diff --git a/tests/CompareVI.History.Tests.ps1 b/tests/CompareVI.History.Tests.ps1
index 7b59c02d9..0a638c927 100644
--- a/tests/CompareVI.History.Tests.ps1
+++ b/tests/CompareVI.History.Tests.ps1
@@ -938,7 +938,7 @@ exit 0
$manifest.comparisons.Count | Should -Be 1
}
- It 'drops block diagram cosmetic ignore when block-diagram mode is selected' {
+ It 'keeps block diagram diffs visible when block-diagram mode is selected' {
if (-not $_pairs) { Set-ItResult -Skipped -Because 'Missing commit data'; return }
$env:STUB_COMPARE_DIFF = '0'
$pair = $_pairs[0]
@@ -959,8 +959,8 @@ exit 0
$aggregate = Get-Content -LiteralPath $suitePath -Raw | ConvertFrom-Json
$modeEntry = $aggregate.modes | Where-Object { $_.slug -eq 'block-diagram' }
$modeEntry | Should -Not -BeNullOrEmpty
+ ($modeEntry.flags -contains '-nobd') | Should -BeFalse
($modeEntry.flags -contains '-nobdcosm') | Should -BeFalse
- $modeEntry.flags | Should -Contain '-nobd'
$modeEntry.flags | Should -Contain '-noattr'
$modeEntry.flags | Should -Contain '-nofp'
$modeEntry.flags | Should -Contain '-nofppos'
@@ -968,8 +968,8 @@ exit 0
Test-Path -LiteralPath $modeEntry.manifestPath | Should -BeTrue
$manifest = Get-Content -LiteralPath $modeEntry.manifestPath -Raw | ConvertFrom-Json
$manifest.mode | Should -Be 'block-diagram'
+ ($manifest.flags -contains '-nobd') | Should -BeFalse
($manifest.flags -contains '-nobdcosm') | Should -BeFalse
- $manifest.flags | Should -Contain '-nobd'
$manifest.flags | Should -Contain '-noattr'
$manifest.flags | Should -Contain '-nofp'
$manifest.flags | Should -Contain '-nofppos'
diff --git a/tools/Compare-VIHistory.ps1 b/tools/Compare-VIHistory.ps1
index f8b154b2a..d669c5caf 100644
--- a/tools/Compare-VIHistory.ps1
+++ b/tools/Compare-VIHistory.ps1
@@ -118,6 +118,7 @@ $modeDefinitions = @{
slug = 'block-diagram'
presetFlags = $null
adjustments = @{
+ ForceNoBd = $false
FlagNoBdCosm = $false
}
}
diff --git a/tools/CompareVI.Tools/CompareVI.Tools.psd1 b/tools/CompareVI.Tools/CompareVI.Tools.psd1
index 70220b554..39a3ba310 100644
--- a/tools/CompareVI.Tools/CompareVI.Tools.psd1
+++ b/tools/CompareVI.Tools/CompareVI.Tools.psd1
@@ -1,6 +1,6 @@
@{
RootModule = 'CompareVI.Tools.psm1'
- ModuleVersion = '0.6.7'
+ ModuleVersion = '0.6.9'
GUID = '1f9b5f7f-1ab6-4db9-8e36-6b7a6d5e9c8f'
Author = 'LabVIEW Community CI'
CompanyName = 'LabVIEW Community'
diff --git a/tools/Publish-CompareVIToolsArtifact.ps1 b/tools/Publish-CompareVIToolsArtifact.ps1
index 8cfba1556..879109424 100644
--- a/tools/Publish-CompareVIToolsArtifact.ps1
+++ b/tools/Publish-CompareVIToolsArtifact.ps1
@@ -165,6 +165,7 @@ $requiredRelativePaths = @(
'tools/HostRamBudget.psm1',
'tools/Compare-VIHistory.ps1',
'tools/Compare-RefsToTemp.ps1',
+ 'tools/Get-LabVIEWContainerShellContract.ps1',
'tools/Invoke-LVCompare.ps1',
'tools/Invoke-NILinuxReviewSuite.ps1',
'tools/Invoke-VIHistoryLocalRefinement.ps1',
@@ -498,7 +499,8 @@ try {
entryScriptPath = 'tools/Run-NILinuxContainerCompare.ps1'
supportScriptPaths = @(
'tools/Assert-DockerRuntimeDeterminism.ps1',
- 'tools/Compare-ExitCodeClassifier.ps1'
+ 'tools/Compare-ExitCodeClassifier.ps1',
+ 'tools/Get-LabVIEWContainerShellContract.ps1'
)
captureFileName = 'ni-linux-container-capture.json'
defaultImage = $hostedNiLinuxDefaultImage
diff --git a/tools/Test-CompareVIHistoryBundleCertification.ps1 b/tools/Test-CompareVIHistoryBundleCertification.ps1
index aba19bca2..1782bfa19 100644
--- a/tools/Test-CompareVIHistoryBundleCertification.ps1
+++ b/tools/Test-CompareVIHistoryBundleCertification.ps1
@@ -495,6 +495,11 @@ $bundleDistributionModel = $null
$bundleImportPath = $null
$bundleReleaseAssetPattern = $null
$bundleContractPathResolutions = @()
+$hostedRunnerEntryScriptPath = $null
+$hostedRunnerEntryScriptExists = $false
+$hostedRunnerSupportScriptPaths = @()
+$hostedRunnerSupportScriptsExist = $false
+$hostedRunnerMissingSupportScripts = @()
if ($bundleMetadataPresent) {
$bundleMetadata = Get-Content -LiteralPath $bundleMetadataPath -Raw | ConvertFrom-Json -Depth 12
@@ -540,13 +545,34 @@ if ($bundleMetadataPresent) {
$bundleContractPathResolutions = @($pathResolutions.ToArray())
}
+ $hostedRunnerContract = $bundleMetadata.consumerContract.hostedNiLinuxRunner
+ if ($null -ne $hostedRunnerContract) {
+ $hostedRunnerEntryScriptPath = [string]$hostedRunnerContract.entryScriptPath
+ if (-not [string]::IsNullOrWhiteSpace($hostedRunnerEntryScriptPath)) {
+ $hostedRunnerEntryScriptExists = Test-Path -LiteralPath (Join-Path $executionRoot $hostedRunnerEntryScriptPath) -PathType Leaf
+ }
+
+ $hostedRunnerSupportScriptPaths = @(
+ $hostedRunnerContract.supportScriptPaths |
+ ForEach-Object { [string]$_ } |
+ Where-Object { -not [string]::IsNullOrWhiteSpace($_) }
+ )
+ $hostedRunnerMissingSupportScripts = @(
+ $hostedRunnerSupportScriptPaths |
+ Where-Object { -not (Test-Path -LiteralPath (Join-Path $executionRoot $_) -PathType Leaf) }
+ )
+ $hostedRunnerSupportScriptsExist = ($hostedRunnerMissingSupportScripts.Count -eq 0)
+ }
+
if ($bundleContractRequired) {
$bundleContractStatus = if ($bundleMetadataSchemaMatches -and `
$viHistoryCapabilityPresent -and `
$viHistoryCapabilityProducerNative -and `
$bundleContractPinResolved -and `
$bundleImportPathExists -and `
- $bundleContractPathsResolved) {
+ $bundleContractPathsResolved -and `
+ $hostedRunnerEntryScriptExists -and `
+ $hostedRunnerSupportScriptsExist) {
'producer-native-ready'
} else {
'producer-native-incomplete'
@@ -561,7 +587,9 @@ $bundleContractPassed = if ($bundleContractRequired) {
$viHistoryCapabilityProducerNative -and `
$bundleContractPinResolved -and `
$bundleImportPathExists -and `
- $bundleContractPathsResolved
+ $bundleContractPathsResolved -and `
+ $hostedRunnerEntryScriptExists -and `
+ $hostedRunnerSupportScriptsExist
} else {
$true
}
@@ -632,6 +660,12 @@ if (-not $passed) {
$unresolvedPaths = @($bundleContractPathResolutions | Where-Object { -not $_.resolved } | ForEach-Object { $_.path })
$failureReasons.Add(("vi-history contract paths did not resolve: {0}" -f ($unresolvedPaths -join ', '))) | Out-Null
}
+ if ($bundleContractRequired -and -not $hostedRunnerEntryScriptExists) {
+ $failureReasons.Add(("hosted NI Linux runner entry script missing from extracted archive: {0}" -f $hostedRunnerEntryScriptPath)) | Out-Null
+ }
+ if ($bundleContractRequired -and -not $hostedRunnerSupportScriptsExist) {
+ $failureReasons.Add(("hosted NI Linux runner support scripts missing from extracted archive: {0}" -f ($hostedRunnerMissingSupportScripts -join ', '))) | Out-Null
+ }
throw ("Multi-mode history bundle certification failed: {0}" -f ($failureReasons -join '; '))
}
@@ -684,6 +718,11 @@ $summaryObject = [ordered]@{
bundleImportPathExists = $bundleImportPathExists
releaseAssetPattern = $bundleReleaseAssetPattern
contractPathResolutions = $bundleContractPathResolutions
+ hostedRunnerEntryScriptPath = $hostedRunnerEntryScriptPath
+ hostedRunnerEntryScriptExists = $hostedRunnerEntryScriptExists
+ hostedRunnerSupportScriptPaths = @($hostedRunnerSupportScriptPaths)
+ hostedRunnerSupportScriptsExist = $hostedRunnerSupportScriptsExist
+ hostedRunnerMissingSupportScripts = @($hostedRunnerMissingSupportScripts)
}
historyFacade = [ordered]@{
schema = [string]$historySummary.schema
@@ -717,6 +756,8 @@ $summaryObject = [ordered]@{
bundleContractPinResolved = $bundleContractPinResolved
bundleImportPathExists = $bundleImportPathExists
bundleContractPathsResolved = $bundleContractPathsResolved
+ hostedRunnerEntryScriptExists = $hostedRunnerEntryScriptExists
+ hostedRunnerSupportScriptsExist = $hostedRunnerSupportScriptsExist
passed = $true
}
}
@@ -740,6 +781,8 @@ $summaryLines += ('- Producer-native vi-history capability: `{0}`' -f $bundleCon
if ($bundleMetadataPresent) {
$summaryLines += ('- Authoritative consumer pin: `{0}` ({1})' -f $bundleAuthoritativeConsumerPin, $bundleAuthoritativeConsumerPinKind)
$summaryLines += ('- Distribution role/model: `{0}` / `{1}`' -f $bundleDistributionRole, $bundleDistributionModel)
+ $summaryLines += ('- Hosted NI Linux runner entry present: `{0}`' -f $hostedRunnerEntryScriptExists.ToString().ToLowerInvariant())
+ $summaryLines += ('- Hosted NI Linux support scripts present: `{0}`' -f $hostedRunnerSupportScriptsExist.ToString().ToLowerInvariant())
}
$summaryLines += ''
$summaryLines += '| Mode | Processed | Diffs | Signal | Collapsed Noise | Stop Reason |'