diff --git a/.github/workflows/add-token-to-labview-self-hosted.json b/.github/workflows/add-token-to-labview-self-hosted.json
deleted file mode 100644
index b48f9d00..00000000
--- a/.github/workflows/add-token-to-labview-self-hosted.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "name": "Add token to LabVIEW (ubuntu test)",
- "on": {
- "workflow_dispatch": null
- },
- "jobs": {
- "add-token": {
- "runs-on": "ubuntu-latest",
- "steps": [
- {
- "uses": "actions/checkout@v4"
- },
- {
- "name": "Run add-token-to-labview action",
- "uses": "./add-token-to-labview/action.yml",
- "with": {
- "minimum_supported_lv_version": "2021",
- "supported_bitness": "64",
- "relative_path": "scripts/add-token-to-labview",
- "dry_run": true
- }
- },
- {
- "name": "Upload token artifact",
- "uses": "actions/upload-artifact@v4",
- "with": {
- "name": "token-artifact",
- "path": "scripts/add-token-to-labview/LabVIEW.ini"
- }
- }
- ]
- }
- }
-}
diff --git a/.github/workflows/apply-vipc-self-hosted.json b/.github/workflows/apply-vipc-self-hosted.json
deleted file mode 100644
index bfe6d0f9..00000000
--- a/.github/workflows/apply-vipc-self-hosted.json
+++ /dev/null
@@ -1,28 +0,0 @@
-{
- "name": "Apply VIPC (ubuntu test)",
- "on": {
- "workflow_dispatch": null
- },
- "jobs": {
- "apply-vipc": {
- "runs-on": "ubuntu-latest",
- "steps": [
- {
- "uses": "actions/checkout@v4"
- },
- {
- "name": "Run apply-vipc action (dry_run=true)",
- "uses": "./apply-vipc/action.yml",
- "with": {
- "minimum_supported_lv_version": "2021",
- "vip_lv_version": "2021",
- "supported_bitness": "64",
- "relative_path": ".",
- "vipc_path": "scripts/apply-vipc/runner_dependencies.vipc",
- "dry_run": true
- }
- }
- ]
- }
- }
-}
diff --git a/.github/workflows/build-lvlibp-self-hosted.json b/.github/workflows/build-lvlibp-self-hosted.json
deleted file mode 100644
index 014755a7..00000000
--- a/.github/workflows/build-lvlibp-self-hosted.json
+++ /dev/null
@@ -1,41 +0,0 @@
-{
- "name": "Build LVLIBP (ubuntu test)",
- "on": {
- "workflow_dispatch": null
- },
- "jobs": {
- "build-lvlibp": {
- "runs-on": "ubuntu-latest",
- "steps": [
- {
- "uses": "actions/checkout@v4"
- },
- {
- "name": "Run build-lvlibp action",
- "uses": "./build-lvlibp/action.yml",
- "with": {
- "minimum_supported_lv_version": "2021",
- "supported_bitness": "64",
- "relative_path": "scripts/build-lvlibp",
- "labview_project": "scripts/build-lvlibp/lv_icon.lvproj",
- "build_spec": "PackedLib Build",
- "major": "1",
- "minor": "0",
- "patch": "0",
- "build": "1",
- "commit": "abcdef",
- "dry_run": true
- }
- },
- {
- "name": "Upload lvlibp artifact",
- "uses": "actions/upload-artifact@v4",
- "with": {
- "name": "build-lvlibp-artifact",
- "path": "scripts/build-lvlibp/lv_icon_x64_v1.0.0.1+gabcdef.lvlibp"
- }
- }
- ]
- }
- }
-}
diff --git a/.github/workflows/build-self-hosted.json b/.github/workflows/build-self-hosted.json
deleted file mode 100644
index c8d43065..00000000
--- a/.github/workflows/build-self-hosted.json
+++ /dev/null
@@ -1,58 +0,0 @@
-{
- "name": "Build (ubuntu test)",
- "on": {
- "workflow_dispatch": null
- },
- "jobs": {
- "build": {
- "runs-on": "ubuntu-latest",
- "env": {
- "MAJOR": "1",
- "MINOR": "0",
- "PATCH": "0"
- },
- "steps": [
- {
- "uses": "actions/checkout@v4"
- },
- {
- "name": "Run build action",
- "uses": "./build/action.yml",
- "with": {
- "relative_path": "scripts/build",
- "major": "${{ env.MAJOR }}",
- "minor": "${{ env.MINOR }}",
- "patch": "${{ env.PATCH }}",
- "build": "${{ github.run_number }}",
- "commit": "${{ github.sha }}",
- "labview_minor_revision": "3",
- "company_name": "Acme Corp",
- "author_name": "Jane Doe",
- "dry_run": true
- }
- },
- {
- "name": "Record artifact metadata",
- "id": "record",
- "run": "VERSION=\"${MAJOR}.${MINOR}.${PATCH}.${GITHUB_RUN_NUMBER}\"\nSHORT_SHA=\"${GITHUB_SHA::7}\"\nARTIFACT=\"lv_icon_x64_v${VERSION}+${SHORT_SHA}.lvlibp\"\nmv scripts/build/lv_icon_x64.lvlibp \"scripts/build/${ARTIFACT}\"\nprintf '{\"commit\":\"%s\",\"build_number\":\"%s\",\"artifacts\":[\"%s\"]}' \"$GITHUB_SHA\" \"$GITHUB_RUN_NUMBER\" \"$ARTIFACT\" > scripts/build/artifact-manifest.json\necho \"artifact=${ARTIFACT}\" >> \"$GITHUB_OUTPUT\""
- },
- {
- "name": "Upload build artifact",
- "uses": "actions/upload-artifact@v4",
- "with": {
- "name": "${{ steps.record.outputs.artifact }}",
- "path": "scripts/build/${{ steps.record.outputs.artifact }}"
- }
- },
- {
- "name": "Upload artifact manifest",
- "uses": "actions/upload-artifact@v4",
- "with": {
- "name": "artifact-manifest",
- "path": "scripts/build/artifact-manifest.json"
- }
- }
- ]
- }
- }
-}
diff --git a/.github/workflows/build-vi-package-self-hosted.json b/.github/workflows/build-vi-package-self-hosted.json
deleted file mode 100644
index f0ca0048..00000000
--- a/.github/workflows/build-vi-package-self-hosted.json
+++ /dev/null
@@ -1,42 +0,0 @@
-{
- "name": "Build VI package (ubuntu test)",
- "on": {
- "workflow_dispatch": null
- },
- "jobs": {
- "build-vi-package": {
- "runs-on": "ubuntu-latest",
- "steps": [
- {
- "uses": "actions/checkout@v4"
- },
- {
- "name": "Run build-vi-package action",
- "uses": "./build-vi-package/action.yml",
- "with": {
- "minimum_supported_lv_version": "2021",
- "supported_bitness": "64",
- "labview_minor_revision": "0",
- "relative_path": "scripts/build-vi-package",
- "vipb_path": "scripts/build-vi-package/NI Icon editor.vipb",
- "major": "1",
- "minor": "0",
- "patch": "0",
- "build": "1",
- "commit": "abcdef",
- "display_information_json": "{\"Name\":\"Test\"}",
- "dry_run": true
- }
- },
- {
- "name": "Upload VI package",
- "uses": "actions/upload-artifact@v4",
- "with": {
- "name": "vi-package",
- "path": "scripts/build-vi-package/lv_icon_v1.0.0.1+gabcdef.vip"
- }
- }
- ]
- }
- }
-}
diff --git a/.github/workflows/ci.json b/.github/workflows/ci.json
deleted file mode 100644
index e15f246f..00000000
--- a/.github/workflows/ci.json
+++ /dev/null
@@ -1,194 +0,0 @@
-{
- "name": "CI",
- "on": {
- "push": {
- "branches": [
- "actions"
- ]
- },
- "pull_request": {
- "branches": [
- "actions"
- ]
- }
- },
- "jobs": {
- "release-check": {
- "runs-on": "ubuntu-24.04",
- "outputs": {
- "needs_release": "${{ steps.check.outputs.present }}"
- },
- "steps": [
- {
- "uses": "actions/checkout@v4"
- },
- {
- "id": "check",
- "run": "if [[ -f release.json ]]; then\n echo 'present=true' >> \"$GITHUB_OUTPUT\"\nelse\n echo 'present=false' >> \"$GITHUB_OUTPUT\"\nfi"
- },
- {
- "uses": "actions/upload-artifact@v4",
- "if": "steps.check.outputs.present == 'true'",
- "with": {
- "name": "release-metadata",
- "path": "release.json"
- }
- }
- ]
- },
- "validate-artifacts": {
- "needs": "release-check",
- "runs-on": "ubuntu-24.04",
- "steps": [
- {
- "uses": "actions/checkout@v4"
- },
- {
- "uses": "actions/setup-node@v4",
- "with": {
- "node-version": 24
- }
- },
- {
- "run": "npm install"
- },
- {
- "run": "npm run link:check"
- },
- {
- "run": "npm run derive:registry"
- },
- {
- "run": "git diff --exit-code -- dispatchers.json"
- },
- {
- "run": "npm run check:traceability"
- }
- ]
- },
- "ps-ci": {
- "needs": "release-check",
- "strategy": {
- "matrix": {
- "include": [
- {
- "os": "ubuntu-24.04",
- "runs-on": "ubuntu-24.04",
- "runner_type": "linux"
- },
- {
- "os": "self-hosted-windows-lv",
- "runs-on": "self-hosted-windows-lv",
- "runner_type": "integration"
- },
- {
- "os": "self-hosted-windows-lv",
- "runs-on": "self-hosted-windows-lv",
- "runner_type": "default"
- }
- ]
- }
- },
- "runs-on": "${{ matrix.runs-on }}",
- "env": {
- "RUNNER_TYPE": "${{ matrix.runner_type }}"
- },
- "steps": [
- {
- "uses": "actions/checkout@v4"
- },
- {
- "name": "Ensure PowerShell 7.5.1",
- "if": "matrix.runner_type != 'linux'",
- "shell": "pwsh",
- "run": "$required = [Version]'7.5.1'\nif ($PSVersionTable.PSVersion -lt $required) {\n $msiUrl = 'https://github.com/PowerShell/PowerShell/releases/download/v7.5.1/PowerShell-7.5.1-win-x64.msi'\n $msiPath = Join-Path $env:RUNNER_TEMP 'PowerShell-7.5.1-win-x64.msi'\n Invoke-WebRequest -Uri $msiUrl -OutFile $msiPath\n $expectedHash = 'b110eccaf55bb53ae5e6b6de478587ed8203570b0bda9bd374a0998e24d4033a'\n $actualHash = (Get-FileHash $msiPath -Algorithm SHA256).Hash\n if ($actualHash -ne $expectedHash) {\n throw \"SHA256 mismatch: $actualHash\"\n }\n Start-Process msiexec -Wait -ArgumentList '/i', $msiPath, '/qn', 'ADD_PATH=1'\n}\n$version = (pwsh --version).Trim() -replace '^PowerShell '\nif ([Version]$version -lt $required) {\n throw \"PowerShell version $version is less than $required\"\n}\n"
- },
- {
- "name": "Install Pester",
- "shell": "pwsh",
- "run": "if (-not (Get-Module -ListAvailable -Name Pester |\n Where-Object { $_.Version -ge [Version]'5.0.0' })) {\n Remove-Module Pester -ErrorAction SilentlyContinue\n Install-Module -Name Pester -MinimumVersion 5.0.0 -Scope CurrentUser -Force -SkipPublisherCheck\n}\n"
- },
- {
- "name": "Validate native YAML parsing",
- "shell": "pwsh",
- "run": "$parsed = ConvertFrom-Yaml 'a: 1'\nif ($parsed.a -ne 1) { throw 'YAML parsing failed' }\n"
- },
- {
- "name": "Run Pester",
- "shell": "pwsh",
- "run": "if (Test-Path \"tests/pester\") {\n $cfg = New-PesterConfiguration\n $cfg.Run.Path = './tests/pester'\n $cfg.TestResult.Enabled = $false\n $cfg.Run.Exit = $true\n Invoke-Pester -Configuration $cfg\n}\n"
- },
- {
- "uses": "actions/upload-artifact@v4",
- "if": "always()",
- "with": {
- "name": "pester-junit-${{ matrix.os }}-${{ matrix.runner_type }}",
- "path": "pester-results/pester-junit.xml",
- "if-no-files-found": "error"
- }
- }
- ]
- },
- "report": {
- "needs": [
- "validate-artifacts",
- "ps-ci"
- ],
- "runs-on": "ubuntu-24.04",
- "if": "(success() || failure()) && !cancelled()",
- "steps": [
- {
- "uses": "actions/checkout@v4"
- },
- {
- "uses": "actions/setup-node@v4",
- "with": {
- "node-version": 24
- }
- },
- {
- "run": "npm run check:node"
- },
- {
- "run": "npm install"
- },
- {
- "uses": "actions/download-artifact@v4",
- "with": {
- "pattern": "pester-junit-*",
- "path": "./downloaded-artifacts"
- }
- },
- {
- "run": "npm run derive:registry"
- },
- {
- "run": "npm run generate:summary",
- "env": {
- "TEST_RESULTS_GLOBS": "test-results/*junit*.xml\ndownloaded-artifacts/pester-junit-*/pester-junit.xml\n",
- "REQ_MAPPING_FILE": "requirements.json",
- "DISPATCHER_REGISTRY": "dispatchers.json",
- "EVIDENCE_DIR": "artifacts/evidence"
- }
- },
- {
- "run": "npx tsx scripts/generate-traceability-matrix.ts"
- },
- {
- "run": "cat artifacts/linux/traceability-matrix.md >> \"$GITHUB_STEP_SUMMARY\""
- },
- {
- "uses": "actions/upload-artifact@v4",
- "if": "(success() || failure()) && !cancelled()",
- "with": {
- "name": "traceability-matrix",
- "path": "artifacts/linux/traceability-matrix.md"
- }
- },
- {
- "run": "npx tsx scripts/print-pester-traceability.ts >> \"$GITHUB_STEP_SUMMARY\""
- }
- ]
- }
- }
-}
diff --git a/.github/workflows/close-labview-external.json b/.github/workflows/close-labview-external.json
deleted file mode 100644
index 939d25f3..00000000
--- a/.github/workflows/close-labview-external.json
+++ /dev/null
@@ -1,54 +0,0 @@
-{
- "name": "Close LabVIEW (external test)",
- "on": {
- "workflow_dispatch": null
- },
- "jobs": {
- "close-labview": {
- "runs-on": "ubuntu-latest",
- "steps": [
- {
- "uses": "actions/checkout@v4"
- },
- {
- "name": "Close LabVIEW (32-bit)",
- "uses": "./close-labview/action.yml",
- "with": {
- "minimum_supported_lv_version": "2021",
- "supported_bitness": "32",
- "working_directory": "${{ github.workspace }}/scripts/close-labview",
- "dry_run": true
- }
- },
- {
- "name": "Upload log (32-bit)",
- "uses": "actions/upload-artifact@v4",
- "with": {
- "name": "close-labview-32.log",
- "path": "${{ github.workspace }}/scripts/close-labview/close-labview.log",
- "if-no-files-found": "ignore"
- }
- },
- {
- "name": "Close LabVIEW (64-bit)",
- "uses": "./close-labview/action.yml",
- "with": {
- "minimum_supported_lv_version": "2021",
- "supported_bitness": "64",
- "working_directory": "${{ github.workspace }}/scripts/close-labview",
- "dry_run": true
- }
- },
- {
- "name": "Upload log (64-bit)",
- "uses": "actions/upload-artifact@v4",
- "with": {
- "name": "close-labview-64.log",
- "path": "${{ github.workspace }}/scripts/close-labview/close-labview.log",
- "if-no-files-found": "ignore"
- }
- }
- ]
- }
- }
-}
diff --git a/.github/workflows/missing-in-project-self-hosted.json b/.github/workflows/missing-in-project-self-hosted.json
deleted file mode 100644
index 71954fb8..00000000
--- a/.github/workflows/missing-in-project-self-hosted.json
+++ /dev/null
@@ -1,35 +0,0 @@
-{
- "name": "Missing in project (ubuntu test)",
- "on": {
- "workflow_dispatch": null
- },
- "jobs": {
- "missing-in-project": {
- "runs-on": "ubuntu-latest",
- "steps": [
- {
- "uses": "actions/checkout@v4"
- },
- {
- "name": "Run missing-in-project action",
- "uses": "./missing-in-project/action.yml",
- "with": {
- "lv_version": "2021",
- "supported_bitness": "64",
- "project_file": "scripts/missing-in-project/Missing in Project.lvproj",
- "relative_path": "scripts/missing-in-project",
- "dry_run": true
- }
- },
- {
- "name": "Upload missing findings",
- "uses": "actions/upload-artifact@v4",
- "with": {
- "name": "missing-files",
- "path": "scripts/missing-in-project/missing_files.txt"
- }
- }
- ]
- }
- }
-}
diff --git a/.github/workflows/modify-vipb-display-info-self-hosted.json b/.github/workflows/modify-vipb-display-info-self-hosted.json
deleted file mode 100644
index 8d914236..00000000
--- a/.github/workflows/modify-vipb-display-info-self-hosted.json
+++ /dev/null
@@ -1,42 +0,0 @@
-{
- "name": "Modify VIPB display info (ubuntu test)",
- "on": {
- "workflow_dispatch": null
- },
- "jobs": {
- "modify-vipb-display-info": {
- "runs-on": "ubuntu-latest",
- "steps": [
- {
- "uses": "actions/checkout@v4"
- },
- {
- "name": "Run modify-vipb-display-info action",
- "uses": "./modify-vipb-display-info/action.yml",
- "with": {
- "supported_bitness": "64",
- "relative_path": "scripts/modify-vipb-display-info",
- "vipb_path": "scripts/modify-vipb-display-info/lv_icon.vipb",
- "minimum_supported_lv_version": "2021",
- "labview_minor_revision": "0",
- "major": "1",
- "minor": "0",
- "patch": "0",
- "build": "1",
- "commit": "abcdef",
- "display_information_json": "{\"Name\":\"Test\"}",
- "dry_run": true
- }
- },
- {
- "name": "Upload vipb artifact",
- "uses": "actions/upload-artifact@v4",
- "with": {
- "name": "vipb-display-info",
- "path": "scripts/modify-vipb-display-info/lv_icon.vipb"
- }
- }
- ]
- }
- }
-}
diff --git a/.github/workflows/prepare-labview-source-self-hosted.json b/.github/workflows/prepare-labview-source-self-hosted.json
deleted file mode 100644
index c8c8e145..00000000
--- a/.github/workflows/prepare-labview-source-self-hosted.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
- "name": "Prepare LabVIEW source (ubuntu test)",
- "on": {
- "workflow_dispatch": null
- },
- "jobs": {
- "prepare-labview-source": {
- "runs-on": "ubuntu-latest",
- "steps": [
- {
- "uses": "actions/checkout@v4"
- },
- {
- "name": "Run prepare-labview-source action",
- "uses": "./prepare-labview-source/action.yml",
- "with": {
- "minimum_supported_lv_version": "2021",
- "supported_bitness": "64",
- "relative_path": "scripts/prepare-labview-source",
- "labview_project": "scripts/prepare-labview-source/lv_icon.lvproj",
- "build_spec": "PackageSource",
- "dry_run": true
- }
- },
- {
- "name": "Upload prepared source",
- "uses": "actions/upload-artifact@v4",
- "with": {
- "name": "prepared-source",
- "path": "scripts/prepare-labview-source/prepared-source.zip"
- }
- }
- ]
- }
- }
-}
diff --git a/.github/workflows/rename-file-self-hosted.json b/.github/workflows/rename-file-self-hosted.json
deleted file mode 100644
index 26f6bb41..00000000
--- a/.github/workflows/rename-file-self-hosted.json
+++ /dev/null
@@ -1,33 +0,0 @@
-{
- "name": "Rename file (ubuntu test)",
- "on": {
- "workflow_dispatch": null
- },
- "jobs": {
- "rename-file": {
- "runs-on": "ubuntu-latest",
- "steps": [
- {
- "uses": "actions/checkout@v4"
- },
- {
- "name": "Run rename-file action",
- "uses": "./rename-file/action.yml",
- "with": {
- "current_filename": "scripts/rename-file/README.md",
- "new_filename": "scripts/rename-file/README-renamed.md",
- "dry_run": true
- }
- },
- {
- "name": "Upload renamed file",
- "uses": "actions/upload-artifact@v4",
- "with": {
- "name": "renamed-file",
- "path": "scripts/rename-file/README-renamed.md"
- }
- }
- ]
- }
- }
-}
diff --git a/.github/workflows/restore-setup-lv-source-self-hosted.json b/.github/workflows/restore-setup-lv-source-self-hosted.json
deleted file mode 100644
index e4076078..00000000
--- a/.github/workflows/restore-setup-lv-source-self-hosted.json
+++ /dev/null
@@ -1,39 +0,0 @@
-{
- "name": "Restore setup LV source (ubuntu test)",
- "on": {
- "workflow_dispatch": null
- },
- "jobs": {
- "restore-setup-lv-source": {
- "runs-on": "ubuntu-latest",
- "steps": [
- {
- "uses": "actions/checkout@v4"
- },
- {
- "name": "Run restore-setup-lv-source action",
- "uses": "./restore-setup-lv-source/action.yml",
- "with": {
- "minimum_supported_lv_version": "2021",
- "supported_bitness": "64",
- "relative_path": "scripts/restore-setup-lv-source",
- "labview_project": "scripts/restore-setup-lv-source/lv_icon.lvproj",
- "build_spec": "PackageSource",
- "dry_run": true
- },
- "env": {
- "GCLI_SUPPRESS_PROMPTS": "1"
- }
- },
- {
- "name": "Upload restore logs",
- "uses": "actions/upload-artifact@v4",
- "with": {
- "name": "restore-logs",
- "path": "scripts/restore-setup-lv-source/restore.log"
- }
- }
- ]
- }
- }
-}
diff --git a/.github/workflows/revert-development-mode-self-hosted.json b/.github/workflows/revert-development-mode-self-hosted.json
deleted file mode 100644
index 55b24f6a..00000000
--- a/.github/workflows/revert-development-mode-self-hosted.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- "name": "Revert development mode (ubuntu test)",
- "on": {
- "workflow_dispatch": null
- },
- "jobs": {
- "revert-development-mode": {
- "runs-on": "ubuntu-latest",
- "steps": [
- {
- "uses": "actions/checkout@v4"
- },
- {
- "name": "Run revert-development-mode action",
- "uses": "./revert-development-mode/action.yml",
- "with": {
- "relative_path": "./",
- "dry_run": true
- }
- },
- {
- "name": "Upload config artifact",
- "uses": "actions/upload-artifact@v4",
- "with": {
- "name": "devmode-config",
- "path": "devmode-config.txt"
- }
- }
- ]
- }
- }
-}
diff --git a/.github/workflows/run-pester-tests.json b/.github/workflows/run-pester-tests.json
deleted file mode 100644
index f2d34bc0..00000000
--- a/.github/workflows/run-pester-tests.json
+++ /dev/null
@@ -1,52 +0,0 @@
-{
- "name": "Run Pester tests",
- "on": {
- "workflow_dispatch": {
- "inputs": {
- "repository": {
- "description": "owner/repo of the repository to test",
- "required": true
- },
- "ref": {
- "description": "Branch or tag to check out",
- "required": false,
- "default": "main"
- }
- }
- }
- },
- "jobs": {
- "run-pester-tests": {
- "runs-on": "ubuntu-latest",
- "steps": [
- {
- "uses": "actions/checkout@v4"
- },
- {
- "name": "Checkout target repository",
- "uses": "actions/checkout@v4",
- "with": {
- "repository": "${{ inputs.repository }}",
- "ref": "${{ inputs.ref }}",
- "path": "target",
- "token": "${{ secrets.REPO_TOKEN }}"
- }
- },
- {
- "name": "Run Pester tests",
- "shell": "pwsh",
- "run": "./actions/Invoke-OSAction.ps1 -ActionName run-pester-tests -ArgsJson '{}' -WorkingDirectory \"${{ github.workspace }}/target\""
- },
- {
- "uses": "actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02",
- "if": "${{ (success() || failure()) && !cancelled() }}",
- "with": {
- "name": "test-results-pester",
- "path": "target/test-results/pester-junit.xml",
- "if-no-files-found": "error"
- }
- }
- ]
- }
- }
-}
diff --git a/.github/workflows/run-unit-tests-self-hosted.json b/.github/workflows/run-unit-tests-self-hosted.json
deleted file mode 100644
index 83b89082..00000000
--- a/.github/workflows/run-unit-tests-self-hosted.json
+++ /dev/null
@@ -1,44 +0,0 @@
-{
- "name": "Run unit tests (ubuntu test)",
- "on": {
- "workflow_dispatch": null
- },
- "jobs": {
- "run-unit-tests": {
- "runs-on": "ubuntu-latest",
- "steps": [
- {
- "uses": "actions/checkout@v4"
- },
- {
- "name": "Run unit tests action",
- "uses": "./run-unit-tests/action.yml",
- "with": {
- "minimum_supported_lv_version": "2021",
- "supported_bitness": "64",
- "project_path": "scripts/run-unit-tests/lv_icon.lvproj",
- "test_config": "scripts/run-unit-tests/unittest-config.cfg",
- "working_directory": "scripts/run-unit-tests",
- "dry_run": true
- }
- },
- {
- "name": "Upload test results to GitHub",
- "uses": "EnricoMi/publish-unit-test-result-action@v2",
- "if": "${{ (success() || failure()) && !cancelled() }}",
- "with": {
- "files": "artifacts/unit-tests/UnitTestReport.xml"
- }
- },
- {
- "name": "Upload unit test results",
- "uses": "actions/upload-artifact@v4",
- "with": {
- "name": "unit-test-results",
- "path": "artifacts/unit-tests/UnitTestReport.xml"
- }
- }
- ]
- }
- }
-}
diff --git a/.github/workflows/set-development-mode-self-hosted.json b/.github/workflows/set-development-mode-self-hosted.json
deleted file mode 100644
index 1bffb70a..00000000
--- a/.github/workflows/set-development-mode-self-hosted.json
+++ /dev/null
@@ -1,35 +0,0 @@
-{
- "name": "Set development mode (ubuntu test)",
- "on": {
- "workflow_dispatch": null
- },
- "jobs": {
- "set-development-mode": {
- "runs-on": "ubuntu-latest",
- "steps": [
- {
- "uses": "actions/checkout@v4"
- },
- {
- "name": "Run set-development-mode action",
- "uses": "./set-development-mode/action.yml",
- "with": {
- "relative_path": "scripts/set-development-mode",
- "gcli_path": "scripts/set-development-mode/g-cli.exe",
- "working_directory": "scripts/set-development-mode",
- "log_level": "INFO",
- "dry_run": "true"
- }
- },
- {
- "name": "Upload dev mode logs",
- "uses": "actions/upload-artifact@v4",
- "with": {
- "name": "dev-mode-config",
- "path": "scripts/set-development-mode/dev-mode.log"
- }
- }
- ]
- }
- }
-}
diff --git a/artifacts/linux/requirements-summary.md b/artifacts/linux/requirements-summary.md
index 97a0ebeb..9e7c3061 100644
--- a/artifacts/linux/requirements-summary.md
+++ b/artifacts/linux/requirements-summary.md
@@ -1,12 +1,78 @@
### Requirement Summary
| Requirement ID | Description | Owner | Total Tests | Passed | Failed | Skipped | Pass Rate (%) |
| --- | --- | --- | --- | --- | --- | --- | --- |
-| Unmapped | | | 4 | 4 | 0 | 0 | 100.00 |
+| REQ-023 | Parser ingests JUnit XML artifacts starting at the testsuites root and iterating through nested suites and testcases. | | 1 | 1 | 0 | 0 | 100.00 |
+| REQ-024 | Top-level testsuites attributes name, tests, errors, failures, disabled, and time are captured for summary reporting. | | 1 | 1 | 0 | 0 | 100.00 |
+| REQ-025 | Each testsuite records attributes including name, tests, errors, failures, hostname, id, skipped, disabled, package, and time. | | 1 | 1 | 0 | 0 | 100.00 |
+| REQ-026 | Suite properties are extracted as name/value pairs for environment details. | | 1 | 1 | 0 | 0 | 100.00 |
+| REQ-027 | Testcase attributes name, status, classname, assertions, time, and any skip message are preserved. | | 1 | 1 | 0 | 0 | 100.00 |
+| REQ-028 | Requirement identifiers embedded in testcase names are detected and associated with the test. | | 1 | 1 | 0 | 0 | 100.00 |
+| REQ-029 | Test results are aggregated by requirement and by suite to count passed, failed, and skipped cases. | | 1 | 1 | 0 | 0 | 100.00 |
+| REQ-030 | Traceability matrix links requirement IDs to testcases with status, execution time, host properties, and skipped reasons. | | 1 | 1 | 0 | 0 | 100.00 |
+| REQ-031 | Parsing logic validates presence of required fields and reports missing or malformed data. | | 1 | 1 | 0 | 0 | 100.00 |
+| REQ-032 | Parser tolerates and retains unknown attributes for future extensibility. | | 1 | 1 | 0 | 0 | 100.00 |
+| REQ-033 | Tests ending with SelfHosted.Workflow.Tests.ps1 execute only in dry run mode unless the workflow targets a self-hosted Windows runner labeled self-hosted-windows-lv. | | 1 | 1 | 0 | 0 | 100.00 |
+| Unmapped | | | 48 | 48 | 0 | 0 | 100.00 |
### Requirement Testcases
| Requirement ID | Test ID | Status |
| --- | --- | --- |
+| REQ-023 | parses-nested-junit-structures | Passed |
+| REQ-024 | captures-root-testsuites-attributes | Passed |
+| REQ-025 | captures-testsuite-attributes | Passed |
+| REQ-026 | captures-suite-properties | Passed |
+| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed |
+| REQ-028 | extracts-requirement-identifiers | Passed |
+| REQ-029 | aggregates-status-by-requirement-and-suite | Passed |
+| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed |
+| REQ-031 | validates-missing-fields | Passed |
+| REQ-032 | preserves-unknown-attributes | Passed |
+| REQ-033 | throws-error-for-malformed-xml | Passed |
+| Unmapped | associates-classname-with-requirement | Passed |
+| Unmapped | buildissuebranchname-formats-branch-name | Passed |
+| Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed |
| Unmapped | buildprofile1.iconeditor.addtokentolabview.dispatcher.dry-runs-add-token-to-labview-with-expected-arguments- | Passed |
| Unmapped | buildprofile1.iconeditor.applyvipc.dispatcher.dry-runs-apply-vipc-with-expected-arguments- | Passed |
| Unmapped | buildprofile1.iconeditor.buildvipackage.dispatcher.dry-runs-build-vi-package-with-expected-arguments- | Passed |
-| Unmapped | buildprofile1.iconeditor.closelabview.dispatcher.dry-runs-close-labview-with-expected-arguments- | Passed |
\ No newline at end of file
+| Unmapped | buildprofile1.iconeditor.closelabview.dispatcher.dry-runs-close-labview-with-expected-arguments- | Passed |
+| Unmapped | buildsummary-splits-totals-by-os | Passed |
+| Unmapped | collecttestcases-captures-requirement-property | Passed |
+| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed |
+| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed |
+| Unmapped | computestatuscounts-tallies-test-statuses | Passed |
+| Unmapped | detects-downloaded-artifacts-path | Passed |
+| Unmapped | dispatchers-and-parameters-include-descriptions | Passed |
+| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed |
+| Unmapped | escapemarkdown-escapes-special-characters | Passed |
+| Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed |
+| Unmapped | fails-when-commit-lacks-requirement-reference | Passed |
+| Unmapped | fails-when-requirement-lacks-test-coverage | Passed |
+| Unmapped | fails-when-tests-are-unmapped | Passed |
+| Unmapped | fails-when-tests-reference-unknown-requirements | Passed |
+| Unmapped | formaterror-handles-plain-objects | Passed |
+| Unmapped | formaterror-handles-primitives | Passed |
+| Unmapped | formaterror-handles-real-error-objects | Passed |
+| Unmapped | formaterror-handles-unstringifiable-values | Passed |
+| Unmapped | generate-ci-summary-features | Passed |
+| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed |
+| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed |
+| Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed |
+| Unmapped | handles-root-level-testcases | Passed |
+| Unmapped | handles-zipped-junit-artifacts | Passed |
+| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed |
+| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed |
+| Unmapped | loadrequirements-merges-multiple-files | Passed |
+| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed |
+| Unmapped | logs-a-warning-when-no-junit-files-are-found | Passed |
+| Unmapped | partitions-requirement-groups-by-runner\_type | Passed |
+| Unmapped | passes-with-coverage-and-requirement-reference | Passed |
+| Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed |
+| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed |
+| Unmapped | summarytomarkdown-handles-no-tests | Passed |
+| Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed |
+| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed |
+| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed |
+| Unmapped | warns-when-all-tests-are-unmapped | Passed |
+| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed |
+| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed |
+| Unmapped | writes-outputs-to-os-specific-directory | Passed |
\ No newline at end of file
diff --git a/artifacts/linux/summary-standard.md b/artifacts/linux/summary-standard.md
index cfdde583..7439d2f8 100644
--- a/artifacts/linux/summary-standard.md
+++ b/artifacts/linux/summary-standard.md
@@ -1,7 +1,7 @@
### Test Summary
| OS | Passed | Failed | Skipped | Duration (s) | Pass Rate (%) |
| --- | --- | --- | --- | --- | --- |
-| overall | 4 | 0 | 0 | 0.67 | 100.00 |
-| linux | 4 | 0 | 0 | 0.67 | 100.00 |
+| overall | 59 | 0 | 0 | 17.28 | 100.00 |
+| linux | 59 | 0 | 0 | 17.28 | 100.00 |
_For detailed per-test information, see [traceability-standard.md](traceability-standard.md)._
\ No newline at end of file
diff --git a/artifacts/linux/summary.md b/artifacts/linux/summary.md
index 8b9ea053..e38f7dbd 100644
--- a/artifacts/linux/summary.md
+++ b/artifacts/linux/summary.md
@@ -1,12 +1,23 @@
### Test Summary
| OS | Passed | Failed | Skipped | Duration (s) | Pass Rate (%) |
| --- | --- | --- | --- | --- | --- |
-| overall | 4 | 0 | 0 | 0.67 | 100.00 |
-| linux | 4 | 0 | 0 | 0.67 | 100.00 |
+| overall | 59 | 0 | 0 | 17.28 | 100.00 |
+| linux | 59 | 0 | 0 | 17.28 | 100.00 |
### Requirement Summary
| Requirement ID | Description | Owner | Total Tests | Passed | Failed | Skipped | Pass Rate (%) |
| --- | --- | --- | --- | --- | --- | --- | --- |
-| Unmapped | | | 4 | 4 | 0 | 0 | 100.00 |
+| REQ-023 | Parser ingests JUnit XML artifacts starting at the testsuites root and iterating through nested suites and testcases. | | 1 | 1 | 0 | 0 | 100.00 |
+| REQ-024 | Top-level testsuites attributes name, tests, errors, failures, disabled, and time are captured for summary reporting. | | 1 | 1 | 0 | 0 | 100.00 |
+| REQ-025 | Each testsuite records attributes including name, tests, errors, failures, hostname, id, skipped, disabled, package, and time. | | 1 | 1 | 0 | 0 | 100.00 |
+| REQ-026 | Suite properties are extracted as name/value pairs for environment details. | | 1 | 1 | 0 | 0 | 100.00 |
+| REQ-027 | Testcase attributes name, status, classname, assertions, time, and any skip message are preserved. | | 1 | 1 | 0 | 0 | 100.00 |
+| REQ-028 | Requirement identifiers embedded in testcase names are detected and associated with the test. | | 1 | 1 | 0 | 0 | 100.00 |
+| REQ-029 | Test results are aggregated by requirement and by suite to count passed, failed, and skipped cases. | | 1 | 1 | 0 | 0 | 100.00 |
+| REQ-030 | Traceability matrix links requirement IDs to testcases with status, execution time, host properties, and skipped reasons. | | 1 | 1 | 0 | 0 | 100.00 |
+| REQ-031 | Parsing logic validates presence of required fields and reports missing or malformed data. | | 1 | 1 | 0 | 0 | 100.00 |
+| REQ-032 | Parser tolerates and retains unknown attributes for future extensibility. | | 1 | 1 | 0 | 0 | 100.00 |
+| REQ-033 | Tests ending with SelfHosted.Workflow.Tests.ps1 execute only in dry run mode unless the workflow targets a self-hosted Windows runner labeled self-hosted-windows-lv. | | 1 | 1 | 0 | 0 | 100.00 |
+| Unmapped | | | 48 | 48 | 0 | 0 | 100.00 |
_For detailed per-test information, see [traceability.md](traceability.md)._
\ No newline at end of file
diff --git a/artifacts/linux/traceability-standard.md b/artifacts/linux/traceability-standard.md
index d46bd1ae..f6638d50 100644
--- a/artifacts/linux/traceability-standard.md
+++ b/artifacts/linux/traceability-standard.md
@@ -1,10 +1,122 @@
### Test Traceability Matrix
-#### Unmapped (100% passed)
+#### REQ-023 (100% passed)
| Requirement | Test ID | Status | Duration (s) | Owner | Evidence |
| --- | --- | --- | --- | --- | --- |
+| REQ-023 | parses-nested-junit-structures | Passed | 0.015 | | |
+
+#### REQ-024 (100% passed)
+
+| Requirement | Test ID | Status | Duration (s) | Owner | Evidence |
+| --- | --- | --- | --- | --- | --- |
+| REQ-024 | captures-root-testsuites-attributes | Passed | 0.006 | | |
+
+#### REQ-025 (100% passed)
+
+| Requirement | Test ID | Status | Duration (s) | Owner | Evidence |
+| --- | --- | --- | --- | --- | --- |
+| REQ-025 | captures-testsuite-attributes | Passed | 0.010 | | |
+
+#### REQ-026 (100% passed)
+
+| Requirement | Test ID | Status | Duration (s) | Owner | Evidence |
+| --- | --- | --- | --- | --- | --- |
+| REQ-026 | captures-suite-properties | Passed | 0.001 | | |
+
+#### REQ-027 (100% passed)
+
+| Requirement | Test ID | Status | Duration (s) | Owner | Evidence |
+| --- | --- | --- | --- | --- | --- |
+| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | 0.001 | | |
+
+#### REQ-028 (100% passed)
+
+| Requirement | Test ID | Status | Duration (s) | Owner | Evidence |
+| --- | --- | --- | --- | --- | --- |
+| REQ-028 | extracts-requirement-identifiers | Passed | 0.002 | | |
+
+#### REQ-029 (100% passed)
+
+| Requirement | Test ID | Status | Duration (s) | Owner | Evidence |
+| --- | --- | --- | --- | --- | --- |
+| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.002 | | |
+
+#### REQ-030 (100% passed)
+
+| Requirement | Test ID | Status | Duration (s) | Owner | Evidence |
+| --- | --- | --- | --- | --- | --- |
+| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.002 | | |
+
+#### REQ-031 (100% passed)
+
+| Requirement | Test ID | Status | Duration (s) | Owner | Evidence |
+| --- | --- | --- | --- | --- | --- |
+| REQ-031 | validates-missing-fields | Passed | 0.001 | | |
+
+#### REQ-032 (100% passed)
+
+| Requirement | Test ID | Status | Duration (s) | Owner | Evidence |
+| --- | --- | --- | --- | --- | --- |
+| REQ-032 | preserves-unknown-attributes | Passed | 0.001 | | |
+
+#### REQ-033 (100% passed)
+
+| Requirement | Test ID | Status | Duration (s) | Owner | Evidence |
+| --- | --- | --- | --- | --- | --- |
+| REQ-033 | throws-error-for-malformed-xml | Passed | 0.002 | | |
+
+Unmapped (100% passed)
+
+| Requirement | Test ID | Status | Duration (s) | Owner | Evidence |
+| --- | --- | --- | --- | --- | --- |
+| Unmapped | associates-classname-with-requirement | Passed | 0.018 | | |
+| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.001 | | |
+| Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.003 | | |
| Unmapped | buildprofile1.iconeditor.addtokentolabview.dispatcher.dry-runs-add-token-to-labview-with-expected-arguments- | Passed | 0.482 | | |
| Unmapped | buildprofile1.iconeditor.applyvipc.dispatcher.dry-runs-apply-vipc-with-expected-arguments- | Passed | 0.042 | | |
| Unmapped | buildprofile1.iconeditor.buildvipackage.dispatcher.dry-runs-build-vi-package-with-expected-arguments- | Passed | 0.106 | | |
-| Unmapped | buildprofile1.iconeditor.closelabview.dispatcher.dry-runs-close-labview-with-expected-arguments- | Passed | 0.036 | | |
\ No newline at end of file
+| Unmapped | buildprofile1.iconeditor.closelabview.dispatcher.dry-runs-close-labview-with-expected-arguments- | Passed | 0.036 | | |
+| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.001 | | |
+| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.024 | | |
+| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.013 | | |
+| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.014 | | |
+| Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.000 | | |
+| Unmapped | detects-downloaded-artifacts-path | Passed | 0.999 | | |
+| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.003 | | |
+| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 1.075 | | |
+| Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.001 | | |
+| Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.000 | | |
+| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 0.916 | | |
+| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.145 | | |
+| Unmapped | fails-when-tests-are-unmapped | Passed | 0.854 | | |
+| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 0.938 | | |
+| Unmapped | formaterror-handles-plain-objects | Passed | 0.000 | | |
+| Unmapped | formaterror-handles-primitives | Passed | 0.000 | | |
+| Unmapped | formaterror-handles-real-error-objects | Passed | 0.003 | | |
+| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.000 | | |
+| Unmapped | generate-ci-summary-features | Passed | 0.022 | | |
+| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.019 | | |
+| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.002 | | |
+| Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.001 | | |
+| Unmapped | handles-root-level-testcases | Passed | 0.000 | | |
+| Unmapped | handles-zipped-junit-artifacts | Passed | 0.816 | | |
+| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.875 | | |
+| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.015 | | |
+| Unmapped | loadrequirements-merges-multiple-files | Passed | 0.008 | | |
+| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.004 | | |
+| Unmapped | logs-a-warning-when-no-junit-files-are-found | Passed | 0.908 | | |
+| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.769 | | |
+| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 1.067 | | |
+| Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.000 | | |
+| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.101 | | |
+| Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.000 | | |
+| Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.001 | | |
+| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.657 | | |
+| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.914 | | |
+| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.131 | | |
+| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.012 | | |
+| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.004 | | |
+| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.242 | | |
+
+
\ No newline at end of file
diff --git a/artifacts/linux/traceability.json b/artifacts/linux/traceability.json
index 7ded38d4..c517ab6d 100644
--- a/artifacts/linux/traceability.json
+++ b/artifacts/linux/traceability.json
@@ -1,8 +1,222 @@
{
"requirements": [
+ {
+ "id": "REQ-023",
+ "description": "Parser ingests JUnit XML artifacts starting at the testsuites root and iterating through nested suites and testcases.",
+ "tests": [
+ {
+ "id": "parses-nested-junit-structures",
+ "name": "[REQ-023] parses nested JUnit structures",
+ "className": "test",
+ "status": "Passed",
+ "duration": 0.015367,
+ "requirements": [
+ "REQ-023"
+ ],
+ "os": "linux"
+ }
+ ]
+ },
+ {
+ "id": "REQ-024",
+ "description": "Top-level testsuites attributes name, tests, errors, failures, disabled, and time are captured for summary reporting.",
+ "tests": [
+ {
+ "id": "captures-root-testsuites-attributes",
+ "name": "[REQ-024] captures root testsuites attributes",
+ "className": "test",
+ "status": "Passed",
+ "duration": 0.005649,
+ "requirements": [
+ "REQ-024"
+ ],
+ "os": "linux"
+ }
+ ]
+ },
+ {
+ "id": "REQ-025",
+ "description": "Each testsuite records attributes including name, tests, errors, failures, hostname, id, skipped, disabled, package, and time.",
+ "tests": [
+ {
+ "id": "captures-testsuite-attributes",
+ "name": "[REQ-025] captures testsuite attributes",
+ "className": "test",
+ "status": "Passed",
+ "duration": 0.010137,
+ "requirements": [
+ "REQ-025"
+ ],
+ "os": "linux"
+ }
+ ]
+ },
+ {
+ "id": "REQ-026",
+ "description": "Suite properties are extracted as name/value pairs for environment details.",
+ "tests": [
+ {
+ "id": "captures-suite-properties",
+ "name": "[REQ-026] captures suite properties",
+ "className": "test",
+ "status": "Passed",
+ "duration": 0.000926,
+ "requirements": [
+ "REQ-026"
+ ],
+ "os": "linux"
+ }
+ ]
+ },
+ {
+ "id": "REQ-027",
+ "description": "Testcase attributes name, status, classname, assertions, time, and any skip message are preserved.",
+ "tests": [
+ {
+ "id": "captures-testcase-attributes-and-skipped-message",
+ "name": "[REQ-027] captures testcase attributes and skipped message",
+ "className": "test",
+ "status": "Passed",
+ "duration": 0.000682,
+ "requirements": [
+ "REQ-027"
+ ],
+ "os": "linux"
+ }
+ ]
+ },
+ {
+ "id": "REQ-028",
+ "description": "Requirement identifiers embedded in testcase names are detected and associated with the test.",
+ "tests": [
+ {
+ "id": "extracts-requirement-identifiers",
+ "name": "[REQ-028] extracts requirement identifiers",
+ "className": "test",
+ "status": "Passed",
+ "duration": 0.001617,
+ "requirements": [
+ "REQ-028"
+ ],
+ "os": "linux"
+ }
+ ]
+ },
+ {
+ "id": "REQ-029",
+ "description": "Test results are aggregated by requirement and by suite to count passed, failed, and skipped cases.",
+ "tests": [
+ {
+ "id": "aggregates-status-by-requirement-and-suite",
+ "name": "[REQ-029] aggregates status by requirement and suite",
+ "className": "test",
+ "status": "Passed",
+ "duration": 0.001629,
+ "requirements": [
+ "REQ-029"
+ ],
+ "os": "linux"
+ }
+ ]
+ },
+ {
+ "id": "REQ-030",
+ "description": "Traceability matrix links requirement IDs to testcases with status, execution time, host properties, and skipped reasons.",
+ "tests": [
+ {
+ "id": "builds-traceability-matrix-with-skipped-reasons",
+ "name": "[REQ-030] builds traceability matrix with skipped reasons",
+ "className": "test",
+ "status": "Passed",
+ "duration": 0.001713,
+ "requirements": [
+ "REQ-030"
+ ],
+ "os": "linux"
+ }
+ ]
+ },
+ {
+ "id": "REQ-031",
+ "description": "Parsing logic validates presence of required fields and reports missing or malformed data.",
+ "tests": [
+ {
+ "id": "validates-missing-fields",
+ "name": "[REQ-031] validates missing fields",
+ "className": "test",
+ "status": "Passed",
+ "duration": 0.000838,
+ "requirements": [
+ "REQ-031"
+ ],
+ "os": "linux"
+ }
+ ]
+ },
+ {
+ "id": "REQ-032",
+ "description": "Parser tolerates and retains unknown attributes for future extensibility.",
+ "tests": [
+ {
+ "id": "preserves-unknown-attributes",
+ "name": "[REQ-032] preserves unknown attributes",
+ "className": "test",
+ "status": "Passed",
+ "duration": 0.000567,
+ "requirements": [
+ "REQ-032"
+ ],
+ "os": "linux"
+ }
+ ]
+ },
+ {
+ "id": "REQ-033",
+ "description": "Tests ending with SelfHosted.Workflow.Tests.ps1 execute only in dry run mode unless the workflow targets a self-hosted Windows runner labeled self-hosted-windows-lv.",
+ "tests": [
+ {
+ "id": "throws-error-for-malformed-xml",
+ "name": "[REQ-033] throws error for malformed XML",
+ "className": "test",
+ "status": "Passed",
+ "duration": 0.001633,
+ "requirements": [
+ "REQ-033"
+ ],
+ "os": "linux"
+ }
+ ]
+ },
{
"id": "Unmapped",
"tests": [
+ {
+ "id": "associates-classname-with-requirement",
+ "name": "associates classname with requirement",
+ "className": "test",
+ "status": "Passed",
+ "duration": 0.017978,
+ "requirements": [],
+ "os": "linux"
+ },
+ {
+ "id": "buildissuebranchname-formats-branch-name",
+ "name": "buildIssueBranchName formats branch name",
+ "className": "test",
+ "status": "Passed",
+ "duration": 0.00114,
+ "requirements": [],
+ "os": "linux"
+ },
+ {
+ "id": "buildissuebranchname-rejects-non-numeric-input",
+ "name": "buildIssueBranchName rejects non-numeric input",
+ "className": "test",
+ "status": "Passed",
+ "duration": 0.002863,
+ "requirements": [],
+ "os": "linux"
+ },
{
"id": "buildprofile1.iconeditor.addtokentolabview.dispatcher.dry-runs-add-token-to-labview-with-expected-arguments-",
"name": "BuildProfile1.IconEditor.AddTokenToLabview.Dispatcher.dry-runs add-token-to-labview with expected arguments [REQIE-001]",
@@ -38,24 +252,393 @@
"duration": 0.036,
"requirements": [],
"os": "linux"
+ },
+ {
+ "id": "buildsummary-splits-totals-by-os",
+ "name": "buildSummary splits totals by OS",
+ "className": "test",
+ "status": "Passed",
+ "duration": 0.000577,
+ "requirements": [],
+ "os": "linux"
+ },
+ {
+ "id": "collecttestcases-captures-requirement-property",
+ "name": "collectTestCases captures requirement property",
+ "className": "test",
+ "status": "Passed",
+ "duration": 0.02373,
+ "requirements": [],
+ "os": "linux"
+ },
+ {
+ "id": "collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan",
+ "name": "collectTestCases uses evidence property and falls back to directory scan",
+ "className": "test",
+ "status": "Passed",
+ "duration": 0.013354,
+ "requirements": [],
+ "os": "linux"
+ },
+ {
+ "id": "collecttestcases-uses-machine-name-property-for-owner",
+ "name": "collectTestCases uses machine-name property for owner",
+ "className": "test",
+ "status": "Passed",
+ "duration": 0.014287,
+ "requirements": [],
+ "os": "linux"
+ },
+ {
+ "id": "computestatuscounts-tallies-test-statuses",
+ "name": "computeStatusCounts tallies test statuses",
+ "className": "test",
+ "status": "Passed",
+ "duration": 0.000306,
+ "requirements": [],
+ "os": "linux"
+ },
+ {
+ "id": "detects-downloaded-artifacts-path",
+ "name": "detects downloaded artifacts path",
+ "className": "test",
+ "status": "Passed",
+ "duration": 0.998774,
+ "requirements": [],
+ "os": "linux"
+ },
+ {
+ "id": "dispatchers-and-parameters-include-descriptions",
+ "name": "Dispatchers and parameters include descriptions",
+ "className": "test",
+ "status": "Passed",
+ "duration": 0.003332,
+ "requirements": [],
+ "os": "linux"
+ },
+ {
+ "id": "errors-when-strict-unmapped-mode-enabled",
+ "name": "errors when strict unmapped mode enabled",
+ "className": "test",
+ "status": "Passed",
+ "duration": 1.075037,
+ "requirements": [],
+ "os": "linux"
+ },
+ {
+ "id": "escapemarkdown-escapes-special-characters",
+ "name": "escapeMarkdown escapes special characters",
+ "className": "test",
+ "status": "Passed",
+ "duration": 0.001169,
+ "requirements": [],
+ "os": "linux"
+ },
+ {
+ "id": "escapemarkdown-leaves-plain-text-untouched",
+ "name": "escapeMarkdown leaves plain text untouched",
+ "className": "test",
+ "status": "Passed",
+ "duration": 0.000191,
+ "requirements": [],
+ "os": "linux"
+ },
+ {
+ "id": "fails-when-commit-lacks-requirement-reference",
+ "name": "fails when commit lacks requirement reference",
+ "className": "test",
+ "status": "Passed",
+ "duration": 0.915909,
+ "requirements": [],
+ "os": "linux"
+ },
+ {
+ "id": "fails-when-requirement-lacks-test-coverage",
+ "name": "fails when requirement lacks test coverage",
+ "className": "test",
+ "status": "Passed",
+ "duration": 1.14534,
+ "requirements": [],
+ "os": "linux"
+ },
+ {
+ "id": "fails-when-tests-are-unmapped",
+ "name": "fails when tests are unmapped",
+ "className": "test",
+ "status": "Passed",
+ "duration": 0.853508,
+ "requirements": [],
+ "os": "linux"
+ },
+ {
+ "id": "fails-when-tests-reference-unknown-requirements",
+ "name": "fails when tests reference unknown requirements",
+ "className": "test",
+ "status": "Passed",
+ "duration": 0.938316,
+ "requirements": [],
+ "os": "linux"
+ },
+ {
+ "id": "formaterror-handles-plain-objects",
+ "name": "formatError handles plain objects",
+ "className": "test",
+ "status": "Passed",
+ "duration": 0.000306,
+ "requirements": [],
+ "os": "linux"
+ },
+ {
+ "id": "formaterror-handles-primitives",
+ "name": "formatError handles primitives",
+ "className": "test",
+ "status": "Passed",
+ "duration": 0.000128,
+ "requirements": [],
+ "os": "linux"
+ },
+ {
+ "id": "formaterror-handles-real-error-objects",
+ "name": "formatError handles real Error objects",
+ "className": "test",
+ "status": "Passed",
+ "duration": 0.002535,
+ "requirements": [],
+ "os": "linux"
+ },
+ {
+ "id": "formaterror-handles-unstringifiable-values",
+ "name": "formatError handles unstringifiable values",
+ "className": "test",
+ "status": "Passed",
+ "duration": 0.000345,
+ "requirements": [],
+ "os": "linux"
+ },
+ {
+ "id": "generate-ci-summary-features",
+ "name": "generate-ci-summary features",
+ "className": "test",
+ "status": "Passed",
+ "duration": 0.022454,
+ "requirements": [],
+ "os": "linux"
+ },
+ {
+ "id": "groups-owners-and-includes-requirements-and-evidence",
+ "name": "groups owners and includes requirements and evidence",
+ "className": "test",
+ "status": "Passed",
+ "duration": 1.018638,
+ "requirements": [],
+ "os": "linux"
+ },
+ {
+ "id": "grouptomarkdown-omits-numeric-identifiers",
+ "name": "groupToMarkdown omits numeric identifiers",
+ "className": "test",
+ "status": "Passed",
+ "duration": 0.001864,
+ "requirements": [],
+ "os": "linux"
+ },
+ {
+ "id": "grouptomarkdown-supports-optional-limit-for-truncation",
+ "name": "groupToMarkdown supports optional limit for truncation",
+ "className": "test",
+ "status": "Passed",
+ "duration": 0.000604,
+ "requirements": [],
+ "os": "linux"
+ },
+ {
+ "id": "handles-root-level-testcases",
+ "name": "handles root-level testcases",
+ "className": "test",
+ "status": "Passed",
+ "duration": 0.000452,
+ "requirements": [],
+ "os": "linux"
+ },
+ {
+ "id": "handles-zipped-junit-artifacts",
+ "name": "handles zipped JUnit artifacts",
+ "className": "test",
+ "status": "Passed",
+ "duration": 0.816208,
+ "requirements": [],
+ "os": "linux"
+ },
+ {
+ "id": "ignores-stale-junit-files-outside-artifacts-path",
+ "name": "ignores stale JUnit files outside artifacts path",
+ "className": "test",
+ "status": "Passed",
+ "duration": 0.874948,
+ "requirements": [],
+ "os": "linux"
+ },
+ {
+ "id": "loadrequirements-logs-warning-on-invalid-json",
+ "name": "loadRequirements logs warning on invalid JSON",
+ "className": "test",
+ "status": "Passed",
+ "duration": 0.014903,
+ "requirements": [],
+ "os": "linux"
+ },
+ {
+ "id": "loadrequirements-merges-multiple-files",
+ "name": "loadRequirements merges multiple files",
+ "className": "test",
+ "status": "Passed",
+ "duration": 0.008402,
+ "requirements": [],
+ "os": "linux"
+ },
+ {
+ "id": "loadrequirements-warns-and-skips-invalid-entries",
+ "name": "loadRequirements warns and skips invalid entries",
+ "className": "test",
+ "status": "Passed",
+ "duration": 0.00367,
+ "requirements": [],
+ "os": "linux"
+ },
+ {
+ "id": "logs-a-warning-when-no-junit-files-are-found",
+ "name": "logs a warning when no JUnit files are found",
+ "className": "test",
+ "status": "Passed",
+ "duration": 0.907921,
+ "requirements": [],
+ "os": "linux"
+ },
+ {
+ "id": "partitions-requirement-groups-by-runner_type",
+ "name": "partitions requirement groups by runner_type",
+ "className": "test",
+ "status": "Passed",
+ "duration": 0.768752,
+ "requirements": [],
+ "os": "linux"
+ },
+ {
+ "id": "passes-with-coverage-and-requirement-reference",
+ "name": "passes with coverage and requirement reference",
+ "className": "test",
+ "status": "Passed",
+ "duration": 1.066877,
+ "requirements": [],
+ "os": "linux"
+ },
+ {
+ "id": "requirementssummarytomarkdown-escapes-pipes-in-description",
+ "name": "requirementsSummaryToMarkdown escapes pipes in description",
+ "className": "test",
+ "status": "Passed",
+ "duration": 0.000375,
+ "requirements": [],
+ "os": "linux"
+ },
+ {
+ "id": "skips-invalid-junit-files-and-still-generates-summary",
+ "name": "skips invalid JUnit files and still generates summary",
+ "className": "test",
+ "status": "Passed",
+ "duration": 1.101184,
+ "requirements": [],
+ "os": "linux"
+ },
+ {
+ "id": "summarytomarkdown-handles-no-tests",
+ "name": "summaryToMarkdown handles no tests",
+ "className": "test",
+ "status": "Passed",
+ "duration": 0.000344,
+ "requirements": [],
+ "os": "linux"
+ },
+ {
+ "id": "summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters",
+ "name": "summaryToMarkdown sorts OS alphabetically and escapes special characters",
+ "className": "test",
+ "status": "Passed",
+ "duration": 0.000572,
+ "requirements": [],
+ "os": "linux"
+ },
+ {
+ "id": "throws-when-no-junit-files-found-and-strict-mode-enabled",
+ "name": "throws when no JUnit files found and strict mode enabled",
+ "className": "test",
+ "status": "Passed",
+ "duration": 0.657427,
+ "requirements": [],
+ "os": "linux"
+ },
+ {
+ "id": "uses-latest-artifact-directory-when-multiple-are-present",
+ "name": "uses latest artifact directory when multiple are present",
+ "className": "test",
+ "status": "Passed",
+ "duration": 0.914005,
+ "requirements": [],
+ "os": "linux"
+ },
+ {
+ "id": "warns-when-all-tests-are-unmapped",
+ "name": "warns when all tests are unmapped",
+ "className": "test",
+ "status": "Passed",
+ "duration": 1.131071,
+ "requirements": [],
+ "os": "linux"
+ },
+ {
+ "id": "writeerrorsummary-appends-error-details-to-summary-file",
+ "name": "writeErrorSummary appends error details to summary file",
+ "className": "test",
+ "status": "Passed",
+ "duration": 0.011979,
+ "requirements": [],
+ "os": "linux"
+ },
+ {
+ "id": "writeerrorsummary-skips-summary-file-for-non-error-throws",
+ "name": "writeErrorSummary skips summary file for non-Error throws",
+ "className": "test",
+ "status": "Passed",
+ "duration": 0.003976,
+ "requirements": [],
+ "os": "linux"
+ },
+ {
+ "id": "writes-outputs-to-os-specific-directory",
+ "name": "writes outputs to OS-specific directory",
+ "className": "test",
+ "status": "Passed",
+ "duration": 1.242115,
+ "requirements": [],
+ "os": "linux"
}
]
}
],
"totals": {
"overall": {
- "passed": 4,
+ "passed": 59,
"failed": 0,
"skipped": 0,
- "duration": 0.666,
+ "duration": 17.284624,
"rate": 100
},
"byOs": {
"linux": {
- "passed": 4,
+ "passed": 59,
"failed": 0,
"skipped": 0,
- "duration": 0.666,
+ "duration": 17.284624,
"rate": 100
}
}
diff --git a/artifacts/linux/traceability.md b/artifacts/linux/traceability.md
index d46bd1ae..f6638d50 100644
--- a/artifacts/linux/traceability.md
+++ b/artifacts/linux/traceability.md
@@ -1,10 +1,122 @@
### Test Traceability Matrix
-#### Unmapped (100% passed)
+#### REQ-023 (100% passed)
| Requirement | Test ID | Status | Duration (s) | Owner | Evidence |
| --- | --- | --- | --- | --- | --- |
+| REQ-023 | parses-nested-junit-structures | Passed | 0.015 | | |
+
+#### REQ-024 (100% passed)
+
+| Requirement | Test ID | Status | Duration (s) | Owner | Evidence |
+| --- | --- | --- | --- | --- | --- |
+| REQ-024 | captures-root-testsuites-attributes | Passed | 0.006 | | |
+
+#### REQ-025 (100% passed)
+
+| Requirement | Test ID | Status | Duration (s) | Owner | Evidence |
+| --- | --- | --- | --- | --- | --- |
+| REQ-025 | captures-testsuite-attributes | Passed | 0.010 | | |
+
+#### REQ-026 (100% passed)
+
+| Requirement | Test ID | Status | Duration (s) | Owner | Evidence |
+| --- | --- | --- | --- | --- | --- |
+| REQ-026 | captures-suite-properties | Passed | 0.001 | | |
+
+#### REQ-027 (100% passed)
+
+| Requirement | Test ID | Status | Duration (s) | Owner | Evidence |
+| --- | --- | --- | --- | --- | --- |
+| REQ-027 | captures-testcase-attributes-and-skipped-message | Passed | 0.001 | | |
+
+#### REQ-028 (100% passed)
+
+| Requirement | Test ID | Status | Duration (s) | Owner | Evidence |
+| --- | --- | --- | --- | --- | --- |
+| REQ-028 | extracts-requirement-identifiers | Passed | 0.002 | | |
+
+#### REQ-029 (100% passed)
+
+| Requirement | Test ID | Status | Duration (s) | Owner | Evidence |
+| --- | --- | --- | --- | --- | --- |
+| REQ-029 | aggregates-status-by-requirement-and-suite | Passed | 0.002 | | |
+
+#### REQ-030 (100% passed)
+
+| Requirement | Test ID | Status | Duration (s) | Owner | Evidence |
+| --- | --- | --- | --- | --- | --- |
+| REQ-030 | builds-traceability-matrix-with-skipped-reasons | Passed | 0.002 | | |
+
+#### REQ-031 (100% passed)
+
+| Requirement | Test ID | Status | Duration (s) | Owner | Evidence |
+| --- | --- | --- | --- | --- | --- |
+| REQ-031 | validates-missing-fields | Passed | 0.001 | | |
+
+#### REQ-032 (100% passed)
+
+| Requirement | Test ID | Status | Duration (s) | Owner | Evidence |
+| --- | --- | --- | --- | --- | --- |
+| REQ-032 | preserves-unknown-attributes | Passed | 0.001 | | |
+
+#### REQ-033 (100% passed)
+
+| Requirement | Test ID | Status | Duration (s) | Owner | Evidence |
+| --- | --- | --- | --- | --- | --- |
+| REQ-033 | throws-error-for-malformed-xml | Passed | 0.002 | | |
+
+Unmapped (100% passed)
+
+| Requirement | Test ID | Status | Duration (s) | Owner | Evidence |
+| --- | --- | --- | --- | --- | --- |
+| Unmapped | associates-classname-with-requirement | Passed | 0.018 | | |
+| Unmapped | buildissuebranchname-formats-branch-name | Passed | 0.001 | | |
+| Unmapped | buildissuebranchname-rejects-non-numeric-input | Passed | 0.003 | | |
| Unmapped | buildprofile1.iconeditor.addtokentolabview.dispatcher.dry-runs-add-token-to-labview-with-expected-arguments- | Passed | 0.482 | | |
| Unmapped | buildprofile1.iconeditor.applyvipc.dispatcher.dry-runs-apply-vipc-with-expected-arguments- | Passed | 0.042 | | |
| Unmapped | buildprofile1.iconeditor.buildvipackage.dispatcher.dry-runs-build-vi-package-with-expected-arguments- | Passed | 0.106 | | |
-| Unmapped | buildprofile1.iconeditor.closelabview.dispatcher.dry-runs-close-labview-with-expected-arguments- | Passed | 0.036 | | |
\ No newline at end of file
+| Unmapped | buildprofile1.iconeditor.closelabview.dispatcher.dry-runs-close-labview-with-expected-arguments- | Passed | 0.036 | | |
+| Unmapped | buildsummary-splits-totals-by-os | Passed | 0.001 | | |
+| Unmapped | collecttestcases-captures-requirement-property | Passed | 0.024 | | |
+| Unmapped | collecttestcases-uses-evidence-property-and-falls-back-to-directory-scan | Passed | 0.013 | | |
+| Unmapped | collecttestcases-uses-machine-name-property-for-owner | Passed | 0.014 | | |
+| Unmapped | computestatuscounts-tallies-test-statuses | Passed | 0.000 | | |
+| Unmapped | detects-downloaded-artifacts-path | Passed | 0.999 | | |
+| Unmapped | dispatchers-and-parameters-include-descriptions | Passed | 0.003 | | |
+| Unmapped | errors-when-strict-unmapped-mode-enabled | Passed | 1.075 | | |
+| Unmapped | escapemarkdown-escapes-special-characters | Passed | 0.001 | | |
+| Unmapped | escapemarkdown-leaves-plain-text-untouched | Passed | 0.000 | | |
+| Unmapped | fails-when-commit-lacks-requirement-reference | Passed | 0.916 | | |
+| Unmapped | fails-when-requirement-lacks-test-coverage | Passed | 1.145 | | |
+| Unmapped | fails-when-tests-are-unmapped | Passed | 0.854 | | |
+| Unmapped | fails-when-tests-reference-unknown-requirements | Passed | 0.938 | | |
+| Unmapped | formaterror-handles-plain-objects | Passed | 0.000 | | |
+| Unmapped | formaterror-handles-primitives | Passed | 0.000 | | |
+| Unmapped | formaterror-handles-real-error-objects | Passed | 0.003 | | |
+| Unmapped | formaterror-handles-unstringifiable-values | Passed | 0.000 | | |
+| Unmapped | generate-ci-summary-features | Passed | 0.022 | | |
+| Unmapped | groups-owners-and-includes-requirements-and-evidence | Passed | 1.019 | | |
+| Unmapped | grouptomarkdown-omits-numeric-identifiers | Passed | 0.002 | | |
+| Unmapped | grouptomarkdown-supports-optional-limit-for-truncation | Passed | 0.001 | | |
+| Unmapped | handles-root-level-testcases | Passed | 0.000 | | |
+| Unmapped | handles-zipped-junit-artifacts | Passed | 0.816 | | |
+| Unmapped | ignores-stale-junit-files-outside-artifacts-path | Passed | 0.875 | | |
+| Unmapped | loadrequirements-logs-warning-on-invalid-json | Passed | 0.015 | | |
+| Unmapped | loadrequirements-merges-multiple-files | Passed | 0.008 | | |
+| Unmapped | loadrequirements-warns-and-skips-invalid-entries | Passed | 0.004 | | |
+| Unmapped | logs-a-warning-when-no-junit-files-are-found | Passed | 0.908 | | |
+| Unmapped | partitions-requirement-groups-by-runner\_type | Passed | 0.769 | | |
+| Unmapped | passes-with-coverage-and-requirement-reference | Passed | 1.067 | | |
+| Unmapped | requirementssummarytomarkdown-escapes-pipes-in-description | Passed | 0.000 | | |
+| Unmapped | skips-invalid-junit-files-and-still-generates-summary | Passed | 1.101 | | |
+| Unmapped | summarytomarkdown-handles-no-tests | Passed | 0.000 | | |
+| Unmapped | summarytomarkdown-sorts-os-alphabetically-and-escapes-special-characters | Passed | 0.001 | | |
+| Unmapped | throws-when-no-junit-files-found-and-strict-mode-enabled | Passed | 0.657 | | |
+| Unmapped | uses-latest-artifact-directory-when-multiple-are-present | Passed | 0.914 | | |
+| Unmapped | warns-when-all-tests-are-unmapped | Passed | 1.131 | | |
+| Unmapped | writeerrorsummary-appends-error-details-to-summary-file | Passed | 0.012 | | |
+| Unmapped | writeerrorsummary-skips-summary-file-for-non-error-throws | Passed | 0.004 | | |
+| Unmapped | writes-outputs-to-os-specific-directory | Passed | 1.242 | | |
+
+
\ No newline at end of file
diff --git a/ci_evidence.txt b/ci_evidence.txt
index ce05fb35..41ba5c99 100644
--- a/ci_evidence.txt
+++ b/ci_evidence.txt
@@ -1 +1 @@
-{"pipeline":"Unknown","git_sha":"4a4d08c05d6852d7aa75ba72c5fb1f39370560ad","req_status":{}}
\ No newline at end of file
+{"pipeline":"Unknown","git_sha":"85a73ea39c0b2fe1e91c7dc2504fd8fcd7a71b52","req_status":{"REQ-023":"PASS","REQ-024":"PASS","REQ-025":"PASS","REQ-026":"PASS","REQ-027":"PASS","REQ-028":"PASS","REQ-029":"PASS","REQ-030":"PASS","REQ-031":"PASS","REQ-032":"PASS","REQ-033":"PASS"}}
\ No newline at end of file
diff --git a/error-summary.md b/error-summary.md
index d9cc5343..1301db89 100644
--- a/error-summary.md
+++ b/error-summary.md
@@ -40,6 +40,22 @@ Error: All tests are unmapped; verify requirements mapping.
```
+### Error generating CI summary
+
+```
+Error: No JUnit files found
+ at main (/workspace/open-source/scripts/generate-ci-summary.ts:79:15)
+```
+
+
+### Error generating CI summary
+
+```
+Error: All tests are unmapped; verify requirements mapping.
+ at main (/workspace/open-source/scripts/generate-ci-summary.ts:94:13)
+```
+
+
### Error generating CI summary
```
diff --git a/test-results/node-junit.xml b/test-results/node-junit.xml
index 32a8e32d..29670deb 100644
--- a/test-results/node-junit.xml
+++ b/test-results/node-junit.xml
@@ -1,2 +1,66 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+