From 33c6748d5280de9185cbab3b93b55c8b8b840fa4 Mon Sep 17 00:00:00 2001 From: konard Date: Tue, 12 May 2026 18:10:01 +0000 Subject: [PATCH 1/4] Initial commit with task details Adding .gitkeep for PR creation (default mode). This file will be removed when the task is complete. Issue: https://github.com/link-foundation/link-cli/issues/82 --- .gitkeep | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitkeep b/.gitkeep index 2a41a33..471ab09 100644 --- a/.gitkeep +++ b/.gitkeep @@ -1 +1,2 @@ -# .gitkeep file auto-generated at 2026-05-12T09:35:32.242Z for PR creation at branch issue-75-2384a28fe185 for issue https://github.com/link-foundation/link-cli/issues/75 \ No newline at end of file +# .gitkeep file auto-generated at 2026-05-12T09:35:32.242Z for PR creation at branch issue-75-2384a28fe185 for issue https://github.com/link-foundation/link-cli/issues/75 +# Updated: 2026-05-12T18:10:01.784Z \ No newline at end of file From dc7c8b2860cb68b426c08cd928fa0594b70150da Mon Sep 17 00:00:00 2001 From: konard Date: Tue, 12 May 2026 18:47:03 +0000 Subject: [PATCH 2/4] fix: restore component release automation --- .github/workflows/csharp.yml | 86 +- .github/workflows/rust.yml | 24 +- .github/workflows/wasm.yml | 20 +- .gitkeep | 2 - csharp/scripts/release-scripts.test.mjs | 55 + csharp/scripts/version-and-commit.mjs | 9 +- docs/case-studies/issue-82/README.md | 109 + .../evidence/d47e551-changed-files.txt | 11 + .../issue-82/evidence/d47e551-diff-stat.txt | 12 + .../issue-82/evidence/issue-82-comments.json | 1 + .../issue-82/evidence/issue-82.json | 1 + .../link-cli-cicd-file-tree-after.txt | 72 + .../link-cli-cicd-file-tree-before.txt | 163 + .../evidence/pr-83-conversation-comments.json | 1 + .../evidence/pr-83-review-comments.json | 1 + .../issue-82/evidence/pr-83-reviews.json | 1 + .../case-studies/issue-82/evidence/pr-83.json | 1 + .../issue-82/evidence/recent-releases.txt | 12 + .../issue-82/evidence/recent-runs.json | 1 + .../evidence/run-25749403949-wasm.json | 1 + .../evidence/run-25749403949-wasm.log | 1990 ++++++ .../evidence/run-25749404027-csharp.json | 1 + .../evidence/run-25749404027-csharp.log | 5878 +++++++++++++++++ .../issue-82/evidence/runs-for-d47e551.json | 1 + .../evidence/template-csharp-file-tree.json | 1 + .../evidence/template-csharp-workflows.json | 1 + .../evidence/template-js-file-tree.json | 1 + .../evidence/template-js-workflows.json | 1 + .../evidence/template-rust-file-tree.json | 1 + .../evidence/template-rust-workflows.json | 1 + .../evidence/templates/csharp/release.yml | 487 ++ .../templates/csharp/scripts/bump-version.mjs | 102 + .../csharp/scripts/check-file-size.mjs | 97 + .../csharp/scripts/create-github-release.mjs | 504 ++ .../scripts/create-github-release.test.mjs | 239 + .../csharp/scripts/detect-code-changes.mjs | 204 + .../csharp/scripts/merge-changesets.mjs | 264 + .../csharp/scripts/validate-changeset.mjs | 268 + .../csharp/scripts/version-and-commit.mjs | 414 ++ .../templates/csharp/workflows/release.yml | 487 ++ .../evidence/templates/js/example-app.yml | 187 + .../issue-82/evidence/templates/js/links.yml | 84 + .../evidence/templates/js/release.yml | 617 ++ .../js/scripts/changeset-version.mjs | 75 + .../templates/js/scripts/check-changesets.mjs | 67 + .../js/scripts/check-docker-publish.mjs | 143 + .../js/scripts/check-file-line-limits.sh | 70 + .../templates/js/scripts/check-mjs-syntax.sh | 29 + .../js/scripts/check-release-needed.mjs | 123 + .../templates/js/scripts/check-version.mjs | 129 + .../js/scripts/check-web-archive.mjs | 263 + .../js/scripts/create-github-release.mjs | 217 + .../js/scripts/create-manual-changeset.mjs | 100 + .../js/scripts/detect-code-changes.mjs | 153 + .../js/scripts/format-github-release.mjs | 90 + .../scripts/format-release-notes-helpers.mjs | 26 + .../js/scripts/format-release-notes.mjs | 230 + .../js/scripts/instant-version-bump.mjs | 172 + .../templates/js/scripts/js-paths.mjs | 177 + .../templates/js/scripts/merge-changesets.mjs | 274 + .../templates/js/scripts/package-info.mjs | 97 + .../templates/js/scripts/publish-to-npm.mjs | 325 + .../templates/js/scripts/setup-npm.mjs | 265 + .../js/scripts/simulate-fresh-merge.sh | 61 + .../js/scripts/validate-changeset.mjs | 276 + .../js/scripts/version-and-commit.mjs | 284 + .../templates/js/scripts/wait-for-npm.mjs | 191 + .../templates/js/workflows/example-app.yml | 187 + .../evidence/templates/js/workflows/links.yml | 84 + .../templates/js/workflows/release.yml | 617 ++ .../evidence/templates/rust/release.yml | 670 ++ .../templates/rust/scripts/bump-version.rs | 165 + .../rust/scripts/check-changelog-fragment.rs | 164 + .../templates/rust/scripts/check-file-size.rs | 293 + .../rust/scripts/check-release-needed.rs | 395 ++ .../scripts/check-version-modification.rs | 163 + .../rust/scripts/collect-changelog.rs | 234 + .../rust/scripts/create-changelog-fragment.rs | 119 + .../rust/scripts/create-github-release.rs | 413 ++ .../rust/scripts/detect-code-changes.rs | 186 + .../templates/rust/scripts/get-bump-type.rs | 174 + .../templates/rust/scripts/get-version.rs | 72 + .../templates/rust/scripts/git-config.rs | 62 + .../templates/rust/scripts/publish-crate.rs | 179 + .../templates/rust/scripts/rust-paths.rs | 273 + .../rust/scripts/version-and-commit.rs | 532 ++ .../templates/rust/scripts/wait-for-crate.rs | 178 + .../templates/rust/workflows/release.yml | 670 ++ .../evidence/test-logs/cargo-clippy.log | 46 + .../evidence/test-logs/cargo-fmt-check.log | 0 .../evidence/test-logs/cargo-test.log | 301 + .../evidence/test-logs/dotnet-test.log | 575 ++ .../evidence/test-logs/git-diff-check.log | 0 .../evidence/test-logs/npm-build-after-ci.log | 1202 ++++ .../issue-82/evidence/test-logs/npm-ci.log | 7 + .../evidence/test-logs/npm-test-js.log | 80 + .../regression-after-action-updates.log | 71 + .../test-logs/regression-after-fix.log | 66 + .../test-logs/regression-before-fix.log | 137 + .../upstream-csharp-template-issue-9.json | 1 + .../upstream-csharp-template-issue-body.md | 61 + .../evidence/verified-action-tags.txt | 18 + js/test/repositoryLayout.test.mjs | 48 + 103 files changed, 24637 insertions(+), 56 deletions(-) delete mode 100644 .gitkeep create mode 100644 docs/case-studies/issue-82/README.md create mode 100644 docs/case-studies/issue-82/evidence/d47e551-changed-files.txt create mode 100644 docs/case-studies/issue-82/evidence/d47e551-diff-stat.txt create mode 100644 docs/case-studies/issue-82/evidence/issue-82-comments.json create mode 100644 docs/case-studies/issue-82/evidence/issue-82.json create mode 100644 docs/case-studies/issue-82/evidence/link-cli-cicd-file-tree-after.txt create mode 100644 docs/case-studies/issue-82/evidence/link-cli-cicd-file-tree-before.txt create mode 100644 docs/case-studies/issue-82/evidence/pr-83-conversation-comments.json create mode 100644 docs/case-studies/issue-82/evidence/pr-83-review-comments.json create mode 100644 docs/case-studies/issue-82/evidence/pr-83-reviews.json create mode 100644 docs/case-studies/issue-82/evidence/pr-83.json create mode 100644 docs/case-studies/issue-82/evidence/recent-releases.txt create mode 100644 docs/case-studies/issue-82/evidence/recent-runs.json create mode 100644 docs/case-studies/issue-82/evidence/run-25749403949-wasm.json create mode 100644 docs/case-studies/issue-82/evidence/run-25749403949-wasm.log create mode 100644 docs/case-studies/issue-82/evidence/run-25749404027-csharp.json create mode 100644 docs/case-studies/issue-82/evidence/run-25749404027-csharp.log create mode 100644 docs/case-studies/issue-82/evidence/runs-for-d47e551.json create mode 100644 docs/case-studies/issue-82/evidence/template-csharp-file-tree.json create mode 100644 docs/case-studies/issue-82/evidence/template-csharp-workflows.json create mode 100644 docs/case-studies/issue-82/evidence/template-js-file-tree.json create mode 100644 docs/case-studies/issue-82/evidence/template-js-workflows.json create mode 100644 docs/case-studies/issue-82/evidence/template-rust-file-tree.json create mode 100644 docs/case-studies/issue-82/evidence/template-rust-workflows.json create mode 100644 docs/case-studies/issue-82/evidence/templates/csharp/release.yml create mode 100644 docs/case-studies/issue-82/evidence/templates/csharp/scripts/bump-version.mjs create mode 100644 docs/case-studies/issue-82/evidence/templates/csharp/scripts/check-file-size.mjs create mode 100644 docs/case-studies/issue-82/evidence/templates/csharp/scripts/create-github-release.mjs create mode 100644 docs/case-studies/issue-82/evidence/templates/csharp/scripts/create-github-release.test.mjs create mode 100644 docs/case-studies/issue-82/evidence/templates/csharp/scripts/detect-code-changes.mjs create mode 100644 docs/case-studies/issue-82/evidence/templates/csharp/scripts/merge-changesets.mjs create mode 100644 docs/case-studies/issue-82/evidence/templates/csharp/scripts/validate-changeset.mjs create mode 100644 docs/case-studies/issue-82/evidence/templates/csharp/scripts/version-and-commit.mjs create mode 100644 docs/case-studies/issue-82/evidence/templates/csharp/workflows/release.yml create mode 100644 docs/case-studies/issue-82/evidence/templates/js/example-app.yml create mode 100644 docs/case-studies/issue-82/evidence/templates/js/links.yml create mode 100644 docs/case-studies/issue-82/evidence/templates/js/release.yml create mode 100644 docs/case-studies/issue-82/evidence/templates/js/scripts/changeset-version.mjs create mode 100644 docs/case-studies/issue-82/evidence/templates/js/scripts/check-changesets.mjs create mode 100644 docs/case-studies/issue-82/evidence/templates/js/scripts/check-docker-publish.mjs create mode 100755 docs/case-studies/issue-82/evidence/templates/js/scripts/check-file-line-limits.sh create mode 100755 docs/case-studies/issue-82/evidence/templates/js/scripts/check-mjs-syntax.sh create mode 100644 docs/case-studies/issue-82/evidence/templates/js/scripts/check-release-needed.mjs create mode 100644 docs/case-studies/issue-82/evidence/templates/js/scripts/check-version.mjs create mode 100644 docs/case-studies/issue-82/evidence/templates/js/scripts/check-web-archive.mjs create mode 100644 docs/case-studies/issue-82/evidence/templates/js/scripts/create-github-release.mjs create mode 100644 docs/case-studies/issue-82/evidence/templates/js/scripts/create-manual-changeset.mjs create mode 100644 docs/case-studies/issue-82/evidence/templates/js/scripts/detect-code-changes.mjs create mode 100644 docs/case-studies/issue-82/evidence/templates/js/scripts/format-github-release.mjs create mode 100644 docs/case-studies/issue-82/evidence/templates/js/scripts/format-release-notes-helpers.mjs create mode 100644 docs/case-studies/issue-82/evidence/templates/js/scripts/format-release-notes.mjs create mode 100644 docs/case-studies/issue-82/evidence/templates/js/scripts/instant-version-bump.mjs create mode 100644 docs/case-studies/issue-82/evidence/templates/js/scripts/js-paths.mjs create mode 100644 docs/case-studies/issue-82/evidence/templates/js/scripts/merge-changesets.mjs create mode 100644 docs/case-studies/issue-82/evidence/templates/js/scripts/package-info.mjs create mode 100644 docs/case-studies/issue-82/evidence/templates/js/scripts/publish-to-npm.mjs create mode 100644 docs/case-studies/issue-82/evidence/templates/js/scripts/setup-npm.mjs create mode 100755 docs/case-studies/issue-82/evidence/templates/js/scripts/simulate-fresh-merge.sh create mode 100644 docs/case-studies/issue-82/evidence/templates/js/scripts/validate-changeset.mjs create mode 100644 docs/case-studies/issue-82/evidence/templates/js/scripts/version-and-commit.mjs create mode 100644 docs/case-studies/issue-82/evidence/templates/js/scripts/wait-for-npm.mjs create mode 100644 docs/case-studies/issue-82/evidence/templates/js/workflows/example-app.yml create mode 100644 docs/case-studies/issue-82/evidence/templates/js/workflows/links.yml create mode 100644 docs/case-studies/issue-82/evidence/templates/js/workflows/release.yml create mode 100644 docs/case-studies/issue-82/evidence/templates/rust/release.yml create mode 100644 docs/case-studies/issue-82/evidence/templates/rust/scripts/bump-version.rs create mode 100644 docs/case-studies/issue-82/evidence/templates/rust/scripts/check-changelog-fragment.rs create mode 100644 docs/case-studies/issue-82/evidence/templates/rust/scripts/check-file-size.rs create mode 100644 docs/case-studies/issue-82/evidence/templates/rust/scripts/check-release-needed.rs create mode 100644 docs/case-studies/issue-82/evidence/templates/rust/scripts/check-version-modification.rs create mode 100644 docs/case-studies/issue-82/evidence/templates/rust/scripts/collect-changelog.rs create mode 100644 docs/case-studies/issue-82/evidence/templates/rust/scripts/create-changelog-fragment.rs create mode 100644 docs/case-studies/issue-82/evidence/templates/rust/scripts/create-github-release.rs create mode 100644 docs/case-studies/issue-82/evidence/templates/rust/scripts/detect-code-changes.rs create mode 100644 docs/case-studies/issue-82/evidence/templates/rust/scripts/get-bump-type.rs create mode 100644 docs/case-studies/issue-82/evidence/templates/rust/scripts/get-version.rs create mode 100644 docs/case-studies/issue-82/evidence/templates/rust/scripts/git-config.rs create mode 100644 docs/case-studies/issue-82/evidence/templates/rust/scripts/publish-crate.rs create mode 100644 docs/case-studies/issue-82/evidence/templates/rust/scripts/rust-paths.rs create mode 100644 docs/case-studies/issue-82/evidence/templates/rust/scripts/version-and-commit.rs create mode 100644 docs/case-studies/issue-82/evidence/templates/rust/scripts/wait-for-crate.rs create mode 100644 docs/case-studies/issue-82/evidence/templates/rust/workflows/release.yml create mode 100644 docs/case-studies/issue-82/evidence/test-logs/cargo-clippy.log create mode 100644 docs/case-studies/issue-82/evidence/test-logs/cargo-fmt-check.log create mode 100644 docs/case-studies/issue-82/evidence/test-logs/cargo-test.log create mode 100644 docs/case-studies/issue-82/evidence/test-logs/dotnet-test.log create mode 100644 docs/case-studies/issue-82/evidence/test-logs/git-diff-check.log create mode 100644 docs/case-studies/issue-82/evidence/test-logs/npm-build-after-ci.log create mode 100644 docs/case-studies/issue-82/evidence/test-logs/npm-ci.log create mode 100644 docs/case-studies/issue-82/evidence/test-logs/npm-test-js.log create mode 100644 docs/case-studies/issue-82/evidence/test-logs/regression-after-action-updates.log create mode 100644 docs/case-studies/issue-82/evidence/test-logs/regression-after-fix.log create mode 100644 docs/case-studies/issue-82/evidence/test-logs/regression-before-fix.log create mode 100644 docs/case-studies/issue-82/evidence/upstream-csharp-template-issue-9.json create mode 100644 docs/case-studies/issue-82/evidence/upstream-csharp-template-issue-body.md create mode 100644 docs/case-studies/issue-82/evidence/verified-action-tags.txt diff --git a/.github/workflows/csharp.yml b/.github/workflows/csharp.yml index a28b74d..0da8b7c 100644 --- a/.github/workflows/csharp.yml +++ b/.github/workflows/csharp.yml @@ -4,10 +4,6 @@ on: push: branches: - main - paths: - - 'csharp/**' - - 'csharp/scripts/**' - - '.github/workflows/csharp.yml' pull_request: types: [opened, synchronize, reopened] paths: @@ -67,12 +63,12 @@ jobs: any-code-changed: ${{ steps.changes.outputs.any-code-changed }} csharp-code-changed: ${{ steps.changes.outputs.csharp-code-changed }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: fetch-depth: 0 - name: Setup Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version: '20.x' @@ -92,12 +88,12 @@ jobs: needs: [detect-changes] if: github.event_name == 'pull_request' && needs.detect-changes.outputs.csharp-code-changed == 'true' steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: fetch-depth: 0 - name: Setup Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version: '20.x' @@ -140,15 +136,15 @@ jobs: needs.detect-changes.outputs.workflow-changed == 'true' ) steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: Setup .NET - uses: actions/setup-dotnet@v4 + uses: actions/setup-dotnet@v5 with: dotnet-version: '8.0.x' - name: Setup Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version: '20.x' @@ -173,10 +169,10 @@ jobs: matrix: os: [ubuntu-latest, macos-latest, windows-latest] steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: Setup .NET - uses: actions/setup-dotnet@v4 + uses: actions/setup-dotnet@v5 with: dotnet-version: '8.0.x' @@ -193,7 +189,7 @@ jobs: - name: Upload coverage to Codecov if: matrix.os == 'ubuntu-latest' - uses: codecov/codecov-action@v4 + uses: codecov/codecov-action@v5 with: fail_ci_if_error: false @@ -204,10 +200,10 @@ jobs: needs: [lint, test] if: always() && !cancelled() && needs.lint.result == 'success' && needs.test.result == 'success' steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: Setup .NET - uses: actions/setup-dotnet@v4 + uses: actions/setup-dotnet@v5 with: dotnet-version: '8.0.x' @@ -221,7 +217,7 @@ jobs: run: dotnet pack --no-build --configuration Release --output ./artifacts - name: Upload artifacts - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: nuget-package path: csharp/artifacts/*.nupkg @@ -236,17 +232,17 @@ jobs: contents: write packages: write steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: fetch-depth: 0 - name: Setup .NET - uses: actions/setup-dotnet@v4 + uses: actions/setup-dotnet@v5 with: dotnet-version: '8.0.x' - name: Setup Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version: '20.x' @@ -290,7 +286,9 @@ jobs: if [ -z "$PACKAGE_ID" ]; then PACKAGE_ID=clink fi + PACKAGE_ID_LOWER=$(echo "$PACKAGE_ID" | tr '[:upper:]' '[:lower:]') echo "id=$PACKAGE_ID" >> "$GITHUB_OUTPUT" + echo "flat_container_id=$PACKAGE_ID_LOWER" >> "$GITHUB_OUTPUT" - name: Publish to NuGet id: nuget_publish @@ -306,6 +304,26 @@ jobs: echo "published=false" >> "$GITHUB_OUTPUT" fi + - name: Verify package on NuGet + if: steps.version.outputs.version_committed == 'true' && steps.nuget_publish.outputs.published == 'true' + run: | + PACKAGE_ID="${{ steps.package.outputs.id }}" + PACKAGE_ID_LOWER="${{ steps.package.outputs.flat_container_id }}" + VERSION="${{ steps.version.outputs.new_version }}" + for DELAY in 0 5 10 20 30 60; do + if [ "$DELAY" != "0" ]; then + sleep "$DELAY" + fi + STATUS=$(curl -sS -o /dev/null -w '%{http_code}' "https://api.nuget.org/v3-flatcontainer/${PACKAGE_ID_LOWER}/${VERSION}/${PACKAGE_ID_LOWER}.nuspec" || true) + echo "NuGet status for ${PACKAGE_ID}@${VERSION}: ${STATUS}" + if [ "$STATUS" = "200" ]; then + echo "Verified ${PACKAGE_ID}@${VERSION} is available on NuGet" + exit 0 + fi + done + echo "::error title=NuGet verification failed::${PACKAGE_ID}@${VERSION} was not available from NuGet after publish." + exit 1 + - name: Create GitHub Release if: steps.version.outputs.version_committed == 'true' env: @@ -331,18 +349,18 @@ jobs: contents: write packages: write steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: fetch-depth: 0 token: ${{ secrets.GITHUB_TOKEN }} - name: Setup .NET - uses: actions/setup-dotnet@v4 + uses: actions/setup-dotnet@v5 with: dotnet-version: '8.0.x' - name: Setup Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version: '20.x' @@ -370,7 +388,9 @@ jobs: if [ -z "$PACKAGE_ID" ]; then PACKAGE_ID=clink fi + PACKAGE_ID_LOWER=$(echo "$PACKAGE_ID" | tr '[:upper:]' '[:lower:]') echo "id=$PACKAGE_ID" >> "$GITHUB_OUTPUT" + echo "flat_container_id=$PACKAGE_ID_LOWER" >> "$GITHUB_OUTPUT" - name: Publish to NuGet id: nuget_publish @@ -386,6 +406,26 @@ jobs: echo "published=false" >> "$GITHUB_OUTPUT" fi + - name: Verify package on NuGet + if: steps.version.outputs.version_committed == 'true' && steps.nuget_publish.outputs.published == 'true' + run: | + PACKAGE_ID="${{ steps.package.outputs.id }}" + PACKAGE_ID_LOWER="${{ steps.package.outputs.flat_container_id }}" + VERSION="${{ steps.version.outputs.new_version }}" + for DELAY in 0 5 10 20 30 60; do + if [ "$DELAY" != "0" ]; then + sleep "$DELAY" + fi + STATUS=$(curl -sS -o /dev/null -w '%{http_code}' "https://api.nuget.org/v3-flatcontainer/${PACKAGE_ID_LOWER}/${VERSION}/${PACKAGE_ID_LOWER}.nuspec" || true) + echo "NuGet status for ${PACKAGE_ID}@${VERSION}: ${STATUS}" + if [ "$STATUS" = "200" ]; then + echo "Verified ${PACKAGE_ID}@${VERSION} is available on NuGet" + exit 0 + fi + done + echo "::error title=NuGet verification failed::${PACKAGE_ID}@${VERSION} was not available from NuGet after publish." + exit 1 + - name: Create GitHub Release if: steps.version.outputs.version_committed == 'true' env: diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index b86ccf3..26d24bf 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -4,10 +4,6 @@ on: push: branches: - main - paths: - - 'rust/**' - - 'rust/scripts/**' - - '.github/workflows/rust.yml' pull_request: types: [opened, synchronize, reopened] paths: @@ -54,7 +50,7 @@ jobs: any-code-changed: ${{ steps.changes.outputs.any-code-changed }} rust-code-changed: ${{ steps.changes.outputs.rust-code-changed }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: fetch-depth: 0 @@ -79,7 +75,7 @@ jobs: needs: [detect-changes] if: github.event_name == 'pull_request' && needs.detect-changes.outputs.rust-code-changed == 'true' steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: fetch-depth: 0 @@ -111,7 +107,7 @@ jobs: needs.detect-changes.outputs.workflow-changed == 'true' ) steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: Setup Rust uses: dtolnay/rust-toolchain@stable @@ -122,7 +118,7 @@ jobs: run: cargo install rust-script - name: Cache cargo registry - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: | ~/.cargo/registry @@ -152,13 +148,13 @@ jobs: matrix: os: [ubuntu-latest, macos-latest, windows-latest] steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: Setup Rust uses: dtolnay/rust-toolchain@stable - name: Cache cargo registry - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: | ~/.cargo/registry @@ -181,13 +177,13 @@ jobs: needs: [lint, test] if: always() && !cancelled() && needs.lint.result == 'success' && needs.test.result == 'success' steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: Setup Rust uses: dtolnay/rust-toolchain@stable - name: Cache cargo registry - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: | ~/.cargo/registry @@ -212,7 +208,7 @@ jobs: permissions: contents: write steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: fetch-depth: 0 token: ${{ secrets.GITHUB_TOKEN }} @@ -305,7 +301,7 @@ jobs: permissions: contents: write steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: fetch-depth: 0 token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/wasm.yml b/.github/workflows/wasm.yml index 30276b6..663685b 100644 --- a/.github/workflows/wasm.yml +++ b/.github/workflows/wasm.yml @@ -32,7 +32,7 @@ jobs: timeout-minutes: 30 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: Setup Rust uses: dtolnay/rust-toolchain@stable @@ -43,14 +43,14 @@ jobs: run: cargo install wasm-pack --version 0.14.0 --locked - name: Setup Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version: '20.x' cache: npm cache-dependency-path: js/package-lock.json - name: Cache cargo registry - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: | ~/.cargo/registry @@ -77,7 +77,7 @@ jobs: run: npm run build - name: Upload built app - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: link-cli-web path: dist/ @@ -92,7 +92,7 @@ jobs: timeout-minutes: 30 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: Setup Rust uses: dtolnay/rust-toolchain@stable @@ -103,14 +103,14 @@ jobs: run: cargo install wasm-pack --version 0.14.0 --locked - name: Setup Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version: '20.x' cache: npm cache-dependency-path: js/package-lock.json - name: Cache cargo registry - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: | ~/.cargo/registry @@ -127,14 +127,14 @@ jobs: run: npm ci - name: Configure Pages - uses: actions/configure-pages@v5 + uses: actions/configure-pages@v6 - name: Build GitHub Pages app working-directory: js run: npm run build:pages - name: Upload Pages artifact - uses: actions/upload-pages-artifact@v4 + uses: actions/upload-pages-artifact@v5 with: path: dist/ @@ -157,4 +157,4 @@ jobs: steps: - name: Deploy Pages artifact id: deployment - uses: actions/deploy-pages@v4 + uses: actions/deploy-pages@v5 diff --git a/.gitkeep b/.gitkeep deleted file mode 100644 index 471ab09..0000000 --- a/.gitkeep +++ /dev/null @@ -1,2 +0,0 @@ -# .gitkeep file auto-generated at 2026-05-12T09:35:32.242Z for PR creation at branch issue-75-2384a28fe185 for issue https://github.com/link-foundation/link-cli/issues/75 -# Updated: 2026-05-12T18:10:01.784Z \ No newline at end of file diff --git a/csharp/scripts/release-scripts.test.mjs b/csharp/scripts/release-scripts.test.mjs index 34538ad..6631d74 100644 --- a/csharp/scripts/release-scripts.test.mjs +++ b/csharp/scripts/release-scripts.test.mjs @@ -21,6 +21,13 @@ function runNode(script, args, options = {}) { }); } +function runGit(args, cwd) { + return execFileSync('git', args, { + cwd, + encoding: 'utf8', + }); +} + test('merge-changesets honors the requested directory and package name', () => { const dir = mkdtempSync(join(tmpdir(), 'link-cli-changesets-')); const changesetDir = join(dir, 'csharp', '.changeset'); @@ -111,3 +118,51 @@ test('create-github-release dry run reports matching assets without uploading', assert.equal(payload.tag_name, 'csharp-v2.4.0'); }); + +test('version-and-commit creates a C# release commit when the next tag is missing', () => { + const dir = mkdtempSync(join(tmpdir(), 'link-cli-csharp-version-')); + const remote = join(dir, 'remote.git'); + const work = join(dir, 'work'); + const outputFile = join(dir, 'github-output.txt'); + + mkdirSync(work, { recursive: true }); + runGit(['init', '--bare', '--initial-branch=main', remote], dir); + runGit(['init', '-b', 'main'], work); + runGit(['config', 'user.name', 'Test User'], work); + runGit(['config', 'user.email', 'test@example.com'], work); + + const projectDir = join(work, 'csharp', 'Foundation.Data.Doublets.Cli'); + const changesetDir = join(work, 'csharp', '.changeset'); + mkdirSync(projectDir, { recursive: true }); + mkdirSync(changesetDir, { recursive: true }); + writeFileSync( + join(projectDir, 'Foundation.Data.Doublets.Cli.csproj'), + '2.3.0\n' + ); + writeFileSync( + join(changesetDir, 'release.md'), + "---\n'Foundation.Data.Doublets.Cli': minor\n---\n\nFix release automation.\n" + ); + + runGit(['add', '.'], work); + runGit(['commit', '-m', 'initial'], work); + runGit(['remote', 'add', 'origin', remote], work); + runGit(['push', '-u', 'origin', 'main'], work); + + runNode('csharp/scripts/version-and-commit.mjs', ['--mode', 'changeset'], { + cwd: work, + env: { GITHUB_OUTPUT: outputFile }, + }); + + const csproj = readFileSync( + join(projectDir, 'Foundation.Data.Doublets.Cli.csproj'), + 'utf8' + ); + const outputs = readFileSync(outputFile, 'utf8'); + + assert.match(csproj, /2\.4\.0<\/Version>/); + assert.match(outputs, /^version_committed=true$/m); + assert.match(outputs, /^new_version=2\.4\.0$/m); + assert.match(runGit(['rev-parse', '--verify', 'csharp-v2.4.0'], work), /[a-f0-9]{40}/); + assert.match(runGit(['ls-remote', '--tags', 'origin', 'csharp-v2.4.0'], work), /csharp-v2\.4\.0/); +}); diff --git a/csharp/scripts/version-and-commit.mjs b/csharp/scripts/version-and-commit.mjs index 3aaee35..10a8f8b 100644 --- a/csharp/scripts/version-and-commit.mjs +++ b/csharp/scripts/version-and-commit.mjs @@ -52,12 +52,7 @@ const description = getArg('description') || ''; * @returns {string} */ function exec(command, silent = false) { - try { - return execSync(command, { encoding: 'utf-8', stdio: silent ? 'pipe' : 'inherit' }); - } catch (error) { - if (silent) return ''; - throw error; - } + return execSync(command, { encoding: 'utf-8', stdio: silent ? 'pipe' : 'inherit' }); } /** @@ -135,7 +130,7 @@ function updateCsproj(newVersion) { */ function checkTagExists(version) { try { - exec(`git rev-parse csharp-v${version}`, true); + exec(`git rev-parse --verify --quiet refs/tags/csharp-v${version}`, true); return true; } catch { return false; diff --git a/docs/case-studies/issue-82/README.md b/docs/case-studies/issue-82/README.md new file mode 100644 index 0000000..7c5b90f --- /dev/null +++ b/docs/case-studies/issue-82/README.md @@ -0,0 +1,109 @@ +# Issue 82 Case Study: C# and Rust Releases Did Not Happen + +Issue: https://github.com/link-foundation/link-cli/issues/82 + +Prepared PR: https://github.com/link-foundation/link-cli/pull/83 + +## Requirements + +- Investigate why commit `d47e551d2d66c7bfe93f9a869ce9fab36347e317` did not trigger Rust CI/CD. +- Investigate why the C# workflow skipped the version bump and release. +- Download issue details, comments, run metadata, and logs into `docs/case-studies/issue-82`. +- Compare this repository against the JavaScript, Rust, and C# pipeline templates. +- Use relevant template best practices in the fix. +- Search for online facts that explain the observed behavior. +- Report issues to related template repositories when the same defect exists there. +- Add regression coverage and implement the fix in one pull request. + +## Timeline + +- 2026-05-12T16:57:31Z: merge commit `d47e551d2d66c7bfe93f9a869ce9fab36347e317` landed on `main`. +- 2026-05-12T16:57:36Z: GitHub Actions created two runs for that SHA: `C# CI/CD Pipeline` run `25749404027` and `WebAssembly CI` run `25749403949`. `runs-for-d47e551.json` contains no Rust workflow run for this SHA. +- 2026-05-12T17:00:52Z: the C# release job found 12 changesets, merged them to one minor changeset, then ran `version-and-commit.mjs`. +- 2026-05-12T17:00:52Z: the C# version script printed `Tag csharp-v2.4.0 already exists`, set `already_released=true`, and exited without a bump, commit, tag, package publish, or GitHub release. +- 2026-05-12T17:01:42Z: WebAssembly Pages deployment succeeded at `https://link-foundation.github.io/link-cli/`. + +## Evidence + +- Issue and PR data: `issue-82.json`, `issue-82-comments.json`, `pr-83*.json`. +- CI run lists: `recent-runs.json`, `runs-for-d47e551.json`. +- Downloaded logs: `run-25749404027-csharp.log`, `run-25749403949-wasm.log`. +- Commit diff evidence: `d47e551-changed-files.txt`, `d47e551-diff-stat.txt`. +- Release state: `recent-releases.txt`. +- Template snapshots: `evidence/templates/{js,rust,csharp}`. +- Regression and validation logs: `test-logs/regression-before-fix.log`, `test-logs/regression-after-action-updates.log`, `test-logs/npm-test-js.log`, `test-logs/dotnet-test.log`, `test-logs/cargo-test.log`, `test-logs/cargo-clippy.log`, `test-logs/npm-build-after-ci.log`. +- Verified action tags: `verified-action-tags.txt`. + +Important log anchors: + +- `run-25749404027-csharp.log:5763` shows 12 C# changesets. +- `run-25749404027-csharp.log:5793` to `5798` shows the merge selected a minor bump. +- `run-25749404027-csharp.log:5855` to `5860` shows the false `already_released=true` result. +- `run-25749403949-wasm.log:1984` to `1988` shows Pages deployment succeeded. + +## Online Facts + +GitHub's workflow trigger documentation states that when `branches` and `paths` filters are both configured, both filters must match for a workflow to run. It also states that path filters are evaluated against changed files. Source: https://docs.github.com/en/actions/how-tos/write-workflows/choose-when-workflows-run/trigger-a-workflow + +The downloaded GitHub Actions logs also reported Node 20 action deprecation warnings and pointed to GitHub's September 2025 changelog. The local fix updates official action major versions that were already used by the templates or verified by tag lookup. + +## Template Comparison + +The JavaScript, Rust, and C# release templates do not use `push.paths` filters for the main release workflow. They schedule release workflows on every push to `main`, then use internal change detection and release-needed scripts to decide what work to perform. + +The local Rust and C# workflows did use `push.paths`. That is the direct reason Rust did not run for `d47e551`: the merge commit changed C# workflow/script files, WebAssembly workflow files, JavaScript tests, and documentation, but no `rust/**` file. The Rust workflow never reached its own release-needed logic. + +The C# template has the same silent-command defect in `scripts/version-and-commit.mjs`: its `exec(command, true)` wrapper swallows failures, while `checkTagExists()` expects a thrown error for a missing tag. This was reported upstream as https://github.com/link-foundation/csharp-ai-driven-development-pipeline-template/issues/9. + +The C# template also verifies NuGet package availability through the NuGet flat-container API after publish. The local C# workflow now does the same before creating the GitHub release. + +The JavaScript and Rust templates use newer official action majors for Node 24 compatibility. Local workflows were updated from the deprecated action majors where verified tags exist. + +## Root Causes + +1. Rust release workflow was blocked by a main-push path filter. + + The workflow was configured with `push.branches: main` and `push.paths` limited to Rust files. Because `d47e551` did not change a Rust path, GitHub did not schedule Rust CI/CD at all. + +2. C# tag detection always treated missing tags as existing. + + `version-and-commit.mjs` used a silent `exec()` helper that returned an empty string on command failure. `checkTagExists()` wrapped `git rev-parse csharp-v2.4.0` in `try/catch`, but no exception was thrown when the tag was missing. The script exited with `already_released=true`. + +3. C# release verification was too weak. + + The workflow published to NuGet and then immediately created the GitHub release without checking that the package had become available. Template comparison showed an existing NuGet flat-container verification pattern. + +4. CI workflow actions were approaching a platform break. + + Downloaded logs warned that several `@v4` official JavaScript actions used Node 20, which GitHub will force off the runner path in 2026. The templates already had newer action majors for the JavaScript and Rust workflows. + +## Implemented Solution + +- Removed `push.paths` filters from `.github/workflows/csharp.yml` and `.github/workflows/rust.yml` so release workflows are scheduled on every push to `main`. +- Kept pull request path filters for the monorepo workflows to avoid unrelated PR noise; release safety is now handled by the main-push schedule plus internal checks. +- Fixed `csharp/scripts/version-and-commit.mjs` so silent commands still throw on failure. +- Changed C# tag detection to verify the exact tag ref with `git rev-parse --verify --quiet refs/tags/csharp-vX.Y.Z`. +- Added a C# regression test that creates a temporary git repository, runs `version-and-commit.mjs`, and asserts the version commit and `csharp-v2.4.0` tag are created when the tag is missing. +- Added repository-layout regression coverage that ensures C# and Rust release workflows are not path-filtered on pushes to `main`. +- Added NuGet package availability verification to C# automatic and manual release jobs. +- Updated local workflow action majors to avoid the logged Node 20 deprecation path. +- Removed the root `.gitkeep` artifact because the existing repository-layout test explicitly requires generated evidence and package artifacts to stay out of the repository root. + +## Validation + +- Focused before-fix regression: `test-logs/regression-before-fix.log` captured the C# false already-released bug and the C# push path-filter regression. +- Focused after-fix regression: `test-logs/regression-after-action-updates.log` passes all focused tests. +- `npm --prefix js run test:js` passed 12 Node tests. +- `dotnet test csharp/Foundation.Data.Doublets.Cli.sln --configuration Release` passed 187 .NET tests. +- `cargo test --manifest-path rust/Cargo.toml --all-features` passed the Rust test suite and doc tests. +- `cargo fmt --manifest-path rust/Cargo.toml --all -- --check` passed. +- `cargo clippy --manifest-path rust/Cargo.toml --all-targets --all-features` passed. +- `git diff --check` passed. +- `npm --prefix js ci` installed local JavaScript dependencies with 0 vulnerabilities. +- `npm --prefix js run build` passed after `npm ci`, covering the WebAssembly package build and Vite production build. + +## Remaining Watch Items + +- After PR 83 merges, the next push to `main` should schedule Rust and C# CI/CD even if the merge contains only documentation or workflow changes. +- The C# release should bump from `2.3.0` to `2.4.0`, create tag `csharp-v2.4.0`, publish package `clink` to NuGet when `NUGET_API_KEY` is available, verify NuGet availability, and create the GitHub release. +- The Rust workflow should reach its existing `check-release-needed.rs` logic and decide whether to release based on the pending Rust changelog fragments and external release state. diff --git a/docs/case-studies/issue-82/evidence/d47e551-changed-files.txt b/docs/case-studies/issue-82/evidence/d47e551-changed-files.txt new file mode 100644 index 0000000..ceb6640 --- /dev/null +++ b/docs/case-studies/issue-82/evidence/d47e551-changed-files.txt @@ -0,0 +1,11 @@ +M .github/workflows/csharp.yml +M .github/workflows/wasm.yml +M csharp/scripts/create-github-release.mjs +M csharp/scripts/release-scripts.test.mjs +M docs/case-studies/issue-79/README.md +A docs/case-studies/issue-79/evidence/issue-79-comments-followup.json +A docs/case-studies/issue-79/evidence/run-25747032579-jobs.json +A docs/case-studies/issue-79/evidence/run-25747032579.json +A docs/case-studies/issue-79/evidence/upstream-csharp-template-issue-7.json +A docs/case-studies/issue-79/evidence/wasm-25747032579.log +M js/test/repositoryLayout.test.mjs diff --git a/docs/case-studies/issue-82/evidence/d47e551-diff-stat.txt b/docs/case-studies/issue-82/evidence/d47e551-diff-stat.txt new file mode 100644 index 0000000..5edb8b0 --- /dev/null +++ b/docs/case-studies/issue-82/evidence/d47e551-diff-stat.txt @@ -0,0 +1,12 @@ + .github/workflows/csharp.yml | 6 +- + .github/workflows/wasm.yml | 64 +- + csharp/scripts/create-github-release.mjs | 76 +- + csharp/scripts/release-scripts.test.mjs | 31 + + docs/case-studies/issue-79/README.md | 83 ++ + .../evidence/issue-79-comments-followup.json | 1 + + .../issue-79/evidence/run-25747032579-jobs.json | 1 + + .../issue-79/evidence/run-25747032579.json | 1 + + .../evidence/upstream-csharp-template-issue-7.json | 1 + + .../issue-79/evidence/wasm-25747032579.log | 1087 ++++++++++++++++++++ + js/test/repositoryLayout.test.mjs | 26 + + 11 files changed, 1335 insertions(+), 42 deletions(-) diff --git a/docs/case-studies/issue-82/evidence/issue-82-comments.json b/docs/case-studies/issue-82/evidence/issue-82-comments.json new file mode 100644 index 0000000..0637a08 --- /dev/null +++ b/docs/case-studies/issue-82/evidence/issue-82-comments.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/docs/case-studies/issue-82/evidence/issue-82.json b/docs/case-studies/issue-82/evidence/issue-82.json new file mode 100644 index 0000000..74961eb --- /dev/null +++ b/docs/case-studies/issue-82/evidence/issue-82.json @@ -0,0 +1 @@ +{"author":{"id":"MDQ6VXNlcjE0MzE5MDQ=","is_bot":false,"login":"konard","name":"Konstantin Diachenko"},"body":"No Rust CI/CD was triggered on https://github.com/link-foundation/link-cli/commit/d47e551d2d66c7bfe93f9a869ce9fab36347e317\nC# failed with skipping version bump and release.\n\nUse all the best practices from CI/CD templates (check full file tree to compare for all GitHub workflow and CI/CD scripts file), if the same issue is found in template report issue also in templates:\n- https://github.com/link-foundation/js-ai-driven-development-pipeline-template\n- https://github.com/link-foundation/rust-ai-driven-development-pipeline-template\n- https://github.com/link-foundation/csharp-ai-driven-development-pipeline-template\n\nWe should compare all files, so we don't have more CI/CD errors in the future and reuse all the best practices from these templates.\n\nWe need to download all logs and data related about the issue to this repository, make sure we compile that data to `./docs/case-studies/issue-{id}` folder, and use it to do deep case study analysis (also make sure to search online for additional facts and data), in which we will reconstruct timeline/sequence of events, list of each and all requirements from the issue, find root causes of the each problem, and propose possible solutions and solution plans for each requirement (we should also check known existing components/libraries, that solve similar problem or can help in solutions).\n\nIf there is not enough data to find actual root cause, add debug output and verbose mode if not present, that will allow us to find root cause on next iteration.\n\nIf issue related to any other repository/project, where we can report issues on GitHub, please do so. Each issue must contain reproducible examples, workarounds and suggestions for fix the issue in code.\n\nPlease plan and execute everything in a single pull request, you have unlimited time and context, as context auto-compacts and you can continue indefinitely, until it is each and every requirement fully addressed, and everything is totally done.","createdAt":"2026-05-12T17:24:05Z","labels":[{"id":"LA_kwDONXCAbs8AAAAB0ixENw","name":"bug","description":"Something isn't working","color":"d73a4a"}],"number":82,"state":"OPEN","title":"C# and Rust version bumps and releases didn't happen","updatedAt":"2026-05-12T17:24:05Z","url":"https://github.com/link-foundation/link-cli/issues/82"} diff --git a/docs/case-studies/issue-82/evidence/link-cli-cicd-file-tree-after.txt b/docs/case-studies/issue-82/evidence/link-cli-cicd-file-tree-after.txt new file mode 100644 index 0000000..0617693 --- /dev/null +++ b/docs/case-studies/issue-82/evidence/link-cli-cicd-file-tree-after.txt @@ -0,0 +1,72 @@ +.github/workflows/csharp.yml +.github/workflows/rust.yml +.github/workflows/wasm.yml +csharp/scripts/bump-version.mjs +csharp/scripts/check-file-size.mjs +csharp/scripts/create-github-release.mjs +csharp/scripts/detect-code-changes.mjs +csharp/scripts/merge-changesets.mjs +csharp/scripts/release-scripts.test.mjs +csharp/scripts/validate-changeset.mjs +csharp/scripts/version-and-commit.mjs +docs/case-studies/issue-82/README.md +docs/case-studies/issue-82/evidence/d47e551-changed-files.txt +docs/case-studies/issue-82/evidence/d47e551-diff-stat.txt +docs/case-studies/issue-82/evidence/issue-82-comments.json +docs/case-studies/issue-82/evidence/issue-82.json +docs/case-studies/issue-82/evidence/link-cli-cicd-file-tree-after.txt +docs/case-studies/issue-82/evidence/link-cli-cicd-file-tree-before.txt +docs/case-studies/issue-82/evidence/pr-83-conversation-comments.json +docs/case-studies/issue-82/evidence/pr-83-review-comments.json +docs/case-studies/issue-82/evidence/pr-83-reviews.json +docs/case-studies/issue-82/evidence/pr-83.json +docs/case-studies/issue-82/evidence/recent-releases.txt +docs/case-studies/issue-82/evidence/recent-runs.json +docs/case-studies/issue-82/evidence/run-25749403949-wasm.json +docs/case-studies/issue-82/evidence/run-25749403949-wasm.log +docs/case-studies/issue-82/evidence/run-25749404027-csharp.json +docs/case-studies/issue-82/evidence/run-25749404027-csharp.log +docs/case-studies/issue-82/evidence/runs-for-d47e551.json +docs/case-studies/issue-82/evidence/template-csharp-file-tree.json +docs/case-studies/issue-82/evidence/template-csharp-workflows.json +docs/case-studies/issue-82/evidence/template-js-file-tree.json +docs/case-studies/issue-82/evidence/template-js-workflows.json +docs/case-studies/issue-82/evidence/template-rust-file-tree.json +docs/case-studies/issue-82/evidence/template-rust-workflows.json +docs/case-studies/issue-82/evidence/templates/csharp/release.yml +docs/case-studies/issue-82/evidence/templates/js/example-app.yml +docs/case-studies/issue-82/evidence/templates/js/links.yml +docs/case-studies/issue-82/evidence/templates/js/release.yml +docs/case-studies/issue-82/evidence/templates/rust/release.yml +docs/case-studies/issue-82/evidence/test-logs/cargo-clippy.log +docs/case-studies/issue-82/evidence/test-logs/cargo-fmt-check.log +docs/case-studies/issue-82/evidence/test-logs/cargo-test.log +docs/case-studies/issue-82/evidence/test-logs/dotnet-test.log +docs/case-studies/issue-82/evidence/test-logs/git-diff-check.log +docs/case-studies/issue-82/evidence/test-logs/npm-build-after-ci.log +docs/case-studies/issue-82/evidence/test-logs/npm-ci.log +docs/case-studies/issue-82/evidence/test-logs/npm-test-js.log +docs/case-studies/issue-82/evidence/test-logs/regression-after-action-updates.log +docs/case-studies/issue-82/evidence/test-logs/regression-after-fix.log +docs/case-studies/issue-82/evidence/test-logs/regression-before-fix.log +docs/case-studies/issue-82/evidence/upstream-csharp-template-issue-9.json +docs/case-studies/issue-82/evidence/upstream-csharp-template-issue-body.md +docs/case-studies/issue-82/evidence/verified-action-tags.txt +js/test/linkGraph.test.mjs +js/test/repositoryLayout.test.mjs +rust/scripts/bump-version.rs +rust/scripts/check-changelog-fragment.rs +rust/scripts/check-file-size.rs +rust/scripts/check-release-needed.rs +rust/scripts/check-version-modification.rs +rust/scripts/collect-changelog.rs +rust/scripts/create-changelog-fragment.rs +rust/scripts/create-github-release.rs +rust/scripts/detect-code-changes.rs +rust/scripts/get-bump-type.rs +rust/scripts/get-version.rs +rust/scripts/git-config.rs +rust/scripts/publish-crate.rs +rust/scripts/rust-paths.rs +rust/scripts/version-and-commit.rs +rust/scripts/wait-for-crate.rs diff --git a/docs/case-studies/issue-82/evidence/link-cli-cicd-file-tree-before.txt b/docs/case-studies/issue-82/evidence/link-cli-cicd-file-tree-before.txt new file mode 100644 index 0000000..da84992 --- /dev/null +++ b/docs/case-studies/issue-82/evidence/link-cli-cicd-file-tree-before.txt @@ -0,0 +1,163 @@ +.github/workflows/csharp.yml +.github/workflows/rust.yml +.github/workflows/wasm.yml +csharp/.changeset/README.md +csharp/.changeset/add-export-alias.md +csharp/.changeset/add-lino-input-import.md +csharp/.changeset/add-lino-output-export.md +csharp/.changeset/add-named-types-decorator.md +csharp/.changeset/add-persistent-transformation-triggers.md +csharp/.changeset/add-pinned-types-decorator.md +csharp/.changeset/config.json +csharp/.changeset/fix-issue-20-substitution.md +csharp/.changeset/fix-issue-62-review-coverage.md +csharp/.changeset/split-csharp-scripts.md +csharp/.changeset/support-string-id-aliases.md +csharp/.changeset/update-links-notation-dependency.md +csharp/.changeset/validate-missing-references.md +csharp/Foundation.Data.Doublets.Cli.Tests/AdvancedMixedQueryProcessor.cs +csharp/Foundation.Data.Doublets.Cli.Tests/BasicQueryProcessor.cs +csharp/Foundation.Data.Doublets.Cli.Tests/ChangesSimplifier.cs +csharp/Foundation.Data.Doublets.Cli.Tests/CliExportIntegrationTests.cs +csharp/Foundation.Data.Doublets.Cli.Tests/Foundation.Data.Doublets.Cli.Tests.csproj +csharp/Foundation.Data.Doublets.Cli.Tests/Issue62ReviewCoverageTests.cs +csharp/Foundation.Data.Doublets.Cli.Tests/LinoDatabaseInputTests.cs +csharp/Foundation.Data.Doublets.Cli.Tests/LinoDatabaseOutputTests.cs +csharp/Foundation.Data.Doublets.Cli.Tests/MixedQueryProcessor.cs +csharp/Foundation.Data.Doublets.Cli.Tests/NamedLinksDecoratorTests.cs +csharp/Foundation.Data.Doublets.Cli.Tests/NamedTypesDecoratorTests.cs +csharp/Foundation.Data.Doublets.Cli.Tests/PersistentTransformationDecoratorTests.cs +csharp/Foundation.Data.Doublets.Cli.Tests/PinnedTypesDecoratorTests.cs +csharp/Foundation.Data.Doublets.Cli.Tests/PinnedTypesTests.cs +csharp/Foundation.Data.Doublets.Cli.Tests/SimpleLinksDecoratorTests.cs +csharp/Foundation.Data.Doublets.Cli.Tests/UnicodeStringStorageTests.cs +csharp/Foundation.Data.Doublets.Cli.sln +csharp/Foundation.Data.Doublets.Cli/AdvancedMixedQueryProcessor.cs +csharp/Foundation.Data.Doublets.Cli/BasicQueryProcessor.cs +csharp/Foundation.Data.Doublets.Cli/ChangesSimplifier.cs +csharp/Foundation.Data.Doublets.Cli/EnumerableExtensions.cs +csharp/Foundation.Data.Doublets.Cli/Exceptions.cs +csharp/Foundation.Data.Doublets.Cli/Foundation.Data.Doublets.Cli.csproj +csharp/Foundation.Data.Doublets.Cli/INamedTypes.cs +csharp/Foundation.Data.Doublets.Cli/LinksExtensions.cs +csharp/Foundation.Data.Doublets.Cli/LinoDatabaseInput.cs +csharp/Foundation.Data.Doublets.Cli/LinoDatabaseOutput.cs +csharp/Foundation.Data.Doublets.Cli/MixedQueryProcessor.cs +csharp/Foundation.Data.Doublets.Cli/NamedLinks.cs +csharp/Foundation.Data.Doublets.Cli/NamedLinksDecorator.cs +csharp/Foundation.Data.Doublets.Cli/NamedTypesDecorator.cs +csharp/Foundation.Data.Doublets.Cli/PersistentTransformationDecorator.cs +csharp/Foundation.Data.Doublets.Cli/PinnedTypes.cs +csharp/Foundation.Data.Doublets.Cli/PinnedTypesDecorator.cs +csharp/Foundation.Data.Doublets.Cli/Program.cs +csharp/Foundation.Data.Doublets.Cli/QueryConstants.cs +csharp/Foundation.Data.Doublets.Cli/SimpleLinksDecorator.cs +csharp/Foundation.Data.Doublets.Cli/UnicodeStringStorage.cs +csharp/README.md +csharp/scripts/bump-version.mjs +csharp/scripts/check-file-size.mjs +csharp/scripts/create-github-release.mjs +csharp/scripts/detect-code-changes.mjs +csharp/scripts/merge-changesets.mjs +csharp/scripts/release-scripts.test.mjs +csharp/scripts/validate-changeset.mjs +csharp/scripts/version-and-commit.mjs +js/README.md +js/favicon.svg +js/index.html +js/package-lock.json +js/package.json +js/src/App.jsx +js/src/linkGraph.js +js/src/main.jsx +js/src/styles.css +js/test/linkGraph.test.mjs +js/test/repositoryLayout.test.mjs +js/vite.config.js +rust/Cargo.lock +rust/Cargo.toml +rust/README.md +rust/changelog.d/20260430_041900_rust_query_parity.md +rust/changelog.d/20260430_063000_lino_output_export.md +rust/changelog.d/20260430_070900_named_types_decorator.md +rust/changelog.d/20260430_072128_validate_missing_references.md +rust/changelog.d/20260430_073500_pinned_types_decorator.md +rust/changelog.d/20260430_105500_named_type_query_cli.md +rust/changelog.d/20260502_061000_export_alias.md +rust/changelog.d/20260508_104000_lino_input_import.md +rust/changelog.d/20260508_105800_issue_20_substitution.md +rust/changelog.d/20260509_053805_issue_62_review_coverage.md +rust/changelog.d/20260512_000000_issue_77_layout.md +rust/changelog.d/README.md +rust/scripts/bump-version.rs +rust/scripts/check-changelog-fragment.rs +rust/scripts/check-file-size.rs +rust/scripts/check-release-needed.rs +rust/scripts/check-version-modification.rs +rust/scripts/collect-changelog.rs +rust/scripts/create-changelog-fragment.rs +rust/scripts/create-github-release.rs +rust/scripts/detect-code-changes.rs +rust/scripts/get-bump-type.rs +rust/scripts/get-version.rs +rust/scripts/git-config.rs +rust/scripts/publish-crate.rs +rust/scripts/rust-paths.rs +rust/scripts/version-and-commit.rs +rust/scripts/wait-for-crate.rs +rust/src/changes_simplifier.rs +rust/src/cli.rs +rust/src/error.rs +rust/src/hybrid_reference.rs +rust/src/lib.rs +rust/src/link.rs +rust/src/link_reference_validator.rs +rust/src/link_storage.rs +rust/src/lino_database_input.rs +rust/src/lino_link.rs +rust/src/main.rs +rust/src/named_links.rs +rust/src/named_type_links.rs +rust/src/named_types.rs +rust/src/parser.rs +rust/src/pinned_types.rs +rust/src/query_options.rs +rust/src/query_processor.rs +rust/src/query_processor_substitution.rs +rust/src/query_types.rs +rust/src/sequences/address_to_raw_number_converter.rs +rust/src/sequences/balanced_variant_converter.rs +rust/src/sequences/caching_converter_decorator.rs +rust/src/sequences/char_to_unicode_symbol_converter.rs +rust/src/sequences/default_stack.rs +rust/src/sequences/mod.rs +rust/src/sequences/raw_number_to_address_converter.rs +rust/src/sequences/right_sequence_walker.rs +rust/src/sequences/string_to_unicode_sequence_converter.rs +rust/src/sequences/target_matcher.rs +rust/src/sequences/unicode_sequence_to_string_converter.rs +rust/src/sequences/unicode_symbol_to_char_converter.rs +rust/src/unicode_string_storage.rs +rust/tests/changes_simplifier_tests.rs +rust/tests/cli_arguments_tests.rs +rust/tests/cli_export_tests.rs +rust/tests/cli_import_tests.rs +rust/tests/cli_named_types_tests.rs +rust/tests/dependency_basis_tests.rs +rust/tests/issue62_review_coverage_tests.rs +rust/tests/link_storage_tests.rs +rust/tests/link_tests.rs +rust/tests/lino_database_input_tests.rs +rust/tests/lino_link_tests.rs +rust/tests/named_types_decorator_tests.rs +rust/tests/parser_tests.rs +rust/tests/pinned_types_decorator_tests.rs +rust/tests/query_processor_csharp_parity_tests.rs +rust/tests/query_processor_tests.rs +rust/tests/unicode_sequence_converter_tests.rs +rust/tests/unicode_string_storage_tests.rs +rust/wasm/Cargo.lock +rust/wasm/Cargo.toml +rust/wasm/src/lib.rs +rust/wasm/tests/dependabot_alert_tests.rs +rust/wasm/tests/web.rs diff --git a/docs/case-studies/issue-82/evidence/pr-83-conversation-comments.json b/docs/case-studies/issue-82/evidence/pr-83-conversation-comments.json new file mode 100644 index 0000000..0637a08 --- /dev/null +++ b/docs/case-studies/issue-82/evidence/pr-83-conversation-comments.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/docs/case-studies/issue-82/evidence/pr-83-review-comments.json b/docs/case-studies/issue-82/evidence/pr-83-review-comments.json new file mode 100644 index 0000000..0637a08 --- /dev/null +++ b/docs/case-studies/issue-82/evidence/pr-83-review-comments.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/docs/case-studies/issue-82/evidence/pr-83-reviews.json b/docs/case-studies/issue-82/evidence/pr-83-reviews.json new file mode 100644 index 0000000..0637a08 --- /dev/null +++ b/docs/case-studies/issue-82/evidence/pr-83-reviews.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/docs/case-studies/issue-82/evidence/pr-83.json b/docs/case-studies/issue-82/evidence/pr-83.json new file mode 100644 index 0000000..573a2a6 --- /dev/null +++ b/docs/case-studies/issue-82/evidence/pr-83.json @@ -0,0 +1 @@ +{"author":{"id":"MDQ6VXNlcjE0MzE5MDQ=","is_bot":false,"login":"konard","name":"Konstantin Diachenko"},"baseRefName":"main","body":"## 🤖 AI-Powered Solution Draft\n\nThis pull request is being automatically generated to solve issue #82.\n\n### 📋 Issue Reference\nFixes #82\n\n### 🚧 Status\n**Work in Progress** - The AI assistant is currently analyzing and implementing the solution draft.\n\n### 📝 Implementation Details\n_Details will be added as the solution draft is developed..._\n\n---\n*This PR was created automatically by the AI issue solver*","createdAt":"2026-05-12T18:10:11Z","headRefName":"issue-82-7aea04680cb2","isDraft":true,"number":83,"state":"OPEN","title":"[WIP] C# and Rust version bumps and releases didn't happen","updatedAt":"2026-05-12T18:10:14Z","url":"https://github.com/link-foundation/link-cli/pull/83"} diff --git a/docs/case-studies/issue-82/evidence/recent-releases.txt b/docs/case-studies/issue-82/evidence/recent-releases.txt new file mode 100644 index 0000000..0389937 --- /dev/null +++ b/docs/case-studies/issue-82/evidence/recent-releases.txt @@ -0,0 +1,12 @@ +[Rust] 0.2.0 Latest rust-v0.2.0 2026-05-12T12:50:29Z +Rust v0.1.0 rust-v0.1.0 2026-05-12T10:27:08Z +v2.4.0 v2.4.0 2026-05-12T09:50:13Z +v2.2.2 v2.2.2 2025-06-13T00:37:16Z +v2.1.3 v2.1.3 2025-05-16T00:08:20Z +v2.1.2 v2.1.2 2025-04-06T16:54:17Z +v1.8.0 v1.8.0 2024-12-21T17:19:35Z +v1.7.0 v1.7.0 2024-12-21T00:21:48Z +v1.6.0 v1.6.0 2024-12-15T18:11:46Z +v1.4.0 v1.4.0 2024-12-15T01:50:52Z +v1.2.3 v1.2.3 2024-12-07T18:55:36Z +1.0.1 1.0.1 2024-12-05T07:54:30Z diff --git a/docs/case-studies/issue-82/evidence/recent-runs.json b/docs/case-studies/issue-82/evidence/recent-runs.json new file mode 100644 index 0000000..de57cd2 --- /dev/null +++ b/docs/case-studies/issue-82/evidence/recent-runs.json @@ -0,0 +1 @@ +[{"conclusion":"success","createdAt":"2026-05-12T16:57:36Z","databaseId":25749404027,"event":"push","headBranch":"main","headSha":"d47e551d2d66c7bfe93f9a869ce9fab36347e317","name":"C# CI/CD Pipeline","status":"completed","url":"https://github.com/link-foundation/link-cli/actions/runs/25749404027","workflowName":"C# CI/CD Pipeline"},{"conclusion":"success","createdAt":"2026-05-12T16:57:36Z","databaseId":25749403949,"event":"push","headBranch":"main","headSha":"d47e551d2d66c7bfe93f9a869ce9fab36347e317","name":"WebAssembly CI","status":"completed","url":"https://github.com/link-foundation/link-cli/actions/runs/25749403949","workflowName":"WebAssembly CI"},{"conclusion":"success","createdAt":"2026-05-12T16:38:12Z","databaseId":25748385610,"event":"pull_request","headBranch":"issue-79-c80df6f859e8","headSha":"d1e1695a86594e1ebce3da2708402c33c4c1fc86","name":"C# CI/CD Pipeline","status":"completed","url":"https://github.com/link-foundation/link-cli/actions/runs/25748385610","workflowName":"C# CI/CD Pipeline"},{"conclusion":"success","createdAt":"2026-05-12T16:38:12Z","databaseId":25748385607,"event":"pull_request","headBranch":"issue-79-c80df6f859e8","headSha":"d1e1695a86594e1ebce3da2708402c33c4c1fc86","name":"WebAssembly CI","status":"completed","url":"https://github.com/link-foundation/link-cli/actions/runs/25748385607","workflowName":"WebAssembly CI"},{"conclusion":"success","createdAt":"2026-05-12T16:33:11Z","databaseId":25748128288,"event":"pull_request","headBranch":"issue-79-c80df6f859e8","headSha":"ba73e5758f9b958a9b236b3822719788e27ffc9d","name":"C# CI/CD Pipeline","status":"completed","url":"https://github.com/link-foundation/link-cli/actions/runs/25748128288","workflowName":"C# CI/CD Pipeline"},{"conclusion":"success","createdAt":"2026-05-12T16:33:11Z","databaseId":25748128172,"event":"pull_request","headBranch":"issue-79-c80df6f859e8","headSha":"ba73e5758f9b958a9b236b3822719788e27ffc9d","name":"WebAssembly CI","status":"completed","url":"https://github.com/link-foundation/link-cli/actions/runs/25748128172","workflowName":"WebAssembly CI"},{"conclusion":"success","createdAt":"2026-05-12T16:33:08Z","databaseId":25748125632,"event":"push","headBranch":"issue-79-c80df6f859e8","headSha":"ba73e5758f9b958a9b236b3822719788e27ffc9d","name":"WebAssembly CI","status":"completed","url":"https://github.com/link-foundation/link-cli/actions/runs/25748125632","workflowName":"WebAssembly CI"},{"conclusion":"success","createdAt":"2026-05-12T16:12:42Z","databaseId":25747032579,"event":"push","headBranch":"main","headSha":"9c93a27e662408102894dacb89c8ed841a151769","name":"WebAssembly CI","status":"completed","url":"https://github.com/link-foundation/link-cli/actions/runs/25747032579","workflowName":"WebAssembly CI"},{"conclusion":"success","createdAt":"2026-05-12T16:00:41Z","databaseId":25746373553,"event":"pull_request","headBranch":"issue-79-49ca4f759246","headSha":"a5beebbbd8efcc436956f041b22bde514090e6c4","name":"WebAssembly CI","status":"completed","url":"https://github.com/link-foundation/link-cli/actions/runs/25746373553","workflowName":"WebAssembly CI"},{"conclusion":"success","createdAt":"2026-05-12T15:54:32Z","databaseId":25746021853,"event":"pull_request","headBranch":"issue-79-49ca4f759246","headSha":"7c78b6bf3b559e9fc11f42eea996d1c91aff8ec1","name":"WebAssembly CI","status":"completed","url":"https://github.com/link-foundation/link-cli/actions/runs/25746021853","workflowName":"WebAssembly CI"},{"conclusion":"success","createdAt":"2026-05-12T15:54:25Z","databaseId":25746016783,"event":"push","headBranch":"issue-79-49ca4f759246","headSha":"7c78b6bf3b559e9fc11f42eea996d1c91aff8ec1","name":"WebAssembly CI","status":"completed","url":"https://github.com/link-foundation/link-cli/actions/runs/25746016783","workflowName":"WebAssembly CI"},{"conclusion":"success","createdAt":"2026-05-12T12:45:17Z","databaseId":25735265903,"event":"push","headBranch":"main","headSha":"f942d304c1965f231165d799fac258d44c25e193","name":"WebAssembly CI","status":"completed","url":"https://github.com/link-foundation/link-cli/actions/runs/25735265903","workflowName":"WebAssembly CI"},{"conclusion":"success","createdAt":"2026-05-12T12:45:17Z","databaseId":25735265881,"event":"push","headBranch":"main","headSha":"f942d304c1965f231165d799fac258d44c25e193","name":"C# CI/CD Pipeline","status":"completed","url":"https://github.com/link-foundation/link-cli/actions/runs/25735265881","workflowName":"C# CI/CD Pipeline"},{"conclusion":"success","createdAt":"2026-05-12T12:45:17Z","databaseId":25735265867,"event":"push","headBranch":"main","headSha":"f942d304c1965f231165d799fac258d44c25e193","name":"Rust CI/CD Pipeline","status":"completed","url":"https://github.com/link-foundation/link-cli/actions/runs/25735265867","workflowName":"Rust CI/CD Pipeline"},{"conclusion":"success","createdAt":"2026-05-12T12:04:08Z","databaseId":25733212055,"event":"pull_request","headBranch":"issue-77-388911d8eea6","headSha":"0ee30a81231e56129392086ace26f10d7b5327bd","name":"WebAssembly CI","status":"completed","url":"https://github.com/link-foundation/link-cli/actions/runs/25733212055","workflowName":"WebAssembly CI"},{"conclusion":"success","createdAt":"2026-05-12T12:04:08Z","databaseId":25733212049,"event":"pull_request","headBranch":"issue-77-388911d8eea6","headSha":"0ee30a81231e56129392086ace26f10d7b5327bd","name":"C# CI/CD Pipeline","status":"completed","url":"https://github.com/link-foundation/link-cli/actions/runs/25733212049","workflowName":"C# CI/CD Pipeline"},{"conclusion":"success","createdAt":"2026-05-12T12:04:08Z","databaseId":25733212048,"event":"pull_request","headBranch":"issue-77-388911d8eea6","headSha":"0ee30a81231e56129392086ace26f10d7b5327bd","name":"Rust CI/CD Pipeline","status":"completed","url":"https://github.com/link-foundation/link-cli/actions/runs/25733212048","workflowName":"Rust CI/CD Pipeline"},{"conclusion":"success","createdAt":"2026-05-12T11:57:08Z","databaseId":25732868571,"event":"pull_request","headBranch":"issue-77-388911d8eea6","headSha":"b4b0f02b2e477c9dabbfc48b4f26df90f5b6b0bb","name":"WebAssembly CI","status":"completed","url":"https://github.com/link-foundation/link-cli/actions/runs/25732868571","workflowName":"WebAssembly CI"},{"conclusion":"success","createdAt":"2026-05-12T11:57:08Z","databaseId":25732868558,"event":"pull_request","headBranch":"issue-77-388911d8eea6","headSha":"b4b0f02b2e477c9dabbfc48b4f26df90f5b6b0bb","name":"C# CI/CD Pipeline","status":"completed","url":"https://github.com/link-foundation/link-cli/actions/runs/25732868558","workflowName":"C# CI/CD Pipeline"},{"conclusion":"success","createdAt":"2026-05-12T11:57:08Z","databaseId":25732868550,"event":"pull_request","headBranch":"issue-77-388911d8eea6","headSha":"b4b0f02b2e477c9dabbfc48b4f26df90f5b6b0bb","name":"Rust CI/CD Pipeline","status":"completed","url":"https://github.com/link-foundation/link-cli/actions/runs/25732868550","workflowName":"Rust CI/CD Pipeline"},{"conclusion":"success","createdAt":"2026-05-12T11:57:05Z","databaseId":25732866428,"event":"push","headBranch":"issue-77-388911d8eea6","headSha":"b4b0f02b2e477c9dabbfc48b4f26df90f5b6b0bb","name":"WebAssembly CI","status":"completed","url":"https://github.com/link-foundation/link-cli/actions/runs/25732866428","workflowName":"WebAssembly CI"},{"conclusion":"success","createdAt":"2026-05-12T10:24:34Z","databaseId":25728494323,"event":"push","headBranch":"main","headSha":"d9309c5d34124229675900119a8da1f30b7fe042","name":"WebAssembly CI","status":"completed","url":"https://github.com/link-foundation/link-cli/actions/runs/25728494323","workflowName":"WebAssembly CI"},{"conclusion":"success","createdAt":"2026-05-12T10:24:34Z","databaseId":25728494305,"event":"push","headBranch":"main","headSha":"d9309c5d34124229675900119a8da1f30b7fe042","name":"Rust CI/CD Pipeline","status":"completed","url":"https://github.com/link-foundation/link-cli/actions/runs/25728494305","workflowName":"Rust CI/CD Pipeline"},{"conclusion":"success","createdAt":"2026-05-12T10:24:34Z","databaseId":25728494285,"event":"push","headBranch":"main","headSha":"d9309c5d34124229675900119a8da1f30b7fe042","name":"C# CI/CD Pipeline","status":"completed","url":"https://github.com/link-foundation/link-cli/actions/runs/25728494285","workflowName":"C# CI/CD Pipeline"},{"conclusion":"success","createdAt":"2026-05-12T10:17:18Z","databaseId":25728160457,"event":"pull_request","headBranch":"issue-75-2384a28fe185","headSha":"36cc8908c95a8551fdb05995b13423c80833d2a3","name":"WebAssembly CI","status":"completed","url":"https://github.com/link-foundation/link-cli/actions/runs/25728160457","workflowName":"WebAssembly CI"},{"conclusion":"success","createdAt":"2026-05-12T10:17:18Z","databaseId":25728160434,"event":"pull_request","headBranch":"issue-75-2384a28fe185","headSha":"36cc8908c95a8551fdb05995b13423c80833d2a3","name":"Rust CI/CD Pipeline","status":"completed","url":"https://github.com/link-foundation/link-cli/actions/runs/25728160434","workflowName":"Rust CI/CD Pipeline"},{"conclusion":"success","createdAt":"2026-05-12T10:17:18Z","databaseId":25728160417,"event":"pull_request","headBranch":"issue-75-2384a28fe185","headSha":"36cc8908c95a8551fdb05995b13423c80833d2a3","name":"C# CI/CD Pipeline","status":"completed","url":"https://github.com/link-foundation/link-cli/actions/runs/25728160417","workflowName":"C# CI/CD Pipeline"},{"conclusion":"success","createdAt":"2026-05-12T10:17:16Z","databaseId":25728158574,"event":"push","headBranch":"issue-75-2384a28fe185","headSha":"36cc8908c95a8551fdb05995b13423c80833d2a3","name":"WebAssembly CI","status":"completed","url":"https://github.com/link-foundation/link-cli/actions/runs/25728158574","workflowName":"WebAssembly CI"},{"conclusion":"success","createdAt":"2026-05-12T09:35:44Z","databaseId":25726135631,"event":"pull_request","headBranch":"issue-75-2384a28fe185","headSha":"ce9a64afff7265fbc45350f3d0bf3c80cb75bd04","name":"CI","status":"completed","url":"https://github.com/link-foundation/link-cli/actions/runs/25726135631","workflowName":"CI"},{"conclusion":"success","createdAt":"2026-05-09T07:08:11Z","databaseId":25594941825,"event":"push","headBranch":"main","headSha":"70a959516ae64dd5878b72f5cb6af961a765aedc","name":"Rust CI/CD Pipeline","status":"completed","url":"https://github.com/link-foundation/link-cli/actions/runs/25594941825","workflowName":"Rust CI/CD Pipeline"}] diff --git a/docs/case-studies/issue-82/evidence/run-25749403949-wasm.json b/docs/case-studies/issue-82/evidence/run-25749403949-wasm.json new file mode 100644 index 0000000..e61f01c --- /dev/null +++ b/docs/case-studies/issue-82/evidence/run-25749403949-wasm.json @@ -0,0 +1 @@ +{"conclusion":"success","createdAt":"2026-05-12T16:57:36Z","databaseId":25749403949,"event":"push","headBranch":"main","headSha":"d47e551d2d66c7bfe93f9a869ce9fab36347e317","jobs":[{"completedAt":"2026-05-12T16:59:29Z","conclusion":"success","databaseId":75621390321,"name":"Test","startedAt":"2026-05-12T16:57:39Z","status":"completed","steps":[{"completedAt":"2026-05-12T16:57:40Z","conclusion":"success","name":"Set up job","number":1,"startedAt":"2026-05-12T16:57:39Z","status":"completed"},{"completedAt":"2026-05-12T16:57:41Z","conclusion":"success","name":"Run actions/checkout@v4","number":2,"startedAt":"2026-05-12T16:57:40Z","status":"completed"},{"completedAt":"2026-05-12T16:57:51Z","conclusion":"success","name":"Setup Rust","number":3,"startedAt":"2026-05-12T16:57:41Z","status":"completed"},{"completedAt":"2026-05-12T16:59:03Z","conclusion":"success","name":"Install wasm-pack","number":4,"startedAt":"2026-05-12T16:57:51Z","status":"completed"},{"completedAt":"2026-05-12T16:59:04Z","conclusion":"success","name":"Setup Node.js","number":5,"startedAt":"2026-05-12T16:59:03Z","status":"completed"},{"completedAt":"2026-05-12T16:59:09Z","conclusion":"success","name":"Cache cargo registry","number":6,"startedAt":"2026-05-12T16:59:04Z","status":"completed"},{"completedAt":"2026-05-12T16:59:11Z","conclusion":"success","name":"Install npm dependencies","number":7,"startedAt":"2026-05-12T16:59:09Z","status":"completed"},{"completedAt":"2026-05-12T16:59:14Z","conclusion":"success","name":"Test Rust CLI core","number":8,"startedAt":"2026-05-12T16:59:11Z","status":"completed"},{"completedAt":"2026-05-12T16:59:19Z","conclusion":"success","name":"Test WebAssembly wrapper","number":9,"startedAt":"2026-05-12T16:59:14Z","status":"completed"},{"completedAt":"2026-05-12T16:59:27Z","conclusion":"success","name":"Build React WebAssembly app","number":10,"startedAt":"2026-05-12T16:59:19Z","status":"completed"},{"completedAt":"2026-05-12T16:59:27Z","conclusion":"success","name":"Upload built app","number":11,"startedAt":"2026-05-12T16:59:27Z","status":"completed"},{"completedAt":"2026-05-12T16:59:28Z","conclusion":"success","name":"Post Cache cargo registry","number":20,"startedAt":"2026-05-12T16:59:27Z","status":"completed"},{"completedAt":"2026-05-12T16:59:28Z","conclusion":"success","name":"Post Setup Node.js","number":21,"startedAt":"2026-05-12T16:59:28Z","status":"completed"},{"completedAt":"2026-05-12T16:59:28Z","conclusion":"success","name":"Post Run actions/checkout@v4","number":22,"startedAt":"2026-05-12T16:59:28Z","status":"completed"},{"completedAt":"2026-05-12T16:59:28Z","conclusion":"success","name":"Complete job","number":23,"startedAt":"2026-05-12T16:59:28Z","status":"completed"}],"url":"https://github.com/link-foundation/link-cli/actions/runs/25749403949/job/75621390321"},{"completedAt":"2026-05-12T17:01:23Z","conclusion":"success","databaseId":75621740600,"name":"Build GitHub Pages app","startedAt":"2026-05-12T16:59:32Z","status":"completed","steps":[{"completedAt":"2026-05-12T16:59:35Z","conclusion":"success","name":"Set up job","number":1,"startedAt":"2026-05-12T16:59:33Z","status":"completed"},{"completedAt":"2026-05-12T16:59:36Z","conclusion":"success","name":"Run actions/checkout@v4","number":2,"startedAt":"2026-05-12T16:59:35Z","status":"completed"},{"completedAt":"2026-05-12T16:59:46Z","conclusion":"success","name":"Setup Rust","number":3,"startedAt":"2026-05-12T16:59:36Z","status":"completed"},{"completedAt":"2026-05-12T17:00:59Z","conclusion":"success","name":"Install wasm-pack","number":4,"startedAt":"2026-05-12T16:59:46Z","status":"completed"},{"completedAt":"2026-05-12T17:01:00Z","conclusion":"success","name":"Setup Node.js","number":5,"startedAt":"2026-05-12T17:00:59Z","status":"completed"},{"completedAt":"2026-05-12T17:01:05Z","conclusion":"success","name":"Cache cargo registry","number":6,"startedAt":"2026-05-12T17:01:00Z","status":"completed"},{"completedAt":"2026-05-12T17:01:08Z","conclusion":"success","name":"Install npm dependencies","number":7,"startedAt":"2026-05-12T17:01:05Z","status":"completed"},{"completedAt":"2026-05-12T17:01:08Z","conclusion":"success","name":"Configure Pages","number":8,"startedAt":"2026-05-12T17:01:08Z","status":"completed"},{"completedAt":"2026-05-12T17:01:16Z","conclusion":"success","name":"Build GitHub Pages app","number":9,"startedAt":"2026-05-12T17:01:08Z","status":"completed"},{"completedAt":"2026-05-12T17:01:17Z","conclusion":"success","name":"Upload Pages artifact","number":10,"startedAt":"2026-05-12T17:01:16Z","status":"completed"},{"completedAt":"2026-05-12T17:01:22Z","conclusion":"success","name":"Post Cache cargo registry","number":18,"startedAt":"2026-05-12T17:01:17Z","status":"completed"},{"completedAt":"2026-05-12T17:01:22Z","conclusion":"success","name":"Post Setup Node.js","number":19,"startedAt":"2026-05-12T17:01:22Z","status":"completed"},{"completedAt":"2026-05-12T17:01:22Z","conclusion":"success","name":"Post Run actions/checkout@v4","number":20,"startedAt":"2026-05-12T17:01:22Z","status":"completed"},{"completedAt":"2026-05-12T17:01:23Z","conclusion":"success","name":"Complete job","number":21,"startedAt":"2026-05-12T17:01:22Z","status":"completed"}],"url":"https://github.com/link-foundation/link-cli/actions/runs/25749403949/job/75621740600"},{"completedAt":"2026-05-12T17:01:44Z","conclusion":"success","databaseId":75622107236,"name":"Deploy GitHub Pages","startedAt":"2026-05-12T17:01:34Z","status":"completed","steps":[{"completedAt":"2026-05-12T17:01:36Z","conclusion":"success","name":"Set up job","number":1,"startedAt":"2026-05-12T17:01:35Z","status":"completed"},{"completedAt":"2026-05-12T17:01:42Z","conclusion":"success","name":"Deploy Pages artifact","number":2,"startedAt":"2026-05-12T17:01:36Z","status":"completed"},{"completedAt":"2026-05-12T17:01:42Z","conclusion":"success","name":"Complete job","number":3,"startedAt":"2026-05-12T17:01:42Z","status":"completed"}],"url":"https://github.com/link-foundation/link-cli/actions/runs/25749403949/job/75622107236"}],"name":"WebAssembly CI","status":"completed","url":"https://github.com/link-foundation/link-cli/actions/runs/25749403949","workflowName":"WebAssembly CI"} diff --git a/docs/case-studies/issue-82/evidence/run-25749403949-wasm.log b/docs/case-studies/issue-82/evidence/run-25749403949-wasm.log new file mode 100644 index 0000000..7030aa8 --- /dev/null +++ b/docs/case-studies/issue-82/evidence/run-25749403949-wasm.log @@ -0,0 +1,1990 @@ +Test UNKNOWN STEP 2026-05-12T16:57:39.7477045Z Current runner version: '2.334.0' +Test UNKNOWN STEP 2026-05-12T16:57:39.7501419Z ##[group]Runner Image Provisioner +Test UNKNOWN STEP 2026-05-12T16:57:39.7502389Z Hosted Compute Agent +Test UNKNOWN STEP 2026-05-12T16:57:39.7503483Z Version: 20260213.493 +Test UNKNOWN STEP 2026-05-12T16:57:39.7504217Z Commit: 5c115507f6dd24b8de37d8bbe0bb4509d0cc0fa3 +Test UNKNOWN STEP 2026-05-12T16:57:39.7504895Z Build Date: 2026-02-13T00:28:41Z +Test UNKNOWN STEP 2026-05-12T16:57:39.7505559Z Worker ID: {3b948ca1-6cac-4d8f-8278-29ccaa5e9f92} +Test UNKNOWN STEP 2026-05-12T16:57:39.7506194Z Azure Region: eastus +Test UNKNOWN STEP 2026-05-12T16:57:39.7506801Z ##[endgroup] +Test UNKNOWN STEP 2026-05-12T16:57:39.7508278Z ##[group]Operating System +Test UNKNOWN STEP 2026-05-12T16:57:39.7509365Z Ubuntu +Test UNKNOWN STEP 2026-05-12T16:57:39.7509965Z 24.04.4 +Test UNKNOWN STEP 2026-05-12T16:57:39.7510436Z LTS +Test UNKNOWN STEP 2026-05-12T16:57:39.7510944Z ##[endgroup] +Test UNKNOWN STEP 2026-05-12T16:57:39.7511434Z ##[group]Runner Image +Test UNKNOWN STEP 2026-05-12T16:57:39.7512038Z Image: ubuntu-24.04 +Test UNKNOWN STEP 2026-05-12T16:57:39.7512837Z Version: 20260413.86.1 +Test UNKNOWN STEP 2026-05-12T16:57:39.7514252Z Included Software: https://github.com/actions/runner-images/blob/ubuntu24/20260413.86/images/ubuntu/Ubuntu2404-Readme.md +Test UNKNOWN STEP 2026-05-12T16:57:39.7515781Z Image Release: https://github.com/actions/runner-images/releases/tag/ubuntu24%2F20260413.86 +Test UNKNOWN STEP 2026-05-12T16:57:39.7516693Z ##[endgroup] +Test UNKNOWN STEP 2026-05-12T16:57:39.7517663Z ##[group]GITHUB_TOKEN Permissions +Test UNKNOWN STEP 2026-05-12T16:57:39.7519790Z Contents: read +Test UNKNOWN STEP 2026-05-12T16:57:39.7520350Z Metadata: read +Test UNKNOWN STEP 2026-05-12T16:57:39.7520825Z ##[endgroup] +Test UNKNOWN STEP 2026-05-12T16:57:39.7523289Z Secret source: Actions +Test UNKNOWN STEP 2026-05-12T16:57:39.7524273Z Prepare workflow directory +Test UNKNOWN STEP 2026-05-12T16:57:39.7849246Z Prepare all required actions +Test UNKNOWN STEP 2026-05-12T16:57:39.7885930Z Getting action download info +Test UNKNOWN STEP 2026-05-12T16:57:40.2178829Z Download action repository 'actions/checkout@v4' (SHA:34e114876b0b11c390a56381ad16ebd13914f8d5) +Test UNKNOWN STEP 2026-05-12T16:57:40.3476299Z Download action repository 'dtolnay/rust-toolchain@stable' (SHA:29eef336d9b2848a0b548edc03f92a220660cdb8) +Test UNKNOWN STEP 2026-05-12T16:57:40.4512750Z Download action repository 'actions/setup-node@v4' (SHA:49933ea5288caeca8642d1e84afbd3f7d6820020) +Test UNKNOWN STEP 2026-05-12T16:57:40.5334399Z Download action repository 'actions/cache@v4' (SHA:0057852bfaa89a56745cba8c7296529d2fc39830) +Test UNKNOWN STEP 2026-05-12T16:57:40.6234900Z Download action repository 'actions/upload-artifact@v4' (SHA:ea165f8d65b6e75b540449e92b4886f43607fa02) +Test UNKNOWN STEP 2026-05-12T16:57:40.8799925Z Complete job name: Test +Test UNKNOWN STEP 2026-05-12T16:57:40.9611320Z ##[group]Run actions/checkout@v4 +Test UNKNOWN STEP 2026-05-12T16:57:40.9612172Z with: +Test UNKNOWN STEP 2026-05-12T16:57:40.9612836Z repository: link-foundation/link-cli +Test UNKNOWN STEP 2026-05-12T16:57:40.9613542Z token: *** +Test UNKNOWN STEP 2026-05-12T16:57:40.9613945Z ssh-strict: true +Test UNKNOWN STEP 2026-05-12T16:57:40.9614358Z ssh-user: git +Test UNKNOWN STEP 2026-05-12T16:57:40.9614785Z persist-credentials: true +Test UNKNOWN STEP 2026-05-12T16:57:40.9615252Z clean: true +Test UNKNOWN STEP 2026-05-12T16:57:40.9615674Z sparse-checkout-cone-mode: true +Test UNKNOWN STEP 2026-05-12T16:57:40.9616179Z fetch-depth: 1 +Test UNKNOWN STEP 2026-05-12T16:57:40.9616585Z fetch-tags: false +Test UNKNOWN STEP 2026-05-12T16:57:40.9617008Z show-progress: true +Test UNKNOWN STEP 2026-05-12T16:57:40.9617465Z lfs: false +Test UNKNOWN STEP 2026-05-12T16:57:40.9617847Z submodules: false +Test UNKNOWN STEP 2026-05-12T16:57:40.9618271Z set-safe-directory: true +Test UNKNOWN STEP 2026-05-12T16:57:40.9619022Z ##[endgroup] +Test UNKNOWN STEP 2026-05-12T16:57:41.0738564Z Syncing repository: link-foundation/link-cli +Test UNKNOWN STEP 2026-05-12T16:57:41.0740438Z ##[group]Getting Git version info +Test UNKNOWN STEP 2026-05-12T16:57:41.0741146Z Working directory is '/home/runner/work/link-cli/link-cli' +Test UNKNOWN STEP 2026-05-12T16:57:41.0742177Z [command]/usr/bin/git version +Test UNKNOWN STEP 2026-05-12T16:57:41.0860690Z git version 2.53.0 +Test UNKNOWN STEP 2026-05-12T16:57:41.0887058Z ##[endgroup] +Test UNKNOWN STEP 2026-05-12T16:57:41.0910411Z Temporarily overriding HOME='/home/runner/work/_temp/b9a38bc3-aef0-44c4-83d1-1fc4efee6a38' before making global git config changes +Test UNKNOWN STEP 2026-05-12T16:57:41.0913327Z Adding repository directory to the temporary git global config as a safe directory +Test UNKNOWN STEP 2026-05-12T16:57:41.0917648Z [command]/usr/bin/git config --global --add safe.directory /home/runner/work/link-cli/link-cli +Test UNKNOWN STEP 2026-05-12T16:57:41.0949302Z Deleting the contents of '/home/runner/work/link-cli/link-cli' +Test UNKNOWN STEP 2026-05-12T16:57:41.0953080Z ##[group]Initializing the repository +Test UNKNOWN STEP 2026-05-12T16:57:41.0956866Z [command]/usr/bin/git init /home/runner/work/link-cli/link-cli +Test UNKNOWN STEP 2026-05-12T16:57:41.1054785Z hint: Using 'master' as the name for the initial branch. This default branch name +Test UNKNOWN STEP 2026-05-12T16:57:41.1056374Z hint: will change to "main" in Git 3.0. To configure the initial branch name +Test UNKNOWN STEP 2026-05-12T16:57:41.1057446Z hint: to use in all of your new repositories, which will suppress this warning, +Test UNKNOWN STEP 2026-05-12T16:57:41.1058195Z hint: call: +Test UNKNOWN STEP 2026-05-12T16:57:41.1058626Z hint: +Test UNKNOWN STEP 2026-05-12T16:57:41.1059207Z hint: git config --global init.defaultBranch +Test UNKNOWN STEP 2026-05-12T16:57:41.1059796Z hint: +Test UNKNOWN STEP 2026-05-12T16:57:41.1060340Z hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and +Test UNKNOWN STEP 2026-05-12T16:57:41.1061212Z hint: 'development'. The just-created branch can be renamed via this command: +Test UNKNOWN STEP 2026-05-12T16:57:41.1061916Z hint: +Test UNKNOWN STEP 2026-05-12T16:57:41.1062297Z hint: git branch -m +Test UNKNOWN STEP 2026-05-12T16:57:41.1063047Z hint: +Test UNKNOWN STEP 2026-05-12T16:57:41.1063652Z hint: Disable this message with "git config set advice.defaultBranchName false" +Test UNKNOWN STEP 2026-05-12T16:57:41.1065191Z Initialized empty Git repository in /home/runner/work/link-cli/link-cli/.git/ +Test UNKNOWN STEP 2026-05-12T16:57:41.1067758Z [command]/usr/bin/git remote add origin https://github.com/link-foundation/link-cli +Test UNKNOWN STEP 2026-05-12T16:57:41.1094842Z ##[endgroup] +Test UNKNOWN STEP 2026-05-12T16:57:41.1096047Z ##[group]Disabling automatic garbage collection +Test UNKNOWN STEP 2026-05-12T16:57:41.1098779Z [command]/usr/bin/git config --local gc.auto 0 +Test UNKNOWN STEP 2026-05-12T16:57:41.1126491Z ##[endgroup] +Test UNKNOWN STEP 2026-05-12T16:57:41.1127578Z ##[group]Setting up auth +Test UNKNOWN STEP 2026-05-12T16:57:41.1132916Z [command]/usr/bin/git config --local --name-only --get-regexp core\.sshCommand +Test UNKNOWN STEP 2026-05-12T16:57:41.1161830Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :" +Test UNKNOWN STEP 2026-05-12T16:57:41.1444898Z [command]/usr/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader +Test UNKNOWN STEP 2026-05-12T16:57:41.1474680Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'http\.https\:\/\/github\.com\/\.extraheader' && git config --local --unset-all 'http.https://github.com/.extraheader' || :" +Test UNKNOWN STEP 2026-05-12T16:57:41.1686501Z [command]/usr/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir: +Test UNKNOWN STEP 2026-05-12T16:57:41.1715926Z [command]/usr/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url +Test UNKNOWN STEP 2026-05-12T16:57:41.1933536Z [command]/usr/bin/git config --local http.https://github.com/.extraheader AUTHORIZATION: basic *** +Test UNKNOWN STEP 2026-05-12T16:57:41.1966630Z ##[endgroup] +Test UNKNOWN STEP 2026-05-12T16:57:41.1967435Z ##[group]Fetching the repository +Test UNKNOWN STEP 2026-05-12T16:57:41.1974600Z [command]/usr/bin/git -c protocol.version=2 fetch --no-tags --prune --no-recurse-submodules --depth=1 origin +d47e551d2d66c7bfe93f9a869ce9fab36347e317:refs/remotes/origin/main +Test UNKNOWN STEP 2026-05-12T16:57:41.7454947Z From https://github.com/link-foundation/link-cli +Test UNKNOWN STEP 2026-05-12T16:57:41.7456791Z * [new ref] d47e551d2d66c7bfe93f9a869ce9fab36347e317 -> origin/main +Test UNKNOWN STEP 2026-05-12T16:57:41.7484465Z ##[endgroup] +Test UNKNOWN STEP 2026-05-12T16:57:41.7492241Z ##[group]Determining the checkout info +Test UNKNOWN STEP 2026-05-12T16:57:41.7494770Z ##[endgroup] +Test UNKNOWN STEP 2026-05-12T16:57:41.7495887Z [command]/usr/bin/git sparse-checkout disable +Test UNKNOWN STEP 2026-05-12T16:57:41.7530961Z [command]/usr/bin/git config --local --unset-all extensions.worktreeConfig +Test UNKNOWN STEP 2026-05-12T16:57:41.7558339Z ##[group]Checking out the ref +Test UNKNOWN STEP 2026-05-12T16:57:41.7562291Z [command]/usr/bin/git checkout --progress --force -B main refs/remotes/origin/main +Test UNKNOWN STEP 2026-05-12T16:57:41.8184701Z Switched to a new branch 'main' +Test UNKNOWN STEP 2026-05-12T16:57:41.8193612Z branch 'main' set up to track 'origin/main'. +Test UNKNOWN STEP 2026-05-12T16:57:41.8202130Z ##[endgroup] +Test UNKNOWN STEP 2026-05-12T16:57:41.8239982Z [command]/usr/bin/git log -1 --format=%H +Test UNKNOWN STEP 2026-05-12T16:57:41.8261615Z d47e551d2d66c7bfe93f9a869ce9fab36347e317 +Test UNKNOWN STEP 2026-05-12T16:57:41.8892108Z ##[group]Run dtolnay/rust-toolchain@stable +Test UNKNOWN STEP 2026-05-12T16:57:41.8893654Z with: +Test UNKNOWN STEP 2026-05-12T16:57:41.8894452Z targets: wasm32-unknown-unknown +Test UNKNOWN STEP 2026-05-12T16:57:41.8895662Z toolchain: stable +Test UNKNOWN STEP 2026-05-12T16:57:41.8896473Z ##[endgroup] +Test UNKNOWN STEP 2026-05-12T16:57:41.9048958Z ##[group]Run : parse toolchain version +Test UNKNOWN STEP 2026-05-12T16:57:41.9050130Z ^[[36;1m: parse toolchain version^[[0m +Test UNKNOWN STEP 2026-05-12T16:57:41.9051161Z ^[[36;1mif [[ -z $toolchain ]]; then^[[0m +Test UNKNOWN STEP 2026-05-12T16:57:41.9053459Z ^[[36;1m # GitHub does not enforce `required: true` inputs itself. https://github.com/actions/runner/issues/1070^[[0m +Test UNKNOWN STEP 2026-05-12T16:57:41.9055506Z ^[[36;1m echo "'toolchain' is a required input" >&2^[[0m +Test UNKNOWN STEP 2026-05-12T16:57:41.9056620Z ^[[36;1m exit 1^[[0m +Test UNKNOWN STEP 2026-05-12T16:57:41.9057849Z ^[[36;1melif [[ $toolchain =~ ^stable' '[0-9]+' '(year|month|week|day)s?' 'ago$ ]]; then^[[0m +Test UNKNOWN STEP 2026-05-12T16:57:41.9059373Z ^[[36;1m if [[ Linux == macOS ]]; then^[[0m +Test UNKNOWN STEP 2026-05-12T16:57:41.9061349Z ^[[36;1m echo "toolchain=1.$((($(date -v-$(sed 's/stable \([0-9]*\) \(.\).*/\1\2/' <<< $toolchain) +%s)/60/60/24-16569)/7/6))" >> $GITHUB_OUTPUT^[[0m +Test UNKNOWN STEP 2026-05-12T16:57:41.9063437Z ^[[36;1m else^[[0m +Test UNKNOWN STEP 2026-05-12T16:57:41.9064940Z ^[[36;1m echo "toolchain=1.$((($(date --date "${toolchain#stable }" +%s)/60/60/24-16569)/7/6))" >> $GITHUB_OUTPUT^[[0m +Test UNKNOWN STEP 2026-05-12T16:57:41.9066666Z ^[[36;1m fi^[[0m +Test UNKNOWN STEP 2026-05-12T16:57:41.9067749Z ^[[36;1melif [[ $toolchain =~ ^stable' 'minus' '[0-9]+' 'releases?$ ]]; then^[[0m +Test UNKNOWN STEP 2026-05-12T16:57:41.9069720Z ^[[36;1m echo "toolchain=1.$((($(date +%s)/60/60/24-16569)/7/6-${toolchain//[^0-9]/}))" >> $GITHUB_OUTPUT^[[0m +Test UNKNOWN STEP 2026-05-12T16:57:41.9071430Z ^[[36;1melif [[ $toolchain =~ ^1\.[0-9]+$ ]]; then^[[0m +Test UNKNOWN STEP 2026-05-12T16:57:41.9073506Z ^[[36;1m echo "toolchain=1.$((i=${toolchain#1.}, c=($(date +%s)/60/60/24-16569)/7/6, i+9*i*(10*i<=c)+90*i*(100*i<=c)))" >> $GITHUB_OUTPUT^[[0m +Test UNKNOWN STEP 2026-05-12T16:57:41.9075376Z ^[[36;1melse^[[0m +Test UNKNOWN STEP 2026-05-12T16:57:41.9076271Z ^[[36;1m echo "toolchain=$toolchain" >> $GITHUB_OUTPUT^[[0m +Test UNKNOWN STEP 2026-05-12T16:57:41.9077412Z ^[[36;1mfi^[[0m +Test UNKNOWN STEP 2026-05-12T16:57:41.9104441Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} +Test UNKNOWN STEP 2026-05-12T16:57:41.9105686Z env: +Test UNKNOWN STEP 2026-05-12T16:57:41.9106379Z toolchain: stable +Test UNKNOWN STEP 2026-05-12T16:57:41.9107141Z ##[endgroup] +Test UNKNOWN STEP 2026-05-12T16:57:41.9269674Z ##[group]Run : construct rustup command line +Test UNKNOWN STEP 2026-05-12T16:57:41.9270798Z ^[[36;1m: construct rustup command line^[[0m +Test UNKNOWN STEP 2026-05-12T16:57:41.9272603Z ^[[36;1mecho "targets=$(for t in ${targets//,/ }; do echo -n ' --target' $t; done)" >> $GITHUB_OUTPUT^[[0m +Test UNKNOWN STEP 2026-05-12T16:57:41.9274971Z ^[[36;1mecho "components=$(for c in ${components//,/ }; do echo -n ' --component' $c; done)" >> $GITHUB_OUTPUT^[[0m +Test UNKNOWN STEP 2026-05-12T16:57:41.9276756Z ^[[36;1mecho "downgrade=" >> $GITHUB_OUTPUT^[[0m +Test UNKNOWN STEP 2026-05-12T16:57:41.9298322Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} +Test UNKNOWN STEP 2026-05-12T16:57:41.9299499Z env: +Test UNKNOWN STEP 2026-05-12T16:57:41.9300198Z targets: wasm32-unknown-unknown +Test UNKNOWN STEP 2026-05-12T16:57:41.9301112Z components: +Test UNKNOWN STEP 2026-05-12T16:57:41.9301806Z ##[endgroup] +Test UNKNOWN STEP 2026-05-12T16:57:41.9403559Z ##[group]Run : set $CARGO_HOME +Test UNKNOWN STEP 2026-05-12T16:57:41.9404480Z ^[[36;1m: set $CARGO_HOME^[[0m +Test UNKNOWN STEP 2026-05-12T16:57:41.9405646Z ^[[36;1mecho CARGO_HOME=${CARGO_HOME:-"$HOME/.cargo"} >> $GITHUB_ENV^[[0m +Test UNKNOWN STEP 2026-05-12T16:57:41.9427057Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} +Test UNKNOWN STEP 2026-05-12T16:57:41.9428275Z ##[endgroup] +Test UNKNOWN STEP 2026-05-12T16:57:41.9531712Z ##[group]Run : install rustup if needed +Test UNKNOWN STEP 2026-05-12T16:57:41.9533170Z ^[[36;1m: install rustup if needed^[[0m +Test UNKNOWN STEP 2026-05-12T16:57:41.9534267Z ^[[36;1mif ! command -v rustup &>/dev/null; then^[[0m +Test UNKNOWN STEP 2026-05-12T16:57:41.9536890Z ^[[36;1m curl --proto '=https' --tlsv1.2 --retry 10 --retry-connrefused --location --silent --show-error --fail https://sh.rustup.rs | sh -s -- --default-toolchain none -y^[[0m +Test UNKNOWN STEP 2026-05-12T16:57:41.9539530Z ^[[36;1m echo "$CARGO_HOME/bin" >> $GITHUB_PATH^[[0m +Test UNKNOWN STEP 2026-05-12T16:57:41.9540579Z ^[[36;1mfi^[[0m +Test UNKNOWN STEP 2026-05-12T16:57:41.9561685Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} +Test UNKNOWN STEP 2026-05-12T16:57:41.9563091Z env: +Test UNKNOWN STEP 2026-05-12T16:57:41.9564066Z CARGO_HOME: /home/runner/.cargo +Test UNKNOWN STEP 2026-05-12T16:57:41.9564987Z ##[endgroup] +Test UNKNOWN STEP 2026-05-12T16:57:41.9672764Z ##[group]Run rustup toolchain install stable --target wasm32-unknown-unknown --profile minimal --no-self-update +Test UNKNOWN STEP 2026-05-12T16:57:41.9675618Z ^[[36;1mrustup toolchain install stable --target wasm32-unknown-unknown --profile minimal --no-self-update^[[0m +Test UNKNOWN STEP 2026-05-12T16:57:41.9698022Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} +Test UNKNOWN STEP 2026-05-12T16:57:41.9699205Z env: +Test UNKNOWN STEP 2026-05-12T16:57:41.9699888Z CARGO_HOME: /home/runner/.cargo +Test UNKNOWN STEP 2026-05-12T16:57:41.9700841Z RUSTUP_PERMIT_COPY_RENAME: 1 +Test UNKNOWN STEP 2026-05-12T16:57:41.9701696Z ##[endgroup] +Test UNKNOWN STEP 2026-05-12T16:57:42.1454898Z info: syncing channel updates for stable-x86_64-unknown-linux-gnu +Test UNKNOWN STEP 2026-05-12T16:57:42.2322923Z info: latest update on 2026-04-16 for version 1.95.0 (59807616e 2026-04-14) +Test UNKNOWN STEP 2026-05-12T16:57:42.2441186Z info: removing previous version of component clippy +Test UNKNOWN STEP 2026-05-12T16:57:42.2461839Z info: removing previous version of component rustfmt +Test UNKNOWN STEP 2026-05-12T16:57:42.2475722Z info: removing previous version of component cargo +Test UNKNOWN STEP 2026-05-12T16:57:42.2538827Z info: removing previous version of component rust-std +Test UNKNOWN STEP 2026-05-12T16:57:42.2589217Z info: removing previous version of component rustc +Test UNKNOWN STEP 2026-05-12T16:57:42.2651825Z info: downloading 6 components +Test UNKNOWN STEP 2026-05-12T16:57:51.8214671Z +Test UNKNOWN STEP 2026-05-12T16:57:51.8292101Z stable-x86_64-unknown-linux-gnu updated - rustc 1.95.0 (59807616e 2026-04-14) (from rustc 1.94.1 (e408947bf 2026-03-25)) +Test UNKNOWN STEP 2026-05-12T16:57:51.8293346Z +Test UNKNOWN STEP 2026-05-12T16:57:51.8391727Z ##[group]Run rustup default stable +Test UNKNOWN STEP 2026-05-12T16:57:51.8392040Z ^[[36;1mrustup default stable^[[0m +Test UNKNOWN STEP 2026-05-12T16:57:51.8413515Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} +Test UNKNOWN STEP 2026-05-12T16:57:51.8413878Z env: +Test UNKNOWN STEP 2026-05-12T16:57:51.8414102Z CARGO_HOME: /home/runner/.cargo +Test UNKNOWN STEP 2026-05-12T16:57:51.8414366Z ##[endgroup] +Test UNKNOWN STEP 2026-05-12T16:57:51.8506979Z info: using existing install for stable-x86_64-unknown-linux-gnu +Test UNKNOWN STEP 2026-05-12T16:57:51.8516666Z info: default toolchain set to stable-x86_64-unknown-linux-gnu +Test UNKNOWN STEP 2026-05-12T16:57:51.8517215Z +Test UNKNOWN STEP 2026-05-12T16:57:51.8583766Z stable-x86_64-unknown-linux-gnu unchanged - rustc 1.95.0 (59807616e 2026-04-14) +Test UNKNOWN STEP 2026-05-12T16:57:51.8584460Z +Test UNKNOWN STEP 2026-05-12T16:57:51.8620226Z ##[group]Run : create cachekey +Test UNKNOWN STEP 2026-05-12T16:57:51.8620558Z ^[[36;1m: create cachekey^[[0m +Test UNKNOWN STEP 2026-05-12T16:57:51.8621086Z ^[[36;1mDATE=$(rustc +stable --version --verbose | sed -ne 's/^commit-date: \(20[0-9][0-9]\)-\([01][0-9]\)-\([0-3][0-9]\)$/\1\2\3/p')^[[0m +Test UNKNOWN STEP 2026-05-12T16:57:51.8621748Z ^[[36;1mHASH=$(rustc +stable --version --verbose | sed -ne 's/^commit-hash: //p')^[[0m +Test UNKNOWN STEP 2026-05-12T16:57:51.8622256Z ^[[36;1mecho "cachekey=$(echo $DATE$HASH | head -c12)" >> $GITHUB_OUTPUT^[[0m +Test UNKNOWN STEP 2026-05-12T16:57:51.8642713Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} +Test UNKNOWN STEP 2026-05-12T16:57:51.8643079Z env: +Test UNKNOWN STEP 2026-05-12T16:57:51.8643289Z CARGO_HOME: /home/runner/.cargo +Test UNKNOWN STEP 2026-05-12T16:57:51.8643562Z ##[endgroup] +Test UNKNOWN STEP 2026-05-12T16:57:51.8973981Z ##[group]Run : disable incremental compilation +Test UNKNOWN STEP 2026-05-12T16:57:51.8974390Z ^[[36;1m: disable incremental compilation^[[0m +Test UNKNOWN STEP 2026-05-12T16:57:51.8974752Z ^[[36;1mif [ -z "${CARGO_INCREMENTAL+set}" ]; then^[[0m +Test UNKNOWN STEP 2026-05-12T16:57:51.8975114Z ^[[36;1m echo CARGO_INCREMENTAL=0 >> $GITHUB_ENV^[[0m +Test UNKNOWN STEP 2026-05-12T16:57:51.8975429Z ^[[36;1mfi^[[0m +Test UNKNOWN STEP 2026-05-12T16:57:51.8996151Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} +Test UNKNOWN STEP 2026-05-12T16:57:51.8996540Z env: +Test UNKNOWN STEP 2026-05-12T16:57:51.8996787Z CARGO_HOME: /home/runner/.cargo +Test UNKNOWN STEP 2026-05-12T16:57:51.8997049Z ##[endgroup] +Test UNKNOWN STEP 2026-05-12T16:57:51.9058817Z ##[group]Run : enable colors in Cargo output +Test UNKNOWN STEP 2026-05-12T16:57:51.9059160Z ^[[36;1m: enable colors in Cargo output^[[0m +Test UNKNOWN STEP 2026-05-12T16:57:51.9059527Z ^[[36;1mif [ -z "${CARGO_TERM_COLOR+set}" ]; then^[[0m +Test UNKNOWN STEP 2026-05-12T16:57:51.9059877Z ^[[36;1m echo CARGO_TERM_COLOR=always >> $GITHUB_ENV^[[0m +Test UNKNOWN STEP 2026-05-12T16:57:51.9060187Z ^[[36;1mfi^[[0m +Test UNKNOWN STEP 2026-05-12T16:57:51.9079192Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} +Test UNKNOWN STEP 2026-05-12T16:57:51.9079551Z env: +Test UNKNOWN STEP 2026-05-12T16:57:51.9079768Z CARGO_HOME: /home/runner/.cargo +Test UNKNOWN STEP 2026-05-12T16:57:51.9080274Z CARGO_INCREMENTAL: 0 +Test UNKNOWN STEP 2026-05-12T16:57:51.9080525Z ##[endgroup] +Test UNKNOWN STEP 2026-05-12T16:57:51.9162052Z ##[group]Run : enable Cargo sparse registry +Test UNKNOWN STEP 2026-05-12T16:57:51.9162397Z ^[[36;1m: enable Cargo sparse registry^[[0m +Test UNKNOWN STEP 2026-05-12T16:57:51.9163254Z ^[[36;1m# implemented in 1.66, stabilized in 1.68, made default in 1.70^[[0m +Test UNKNOWN STEP 2026-05-12T16:57:51.9163977Z ^[[36;1mif [ -z "${CARGO_REGISTRIES_CRATES_IO_PROTOCOL+set}" -o -f "/home/runner/work/_temp"/.implicit_cargo_registries_crates_io_protocol ]; then^[[0m +Test UNKNOWN STEP 2026-05-12T16:57:51.9164756Z ^[[36;1m if rustc +stable --version --verbose | grep -q '^release: 1\.6[89]\.'; then^[[0m +Test UNKNOWN STEP 2026-05-12T16:57:51.9165338Z ^[[36;1m touch "/home/runner/work/_temp"/.implicit_cargo_registries_crates_io_protocol || true^[[0m +Test UNKNOWN STEP 2026-05-12T16:57:51.9165877Z ^[[36;1m echo CARGO_REGISTRIES_CRATES_IO_PROTOCOL=sparse >> $GITHUB_ENV^[[0m +Test UNKNOWN STEP 2026-05-12T16:57:51.9166379Z ^[[36;1m elif rustc +stable --version --verbose | grep -q '^release: 1\.6[67]\.'; then^[[0m +Test UNKNOWN STEP 2026-05-12T16:57:51.9166959Z ^[[36;1m touch "/home/runner/work/_temp"/.implicit_cargo_registries_crates_io_protocol || true^[[0m +Test UNKNOWN STEP 2026-05-12T16:57:51.9167486Z ^[[36;1m echo CARGO_REGISTRIES_CRATES_IO_PROTOCOL=git >> $GITHUB_ENV^[[0m +Test UNKNOWN STEP 2026-05-12T16:57:51.9167849Z ^[[36;1m fi^[[0m +Test UNKNOWN STEP 2026-05-12T16:57:51.9168048Z ^[[36;1mfi^[[0m +Test UNKNOWN STEP 2026-05-12T16:57:51.9187474Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} +Test UNKNOWN STEP 2026-05-12T16:57:51.9187840Z env: +Test UNKNOWN STEP 2026-05-12T16:57:51.9188052Z CARGO_HOME: /home/runner/.cargo +Test UNKNOWN STEP 2026-05-12T16:57:51.9188335Z CARGO_INCREMENTAL: 0 +Test UNKNOWN STEP 2026-05-12T16:57:51.9188572Z CARGO_TERM_COLOR: always +Test UNKNOWN STEP 2026-05-12T16:57:51.9188819Z ##[endgroup] +Test UNKNOWN STEP 2026-05-12T16:57:51.9498869Z ##[group]Run : work around spurious network errors in curl 8.0 +Test UNKNOWN STEP 2026-05-12T16:57:51.9499349Z ^[[36;1m: work around spurious network errors in curl 8.0^[[0m +Test UNKNOWN STEP 2026-05-12T16:57:51.9500074Z ^[[36;1m# https://rust-lang.zulipchat.com/#narrow/stream/246057-t-cargo/topic/timeout.20investigation^[[0m +Test UNKNOWN STEP 2026-05-12T16:57:51.9500751Z ^[[36;1mif rustc +stable --version --verbose | grep -q '^release: 1\.7[01]\.'; then^[[0m +Test UNKNOWN STEP 2026-05-12T16:57:51.9501241Z ^[[36;1m echo CARGO_HTTP_MULTIPLEXING=false >> $GITHUB_ENV^[[0m +Test UNKNOWN STEP 2026-05-12T16:57:51.9501628Z ^[[36;1mfi^[[0m +Test UNKNOWN STEP 2026-05-12T16:57:51.9522346Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} +Test UNKNOWN STEP 2026-05-12T16:57:51.9523193Z env: +Test UNKNOWN STEP 2026-05-12T16:57:51.9523430Z CARGO_HOME: /home/runner/.cargo +Test UNKNOWN STEP 2026-05-12T16:57:51.9523782Z CARGO_INCREMENTAL: 0 +Test UNKNOWN STEP 2026-05-12T16:57:51.9524036Z CARGO_TERM_COLOR: always +Test UNKNOWN STEP 2026-05-12T16:57:51.9524275Z ##[endgroup] +Test UNKNOWN STEP 2026-05-12T16:57:51.9711050Z ##[group]Run rustc +stable --version --verbose +Test UNKNOWN STEP 2026-05-12T16:57:51.9711422Z ^[[36;1mrustc +stable --version --verbose^[[0m +Test UNKNOWN STEP 2026-05-12T16:57:51.9731409Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} +Test UNKNOWN STEP 2026-05-12T16:57:51.9731771Z env: +Test UNKNOWN STEP 2026-05-12T16:57:51.9731995Z CARGO_HOME: /home/runner/.cargo +Test UNKNOWN STEP 2026-05-12T16:57:51.9732260Z CARGO_INCREMENTAL: 0 +Test UNKNOWN STEP 2026-05-12T16:57:51.9732725Z CARGO_TERM_COLOR: always +Test UNKNOWN STEP 2026-05-12T16:57:51.9732971Z ##[endgroup] +Test UNKNOWN STEP 2026-05-12T16:57:51.9881418Z rustc 1.95.0 (59807616e 2026-04-14) +Test UNKNOWN STEP 2026-05-12T16:57:51.9882654Z binary: rustc +Test UNKNOWN STEP 2026-05-12T16:57:51.9883209Z commit-hash: 59807616e1fa2540724bfbac14d7976d7e4a3860 +Test UNKNOWN STEP 2026-05-12T16:57:51.9883622Z commit-date: 2026-04-14 +Test UNKNOWN STEP 2026-05-12T16:57:51.9883928Z host: x86_64-unknown-linux-gnu +Test UNKNOWN STEP 2026-05-12T16:57:51.9884234Z release: 1.95.0 +Test UNKNOWN STEP 2026-05-12T16:57:51.9884598Z LLVM version: 22.1.2 +Test UNKNOWN STEP 2026-05-12T16:57:51.9956677Z ##[group]Run cargo install wasm-pack --version 0.14.0 --locked +Test UNKNOWN STEP 2026-05-12T16:57:51.9957167Z ^[[36;1mcargo install wasm-pack --version 0.14.0 --locked^[[0m +Test UNKNOWN STEP 2026-05-12T16:57:51.9977916Z shell: /usr/bin/bash -e {0} +Test UNKNOWN STEP 2026-05-12T16:57:51.9978190Z env: +Test UNKNOWN STEP 2026-05-12T16:57:51.9978404Z CARGO_HOME: /home/runner/.cargo +Test UNKNOWN STEP 2026-05-12T16:57:51.9978686Z CARGO_INCREMENTAL: 0 +Test UNKNOWN STEP 2026-05-12T16:57:51.9978926Z CARGO_TERM_COLOR: always +Test UNKNOWN STEP 2026-05-12T16:57:51.9979164Z ##[endgroup] +Test UNKNOWN STEP 2026-05-12T16:57:52.0255748Z ^[[1m^[[92m Updating^[[0m crates.io index +Test UNKNOWN STEP 2026-05-12T16:57:52.0669300Z ^[[1m^[[92m Downloading^[[0m crates ... +Test UNKNOWN STEP 2026-05-12T16:57:52.2975645Z ^[[1m^[[92m Downloaded^[[0m wasm-pack v0.14.0 +Test UNKNOWN STEP 2026-05-12T16:57:52.3410383Z ^[[1m^[[92m Installing^[[0m wasm-pack v0.14.0 +Test UNKNOWN STEP 2026-05-12T16:57:52.3473087Z ^[[1m^[[92m Updating^[[0m crates.io index +Test UNKNOWN STEP 2026-05-12T16:57:52.8714085Z ^[[1m^[[92m Updating^[[0m crates.io index +Test UNKNOWN STEP 2026-05-12T16:57:53.0022478Z ^[[1m^[[92m Downloading^[[0m crates ... +Test UNKNOWN STEP 2026-05-12T16:57:53.0474674Z ^[[1m^[[92m Downloaded^[[0m autocfg v1.5.0 +Test UNKNOWN STEP 2026-05-12T16:57:53.0497123Z ^[[1m^[[92m Downloaded^[[0m dirs-sys-next v0.1.2 +Test UNKNOWN STEP 2026-05-12T16:57:53.0509248Z ^[[1m^[[92m Downloaded^[[0m anstyle-query v1.1.5 +Test UNKNOWN STEP 2026-05-12T16:57:53.0524940Z ^[[1m^[[92m Downloaded^[[0m anstyle-parse v0.2.7 +Test UNKNOWN STEP 2026-05-12T16:57:53.0544390Z ^[[1m^[[92m Downloaded^[[0m anyhow v1.0.100 +Test UNKNOWN STEP 2026-05-12T16:57:53.0589692Z ^[[1m^[[92m Downloaded^[[0m rustc-demangle v0.1.27 +Test UNKNOWN STEP 2026-05-12T16:57:53.0610752Z ^[[1m^[[92m Downloaded^[[0m quote v1.0.43 +Test UNKNOWN STEP 2026-05-12T16:57:53.0644765Z ^[[1m^[[92m Downloaded^[[0m siphasher v1.0.1 +Test UNKNOWN STEP 2026-05-12T16:57:53.0660386Z ^[[1m^[[92m Downloaded^[[0m potential_utf v0.1.4 +Test UNKNOWN STEP 2026-05-12T16:57:53.0675178Z ^[[1m^[[92m Downloaded^[[0m serde_ignored v0.1.14 +Test UNKNOWN STEP 2026-05-12T16:57:53.0691337Z ^[[1m^[[92m Downloaded^[[0m time-core v0.1.7 +Test UNKNOWN STEP 2026-05-12T16:57:53.0707878Z ^[[1m^[[92m Downloaded^[[0m xattr v1.6.1 +Test UNKNOWN STEP 2026-05-12T16:57:53.0733033Z ^[[1m^[[92m Downloaded^[[0m version_check v0.9.5 +Test UNKNOWN STEP 2026-05-12T16:57:53.0750626Z ^[[1m^[[92m Downloaded^[[0m stable_deref_trait v1.2.1 +Test UNKNOWN STEP 2026-05-12T16:57:53.0762202Z ^[[1m^[[92m Downloaded^[[0m rustls-pki-types v1.14.0 +Test UNKNOWN STEP 2026-05-12T16:57:53.0796274Z ^[[1m^[[92m Downloaded^[[0m which v8.0.0 +Test UNKNOWN STEP 2026-05-12T16:57:53.0832022Z ^[[1m^[[92m Downloaded^[[0m strsim v0.11.1 +Test UNKNOWN STEP 2026-05-12T16:57:53.0850308Z ^[[1m^[[92m Downloaded^[[0m untrusted v0.9.0 +Test UNKNOWN STEP 2026-05-12T16:57:53.0877425Z ^[[1m^[[92m Downloaded^[[0m synstructure v0.13.2 +Test UNKNOWN STEP 2026-05-12T16:57:53.0892184Z ^[[1m^[[92m Downloaded^[[0m unicode-ident v1.0.22 +Test UNKNOWN STEP 2026-05-12T16:57:53.0925096Z ^[[1m^[[92m Downloaded^[[0m zerofrom v0.1.6 +Test UNKNOWN STEP 2026-05-12T16:57:53.0936437Z ^[[1m^[[92m Downloaded^[[0m aes v0.8.4 +Test UNKNOWN STEP 2026-05-12T16:57:53.0981741Z ^[[1m^[[92m Downloaded^[[0m zeroize_derive v1.4.3 +Test UNKNOWN STEP 2026-05-12T16:57:53.1000085Z ^[[1m^[[92m Downloaded^[[0m yoke-derive v0.8.1 +Test UNKNOWN STEP 2026-05-12T16:57:53.1017463Z ^[[1m^[[92m Downloaded^[[0m parking_lot_core v0.9.12 +Test UNKNOWN STEP 2026-05-12T16:57:53.1047644Z ^[[1m^[[92m Downloaded^[[0m webpki-roots v0.26.11 +Test UNKNOWN STEP 2026-05-12T16:57:53.1066981Z ^[[1m^[[92m Downloaded^[[0m subtle v2.6.1 +Test UNKNOWN STEP 2026-05-12T16:57:53.1084798Z ^[[1m^[[92m Downloaded^[[0m tinystr v0.8.2 +Test UNKNOWN STEP 2026-05-12T16:57:53.1109439Z ^[[1m^[[92m Downloaded^[[0m zerovec-derive v0.11.2 +Test UNKNOWN STEP 2026-05-12T16:57:53.1128494Z ^[[1m^[[92m Downloaded^[[0m toml v0.9.11+spec-1.1.0 +Test UNKNOWN STEP 2026-05-12T16:57:53.1176782Z ^[[1m^[[92m Downloaded^[[0m toml_datetime v0.7.5+spec-1.1.0 +Test UNKNOWN STEP 2026-05-12T16:57:53.1194874Z ^[[1m^[[92m Downloaded^[[0m zstd-safe v7.2.4 +Test UNKNOWN STEP 2026-05-12T16:57:53.1217942Z ^[[1m^[[92m Downloaded^[[0m zeroize v1.8.2 +Test UNKNOWN STEP 2026-05-12T16:57:53.1235465Z ^[[1m^[[92m Downloaded^[[0m lzma-sys v0.1.20 +Test UNKNOWN STEP 2026-05-12T16:57:53.1556523Z ^[[1m^[[92m Downloaded^[[0m zstd v0.13.3 +Test UNKNOWN STEP 2026-05-12T16:57:53.1589677Z ^[[1m^[[92m Downloaded^[[0m writeable v0.6.2 +Test UNKNOWN STEP 2026-05-12T16:57:53.1618001Z ^[[1m^[[92m Downloaded^[[0m toml_parser v1.0.6+spec-1.1.0 +Test UNKNOWN STEP 2026-05-12T16:57:53.1643928Z ^[[1m^[[92m Downloaded^[[0m zerotrie v0.2.3 +Test UNKNOWN STEP 2026-05-12T16:57:53.1682418Z ^[[1m^[[92m Downloaded^[[0m zerofrom-derive v0.1.6 +Test UNKNOWN STEP 2026-05-12T16:57:53.1695062Z ^[[1m^[[92m Downloaded^[[0m tar v0.4.44 +Test UNKNOWN STEP 2026-05-12T16:57:53.1738247Z ^[[1m^[[92m Downloaded^[[0m zopfli v0.8.3 +Test UNKNOWN STEP 2026-05-12T16:57:53.1779259Z ^[[1m^[[92m Downloaded^[[0m zip v2.4.2 +Test UNKNOWN STEP 2026-05-12T16:57:53.1847925Z ^[[1m^[[92m Downloaded^[[0m serde_core v1.0.228 +Test UNKNOWN STEP 2026-05-12T16:57:53.1889974Z ^[[1m^[[92m Downloaded^[[0m rustls-webpki v0.103.9 +Test UNKNOWN STEP 2026-05-12T16:57:53.1942089Z ^[[1m^[[92m Downloaded^[[0m ureq v2.12.1 +Test UNKNOWN STEP 2026-05-12T16:57:53.2020814Z ^[[1m^[[92m Downloaded^[[0m zerovec v0.11.5 +Test UNKNOWN STEP 2026-05-12T16:57:53.2109268Z ^[[1m^[[92m Downloaded^[[0m path-clean v1.0.1 +Test UNKNOWN STEP 2026-05-12T16:57:53.2126554Z ^[[1m^[[92m Downloaded^[[0m litemap v0.8.1 +Test UNKNOWN STEP 2026-05-12T16:57:53.2160906Z ^[[1m^[[92m Downloaded^[[0m serde_json v1.0.149 +Test UNKNOWN STEP 2026-05-12T16:57:53.2275505Z ^[[1m^[[92m Downloaded^[[0m linux-raw-sys v0.11.0 +Test UNKNOWN STEP 2026-05-12T16:57:53.2970939Z ^[[1m^[[92m Downloaded^[[0m winnow v0.7.14 +Test UNKNOWN STEP 2026-05-12T16:57:53.3066569Z ^[[1m^[[92m Downloaded^[[0m time v0.3.45 +Test UNKNOWN STEP 2026-05-12T16:57:53.3193564Z ^[[1m^[[92m Downloaded^[[0m sysinfo v0.37.2 +Test UNKNOWN STEP 2026-05-12T16:57:53.3305009Z ^[[1m^[[92m Downloaded^[[0m unicode-width v0.2.2 +Test UNKNOWN STEP 2026-05-12T16:57:53.3360378Z ^[[1m^[[92m Downloaded^[[0m webpki-roots v1.0.5 +Test UNKNOWN STEP 2026-05-12T16:57:53.3394145Z ^[[1m^[[92m Downloaded^[[0m clap_builder v4.5.54 +Test UNKNOWN STEP 2026-05-12T16:57:53.3457482Z ^[[1m^[[92m Downloaded^[[0m syn v2.0.114 +Test UNKNOWN STEP 2026-05-12T16:57:53.3560052Z ^[[1m^[[92m Downloaded^[[0m rustix v0.38.44 +Test UNKNOWN STEP 2026-05-12T16:57:53.3816221Z ^[[1m^[[92m Downloaded^[[0m icu_properties_data v2.1.2 +Test UNKNOWN STEP 2026-05-12T16:57:53.3916758Z ^[[1m^[[92m Downloaded^[[0m rustls v0.23.36 +Test UNKNOWN STEP 2026-05-12T16:57:53.4031893Z ^[[1m^[[92m Downloaded^[[0m utf8parse v0.2.2 +Test UNKNOWN STEP 2026-05-12T16:57:53.4041868Z ^[[1m^[[92m Downloaded^[[0m url v2.5.8 +Test UNKNOWN STEP 2026-05-12T16:57:53.4068385Z ^[[1m^[[92m Downloaded^[[0m typenum v1.19.0 +Test UNKNOWN STEP 2026-05-12T16:57:53.4096825Z ^[[1m^[[92m Downloaded^[[0m rustix v1.1.3 +Test UNKNOWN STEP 2026-05-12T16:57:53.4361167Z ^[[1m^[[92m Downloaded^[[0m num-conv v0.1.0 +Test UNKNOWN STEP 2026-05-12T16:57:53.4370644Z ^[[1m^[[92m Downloaded^[[0m serde v1.0.228 +Test UNKNOWN STEP 2026-05-12T16:57:53.4404807Z ^[[1m^[[92m Downloaded^[[0m glob v0.3.3 +Test UNKNOWN STEP 2026-05-12T16:57:53.4420332Z ^[[1m^[[92m Downloaded^[[0m serde_derive v1.0.228 +Test UNKNOWN STEP 2026-05-12T16:57:53.4450005Z ^[[1m^[[92m Downloaded^[[0m object v0.37.3 +Test UNKNOWN STEP 2026-05-12T16:57:53.4556153Z ^[[1m^[[92m Downloaded^[[0m xz2 v0.1.7 +Test UNKNOWN STEP 2026-05-12T16:57:53.4572861Z ^[[1m^[[92m Downloaded^[[0m uuid v1.19.0 +Test UNKNOWN STEP 2026-05-12T16:57:53.4601834Z ^[[1m^[[92m Downloaded^[[0m find-msvc-tools v0.1.8 +Test UNKNOWN STEP 2026-05-12T16:57:53.4617904Z ^[[1m^[[92m Downloaded^[[0m thiserror-impl v2.0.18 +Test UNKNOWN STEP 2026-05-12T16:57:53.4633228Z ^[[1m^[[92m Downloaded^[[0m tempfile v3.24.0 +Test UNKNOWN STEP 2026-05-12T16:57:53.4657898Z ^[[1m^[[92m Downloaded^[[0m smallvec v1.15.1 +Test UNKNOWN STEP 2026-05-12T16:57:53.4678980Z ^[[1m^[[92m Downloaded^[[0m num-traits v0.2.19 +Test UNKNOWN STEP 2026-05-12T16:57:53.4704932Z ^[[1m^[[92m Downloaded^[[0m adler2 v2.0.1 +Test UNKNOWN STEP 2026-05-12T16:57:53.4717783Z ^[[1m^[[92m Downloaded^[[0m libc v0.2.180 +Test UNKNOWN STEP 2026-05-12T16:57:53.5096179Z ^[[1m^[[92m Downloaded^[[0m iana-time-zone v0.1.64 +Test UNKNOWN STEP 2026-05-12T16:57:53.5122625Z ^[[1m^[[92m Downloaded^[[0m is_terminal_polyfill v1.70.2 +Test UNKNOWN STEP 2026-05-12T16:57:53.5132469Z ^[[1m^[[92m Downloaded^[[0m walkdir v2.5.0 +Test UNKNOWN STEP 2026-05-12T16:57:53.5151587Z ^[[1m^[[92m Downloaded^[[0m zstd-sys v2.0.16+zstd.1.5.7 +Test UNKNOWN STEP 2026-05-12T16:57:53.5308566Z ^[[1m^[[92m Downloaded^[[0m env_logger v0.11.8 +Test UNKNOWN STEP 2026-05-12T16:57:53.5332999Z ^[[1m^[[92m Downloaded^[[0m zmij v1.0.16 +Test UNKNOWN STEP 2026-05-12T16:57:53.5350948Z ^[[1m^[[92m Downloaded^[[0m yoke v0.8.1 +Test UNKNOWN STEP 2026-05-12T16:57:53.5368497Z ^[[1m^[[92m Downloaded^[[0m semver v1.0.27 +Test UNKNOWN STEP 2026-05-12T16:57:53.5391288Z ^[[1m^[[92m Downloaded^[[0m same-file v1.0.6 +Test UNKNOWN STEP 2026-05-12T16:57:53.5405301Z ^[[1m^[[92m Downloaded^[[0m form_urlencoded v1.2.2 +Test UNKNOWN STEP 2026-05-12T16:57:53.5413641Z ^[[1m^[[92m Downloaded^[[0m thiserror v2.0.18 +Test UNKNOWN STEP 2026-05-12T16:57:53.5477390Z ^[[1m^[[92m Downloaded^[[0m indexmap v2.13.0 +Test UNKNOWN STEP 2026-05-12T16:57:53.5519128Z ^[[1m^[[92m Downloaded^[[0m chrono v0.4.43 +Test UNKNOWN STEP 2026-05-12T16:57:53.5583517Z ^[[1m^[[92m Downloaded^[[0m shlex v1.3.0 +Test UNKNOWN STEP 2026-05-12T16:57:53.5595969Z ^[[1m^[[92m Downloaded^[[0m proc-macro2 v1.0.105 +Test UNKNOWN STEP 2026-05-12T16:57:53.5625383Z ^[[1m^[[92m Downloaded^[[0m toml_writer v1.0.6+spec-1.1.0 +Test UNKNOWN STEP 2026-05-12T16:57:53.5638773Z ^[[1m^[[92m Downloaded^[[0m memchr v2.7.6 +Test UNKNOWN STEP 2026-05-12T16:57:53.5694176Z ^[[1m^[[92m Downloaded^[[0m crc-catalog v2.4.0 +Test UNKNOWN STEP 2026-05-12T16:57:53.5706122Z ^[[1m^[[92m Downloaded^[[0m simd-adler32 v0.3.8 +Test UNKNOWN STEP 2026-05-12T16:57:53.5724525Z ^[[1m^[[92m Downloaded^[[0m sha1 v0.10.6 +Test UNKNOWN STEP 2026-05-12T16:57:53.5741177Z ^[[1m^[[92m Downloaded^[[0m icu_locale_core v2.1.1 +Test UNKNOWN STEP 2026-05-12T16:57:53.5808618Z ^[[1m^[[92m Downloaded^[[0m icu_collections v2.1.1 +Test UNKNOWN STEP 2026-05-12T16:57:53.5868542Z ^[[1m^[[92m Downloaded^[[0m heck v0.5.0 +Test UNKNOWN STEP 2026-05-12T16:57:53.5881495Z ^[[1m^[[92m Downloaded^[[0m addr2line v0.25.1 +Test UNKNOWN STEP 2026-05-12T16:57:53.5899633Z ^[[1m^[[92m Downloaded^[[0m miniz_oxide v0.8.9 +Test UNKNOWN STEP 2026-05-12T16:57:53.5924516Z ^[[1m^[[92m Downloaded^[[0m icu_provider v2.1.1 +Test UNKNOWN STEP 2026-05-12T16:57:53.5949875Z ^[[1m^[[92m Downloaded^[[0m gimli v0.32.3 +Test UNKNOWN STEP 2026-05-12T16:57:53.6017329Z ^[[1m^[[92m Downloaded^[[0m getrandom v0.3.4 +Test UNKNOWN STEP 2026-05-12T16:57:53.6051236Z ^[[1m^[[92m Downloaded^[[0m flate2 v1.1.8 +Test UNKNOWN STEP 2026-05-12T16:57:53.6099798Z ^[[1m^[[92m Downloaded^[[0m digest v0.10.7 +Test UNKNOWN STEP 2026-05-12T16:57:53.6118737Z ^[[1m^[[92m Downloaded^[[0m console v0.16.2 +Test UNKNOWN STEP 2026-05-12T16:57:53.6136437Z ^[[1m^[[92m Downloaded^[[0m siphasher v0.3.11 +Test UNKNOWN STEP 2026-05-12T16:57:53.6148991Z ^[[1m^[[92m Downloaded^[[0m hashbrown v0.16.1 +Test UNKNOWN STEP 2026-05-12T16:57:53.6198624Z ^[[1m^[[92m Downloaded^[[0m errno v0.3.14 +Test UNKNOWN STEP 2026-05-12T16:57:53.6214703Z ^[[1m^[[92m Downloaded^[[0m cargo-platform v0.3.2 +Test UNKNOWN STEP 2026-05-12T16:57:53.6227448Z ^[[1m^[[92m Downloaded^[[0m backtrace v0.3.76 +Test UNKNOWN STEP 2026-05-12T16:57:53.6276915Z ^[[1m^[[92m Downloaded^[[0m parking_lot v0.12.5 +Test UNKNOWN STEP 2026-05-12T16:57:53.6301372Z ^[[1m^[[92m Downloaded^[[0m once_cell v1.21.3 +Test UNKNOWN STEP 2026-05-12T16:57:53.6326904Z ^[[1m^[[92m Downloaded^[[0m lzma-rs v0.3.0 +Test UNKNOWN STEP 2026-05-12T16:57:53.6353019Z ^[[1m^[[92m Downloaded^[[0m clap_derive v4.5.49 +Test UNKNOWN STEP 2026-05-12T16:57:53.6374585Z ^[[1m^[[92m Downloaded^[[0m bumpalo v3.19.1 +Test UNKNOWN STEP 2026-05-12T16:57:53.6399888Z ^[[1m^[[92m Downloaded^[[0m binary-install v0.4.1 +Test UNKNOWN STEP 2026-05-12T16:57:53.6419133Z ^[[1m^[[92m Downloaded^[[0m anstyle v1.0.13 +Test UNKNOWN STEP 2026-05-12T16:57:53.6434096Z ^[[1m^[[92m Downloaded^[[0m percent-encoding v2.3.2 +Test UNKNOWN STEP 2026-05-12T16:57:53.6442883Z ^[[1m^[[92m Downloaded^[[0m ring v0.17.14 +Test UNKNOWN STEP 2026-05-12T16:57:53.6856276Z ^[[1m^[[92m Downloaded^[[0m pbkdf2 v0.12.2 +Test UNKNOWN STEP 2026-05-12T16:57:53.6870253Z ^[[1m^[[92m Downloaded^[[0m idna_adapter v1.2.1 +Test UNKNOWN STEP 2026-05-12T16:57:53.6880465Z ^[[1m^[[92m Downloaded^[[0m icu_normalizer_data v2.1.1 +Test UNKNOWN STEP 2026-05-12T16:57:53.6903879Z ^[[1m^[[92m Downloaded^[[0m cpufeatures v0.2.17 +Test UNKNOWN STEP 2026-05-12T16:57:53.6917101Z ^[[1m^[[92m Downloaded^[[0m cc v1.2.53 +Test UNKNOWN STEP 2026-05-12T16:57:53.6946393Z ^[[1m^[[92m Downloaded^[[0m bzip2 v0.5.2 +Test UNKNOWN STEP 2026-05-12T16:57:53.6963938Z ^[[1m^[[92m Downloaded^[[0m base64 v0.22.1 +Test UNKNOWN STEP 2026-05-12T16:57:53.7000682Z ^[[1m^[[92m Downloaded^[[0m utf8_iter v1.0.4 +Test UNKNOWN STEP 2026-05-12T16:57:53.7010514Z ^[[1m^[[92m Downloaded^[[0m socks v0.3.4 +Test UNKNOWN STEP 2026-05-12T16:57:53.7023892Z ^[[1m^[[92m Downloaded^[[0m serde_spanned v1.0.4 +Test UNKNOWN STEP 2026-05-12T16:57:53.7036357Z ^[[1m^[[92m Downloaded^[[0m log v0.4.29 +Test UNKNOWN STEP 2026-05-12T16:57:53.7060055Z ^[[1m^[[92m Downloaded^[[0m lock_api v0.4.14 +Test UNKNOWN STEP 2026-05-12T16:57:53.7072064Z ^[[1m^[[92m Downloaded^[[0m itoa v1.0.17 +Test UNKNOWN STEP 2026-05-12T16:57:53.7086460Z ^[[1m^[[92m Downloaded^[[0m is_executable v0.1.2 +Test UNKNOWN STEP 2026-05-12T16:57:53.7098744Z ^[[1m^[[92m Downloaded^[[0m inout v0.1.4 +Test UNKNOWN STEP 2026-05-12T16:57:53.7109284Z ^[[1m^[[92m Downloaded^[[0m idna v1.1.0 +Test UNKNOWN STEP 2026-05-12T16:57:53.7142884Z ^[[1m^[[92m Downloaded^[[0m icu_normalizer v2.1.1 +Test UNKNOWN STEP 2026-05-12T16:57:53.7176747Z ^[[1m^[[92m Downloaded^[[0m hmac v0.12.1 +Test UNKNOWN STEP 2026-05-12T16:57:53.7196192Z ^[[1m^[[92m Downloaded^[[0m hex v0.4.3 +Test UNKNOWN STEP 2026-05-12T16:57:53.7211329Z ^[[1m^[[92m Downloaded^[[0m filetime v0.2.27 +Test UNKNOWN STEP 2026-05-12T16:57:53.7228540Z ^[[1m^[[92m Downloaded^[[0m clap_lex v0.7.7 +Test UNKNOWN STEP 2026-05-12T16:57:53.7239083Z ^[[1m^[[92m Downloaded^[[0m jobserver v0.1.34 +Test UNKNOWN STEP 2026-05-12T16:57:53.7258968Z ^[[1m^[[92m Downloaded^[[0m crc32fast v1.5.0 +Test UNKNOWN STEP 2026-05-12T16:57:53.7277082Z ^[[1m^[[92m Downloaded^[[0m cargo_metadata v0.23.1 +Test UNKNOWN STEP 2026-05-12T16:57:53.7294741Z ^[[1m^[[92m Downloaded^[[0m displaydoc v0.2.5 +Test UNKNOWN STEP 2026-05-12T16:57:53.7323934Z ^[[1m^[[92m Downloaded^[[0m colorchoice v1.0.4 +Test UNKNOWN STEP 2026-05-12T16:57:53.7333488Z ^[[1m^[[92m Downloaded^[[0m human-panic v2.0.6 +Test UNKNOWN STEP 2026-05-12T16:57:53.7344943Z ^[[1m^[[92m Downloaded^[[0m env_filter v0.1.4 +Test UNKNOWN STEP 2026-05-12T16:57:53.7357876Z ^[[1m^[[92m Downloaded^[[0m dirs-next v2.0.0 +Test UNKNOWN STEP 2026-05-12T16:57:53.7368840Z ^[[1m^[[92m Downloaded^[[0m anstream v0.6.21 +Test UNKNOWN STEP 2026-05-12T16:57:53.7388086Z ^[[1m^[[92m Downloaded^[[0m getrandom v0.2.17 +Test UNKNOWN STEP 2026-05-12T16:57:53.7416387Z ^[[1m^[[92m Downloaded^[[0m fs4 v0.6.6 +Test UNKNOWN STEP 2026-05-12T16:57:53.7439856Z ^[[1m^[[92m Downloaded^[[0m dialoguer v0.12.0 +Test UNKNOWN STEP 2026-05-12T16:57:53.7474181Z ^[[1m^[[92m Downloaded^[[0m deflate64 v0.1.10 +Test UNKNOWN STEP 2026-05-12T16:57:53.7490131Z ^[[1m^[[92m Downloaded^[[0m cipher v0.4.4 +Test UNKNOWN STEP 2026-05-12T16:57:53.7505426Z ^[[1m^[[92m Downloaded^[[0m block-buffer v0.10.4 +Test UNKNOWN STEP 2026-05-12T16:57:53.7515521Z ^[[1m^[[92m Downloaded^[[0m shell-words v1.1.1 +Test UNKNOWN STEP 2026-05-12T16:57:53.7525486Z ^[[1m^[[92m Downloaded^[[0m icu_properties v2.1.2 +Test UNKNOWN STEP 2026-05-12T16:57:53.7546866Z ^[[1m^[[92m Downloaded^[[0m generic-array v0.14.7 +Test UNKNOWN STEP 2026-05-12T16:57:53.7560254Z ^[[1m^[[92m Downloaded^[[0m fastrand v2.3.0 +Test UNKNOWN STEP 2026-05-12T16:57:53.7572405Z ^[[1m^[[92m Downloaded^[[0m equivalent v1.0.2 +Test UNKNOWN STEP 2026-05-12T16:57:53.7581972Z ^[[1m^[[92m Downloaded^[[0m env_home v0.1.0 +Test UNKNOWN STEP 2026-05-12T16:57:53.7597642Z ^[[1m^[[92m Downloaded^[[0m deranged v0.5.5 +Test UNKNOWN STEP 2026-05-12T16:57:53.7610656Z ^[[1m^[[92m Downloaded^[[0m crypto-common v0.1.7 +Test UNKNOWN STEP 2026-05-12T16:57:53.7619749Z ^[[1m^[[92m Downloaded^[[0m cfg-if v1.0.4 +Test UNKNOWN STEP 2026-05-12T16:57:53.7632636Z ^[[1m^[[92m Downloaded^[[0m bitflags v2.10.0 +Test UNKNOWN STEP 2026-05-12T16:57:53.7674149Z ^[[1m^[[92m Downloaded^[[0m crc v3.4.0 +Test UNKNOWN STEP 2026-05-12T16:57:53.7693775Z ^[[1m^[[92m Downloaded^[[0m clap v4.5.54 +Test UNKNOWN STEP 2026-05-12T16:57:53.7786582Z ^[[1m^[[92m Downloaded^[[0m camino v1.2.2 +Test UNKNOWN STEP 2026-05-12T16:57:53.7806176Z ^[[1m^[[92m Downloaded^[[0m byteorder v1.5.0 +Test UNKNOWN STEP 2026-05-12T16:57:53.7821424Z ^[[1m^[[92m Downloaded^[[0m linux-raw-sys v0.4.15 +Test UNKNOWN STEP 2026-05-12T16:57:53.8257591Z ^[[1m^[[92m Downloaded^[[0m constant_time_eq v0.3.1 +Test UNKNOWN STEP 2026-05-12T16:57:53.8270197Z ^[[1m^[[92m Downloaded^[[0m bzip2-sys v0.1.13+1.0.8 +Test UNKNOWN STEP 2026-05-12T16:57:53.8373916Z ^[[1m^[[92m Downloaded^[[0m scopeguard v1.2.0 +Test UNKNOWN STEP 2026-05-12T16:57:53.8385182Z ^[[1m^[[92m Downloaded^[[0m powerfmt v0.2.0 +Test UNKNOWN STEP 2026-05-12T16:57:53.8395879Z ^[[1m^[[92m Downloaded^[[0m pkg-config v0.3.32 +Test UNKNOWN STEP 2026-05-12T16:57:53.9007334Z ^[[1m^[[92m Compiling^[[0m libc v0.2.180 +Test UNKNOWN STEP 2026-05-12T16:57:53.9008013Z ^[[1m^[[92m Compiling^[[0m proc-macro2 v1.0.105 +Test UNKNOWN STEP 2026-05-12T16:57:53.9008660Z ^[[1m^[[92m Compiling^[[0m unicode-ident v1.0.22 +Test UNKNOWN STEP 2026-05-12T16:57:53.9009317Z ^[[1m^[[92m Compiling^[[0m quote v1.0.43 +Test UNKNOWN STEP 2026-05-12T16:57:53.9566057Z ^[[1m^[[92m Compiling^[[0m find-msvc-tools v0.1.8 +Test UNKNOWN STEP 2026-05-12T16:57:54.0458838Z ^[[1m^[[92m Compiling^[[0m shlex v1.3.0 +Test UNKNOWN STEP 2026-05-12T16:57:54.1563124Z ^[[1m^[[92m Compiling^[[0m cfg-if v1.0.4 +Test UNKNOWN STEP 2026-05-12T16:57:54.1894238Z ^[[1m^[[92m Compiling^[[0m pkg-config v0.3.32 +Test UNKNOWN STEP 2026-05-12T16:57:54.7025118Z ^[[1m^[[92m Compiling^[[0m serde_core v1.0.228 +Test UNKNOWN STEP 2026-05-12T16:57:54.8484094Z ^[[1m^[[92m Compiling^[[0m syn v2.0.114 +Test UNKNOWN STEP 2026-05-12T16:57:54.8527104Z ^[[1m^[[92m Compiling^[[0m stable_deref_trait v1.2.1 +Test UNKNOWN STEP 2026-05-12T16:57:54.8933764Z ^[[1m^[[92m Compiling^[[0m version_check v0.9.5 +Test UNKNOWN STEP 2026-05-12T16:57:54.9944331Z ^[[1m^[[92m Compiling^[[0m jobserver v0.1.34 +Test UNKNOWN STEP 2026-05-12T16:57:55.0234844Z ^[[1m^[[92m Compiling^[[0m typenum v1.19.0 +Test UNKNOWN STEP 2026-05-12T16:57:55.1024253Z ^[[1m^[[92m Compiling^[[0m generic-array v0.14.7 +Test UNKNOWN STEP 2026-05-12T16:57:55.1744159Z ^[[1m^[[92m Compiling^[[0m cc v1.2.53 +Test UNKNOWN STEP 2026-05-12T16:57:56.4923922Z ^[[1m^[[92m Compiling^[[0m litemap v0.8.1 +Test UNKNOWN STEP 2026-05-12T16:57:56.6353903Z ^[[1m^[[92m Compiling^[[0m memchr v2.7.6 +Test UNKNOWN STEP 2026-05-12T16:57:56.6653858Z ^[[1m^[[92m Compiling^[[0m writeable v0.6.2 +Test UNKNOWN STEP 2026-05-12T16:57:56.8253908Z ^[[1m^[[92m Compiling^[[0m bitflags v2.10.0 +Test UNKNOWN STEP 2026-05-12T16:57:57.1553923Z ^[[1m^[[92m Compiling^[[0m crypto-common v0.1.7 +Test UNKNOWN STEP 2026-05-12T16:57:57.2154030Z ^[[1m^[[92m Compiling^[[0m icu_properties_data v2.1.2 +Test UNKNOWN STEP 2026-05-12T16:57:57.2873750Z ^[[1m^[[92m Compiling^[[0m rustix v1.1.3 +Test UNKNOWN STEP 2026-05-12T16:57:57.4723768Z ^[[1m^[[92m Compiling^[[0m getrandom v0.3.4 +Test UNKNOWN STEP 2026-05-12T16:57:57.6283788Z ^[[1m^[[92m Compiling^[[0m subtle v2.6.1 +Test UNKNOWN STEP 2026-05-12T16:57:57.7139768Z ^[[1m^[[92m Compiling^[[0m simd-adler32 v0.3.8 +Test UNKNOWN STEP 2026-05-12T16:57:57.7153069Z ^[[1m^[[92m Compiling^[[0m icu_normalizer_data v2.1.1 +Test UNKNOWN STEP 2026-05-12T16:57:57.7894361Z ^[[1m^[[92m Compiling^[[0m smallvec v1.15.1 +Test UNKNOWN STEP 2026-05-12T16:57:57.9841682Z ^[[1m^[[92m Compiling^[[0m zstd-sys v2.0.16+zstd.1.5.7 +Test UNKNOWN STEP 2026-05-12T16:57:57.9897428Z ^[[1m^[[92m Compiling^[[0m ring v0.17.14 +Test UNKNOWN STEP 2026-05-12T16:57:58.1821736Z ^[[1m^[[92m Compiling^[[0m synstructure v0.13.2 +Test UNKNOWN STEP 2026-05-12T16:57:58.2543979Z ^[[1m^[[92m Compiling^[[0m linux-raw-sys v0.11.0 +Test UNKNOWN STEP 2026-05-12T16:57:58.3164983Z ^[[1m^[[92m Compiling^[[0m log v0.4.29 +Test UNKNOWN STEP 2026-05-12T16:57:58.4934192Z ^[[1m^[[92m Compiling^[[0m adler2 v2.0.1 +Test UNKNOWN STEP 2026-05-12T16:57:58.5754197Z ^[[1m^[[92m Compiling^[[0m crc32fast v1.5.0 +Test UNKNOWN STEP 2026-05-12T16:57:58.6663673Z ^[[1m^[[92m Compiling^[[0m miniz_oxide v0.8.9 +Test UNKNOWN STEP 2026-05-12T16:57:59.7581240Z ^[[1m^[[92m Compiling^[[0m zerofrom-derive v0.1.6 +Test UNKNOWN STEP 2026-05-12T16:58:00.3433720Z ^[[1m^[[92m Compiling^[[0m yoke-derive v0.8.1 +Test UNKNOWN STEP 2026-05-12T16:58:00.8103947Z ^[[1m^[[92m Compiling^[[0m zerofrom v0.1.6 +Test UNKNOWN STEP 2026-05-12T16:58:00.8763918Z ^[[1m^[[92m Compiling^[[0m displaydoc v0.2.5 +Test UNKNOWN STEP 2026-05-12T16:58:01.1383904Z ^[[1m^[[92m Compiling^[[0m yoke v0.8.1 +Test UNKNOWN STEP 2026-05-12T16:58:01.2694229Z ^[[1m^[[92m Compiling^[[0m zerovec-derive v0.11.2 +Test UNKNOWN STEP 2026-05-12T16:58:01.3354869Z ^[[1m^[[92m Compiling^[[0m zeroize_derive v1.4.3 +Test UNKNOWN STEP 2026-05-12T16:58:01.4114307Z ^[[1m^[[92m Compiling^[[0m zerotrie v0.2.3 +Test UNKNOWN STEP 2026-05-12T16:58:01.7333642Z ^[[1m^[[92m Compiling^[[0m zeroize v1.8.2 +Test UNKNOWN STEP 2026-05-12T16:58:01.8393644Z ^[[1m^[[92m Compiling^[[0m rustls-pki-types v1.14.0 +Test UNKNOWN STEP 2026-05-12T16:58:02.1704438Z ^[[1m^[[92m Compiling^[[0m zerovec v0.11.5 +Test UNKNOWN STEP 2026-05-12T16:58:02.7444022Z ^[[1m^[[92m Compiling^[[0m tinystr v0.8.2 +Test UNKNOWN STEP 2026-05-12T16:58:02.8043994Z ^[[1m^[[92m Compiling^[[0m potential_utf v0.1.4 +Test UNKNOWN STEP 2026-05-12T16:58:02.8680688Z ^[[1m^[[92m Compiling^[[0m icu_locale_core v2.1.1 +Test UNKNOWN STEP 2026-05-12T16:58:02.8852121Z ^[[1m^[[92m Compiling^[[0m icu_collections v2.1.1 +Test UNKNOWN STEP 2026-05-12T16:58:03.5803706Z ^[[1m^[[92m Compiling^[[0m icu_provider v2.1.1 +Test UNKNOWN STEP 2026-05-12T16:58:03.8971601Z ^[[1m^[[92m Compiling^[[0m block-buffer v0.10.4 +Test UNKNOWN STEP 2026-05-12T16:58:03.9490011Z ^[[1m^[[92m Compiling^[[0m serde v1.0.228 +Test UNKNOWN STEP 2026-05-12T16:58:04.0720789Z ^[[1m^[[92m Compiling^[[0m zmij v1.0.16 +Test UNKNOWN STEP 2026-05-12T16:58:04.1538432Z ^[[1m^[[92m Compiling^[[0m once_cell v1.21.3 +Test UNKNOWN STEP 2026-05-12T16:58:04.2943786Z ^[[1m^[[92m Compiling^[[0m digest v0.10.7 +Test UNKNOWN STEP 2026-05-12T16:58:04.4365919Z ^[[1m^[[92m Compiling^[[0m icu_normalizer v2.1.1 +Test UNKNOWN STEP 2026-05-12T16:58:05.1905474Z ^[[1m^[[92m Compiling^[[0m icu_properties v2.1.2 +Test UNKNOWN STEP 2026-05-12T16:58:05.6064032Z ^[[1m^[[92m Compiling^[[0m serde_derive v1.0.228 +Test UNKNOWN STEP 2026-05-12T16:58:06.9734621Z ^[[1m^[[92m Compiling^[[0m bzip2-sys v0.1.13+1.0.8 +Test UNKNOWN STEP 2026-05-12T16:58:07.0853907Z ^[[1m^[[92m Compiling^[[0m lzma-sys v0.1.20 +Test UNKNOWN STEP 2026-05-12T16:58:07.3573776Z ^[[1m^[[92m Compiling^[[0m getrandom v0.2.17 +Test UNKNOWN STEP 2026-05-12T16:58:07.5013949Z ^[[1m^[[92m Compiling^[[0m byteorder v1.5.0 +Test UNKNOWN STEP 2026-05-12T16:58:07.6913921Z ^[[1m^[[92m Compiling^[[0m untrusted v0.9.0 +Test UNKNOWN STEP 2026-05-12T16:58:07.7449870Z ^[[1m^[[92m Compiling^[[0m thiserror v2.0.18 +Test UNKNOWN STEP 2026-05-12T16:58:07.8552368Z ^[[1m^[[92m Compiling^[[0m utf8parse v0.2.2 +Test UNKNOWN STEP 2026-05-12T16:58:07.8969723Z ^[[1m^[[92m Compiling^[[0m zstd-safe v7.2.4 +Test UNKNOWN STEP 2026-05-12T16:58:07.9773877Z ^[[1m^[[92m Compiling^[[0m serde_json v1.0.149 +Test UNKNOWN STEP 2026-05-12T16:58:08.0664060Z ^[[1m^[[92m Compiling^[[0m anstyle-parse v0.2.7 +Test UNKNOWN STEP 2026-05-12T16:58:13.8310871Z ^[[1m^[[92m Compiling^[[0m idna_adapter v1.2.1 +Test UNKNOWN STEP 2026-05-12T16:58:14.1673926Z ^[[1m^[[92m Compiling^[[0m thiserror-impl v2.0.18 +Test UNKNOWN STEP 2026-05-12T16:58:14.8612234Z ^[[1m^[[92m Compiling^[[0m inout v0.1.4 +Test UNKNOWN STEP 2026-05-12T16:58:14.9275182Z ^[[1m^[[92m Compiling^[[0m percent-encoding v2.3.2 +Test UNKNOWN STEP 2026-05-12T16:58:15.1081631Z ^[[1m^[[92m Compiling^[[0m crc-catalog v2.4.0 +Test UNKNOWN STEP 2026-05-12T16:58:15.1395082Z ^[[1m^[[92m Compiling^[[0m autocfg v1.5.0 +Test UNKNOWN STEP 2026-05-12T16:58:15.2057262Z ^[[1m^[[92m Compiling^[[0m object v0.37.3 +Test UNKNOWN STEP 2026-05-12T16:58:15.2914212Z ^[[1m^[[92m Compiling^[[0m anstyle-query v1.1.5 +Test UNKNOWN STEP 2026-05-12T16:58:15.3256620Z ^[[1m^[[92m Compiling^[[0m is_terminal_polyfill v1.70.2 +Test UNKNOWN STEP 2026-05-12T16:58:15.3490998Z ^[[1m^[[92m Compiling^[[0m powerfmt v0.2.0 +Test UNKNOWN STEP 2026-05-12T16:58:15.4232092Z ^[[1m^[[92m Compiling^[[0m utf8_iter v1.0.4 +Test UNKNOWN STEP 2026-05-12T16:58:15.5100643Z ^[[1m^[[92m Compiling^[[0m rustix v0.38.44 +Test UNKNOWN STEP 2026-05-12T16:58:15.5133652Z ^[[1m^[[92m Compiling^[[0m colorchoice v1.0.4 +Test UNKNOWN STEP 2026-05-12T16:58:15.5504150Z ^[[1m^[[92m Compiling^[[0m anstyle v1.0.13 +Test UNKNOWN STEP 2026-05-12T16:58:15.6785607Z ^[[1m^[[92m Compiling^[[0m itoa v1.0.17 +Test UNKNOWN STEP 2026-05-12T16:58:15.7285046Z ^[[1m^[[92m Compiling^[[0m cpufeatures v0.2.17 +Test UNKNOWN STEP 2026-05-12T16:58:15.7545402Z ^[[1m^[[92m Compiling^[[0m rustls v0.23.36 +Test UNKNOWN STEP 2026-05-12T16:58:15.8446017Z ^[[1m^[[92m Compiling^[[0m anstream v0.6.21 +Test UNKNOWN STEP 2026-05-12T16:58:16.3037268Z ^[[1m^[[92m Compiling^[[0m idna v1.1.0 +Test UNKNOWN STEP 2026-05-12T16:58:18.5416056Z ^[[1m^[[92m Compiling^[[0m deranged v0.5.5 +Test UNKNOWN STEP 2026-05-12T16:58:18.6574300Z ^[[1m^[[92m Compiling^[[0m num-traits v0.2.19 +Test UNKNOWN STEP 2026-05-12T16:58:18.7626072Z ^[[1m^[[92m Compiling^[[0m crc v3.4.0 +Test UNKNOWN STEP 2026-05-12T16:58:18.9054963Z ^[[1m^[[92m Compiling^[[0m form_urlencoded v1.2.2 +Test UNKNOWN STEP 2026-05-12T16:58:19.0933860Z ^[[1m^[[92m Compiling^[[0m cipher v0.4.4 +Test UNKNOWN STEP 2026-05-12T16:58:19.3131369Z ^[[1m^[[92m Compiling^[[0m rustls-webpki v0.103.9 +Test UNKNOWN STEP 2026-05-12T16:58:19.7011247Z ^[[1m^[[92m Compiling^[[0m flate2 v1.1.8 +Test UNKNOWN STEP 2026-05-12T16:58:20.1184902Z ^[[1m^[[92m Compiling^[[0m hmac v0.12.1 +Test UNKNOWN STEP 2026-05-12T16:58:20.1994232Z ^[[1m^[[92m Compiling^[[0m webpki-roots v1.0.5 +Test UNKNOWN STEP 2026-05-12T16:58:20.2609922Z ^[[1m^[[92m Compiling^[[0m linux-raw-sys v0.4.15 +Test UNKNOWN STEP 2026-05-12T16:58:20.5035902Z ^[[1m^[[92m Compiling^[[0m camino v1.2.2 +Test UNKNOWN STEP 2026-05-12T16:58:20.6417253Z ^[[1m^[[92m Compiling^[[0m anyhow v1.0.100 +Test UNKNOWN STEP 2026-05-12T16:58:20.7810527Z ^[[1m^[[92m Compiling^[[0m zip v2.4.2 +Test UNKNOWN STEP 2026-05-12T16:58:20.8537759Z ^[[1m^[[92m Compiling^[[0m gimli v0.32.3 +Test UNKNOWN STEP 2026-05-12T16:58:21.6904157Z ^[[1m^[[92m Compiling^[[0m hashbrown v0.16.1 +Test UNKNOWN STEP 2026-05-12T16:58:22.0214540Z ^[[1m^[[92m Compiling^[[0m equivalent v1.0.2 +Test UNKNOWN STEP 2026-05-12T16:58:22.0513841Z ^[[1m^[[92m Compiling^[[0m parking_lot_core v0.9.12 +Test UNKNOWN STEP 2026-05-12T16:58:22.1544100Z ^[[1m^[[92m Compiling^[[0m winnow v0.7.14 +Test UNKNOWN STEP 2026-05-12T16:58:22.3512035Z ^[[1m^[[92m Compiling^[[0m num-conv v0.1.0 +Test UNKNOWN STEP 2026-05-12T16:58:22.4373796Z ^[[1m^[[92m Compiling^[[0m bumpalo v3.19.1 +Test UNKNOWN STEP 2026-05-12T16:58:22.6364405Z ^[[1m^[[92m Compiling^[[0m time-core v0.1.7 +Test UNKNOWN STEP 2026-05-12T16:58:22.7254094Z ^[[1m^[[92m Compiling^[[0m time v0.3.45 +Test UNKNOWN STEP 2026-05-12T16:58:23.3214176Z ^[[1m^[[92m Compiling^[[0m addr2line v0.25.1 +Test UNKNOWN STEP 2026-05-12T16:58:23.6953666Z ^[[1m^[[92m Compiling^[[0m zopfli v0.8.3 +Test UNKNOWN STEP 2026-05-12T16:58:24.0104301Z ^[[1m^[[92m Compiling^[[0m toml_parser v1.0.6+spec-1.1.0 +Test UNKNOWN STEP 2026-05-12T16:58:24.0923896Z ^[[1m^[[92m Compiling^[[0m indexmap v2.13.0 +Test UNKNOWN STEP 2026-05-12T16:58:24.9853647Z ^[[1m^[[92m Compiling^[[0m xz2 v0.1.7 +Test UNKNOWN STEP 2026-05-12T16:58:25.5756953Z ^[[1m^[[92m Compiling^[[0m webpki-roots v0.26.11 +Test UNKNOWN STEP 2026-05-12T16:58:25.6056751Z ^[[1m^[[92m Compiling^[[0m pbkdf2 v0.12.2 +Test UNKNOWN STEP 2026-05-12T16:58:25.6745907Z ^[[1m^[[92m Compiling^[[0m bzip2 v0.5.2 +Test UNKNOWN STEP 2026-05-12T16:58:25.8294174Z ^[[1m^[[92m Compiling^[[0m aes v0.8.4 +Test UNKNOWN STEP 2026-05-12T16:58:26.9603835Z ^[[1m^[[92m Compiling^[[0m url v2.5.8 +Test UNKNOWN STEP 2026-05-12T16:58:28.3294266Z ^[[1m^[[92m Compiling^[[0m lzma-rs v0.3.0 +Test UNKNOWN STEP 2026-05-12T16:58:29.6753912Z ^[[1m^[[92m Compiling^[[0m sha1 v0.10.6 +Test UNKNOWN STEP 2026-05-12T16:58:30.1024480Z ^[[1m^[[92m Compiling^[[0m socks v0.3.4 +Test UNKNOWN STEP 2026-05-12T16:58:30.5226556Z ^[[1m^[[92m Compiling^[[0m xattr v1.6.1 +Test UNKNOWN STEP 2026-05-12T16:58:31.0596102Z ^[[1m^[[92m Compiling^[[0m toml_datetime v0.7.5+spec-1.1.0 +Test UNKNOWN STEP 2026-05-12T16:58:31.3636852Z ^[[1m^[[92m Compiling^[[0m serde_spanned v1.0.4 +Test UNKNOWN STEP 2026-05-12T16:58:31.4290814Z ^[[1m^[[92m Compiling^[[0m dirs-sys-next v0.1.2 +Test UNKNOWN STEP 2026-05-12T16:58:31.8508443Z ^[[1m^[[92m Compiling^[[0m filetime v0.2.27 +Test UNKNOWN STEP 2026-05-12T16:58:31.9694120Z ^[[1m^[[92m Compiling^[[0m strsim v0.11.1 +Test UNKNOWN STEP 2026-05-12T16:58:32.8124670Z ^[[1m^[[92m Compiling^[[0m scopeguard v1.2.0 +Test UNKNOWN STEP 2026-05-12T16:58:32.8504351Z ^[[1m^[[92m Compiling^[[0m toml_writer v1.0.6+spec-1.1.0 +Test UNKNOWN STEP 2026-05-12T16:58:32.9753710Z ^[[1m^[[92m Compiling^[[0m fastrand v2.3.0 +Test UNKNOWN STEP 2026-05-12T16:58:33.0343956Z ^[[1m^[[92m Compiling^[[0m heck v0.5.0 +Test UNKNOWN STEP 2026-05-12T16:58:33.1742988Z ^[[1m^[[92m Compiling^[[0m base64 v0.22.1 +Test UNKNOWN STEP 2026-05-12T16:58:33.1771120Z ^[[1m^[[92m Compiling^[[0m clap_lex v0.7.7 +Test UNKNOWN STEP 2026-05-12T16:58:33.4513976Z ^[[1m^[[92m Compiling^[[0m unicode-width v0.2.2 +Test UNKNOWN STEP 2026-05-12T16:58:33.6184185Z ^[[1m^[[92m Compiling^[[0m deflate64 v0.1.10 +Test UNKNOWN STEP 2026-05-12T16:58:33.6524093Z ^[[1m^[[92m Compiling^[[0m constant_time_eq v0.3.1 +Test UNKNOWN STEP 2026-05-12T16:58:33.6990625Z ^[[1m^[[92m Compiling^[[0m rustc-demangle v0.1.27 +Test UNKNOWN STEP 2026-05-12T16:58:34.0779408Z ^[[1m^[[92m Compiling^[[0m backtrace v0.3.76 +Test UNKNOWN STEP 2026-05-12T16:58:34.7693954Z ^[[1m^[[92m Compiling^[[0m console v0.16.2 +Test UNKNOWN STEP 2026-05-12T16:58:36.0254782Z ^[[1m^[[92m Compiling^[[0m ureq v2.12.1 +Test UNKNOWN STEP 2026-05-12T16:58:39.6584495Z ^[[1m^[[92m Compiling^[[0m clap_builder v4.5.54 +Test UNKNOWN STEP 2026-05-12T16:58:41.2644057Z ^[[1m^[[92m Compiling^[[0m zstd v0.13.3 +Test UNKNOWN STEP 2026-05-12T16:58:43.8664033Z ^[[1m^[[92m Compiling^[[0m clap_derive v4.5.49 +Test UNKNOWN STEP 2026-05-12T16:58:45.5443867Z ^[[1m^[[92m Compiling^[[0m tempfile v3.24.0 +Test UNKNOWN STEP 2026-05-12T16:58:45.8969335Z ^[[1m^[[92m Compiling^[[0m toml v0.9.11+spec-1.1.0 +Test UNKNOWN STEP 2026-05-12T16:58:46.4644006Z ^[[1m^[[92m Compiling^[[0m lock_api v0.4.14 +Test UNKNOWN STEP 2026-05-12T16:58:46.6484288Z ^[[1m^[[92m Compiling^[[0m tar v0.4.44 +Test UNKNOWN STEP 2026-05-12T16:58:47.4343774Z ^[[1m^[[92m Compiling^[[0m dirs-next v2.0.0 +Test UNKNOWN STEP 2026-05-12T16:58:48.3473907Z ^[[1m^[[92m Compiling^[[0m fs4 v0.6.6 +Test UNKNOWN STEP 2026-05-12T16:58:49.5843849Z ^[[1m^[[92m Compiling^[[0m uuid v1.19.0 +Test UNKNOWN STEP 2026-05-12T16:58:49.7775421Z ^[[1m^[[92m Compiling^[[0m env_filter v0.1.4 +Test UNKNOWN STEP 2026-05-12T16:58:50.0363892Z ^[[1m^[[92m Compiling^[[0m cargo-platform v0.3.2 +Test UNKNOWN STEP 2026-05-12T16:58:50.4833690Z ^[[1m^[[92m Compiling^[[0m semver v1.0.27 +Test UNKNOWN STEP 2026-05-12T16:58:50.5583826Z ^[[1m^[[92m Compiling^[[0m sysinfo v0.37.2 +Test UNKNOWN STEP 2026-05-12T16:58:50.9404107Z ^[[1m^[[92m Compiling^[[0m same-file v1.0.6 +Test UNKNOWN STEP 2026-05-12T16:58:51.0313894Z ^[[1m^[[92m Compiling^[[0m siphasher v0.3.11 +Test UNKNOWN STEP 2026-05-12T16:58:51.1063711Z ^[[1m^[[92m Compiling^[[0m hex v0.4.3 +Test UNKNOWN STEP 2026-05-12T16:58:51.1704481Z ^[[1m^[[92m Compiling^[[0m shell-words v1.1.1 +Test UNKNOWN STEP 2026-05-12T16:58:51.3477641Z ^[[1m^[[92m Compiling^[[0m is_executable v0.1.2 +Test UNKNOWN STEP 2026-05-12T16:58:51.3555512Z ^[[1m^[[92m Compiling^[[0m iana-time-zone v0.1.64 +Test UNKNOWN STEP 2026-05-12T16:58:51.4043857Z ^[[1m^[[92m Compiling^[[0m env_home v0.1.0 +Test UNKNOWN STEP 2026-05-12T16:58:51.4523852Z ^[[1m^[[92m Compiling^[[0m chrono v0.4.43 +Test UNKNOWN STEP 2026-05-12T16:58:51.7914437Z ^[[1m^[[92m Compiling^[[0m which v8.0.0 +Test UNKNOWN STEP 2026-05-12T16:58:52.1769011Z ^[[1m^[[92m Compiling^[[0m binary-install v0.4.1 +Test UNKNOWN STEP 2026-05-12T16:58:52.1813338Z ^[[1m^[[92m Compiling^[[0m dialoguer v0.12.0 +Test UNKNOWN STEP 2026-05-12T16:58:54.1354255Z ^[[1m^[[92m Compiling^[[0m human-panic v2.0.6 +Test UNKNOWN STEP 2026-05-12T16:58:54.3804069Z ^[[1m^[[92m Compiling^[[0m walkdir v2.5.0 +Test UNKNOWN STEP 2026-05-12T16:58:54.7804114Z ^[[1m^[[92m Compiling^[[0m cargo_metadata v0.23.1 +Test UNKNOWN STEP 2026-05-12T16:58:54.9874154Z ^[[1m^[[92m Compiling^[[0m env_logger v0.11.8 +Test UNKNOWN STEP 2026-05-12T16:58:55.1654286Z ^[[1m^[[92m Compiling^[[0m parking_lot v0.12.5 +Test UNKNOWN STEP 2026-05-12T16:58:55.4367984Z ^[[1m^[[92m Compiling^[[0m clap v4.5.54 +Test UNKNOWN STEP 2026-05-12T16:58:55.4714065Z ^[[1m^[[92m Compiling^[[0m serde_ignored v0.1.14 +Test UNKNOWN STEP 2026-05-12T16:58:55.5883919Z ^[[1m^[[92m Compiling^[[0m siphasher v1.0.1 +Test UNKNOWN STEP 2026-05-12T16:58:55.6319044Z ^[[1m^[[92m Compiling^[[0m glob v0.3.3 +Test UNKNOWN STEP 2026-05-12T16:58:55.7394112Z ^[[1m^[[92m Compiling^[[0m path-clean v1.0.1 +Test UNKNOWN STEP 2026-05-12T16:58:55.9759030Z ^[[1m^[[92m Compiling^[[0m wasm-pack v0.14.0 +Test UNKNOWN STEP 2026-05-12T16:59:03.2701866Z ^[[1m^[[92m Finished^[[0m `release` profile [optimized] target(s) in 1m 11s +Test UNKNOWN STEP 2026-05-12T16:59:03.2876493Z ^[[1m^[[92m Installing^[[0m /home/runner/.cargo/bin/wasm-pack +Test UNKNOWN STEP 2026-05-12T16:59:03.2877687Z ^[[1m^[[92m Installed^[[0m package `wasm-pack v0.14.0` (executable `wasm-pack`) +Test UNKNOWN STEP 2026-05-12T16:59:03.3882694Z ##[group]Run actions/setup-node@v4 +Test UNKNOWN STEP 2026-05-12T16:59:03.3882973Z with: +Test UNKNOWN STEP 2026-05-12T16:59:03.3883151Z node-version: 20.x +Test UNKNOWN STEP 2026-05-12T16:59:03.3883359Z cache: npm +Test UNKNOWN STEP 2026-05-12T16:59:03.3883569Z cache-dependency-path: js/package-lock.json +Test UNKNOWN STEP 2026-05-12T16:59:03.3883849Z always-auth: false +Test UNKNOWN STEP 2026-05-12T16:59:03.3884037Z check-latest: false +Test UNKNOWN STEP 2026-05-12T16:59:03.3884387Z token: *** +Test UNKNOWN STEP 2026-05-12T16:59:03.3884562Z env: +Test UNKNOWN STEP 2026-05-12T16:59:03.3884731Z CARGO_HOME: /home/runner/.cargo +Test UNKNOWN STEP 2026-05-12T16:59:03.3884971Z CARGO_INCREMENTAL: 0 +Test UNKNOWN STEP 2026-05-12T16:59:03.3885169Z CARGO_TERM_COLOR: always +Test UNKNOWN STEP 2026-05-12T16:59:03.3885373Z ##[endgroup] +Test UNKNOWN STEP 2026-05-12T16:59:03.5692924Z Found in cache @ /opt/hostedtoolcache/node/20.20.2/x64 +Test UNKNOWN STEP 2026-05-12T16:59:03.5699210Z ##[group]Environment details +Test UNKNOWN STEP 2026-05-12T16:59:03.8474349Z node: v20.20.2 +Test UNKNOWN STEP 2026-05-12T16:59:03.8474731Z npm: 10.8.2 +Test UNKNOWN STEP 2026-05-12T16:59:03.8475008Z yarn: 1.22.22 +Test UNKNOWN STEP 2026-05-12T16:59:03.8475761Z ##[endgroup] +Test UNKNOWN STEP 2026-05-12T16:59:03.8501876Z [command]/opt/hostedtoolcache/node/20.20.2/x64/bin/npm config get cache +Test UNKNOWN STEP 2026-05-12T16:59:03.9690477Z /home/runner/.npm +Test UNKNOWN STEP 2026-05-12T16:59:04.0747137Z Cache hit for: node-cache-Linux-x64-npm-d315d8b9cf81d047cf497bbcc55d1d84ab2bcc1d591d7e669c7aa9738b286549 +Test UNKNOWN STEP 2026-05-12T16:59:04.3006699Z Received 19427037 of 19427037 (100.0%), 101.8 MBs/sec +Test UNKNOWN STEP 2026-05-12T16:59:04.3007399Z Cache Size: ~19 MB (19427037 B) +Test UNKNOWN STEP 2026-05-12T16:59:04.3041119Z [command]/usr/bin/tar -xf /home/runner/work/_temp/9f20bcae-d2d1-4cbb-ab63-9c6202547243/cache.tzst -P -C /home/runner/work/link-cli/link-cli --use-compress-program unzstd +Test UNKNOWN STEP 2026-05-12T16:59:04.3367929Z Cache restored successfully +Test UNKNOWN STEP 2026-05-12T16:59:04.3382122Z Cache restored from key: node-cache-Linux-x64-npm-d315d8b9cf81d047cf497bbcc55d1d84ab2bcc1d591d7e669c7aa9738b286549 +Test UNKNOWN STEP 2026-05-12T16:59:04.4087692Z ##[group]Run actions/cache@v4 +Test UNKNOWN STEP 2026-05-12T16:59:04.4087968Z with: +Test UNKNOWN STEP 2026-05-12T16:59:04.4088260Z path: ~/.cargo/registry +Test UNKNOWN STEP ~/.cargo/git +Test UNKNOWN STEP rust/target +Test UNKNOWN STEP rust/wasm/target +Test UNKNOWN STEP +Test UNKNOWN STEP 2026-05-12T16:59:04.4088789Z key: Linux-wasm-cargo-22376137081c5ebc35abde90b3a80a6689287fd12d6f0ceea94e66b1d419e921 +Test UNKNOWN STEP 2026-05-12T16:59:04.4089254Z restore-keys: Linux-wasm-cargo- +Test UNKNOWN STEP +Test UNKNOWN STEP 2026-05-12T16:59:04.4089517Z enableCrossOsArchive: false +Test UNKNOWN STEP 2026-05-12T16:59:04.4089929Z fail-on-cache-miss: false +Test UNKNOWN STEP 2026-05-12T16:59:04.4090156Z lookup-only: false +Test UNKNOWN STEP 2026-05-12T16:59:04.4090355Z save-always: false +Test UNKNOWN STEP 2026-05-12T16:59:04.4090535Z env: +Test UNKNOWN STEP 2026-05-12T16:59:04.4090713Z CARGO_HOME: /home/runner/.cargo +Test UNKNOWN STEP 2026-05-12T16:59:04.4090949Z CARGO_INCREMENTAL: 0 +Test UNKNOWN STEP 2026-05-12T16:59:04.4091154Z CARGO_TERM_COLOR: always +Test UNKNOWN STEP 2026-05-12T16:59:04.4091356Z ##[endgroup] +Test UNKNOWN STEP 2026-05-12T16:59:04.6213845Z Cache hit for: Linux-wasm-cargo-22376137081c5ebc35abde90b3a80a6689287fd12d6f0ceea94e66b1d419e921 +Test UNKNOWN STEP 2026-05-12T16:59:05.6791273Z Received 180355072 of 364861180 (49.4%), 172.0 MBs/sec +Test UNKNOWN STEP 2026-05-12T16:59:06.3276042Z Received 364861180 of 364861180 (100.0%), 211.7 MBs/sec +Test UNKNOWN STEP 2026-05-12T16:59:06.3276925Z Cache Size: ~348 MB (364861180 B) +Test UNKNOWN STEP 2026-05-12T16:59:06.3330338Z [command]/usr/bin/tar -xf /home/runner/work/_temp/54fb3021-8f29-4754-aaaf-3f5a7adae6ed/cache.tzst -P -C /home/runner/work/link-cli/link-cli --use-compress-program unzstd +Test UNKNOWN STEP 2026-05-12T16:59:09.1781424Z Cache restored successfully +Test UNKNOWN STEP 2026-05-12T16:59:09.2023584Z Cache restored from key: Linux-wasm-cargo-22376137081c5ebc35abde90b3a80a6689287fd12d6f0ceea94e66b1d419e921 +Test UNKNOWN STEP 2026-05-12T16:59:09.2140909Z ##[group]Run npm ci +Test UNKNOWN STEP 2026-05-12T16:59:09.2141167Z ^[[36;1mnpm ci^[[0m +Test UNKNOWN STEP 2026-05-12T16:59:09.4775794Z shell: /usr/bin/bash -e {0} +Test UNKNOWN STEP 2026-05-12T16:59:09.4776200Z env: +Test UNKNOWN STEP 2026-05-12T16:59:09.4776522Z CARGO_HOME: /home/runner/.cargo +Test UNKNOWN STEP 2026-05-12T16:59:09.4776953Z CARGO_INCREMENTAL: 0 +Test UNKNOWN STEP 2026-05-12T16:59:09.4777322Z CARGO_TERM_COLOR: always +Test UNKNOWN STEP 2026-05-12T16:59:09.4777686Z ##[endgroup] +Test UNKNOWN STEP 2026-05-12T16:59:11.4160249Z +Test UNKNOWN STEP 2026-05-12T16:59:11.4161051Z added 23 packages, and audited 24 packages in 2s +Test UNKNOWN STEP 2026-05-12T16:59:11.4161372Z +Test UNKNOWN STEP 2026-05-12T16:59:11.4161540Z 8 packages are looking for funding +Test UNKNOWN STEP 2026-05-12T16:59:11.4161847Z run `npm fund` for details +Test UNKNOWN STEP 2026-05-12T16:59:11.4171916Z +Test UNKNOWN STEP 2026-05-12T16:59:11.4172688Z found 0 vulnerabilities +Test UNKNOWN STEP 2026-05-12T16:59:11.4346569Z ##[group]Run cargo test --manifest-path rust/Cargo.toml --all-features +Test UNKNOWN STEP 2026-05-12T16:59:11.4347078Z ^[[36;1mcargo test --manifest-path rust/Cargo.toml --all-features^[[0m +Test UNKNOWN STEP 2026-05-12T16:59:11.4370298Z shell: /usr/bin/bash -e {0} +Test UNKNOWN STEP 2026-05-12T16:59:11.4370547Z env: +Test UNKNOWN STEP 2026-05-12T16:59:11.4370734Z CARGO_HOME: /home/runner/.cargo +Test UNKNOWN STEP 2026-05-12T16:59:11.4370992Z CARGO_INCREMENTAL: 0 +Test UNKNOWN STEP 2026-05-12T16:59:11.4371213Z CARGO_TERM_COLOR: always +Test UNKNOWN STEP 2026-05-12T16:59:11.4371435Z ##[endgroup] +Test UNKNOWN STEP 2026-05-12T16:59:11.5328326Z ^[[1m^[[92m Compiling^[[0m link-cli v0.1.0 (/home/runner/work/link-cli/link-cli/rust) +Test UNKNOWN STEP 2026-05-12T16:59:14.2502934Z ^[[1m^[[92m Finished^[[0m `test` profile [unoptimized + debuginfo] target(s) in 2.80s +Test UNKNOWN STEP 2026-05-12T16:59:14.2553938Z ^[[1m^[[92m Running^[[0m unittests src/lib.rs (rust/target/debug/deps/link_cli-d340ce7e6e4e80f5) +Test UNKNOWN STEP 2026-05-12T16:59:14.2567406Z +Test UNKNOWN STEP 2026-05-12T16:59:14.2567622Z running 0 tests +Test UNKNOWN STEP 2026-05-12T16:59:14.2567864Z +Test UNKNOWN STEP 2026-05-12T16:59:14.2568807Z test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s +Test UNKNOWN STEP 2026-05-12T16:59:14.2569418Z +Test UNKNOWN STEP 2026-05-12T16:59:14.2570626Z ^[[1m^[[92m Running^[[0m unittests src/main.rs (rust/target/debug/deps/clink-8b57485f3e6bc6de) +Test UNKNOWN STEP 2026-05-12T16:59:14.2579078Z +Test UNKNOWN STEP 2026-05-12T16:59:14.2579277Z running 0 tests +Test UNKNOWN STEP 2026-05-12T16:59:14.2579578Z +Test UNKNOWN STEP 2026-05-12T16:59:14.2580219Z test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s +Test UNKNOWN STEP 2026-05-12T16:59:14.2580674Z +Test UNKNOWN STEP 2026-05-12T16:59:14.2582364Z ^[[1m^[[92m Running^[[0m tests/changes_simplifier_tests.rs (rust/target/debug/deps/changes_simplifier_tests-f35e7109178f8287) +Test UNKNOWN STEP 2026-05-12T16:59:14.2590611Z +Test UNKNOWN STEP 2026-05-12T16:59:14.2590788Z running 9 tests +Test UNKNOWN STEP 2026-05-12T16:59:14.2595429Z test test_simplify_empty ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.2597205Z test test_simplify_chain ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.2597931Z test test_simplify_issue26_update_operation ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.2598684Z test test_simplify_issue26_alternative_scenario ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.2599537Z test test_simplify_keeps_unchanged_states ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.2600358Z test test_simplify_multiple_branches_from_same_initial ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.2601386Z test test_simplify_with_unchanged ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.2602014Z test test_simplify_specific_example_removes_intermediate_states ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.2603029Z test test_simplify_no_op ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.2604511Z ^[[1m^[[92m Running^[[0m tests/cli_arguments_tests.rs (rust/target/debug/deps/cli_arguments_tests-5690f63b1f5ebd41) +Test UNKNOWN STEP 2026-05-12T16:59:14.2604964Z +Test UNKNOWN STEP 2026-05-12T16:59:14.2605323Z test result: ok. 9 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s +Test UNKNOWN STEP 2026-05-12T16:59:14.2605689Z +Test UNKNOWN STEP 2026-05-12T16:59:14.2615385Z +Test UNKNOWN STEP 2026-05-12T16:59:14.2615600Z running 7 tests +Test UNKNOWN STEP 2026-05-12T16:59:14.2620422Z test parses_csharp_option_aliases_without_direct_clap_dependency ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.2621531Z test parses_export_alias_as_lino_output_path ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.2622947Z test parses_inline_alias_values_and_boolean_values ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.2623857Z test parses_inline_export_alias_as_lino_output_path ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.2624943Z test query_option_takes_precedence_over_positional_query ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.2626713Z ^[[1m^[[92m Running^[[0m tests/cli_export_tests.rs (rust/target/debug/deps/cli_export_tests-3c6cb20a58ca35ef) +Test UNKNOWN STEP 2026-05-12T16:59:14.2627854Z test rejects_extra_positional_queries ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.2628578Z test returns_help_and_version_commands ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.2628965Z +Test UNKNOWN STEP 2026-05-12T16:59:14.2629642Z test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s +Test UNKNOWN STEP 2026-05-12T16:59:14.2630303Z +Test UNKNOWN STEP 2026-05-12T16:59:14.2635716Z +Test UNKNOWN STEP 2026-05-12T16:59:14.2636052Z running 3 tests +Test UNKNOWN STEP 2026-05-12T16:59:14.2670043Z test export_alias_writes_numbered_references ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.2710410Z test export_alias_writes_named_references ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.2714599Z test structure_option_renders_left_branch_with_indexes ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.2715563Z +Test UNKNOWN STEP 2026-05-12T16:59:14.2716250Z test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s +Test UNKNOWN STEP 2026-05-12T16:59:14.2716885Z +Test UNKNOWN STEP 2026-05-12T16:59:14.2717856Z ^[[1m^[[92m Running^[[0m tests/cli_import_tests.rs (rust/target/debug/deps/cli_import_tests-0620bb8ff1891745) +Test UNKNOWN STEP 2026-05-12T16:59:14.2725323Z +Test UNKNOWN STEP 2026-05-12T16:59:14.2725536Z running 1 test +Test UNKNOWN STEP 2026-05-12T16:59:14.2754072Z test import_option_reads_numbered_lino_file ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.2754338Z +Test UNKNOWN STEP 2026-05-12T16:59:14.2754727Z test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s +Test UNKNOWN STEP 2026-05-12T16:59:14.2755081Z +Test UNKNOWN STEP 2026-05-12T16:59:14.2756819Z ^[[1m^[[92m Running^[[0m tests/cli_named_types_tests.rs (rust/target/debug/deps/cli_named_types_tests-f8e3161a20dbda82) +Test UNKNOWN STEP 2026-05-12T16:59:14.2765530Z +Test UNKNOWN STEP 2026-05-12T16:59:14.2765690Z running 1 test +Test UNKNOWN STEP 2026-05-12T16:59:14.2830608Z test cli_stores_string_aliases_in_separate_names_database ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.2831089Z +Test UNKNOWN STEP 2026-05-12T16:59:14.2831687Z test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s +Test UNKNOWN STEP 2026-05-12T16:59:14.2832320Z +Test UNKNOWN STEP 2026-05-12T16:59:14.2833579Z ^[[1m^[[92m Running^[[0m tests/dependency_basis_tests.rs (rust/target/debug/deps/dependency_basis_tests-1921d0e4c0044681) +Test UNKNOWN STEP 2026-05-12T16:59:14.2841104Z +Test UNKNOWN STEP 2026-05-12T16:59:14.2841294Z running 2 tests +Test UNKNOWN STEP 2026-05-12T16:59:14.2844226Z test rust_manifest_declares_required_basis_crates ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.2844787Z test rust_manifest_uses_lino_arguments_without_direct_clap_dependency ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.2845114Z +Test UNKNOWN STEP 2026-05-12T16:59:14.2845645Z test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s +Test UNKNOWN STEP 2026-05-12T16:59:14.2846275Z +Test UNKNOWN STEP 2026-05-12T16:59:14.2847251Z ^[[1m^[[92m Running^[[0m tests/issue62_review_coverage_tests.rs (rust/target/debug/deps/issue62_review_coverage_tests-3ca90576ef123594) +Test UNKNOWN STEP 2026-05-12T16:59:14.2855704Z +Test UNKNOWN STEP 2026-05-12T16:59:14.2855868Z running 4 tests +Test UNKNOWN STEP 2026-05-12T16:59:14.2860397Z test pinned_types_take_types_is_finite_and_deterministic ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.2861753Z test unsupported_any_reference_is_rejected_without_placeholder_creation ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.2868518Z test named_link_create_delete_recreate_clears_stale_name_mapping ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.2869658Z test explicit_numeric_id_update_can_be_reversed_with_another_update ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.2870254Z +Test UNKNOWN STEP 2026-05-12T16:59:14.2870644Z test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s +Test UNKNOWN STEP 2026-05-12T16:59:14.2871260Z +Test UNKNOWN STEP 2026-05-12T16:59:14.2872072Z ^[[1m^[[92m Running^[[0m tests/link_storage_tests.rs (rust/target/debug/deps/link_storage_tests-4a62457bb635dc13) +Test UNKNOWN STEP 2026-05-12T16:59:14.2880315Z +Test UNKNOWN STEP 2026-05-12T16:59:14.2880496Z running 14 tests +Test UNKNOWN STEP 2026-05-12T16:59:14.2885571Z test test_format_structure_renders_left_branch_with_link_indexes ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.2887030Z test test_format_structure_renders_repeated_source_and_target_as_reference_on_right ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.2888417Z test test_lino_lines_escape_names_that_need_quoting ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.2889950Z test test_lino_lines_select_quote_style_for_names_containing_quotes ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.2894833Z test test_lino_lines_use_names_for_indexes_sources_and_targets ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.2895683Z test test_lino_lines_use_numbered_references_without_names ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.2896111Z test test_storage_create ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.2896657Z test test_storage_delete ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.2897207Z test test_storage_get_or_create ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.2897751Z test test_storage_search ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.2898258Z test test_storage_named_links ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.2898658Z test test_storage_update ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.2898968Z test test_storage_persistence ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.2899380Z test test_write_lino_output_writes_complete_database ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.2899637Z +Test UNKNOWN STEP 2026-05-12T16:59:14.2899992Z test result: ok. 14 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s +Test UNKNOWN STEP 2026-05-12T16:59:14.2900536Z +Test UNKNOWN STEP 2026-05-12T16:59:14.2902044Z ^[[1m^[[92m Running^[[0m tests/link_tests.rs (rust/target/debug/deps/link_tests-cf6e058bd79f1c62) +Test UNKNOWN STEP 2026-05-12T16:59:14.2911035Z +Test UNKNOWN STEP 2026-05-12T16:59:14.2911222Z running 5 tests +Test UNKNOWN STEP 2026-05-12T16:59:14.2914786Z test test_link_creation ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.2915107Z test test_link_format ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.2915417Z test test_link_is_full_point ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.2915720Z test test_link_is_null ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.2917146Z test test_link_round_trips_through_doublets_link ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.2917568Z +Test UNKNOWN STEP 2026-05-12T16:59:14.2918030Z test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s +Test UNKNOWN STEP 2026-05-12T16:59:14.2918382Z +Test UNKNOWN STEP 2026-05-12T16:59:14.2919537Z ^[[1m^[[92m Running^[[0m tests/lino_database_input_tests.rs (rust/target/debug/deps/lino_database_input_tests-3adf26a5fcbf9b34) +Test UNKNOWN STEP 2026-05-12T16:59:14.2928950Z +Test UNKNOWN STEP 2026-05-12T16:59:14.2929147Z running 3 tests +Test UNKNOWN STEP 2026-05-12T16:59:14.2934402Z test import_lino_text_creates_named_references_as_point_links ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.2935231Z test import_lino_text_treats_out_of_range_numbers_as_names ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.2935799Z test import_lino_text_reproduces_numbered_links_at_explicit_indexes ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.2936213Z +Test UNKNOWN STEP 2026-05-12T16:59:14.2936691Z test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s +Test UNKNOWN STEP 2026-05-12T16:59:14.2937074Z +Test UNKNOWN STEP 2026-05-12T16:59:14.2938074Z ^[[1m^[[92m Running^[[0m tests/lino_link_tests.rs (rust/target/debug/deps/lino_link_tests-e5cad6c0a3a54635) +Test UNKNOWN STEP 2026-05-12T16:59:14.2945843Z +Test UNKNOWN STEP 2026-05-12T16:59:14.2946024Z running 5 tests +Test UNKNOWN STEP 2026-05-12T16:59:14.2949543Z test test_lino_link_is_numeric ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.2950039Z test test_lino_link_is_variable ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.2950494Z test test_lino_link_is_wildcard ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.2950865Z test test_lino_link_new ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.2951245Z test test_lino_link_with_values ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.2951490Z +Test UNKNOWN STEP 2026-05-12T16:59:14.2952126Z test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s +Test UNKNOWN STEP 2026-05-12T16:59:14.2953069Z +Test UNKNOWN STEP 2026-05-12T16:59:14.2954298Z ^[[1m^[[92m Running^[[0m tests/named_types_decorator_tests.rs (rust/target/debug/deps/named_types_decorator_tests-6ec4446ce107270b) +Test UNKNOWN STEP 2026-05-12T16:59:14.2962193Z +Test UNKNOWN STEP 2026-05-12T16:59:14.2962388Z running 7 tests +Test UNKNOWN STEP 2026-05-12T16:59:14.2981390Z test default_names_database_path_matches_csharp_convention ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.2988141Z test decorator_includes_pinned_types_decorator ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.2989248Z test decorator_exposes_link_storage_operations_and_named_types ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.2990295Z test decorator_can_be_built_from_existing_link_storages ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.2991250Z test delete_removes_associated_name_from_names_database ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.3004585Z test setting_second_name_replaces_first_name ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.3009733Z test reassigning_existing_name_moves_name_to_new_link ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.3010210Z +Test UNKNOWN STEP 2026-05-12T16:59:14.3010896Z test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s +Test UNKNOWN STEP 2026-05-12T16:59:14.3011523Z +Test UNKNOWN STEP 2026-05-12T16:59:14.3012937Z ^[[1m^[[92m Running^[[0m tests/parser_tests.rs (rust/target/debug/deps/parser_tests-77b3e71c374cfc5a) +Test UNKNOWN STEP 2026-05-12T16:59:14.3021123Z +Test UNKNOWN STEP 2026-05-12T16:59:14.3021266Z running 8 tests +Test UNKNOWN STEP 2026-05-12T16:59:14.3025587Z test test_parse_empty ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.3026636Z test test_parse_nested_link ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.3027575Z test test_parse_links_notation_backtick_unicode_identifier ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.3030045Z test test_parse_query_format ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.3030650Z test test_parse_simple_link ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.3031069Z test test_parse_variable ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.3031385Z test test_parse_link_with_id ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.3031736Z test test_parse_wildcard ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.3031907Z +Test UNKNOWN STEP 2026-05-12T16:59:14.3032700Z test result: ok. 8 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s +Test UNKNOWN STEP 2026-05-12T16:59:14.3033350Z +Test UNKNOWN STEP 2026-05-12T16:59:14.3034236Z ^[[1m^[[92m Running^[[0m tests/pinned_types_decorator_tests.rs (rust/target/debug/deps/pinned_types_decorator_tests-2be8a182e5134711) +Test UNKNOWN STEP 2026-05-12T16:59:14.3041855Z +Test UNKNOWN STEP 2026-05-12T16:59:14.3041987Z running 3 tests +Test UNKNOWN STEP 2026-05-12T16:59:14.3046884Z test decorator_exposes_link_storage_operations_and_pinned_types ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.3047935Z test decorator_supports_triplet_deconstruction_parity ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.3048760Z test decorator_rejects_unexpected_link_shape_at_reserved_address ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.3049271Z +Test UNKNOWN STEP 2026-05-12T16:59:14.3049910Z test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s +Test UNKNOWN STEP 2026-05-12T16:59:14.3050396Z +Test UNKNOWN STEP 2026-05-12T16:59:14.3051212Z ^[[1m^[[92m Running^[[0m tests/query_processor_csharp_parity_tests.rs (rust/target/debug/deps/query_processor_csharp_parity_tests-e891656cc1b18e2a) +Test UNKNOWN STEP 2026-05-12T16:59:14.3058918Z +Test UNKNOWN STEP 2026-05-12T16:59:14.3059107Z running 15 tests +Test UNKNOWN STEP 2026-05-12T16:59:14.3068359Z test test_create_explicit_index_after_gap_matches_csharp ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.3069452Z test test_create_deep_nested_numeric_links_matches_csharp ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.3083487Z test test_delete_all_by_index_wildcard_matches_csharp ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.3088228Z test test_issue_20_substitute_full_point_with_unbound_parts_matches_csharp ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.3103830Z test test_delete_by_source_target_pattern_matches_csharp ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.3133523Z test test_delete_by_wildcard_target_matches_csharp ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.3163491Z test test_issue_20_substitute_matched_link_and_outgoing_link_matches_csharp ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.3167129Z test test_no_op_variable_query_returns_matched_changes ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.3193576Z test test_delete_by_names_keeps_leaf_names_matches_csharp ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.3223340Z test test_swap_all_links_using_variables_matches_csharp ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.3224360Z test test_string_composite_left_child_does_not_create_extra_leaf ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.3225254Z test test_unwrapped_create_query_matches_csharp ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.3233984Z test test_string_aliases_in_variable_restriction_constrain_matches_to_named_links_matches_csharp ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.3244388Z test test_named_link_rename_matches_csharp ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.3252751Z test test_unknown_named_restriction_fails_without_auto_create ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.3253274Z +Test UNKNOWN STEP 2026-05-12T16:59:14.3253765Z test result: ok. 15 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s +Test UNKNOWN STEP 2026-05-12T16:59:14.3254133Z +Test UNKNOWN STEP 2026-05-12T16:59:14.3255407Z ^[[1m^[[92m Running^[[0m tests/query_processor_tests.rs (rust/target/debug/deps/query_processor_tests-fcc4222298464831) +Test UNKNOWN STEP 2026-05-12T16:59:14.3265010Z +Test UNKNOWN STEP 2026-05-12T16:59:14.3265205Z running 15 tests +Test UNKNOWN STEP 2026-05-12T16:59:14.3274369Z test test_auto_create_missing_numeric_reference_creates_point_link ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.3275197Z test test_auto_create_missing_named_references_creates_point_links ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.3279340Z test test_deduplicate_duplicate_pair_with_named_links ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.3280187Z test test_auto_create_missing_numeric_reference_fills_existing_gap ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.3280747Z test test_deduplicate_duplicate_pair_with_numeric_links ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.3287658Z test test_deduplicate_mixed_named_and_numeric ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.3289701Z test test_deduplicate_nested_duplicates ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.3290566Z test test_deduplicate_named_links_multiple_queries ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.3291420Z test test_deduplicate_triple_duplicate_pair ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.3293164Z test test_missing_named_reference_fails_without_auto_create ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.3296518Z test test_deduplicate_with_different_pairs ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.3297337Z test test_query_processor_empty ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.3298286Z test test_missing_numeric_reference_fails_without_auto_create ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.3299254Z test test_query_processor_create ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.3299804Z test test_future_numeric_references_succeed_without_auto_create ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.3300192Z +Test UNKNOWN STEP 2026-05-12T16:59:14.3300865Z test result: ok. 15 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s +Test UNKNOWN STEP 2026-05-12T16:59:14.3301508Z +Test UNKNOWN STEP 2026-05-12T16:59:14.3302325Z ^[[1m^[[92m Running^[[0m tests/unicode_sequence_converter_tests.rs (rust/target/debug/deps/unicode_sequence_converter_tests-dbca84dd88aaca3a) +Test UNKNOWN STEP 2026-05-12T16:59:14.3310323Z +Test UNKNOWN STEP 2026-05-12T16:59:14.3310512Z running 5 tests +Test UNKNOWN STEP 2026-05-12T16:59:14.3314841Z test caching_converter_decorator_reuses_cached_values ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.3315935Z test balanced_variant_and_right_sequence_walker_preserve_symbol_order ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.3317100Z test raw_number_converters_match_hybrid_external_reference_encoding ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.3318197Z test target_and_char_symbol_converters_create_and_decode_symbols ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.3319118Z test string_and_unicode_sequence_converters_round_trip_utf16_text ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.3319455Z +Test UNKNOWN STEP 2026-05-12T16:59:14.3319819Z test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s +Test UNKNOWN STEP 2026-05-12T16:59:14.3320166Z +Test UNKNOWN STEP 2026-05-12T16:59:14.3322178Z ^[[1m^[[92m Running^[[0m tests/unicode_string_storage_tests.rs (rust/target/debug/deps/unicode_string_storage_tests-3c8ce74330d9f074) +Test UNKNOWN STEP 2026-05-12T16:59:14.3330714Z +Test UNKNOWN STEP 2026-05-12T16:59:14.3330903Z running 11 tests +Test UNKNOWN STEP 2026-05-12T16:59:14.3338210Z test create_and_retrieve_empty_string ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.3339105Z test create_and_retrieve_simple_string ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.3339935Z test create_and_retrieve_multiple_strings ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.3345650Z test create_and_retrieve_user_defined_type ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.3352176Z test name_external_reference_matches_csharp_hybrid_encoding ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.3353694Z test create_and_retrieve_unicode_string_as_utf16_sequence ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.3354624Z test name_is_removed_when_external_reference_is_deleted ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.3355540Z test deleting_non_named_link_does_not_affect_other_names ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.3356336Z test name_is_removed_when_link_is_deleted ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.3357389Z test named_links_facade_matches_csharp_named_links_role ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.3359583Z test pinned_types_are_created_and_named ... ok +Test UNKNOWN STEP 2026-05-12T16:59:14.3359965Z +Test UNKNOWN STEP 2026-05-12T16:59:14.3360485Z test result: ok. 11 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s +Test UNKNOWN STEP 2026-05-12T16:59:14.3360856Z +Test UNKNOWN STEP 2026-05-12T16:59:14.3361568Z ^[[1m^[[92m Doc-tests^[[0m link_cli +Test UNKNOWN STEP 2026-05-12T16:59:14.3810557Z +Test UNKNOWN STEP 2026-05-12T16:59:14.3811045Z running 0 tests +Test UNKNOWN STEP 2026-05-12T16:59:14.3811323Z +Test UNKNOWN STEP 2026-05-12T16:59:14.3811862Z test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s +Test UNKNOWN STEP 2026-05-12T16:59:14.3812225Z +Test UNKNOWN STEP 2026-05-12T16:59:14.3888827Z ##[group]Run npm run test:wasm +Test UNKNOWN STEP 2026-05-12T16:59:14.3889119Z ^[[36;1mnpm run test:wasm^[[0m +Test UNKNOWN STEP 2026-05-12T16:59:14.3910478Z shell: /usr/bin/bash -e {0} +Test UNKNOWN STEP 2026-05-12T16:59:14.3910722Z env: +Test UNKNOWN STEP 2026-05-12T16:59:14.3910908Z CARGO_HOME: /home/runner/.cargo +Test UNKNOWN STEP 2026-05-12T16:59:14.3911163Z CARGO_INCREMENTAL: 0 +Test UNKNOWN STEP 2026-05-12T16:59:14.3911388Z CARGO_TERM_COLOR: always +Test UNKNOWN STEP 2026-05-12T16:59:14.3911606Z ##[endgroup] +Test UNKNOWN STEP 2026-05-12T16:59:14.5098968Z +Test UNKNOWN STEP 2026-05-12T16:59:14.5099294Z > link-cli-web@2.3.0 test:wasm +Test UNKNOWN STEP 2026-05-12T16:59:14.5099858Z > wasm-pack test --node ../rust/wasm +Test UNKNOWN STEP 2026-05-12T16:59:14.5100104Z +Test UNKNOWN STEP 2026-05-12T16:59:15.1622297Z [INFO]: 🎯 Checking for the Wasm target... +Test UNKNOWN STEP 2026-05-12T16:59:15.2683413Z ^[[1m^[[92m Compiling^[[0m link-cli v0.1.0 (/home/runner/work/link-cli/link-cli/rust) +Test UNKNOWN STEP 2026-05-12T16:59:15.8820938Z ^[[1m^[[92m Compiling^[[0m clink-wasm v2.3.0 (/home/runner/work/link-cli/link-cli/rust/wasm) +Test UNKNOWN STEP 2026-05-12T16:59:16.7851141Z ^[[1m^[[92m Finished^[[0m `dev` profile [unoptimized + debuginfo] target(s) in 1.58s +Test UNKNOWN STEP 2026-05-12T16:59:16.7940198Z [INFO]: ⬇️ Installing wasm-bindgen... +Test UNKNOWN STEP 2026-05-12T16:59:17.1344904Z ^[[1m^[[92m Finished^[[0m `test` profile [unoptimized + debuginfo] target(s) in 0.06s +Test UNKNOWN STEP 2026-05-12T16:59:17.1371979Z ^[[1m^[[92m Running^[[0m unittests src/lib.rs (target/wasm32-unknown-unknown/debug/deps/clink_wasm-5e5fcba89f74db83.wasm) +Test UNKNOWN STEP 2026-05-12T16:59:17.3136211Z no tests to run! +Test UNKNOWN STEP 2026-05-12T16:59:17.3413414Z ^[[1m^[[92m Running^[[0m tests/dependabot_alert_tests.rs (target/wasm32-unknown-unknown/debug/deps/dependabot_alert_tests-098124fcbb1e3ba5.wasm) +Test UNKNOWN STEP 2026-05-12T16:59:17.3861947Z no tests to run! +Test UNKNOWN STEP 2026-05-12T16:59:17.3930233Z ^[[1m^[[92m Running^[[0m tests/web.rs (target/wasm32-unknown-unknown/debug/deps/web-568af060111e1a1d.wasm) +Test UNKNOWN STEP 2026-05-12T16:59:19.8207871Z running 5 tests +Test UNKNOWN STEP 2026-05-12T16:59:19.8294111Z test reports_invalid_options ... ok +Test UNKNOWN STEP 2026-05-12T16:59:19.8481945Z test javascript_wasm_api_round_trips_create_update_delete_and_recreate ... ok +Test UNKNOWN STEP 2026-05-12T16:59:19.8485060Z test exposes_versions ... ok +Test UNKNOWN STEP 2026-05-12T16:59:19.8502695Z test executes_lino_queries_with_the_rust_core ... ok +Test UNKNOWN STEP 2026-05-12T16:59:19.8505081Z test creates_a_clink_instance ... ok +Test UNKNOWN STEP 2026-05-12T16:59:19.8508794Z +Test UNKNOWN STEP 2026-05-12T16:59:19.8509998Z test result: ok. 5 passed; 0 failed; 0 ignored; 0 filtered out; finished in 0.04s +Test UNKNOWN STEP 2026-05-12T16:59:19.8510565Z +Test UNKNOWN STEP 2026-05-12T16:59:19.8571136Z ^[[1m^[[92m Doc-tests^[[0m clink_wasm +Test UNKNOWN STEP 2026-05-12T16:59:19.8923036Z +Test UNKNOWN STEP 2026-05-12T16:59:19.8923501Z running 0 tests +Test UNKNOWN STEP 2026-05-12T16:59:19.8923852Z +Test UNKNOWN STEP 2026-05-12T16:59:19.8924704Z test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s +Test UNKNOWN STEP 2026-05-12T16:59:19.8925470Z +Test UNKNOWN STEP 2026-05-12T16:59:19.9072233Z ##[group]Run npm run build +Test UNKNOWN STEP 2026-05-12T16:59:19.9072822Z ^[[36;1mnpm run build^[[0m +Test UNKNOWN STEP 2026-05-12T16:59:19.9094297Z shell: /usr/bin/bash -e {0} +Test UNKNOWN STEP 2026-05-12T16:59:19.9094535Z env: +Test UNKNOWN STEP 2026-05-12T16:59:19.9094729Z CARGO_HOME: /home/runner/.cargo +Test UNKNOWN STEP 2026-05-12T16:59:19.9094983Z CARGO_INCREMENTAL: 0 +Test UNKNOWN STEP 2026-05-12T16:59:19.9095197Z CARGO_TERM_COLOR: always +Test UNKNOWN STEP 2026-05-12T16:59:19.9095414Z ##[endgroup] +Test UNKNOWN STEP 2026-05-12T16:59:20.0235930Z +Test UNKNOWN STEP 2026-05-12T16:59:20.0236477Z > link-cli-web@2.3.0 build +Test UNKNOWN STEP 2026-05-12T16:59:20.0237181Z > npm run build:wasm && npm run build:web +Test UNKNOWN STEP 2026-05-12T16:59:20.0237577Z +Test UNKNOWN STEP 2026-05-12T16:59:20.1369729Z +Test UNKNOWN STEP 2026-05-12T16:59:20.1370323Z > link-cli-web@2.3.0 build:wasm +Test UNKNOWN STEP 2026-05-12T16:59:20.1371262Z > wasm-pack build --target web --out-dir ../../js/pkg ../rust/wasm +Test UNKNOWN STEP 2026-05-12T16:59:20.1371622Z +Test UNKNOWN STEP 2026-05-12T16:59:20.2320462Z [INFO]: 🎯 Checking for the Wasm target... +Test UNKNOWN STEP 2026-05-12T16:59:20.2587617Z [INFO]: 🌀 Compiling to Wasm... +Test UNKNOWN STEP 2026-05-12T16:59:20.3273673Z ^[[1m^[[92m Compiling^[[0m link-cli v0.1.0 (/home/runner/work/link-cli/link-cli/rust) +Test UNKNOWN STEP 2026-05-12T16:59:21.4229054Z ^[[1m^[[92m Compiling^[[0m clink-wasm v2.3.0 (/home/runner/work/link-cli/link-cli/rust/wasm) +Test UNKNOWN STEP 2026-05-12T16:59:22.1790662Z ^[[1m^[[92m Finished^[[0m `release` profile [optimized] target(s) in 1.91s +Test UNKNOWN STEP 2026-05-12T16:59:22.1884060Z [INFO]: ⬇️ Installing wasm-bindgen... +Test UNKNOWN STEP 2026-05-12T16:59:23.4773572Z [INFO]: Optimizing wasm binaries with `wasm-opt`... +Test UNKNOWN STEP 2026-05-12T16:59:26.6770820Z [INFO]: License key is set in Cargo.toml but no LICENSE file(s) were found; Please add the LICENSE file(s) to your project directory +Test UNKNOWN STEP 2026-05-12T16:59:26.6772166Z [INFO]: ✨ Done in 6.45s +Test UNKNOWN STEP 2026-05-12T16:59:26.6773187Z [INFO]: 📦 Your wasm pkg is ready to publish at ../js/pkg. +Test UNKNOWN STEP 2026-05-12T16:59:26.7976999Z +Test UNKNOWN STEP 2026-05-12T16:59:26.7977928Z > link-cli-web@2.3.0 build:web +Test UNKNOWN STEP 2026-05-12T16:59:26.7978401Z > vite build --config vite.config.js +Test UNKNOWN STEP 2026-05-12T16:59:26.7978618Z +Test UNKNOWN STEP 2026-05-12T16:59:26.9999525Z ^[[36mvite v8.0.10 ^[[32mbuilding client environment for production...^[[36m^[[39m +Test UNKNOWN STEP 2026-05-12T16:59:27.0118578Z ^[[2K +Test UNKNOWN STEP 2026-05-12T16:59:27.2431858Z transforming...✓ 1737 modules transformed. +Test UNKNOWN STEP 2026-05-12T16:59:27.2702128Z rendering chunks... +Test UNKNOWN STEP 2026-05-12T16:59:27.3064201Z computing gzip size... +Test UNKNOWN STEP 2026-05-12T16:59:27.3127892Z ../dist/assets/favicon-CIVoLc1m.svg 0.37 kB │ gzip: 0.24 kB +Test UNKNOWN STEP 2026-05-12T16:59:27.3129129Z ../dist/index.html 0.63 kB │ gzip: 0.38 kB +Test UNKNOWN STEP 2026-05-12T16:59:27.3129898Z ../dist/assets/doublets_web_bg-cVQpTmMF.wasm 51.41 kB │ gzip: 20.96 kB +Test UNKNOWN STEP 2026-05-12T16:59:27.3130709Z ../dist/assets/clink_wasm_bg-Bog79H2E.wasm 284.42 kB │ gzip: 123.90 kB +Test UNKNOWN STEP 2026-05-12T16:59:27.3131640Z ../dist/assets/index-D8XZ-J-o.css 5.91 kB │ gzip: 2.07 kB +Test UNKNOWN STEP 2026-05-12T16:59:27.3133285Z ../dist/assets/index-BnV7WCY7.js 220.94 kB │ gzip: 68.69 kB +Test UNKNOWN STEP 2026-05-12T16:59:27.3133658Z +Test UNKNOWN STEP 2026-05-12T16:59:27.3134027Z ^[[32m✓ built in 312ms^[[39m +Test UNKNOWN STEP 2026-05-12T16:59:27.3467467Z ##[group]Run actions/upload-artifact@v4 +Test UNKNOWN STEP 2026-05-12T16:59:27.3467757Z with: +Test UNKNOWN STEP 2026-05-12T16:59:27.3467942Z name: link-cli-web +Test UNKNOWN STEP 2026-05-12T16:59:27.3468149Z path: dist/ +Test UNKNOWN STEP 2026-05-12T16:59:27.3468346Z if-no-files-found: warn +Test UNKNOWN STEP 2026-05-12T16:59:27.3468574Z compression-level: 6 +Test UNKNOWN STEP 2026-05-12T16:59:27.3468778Z overwrite: false +Test UNKNOWN STEP 2026-05-12T16:59:27.3468988Z include-hidden-files: false +Test UNKNOWN STEP 2026-05-12T16:59:27.3469213Z env: +Test UNKNOWN STEP 2026-05-12T16:59:27.3469396Z CARGO_HOME: /home/runner/.cargo +Test UNKNOWN STEP 2026-05-12T16:59:27.3469648Z CARGO_INCREMENTAL: 0 +Test UNKNOWN STEP 2026-05-12T16:59:27.3469857Z CARGO_TERM_COLOR: always +Test UNKNOWN STEP 2026-05-12T16:59:27.3470067Z ##[endgroup] +Test UNKNOWN STEP 2026-05-12T16:59:27.5635162Z With the provided path, there will be 6 files uploaded +Test UNKNOWN STEP 2026-05-12T16:59:27.5641799Z Artifact name is valid! +Test UNKNOWN STEP 2026-05-12T16:59:27.5643211Z Root directory input is valid! +Test UNKNOWN STEP 2026-05-12T16:59:27.6578402Z Beginning upload of artifact content to blob storage +Test UNKNOWN STEP 2026-05-12T16:59:27.7439167Z Uploaded bytes 215109 +Test UNKNOWN STEP 2026-05-12T16:59:27.7586688Z Finished uploading artifact content to blob storage! +Test UNKNOWN STEP 2026-05-12T16:59:27.7590536Z SHA256 digest of uploaded artifact zip is 059facd66017741984816ff77a8b712cd463cd62ed93f6c2f36565aef6c84bf8 +Test UNKNOWN STEP 2026-05-12T16:59:27.7592065Z Finalizing artifact upload +Test UNKNOWN STEP 2026-05-12T16:59:27.8685711Z Artifact link-cli-web.zip successfully finalized. Artifact ID 6950582024 +Test UNKNOWN STEP 2026-05-12T16:59:27.8687402Z Artifact link-cli-web has been successfully uploaded! Final size is 215109 bytes. Artifact ID is 6950582024 +Test UNKNOWN STEP 2026-05-12T16:59:27.8694755Z Artifact download URL: https://github.com/link-foundation/link-cli/actions/runs/25749403949/artifacts/6950582024 +Test UNKNOWN STEP 2026-05-12T16:59:27.9382961Z Post job cleanup. +Test UNKNOWN STEP 2026-05-12T16:59:28.0723277Z Cache hit occurred on the primary key Linux-wasm-cargo-22376137081c5ebc35abde90b3a80a6689287fd12d6f0ceea94e66b1d419e921, not saving cache. +Test UNKNOWN STEP 2026-05-12T16:59:28.0840463Z Post job cleanup. +Test UNKNOWN STEP 2026-05-12T16:59:28.2404747Z Cache hit occurred on the primary key node-cache-Linux-x64-npm-d315d8b9cf81d047cf497bbcc55d1d84ab2bcc1d591d7e669c7aa9738b286549, not saving cache. +Test UNKNOWN STEP 2026-05-12T16:59:28.2522228Z Post job cleanup. +Test UNKNOWN STEP 2026-05-12T16:59:28.3486627Z [command]/usr/bin/git version +Test UNKNOWN STEP 2026-05-12T16:59:28.3523290Z git version 2.53.0 +Test UNKNOWN STEP 2026-05-12T16:59:28.3566397Z Temporarily overriding HOME='/home/runner/work/_temp/32e565c1-c317-4f16-92a3-a99519b0832f' before making global git config changes +Test UNKNOWN STEP 2026-05-12T16:59:28.3567399Z Adding repository directory to the temporary git global config as a safe directory +Test UNKNOWN STEP 2026-05-12T16:59:28.3578061Z [command]/usr/bin/git config --global --add safe.directory /home/runner/work/link-cli/link-cli +Test UNKNOWN STEP 2026-05-12T16:59:28.3610443Z [command]/usr/bin/git config --local --name-only --get-regexp core\.sshCommand +Test UNKNOWN STEP 2026-05-12T16:59:28.3642282Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :" +Test UNKNOWN STEP 2026-05-12T16:59:28.3861380Z [command]/usr/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader +Test UNKNOWN STEP 2026-05-12T16:59:28.3880564Z http.https://github.com/.extraheader +Test UNKNOWN STEP 2026-05-12T16:59:28.3892778Z [command]/usr/bin/git config --local --unset-all http.https://github.com/.extraheader +Test UNKNOWN STEP 2026-05-12T16:59:28.3921264Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'http\.https\:\/\/github\.com\/\.extraheader' && git config --local --unset-all 'http.https://github.com/.extraheader' || :" +Test UNKNOWN STEP 2026-05-12T16:59:28.4135292Z [command]/usr/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir: +Test UNKNOWN STEP 2026-05-12T16:59:28.4164939Z [command]/usr/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url +Test UNKNOWN STEP 2026-05-12T16:59:28.4480634Z Cleaning up orphan processes +Test UNKNOWN STEP 2026-05-12T16:59:28.4760203Z ##[warning]Node.js 20 actions are deprecated. The following actions are running on Node.js 20 and may not work as expected: actions/cache@v4, actions/checkout@v4, actions/setup-node@v4, actions/upload-artifact@v4. Actions will be forced to run with Node.js 24 by default starting June 2nd, 2026. Node.js 20 will be removed from the runner on September 16th, 2026. Please check if updated versions of these actions are available that support Node.js 24. To opt into Node.js 24 now, set the FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=true environment variable on the runner or in your workflow file. Once Node.js 24 becomes the default, you can temporarily opt out by setting ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION=true. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/ +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:33.3145350Z Current runner version: '2.334.0' +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:33.3170242Z ##[group]Runner Image Provisioner +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:33.3171294Z Hosted Compute Agent +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:33.3171826Z Version: 20260213.493 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:33.3172656Z Commit: 5c115507f6dd24b8de37d8bbe0bb4509d0cc0fa3 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:33.3173315Z Build Date: 2026-02-13T00:28:41Z +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:33.3174061Z Worker ID: {dc668142-547e-41bd-bad6-6d0089a22bc9} +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:33.3174750Z Azure Region: eastus +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:33.3175278Z ##[endgroup] +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:33.3177086Z ##[group]Operating System +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:33.3177671Z Ubuntu +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:33.3178122Z 24.04.4 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:33.3179013Z LTS +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:33.3179500Z ##[endgroup] +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:33.3180006Z ##[group]Runner Image +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:33.3180621Z Image: ubuntu-24.04 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:33.3181145Z Version: 20260413.86.1 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:33.3182591Z Included Software: https://github.com/actions/runner-images/blob/ubuntu24/20260413.86/images/ubuntu/Ubuntu2404-Readme.md +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:33.3184111Z Image Release: https://github.com/actions/runner-images/releases/tag/ubuntu24%2F20260413.86 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:33.3185000Z ##[endgroup] +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:33.3186045Z ##[group]GITHUB_TOKEN Permissions +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:33.3188136Z Contents: read +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:33.3188733Z Metadata: read +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:33.3189253Z ##[endgroup] +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:33.3191693Z Secret source: Actions +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:33.3193210Z Prepare workflow directory +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:33.3517774Z Prepare all required actions +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:33.3554563Z Getting action download info +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:33.8372247Z Download action repository 'actions/checkout@v4' (SHA:34e114876b0b11c390a56381ad16ebd13914f8d5) +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:33.9803673Z Download action repository 'dtolnay/rust-toolchain@stable' (SHA:29eef336d9b2848a0b548edc03f92a220660cdb8) +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:34.0745280Z Download action repository 'actions/setup-node@v4' (SHA:49933ea5288caeca8642d1e84afbd3f7d6820020) +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:34.2252643Z Download action repository 'actions/cache@v4' (SHA:0057852bfaa89a56745cba8c7296529d2fc39830) +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:34.3173129Z Download action repository 'actions/configure-pages@v5' (SHA:983d7736d9b0ae728b81ab479565c72886d7745b) +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:34.4611003Z Download action repository 'actions/upload-pages-artifact@v4' (SHA:7b1f4a764d45c48632c6b24a0339c27f5614fb0b) +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:34.7214211Z Getting action download info +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:34.8407793Z Download action repository 'actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02' (SHA:ea165f8d65b6e75b540449e92b4886f43607fa02) +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:34.9809717Z Complete job name: Build GitHub Pages app +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.0666266Z ##[group]Run actions/checkout@v4 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.0667515Z with: +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.0668214Z repository: link-foundation/link-cli +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.0669433Z token: *** +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.0670108Z ssh-strict: true +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.0670803Z ssh-user: git +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.0671642Z persist-credentials: true +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.0672676Z clean: true +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.0673418Z sparse-checkout-cone-mode: true +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.0674309Z fetch-depth: 1 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.0674999Z fetch-tags: false +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.0675710Z show-progress: true +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.0676440Z lfs: false +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.0677080Z submodules: false +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.0677803Z set-safe-directory: true +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.0678886Z ##[endgroup] +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.1924408Z Syncing repository: link-foundation/link-cli +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.1928279Z ##[group]Getting Git version info +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.1930346Z Working directory is '/home/runner/work/link-cli/link-cli' +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.1933631Z [command]/usr/bin/git version +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.1935046Z git version 2.53.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.1938404Z ##[endgroup] +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.1945865Z Temporarily overriding HOME='/home/runner/work/_temp/47727630-fa92-443c-82e0-8dbfe548ed81' before making global git config changes +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.1948562Z Adding repository directory to the temporary git global config as a safe directory +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.1950930Z [command]/usr/bin/git config --global --add safe.directory /home/runner/work/link-cli/link-cli +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.1964460Z Deleting the contents of '/home/runner/work/link-cli/link-cli' +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.1967866Z ##[group]Initializing the repository +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.1971850Z [command]/usr/bin/git init /home/runner/work/link-cli/link-cli +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.2069242Z hint: Using 'master' as the name for the initial branch. This default branch name +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.2072795Z hint: will change to "main" in Git 3.0. To configure the initial branch name +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.2075870Z hint: to use in all of your new repositories, which will suppress this warning, +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.2078281Z hint: call: +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.2079377Z hint: +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.2080979Z hint: git config --global init.defaultBranch +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.2083199Z hint: +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.2084995Z hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.2087992Z hint: 'development'. The just-created branch can be renamed via this command: +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.2090339Z hint: +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.2091054Z hint: git branch -m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.2091865Z hint: +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.2093318Z hint: Disable this message with "git config set advice.defaultBranchName false" +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.2095767Z Initialized empty Git repository in /home/runner/work/link-cli/link-cli/.git/ +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.2100390Z [command]/usr/bin/git remote add origin https://github.com/link-foundation/link-cli +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.2115474Z ##[endgroup] +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.2117663Z ##[group]Disabling automatic garbage collection +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.2119873Z [command]/usr/bin/git config --local gc.auto 0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.2149226Z ##[endgroup] +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.2151305Z ##[group]Setting up auth +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.2157296Z [command]/usr/bin/git config --local --name-only --get-regexp core\.sshCommand +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.2190546Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :" +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.2474147Z [command]/usr/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.2506182Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'http\.https\:\/\/github\.com\/\.extraheader' && git config --local --unset-all 'http.https://github.com/.extraheader' || :" +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.2722257Z [command]/usr/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir: +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.2754724Z [command]/usr/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.2985337Z [command]/usr/bin/git config --local http.https://github.com/.extraheader AUTHORIZATION: basic *** +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.3019446Z ##[endgroup] +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.3021623Z ##[group]Fetching the repository +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.3031328Z [command]/usr/bin/git -c protocol.version=2 fetch --no-tags --prune --no-recurse-submodules --depth=1 origin +d47e551d2d66c7bfe93f9a869ce9fab36347e317:refs/remotes/origin/main +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.9515346Z From https://github.com/link-foundation/link-cli +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.9518454Z * [new ref] d47e551d2d66c7bfe93f9a869ce9fab36347e317 -> origin/main +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.9545725Z ##[endgroup] +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.9547840Z ##[group]Determining the checkout info +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.9550222Z ##[endgroup] +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.9554003Z [command]/usr/bin/git sparse-checkout disable +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.9591734Z [command]/usr/bin/git config --local --unset-all extensions.worktreeConfig +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.9619473Z ##[group]Checking out the ref +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:35.9622954Z [command]/usr/bin/git checkout --progress --force -B main refs/remotes/origin/main +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.0219551Z Switched to a new branch 'main' +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.0221078Z branch 'main' set up to track 'origin/main'. +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.0233924Z ##[endgroup] +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.0272177Z [command]/usr/bin/git log -1 --format=%H +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.0294250Z d47e551d2d66c7bfe93f9a869ce9fab36347e317 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.0835725Z ##[group]Run dtolnay/rust-toolchain@stable +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.0836793Z with: +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.0837555Z targets: wasm32-unknown-unknown +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.0838504Z toolchain: stable +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.0839284Z ##[endgroup] +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.0996197Z ##[group]Run : parse toolchain version +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.0997344Z ^[[36;1m: parse toolchain version^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.0998323Z ^[[36;1mif [[ -z $toolchain ]]; then^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.1000052Z ^[[36;1m # GitHub does not enforce `required: true` inputs itself. https://github.com/actions/runner/issues/1070^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.1001926Z ^[[36;1m echo "'toolchain' is a required input" >&2^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.1003175Z ^[[36;1m exit 1^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.1004328Z ^[[36;1melif [[ $toolchain =~ ^stable' '[0-9]+' '(year|month|week|day)s?' 'ago$ ]]; then^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.1005778Z ^[[36;1m if [[ Linux == macOS ]]; then^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.1007589Z ^[[36;1m echo "toolchain=1.$((($(date -v-$(sed 's/stable \([0-9]*\) \(.\).*/\1\2/' <<< $toolchain) +%s)/60/60/24-16569)/7/6))" >> $GITHUB_OUTPUT^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.1009348Z ^[[36;1m else^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.1010737Z ^[[36;1m echo "toolchain=1.$((($(date --date "${toolchain#stable }" +%s)/60/60/24-16569)/7/6))" >> $GITHUB_OUTPUT^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.1012469Z ^[[36;1m fi^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.1013501Z ^[[36;1melif [[ $toolchain =~ ^stable' 'minus' '[0-9]+' 'releases?$ ]]; then^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.1015328Z ^[[36;1m echo "toolchain=1.$((($(date +%s)/60/60/24-16569)/7/6-${toolchain//[^0-9]/}))" >> $GITHUB_OUTPUT^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.1016931Z ^[[36;1melif [[ $toolchain =~ ^1\.[0-9]+$ ]]; then^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.1018730Z ^[[36;1m echo "toolchain=1.$((i=${toolchain#1.}, c=($(date +%s)/60/60/24-16569)/7/6, i+9*i*(10*i<=c)+90*i*(100*i<=c)))" >> $GITHUB_OUTPUT^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.1020491Z ^[[36;1melse^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.1021357Z ^[[36;1m echo "toolchain=$toolchain" >> $GITHUB_OUTPUT^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.1022544Z ^[[36;1mfi^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.1050339Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.1051508Z env: +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.1052583Z toolchain: stable +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.1053333Z ##[endgroup] +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.1223098Z ##[group]Run : construct rustup command line +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.1224232Z ^[[36;1m: construct rustup command line^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.1225749Z ^[[36;1mecho "targets=$(for t in ${targets//,/ }; do echo -n ' --target' $t; done)" >> $GITHUB_OUTPUT^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.1227912Z ^[[36;1mecho "components=$(for c in ${components//,/ }; do echo -n ' --component' $c; done)" >> $GITHUB_OUTPUT^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.1229602Z ^[[36;1mecho "downgrade=" >> $GITHUB_OUTPUT^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.1253347Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.1254511Z env: +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.1255235Z targets: wasm32-unknown-unknown +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.1256144Z components: +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.1256846Z ##[endgroup] +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.1368812Z ##[group]Run : set $CARGO_HOME +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.1369706Z ^[[36;1m: set $CARGO_HOME^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.1370824Z ^[[36;1mecho CARGO_HOME=${CARGO_HOME:-"$HOME/.cargo"} >> $GITHUB_ENV^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.1394113Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.1395254Z ##[endgroup] +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.1504351Z ##[group]Run : install rustup if needed +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.1505453Z ^[[36;1m: install rustup if needed^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.1506556Z ^[[36;1mif ! command -v rustup &>/dev/null; then^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.1509133Z ^[[36;1m curl --proto '=https' --tlsv1.2 --retry 10 --retry-connrefused --location --silent --show-error --fail https://sh.rustup.rs | sh -s -- --default-toolchain none -y^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.1512356Z ^[[36;1m echo "$CARGO_HOME/bin" >> $GITHUB_PATH^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.1513486Z ^[[36;1mfi^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.1536518Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.1537776Z env: +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.1538669Z CARGO_HOME: /home/runner/.cargo +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.1539616Z ##[endgroup] +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.1653181Z ##[group]Run rustup toolchain install stable --target wasm32-unknown-unknown --profile minimal --no-self-update +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.1655691Z ^[[36;1mrustup toolchain install stable --target wasm32-unknown-unknown --profile minimal --no-self-update^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.1678731Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.1679861Z env: +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.1680552Z CARGO_HOME: /home/runner/.cargo +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.1681475Z RUSTUP_PERMIT_COPY_RENAME: 1 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.1682522Z ##[endgroup] +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.3203245Z info: syncing channel updates for stable-x86_64-unknown-linux-gnu +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.4145493Z info: latest update on 2026-04-16 for version 1.95.0 (59807616e 2026-04-14) +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.4260884Z info: removing previous version of component clippy +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.4279843Z info: removing previous version of component rustfmt +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.4292465Z info: removing previous version of component cargo +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.4358527Z info: removing previous version of component rust-std +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.4411197Z info: removing previous version of component rustc +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:36.4465930Z info: downloading 6 components +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.8586672Z +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.8668889Z stable-x86_64-unknown-linux-gnu updated - rustc 1.95.0 (59807616e 2026-04-14) (from rustc 1.94.1 (e408947bf 2026-03-25)) +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.8669924Z +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.8754240Z ##[group]Run rustup default stable +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.8754539Z ^[[36;1mrustup default stable^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.8775388Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.8775718Z env: +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.8775901Z CARGO_HOME: /home/runner/.cargo +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.8776135Z ##[endgroup] +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.8867625Z info: using existing install for stable-x86_64-unknown-linux-gnu +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.8876154Z info: default toolchain set to stable-x86_64-unknown-linux-gnu +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.8876656Z +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.8940539Z stable-x86_64-unknown-linux-gnu unchanged - rustc 1.95.0 (59807616e 2026-04-14) +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.8941156Z +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.8976723Z ##[group]Run : create cachekey +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.8977016Z ^[[36;1m: create cachekey^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.8977507Z ^[[36;1mDATE=$(rustc +stable --version --verbose | sed -ne 's/^commit-date: \(20[0-9][0-9]\)-\([01][0-9]\)-\([0-3][0-9]\)$/\1\2\3/p')^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.8978140Z ^[[36;1mHASH=$(rustc +stable --version --verbose | sed -ne 's/^commit-hash: //p')^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.8978605Z ^[[36;1mecho "cachekey=$(echo $DATE$HASH | head -c12)" >> $GITHUB_OUTPUT^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.8998546Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.8998879Z env: +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.8999060Z CARGO_HOME: /home/runner/.cargo +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.8999310Z ##[endgroup] +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.9338075Z ##[group]Run : disable incremental compilation +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.9338444Z ^[[36;1m: disable incremental compilation^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.9338753Z ^[[36;1mif [ -z "${CARGO_INCREMENTAL+set}" ]; then^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.9339068Z ^[[36;1m echo CARGO_INCREMENTAL=0 >> $GITHUB_ENV^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.9339337Z ^[[36;1mfi^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.9359785Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.9360133Z env: +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.9360334Z CARGO_HOME: /home/runner/.cargo +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.9360565Z ##[endgroup] +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.9421803Z ##[group]Run : enable colors in Cargo output +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.9422414Z ^[[36;1m: enable colors in Cargo output^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.9422758Z ^[[36;1mif [ -z "${CARGO_TERM_COLOR+set}" ]; then^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.9423070Z ^[[36;1m echo CARGO_TERM_COLOR=always >> $GITHUB_ENV^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.9423348Z ^[[36;1mfi^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.9442200Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.9442706Z env: +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.9442896Z CARGO_HOME: /home/runner/.cargo +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.9443268Z CARGO_INCREMENTAL: 0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.9443472Z ##[endgroup] +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.9504597Z ##[group]Run : enable Cargo sparse registry +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.9504913Z ^[[36;1m: enable Cargo sparse registry^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.9505259Z ^[[36;1m# implemented in 1.66, stabilized in 1.68, made default in 1.70^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.9505932Z ^[[36;1mif [ -z "${CARGO_REGISTRIES_CRATES_IO_PROTOCOL+set}" -o -f "/home/runner/work/_temp"/.implicit_cargo_registries_crates_io_protocol ]; then^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.9506622Z ^[[36;1m if rustc +stable --version --verbose | grep -q '^release: 1\.6[89]\.'; then^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.9507156Z ^[[36;1m touch "/home/runner/work/_temp"/.implicit_cargo_registries_crates_io_protocol || true^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.9507674Z ^[[36;1m echo CARGO_REGISTRIES_CRATES_IO_PROTOCOL=sparse >> $GITHUB_ENV^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.9508155Z ^[[36;1m elif rustc +stable --version --verbose | grep -q '^release: 1\.6[67]\.'; then^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.9508689Z ^[[36;1m touch "/home/runner/work/_temp"/.implicit_cargo_registries_crates_io_protocol || true^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.9509179Z ^[[36;1m echo CARGO_REGISTRIES_CRATES_IO_PROTOCOL=git >> $GITHUB_ENV^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.9509506Z ^[[36;1m fi^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.9509678Z ^[[36;1mfi^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.9528704Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.9529020Z env: +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.9529208Z CARGO_HOME: /home/runner/.cargo +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.9529442Z CARGO_INCREMENTAL: 0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.9529650Z CARGO_TERM_COLOR: always +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.9529857Z ##[endgroup] +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.9836420Z ##[group]Run : work around spurious network errors in curl 8.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.9836869Z ^[[36;1m: work around spurious network errors in curl 8.0^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.9837564Z ^[[36;1m# https://rust-lang.zulipchat.com/#narrow/stream/246057-t-cargo/topic/timeout.20investigation^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.9838189Z ^[[36;1mif rustc +stable --version --verbose | grep -q '^release: 1\.7[01]\.'; then^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.9838652Z ^[[36;1m echo CARGO_HTTP_MULTIPLEXING=false >> $GITHUB_ENV^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.9838948Z ^[[36;1mfi^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.9859888Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.9860215Z env: +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.9860394Z CARGO_HOME: /home/runner/.cargo +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.9860739Z CARGO_INCREMENTAL: 0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.9860971Z CARGO_TERM_COLOR: always +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:45.9861174Z ##[endgroup] +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:46.0048439Z ##[group]Run rustc +stable --version --verbose +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:46.0048795Z ^[[36;1mrustc +stable --version --verbose^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:46.0069707Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0} +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:46.0070040Z env: +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:46.0070223Z CARGO_HOME: /home/runner/.cargo +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:46.0070470Z CARGO_INCREMENTAL: 0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:46.0070690Z CARGO_TERM_COLOR: always +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:46.0070899Z ##[endgroup] +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:46.0219613Z rustc 1.95.0 (59807616e 2026-04-14) +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:46.0220272Z binary: rustc +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:46.0220740Z commit-hash: 59807616e1fa2540724bfbac14d7976d7e4a3860 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:46.0221124Z commit-date: 2026-04-14 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:46.0221599Z host: x86_64-unknown-linux-gnu +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:46.0222214Z release: 1.95.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:46.0222760Z LLVM version: 22.1.2 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:46.0295145Z ##[group]Run cargo install wasm-pack --version 0.14.0 --locked +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:46.0295606Z ^[[36;1mcargo install wasm-pack --version 0.14.0 --locked^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:46.0316216Z shell: /usr/bin/bash -e {0} +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:46.0316452Z env: +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:46.0316637Z CARGO_HOME: /home/runner/.cargo +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:46.0316877Z CARGO_INCREMENTAL: 0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:46.0317083Z CARGO_TERM_COLOR: always +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:46.0317285Z ##[endgroup] +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:46.0593237Z ^[[1m^[[92m Updating^[[0m crates.io index +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:46.1133489Z ^[[1m^[[92m Downloading^[[0m crates ... +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:46.2255976Z ^[[1m^[[92m Downloaded^[[0m wasm-pack v0.14.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:46.2763062Z ^[[1m^[[92m Installing^[[0m wasm-pack v0.14.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:46.2825113Z ^[[1m^[[92m Updating^[[0m crates.io index +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.1583025Z ^[[1m^[[92m Updating^[[0m crates.io index +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.3874651Z ^[[1m^[[92m Downloading^[[0m crates ... +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.4466817Z ^[[1m^[[92m Downloaded^[[0m anstyle v1.0.13 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.4486511Z ^[[1m^[[92m Downloaded^[[0m autocfg v1.5.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.4511455Z ^[[1m^[[92m Downloaded^[[0m anstream v0.6.21 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.4539655Z ^[[1m^[[92m Downloaded^[[0m quote v1.0.43 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.4574067Z ^[[1m^[[92m Downloaded^[[0m hashbrown v0.16.1 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.4629719Z ^[[1m^[[92m Downloaded^[[0m zeroize_derive v1.4.3 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.4645899Z ^[[1m^[[92m Downloaded^[[0m rustc-demangle v0.1.27 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.4670873Z ^[[1m^[[92m Downloaded^[[0m generic-array v0.14.7 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.4704865Z ^[[1m^[[92m Downloaded^[[0m zerofrom v0.1.6 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.4731152Z ^[[1m^[[92m Downloaded^[[0m proc-macro2 v1.0.105 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.4781830Z ^[[1m^[[92m Downloaded^[[0m syn v2.0.114 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.4892674Z ^[[1m^[[92m Downloaded^[[0m colorchoice v1.0.4 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.4920204Z ^[[1m^[[92m Downloaded^[[0m num-conv v0.1.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.4936876Z ^[[1m^[[92m Downloaded^[[0m potential_utf v0.1.4 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.4954140Z ^[[1m^[[92m Downloaded^[[0m percent-encoding v2.3.2 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.4968365Z ^[[1m^[[92m Downloaded^[[0m uuid v1.19.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.5011597Z ^[[1m^[[92m Downloaded^[[0m webpki-roots v0.26.11 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.5032506Z ^[[1m^[[92m Downloaded^[[0m scopeguard v1.2.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.5053617Z ^[[1m^[[92m Downloaded^[[0m utf8parse v0.2.2 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.5070128Z ^[[1m^[[92m Downloaded^[[0m serde_ignored v0.1.14 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.5091073Z ^[[1m^[[92m Downloaded^[[0m yoke-derive v0.8.1 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.5106454Z ^[[1m^[[92m Downloaded^[[0m zerofrom-derive v0.1.6 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.5124093Z ^[[1m^[[92m Downloaded^[[0m same-file v1.0.6 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.5143475Z ^[[1m^[[92m Downloaded^[[0m walkdir v2.5.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.5167952Z ^[[1m^[[92m Downloaded^[[0m zstd-safe v7.2.4 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.5189983Z ^[[1m^[[92m Downloaded^[[0m xz2 v0.1.7 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.5212403Z ^[[1m^[[92m Downloaded^[[0m thiserror-impl v2.0.18 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.5233742Z ^[[1m^[[92m Downloaded^[[0m zstd v0.13.3 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.5267723Z ^[[1m^[[92m Downloaded^[[0m zmij v1.0.16 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.5290692Z ^[[1m^[[92m Downloaded^[[0m zopfli v0.8.3 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.5320923Z ^[[1m^[[92m Downloaded^[[0m tar v0.4.44 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.5354134Z ^[[1m^[[92m Downloaded^[[0m typenum v1.19.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.5388812Z ^[[1m^[[92m Downloaded^[[0m serde_core v1.0.228 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.5421410Z ^[[1m^[[92m Downloaded^[[0m url v2.5.8 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.5453656Z ^[[1m^[[92m Downloaded^[[0m ureq v2.12.1 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.5508070Z ^[[1m^[[92m Downloaded^[[0m zip v2.4.2 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.5565292Z ^[[1m^[[92m Downloaded^[[0m zerovec v0.11.5 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.5634631Z ^[[1m^[[92m Downloaded^[[0m zeroize v1.8.2 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.5652000Z ^[[1m^[[92m Downloaded^[[0m subtle v2.6.1 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.5673345Z ^[[1m^[[92m Downloaded^[[0m serde_json v1.0.149 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.5754255Z ^[[1m^[[92m Downloaded^[[0m zerovec-derive v0.11.2 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.5773553Z ^[[1m^[[92m Downloaded^[[0m toml v0.9.11+spec-1.1.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.5824496Z ^[[1m^[[92m Downloaded^[[0m sysinfo v0.37.2 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.5936446Z ^[[1m^[[92m Downloaded^[[0m toml_parser v1.0.6+spec-1.1.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.5963020Z ^[[1m^[[92m Downloaded^[[0m webpki-roots v1.0.5 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.6002105Z ^[[1m^[[92m Downloaded^[[0m time v0.3.45 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.6130410Z ^[[1m^[[92m Downloaded^[[0m unicode-width v0.2.2 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.6187834Z ^[[1m^[[92m Downloaded^[[0m sha1 v0.10.6 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.6207326Z ^[[1m^[[92m Downloaded^[[0m zerotrie v0.2.3 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.6243366Z ^[[1m^[[92m Downloaded^[[0m rustls v0.23.36 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.6361450Z ^[[1m^[[92m Downloaded^[[0m rustix v0.38.44 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.6618801Z ^[[1m^[[92m Downloaded^[[0m rustix v1.1.3 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.6885083Z ^[[1m^[[92m Downloaded^[[0m winnow v0.7.14 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.6980182Z ^[[1m^[[92m Downloaded^[[0m serde v1.0.228 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.7015503Z ^[[1m^[[92m Downloaded^[[0m simd-adler32 v0.3.8 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.7036318Z ^[[1m^[[92m Downloaded^[[0m siphasher v0.3.11 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.7050270Z ^[[1m^[[92m Downloaded^[[0m object v0.37.3 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.7158040Z ^[[1m^[[92m Downloaded^[[0m shlex v1.3.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.7171796Z ^[[1m^[[92m Downloaded^[[0m rustls-webpki v0.103.9 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.7208752Z ^[[1m^[[92m Downloaded^[[0m lzma-sys v0.1.20 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.7527641Z ^[[1m^[[92m Downloaded^[[0m libc v0.2.180 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.7905387Z ^[[1m^[[92m Downloaded^[[0m gimli v0.32.3 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.7973142Z ^[[1m^[[92m Downloaded^[[0m chrono v0.4.43 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.8037980Z ^[[1m^[[92m Downloaded^[[0m unicode-ident v1.0.22 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.8067646Z ^[[1m^[[92m Downloaded^[[0m serde_derive v1.0.228 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.8101770Z ^[[1m^[[92m Downloaded^[[0m clap_builder v4.5.54 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.8164473Z ^[[1m^[[92m Downloaded^[[0m rustls-pki-types v1.14.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.8190264Z ^[[1m^[[92m Downloaded^[[0m tempfile v3.24.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.8216455Z ^[[1m^[[92m Downloaded^[[0m smallvec v1.15.1 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.8238238Z ^[[1m^[[92m Downloaded^[[0m semver v1.0.27 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.8262140Z ^[[1m^[[92m Downloaded^[[0m writeable v0.6.2 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.8281404Z ^[[1m^[[92m Downloaded^[[0m which v8.0.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.8300285Z ^[[1m^[[92m Downloaded^[[0m toml_datetime v0.7.5+spec-1.1.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.8314751Z ^[[1m^[[92m Downloaded^[[0m indexmap v2.13.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.8357696Z ^[[1m^[[92m Downloaded^[[0m icu_properties_data v2.1.2 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.8458507Z ^[[1m^[[92m Downloaded^[[0m yoke v0.8.1 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.8478306Z ^[[1m^[[92m Downloaded^[[0m toml_writer v1.0.6+spec-1.1.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.8492822Z ^[[1m^[[92m Downloaded^[[0m tinystr v0.8.2 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.8513769Z ^[[1m^[[92m Downloaded^[[0m thiserror v2.0.18 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.8577726Z ^[[1m^[[92m Downloaded^[[0m serde_spanned v1.0.4 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.8590038Z ^[[1m^[[92m Downloaded^[[0m synstructure v0.13.2 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.8601591Z ^[[1m^[[92m Downloaded^[[0m litemap v0.8.1 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.8625339Z ^[[1m^[[92m Downloaded^[[0m idna v1.1.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.8660471Z ^[[1m^[[92m Downloaded^[[0m ring v0.17.14 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.9067625Z ^[[1m^[[92m Downloaded^[[0m icu_collections v2.1.1 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.9128667Z ^[[1m^[[92m Downloaded^[[0m digest v0.10.7 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.9147126Z ^[[1m^[[92m Downloaded^[[0m num-traits v0.2.19 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.9172698Z ^[[1m^[[92m Downloaded^[[0m memchr v2.7.6 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.9226311Z ^[[1m^[[92m Downloaded^[[0m getrandom v0.3.4 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.9260198Z ^[[1m^[[92m Downloaded^[[0m getrandom v0.2.17 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.9288969Z ^[[1m^[[92m Downloaded^[[0m flate2 v1.1.8 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.9337191Z ^[[1m^[[92m Downloaded^[[0m console v0.16.2 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.9354630Z ^[[1m^[[92m Downloaded^[[0m version_check v0.9.5 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.9367818Z ^[[1m^[[92m Downloaded^[[0m untrusted v0.9.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.9384749Z ^[[1m^[[92m Downloaded^[[0m time-core v0.1.7 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.9395465Z ^[[1m^[[92m Downloaded^[[0m miniz_oxide v0.8.9 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.9420127Z ^[[1m^[[92m Downloaded^[[0m iana-time-zone v0.1.64 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.9446357Z ^[[1m^[[92m Downloaded^[[0m zstd-sys v2.0.16+zstd.1.5.7 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.9604922Z ^[[1m^[[92m Downloaded^[[0m clap_derive v4.5.49 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.9626324Z ^[[1m^[[92m Downloaded^[[0m xattr v1.6.1 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.9645296Z ^[[1m^[[92m Downloaded^[[0m utf8_iter v1.0.4 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.9655654Z ^[[1m^[[92m Downloaded^[[0m parking_lot v0.12.5 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.9680029Z ^[[1m^[[92m Downloaded^[[0m once_cell v1.21.3 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.9705031Z ^[[1m^[[92m Downloaded^[[0m log v0.4.29 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.9729466Z ^[[1m^[[92m Downloaded^[[0m icu_normalizer v2.1.1 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.9764203Z ^[[1m^[[92m Downloaded^[[0m hmac v0.12.1 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.9783753Z ^[[1m^[[92m Downloaded^[[0m cargo_metadata v0.23.1 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.9801869Z ^[[1m^[[92m Downloaded^[[0m bitflags v2.10.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.9843051Z ^[[1m^[[92m Downloaded^[[0m parking_lot_core v0.9.12 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.9864495Z ^[[1m^[[92m Downloaded^[[0m displaydoc v0.2.5 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.9894284Z ^[[1m^[[92m Downloaded^[[0m cpufeatures v0.2.17 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.9908307Z ^[[1m^[[92m Downloaded^[[0m binary-install v0.4.1 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.9927790Z ^[[1m^[[92m Downloaded^[[0m strsim v0.11.1 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.9941190Z ^[[1m^[[92m Downloaded^[[0m socks v0.3.4 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.9955178Z ^[[1m^[[92m Downloaded^[[0m siphasher v1.0.1 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.9966886Z ^[[1m^[[92m Downloaded^[[0m shell-words v1.1.1 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.9976341Z ^[[1m^[[92m Downloaded^[[0m jobserver v0.1.34 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:47.9996760Z ^[[1m^[[92m Downloaded^[[0m crypto-common v0.1.7 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.0006097Z ^[[1m^[[92m Downloaded^[[0m crc v3.4.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.0023466Z ^[[1m^[[92m Downloaded^[[0m cipher v0.4.4 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.0039568Z ^[[1m^[[92m Downloaded^[[0m backtrace v0.3.76 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.0089376Z ^[[1m^[[92m Downloaded^[[0m is_terminal_polyfill v1.70.2 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.0099657Z ^[[1m^[[92m Downloaded^[[0m is_executable v0.1.2 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.0112113Z ^[[1m^[[92m Downloaded^[[0m form_urlencoded v1.2.2 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.0120931Z ^[[1m^[[92m Downloaded^[[0m find-msvc-tools v0.1.8 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.0137567Z ^[[1m^[[92m Downloaded^[[0m errno v0.3.14 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.0152865Z ^[[1m^[[92m Downloaded^[[0m dialoguer v0.12.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.0187651Z ^[[1m^[[92m Downloaded^[[0m path-clean v1.0.1 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.0199520Z ^[[1m^[[92m Downloaded^[[0m itoa v1.0.17 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.0223478Z ^[[1m^[[92m Downloaded^[[0m hex v0.4.3 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.0239899Z ^[[1m^[[92m Downloaded^[[0m fs4 v0.6.6 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.0264325Z ^[[1m^[[92m Downloaded^[[0m equivalent v1.0.2 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.0275169Z ^[[1m^[[92m Downloaded^[[0m lock_api v0.4.14 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.0288122Z ^[[1m^[[92m Downloaded^[[0m idna_adapter v1.2.1 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.0298201Z ^[[1m^[[92m Downloaded^[[0m icu_properties v2.1.2 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.0319614Z ^[[1m^[[92m Downloaded^[[0m icu_normalizer_data v2.1.1 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.0340681Z ^[[1m^[[92m Downloaded^[[0m icu_locale_core v2.1.1 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.0406976Z ^[[1m^[[92m Downloaded^[[0m inout v0.1.4 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.0418597Z ^[[1m^[[92m Downloaded^[[0m heck v0.5.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.0431427Z ^[[1m^[[92m Downloaded^[[0m linux-raw-sys v0.4.15 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.0879149Z ^[[1m^[[92m Downloaded^[[0m human-panic v2.0.6 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.0891332Z ^[[1m^[[92m Downloaded^[[0m env_home v0.1.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.0902417Z ^[[1m^[[92m Downloaded^[[0m dirs-next v2.0.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.0914208Z ^[[1m^[[92m Downloaded^[[0m crc-catalog v2.4.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.0926385Z ^[[1m^[[92m Downloaded^[[0m constant_time_eq v0.3.1 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.0939982Z ^[[1m^[[92m Downloaded^[[0m camino v1.2.2 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.0959415Z ^[[1m^[[92m Downloaded^[[0m icu_provider v2.1.1 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.0984571Z ^[[1m^[[92m Downloaded^[[0m fastrand v2.3.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.0997365Z ^[[1m^[[92m Downloaded^[[0m dirs-sys-next v0.1.2 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.1007266Z ^[[1m^[[92m Downloaded^[[0m deranged v0.5.5 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.1020586Z ^[[1m^[[92m Downloaded^[[0m clap v4.5.54 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.1114351Z ^[[1m^[[92m Downloaded^[[0m powerfmt v0.2.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.1125629Z ^[[1m^[[92m Downloaded^[[0m pbkdf2 v0.12.2 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.1138709Z ^[[1m^[[92m Downloaded^[[0m glob v0.3.3 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.1153540Z ^[[1m^[[92m Downloaded^[[0m crc32fast v1.5.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.1172102Z ^[[1m^[[92m Downloaded^[[0m clap_lex v0.7.7 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.1183444Z ^[[1m^[[92m Downloaded^[[0m cargo-platform v0.3.2 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.1195859Z ^[[1m^[[92m Downloaded^[[0m bumpalo v3.19.1 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.1220968Z ^[[1m^[[92m Downloaded^[[0m base64 v0.22.1 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.1258221Z ^[[1m^[[92m Downloaded^[[0m env_filter v0.1.4 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.1272275Z ^[[1m^[[92m Downloaded^[[0m cfg-if v1.0.4 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.1285456Z ^[[1m^[[92m Downloaded^[[0m cc v1.2.53 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.1313934Z ^[[1m^[[92m Downloaded^[[0m linux-raw-sys v0.11.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.1830798Z ^[[1m^[[92m Downloaded^[[0m bzip2 v0.5.2 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.1848579Z ^[[1m^[[92m Downloaded^[[0m block-buffer v0.10.4 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.1858813Z ^[[1m^[[92m Downloaded^[[0m stable_deref_trait v1.2.1 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.1867570Z ^[[1m^[[92m Downloaded^[[0m filetime v0.2.27 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.1883761Z ^[[1m^[[92m Downloaded^[[0m env_logger v0.11.8 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.1907695Z ^[[1m^[[92m Downloaded^[[0m bzip2-sys v0.1.13+1.0.8 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.2011091Z ^[[1m^[[92m Downloaded^[[0m pkg-config v0.3.32 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.2026826Z ^[[1m^[[92m Downloaded^[[0m byteorder v1.5.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.2042231Z ^[[1m^[[92m Downloaded^[[0m adler2 v2.0.1 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.2054585Z ^[[1m^[[92m Downloaded^[[0m anstyle-query v1.1.5 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.2065933Z ^[[1m^[[92m Downloaded^[[0m aes v0.8.4 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.2099362Z ^[[1m^[[92m Downloaded^[[0m lzma-rs v0.3.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.2124917Z ^[[1m^[[92m Downloaded^[[0m deflate64 v0.1.10 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.2138142Z ^[[1m^[[92m Downloaded^[[0m anstyle-parse v0.2.7 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.2154060Z ^[[1m^[[92m Downloaded^[[0m anyhow v1.0.100 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.2194111Z ^[[1m^[[92m Downloaded^[[0m addr2line v0.25.1 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.2736341Z ^[[1m^[[92m Compiling^[[0m libc v0.2.180 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.2737194Z ^[[1m^[[92m Compiling^[[0m proc-macro2 v1.0.105 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.2737764Z ^[[1m^[[92m Compiling^[[0m quote v1.0.43 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.2761147Z ^[[1m^[[92m Compiling^[[0m unicode-ident v1.0.22 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.3323890Z ^[[1m^[[92m Compiling^[[0m shlex v1.3.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.4293446Z ^[[1m^[[92m Compiling^[[0m find-msvc-tools v0.1.8 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.4393107Z ^[[1m^[[92m Compiling^[[0m cfg-if v1.0.4 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:48.5803746Z ^[[1m^[[92m Compiling^[[0m pkg-config v0.3.32 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:49.0640004Z ^[[1m^[[92m Compiling^[[0m stable_deref_trait v1.2.1 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:49.0933390Z ^[[1m^[[92m Compiling^[[0m serde_core v1.0.228 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:49.2360961Z ^[[1m^[[92m Compiling^[[0m syn v2.0.114 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:49.2534102Z ^[[1m^[[92m Compiling^[[0m version_check v0.9.5 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:49.3653626Z ^[[1m^[[92m Compiling^[[0m jobserver v0.1.34 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:49.3853370Z ^[[1m^[[92m Compiling^[[0m typenum v1.19.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:49.4803340Z ^[[1m^[[92m Compiling^[[0m generic-array v0.14.7 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:49.5459314Z ^[[1m^[[92m Compiling^[[0m cc v1.2.53 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:50.8622923Z ^[[1m^[[92m Compiling^[[0m litemap v0.8.1 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:51.0050620Z ^[[1m^[[92m Compiling^[[0m memchr v2.7.6 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:51.0383450Z ^[[1m^[[92m Compiling^[[0m writeable v0.6.2 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:51.1973461Z ^[[1m^[[92m Compiling^[[0m bitflags v2.10.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:51.5228231Z ^[[1m^[[92m Compiling^[[0m crypto-common v0.1.7 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:51.5893650Z ^[[1m^[[92m Compiling^[[0m getrandom v0.3.4 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:51.7483386Z ^[[1m^[[92m Compiling^[[0m rustix v1.1.3 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:51.9364185Z ^[[1m^[[92m Compiling^[[0m icu_properties_data v2.1.2 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:52.0123391Z ^[[1m^[[92m Compiling^[[0m smallvec v1.15.1 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:52.0553567Z ^[[1m^[[92m Compiling^[[0m simd-adler32 v0.3.8 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:52.1933534Z ^[[1m^[[92m Compiling^[[0m subtle v2.6.1 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:52.2788731Z ^[[1m^[[92m Compiling^[[0m icu_normalizer_data v2.1.1 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:52.3584342Z ^[[1m^[[92m Compiling^[[0m ring v0.17.14 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:52.3623279Z ^[[1m^[[92m Compiling^[[0m zstd-sys v2.0.16+zstd.1.5.7 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:52.5483846Z ^[[1m^[[92m Compiling^[[0m synstructure v0.13.2 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:52.5753839Z ^[[1m^[[92m Compiling^[[0m log v0.4.29 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:52.6886061Z ^[[1m^[[92m Compiling^[[0m crc32fast v1.5.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:52.7516173Z ^[[1m^[[92m Compiling^[[0m linux-raw-sys v0.11.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:52.8025846Z ^[[1m^[[92m Compiling^[[0m adler2 v2.0.1 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:52.8913895Z ^[[1m^[[92m Compiling^[[0m miniz_oxide v0.8.9 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:54.1573477Z ^[[1m^[[92m Compiling^[[0m zerofrom-derive v0.1.6 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:54.5420582Z ^[[1m^[[92m Compiling^[[0m yoke-derive v0.8.1 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:55.2183625Z ^[[1m^[[92m Compiling^[[0m zerofrom v0.1.6 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:55.2813382Z ^[[1m^[[92m Compiling^[[0m zerovec-derive v0.11.2 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:55.3753404Z ^[[1m^[[92m Compiling^[[0m yoke v0.8.1 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:55.5064058Z ^[[1m^[[92m Compiling^[[0m displaydoc v0.2.5 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:55.8734033Z ^[[1m^[[92m Compiling^[[0m zeroize_derive v1.4.3 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:55.9823774Z ^[[1m^[[92m Compiling^[[0m zerotrie v0.2.3 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:56.2007825Z ^[[1m^[[92m Compiling^[[0m zerovec v0.11.5 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:56.2774276Z ^[[1m^[[92m Compiling^[[0m zeroize v1.8.2 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:56.3668661Z ^[[1m^[[92m Compiling^[[0m rustls-pki-types v1.14.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:56.7663867Z ^[[1m^[[92m Compiling^[[0m tinystr v0.8.2 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:56.8902630Z ^[[1m^[[92m Compiling^[[0m icu_locale_core v2.1.1 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:57.2203526Z ^[[1m^[[92m Compiling^[[0m potential_utf v0.1.4 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:57.3063242Z ^[[1m^[[92m Compiling^[[0m icu_collections v2.1.1 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:57.9435938Z ^[[1m^[[92m Compiling^[[0m icu_provider v2.1.1 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:58.4709629Z ^[[1m^[[92m Compiling^[[0m block-buffer v0.10.4 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:58.5241329Z ^[[1m^[[92m Compiling^[[0m once_cell v1.21.3 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:58.6573387Z ^[[1m^[[92m Compiling^[[0m serde v1.0.228 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:58.7684495Z ^[[1m^[[92m Compiling^[[0m zmij v1.0.16 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:58.8803428Z ^[[1m^[[92m Compiling^[[0m digest v0.10.7 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:59.0503611Z ^[[1m^[[92m Compiling^[[0m icu_properties v2.1.2 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T16:59:59.2783566Z ^[[1m^[[92m Compiling^[[0m icu_normalizer v2.1.1 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:00.4093042Z ^[[1m^[[92m Compiling^[[0m serde_derive v1.0.228 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:00.6964129Z ^[[1m^[[92m Compiling^[[0m lzma-sys v0.1.20 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:00.8744800Z ^[[1m^[[92m Compiling^[[0m bzip2-sys v0.1.13+1.0.8 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:00.9933445Z ^[[1m^[[92m Compiling^[[0m getrandom v0.2.17 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:01.1467318Z ^[[1m^[[92m Compiling^[[0m thiserror v2.0.18 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:01.3124251Z ^[[1m^[[92m Compiling^[[0m utf8parse v0.2.2 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:01.3533338Z ^[[1m^[[92m Compiling^[[0m zstd-safe v7.2.4 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:01.4453836Z ^[[1m^[[92m Compiling^[[0m serde_json v1.0.149 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:01.5233412Z ^[[1m^[[92m Compiling^[[0m byteorder v1.5.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:01.7085330Z ^[[1m^[[92m Compiling^[[0m untrusted v0.9.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:01.7733191Z ^[[1m^[[92m Compiling^[[0m anstyle-parse v0.2.7 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:10.3573631Z ^[[1m^[[92m Compiling^[[0m idna_adapter v1.2.1 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:10.6746672Z ^[[1m^[[92m Compiling^[[0m thiserror-impl v2.0.18 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:11.6173432Z ^[[1m^[[92m Compiling^[[0m inout v0.1.4 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:11.6884049Z ^[[1m^[[92m Compiling^[[0m colorchoice v1.0.4 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:11.7333695Z ^[[1m^[[92m Compiling^[[0m anstyle v1.0.13 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:11.9284700Z ^[[1m^[[92m Compiling^[[0m rustls v0.23.36 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:11.9903530Z ^[[1m^[[92m Compiling^[[0m object v0.37.3 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:12.1063971Z ^[[1m^[[92m Compiling^[[0m anstyle-query v1.1.5 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:12.1473732Z ^[[1m^[[92m Compiling^[[0m cpufeatures v0.2.17 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:12.1773417Z ^[[1m^[[92m Compiling^[[0m rustix v0.38.44 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:12.3533504Z ^[[1m^[[92m Compiling^[[0m itoa v1.0.17 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:12.5227303Z ^[[1m^[[92m Compiling^[[0m percent-encoding v2.3.2 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:12.6885448Z ^[[1m^[[92m Compiling^[[0m powerfmt v0.2.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:12.8255381Z ^[[1m^[[92m Compiling^[[0m utf8_iter v1.0.4 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:12.8993948Z ^[[1m^[[92m Compiling^[[0m is_terminal_polyfill v1.70.2 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:12.9403927Z ^[[1m^[[92m Compiling^[[0m crc-catalog v2.4.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:12.9883389Z ^[[1m^[[92m Compiling^[[0m autocfg v1.5.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:13.2823452Z ^[[1m^[[92m Compiling^[[0m num-traits v0.2.19 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:13.3525118Z ^[[1m^[[92m Compiling^[[0m crc v3.4.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:13.4923789Z ^[[1m^[[92m Compiling^[[0m anstream v0.6.21 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:13.9623101Z ^[[1m^[[92m Compiling^[[0m idna v1.1.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:15.0843219Z ^[[1m^[[92m Compiling^[[0m deranged v0.5.5 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:15.8253829Z ^[[1m^[[92m Compiling^[[0m form_urlencoded v1.2.2 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:16.2743257Z ^[[1m^[[92m Compiling^[[0m rustls-webpki v0.103.9 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:16.3463829Z ^[[1m^[[92m Compiling^[[0m cipher v0.4.4 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:16.6053219Z ^[[1m^[[92m Compiling^[[0m flate2 v1.1.8 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:17.1063365Z ^[[1m^[[92m Compiling^[[0m hmac v0.12.1 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:17.1903888Z ^[[1m^[[92m Compiling^[[0m webpki-roots v1.0.5 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:17.2563301Z ^[[1m^[[92m Compiling^[[0m zip v2.4.2 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:17.3260967Z ^[[1m^[[92m Compiling^[[0m camino v1.2.2 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:17.4723346Z ^[[1m^[[92m Compiling^[[0m equivalent v1.0.2 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:17.4998345Z ^[[1m^[[92m Compiling^[[0m hashbrown v0.16.1 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:18.1488130Z ^[[1m^[[92m Compiling^[[0m parking_lot_core v0.9.12 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:18.2463036Z ^[[1m^[[92m Compiling^[[0m linux-raw-sys v0.4.15 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:18.4989882Z ^[[1m^[[92m Compiling^[[0m bumpalo v3.19.1 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:18.6923353Z ^[[1m^[[92m Compiling^[[0m time-core v0.1.7 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:18.7863545Z ^[[1m^[[92m Compiling^[[0m num-conv v0.1.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:18.8663795Z ^[[1m^[[92m Compiling^[[0m anyhow v1.0.100 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:18.9374874Z ^[[1m^[[92m Compiling^[[0m gimli v0.32.3 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:19.0143154Z ^[[1m^[[92m Compiling^[[0m winnow v0.7.14 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:19.1592626Z ^[[1m^[[92m Compiling^[[0m time v0.3.45 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:19.7373677Z ^[[1m^[[92m Compiling^[[0m zopfli v0.8.3 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:20.9353725Z ^[[1m^[[92m Compiling^[[0m toml_parser v1.0.6+spec-1.1.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:21.6233323Z ^[[1m^[[92m Compiling^[[0m addr2line v0.25.1 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:22.1806960Z ^[[1m^[[92m Compiling^[[0m indexmap v2.13.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:22.3627661Z ^[[1m^[[92m Compiling^[[0m webpki-roots v0.26.11 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:22.3825754Z ^[[1m^[[92m Compiling^[[0m pbkdf2 v0.12.2 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:22.9583296Z ^[[1m^[[92m Compiling^[[0m bzip2 v0.5.2 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:23.1090580Z ^[[1m^[[92m Compiling^[[0m aes v0.8.4 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:24.8223415Z ^[[1m^[[92m Compiling^[[0m url v2.5.8 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:27.5994506Z ^[[1m^[[92m Compiling^[[0m xz2 v0.1.7 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:27.8010451Z ^[[1m^[[92m Compiling^[[0m lzma-rs v0.3.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:28.0536739Z ^[[1m^[[92m Compiling^[[0m sha1 v0.10.6 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:28.4753846Z ^[[1m^[[92m Compiling^[[0m socks v0.3.4 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:28.5573254Z ^[[1m^[[92m Compiling^[[0m xattr v1.6.1 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:28.9123723Z ^[[1m^[[92m Compiling^[[0m serde_spanned v1.0.4 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:28.9874990Z ^[[1m^[[92m Compiling^[[0m toml_datetime v0.7.5+spec-1.1.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:29.1573851Z ^[[1m^[[92m Compiling^[[0m filetime v0.2.27 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:29.3039438Z ^[[1m^[[92m Compiling^[[0m dirs-sys-next v0.1.2 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:29.3066837Z ^[[1m^[[92m Compiling^[[0m scopeguard v1.2.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:29.3418957Z ^[[1m^[[92m Compiling^[[0m rustc-demangle v0.1.27 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:29.7603261Z ^[[1m^[[92m Compiling^[[0m heck v0.5.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:29.9033760Z ^[[1m^[[92m Compiling^[[0m strsim v0.11.1 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:30.3827276Z ^[[1m^[[92m Compiling^[[0m fastrand v2.3.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:30.5921040Z ^[[1m^[[92m Compiling^[[0m toml_writer v1.0.6+spec-1.1.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:30.7411243Z ^[[1m^[[92m Compiling^[[0m unicode-width v0.2.2 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:30.7843415Z ^[[1m^[[92m Compiling^[[0m clap_lex v0.7.7 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:30.9503943Z ^[[1m^[[92m Compiling^[[0m deflate64 v0.1.10 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:31.0585754Z ^[[1m^[[92m Compiling^[[0m base64 v0.22.1 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:31.4243399Z ^[[1m^[[92m Compiling^[[0m constant_time_eq v0.3.1 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:31.4723571Z ^[[1m^[[92m Compiling^[[0m ureq v2.12.1 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:31.5193523Z ^[[1m^[[92m Compiling^[[0m console v0.16.2 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:32.8563394Z ^[[1m^[[92m Compiling^[[0m zstd v0.13.3 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:32.8753454Z ^[[1m^[[92m Compiling^[[0m clap_builder v4.5.54 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:37.8723857Z ^[[1m^[[92m Compiling^[[0m toml v0.9.11+spec-1.1.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:39.9003567Z ^[[1m^[[92m Compiling^[[0m tempfile v3.24.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:40.8134044Z ^[[1m^[[92m Compiling^[[0m clap_derive v4.5.49 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:42.5313473Z ^[[1m^[[92m Compiling^[[0m backtrace v0.3.76 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:43.0504402Z ^[[1m^[[92m Compiling^[[0m dirs-next v2.0.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:43.1363991Z ^[[1m^[[92m Compiling^[[0m lock_api v0.4.14 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:43.3293106Z ^[[1m^[[92m Compiling^[[0m tar v0.4.44 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:45.7943356Z ^[[1m^[[92m Compiling^[[0m fs4 v0.6.6 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:46.2813458Z ^[[1m^[[92m Compiling^[[0m uuid v1.19.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:46.4333690Z ^[[1m^[[92m Compiling^[[0m env_filter v0.1.4 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:46.7259144Z ^[[1m^[[92m Compiling^[[0m semver v1.0.27 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:46.7373242Z ^[[1m^[[92m Compiling^[[0m cargo-platform v0.3.2 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:47.1583349Z ^[[1m^[[92m Compiling^[[0m sysinfo v0.37.2 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:47.2753891Z ^[[1m^[[92m Compiling^[[0m iana-time-zone v0.1.64 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:47.3562401Z ^[[1m^[[92m Compiling^[[0m siphasher v0.3.11 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:47.5013895Z ^[[1m^[[92m Compiling^[[0m is_executable v0.1.2 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:47.5563354Z ^[[1m^[[92m Compiling^[[0m same-file v1.0.6 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:47.6460774Z ^[[1m^[[92m Compiling^[[0m shell-words v1.1.1 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:47.7153851Z ^[[1m^[[92m Compiling^[[0m env_home v0.1.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:47.7604051Z ^[[1m^[[92m Compiling^[[0m hex v0.4.3 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:47.8353741Z ^[[1m^[[92m Compiling^[[0m which v8.0.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:48.0034052Z ^[[1m^[[92m Compiling^[[0m binary-install v0.4.1 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:48.2118381Z ^[[1m^[[92m Compiling^[[0m human-panic v2.0.6 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:48.3143485Z ^[[1m^[[92m Compiling^[[0m dialoguer v0.12.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:48.8799468Z ^[[1m^[[92m Compiling^[[0m walkdir v2.5.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:49.6793894Z ^[[1m^[[92m Compiling^[[0m chrono v0.4.43 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:50.2353782Z ^[[1m^[[92m Compiling^[[0m cargo_metadata v0.23.1 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:50.3053720Z ^[[1m^[[92m Compiling^[[0m env_logger v0.11.8 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:50.9123857Z ^[[1m^[[92m Compiling^[[0m parking_lot v0.12.5 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:51.6233418Z ^[[1m^[[92m Compiling^[[0m clap v4.5.54 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:51.6623515Z ^[[1m^[[92m Compiling^[[0m serde_ignored v0.1.14 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:51.8273803Z ^[[1m^[[92m Compiling^[[0m glob v0.3.3 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:51.8524066Z ^[[1m^[[92m Compiling^[[0m siphasher v1.0.1 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:51.9933114Z ^[[1m^[[92m Compiling^[[0m path-clean v1.0.1 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:52.1033829Z ^[[1m^[[92m Compiling^[[0m wasm-pack v0.14.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:59.7060281Z ^[[1m^[[92m Finished^[[0m `release` profile [optimized] target(s) in 1m 13s +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:59.7245814Z ^[[1m^[[92m Installing^[[0m /home/runner/.cargo/bin/wasm-pack +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:59.7247883Z ^[[1m^[[92m Installed^[[0m package `wasm-pack v0.14.0` (executable `wasm-pack`) +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:59.8213524Z ##[group]Run actions/setup-node@v4 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:59.8213806Z with: +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:59.8213977Z node-version: 20.x +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:59.8214173Z cache: npm +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:59.8214382Z cache-dependency-path: js/package-lock.json +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:59.8214661Z always-auth: false +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:59.8214852Z check-latest: false +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:59.8215155Z token: *** +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:59.8215329Z env: +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:59.8215492Z CARGO_HOME: /home/runner/.cargo +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:59.8215721Z CARGO_INCREMENTAL: 0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:59.8215912Z CARGO_TERM_COLOR: always +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:00:59.8216115Z ##[endgroup] +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:00.0056913Z Found in cache @ /opt/hostedtoolcache/node/20.20.2/x64 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:00.0064388Z ##[group]Environment details +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:00.3085172Z node: v20.20.2 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:00.3085539Z npm: 10.8.2 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:00.3085845Z yarn: 1.22.22 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:00.3088121Z ##[endgroup] +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:00.3119526Z [command]/opt/hostedtoolcache/node/20.20.2/x64/bin/npm config get cache +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:00.4328496Z /home/runner/.npm +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:00.5308383Z Cache hit for: node-cache-Linux-x64-npm-d315d8b9cf81d047cf497bbcc55d1d84ab2bcc1d591d7e669c7aa9738b286549 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:00.7309887Z Received 19427037 of 19427037 (100.0%), 113.0 MBs/sec +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:00.7310715Z Cache Size: ~19 MB (19427037 B) +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:00.7339437Z [command]/usr/bin/tar -xf /home/runner/work/_temp/365a2b51-ff9a-474c-b1d4-bf9d1f2ea580/cache.tzst -P -C /home/runner/work/link-cli/link-cli --use-compress-program unzstd +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:00.7756565Z Cache restored successfully +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:00.7771143Z Cache restored from key: node-cache-Linux-x64-npm-d315d8b9cf81d047cf497bbcc55d1d84ab2bcc1d591d7e669c7aa9738b286549 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:00.8502337Z ##[group]Run actions/cache@v4 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:00.8502987Z with: +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:00.8503274Z path: ~/.cargo/registry +Build GitHub Pages app UNKNOWN STEP ~/.cargo/git +Build GitHub Pages app UNKNOWN STEP rust/target +Build GitHub Pages app UNKNOWN STEP rust/wasm/target +Build GitHub Pages app UNKNOWN STEP +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:00.8503827Z key: Linux-wasm-pages-cargo-22376137081c5ebc35abde90b3a80a6689287fd12d6f0ceea94e66b1d419e921 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:00.8504366Z restore-keys: Linux-wasm-pages-cargo- +Build GitHub Pages app UNKNOWN STEP Linux-wasm-cargo- +Build GitHub Pages app UNKNOWN STEP +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:00.8504706Z enableCrossOsArchive: false +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:00.8504953Z fail-on-cache-miss: false +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:00.8505170Z lookup-only: false +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:00.8505365Z save-always: false +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:00.8505546Z env: +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:00.8505717Z CARGO_HOME: /home/runner/.cargo +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:00.8505951Z CARGO_INCREMENTAL: 0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:00.8506154Z CARGO_TERM_COLOR: always +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:00.8506351Z ##[endgroup] +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:01.0711397Z Cache hit for restore-key: Linux-wasm-cargo-22376137081c5ebc35abde90b3a80a6689287fd12d6f0ceea94e66b1d419e921 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:02.1249767Z Received 197132288 of 364861180 (54.0%), 188.0 MBs/sec +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:02.8227386Z Received 364861180 of 364861180 (100.0%), 204.9 MBs/sec +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:02.8229449Z Cache Size: ~348 MB (364861180 B) +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:02.8289367Z [command]/usr/bin/tar -xf /home/runner/work/_temp/056ece22-2429-4fc4-a394-20b96477ee85/cache.tzst -P -C /home/runner/work/link-cli/link-cli --use-compress-program unzstd +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:05.8589437Z Cache restored successfully +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:05.8824461Z Cache restored from key: Linux-wasm-cargo-22376137081c5ebc35abde90b3a80a6689287fd12d6f0ceea94e66b1d419e921 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:05.8948297Z ##[group]Run npm ci +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:05.8948705Z ^[[36;1mnpm ci^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:06.2388914Z shell: /usr/bin/bash -e {0} +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:06.2389194Z env: +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:06.2389401Z CARGO_HOME: /home/runner/.cargo +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:06.2389679Z CARGO_INCREMENTAL: 0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:06.2389913Z CARGO_TERM_COLOR: always +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:06.2390150Z ##[endgroup] +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:08.1884827Z +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:08.1885857Z added 23 packages, and audited 24 packages in 2s +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:08.1886426Z +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:08.1886755Z 8 packages are looking for funding +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:08.1887287Z run `npm fund` for details +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:08.1894561Z +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:08.1894921Z found 0 vulnerabilities +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:08.2089729Z ##[group]Run actions/configure-pages@v5 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:08.2090010Z with: +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:08.2090284Z token: *** +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:08.2090472Z enablement: false +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:08.2090659Z env: +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:08.2090839Z CARGO_HOME: /home/runner/.cargo +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:08.2091079Z CARGO_INCREMENTAL: 0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:08.2091280Z CARGO_TERM_COLOR: always +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:08.2091504Z ##[endgroup] +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:08.5828030Z ##[group]Run npm run build:pages +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:08.5828329Z ^[[36;1mnpm run build:pages^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:08.5850191Z shell: /usr/bin/bash -e {0} +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:08.5850439Z env: +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:08.5850626Z CARGO_HOME: /home/runner/.cargo +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:08.5850893Z CARGO_INCREMENTAL: 0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:08.5851110Z CARGO_TERM_COLOR: always +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:08.5851331Z GITHUB_PAGES: true +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:08.5851530Z ##[endgroup] +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:08.7096074Z +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:08.7096418Z > link-cli-web@2.3.0 build:pages +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:08.7097047Z > npm run build:wasm && DEPLOY_TARGET=github-pages npm run build:web +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:08.7097405Z +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:08.8195809Z +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:08.8196505Z > link-cli-web@2.3.0 build:wasm +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:08.8197401Z > wasm-pack build --target web --out-dir ../../js/pkg ../rust/wasm +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:08.8197913Z +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:08.9429974Z [INFO]: 🎯 Checking for the Wasm target... +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:08.9708788Z [INFO]: 🌀 Compiling to Wasm... +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:09.0504407Z ^[[1m^[[92m Compiling^[[0m link-cli v0.1.0 (/home/runner/work/link-cli/link-cli/rust) +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:10.1592557Z ^[[1m^[[92m Compiling^[[0m clink-wasm v2.3.0 (/home/runner/work/link-cli/link-cli/rust/wasm) +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:10.9271692Z ^[[1m^[[92m Finished^[[0m `release` profile [optimized] target(s) in 1.94s +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:10.9360025Z [INFO]: ⬇️ Installing wasm-bindgen... +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:12.5918769Z [INFO]: Optimizing wasm binaries with `wasm-opt`... +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.0036615Z [INFO]: License key is set in Cargo.toml but no LICENSE file(s) were found; Please add the LICENSE file(s) to your project directory +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.0037667Z [INFO]: ✨ Done in 7.07s +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.0038324Z [INFO]: 📦 Your wasm pkg is ready to publish at ../js/pkg. +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.1165496Z +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.1166167Z > link-cli-web@2.3.0 build:web +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.1166614Z > vite build --config vite.config.js +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.1166826Z +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.3137420Z ^[[36mvite v8.0.10 ^[[32mbuilding client environment for production...^[[36m^[[39m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.3247596Z ^[[2K +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.5766912Z transforming...✓ 1737 modules transformed. +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.6041754Z rendering chunks... +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.6403227Z computing gzip size... +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.6456021Z ../dist/assets/favicon-CIVoLc1m.svg 0.37 kB │ gzip: 0.24 kB +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.6457026Z ../dist/index.html 0.66 kB │ gzip: 0.39 kB +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.6457649Z ../dist/assets/doublets_web_bg-cVQpTmMF.wasm 51.41 kB │ gzip: 20.96 kB +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.6458253Z ../dist/assets/clink_wasm_bg-Bog79H2E.wasm 284.42 kB │ gzip: 123.90 kB +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.6458886Z ../dist/assets/index-D8XZ-J-o.css 5.91 kB │ gzip: 2.07 kB +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.6459563Z ../dist/assets/index-C4SsNzaJ.js 220.97 kB │ gzip: 68.69 kB +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.6460036Z +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.6460358Z ^[[32m✓ built in 331ms^[[39m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.6808257Z ##[group]Run actions/upload-pages-artifact@v4 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.6808561Z with: +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.6808736Z path: dist/ +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.6808926Z name: github-pages +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.6809133Z retention-days: 1 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.6809362Z env: +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.6809549Z CARGO_HOME: /home/runner/.cargo +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.6809814Z CARGO_INCREMENTAL: 0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.6810018Z CARGO_TERM_COLOR: always +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.6810234Z GITHUB_PAGES: true +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.6810429Z ##[endgroup] +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.6828955Z ##[group]Run echo ::group::Archive artifact +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.6829402Z ^[[36;1mecho ::group::Archive artifact^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.6829793Z ^[[36;1mtar \^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.6830103Z ^[[36;1m --dereference --hard-dereference \^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.6830557Z ^[[36;1m --directory "$INPUT_PATH" \^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.6830932Z ^[[36;1m -cvf "$RUNNER_TEMP/artifact.tar" \^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.6831329Z ^[[36;1m --exclude=.git \^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.6831766Z ^[[36;1m --exclude=.github \^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.6832393Z ^[[36;1m --exclude=".[^/]*" \^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.6832810Z ^[[36;1m .^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.6833096Z ^[[36;1mecho ::endgroup::^[[0m +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.6868856Z shell: /usr/bin/sh -e {0} +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.6869176Z env: +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.6869567Z CARGO_HOME: /home/runner/.cargo +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.6869915Z CARGO_INCREMENTAL: 0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.6870254Z CARGO_TERM_COLOR: always +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.6870590Z GITHUB_PAGES: true +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.6870892Z INPUT_PATH: dist/ +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.6871207Z ##[endgroup] +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.6922303Z ##[group]Archive artifact +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.6935333Z ./ +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.6935804Z ./assets/ +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.6936303Z ./assets/favicon-CIVoLc1m.svg +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.6937099Z ./assets/clink_wasm_bg-Bog79H2E.wasm +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.6938224Z ./assets/index-D8XZ-J-o.css +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.6938934Z ./assets/doublets_web_bg-cVQpTmMF.wasm +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.6939559Z ./assets/index-C4SsNzaJ.js +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.6941336Z ./index.html +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.6944232Z ##[endgroup] +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.6997978Z ##[group]Run actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.6998443Z with: +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.6998703Z name: github-pages +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.6999302Z path: /home/runner/work/_temp/artifact.tar +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.6999633Z retention-days: 1 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.6999924Z if-no-files-found: error +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.7000302Z compression-level: 6 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.7000603Z overwrite: false +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.7000933Z include-hidden-files: false +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.7001297Z env: +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.7001569Z CARGO_HOME: /home/runner/.cargo +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.7001891Z CARGO_INCREMENTAL: 0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.7002592Z CARGO_TERM_COLOR: always +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.7002912Z GITHUB_PAGES: true +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.7003300Z ##[endgroup] +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.9393384Z With the provided path, there will be 1 file uploaded +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.9400199Z Artifact name is valid! +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:16.9402282Z Root directory input is valid! +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:17.0606830Z Beginning upload of artifact content to blob storage +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:17.1414197Z Uploaded bytes 215777 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:17.1577015Z Finished uploading artifact content to blob storage! +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:17.1580117Z SHA256 digest of uploaded artifact zip is fe37de9db502d4aab784156b1016feb54f19a6120d43d8742bcd61de173aabe1 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:17.1582474Z Finalizing artifact upload +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:17.2725714Z Artifact github-pages.zip successfully finalized. Artifact ID 6950623391 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:17.2727113Z Artifact github-pages has been successfully uploaded! Final size is 215777 bytes. Artifact ID is 6950623391 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:17.2734575Z Artifact download URL: https://github.com/link-foundation/link-cli/actions/runs/25749403949/artifacts/6950623391 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:17.3404927Z Post job cleanup. +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:17.4940917Z [command]/usr/bin/tar --posix -cf cache.tzst --exclude cache.tzst -P -C /home/runner/work/link-cli/link-cli --files-from manifest.txt --use-compress-program zstdmt +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:22.2327719Z Sent 96347141 of 364782597 (26.4%), 91.9 MBs/sec +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:22.4739220Z Sent 364782597 of 364782597 (100.0%), 280.3 MBs/sec +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:22.6065062Z Cache saved with key: Linux-wasm-pages-cargo-22376137081c5ebc35abde90b3a80a6689287fd12d6f0ceea94e66b1d419e921 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:22.6185274Z Post job cleanup. +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:22.7753939Z Cache hit occurred on the primary key node-cache-Linux-x64-npm-d315d8b9cf81d047cf497bbcc55d1d84ab2bcc1d591d7e669c7aa9738b286549, not saving cache. +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:22.7872551Z Post job cleanup. +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:22.8845936Z [command]/usr/bin/git version +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:22.8881699Z git version 2.53.0 +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:22.8926319Z Temporarily overriding HOME='/home/runner/work/_temp/acdca4d2-81ff-45d5-b0e3-4cded3122147' before making global git config changes +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:22.8927384Z Adding repository directory to the temporary git global config as a safe directory +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:22.8938923Z [command]/usr/bin/git config --global --add safe.directory /home/runner/work/link-cli/link-cli +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:22.8972422Z [command]/usr/bin/git config --local --name-only --get-regexp core\.sshCommand +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:22.9003848Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :" +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:22.9225558Z [command]/usr/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:22.9246296Z http.https://github.com/.extraheader +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:22.9258849Z [command]/usr/bin/git config --local --unset-all http.https://github.com/.extraheader +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:22.9288859Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'http\.https\:\/\/github\.com\/\.extraheader' && git config --local --unset-all 'http.https://github.com/.extraheader' || :" +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:22.9504687Z [command]/usr/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir: +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:22.9535111Z [command]/usr/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:22.9869116Z Cleaning up orphan processes +Build GitHub Pages app UNKNOWN STEP 2026-05-12T17:01:23.0189554Z ##[warning]Node.js 20 actions are deprecated. The following actions are running on Node.js 20 and may not work as expected: actions/cache@v4, actions/checkout@v4, actions/configure-pages@v5, actions/setup-node@v4, actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02. Actions will be forced to run with Node.js 24 by default starting June 2nd, 2026. Node.js 20 will be removed from the runner on September 16th, 2026. Please check if updated versions of these actions are available that support Node.js 24. To opt into Node.js 24 now, set the FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=true environment variable on the runner or in your workflow file. Once Node.js 24 becomes the default, you can temporarily opt out by setting ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION=true. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/ +Deploy GitHub Pages UNKNOWN STEP 2026-05-12T17:01:35.5107488Z Current runner version: '2.334.0' +Deploy GitHub Pages UNKNOWN STEP 2026-05-12T17:01:35.5135850Z ##[group]Runner Image Provisioner +Deploy GitHub Pages UNKNOWN STEP 2026-05-12T17:01:35.5136610Z Hosted Compute Agent +Deploy GitHub Pages UNKNOWN STEP 2026-05-12T17:01:35.5137180Z Version: 20260213.493 +Deploy GitHub Pages UNKNOWN STEP 2026-05-12T17:01:35.5137864Z Commit: 5c115507f6dd24b8de37d8bbe0bb4509d0cc0fa3 +Deploy GitHub Pages UNKNOWN STEP 2026-05-12T17:01:35.5138524Z Build Date: 2026-02-13T00:28:41Z +Deploy GitHub Pages UNKNOWN STEP 2026-05-12T17:01:35.5139218Z Worker ID: {31eaf131-1256-4bbd-a8ca-dfadff4706dd} +Deploy GitHub Pages UNKNOWN STEP 2026-05-12T17:01:35.5139919Z Azure Region: eastus2 +Deploy GitHub Pages UNKNOWN STEP 2026-05-12T17:01:35.5140491Z ##[endgroup] +Deploy GitHub Pages UNKNOWN STEP 2026-05-12T17:01:35.5141726Z ##[group]Operating System +Deploy GitHub Pages UNKNOWN STEP 2026-05-12T17:01:35.5142360Z Ubuntu +Deploy GitHub Pages UNKNOWN STEP 2026-05-12T17:01:35.5142813Z 24.04.4 +Deploy GitHub Pages UNKNOWN STEP 2026-05-12T17:01:35.5143324Z LTS +Deploy GitHub Pages UNKNOWN STEP 2026-05-12T17:01:35.5143736Z ##[endgroup] +Deploy GitHub Pages UNKNOWN STEP 2026-05-12T17:01:35.5144652Z ##[group]Runner Image +Deploy GitHub Pages UNKNOWN STEP 2026-05-12T17:01:35.5145225Z Image: ubuntu-24.04 +Deploy GitHub Pages UNKNOWN STEP 2026-05-12T17:01:35.5145682Z Version: 20260413.86.1 +Deploy GitHub Pages UNKNOWN STEP 2026-05-12T17:01:35.5147030Z Included Software: https://github.com/actions/runner-images/blob/ubuntu24/20260413.86/images/ubuntu/Ubuntu2404-Readme.md +Deploy GitHub Pages UNKNOWN STEP 2026-05-12T17:01:35.5148478Z Image Release: https://github.com/actions/runner-images/releases/tag/ubuntu24%2F20260413.86 +Deploy GitHub Pages UNKNOWN STEP 2026-05-12T17:01:35.5149351Z ##[endgroup] +Deploy GitHub Pages UNKNOWN STEP 2026-05-12T17:01:35.5150433Z ##[group]GITHUB_TOKEN Permissions +Deploy GitHub Pages UNKNOWN STEP 2026-05-12T17:01:35.5152827Z Contents: read +Deploy GitHub Pages UNKNOWN STEP 2026-05-12T17:01:35.5153424Z Metadata: read +Deploy GitHub Pages UNKNOWN STEP 2026-05-12T17:01:35.5153898Z Pages: write +Deploy GitHub Pages UNKNOWN STEP 2026-05-12T17:01:35.5154834Z ##[endgroup] +Deploy GitHub Pages UNKNOWN STEP 2026-05-12T17:01:35.5157325Z Secret source: Actions +Deploy GitHub Pages UNKNOWN STEP 2026-05-12T17:01:35.5158234Z Prepare workflow directory +Deploy GitHub Pages UNKNOWN STEP 2026-05-12T17:01:35.5492520Z Prepare all required actions +Deploy GitHub Pages UNKNOWN STEP 2026-05-12T17:01:35.5529972Z Getting action download info +Deploy GitHub Pages UNKNOWN STEP 2026-05-12T17:01:35.8559522Z Download action repository 'actions/deploy-pages@v4' (SHA:d6db90164ac5ed86f2b6aed7e0febac5b3c0c03e) +Deploy GitHub Pages UNKNOWN STEP 2026-05-12T17:01:36.6232411Z Complete job name: Deploy GitHub Pages +Deploy GitHub Pages UNKNOWN STEP 2026-05-12T17:01:36.6996735Z ##[group]Run actions/deploy-pages@v4 +Deploy GitHub Pages UNKNOWN STEP 2026-05-12T17:01:36.6997623Z with: +Deploy GitHub Pages UNKNOWN STEP 2026-05-12T17:01:36.6998227Z token: *** +Deploy GitHub Pages UNKNOWN STEP 2026-05-12T17:01:36.6998655Z timeout: 600000 +Deploy GitHub Pages UNKNOWN STEP 2026-05-12T17:01:36.6999102Z error_count: 10 +Deploy GitHub Pages UNKNOWN STEP 2026-05-12T17:01:36.6999537Z reporting_interval: 5000 +Deploy GitHub Pages UNKNOWN STEP 2026-05-12T17:01:36.7000028Z artifact_name: github-pages +Deploy GitHub Pages UNKNOWN STEP 2026-05-12T17:01:36.7000520Z preview: false +Deploy GitHub Pages UNKNOWN STEP 2026-05-12T17:01:36.7001088Z ##[endgroup] +Deploy GitHub Pages UNKNOWN STEP 2026-05-12T17:01:37.0572031Z Fetching artifact metadata for "github-pages" in this workflow run +Deploy GitHub Pages UNKNOWN STEP 2026-05-12T17:01:37.1430289Z Found 2 artifact(s) +Deploy GitHub Pages UNKNOWN STEP 2026-05-12T17:01:37.1444487Z Creating Pages deployment with payload: +Deploy GitHub Pages UNKNOWN STEP 2026-05-12T17:01:37.1445517Z { +Deploy GitHub Pages UNKNOWN STEP 2026-05-12T17:01:37.1446231Z "artifact_id": 6950623391, +Deploy GitHub Pages UNKNOWN STEP 2026-05-12T17:01:37.1447340Z "pages_build_version": "d47e551d2d66c7bfe93f9a869ce9fab36347e317", +Deploy GitHub Pages UNKNOWN STEP 2026-05-12T17:01:37.1551854Z "oidc_token": "***" +Deploy GitHub Pages UNKNOWN STEP 2026-05-12T17:01:37.1552722Z } +Deploy GitHub Pages UNKNOWN STEP 2026-05-12T17:01:37.4518459Z Created deployment for d47e551d2d66c7bfe93f9a869ce9fab36347e317, ID: d47e551d2d66c7bfe93f9a869ce9fab36347e317 +Deploy GitHub Pages UNKNOWN STEP 2026-05-12T17:01:42.4533444Z Getting Pages deployment status... +Deploy GitHub Pages UNKNOWN STEP 2026-05-12T17:01:42.5693886Z Reported success! +Deploy GitHub Pages UNKNOWN STEP 2026-05-12T17:01:42.5954409Z Evaluate and set environment url +Deploy GitHub Pages UNKNOWN STEP 2026-05-12T17:01:42.5959267Z Evaluated environment url: https://link-foundation.github.io/link-cli/ +Deploy GitHub Pages UNKNOWN STEP 2026-05-12T17:01:42.5960267Z Cleaning up orphan processes +Deploy GitHub Pages UNKNOWN STEP 2026-05-12T17:01:42.6254855Z ##[warning]Node.js 20 actions are deprecated. The following actions are running on Node.js 20 and may not work as expected: actions/deploy-pages@v4. Actions will be forced to run with Node.js 24 by default starting June 2nd, 2026. Node.js 20 will be removed from the runner on September 16th, 2026. Please check if updated versions of these actions are available that support Node.js 24. To opt into Node.js 24 now, set the FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=true environment variable on the runner or in your workflow file. Once Node.js 24 becomes the default, you can temporarily opt out by setting ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION=true. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/ diff --git a/docs/case-studies/issue-82/evidence/run-25749404027-csharp.json b/docs/case-studies/issue-82/evidence/run-25749404027-csharp.json new file mode 100644 index 0000000..feb26d1 --- /dev/null +++ b/docs/case-studies/issue-82/evidence/run-25749404027-csharp.json @@ -0,0 +1 @@ +{"conclusion":"success","createdAt":"2026-05-12T16:57:36Z","databaseId":25749404027,"event":"push","headBranch":"main","headSha":"d47e551d2d66c7bfe93f9a869ce9fab36347e317","jobs":[{"completedAt":"2026-05-12T16:57:47Z","conclusion":"success","databaseId":75621390699,"name":"Detect Changes","startedAt":"2026-05-12T16:57:40Z","status":"completed","steps":[{"completedAt":"2026-05-12T16:57:41Z","conclusion":"success","name":"Set up job","number":1,"startedAt":"2026-05-12T16:57:41Z","status":"completed"},{"completedAt":"2026-05-12T16:57:43Z","conclusion":"success","name":"Run actions/checkout@v4","number":2,"startedAt":"2026-05-12T16:57:41Z","status":"completed"},{"completedAt":"2026-05-12T16:57:43Z","conclusion":"success","name":"Setup Node.js","number":3,"startedAt":"2026-05-12T16:57:43Z","status":"completed"},{"completedAt":"2026-05-12T16:57:44Z","conclusion":"success","name":"Detect changes","number":4,"startedAt":"2026-05-12T16:57:43Z","status":"completed"},{"completedAt":"2026-05-12T16:57:44Z","conclusion":"success","name":"Post Setup Node.js","number":7,"startedAt":"2026-05-12T16:57:44Z","status":"completed"},{"completedAt":"2026-05-12T16:57:44Z","conclusion":"success","name":"Post Run actions/checkout@v4","number":8,"startedAt":"2026-05-12T16:57:44Z","status":"completed"},{"completedAt":"2026-05-12T16:57:44Z","conclusion":"success","name":"Complete job","number":9,"startedAt":"2026-05-12T16:57:44Z","status":"completed"}],"url":"https://github.com/link-foundation/link-cli/actions/runs/25749404027/job/75621390699"},{"completedAt":"2026-05-12T16:58:23Z","conclusion":"success","databaseId":75621425031,"name":"Lint and Format Check","startedAt":"2026-05-12T16:57:56Z","status":"completed","steps":[{"completedAt":"2026-05-12T16:57:58Z","conclusion":"success","name":"Set up job","number":1,"startedAt":"2026-05-12T16:57:57Z","status":"completed"},{"completedAt":"2026-05-12T16:57:59Z","conclusion":"success","name":"Run actions/checkout@v4","number":2,"startedAt":"2026-05-12T16:57:58Z","status":"completed"},{"completedAt":"2026-05-12T16:58:07Z","conclusion":"success","name":"Setup .NET","number":3,"startedAt":"2026-05-12T16:57:59Z","status":"completed"},{"completedAt":"2026-05-12T16:58:08Z","conclusion":"success","name":"Setup Node.js","number":4,"startedAt":"2026-05-12T16:58:07Z","status":"completed"},{"completedAt":"2026-05-12T16:58:08Z","conclusion":"success","name":"Run release script tests","number":5,"startedAt":"2026-05-12T16:58:08Z","status":"completed"},{"completedAt":"2026-05-12T16:58:13Z","conclusion":"success","name":"Restore dependencies","number":6,"startedAt":"2026-05-12T16:58:08Z","status":"completed"},{"completedAt":"2026-05-12T16:58:20Z","conclusion":"success","name":"Build","number":7,"startedAt":"2026-05-12T16:58:13Z","status":"completed"},{"completedAt":"2026-05-12T16:58:21Z","conclusion":"success","name":"Post Setup Node.js","number":12,"startedAt":"2026-05-12T16:58:20Z","status":"completed"},{"completedAt":"2026-05-12T16:58:21Z","conclusion":"success","name":"Post Setup .NET","number":13,"startedAt":"2026-05-12T16:58:21Z","status":"completed"},{"completedAt":"2026-05-12T16:58:21Z","conclusion":"success","name":"Post Run actions/checkout@v4","number":14,"startedAt":"2026-05-12T16:58:21Z","status":"completed"},{"completedAt":"2026-05-12T16:58:21Z","conclusion":"success","name":"Complete job","number":15,"startedAt":"2026-05-12T16:58:21Z","status":"completed"}],"url":"https://github.com/link-foundation/link-cli/actions/runs/25749404027/job/75621425031"},{"completedAt":"2026-05-12T16:58:34Z","conclusion":"success","databaseId":75621425513,"name":"Test (macos-latest)","startedAt":"2026-05-12T16:57:50Z","status":"completed","steps":[{"completedAt":"2026-05-12T16:57:53Z","conclusion":"success","name":"Set up job","number":1,"startedAt":"2026-05-12T16:57:50Z","status":"completed"},{"completedAt":"2026-05-12T16:57:55Z","conclusion":"success","name":"Run actions/checkout@v4","number":2,"startedAt":"2026-05-12T16:57:53Z","status":"completed"},{"completedAt":"2026-05-12T16:57:58Z","conclusion":"success","name":"Setup .NET","number":3,"startedAt":"2026-05-12T16:57:55Z","status":"completed"},{"completedAt":"2026-05-12T16:58:05Z","conclusion":"success","name":"Restore dependencies","number":4,"startedAt":"2026-05-12T16:57:58Z","status":"completed"},{"completedAt":"2026-05-12T16:58:10Z","conclusion":"success","name":"Build","number":5,"startedAt":"2026-05-12T16:58:05Z","status":"completed"},{"completedAt":"2026-05-12T16:58:30Z","conclusion":"success","name":"Run tests","number":6,"startedAt":"2026-05-12T16:58:10Z","status":"completed"},{"completedAt":"2026-05-12T16:58:30Z","conclusion":"skipped","name":"Upload coverage to Codecov","number":7,"startedAt":"2026-05-12T16:58:30Z","status":"completed"},{"completedAt":"2026-05-12T16:58:31Z","conclusion":"success","name":"Post Setup .NET","number":13,"startedAt":"2026-05-12T16:58:30Z","status":"completed"},{"completedAt":"2026-05-12T16:58:31Z","conclusion":"success","name":"Post Run actions/checkout@v4","number":14,"startedAt":"2026-05-12T16:58:31Z","status":"completed"},{"completedAt":"2026-05-12T16:58:32Z","conclusion":"success","name":"Complete job","number":15,"startedAt":"2026-05-12T16:58:31Z","status":"completed"}],"url":"https://github.com/link-foundation/link-cli/actions/runs/25749404027/job/75621425513"},{"completedAt":"2026-05-12T16:58:47Z","conclusion":"success","databaseId":75621425514,"name":"Test (ubuntu-latest)","startedAt":"2026-05-12T16:57:50Z","status":"completed","steps":[{"completedAt":"2026-05-12T16:57:53Z","conclusion":"success","name":"Set up job","number":1,"startedAt":"2026-05-12T16:57:51Z","status":"completed"},{"completedAt":"2026-05-12T16:57:55Z","conclusion":"success","name":"Run actions/checkout@v4","number":2,"startedAt":"2026-05-12T16:57:53Z","status":"completed"},{"completedAt":"2026-05-12T16:58:06Z","conclusion":"success","name":"Setup .NET","number":3,"startedAt":"2026-05-12T16:57:55Z","status":"completed"},{"completedAt":"2026-05-12T16:58:12Z","conclusion":"success","name":"Restore dependencies","number":4,"startedAt":"2026-05-12T16:58:06Z","status":"completed"},{"completedAt":"2026-05-12T16:58:19Z","conclusion":"success","name":"Build","number":5,"startedAt":"2026-05-12T16:58:12Z","status":"completed"},{"completedAt":"2026-05-12T16:58:41Z","conclusion":"success","name":"Run tests","number":6,"startedAt":"2026-05-12T16:58:19Z","status":"completed"},{"completedAt":"2026-05-12T16:58:45Z","conclusion":"success","name":"Upload coverage to Codecov","number":7,"startedAt":"2026-05-12T16:58:41Z","status":"completed"},{"completedAt":"2026-05-12T16:58:45Z","conclusion":"success","name":"Post Setup .NET","number":13,"startedAt":"2026-05-12T16:58:45Z","status":"completed"},{"completedAt":"2026-05-12T16:58:45Z","conclusion":"success","name":"Post Run actions/checkout@v4","number":14,"startedAt":"2026-05-12T16:58:45Z","status":"completed"},{"completedAt":"2026-05-12T16:58:45Z","conclusion":"success","name":"Complete job","number":15,"startedAt":"2026-05-12T16:58:45Z","status":"completed"}],"url":"https://github.com/link-foundation/link-cli/actions/runs/25749404027/job/75621425514"},{"completedAt":"2026-05-12T16:59:57Z","conclusion":"success","databaseId":75621425519,"name":"Test (windows-latest)","startedAt":"2026-05-12T16:57:50Z","status":"completed","steps":[{"completedAt":"2026-05-12T16:57:54Z","conclusion":"success","name":"Set up job","number":1,"startedAt":"2026-05-12T16:57:51Z","status":"completed"},{"completedAt":"2026-05-12T16:57:58Z","conclusion":"success","name":"Run actions/checkout@v4","number":2,"startedAt":"2026-05-12T16:57:54Z","status":"completed"},{"completedAt":"2026-05-12T16:58:12Z","conclusion":"success","name":"Setup .NET","number":3,"startedAt":"2026-05-12T16:57:58Z","status":"completed"},{"completedAt":"2026-05-12T16:59:08Z","conclusion":"success","name":"Restore dependencies","number":4,"startedAt":"2026-05-12T16:58:12Z","status":"completed"},{"completedAt":"2026-05-12T16:59:24Z","conclusion":"success","name":"Build","number":5,"startedAt":"2026-05-12T16:59:08Z","status":"completed"},{"completedAt":"2026-05-12T16:59:53Z","conclusion":"success","name":"Run tests","number":6,"startedAt":"2026-05-12T16:59:24Z","status":"completed"},{"completedAt":"2026-05-12T16:59:53Z","conclusion":"skipped","name":"Upload coverage to Codecov","number":7,"startedAt":"2026-05-12T16:59:53Z","status":"completed"},{"completedAt":"2026-05-12T16:59:53Z","conclusion":"success","name":"Post Setup .NET","number":13,"startedAt":"2026-05-12T16:59:53Z","status":"completed"},{"completedAt":"2026-05-12T16:59:55Z","conclusion":"success","name":"Post Run actions/checkout@v4","number":14,"startedAt":"2026-05-12T16:59:53Z","status":"completed"},{"completedAt":"2026-05-12T16:59:55Z","conclusion":"success","name":"Complete job","number":15,"startedAt":"2026-05-12T16:59:55Z","status":"completed"}],"url":"https://github.com/link-foundation/link-cli/actions/runs/25749404027/job/75621425519"},{"completedAt":"2026-05-12T16:57:48Z","conclusion":"skipped","databaseId":75621425587,"name":"Changeset Validation","startedAt":"2026-05-12T16:57:48Z","status":"completed","steps":[],"url":"https://github.com/link-foundation/link-cli/actions/runs/25749404027/job/75621425587"},{"completedAt":"2026-05-12T17:00:28Z","conclusion":"success","databaseId":75621828212,"name":"Build Package","startedAt":"2026-05-12T17:00:00Z","status":"completed","steps":[{"completedAt":"2026-05-12T17:00:02Z","conclusion":"success","name":"Set up job","number":1,"startedAt":"2026-05-12T17:00:01Z","status":"completed"},{"completedAt":"2026-05-12T17:00:04Z","conclusion":"success","name":"Run actions/checkout@v4","number":2,"startedAt":"2026-05-12T17:00:02Z","status":"completed"},{"completedAt":"2026-05-12T17:00:11Z","conclusion":"success","name":"Setup .NET","number":3,"startedAt":"2026-05-12T17:00:04Z","status":"completed"},{"completedAt":"2026-05-12T17:00:17Z","conclusion":"success","name":"Restore dependencies","number":4,"startedAt":"2026-05-12T17:00:11Z","status":"completed"},{"completedAt":"2026-05-12T17:00:25Z","conclusion":"success","name":"Build Release","number":5,"startedAt":"2026-05-12T17:00:17Z","status":"completed"},{"completedAt":"2026-05-12T17:00:26Z","conclusion":"success","name":"Pack NuGet package","number":6,"startedAt":"2026-05-12T17:00:25Z","status":"completed"},{"completedAt":"2026-05-12T17:00:27Z","conclusion":"success","name":"Upload artifacts","number":7,"startedAt":"2026-05-12T17:00:26Z","status":"completed"},{"completedAt":"2026-05-12T17:00:27Z","conclusion":"success","name":"Post Setup .NET","number":13,"startedAt":"2026-05-12T17:00:27Z","status":"completed"},{"completedAt":"2026-05-12T17:00:27Z","conclusion":"success","name":"Post Run actions/checkout@v4","number":14,"startedAt":"2026-05-12T17:00:27Z","status":"completed"},{"completedAt":"2026-05-12T17:00:27Z","conclusion":"success","name":"Complete job","number":15,"startedAt":"2026-05-12T17:00:27Z","status":"completed"}],"url":"https://github.com/link-foundation/link-cli/actions/runs/25749404027/job/75621828212"},{"completedAt":"2026-05-12T17:00:54Z","conclusion":"success","databaseId":75621931428,"name":"Release","startedAt":"2026-05-12T17:00:37Z","status":"completed","steps":[{"completedAt":"2026-05-12T17:00:40Z","conclusion":"success","name":"Set up job","number":1,"startedAt":"2026-05-12T17:00:38Z","status":"completed"},{"completedAt":"2026-05-12T17:00:41Z","conclusion":"success","name":"Run actions/checkout@v4","number":2,"startedAt":"2026-05-12T17:00:40Z","status":"completed"},{"completedAt":"2026-05-12T17:00:48Z","conclusion":"success","name":"Setup .NET","number":3,"startedAt":"2026-05-12T17:00:41Z","status":"completed"},{"completedAt":"2026-05-12T17:00:52Z","conclusion":"success","name":"Setup Node.js","number":4,"startedAt":"2026-05-12T17:00:48Z","status":"completed"},{"completedAt":"2026-05-12T17:00:52Z","conclusion":"success","name":"Check for changesets","number":5,"startedAt":"2026-05-12T17:00:52Z","status":"completed"},{"completedAt":"2026-05-12T17:00:52Z","conclusion":"success","name":"Merge multiple changesets","number":6,"startedAt":"2026-05-12T17:00:52Z","status":"completed"},{"completedAt":"2026-05-12T17:00:52Z","conclusion":"success","name":"Version and commit","number":7,"startedAt":"2026-05-12T17:00:52Z","status":"completed"},{"completedAt":"2026-05-12T17:00:52Z","conclusion":"skipped","name":"Build release package","number":8,"startedAt":"2026-05-12T17:00:52Z","status":"completed"},{"completedAt":"2026-05-12T17:00:52Z","conclusion":"skipped","name":"Resolve NuGet package id","number":9,"startedAt":"2026-05-12T17:00:52Z","status":"completed"},{"completedAt":"2026-05-12T17:00:52Z","conclusion":"skipped","name":"Publish to NuGet","number":10,"startedAt":"2026-05-12T17:00:52Z","status":"completed"},{"completedAt":"2026-05-12T17:00:52Z","conclusion":"skipped","name":"Create GitHub Release","number":11,"startedAt":"2026-05-12T17:00:52Z","status":"completed"},{"completedAt":"2026-05-12T17:00:52Z","conclusion":"success","name":"Post Setup Node.js","number":20,"startedAt":"2026-05-12T17:00:52Z","status":"completed"},{"completedAt":"2026-05-12T17:00:52Z","conclusion":"success","name":"Post Setup .NET","number":21,"startedAt":"2026-05-12T17:00:52Z","status":"completed"},{"completedAt":"2026-05-12T17:00:52Z","conclusion":"success","name":"Post Run actions/checkout@v4","number":22,"startedAt":"2026-05-12T17:00:52Z","status":"completed"},{"completedAt":"2026-05-12T17:00:52Z","conclusion":"success","name":"Complete job","number":23,"startedAt":"2026-05-12T17:00:52Z","status":"completed"}],"url":"https://github.com/link-foundation/link-cli/actions/runs/25749404027/job/75621931428"},{"completedAt":"2026-05-12T17:00:29Z","conclusion":"skipped","databaseId":75621932843,"name":"Instant Release","startedAt":"2026-05-12T17:00:29Z","status":"completed","steps":[],"url":"https://github.com/link-foundation/link-cli/actions/runs/25749404027/job/75621932843"}],"name":"C# CI/CD Pipeline","status":"completed","url":"https://github.com/link-foundation/link-cli/actions/runs/25749404027","workflowName":"C# CI/CD Pipeline"} diff --git a/docs/case-studies/issue-82/evidence/run-25749404027-csharp.log b/docs/case-studies/issue-82/evidence/run-25749404027-csharp.log new file mode 100644 index 0000000..3c1a818 --- /dev/null +++ b/docs/case-studies/issue-82/evidence/run-25749404027-csharp.log @@ -0,0 +1,5878 @@ +Detect Changes UNKNOWN STEP 2026-05-12T16:57:41.0674996Z Current runner version: '2.334.0' +Detect Changes UNKNOWN STEP 2026-05-12T16:57:41.0708356Z ##[group]Runner Image Provisioner +Detect Changes UNKNOWN STEP 2026-05-12T16:57:41.0709717Z Hosted Compute Agent +Detect Changes UNKNOWN STEP 2026-05-12T16:57:41.0710727Z Version: 20260213.493 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:41.0711711Z Commit: 5c115507f6dd24b8de37d8bbe0bb4509d0cc0fa3 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:41.0713032Z Build Date: 2026-02-13T00:28:41Z +Detect Changes UNKNOWN STEP 2026-05-12T16:57:41.0714120Z Worker ID: {d07d09d4-af2a-4f03-9fd9-54e5ea8392a0} +Detect Changes UNKNOWN STEP 2026-05-12T16:57:41.0715293Z Azure Region: westus2 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:41.0716437Z ##[endgroup] +Detect Changes UNKNOWN STEP 2026-05-12T16:57:41.0719114Z ##[group]Operating System +Detect Changes UNKNOWN STEP 2026-05-12T16:57:41.0719923Z Ubuntu +Detect Changes UNKNOWN STEP 2026-05-12T16:57:41.0720566Z 24.04.4 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:41.0721215Z LTS +Detect Changes UNKNOWN STEP 2026-05-12T16:57:41.0721748Z ##[endgroup] +Detect Changes UNKNOWN STEP 2026-05-12T16:57:41.0722425Z ##[group]Runner Image +Detect Changes UNKNOWN STEP 2026-05-12T16:57:41.0723083Z Image: ubuntu-24.04 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:41.0723741Z Version: 20260413.86.1 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:41.0725697Z Included Software: https://github.com/actions/runner-images/blob/ubuntu24/20260413.86/images/ubuntu/Ubuntu2404-Readme.md +Detect Changes UNKNOWN STEP 2026-05-12T16:57:41.0727849Z Image Release: https://github.com/actions/runner-images/releases/tag/ubuntu24%2F20260413.86 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:41.0728878Z ##[endgroup] +Detect Changes UNKNOWN STEP 2026-05-12T16:57:41.0732176Z ##[group]GITHUB_TOKEN Permissions +Detect Changes UNKNOWN STEP 2026-05-12T16:57:41.0734380Z Actions: write +Detect Changes UNKNOWN STEP 2026-05-12T16:57:41.0735072Z ArtifactMetadata: write +Detect Changes UNKNOWN STEP 2026-05-12T16:57:41.0735652Z Attestations: write +Detect Changes UNKNOWN STEP 2026-05-12T16:57:41.0736125Z Checks: write +Detect Changes UNKNOWN STEP 2026-05-12T16:57:41.0736695Z CodeQuality: write +Detect Changes UNKNOWN STEP 2026-05-12T16:57:41.0737424Z Contents: write +Detect Changes UNKNOWN STEP 2026-05-12T16:57:41.0737987Z Deployments: write +Detect Changes UNKNOWN STEP 2026-05-12T16:57:41.0738562Z Discussions: write +Detect Changes UNKNOWN STEP 2026-05-12T16:57:41.0739086Z Issues: write +Detect Changes UNKNOWN STEP 2026-05-12T16:57:41.0739551Z Metadata: read +Detect Changes UNKNOWN STEP 2026-05-12T16:57:41.0740112Z Models: read +Detect Changes UNKNOWN STEP 2026-05-12T16:57:41.0740614Z Packages: write +Detect Changes UNKNOWN STEP 2026-05-12T16:57:41.0741250Z Pages: write +Detect Changes UNKNOWN STEP 2026-05-12T16:57:41.0741815Z PullRequests: write +Detect Changes UNKNOWN STEP 2026-05-12T16:57:41.0742335Z RepositoryProjects: write +Detect Changes UNKNOWN STEP 2026-05-12T16:57:41.0742920Z SecurityEvents: write +Detect Changes UNKNOWN STEP 2026-05-12T16:57:41.0743469Z Statuses: write +Detect Changes UNKNOWN STEP 2026-05-12T16:57:41.0744026Z VulnerabilityAlerts: read +Detect Changes UNKNOWN STEP 2026-05-12T16:57:41.0744589Z ##[endgroup] +Detect Changes UNKNOWN STEP 2026-05-12T16:57:41.0746702Z Secret source: Actions +Detect Changes UNKNOWN STEP 2026-05-12T16:57:41.0747918Z Prepare workflow directory +Detect Changes UNKNOWN STEP 2026-05-12T16:57:41.1238604Z Prepare all required actions +Detect Changes UNKNOWN STEP 2026-05-12T16:57:41.1274903Z Getting action download info +Detect Changes UNKNOWN STEP 2026-05-12T16:57:41.6291294Z Download action repository 'actions/checkout@v4' (SHA:34e114876b0b11c390a56381ad16ebd13914f8d5) +Detect Changes UNKNOWN STEP 2026-05-12T16:57:41.7587736Z Download action repository 'actions/setup-node@v4' (SHA:49933ea5288caeca8642d1e84afbd3f7d6820020) +Detect Changes UNKNOWN STEP 2026-05-12T16:57:41.9428428Z Complete job name: Detect Changes +Detect Changes UNKNOWN STEP 2026-05-12T16:57:42.0123034Z ##[group]Run actions/checkout@v4 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:42.0123896Z with: +Detect Changes UNKNOWN STEP 2026-05-12T16:57:42.0124283Z fetch-depth: 0 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:42.0124718Z repository: link-foundation/link-cli +Detect Changes UNKNOWN STEP 2026-05-12T16:57:42.0125413Z token: *** +Detect Changes UNKNOWN STEP 2026-05-12T16:57:42.0125790Z ssh-strict: true +Detect Changes UNKNOWN STEP 2026-05-12T16:57:42.0126184Z ssh-user: git +Detect Changes UNKNOWN STEP 2026-05-12T16:57:42.0126575Z persist-credentials: true +Detect Changes UNKNOWN STEP 2026-05-12T16:57:42.0127249Z clean: true +Detect Changes UNKNOWN STEP 2026-05-12T16:57:42.0127666Z sparse-checkout-cone-mode: true +Detect Changes UNKNOWN STEP 2026-05-12T16:57:42.0128179Z fetch-tags: false +Detect Changes UNKNOWN STEP 2026-05-12T16:57:42.0128583Z show-progress: true +Detect Changes UNKNOWN STEP 2026-05-12T16:57:42.0128983Z lfs: false +Detect Changes UNKNOWN STEP 2026-05-12T16:57:42.0129353Z submodules: false +Detect Changes UNKNOWN STEP 2026-05-12T16:57:42.0129757Z set-safe-directory: true +Detect Changes UNKNOWN STEP 2026-05-12T16:57:42.0130453Z env: +Detect Changes UNKNOWN STEP 2026-05-12T16:57:42.0130856Z DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true +Detect Changes UNKNOWN STEP 2026-05-12T16:57:42.0131402Z DOTNET_CLI_TELEMETRY_OPTOUT: true +Detect Changes UNKNOWN STEP 2026-05-12T16:57:42.0131883Z DOTNET_NOLOGO: true +Detect Changes UNKNOWN STEP 2026-05-12T16:57:42.0132294Z ##[endgroup] +Detect Changes UNKNOWN STEP 2026-05-12T16:57:42.1240029Z Syncing repository: link-foundation/link-cli +Detect Changes UNKNOWN STEP 2026-05-12T16:57:42.1242516Z ##[group]Getting Git version info +Detect Changes UNKNOWN STEP 2026-05-12T16:57:42.1243603Z Working directory is '/home/runner/work/link-cli/link-cli' +Detect Changes UNKNOWN STEP 2026-05-12T16:57:42.1245209Z [command]/usr/bin/git version +Detect Changes UNKNOWN STEP 2026-05-12T16:57:42.1315118Z git version 2.53.0 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:42.1354379Z ##[endgroup] +Detect Changes UNKNOWN STEP 2026-05-12T16:57:42.1374140Z Temporarily overriding HOME='/home/runner/work/_temp/fd23dd35-ab76-4153-8136-5a4389e62a75' before making global git config changes +Detect Changes UNKNOWN STEP 2026-05-12T16:57:42.1376145Z Adding repository directory to the temporary git global config as a safe directory +Detect Changes UNKNOWN STEP 2026-05-12T16:57:42.1390431Z [command]/usr/bin/git config --global --add safe.directory /home/runner/work/link-cli/link-cli +Detect Changes UNKNOWN STEP 2026-05-12T16:57:42.1426346Z Deleting the contents of '/home/runner/work/link-cli/link-cli' +Detect Changes UNKNOWN STEP 2026-05-12T16:57:42.1430477Z ##[group]Initializing the repository +Detect Changes UNKNOWN STEP 2026-05-12T16:57:42.1434540Z [command]/usr/bin/git init /home/runner/work/link-cli/link-cli +Detect Changes UNKNOWN STEP 2026-05-12T16:57:42.1525745Z hint: Using 'master' as the name for the initial branch. This default branch name +Detect Changes UNKNOWN STEP 2026-05-12T16:57:42.1527988Z hint: will change to "main" in Git 3.0. To configure the initial branch name +Detect Changes UNKNOWN STEP 2026-05-12T16:57:42.1529868Z hint: to use in all of your new repositories, which will suppress this warning, +Detect Changes UNKNOWN STEP 2026-05-12T16:57:42.1531365Z hint: call: +Detect Changes UNKNOWN STEP 2026-05-12T16:57:42.1532156Z hint: +Detect Changes UNKNOWN STEP 2026-05-12T16:57:42.1533160Z hint: git config --global init.defaultBranch +Detect Changes UNKNOWN STEP 2026-05-12T16:57:42.1534483Z hint: +Detect Changes UNKNOWN STEP 2026-05-12T16:57:42.1535740Z hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and +Detect Changes UNKNOWN STEP 2026-05-12T16:57:42.1537902Z hint: 'development'. The just-created branch can be renamed via this command: +Detect Changes UNKNOWN STEP 2026-05-12T16:57:42.1539458Z hint: +Detect Changes UNKNOWN STEP 2026-05-12T16:57:42.1540536Z hint: git branch -m +Detect Changes UNKNOWN STEP 2026-05-12T16:57:42.1541583Z hint: +Detect Changes UNKNOWN STEP 2026-05-12T16:57:42.1543161Z hint: Disable this message with "git config set advice.defaultBranchName false" +Detect Changes UNKNOWN STEP 2026-05-12T16:57:42.1545251Z Initialized empty Git repository in /home/runner/work/link-cli/link-cli/.git/ +Detect Changes UNKNOWN STEP 2026-05-12T16:57:42.1548916Z [command]/usr/bin/git remote add origin https://github.com/link-foundation/link-cli +Detect Changes UNKNOWN STEP 2026-05-12T16:57:42.1569909Z ##[endgroup] +Detect Changes UNKNOWN STEP 2026-05-12T16:57:42.1571764Z ##[group]Disabling automatic garbage collection +Detect Changes UNKNOWN STEP 2026-05-12T16:57:42.1573261Z [command]/usr/bin/git config --local gc.auto 0 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:42.1603731Z ##[endgroup] +Detect Changes UNKNOWN STEP 2026-05-12T16:57:42.1605430Z ##[group]Setting up auth +Detect Changes UNKNOWN STEP 2026-05-12T16:57:42.1608949Z [command]/usr/bin/git config --local --name-only --get-regexp core\.sshCommand +Detect Changes UNKNOWN STEP 2026-05-12T16:57:42.1640478Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :" +Detect Changes UNKNOWN STEP 2026-05-12T16:57:42.1936051Z [command]/usr/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader +Detect Changes UNKNOWN STEP 2026-05-12T16:57:42.1963771Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'http\.https\:\/\/github\.com\/\.extraheader' && git config --local --unset-all 'http.https://github.com/.extraheader' || :" +Detect Changes UNKNOWN STEP 2026-05-12T16:57:42.2170854Z [command]/usr/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir: +Detect Changes UNKNOWN STEP 2026-05-12T16:57:42.2202260Z [command]/usr/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url +Detect Changes UNKNOWN STEP 2026-05-12T16:57:42.2415194Z [command]/usr/bin/git config --local http.https://github.com/.extraheader AUTHORIZATION: basic *** +Detect Changes UNKNOWN STEP 2026-05-12T16:57:42.2449437Z ##[endgroup] +Detect Changes UNKNOWN STEP 2026-05-12T16:57:42.2450206Z ##[group]Fetching the repository +Detect Changes UNKNOWN STEP 2026-05-12T16:57:42.2457707Z [command]/usr/bin/git -c protocol.version=2 fetch --prune --no-recurse-submodules origin +refs/heads/*:refs/remotes/origin/* +refs/tags/*:refs/tags/* +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3792637Z From https://github.com/link-foundation/link-cli +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3794783Z * [new branch] claude/code-review-and-issues-01WwM3yFJiaRwTrhABNoUkYa -> origin/claude/code-review-and-issues-01WwM3yFJiaRwTrhABNoUkYa +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3796847Z * [new branch] issue-11-36571c97 -> origin/issue-11-36571c97 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3798502Z * [new branch] issue-12-fc4292e4 -> origin/issue-12-fc4292e4 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3799888Z * [new branch] issue-15-d0c58a82 -> origin/issue-15-d0c58a82 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3801001Z * [new branch] issue-17-1bd2fb57 -> origin/issue-17-1bd2fb57 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3802487Z * [new branch] issue-18-f86143d5 -> origin/issue-18-f86143d5 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3803631Z * [new branch] issue-19-9de6817b -> origin/issue-19-9de6817b +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3804723Z * [new branch] issue-20-aba7a4fa -> origin/issue-20-aba7a4fa +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3805872Z * [new branch] issue-22-889744b4 -> origin/issue-22-889744b4 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3807384Z * [new branch] issue-23-e23fa86d -> origin/issue-23-e23fa86d +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3808217Z * [new branch] issue-24-3e3135c5 -> origin/issue-24-3e3135c5 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3808880Z * [new branch] issue-25-4c1591ce -> origin/issue-25-4c1591ce +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3809520Z * [new branch] issue-26-c9ed9c27 -> origin/issue-26-c9ed9c27 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3810207Z * [new branch] issue-3-af35a436 -> origin/issue-3-af35a436 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3810886Z * [new branch] issue-30-7073054f -> origin/issue-30-7073054f +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3811528Z * [new branch] issue-31-e51b89e4 -> origin/issue-31-e51b89e4 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3812139Z * [new branch] issue-32-3b3efd02 -> origin/issue-32-3b3efd02 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3812780Z * [new branch] issue-33-a60a3c86 -> origin/issue-33-a60a3c86 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3813379Z * [new branch] issue-34-22f3c425 -> origin/issue-34-22f3c425 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3813985Z * [new branch] issue-35-391818e8 -> origin/issue-35-391818e8 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3814584Z * [new branch] issue-56-73ae4c3a -> origin/issue-56-73ae4c3a +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3815209Z * [new branch] issue-58-2571f420 -> origin/issue-58-2571f420 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3815846Z * [new branch] issue-63-452491b85cd2 -> origin/issue-63-452491b85cd2 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3816482Z * [new branch] issue-65-5d06345e60dc -> origin/issue-65-5d06345e60dc +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3817519Z * [new branch] issue-67-d67d72474036 -> origin/issue-67-d67d72474036 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3818338Z * [new branch] issue-69-43fc7f1a4ec3 -> origin/issue-69-43fc7f1a4ec3 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3818997Z * [new branch] issue-71-c1debd4cdf5e -> origin/issue-71-c1debd4cdf5e +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3819632Z * [new branch] issue-73-d71d2656d381 -> origin/issue-73-d71d2656d381 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3820515Z * [new branch] issue-75-2384a28fe185 -> origin/issue-75-2384a28fe185 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3821283Z * [new branch] issue-77-388911d8eea6 -> origin/issue-77-388911d8eea6 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3821938Z * [new branch] issue-79-49ca4f759246 -> origin/issue-79-49ca4f759246 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3822787Z * [new branch] issue-79-c80df6f859e8 -> origin/issue-79-c80df6f859e8 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3823499Z * [new branch] issue-8-e91a69e5 -> origin/issue-8-e91a69e5 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3824096Z * [new branch] main -> origin/main +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3824658Z * [new branch] named-links -> origin/named-links +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3825285Z * [new branch] nested-creation-1 -> origin/nested-creation-1 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3825862Z * [new tag] 1.0.1 -> 1.0.1 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3826375Z * [new tag] rust-v0.1.0 -> rust-v0.1.0 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3826902Z * [new tag] rust-v0.2.0 -> rust-v0.2.0 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3828040Z * [new tag] v1.2.1 -> v1.2.1 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3828721Z * [new tag] v1.2.2 -> v1.2.2 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3829296Z * [new tag] v1.2.3 -> v1.2.3 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3829792Z * [new tag] v1.3.0 -> v1.3.0 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3830133Z * [new tag] v1.3.1 -> v1.3.1 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3830447Z * [new tag] v1.4.0 -> v1.4.0 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3830774Z * [new tag] v1.4.1 -> v1.4.1 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3831089Z * [new tag] v1.5.0 -> v1.5.0 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3831395Z * [new tag] v1.6.0 -> v1.6.0 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3832003Z * [new tag] v1.7.0 -> v1.7.0 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3832320Z * [new tag] v1.7.1 -> v1.7.1 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3832677Z * [new tag] v1.7.2 -> v1.7.2 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3832987Z * [new tag] v1.7.3 -> v1.7.3 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3833306Z * [new tag] v1.7.4 -> v1.7.4 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3833613Z * [new tag] v1.8.0 -> v1.8.0 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3833939Z * [new tag] v2.0.2 -> v2.0.2 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3834256Z * [new tag] v2.1.0 -> v2.1.0 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3834567Z * [new tag] v2.1.1 -> v2.1.1 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3834879Z * [new tag] v2.1.2 -> v2.1.2 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3835187Z * [new tag] v2.1.3 -> v2.1.3 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3835498Z * [new tag] v2.2.0 -> v2.2.0 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3835824Z * [new tag] v2.2.1 -> v2.2.1 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3836136Z * [new tag] v2.2.2 -> v2.2.2 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3836447Z * [new tag] v2.4.0 -> v2.4.0 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3889597Z [command]/usr/bin/git branch --list --remote origin/main +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3916523Z origin/main +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3925397Z [command]/usr/bin/git rev-parse refs/remotes/origin/main +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3944864Z d47e551d2d66c7bfe93f9a869ce9fab36347e317 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3949165Z ##[endgroup] +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3949652Z ##[group]Determining the checkout info +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3950779Z ##[endgroup] +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3955358Z [command]/usr/bin/git sparse-checkout disable +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.3990546Z [command]/usr/bin/git config --local --unset-all extensions.worktreeConfig +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.4015324Z ##[group]Checking out the ref +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.4020348Z [command]/usr/bin/git checkout --progress --force -B main refs/remotes/origin/main +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.4614712Z Switched to a new branch 'main' +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.4616636Z branch 'main' set up to track 'origin/main'. +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.4628957Z ##[endgroup] +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.4664488Z [command]/usr/bin/git log -1 --format=%H +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.4686300Z d47e551d2d66c7bfe93f9a869ce9fab36347e317 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.4917828Z ##[group]Run actions/setup-node@v4 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.4918213Z with: +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.4918434Z node-version: 20.x +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.4918685Z always-auth: false +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.4918924Z check-latest: false +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.4919314Z token: *** +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.4919534Z env: +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.4919759Z DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.4920085Z DOTNET_CLI_TELEMETRY_OPTOUT: true +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.4920367Z DOTNET_NOLOGO: true +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.4920600Z ##[endgroup] +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.6668485Z Found in cache @ /opt/hostedtoolcache/node/20.20.2/x64 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.6675602Z ##[group]Environment details +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.9582252Z node: v20.20.2 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.9583047Z npm: 10.8.2 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.9583432Z yarn: 1.22.22 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.9584367Z ##[endgroup] +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.9708284Z ##[group]Run node csharp/scripts/detect-code-changes.mjs +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.9708802Z ^[[36;1mnode csharp/scripts/detect-code-changes.mjs^[[0m +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.9741261Z shell: /usr/bin/bash -e {0} +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.9741547Z env: +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.9741779Z DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.9742095Z DOTNET_CLI_TELEMETRY_OPTOUT: true +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.9742369Z DOTNET_NOLOGO: true +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.9742611Z GITHUB_EVENT_NAME: push +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.9742857Z GITHUB_BASE_SHA: +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.9743095Z GITHUB_HEAD_SHA: +Detect Changes UNKNOWN STEP 2026-05-12T16:57:43.9743324Z ##[endgroup] +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.0108544Z Detecting file changes for CI/CD... +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.0109025Z +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.0109330Z Comparing HEAD^ to HEAD +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.0151877Z Changed files: +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.0152795Z .github/workflows/csharp.yml +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.0153317Z .github/workflows/wasm.yml +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.0153947Z csharp/scripts/create-github-release.mjs +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.0154634Z csharp/scripts/release-scripts.test.mjs +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.0155312Z docs/case-studies/issue-79/README.md +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.0156122Z docs/case-studies/issue-79/evidence/issue-79-comments-followup.json +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.0157271Z docs/case-studies/issue-79/evidence/run-25747032579-jobs.json +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.0222774Z docs/case-studies/issue-79/evidence/run-25747032579.json +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.0223941Z docs/case-studies/issue-79/evidence/upstream-csharp-template-issue-7.json +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.0224766Z docs/case-studies/issue-79/evidence/wasm-25747032579.log +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.0225236Z js/test/repositoryLayout.test.mjs +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.0225464Z +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.0225617Z cs-changed=false +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.0225940Z csproj-changed=false +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.0226479Z sln-changed=false +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.0227148Z props-changed=false +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.0227666Z rs-changed=false +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.0228000Z toml-changed=false +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.0228285Z mjs-changed=true +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.0228546Z docs-changed=true +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.0228806Z workflow-changed=true +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.0228966Z +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.0229168Z Files considered as code changes: +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.0229500Z .github/workflows/csharp.yml +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.0229799Z .github/workflows/wasm.yml +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.0230154Z csharp/scripts/create-github-release.mjs +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.0230528Z csharp/scripts/release-scripts.test.mjs +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.0230879Z js/test/repositoryLayout.test.mjs +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.0231079Z +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.0231204Z any-code-changed=true +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.0231484Z csharp-code-changed=false +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.0231765Z rust-code-changed=false +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.0231930Z +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.0232065Z Change detection completed. +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.0319475Z Post job cleanup. +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.2058864Z Post job cleanup. +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.3042245Z [command]/usr/bin/git version +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.3078192Z git version 2.53.0 +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.3121005Z Temporarily overriding HOME='/home/runner/work/_temp/83c3221c-48e2-4a24-b027-91fa1b66ee42' before making global git config changes +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.3122019Z Adding repository directory to the temporary git global config as a safe directory +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.3132478Z [command]/usr/bin/git config --global --add safe.directory /home/runner/work/link-cli/link-cli +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.3164689Z [command]/usr/bin/git config --local --name-only --get-regexp core\.sshCommand +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.3196042Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :" +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.3413543Z [command]/usr/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.3432578Z http.https://github.com/.extraheader +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.3445280Z [command]/usr/bin/git config --local --unset-all http.https://github.com/.extraheader +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.3474937Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'http\.https\:\/\/github\.com\/\.extraheader' && git config --local --unset-all 'http.https://github.com/.extraheader' || :" +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.3696726Z [command]/usr/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir: +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.3732502Z [command]/usr/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.4071234Z Evaluate and set job outputs +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.4080316Z Set output 'cs-changed' +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.4081957Z Set output 'csproj-changed' +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.4082606Z Set output 'sln-changed' +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.4082949Z Set output 'props-changed' +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.4083303Z Set output 'mjs-changed' +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.4083832Z Set output 'docs-changed' +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.4084163Z Set output 'workflow-changed' +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.4084506Z Set output 'any-code-changed' +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.4084856Z Set output 'csharp-code-changed' +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.4085594Z Cleaning up orphan processes +Detect Changes UNKNOWN STEP 2026-05-12T16:57:44.4374024Z ##[warning]Node.js 20 actions are deprecated. The following actions are running on Node.js 20 and may not work as expected: actions/checkout@v4, actions/setup-node@v4. Actions will be forced to run with Node.js 24 by default starting June 2nd, 2026. Node.js 20 will be removed from the runner on September 16th, 2026. Please check if updated versions of these actions are available that support Node.js 24. To opt into Node.js 24 now, set the FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=true environment variable on the runner or in your workflow file. Once Node.js 24 becomes the default, you can temporarily opt out by setting ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION=true. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/ +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:57.5289692Z Current runner version: '2.334.0' +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:57.5323816Z ##[group]Runner Image Provisioner +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:57.5325241Z Hosted Compute Agent +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:57.5325994Z Version: 20260213.493 +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:57.5326991Z Commit: 5c115507f6dd24b8de37d8bbe0bb4509d0cc0fa3 +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:57.5328158Z Build Date: 2026-02-13T00:28:41Z +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:57.5329106Z Worker ID: {87f8dd64-abfd-494d-8b73-4f576cf77859} +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:57.5330103Z Azure Region: eastus2 +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:57.5330953Z ##[endgroup] +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:57.5333337Z ##[group]Operating System +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:57.5334150Z Ubuntu +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:57.5335043Z 24.04.4 +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:57.5335675Z LTS +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:57.5336315Z ##[endgroup] +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:57.5337887Z ##[group]Runner Image +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:57.5338709Z Image: ubuntu-24.04 +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:57.5339505Z Version: 20260413.86.1 +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:57.5341334Z Included Software: https://github.com/actions/runner-images/blob/ubuntu24/20260413.86/images/ubuntu/Ubuntu2404-Readme.md +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:57.5343998Z Image Release: https://github.com/actions/runner-images/releases/tag/ubuntu24%2F20260413.86 +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:57.5345720Z ##[endgroup] +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:57.5350641Z ##[group]GITHUB_TOKEN Permissions +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:57.5354102Z Actions: write +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:57.5355026Z ArtifactMetadata: write +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:57.5355843Z Attestations: write +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:57.5356616Z Checks: write +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:57.5357399Z CodeQuality: write +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:57.5358334Z Contents: write +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:57.5359086Z Deployments: write +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:57.5359860Z Discussions: write +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:57.5360641Z Issues: write +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:57.5361303Z Metadata: read +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:57.5362379Z Models: read +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:57.5363130Z Packages: write +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:57.5364042Z Pages: write +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:57.5364905Z PullRequests: write +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:57.5365652Z RepositoryProjects: write +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:57.5366510Z SecurityEvents: write +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:57.5367364Z Statuses: write +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:57.5368207Z VulnerabilityAlerts: read +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:57.5368985Z ##[endgroup] +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:57.5372207Z Secret source: Actions +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:57.5373448Z Prepare workflow directory +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:57.5953377Z Prepare all required actions +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:57.6005646Z Getting action download info +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:57.9592166Z Download action repository 'actions/checkout@v4' (SHA:34e114876b0b11c390a56381ad16ebd13914f8d5) +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.1010281Z Download action repository 'actions/setup-dotnet@v4' (SHA:67a3573c9a986a3f9c594539f4ab511d57bb3ce9) +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.3221411Z Download action repository 'actions/setup-node@v4' (SHA:49933ea5288caeca8642d1e84afbd3f7d6820020) +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.5160204Z Complete job name: Lint and Format Check +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.5888380Z ##[group]Run actions/checkout@v4 +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.5889214Z with: +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.5889660Z repository: link-foundation/link-cli +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.5890407Z token: *** +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.5890812Z ssh-strict: true +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.5891257Z ssh-user: git +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.5891959Z persist-credentials: true +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.5892436Z clean: true +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.5892852Z sparse-checkout-cone-mode: true +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.5893380Z fetch-depth: 1 +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.5893800Z fetch-tags: false +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.5894235Z show-progress: true +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.5894656Z lfs: false +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.5895048Z submodules: false +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.5895472Z set-safe-directory: true +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.5896161Z env: +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.5896573Z DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.5897127Z DOTNET_CLI_TELEMETRY_OPTOUT: true +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.5897634Z DOTNET_NOLOGO: true +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.5898056Z ##[endgroup] +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.6996964Z Syncing repository: link-foundation/link-cli +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.6998839Z ##[group]Getting Git version info +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.6999582Z Working directory is '/home/runner/work/link-cli/link-cli' +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.7000565Z [command]/usr/bin/git version +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.7029098Z git version 2.53.0 +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.7054062Z ##[endgroup] +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.7075688Z Temporarily overriding HOME='/home/runner/work/_temp/1323b839-2339-430b-b50a-6d2689bf99c1' before making global git config changes +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.7078044Z Adding repository directory to the temporary git global config as a safe directory +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.7080426Z [command]/usr/bin/git config --global --add safe.directory /home/runner/work/link-cli/link-cli +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.7113642Z Deleting the contents of '/home/runner/work/link-cli/link-cli' +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.7117182Z ##[group]Initializing the repository +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.7120961Z [command]/usr/bin/git init /home/runner/work/link-cli/link-cli +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.7180547Z hint: Using 'master' as the name for the initial branch. This default branch name +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.7182452Z hint: will change to "main" in Git 3.0. To configure the initial branch name +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.7183415Z hint: to use in all of your new repositories, which will suppress this warning, +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.7184280Z hint: call: +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.7184689Z hint: +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.7185245Z hint: git config --global init.defaultBranch +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.7185925Z hint: +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.7186509Z hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.7187510Z hint: 'development'. The just-created branch can be renamed via this command: +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.7188318Z hint: +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.7188746Z hint: git branch -m +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.7189263Z hint: +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.7189909Z hint: Disable this message with "git config set advice.defaultBranchName false" +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.7191274Z Initialized empty Git repository in /home/runner/work/link-cli/link-cli/.git/ +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.7193989Z [command]/usr/bin/git remote add origin https://github.com/link-foundation/link-cli +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.7223183Z ##[endgroup] +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.7223917Z ##[group]Disabling automatic garbage collection +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.7227131Z [command]/usr/bin/git config --local gc.auto 0 +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.7255136Z ##[endgroup] +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.7255806Z ##[group]Setting up auth +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.7262266Z [command]/usr/bin/git config --local --name-only --get-regexp core\.sshCommand +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.7292413Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :" +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.7578743Z [command]/usr/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.7609250Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'http\.https\:\/\/github\.com\/\.extraheader' && git config --local --unset-all 'http.https://github.com/.extraheader' || :" +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.7837369Z [command]/usr/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir: +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.7869581Z [command]/usr/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.8099267Z [command]/usr/bin/git config --local http.https://github.com/.extraheader AUTHORIZATION: basic *** +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.8134063Z ##[endgroup] +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.8135317Z ##[group]Fetching the repository +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:58.8143770Z [command]/usr/bin/git -c protocol.version=2 fetch --no-tags --prune --no-recurse-submodules --depth=1 origin +d47e551d2d66c7bfe93f9a869ce9fab36347e317:refs/remotes/origin/main +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:59.3798048Z From https://github.com/link-foundation/link-cli +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:59.3799308Z * [new ref] d47e551d2d66c7bfe93f9a869ce9fab36347e317 -> origin/main +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:59.3827493Z ##[endgroup] +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:59.3828827Z ##[group]Determining the checkout info +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:59.3830211Z ##[endgroup] +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:59.3834671Z [command]/usr/bin/git sparse-checkout disable +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:59.3874983Z [command]/usr/bin/git config --local --unset-all extensions.worktreeConfig +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:59.3901282Z ##[group]Checking out the ref +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:59.3905161Z [command]/usr/bin/git checkout --progress --force -B main refs/remotes/origin/main +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:59.4534180Z Switched to a new branch 'main' +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:59.4535641Z branch 'main' set up to track 'origin/main'. +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:59.4547505Z ##[endgroup] +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:59.4585448Z [command]/usr/bin/git log -1 --format=%H +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:59.4609362Z d47e551d2d66c7bfe93f9a869ce9fab36347e317 +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:59.4893520Z ##[group]Run actions/setup-dotnet@v4 +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:59.4895232Z with: +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:59.4896307Z dotnet-version: 8.0.x +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:59.4897275Z cache: false +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:59.4898122Z env: +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:59.4899058Z DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:59.4900689Z DOTNET_CLI_TELEMETRY_OPTOUT: true +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:59.4902035Z DOTNET_NOLOGO: true +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:59.4902942Z ##[endgroup] +Lint and Format Check UNKNOWN STEP 2026-05-12T16:57:59.6836480Z [command]/home/runner/work/_actions/actions/setup-dotnet/v4/externals/install-dotnet.sh --skip-non-versioned-files --runtime dotnet --channel LTS +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:00.0223077Z dotnet-install: Attempting to download using aka.ms link https://builds.dotnet.microsoft.com/dotnet/Runtime/10.0.7/dotnet-runtime-10.0.7-linux-x64.tar.gz +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:00.2970243Z dotnet-install: Remote file https://builds.dotnet.microsoft.com/dotnet/Runtime/10.0.7/dotnet-runtime-10.0.7-linux-x64.tar.gz size is 36689672 bytes. +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:00.2975370Z dotnet-install: Extracting archive from https://builds.dotnet.microsoft.com/dotnet/Runtime/10.0.7/dotnet-runtime-10.0.7-linux-x64.tar.gz +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:01.0289248Z dotnet-install: Downloaded file size is 36689672 bytes. +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:01.0292543Z dotnet-install: The remote and local file sizes are equal. +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:01.0580217Z dotnet-install: Installed version is 10.0.7 +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:01.0641237Z dotnet-install: Adding to current process PATH: `/usr/share/dotnet`. Note: This change will be visible only when sourcing script. +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:01.0644036Z dotnet-install: Note that the script does not resolve dependencies during installation. +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:01.0645394Z dotnet-install: To check the list of dependencies, go to https://learn.microsoft.com/dotnet/core/install, select your operating system and check the "Dependencies" section. +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:01.0646182Z dotnet-install: Installation finished successfully. +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:01.0673922Z [command]/home/runner/work/_actions/actions/setup-dotnet/v4/externals/install-dotnet.sh --skip-non-versioned-files --channel 8.0 +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:01.4531076Z dotnet-install: Attempting to download using aka.ms link https://builds.dotnet.microsoft.com/dotnet/Sdk/8.0.420/dotnet-sdk-8.0.420-linux-x64.tar.gz +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:02.3292126Z dotnet-install: Remote file https://builds.dotnet.microsoft.com/dotnet/Sdk/8.0.420/dotnet-sdk-8.0.420-linux-x64.tar.gz size is 216822173 bytes. +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:02.3295538Z dotnet-install: Extracting archive from https://builds.dotnet.microsoft.com/dotnet/Sdk/8.0.420/dotnet-sdk-8.0.420-linux-x64.tar.gz +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:07.3050328Z dotnet-install: Downloaded file size is 216822173 bytes. +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:07.3050962Z dotnet-install: The remote and local file sizes are equal. +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:07.5547952Z dotnet-install: Installed version is 8.0.420 +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:07.5610094Z dotnet-install: Adding to current process PATH: `/usr/share/dotnet`. Note: This change will be visible only when sourcing script. +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:07.5611828Z dotnet-install: Note that the script does not resolve dependencies during installation. +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:07.5613256Z dotnet-install: To check the list of dependencies, go to https://learn.microsoft.com/dotnet/core/install, select your operating system and check the "Dependencies" section. +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:07.5614542Z dotnet-install: Installation finished successfully. +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:07.5880101Z ##[group]Run actions/setup-node@v4 +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:07.5880393Z with: +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:07.5880775Z node-version: 20.x +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:07.5880990Z always-auth: false +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:07.5881201Z check-latest: false +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:07.5881981Z token: *** +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:07.5882185Z env: +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:07.5882396Z DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:07.5882688Z DOTNET_CLI_TELEMETRY_OPTOUT: true +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:07.5882931Z DOTNET_NOLOGO: true +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:07.5883152Z DOTNET_ROOT: /usr/share/dotnet +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:07.5883409Z ##[endgroup] +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:07.7696419Z Found in cache @ /opt/hostedtoolcache/node/20.20.2/x64 +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:07.7700752Z ##[group]Environment details +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:08.0534536Z node: v20.20.2 +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:08.0535006Z npm: 10.8.2 +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:08.0535298Z yarn: 1.22.22 +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:08.0536094Z ##[endgroup] +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:08.0652255Z ##[group]Run node --test csharp/scripts/*.test.mjs +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:08.0652808Z ^[[36;1mnode --test csharp/scripts/*.test.mjs^[[0m +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:08.0683580Z shell: /usr/bin/bash -e {0} +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:08.0683879Z env: +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:08.0684116Z DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:08.0684405Z DOTNET_CLI_TELEMETRY_OPTOUT: true +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:08.0684651Z DOTNET_NOLOGO: true +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:08.0684873Z DOTNET_ROOT: /usr/share/dotnet +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:08.0685117Z ##[endgroup] +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:08.1131705Z TAP version 13 +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:08.2703839Z # Subtest: merge-changesets honors the requested directory and package name +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:08.2716954Z ok 1 - merge-changesets honors the requested directory and package name +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:08.2718233Z --- +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:08.2718727Z duration_ms: 41.379318 +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:08.2719235Z ... +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:08.2720697Z # Subtest: create-github-release dry run uses tag prefix and component changelog +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:08.2723390Z ok 2 - create-github-release dry run uses tag prefix and component changelog +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:08.2724289Z --- +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:08.2724743Z duration_ms: 35.712416 +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:08.2725277Z ... +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:08.2729219Z # Subtest: create-github-release dry run reports matching assets without uploading +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:08.2731914Z ok 3 - create-github-release dry run reports matching assets without uploading +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:08.2736765Z --- +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:08.2737109Z duration_ms: 42.596347 +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:08.2737452Z ... +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:08.2817940Z 1..3 +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:08.2818271Z # tests 3 +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:08.2818918Z # suites 0 +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:08.2819802Z # pass 3 +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:08.2822032Z # fail 0 +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:08.2822316Z # cancelled 0 +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:08.2822647Z # skipped 0 +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:08.2822927Z # todo 0 +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:08.2827650Z # duration_ms 178.257451 +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:08.2904539Z ##[group]Run dotnet restore +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:08.2904821Z ^[[36;1mdotnet restore^[[0m +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:08.2928794Z shell: /usr/bin/bash -e {0} +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:08.2929078Z env: +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:08.2929351Z DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:08.2929641Z DOTNET_CLI_TELEMETRY_OPTOUT: true +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:08.2929950Z DOTNET_NOLOGO: true +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:08.2930209Z DOTNET_ROOT: /usr/share/dotnet +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:08.2930443Z ##[endgroup] +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:10.6018865Z Determining projects to restore... +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:13.7779936Z Restored /home/runner/work/link-cli/link-cli/csharp/Foundation.Data.Doublets.Cli/Foundation.Data.Doublets.Cli.csproj (in 2.6 sec). +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:13.7819474Z Restored /home/runner/work/link-cli/link-cli/csharp/Foundation.Data.Doublets.Cli.Tests/Foundation.Data.Doublets.Cli.Tests.csproj (in 2.6 sec). +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:13.8172930Z ##[group]Run dotnet build --no-restore --configuration Release +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:13.8173586Z ^[[36;1mdotnet build --no-restore --configuration Release^[[0m +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:13.8197076Z shell: /usr/bin/bash -e {0} +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:13.8197311Z env: +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:13.8197531Z DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:13.8197816Z DOTNET_CLI_TELEMETRY_OPTOUT: true +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:13.8198252Z DOTNET_NOLOGO: true +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:13.8198464Z DOTNET_ROOT: /usr/share/dotnet +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:13.8198694Z ##[endgroup] +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:19.5564396Z Foundation.Data.Doublets.Cli -> /home/runner/work/link-cli/link-cli/csharp/Foundation.Data.Doublets.Cli/bin/Release/net8/Foundation.Data.Doublets.Cli.dll +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:20.9129260Z Foundation.Data.Doublets.Cli.Tests -> /home/runner/work/link-cli/link-cli/csharp/Foundation.Data.Doublets.Cli.Tests/bin/Release/net8/Foundation.Data.Doublets.Cli.Tests.dll +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:20.9345011Z +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:20.9351856Z Build succeeded. +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:20.9352588Z 0 Warning(s) +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:20.9353239Z 0 Error(s) +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:20.9353434Z +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:20.9353665Z Time Elapsed 00:00:06.94 +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:20.9564276Z Post job cleanup. +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:21.1231247Z Post job cleanup. +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:21.2983671Z Post job cleanup. +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:21.3979614Z [command]/usr/bin/git version +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:21.4015650Z git version 2.53.0 +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:21.4059035Z Temporarily overriding HOME='/home/runner/work/_temp/e79673b7-959d-4506-853c-7d9c28bf0672' before making global git config changes +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:21.4060548Z Adding repository directory to the temporary git global config as a safe directory +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:21.4073334Z [command]/usr/bin/git config --global --add safe.directory /home/runner/work/link-cli/link-cli +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:21.4110497Z [command]/usr/bin/git config --local --name-only --get-regexp core\.sshCommand +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:21.4144100Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :" +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:21.4380430Z [command]/usr/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:21.4401989Z http.https://github.com/.extraheader +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:21.4415077Z [command]/usr/bin/git config --local --unset-all http.https://github.com/.extraheader +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:21.4446668Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'http\.https\:\/\/github\.com\/\.extraheader' && git config --local --unset-all 'http.https://github.com/.extraheader' || :" +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:21.4677499Z [command]/usr/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir: +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:21.4708632Z [command]/usr/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:21.5050250Z Cleaning up orphan processes +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:21.5344101Z Terminate orphan process: pid (2866) (dotnet) +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:21.5366220Z Terminate orphan process: pid (2931) (VBCSCompiler) +Lint and Format Check UNKNOWN STEP 2026-05-12T16:58:21.5390755Z ##[warning]Node.js 20 actions are deprecated. The following actions are running on Node.js 20 and may not work as expected: actions/checkout@v4, actions/setup-dotnet@v4, actions/setup-node@v4. Actions will be forced to run with Node.js 24 by default starting June 2nd, 2026. Node.js 20 will be removed from the runner on September 16th, 2026. Please check if updated versions of these actions are available that support Node.js 24. To opt into Node.js 24 now, set the FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=true environment variable on the runner or in your workflow file. Once Node.js 24 becomes the default, you can temporarily opt out by setting ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION=true. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/ +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:50.7166730Z Current runner version: '2.334.0' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:50.7184330Z ##[group]Runner Image Provisioner +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:50.7184870Z Hosted Compute Agent +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:50.7185210Z Version: 20260422.526 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:50.7185590Z Commit: e1a9e573f4d0838b3a7c1b07401aeb29ed3635a9 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:50.7186030Z Build Date: 2026-04-22T09:31:31Z +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:50.7186440Z Worker ID: {899484ea-a5d6-41c5-a9b8-e1199d802592} +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:50.7186870Z Azure Region: westus +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:50.7187220Z ##[endgroup] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:50.7188260Z ##[group]Operating System +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:50.7188630Z macOS +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:50.7190760Z 15.7.4 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:50.7192060Z 24G517 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:50.7192860Z ##[endgroup] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:50.7193700Z ##[group]Runner Image +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:50.7194610Z Image: macos-15-arm64 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:50.7195480Z Version: 20260427.0018.1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:50.7197620Z Included Software: https://github.com/actions/runner-images/blob/macos-15-arm64/20260427.0018/images/macos/macos-15-arm64-Readme.md +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:50.7200740Z Image Release: https://github.com/actions/runner-images/releases/tag/macos-15-arm64%2F20260427.0018 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:50.7202440Z ##[endgroup] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:50.7207970Z ##[group]GITHUB_TOKEN Permissions +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:50.7213110Z Actions: write +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:50.7214250Z ArtifactMetadata: write +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:50.7215150Z Attestations: write +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:50.7216380Z Checks: write +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:50.7217300Z CodeQuality: write +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:50.7218310Z Contents: write +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:50.7219160Z Deployments: write +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:50.7220030Z Discussions: write +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:50.7220980Z Issues: write +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:50.7221810Z Metadata: read +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:50.7222610Z Models: read +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:50.7223490Z Packages: write +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:50.7225520Z Pages: write +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:50.7225910Z PullRequests: write +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:50.7227410Z RepositoryProjects: write +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:50.7228380Z SecurityEvents: write +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:50.7228780Z Statuses: write +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:50.7229120Z VulnerabilityAlerts: read +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:50.7229580Z ##[endgroup] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:50.7231570Z Secret source: Actions +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:50.7232010Z Prepare workflow directory +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:50.7775310Z Prepare all required actions +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:50.7804370Z Getting action download info +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:51.0752620Z Download action repository 'actions/checkout@v4' (SHA:34e114876b0b11c390a56381ad16ebd13914f8d5) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:51.2751740Z Download action repository 'actions/setup-dotnet@v4' (SHA:67a3573c9a986a3f9c594539f4ab511d57bb3ce9) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:52.3069320Z Download action repository 'codecov/codecov-action@v4' (SHA:b9fd7d16f6d7d1b5d2bec1a2887e65ceed900238) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:53.4918940Z Complete job name: Test (macos-latest) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:53.5398060Z ##[group]Run actions/checkout@v4 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:53.5398860Z with: +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:53.5399340Z repository: link-foundation/link-cli +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:53.5400220Z token: *** +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:53.5400660Z ssh-strict: true +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:53.5401150Z ssh-user: git +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:53.5401610Z persist-credentials: true +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:53.5402150Z clean: true +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:53.5402630Z sparse-checkout-cone-mode: true +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:53.5403220Z fetch-depth: 1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:53.5403670Z fetch-tags: false +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:53.5404140Z show-progress: true +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:53.5404630Z lfs: false +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:53.5405080Z submodules: false +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:53.5405560Z set-safe-directory: true +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:53.5406250Z env: +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:53.5406730Z DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:53.5407420Z DOTNET_CLI_TELEMETRY_OPTOUT: true +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:53.5408060Z DOTNET_NOLOGO: true +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:53.5408560Z ##[endgroup] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:53.9947500Z Syncing repository: link-foundation/link-cli +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:53.9952250Z ##[group]Getting Git version info +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:53.9953310Z Working directory is '/Users/runner/work/link-cli/link-cli' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:53.9955460Z [command]/opt/homebrew/bin/git version +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:54.0528750Z git version 2.54.0 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:54.0552910Z ##[endgroup] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:54.0560320Z Copying '/Users/runner/.gitconfig' to '/Users/runner/work/_temp/85fccf47-ea3f-4e4e-8b6d-32a25f91f403/.gitconfig' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:54.0575190Z Temporarily overriding HOME='/Users/runner/work/_temp/85fccf47-ea3f-4e4e-8b6d-32a25f91f403' before making global git config changes +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:54.0577010Z Adding repository directory to the temporary git global config as a safe directory +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:54.0578580Z [command]/opt/homebrew/bin/git config --global --add safe.directory /Users/runner/work/link-cli/link-cli +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:54.0670890Z Deleting the contents of '/Users/runner/work/link-cli/link-cli' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:54.0673190Z ##[group]Initializing the repository +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:54.0677760Z [command]/opt/homebrew/bin/git init /Users/runner/work/link-cli/link-cli +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:54.0882190Z hint: Using 'master' as the name for the initial branch. This default branch name +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:54.0883880Z hint: will change to "main" in Git 3.0. To configure the initial branch name +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:54.0885050Z hint: to use in all of your new repositories, which will suppress this warning, +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:54.0885920Z hint: call: +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:54.0886380Z hint: +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:54.0886970Z hint: git config --global init.defaultBranch +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:54.0887750Z hint: +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:54.0888420Z hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:54.0889520Z hint: 'development'. The just-created branch can be renamed via this command: +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:54.0890440Z hint: +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:54.0890870Z hint: git branch -m +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:54.0891370Z hint: +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:54.0892080Z hint: Disable this message with "git config set advice.defaultBranchName false" +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:54.0893300Z Initialized empty Git repository in /Users/runner/work/link-cli/link-cli/.git/ +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:54.0895580Z [command]/opt/homebrew/bin/git remote add origin https://github.com/link-foundation/link-cli +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:54.0969100Z ##[endgroup] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:54.0970130Z ##[group]Disabling automatic garbage collection +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:54.0971020Z [command]/opt/homebrew/bin/git config --local gc.auto 0 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:54.1034060Z ##[endgroup] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:54.1035070Z ##[group]Setting up auth +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:54.1040580Z [command]/opt/homebrew/bin/git config --local --name-only --get-regexp core\.sshCommand +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:54.1106390Z [command]/opt/homebrew/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :" +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:54.2022370Z [command]/opt/homebrew/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:54.2080800Z [command]/opt/homebrew/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'http\.https\:\/\/github\.com\/\.extraheader' && git config --local --unset-all 'http.https://github.com/.extraheader' || :" +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:54.2856230Z [command]/opt/homebrew/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir: +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:54.2938840Z [command]/opt/homebrew/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:54.3659980Z [command]/opt/homebrew/bin/git config --local http.https://github.com/.extraheader AUTHORIZATION: basic *** +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:54.3705920Z ##[endgroup] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:54.3706840Z ##[group]Fetching the repository +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:54.3713400Z [command]/opt/homebrew/bin/git -c protocol.version=2 fetch --no-tags --prune --no-recurse-submodules --depth=1 origin +d47e551d2d66c7bfe93f9a869ce9fab36347e317:refs/remotes/origin/main +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:55.7692590Z From https://github.com/link-foundation/link-cli +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:55.7693310Z * [new ref] d47e551d2d66c7bfe93f9a869ce9fab36347e317 -> origin/main +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:55.7783260Z ##[endgroup] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:55.7783850Z ##[group]Determining the checkout info +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:55.7784370Z ##[endgroup] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:55.7787090Z [command]/opt/homebrew/bin/git sparse-checkout disable +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:55.7903310Z [command]/opt/homebrew/bin/git config --local --unset-all extensions.worktreeConfig +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:55.8053960Z ##[group]Checking out the ref +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:55.8055830Z [command]/opt/homebrew/bin/git checkout --progress --force -B main refs/remotes/origin/main +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:55.9374080Z Switched to a new branch 'main' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:55.9379680Z branch 'main' set up to track 'origin/main'. +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:55.9387210Z ##[endgroup] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:55.9541510Z [command]/opt/homebrew/bin/git log -1 --format=%H +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:55.9606940Z d47e551d2d66c7bfe93f9a869ce9fab36347e317 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:55.9804050Z ##[group]Run actions/setup-dotnet@v4 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:55.9804360Z with: +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:55.9804500Z dotnet-version: 8.0.x +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:55.9804670Z cache: false +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:55.9804800Z env: +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:55.9804960Z DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:55.9805160Z DOTNET_CLI_TELEMETRY_OPTOUT: true +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:55.9805350Z DOTNET_NOLOGO: true +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:55.9805500Z ##[endgroup] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:56.1525310Z [command]/Users/runner/work/_actions/actions/setup-dotnet/v4/externals/install-dotnet.sh --skip-non-versioned-files --runtime dotnet --channel LTS +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:57.1128410Z dotnet-install: .NET Core Runtime with version '10.0.7' is already installed. +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:57.1163430Z [command]/Users/runner/work/_actions/actions/setup-dotnet/v4/externals/install-dotnet.sh --skip-non-versioned-files --channel 8.0 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:58.0502190Z dotnet-install: .NET Core SDK with version '8.0.420' is already installed. +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:58.0680530Z ##[group]Run dotnet restore +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:58.0680780Z ^[[36;1mdotnet restore^[[0m +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:58.0723080Z shell: /bin/bash -e {0} +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:58.0723510Z env: +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:58.0723740Z DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:58.0724190Z DOTNET_CLI_TELEMETRY_OPTOUT: true +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:58.0724380Z DOTNET_NOLOGO: true +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:58.0724610Z DOTNET_ROOT: /Users/runner/.dotnet +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:58.0724890Z ##[endgroup] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:57:59.9805200Z Determining projects to restore... +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:05.0550140Z Restored /Users/runner/work/link-cli/link-cli/csharp/Foundation.Data.Doublets.Cli/Foundation.Data.Doublets.Cli.csproj (in 4.59 sec). +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:05.0553300Z Restored /Users/runner/work/link-cli/link-cli/csharp/Foundation.Data.Doublets.Cli.Tests/Foundation.Data.Doublets.Cli.Tests.csproj (in 4.59 sec). +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:05.1068530Z ##[group]Run dotnet build --no-restore --configuration Release +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:05.1069160Z ^[[36;1mdotnet build --no-restore --configuration Release^[[0m +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:05.1137860Z shell: /bin/bash -e {0} +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:05.1138190Z env: +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:05.1138710Z DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:05.1139000Z DOTNET_CLI_TELEMETRY_OPTOUT: true +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:05.1139290Z DOTNET_NOLOGO: true +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:05.1139530Z DOTNET_ROOT: /Users/runner/.dotnet +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:05.1139760Z ##[endgroup] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:10.0744550Z Foundation.Data.Doublets.Cli -> /Users/runner/work/link-cli/link-cli/csharp/Foundation.Data.Doublets.Cli/bin/Release/net8/Foundation.Data.Doublets.Cli.dll +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:10.9059270Z Foundation.Data.Doublets.Cli.Tests -> /Users/runner/work/link-cli/link-cli/csharp/Foundation.Data.Doublets.Cli.Tests/bin/Release/net8/Foundation.Data.Doublets.Cli.Tests.dll +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:10.9287140Z +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:10.9318690Z Build succeeded. +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:10.9343680Z 0 Warning(s) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:10.9354690Z 0 Error(s) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:10.9355280Z +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:10.9356750Z Time Elapsed 00:00:05.46 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:10.9464410Z ##[group]Run dotnet test --no-build --configuration Release --verbosity normal --collect:"XPlat Code Coverage" +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:10.9469690Z ^[[36;1mdotnet test --no-build --configuration Release --verbosity normal --collect:"XPlat Code Coverage"^[[0m +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:10.9508010Z shell: /bin/bash -e {0} +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:10.9508220Z env: +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:10.9508430Z DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:10.9508700Z DOTNET_CLI_TELEMETRY_OPTOUT: true +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:10.9509040Z DOTNET_NOLOGO: true +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:10.9509250Z DOTNET_ROOT: /Users/runner/.dotnet +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:10.9509490Z ##[endgroup] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:11.1535990Z Build started 5/12/2026 4:58:11 PM. +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:11.2618450Z 1>Project "/Users/runner/work/link-cli/link-cli/csharp/Foundation.Data.Doublets.Cli.sln" on node 1 (VSTest target(s)). +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:11.2634760Z 1>ValidateSolutionConfiguration: +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:11.2635510Z Building solution configuration "Release|Any CPU". +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:11.5149070Z Test run for /Users/runner/work/link-cli/link-cli/csharp/Foundation.Data.Doublets.Cli.Tests/bin/Release/net8/Foundation.Data.Doublets.Cli.Tests.dll (.NETCoreApp,Version=v8.0) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:11.8293370Z A total of 1 test files matched the specified pattern. +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.0072640Z [xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v3.1.5+1b188a7b0a (64-bit .NET 8.0.26) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.0620450Z [xUnit.net 00:00:00.06] Discovering: Foundation.Data.Doublets.Cli.Tests +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.2923220Z [xUnit.net 00:00:00.29] Discovered: Foundation.Data.Doublets.Cli.Tests +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.3466120Z [xUnit.net 00:00:00.35] Starting: Foundation.Data.Doublets.Cli.Tests +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.5321110Z Passed Foundation.Data.Doublets.Cli.Tests.UnicodeStringStorageTests.CreateAndRetriveUserDefinedTypeTest [71 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.5426170Z Passed Foundation.Data.Doublets.Cli.Tests.UnicodeStringStorageTests.CreateAndRetrieveMultipleStringTypesTest(typeName: "UnicodeSymbol") [13 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.5533700Z Passed Foundation.Data.Doublets.Cli.Tests.UnicodeStringStorageTests.CreateAndRetrieveMultipleStringTypesTest(typeName: "EmptyString") [2 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.5629320Z Passed Foundation.Data.Doublets.Cli.Tests.UnicodeStringStorageTests.CreateAndRetrieveMultipleStringTypesTest(typeName: "String") [3 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.5640310Z Passed Foundation.Data.Doublets.Cli.Tests.UnicodeStringStorageTests.CreateAndRetrieveMultipleStringTypesTest(typeName: "Name") [3 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.5702830Z Passed Foundation.Data.Doublets.Cli.Tests.UnicodeStringStorageTests.CreateAndRetrieveMultipleStringTypesTest(typeName: "UnicodeSequence") [1 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.5705260Z Passed Foundation.Data.Doublets.Cli.Tests.UnicodeStringStorageTests.CreateAndRetrieveMultipleStringTypesTest(typeName: "Type") [2 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.5706460Z Passed Foundation.Data.Doublets.Cli.Tests.UnicodeStringStorageTests.NameIsRemovedWhenExternalReferenceIsDeletedTest [9 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.6281310Z [Test] All links: (1: 2->1) (2: 1->2) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.6365990Z Passed Foundation.Data.Doublets.Cli.Tests.UnicodeStringStorageTests.NameExternalReferenceTest [8 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.6367770Z Passed Foundation.Data.Doublets.Cli.Tests.UnicodeStringStorageTests.CreateAndRetrieveUnicodeStringTest [2 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.6368840Z Passed Foundation.Data.Doublets.Cli.Tests.UnicodeStringStorageTests.CreateAndRetrieveSimpleStringTest [1 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.6369830Z Passed Foundation.Data.Doublets.Cli.Tests.UnicodeStringStorageTests.DeletingNonNamedLinkDoesNotAffectOtherNamesTest [1 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.6370990Z Passed Foundation.Data.Doublets.Cli.Tests.UnicodeStringStorageTests.CreateAndRetrieveEmptyStringTest [1 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.6371870Z Passed Foundation.Data.Doublets.Cli.Tests.UnicodeStringStorageTests.RetrieveTypeByNameTest [1 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.6379690Z Passed Foundation.Data.Doublets.Cli.Tests.UnicodeStringStorageTests.CreateAndRetrieveMultipleStringsTest [1 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.6381080Z Passed Foundation.Data.Doublets.Cli.Tests.UnicodeStringStorageTests.NameIsRemovedWhenLinkIsDeletedTest [2 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.6382550Z Passed Foundation.Data.Doublets.Cli.Tests.UnicodeStringStorageTests.ExternalReferenceCanUseNameThatAlreadyExistsInternallyTest [2 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.6661720Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.SwapSourceAndTargetForAllLinksUsingVariablesTest [263 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.6671060Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.CreateLinkWithSource2Target2Test [13 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.6672280Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.DeleteAllLinksByIndexTest [2 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.6673470Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.DeleteAllLinksBySourceAndTargetTest [2 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.6674250Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.DeleteLinksByAnyTargetTest [2 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.6675050Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.DeleteLinksByAnySourceTest [2 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.6765810Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.DeleteMultipleLinksTest [3 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.6766650Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.CreateMultipleLinksTest [1 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.6876470Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.ReverseSourceWithTargetUsingVariablesTest [4 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.6887590Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.CreateSingleLinkTest [1 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.6888980Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.NoUpdateUsingVariablesTest [3 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.6890110Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.DeleteSingleLinkTest_Source1Target2 [1 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.6892450Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.MixedMultipleUpdatesTest [1 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.6893240Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.DeleteSingleLinkTest_Source2Target2 [1 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.6900110Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.CreationWithEmptySlotDuringUpdateTest [1 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.6901030Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.CreateSingleLinkWithIndexAfterDoubleGapTest [2 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.6901720Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.MultipleUpdatesTest [2 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.7142400Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.CreateSingleLinkWithIndexAfterGapTest [3 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.7166470Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.CreationDuringUpdateTest [1 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.7167450Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.UpdateSingleLinkTest [1 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.7168390Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.CreateSingleLinkWithIndexTest [1 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.7170920Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.DeletionDuringUpdateTest [< 1 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.7203640Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.NameLookupConsistencyTest [66 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.7205060Z Passed Foundation.Data.Doublets.Cli.Tests.LinoDatabaseOutputTests.WriteToFile_WritesCompleteDatabaseAsLinoLines [9 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.7206100Z Passed Foundation.Data.Doublets.Cli.Tests.LinoDatabaseOutputTests.FormatStructure_RendersLeftBranchWithLinkIndexes [2 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.7442450Z Passed Foundation.Data.Doublets.Cli.Tests.LinoDatabaseOutputTests.FormatStructure_RendersRepeatedSourceAndTargetAsReferenceOnRight [< 1 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.7447950Z Passed Foundation.Data.Doublets.Cli.Tests.LinoDatabaseOutputTests.FormatDatabase_EscapesNamesThatNeedQuoting [1 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.7454180Z Passed Foundation.Data.Doublets.Cli.Tests.LinoDatabaseOutputTests.FormatDatabase_UsesNamesForIndexesSourcesAndTargets_WhenNamesExist [1 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.7455720Z Passed Foundation.Data.Doublets.Cli.Tests.LinoDatabaseOutputTests.FormatDatabase_SelectsQuoteStyleForNamesContainingQuotes [1 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.7456750Z Passed Foundation.Data.Doublets.Cli.Tests.LinoDatabaseOutputTests.FormatDatabase_UsesNumberedReferences_WhenLinksHaveNoNames [< 1 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.7457720Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.BasicQueryProcessor.DeleteSingleLinkTest_Source2Target2 [13 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.7458600Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.BasicQueryProcessor.DeleteMultipleLinksTest [3 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.7459360Z Passed Foundation.Data.Doublets.Cli.Tests.PinnedTypesTests.Should_Terminate_Enumeration_When_Iterated_Without_Take [17 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.7593040Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.BasicQueryProcessor.CreateSingleLinkTest [3 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.7741130Z Passed Foundation.Data.Doublets.Cli.Tests.PinnedTypesTests.Should_Validate_Existing_Links_With_Ulong [5 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.7843110Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.BasicQueryProcessor.UpdateSingleLinkTest [3 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.7945360Z Passed Foundation.Data.Doublets.Cli.Tests.PinnedTypesTests.Should_Destructure_PinnedTypes [1 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.8054120Z Passed Foundation.Data.Doublets.Cli.Tests.PinnedTypesTests.Should_Validate_Existing_Links [1 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.8079560Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.BasicQueryProcessor.CreateLinkWithSource2Target2Test [2 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.8081110Z Passed Foundation.Data.Doublets.Cli.Tests.PinnedTypesTests.Should_Reset_Enumerator [1 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.8082110Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.BasicQueryProcessor.MultipleUpdatesTest [8 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.8083710Z === Debug: Alternative Scenario === +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.8084290Z Input changes: +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.8085040Z 1. (1: 1 2) -> (0: 0 0) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.8085480Z 2. (1: 1 2) -> (1: 2 1) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.8085990Z 3. (2: 2 1) -> (2: 1 2) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.8086580Z Actual simplified changes: +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.8087260Z 1. (1: 1 2) -> (1: 2 1) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.8087790Z 2. (2: 2 1) -> (2: 1 2) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.8088290Z Count: 2 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.8088680Z === End Debug === +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.8089360Z Passed Foundation.Data.Doublets.Cli.Tests.PinnedTypesTests.Should_Throw_Exception_For_Invalid_Link_Structure [9 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.8090230Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.BasicQueryProcessor.CreateMultipleLinksTest [1 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.8091050Z Passed Foundation.Data.Doublets.Cli.Tests.PinnedTypesTests.Should_Create_And_Iterate_Over_Types [< 1 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.8092000Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.BasicQueryProcessor.DeleteSingleLinkTest_Source1Target2 [1 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.8098520Z Passed Foundation.Data.Doublets.Cli.Tests.PinnedTypesTests.Should_Create_And_Iterate_Over_Types_With_RealDataStore [2 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.8131440Z Passed Foundation.Data.Doublets.Cli.Tests.Issue62ReviewCoverageTests.ExplicitNumericIdUpdate_CanBeReversedWithAnotherUpdate [2 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.8133670Z Passed Foundation.Data.Doublets.Cli.Tests.Issue62ReviewCoverageTests.NamedLink_CreateDeleteRecreate_DoesNotLeaveStaleNameMapping [3 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.8135080Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.ChangesSimplifierTests.SimplifyChanges_Issue26_AlternativeScenario_NoSimplificationOccurs [9 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.8139070Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.ChangesSimplifierTests.SimplifyChanges_NoChange_StillKeepsFirstAndLastState [< 1 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.8140520Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.ChangesSimplifierTests.SimplifyChanges_Issue26_UpdateOperationSimplification [< 1 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.8142610Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.ChangesSimplifierTests.SimplifyChanges_SpecificExample_RemovesIntermediateStates [< 1 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.8144480Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.ChangesSimplifierTests.SimplifyChanges_MultipleChainsFromSameBefore_RemovesIntermediateStates [< 1 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.8146110Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.ChangesSimplifierTests.SimplifyChanges_MultipleBranchesFromSameInitial_ProducesCorrectFinalStates [< 1 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.8147590Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.ChangesSimplifierTests.SimplifyChanges_MultipleBranchesFromSameInitial_ProducesCorrectFinalStates_InCorrectOrder [4 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.8149010Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.ChangesSimplifierTests.SimplifyChanges_SpecificExample_KeepsUnchangedStates [< 1 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.8150440Z Passed Foundation.Data.Doublets.Cli.Tests.LinoDatabaseInputTests.ImportText_ReproducesNumberedLinksAtTheirExplicitIndexes [7 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.8151960Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.PersistentTransformationDecoratorTests.NeverRemovesMatchingStoredTrigger [22 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.8153370Z [Trace] Constructing SimpleLinksDecorator with names DB: /var/folders/tb/y368xp_x10s3ty1b_mtl5mxr0000gn/T/tmpxwURP3.names.links +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.8155270Z Passed Foundation.Data.Doublets.Cli.Tests.LinoDatabaseInputTests.ImportText_TreatsOutOfRangeNumbersAsNames [8 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.8159870Z Passed Foundation.Data.Doublets.Cli.Tests.LinoDatabaseInputTests.ImportText_UnquotesNamesWrittenByExporter [6 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.8161190Z Passed Foundation.Data.Doublets.Cli.Tests.LinoDatabaseInputTests.ImportText_CreatesNamedReferencesAsPointLinks [2 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.8162380Z Passed Foundation.Data.Doublets.Cli.Tests.SimpleLinksDecoratorTests.CanConstructSimpleLinksDecorator [1 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.8165380Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.PersistentTransformationDecoratorTests.AlwaysTriggerIsStoredInLinksAndAppliedAfterWrite [13 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.8166560Z Passed Foundation.Data.Doublets.Cli.Tests.SimpleLinksDecoratorTests.Delete_WithRestriction_DoesNotThrow [2 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.8167880Z Passed Foundation.Data.Doublets.Cli.Tests.SimpleLinksDecoratorTests.DeleteAfterGetOrCreate_DoesNotThrow_WithTracing [< 1 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.8169060Z Passed Foundation.Data.Doublets.Cli.Tests.SimpleLinksDecoratorTests.DeleteAfterGetOrCreate_DoesNotThrow [< 1 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.8170120Z [Test] All links: (1: 2->1) (2: 2->2) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.8947480Z [Test] All links: (1: 1->2) (2: 2->1) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.9150250Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.PersistentTransformationDecoratorTests.OnceTriggerDeletesItselfAfterFirstMatch [6 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.9252600Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.SwapEqualSourceAndTargetUsingVariablesHasAllChangesTest [113 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.9355960Z Passed Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.NamedTypesDecorator_UsesProvidedPinnedTypesDecorator [2 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.9457630Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.MultipleUpdatesTest [82 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.9559220Z Passed Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.NamedTypesDecorator_CanRemoveNames [12 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.9591220Z Passed Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.NamedTypesDecorator_DeleteRemovesAssociatedNames [2 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.9694360Z Passed Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.NamedTypesDecorator_CanSetAndGetNames [2 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.9736470Z Passed Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.NamedTypesDecorator_HandlesNonexistentNames [2 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.9801260Z [Test] All links: (1: 1->1) (3: 3->3) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.9822680Z Passed Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.NamedTypesDecorator_ReassigningExistingNameMovesNameToNewLink [3 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.9868420Z Passed Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.NamedTypesDecorator_ImplementsILinks [1 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.9892970Z Passed Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.NamedTypesDecorator_CanConstructFromDatabaseFilename [1 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.9901400Z Passed Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.NamedTypesDecorator_CanEnumeratePinnedTypes [2 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.9902540Z Passed Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.NamedTypesDecorator_CanOverwriteNames [2 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.9903920Z Passed Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.NamedTypesDecorator_ImplementsIPinnedTypes [1 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.9905040Z Passed Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.NamedTypesDecorator_ImplementsINamedTypes [1 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.9928550Z Passed Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.NamedTypesDecorator_CanGetLinkByName [2 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.9971430Z Passed Foundation.Data.Doublets.Cli.Tests.PinnedTypesDecoratorTests.Should_Implement_Both_ILinks_And_IPinnedTypes [1 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:14.9994500Z Passed Foundation.Data.Doublets.Cli.Tests.PinnedTypesDecoratorTests.Should_Support_Deconstruction [< 1 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.0030090Z Passed Foundation.Data.Doublets.Cli.Tests.PinnedTypesDecoratorTests.Should_Work_As_ILinks_Decorator [< 1 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.0096970Z Passed Foundation.Data.Doublets.Cli.Tests.PinnedTypesDecoratorTests.Should_Enumerate_PinnedTypes [< 1 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.0199860Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreationWithEmptySlotDuringUpdateTest [42 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.0314240Z Passed Foundation.Data.Doublets.Cli.Tests.NamedLinksDecoratorTests.SetName_OverwriteOldName [2 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.0417110Z Passed Foundation.Data.Doublets.Cli.Tests.NamedLinksDecoratorTests.MakeNamesDatabaseFilename_CorrectlyGeneratesFilename(dbFilename: "test.db", expected: "test.names.links") [< 1 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.0525430Z Passed Foundation.Data.Doublets.Cli.Tests.NamedLinksDecoratorTests.MakeNamesDatabaseFilename_CorrectlyGeneratesFilename(dbFilename: "a.b.c", expected: "a.b.names.links") [< 1 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.0628130Z Passed Foundation.Data.Doublets.Cli.Tests.NamedLinksDecoratorTests.MakeNamesDatabaseFilename_CorrectlyGeneratesFilename(dbFilename: "/tmp/test.db", expected: "/tmp/test.names.links") [< 1 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.0733090Z [Trace] Constructing NamedLinksDecorator with names DB: /var/folders/tb/y368xp_x10s3ty1b_mtl5mxr0000gn/T/tmpfdBC82.names.links +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.0757600Z [Test] All links: (1: 1->1) (2: 2->1) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.0821820Z [Test] All links: (21: 21->21) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.0859440Z Passed Foundation.Data.Doublets.Cli.Tests.NamedLinksDecoratorTests.AfterCreation_SetNameAndGetName_ShouldWork [< 1 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.0895920Z Passed Foundation.Data.Doublets.Cli.Tests.NamedLinksDecoratorTests.CanConstructNamedLinksDecorator [< 1 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.0947160Z Passed Foundation.Data.Doublets.Cli.Tests.NamedLinksDecoratorTests.RemoveName_NonExistent_DoesNotThrow [1 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.0989370Z Passed Foundation.Data.Doublets.Cli.Tests.NamedLinksDecoratorTests.RemoveName_ShouldReturnNullAfterRemoval [3 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.1026690Z Passed Foundation.Data.Doublets.Cli.Tests.NamedLinksDecoratorTests.SetNameAndGetName_ShouldReturnSameName [3 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.1056640Z Passed Foundation.Data.Doublets.Cli.Tests.NamedLinksDecoratorTests.DeleteLink_RemovesNameAutomatically [6 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.1121810Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateLeftCompositeIntegerChildrenWithoutExtraLeaf_ShouldSucceed [21 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.1173640Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.Issue20_SubstituteFullPointWithUnboundParts_ShouldKeepFullPoint [13 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.1250760Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.MatchAndDelete2LevelNestedLinksTest [4 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.1291290Z [Test] All links: (1: 1->1) (2: 2->2) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.1323600Z [Test] All links: (2: 2->2) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.1367950Z [Trace] Constructing NamedTypesDecorator with names DB: /var/folders/tb/y368xp_x10s3ty1b_mtl5mxr0000gn/T/tmpWhIz8Z.names.links +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.1483890Z [ProcessQuery] Query: "(() ((link: link link)))" +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.1525840Z [ProcessQuery] Parser returned 1 top-level link(s). +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.1614170Z [ProcessQuery] Restriction link => Id="" Values.Count=0 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.1679380Z [ProcessQuery] Substitution link => Id="" Values.Count=1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.1735820Z [ProcessQuery] No restriction, but substitution is non-empty => creation scenario. +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.1775080Z [ValidateLinksExistOrWillBeCreated] Starting validation +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.1814440Z [ValidateLinksExistOrWillBeCreated] Numeric links to be created: +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.1832940Z [ValidateLinksExistOrWillBeCreated] Named links to be created: link +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.1872610Z [Trace] GetByName called for name: 'link' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.1898890Z [Trace] GetByName result: 0 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.1916960Z [ValidateReferencesInPattern] Named link 'link' reference validated in substitution pattern +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.1939210Z [Trace] GetByName called for name: 'link' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.1960420Z [Trace] GetByName result: 0 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2074490Z [ValidateReferencesInPattern] Named link 'link' reference validated in substitution pattern +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2109290Z [ValidateLinksExistOrWillBeCreated] Validation completed +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2128430Z [Trace] GetByName called for name: 'link' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2162200Z [Trace] GetByName result: 0 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2208010Z [Trace] Update called with restriction: [1] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2259470Z [Trace] Debug: handlerWrapper invoked - before=1,0,0, after=1,0,0 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2325840Z [Trace] Update result: 4294967295 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2390070Z [EnsureNestedLinkCreatedRecursively] Created named leaf 'link' => ID=1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2421750Z [Trace] SetName called for link: 1 with name: 'link' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2453380Z [Trace] RemoveName called for link: 1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2477790Z [Trace] RemoveName completed for link: 1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2497330Z [Trace] SetName result: 100 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2508930Z [EnsureNestedLinkCreatedRecursively] Updating link ID=1 => Source=1, Target=1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2537340Z [Trace] Update called with restriction: [1,0,0] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2567570Z [Trace] Debug: handlerWrapper invoked - before=1,0,0, after=1,1,1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2583820Z [EnsureNestedLinkCreatedRecursively] Update handler: before=(1: 0->0), after=(1: 1->1) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2612080Z [Trace] Update result: 4294967295 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2629610Z [ProcessQuery] Created link ID #1 from substitution pattern. +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2666670Z [Test] All links: (1: 1->1) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2683260Z [Trace] GetByName called for name: 'link' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2706670Z [Trace] GetByName result: 1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2772980Z [Trace] GetName called for link: 1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2831100Z [Trace] GetName result: link +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2861970Z [Test] All links: (1: 1->1) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2873380Z [Test] All links: (1: 1->1) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2874050Z [Test] All links: +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2874740Z [Test] All links: (1: 1->1) (2: 2->2) (3: 1->2) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2875490Z [Test] All links: (1: 1->2) (2: 1->1) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2876280Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteLinksByAnyTargetTest [5 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2877390Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateNamedLinkWithStringId_ShouldCreateSingleLink [3 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2878530Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeletionDuringUpdateTest [3 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2880140Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateNamedLinkWithMissingNamedReferences_ShouldThrowException [2 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2881400Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateLinkWithIntegerId_ShouldCreateSingleLink [3 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2882750Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteAllLinksByIndexTest [3 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2883800Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateNamedFamilyLinksTest [2 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2884990Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeduplicateDuplicatePairWithNumericLinks_ShouldCreateOnlyOneSubLink [2 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2886310Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.StringAliasesInVariableRestriction_ShouldConstrainMatchesToNamedLinks [7 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2887500Z [Test] All links: (1: 1->1) (2: 2->2) (3: 2->1) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2888080Z [Test] All links: (2: 2->2) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2893490Z [Test] All links: (1: 1->1) (2: 2->2) (3: 2->1) (4: 3->3) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2894180Z [Test] All links: (1: 1->1) (2: 2->2) (3: 1->2) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2897050Z [Test] All links: (1: 1->2) (2: 2->1) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2897980Z [Test] All links: (1: 2->1) (2: 1->1) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2898560Z [Test] ===== Starting UpdateNamedLinkNameTest ===== +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2899450Z [Trace] Constructing NamedTypesDecorator with names DB: /var/folders/tb/y368xp_x10s3ty1b_mtl5mxr0000gn/T/tmpYKdyci.names.links +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2900300Z [Test] Constants: Null=0, Any=4294967292, Continue=4294967295 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2900990Z [Test] Step 1: Creating initial link +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2901680Z [Test] Query: (() ((child: father mother))) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2902300Z [ProcessQuery] Query: "(() ((child: father mother)))" +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2902940Z [ProcessQuery] Parser returned 1 top-level link(s). +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2903590Z [ProcessQuery] Restriction link => Id="" Values.Count=0 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2904570Z [ProcessQuery] Substitution link => Id="" Values.Count=1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2905720Z [ProcessQuery] No restriction, but substitution is non-empty => creation scenario. +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2906610Z [ValidateLinksExistOrWillBeCreated] Starting validation +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2907330Z [ValidateLinksExistOrWillBeCreated] Numeric links to be created: +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2908100Z [ValidateLinksExistOrWillBeCreated] Named links to be created: child +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2908930Z [Trace] GetByName called for name: 'father' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2909590Z [Trace] GetByName result: 0 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2910080Z [Trace] GetByName called for name: 'mother' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2910600Z [Trace] GetByName result: 0 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2911110Z [Trace] GetByName called for name: 'father' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2911610Z [Trace] GetByName result: 0 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2912330Z [ValidateLinksExistOrWillBeCreated] Auto-creating missing named reference 'father' as point link. +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2913050Z [Trace] GetByName called for name: 'father' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2913540Z [Trace] GetByName result: 0 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2914020Z [Trace] Update called with restriction: [1] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2914720Z [Trace] Debug: handlerWrapper invoked - before=1,0,0, after=1,0,0 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2920230Z [Trace] Update result: 4294967295 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2920820Z [Trace] SetName called for link: 1 with name: 'father' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2921350Z [Trace] RemoveName called for link: 1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2921860Z [Trace] RemoveName completed for link: 1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2922350Z [Trace] SetName result: 108 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2922830Z [Trace] Update called with restriction: [1,0,0] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2923420Z [Trace] Debug: handlerWrapper invoked - before=1,0,0, after=1,1,1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2924020Z [Trace] Update result: 4294967295 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2924510Z [Trace] GetByName called for name: 'mother' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2924990Z [Trace] GetByName result: 0 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2926810Z [ValidateLinksExistOrWillBeCreated] Auto-creating missing named reference 'mother' as point link. +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2929080Z [Trace] GetByName called for name: 'mother' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2930770Z [Trace] GetByName result: 0 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2931270Z [Trace] Update called with restriction: [2] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2931870Z [Trace] Debug: handlerWrapper invoked - before=2,0,0, after=2,0,0 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2932430Z [Trace] Update result: 4294967295 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2932950Z [Trace] SetName called for link: 2 with name: 'mother' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2933590Z [Trace] RemoveName called for link: 2 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2934080Z [Trace] RemoveName completed for link: 2 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2934560Z [Trace] SetName result: 110 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2935070Z [Trace] Update called with restriction: [2,0,0] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2935680Z [Trace] Debug: handlerWrapper invoked - before=2,0,0, after=2,2,2 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2936380Z [Trace] Update result: 4294967295 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2936900Z [ValidateLinksExistOrWillBeCreated] Validation completed +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2937340Z [Trace] GetByName called for name: 'father' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2937720Z [Trace] GetByName result: 1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2938210Z [EnsureNestedLinkCreatedRecursively] Found existing named leaf 'father' => ID=1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2938730Z [Trace] GetByName called for name: 'mother' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2939100Z [Trace] GetByName result: 2 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2939620Z [EnsureNestedLinkCreatedRecursively] Found existing named leaf 'mother' => ID=2 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2940190Z [EnsureLinkCreated] Creating link for (S=1, T=2). +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2940610Z [EnsureLinkCreated] => assigned new ID=3 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2941040Z [Trace] Update called with restriction: [3] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2941520Z [Trace] Debug: handlerWrapper invoked - before=3,0,0, after=3,1,2 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2941950Z [Trace] Update result: 4294967295 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2942570Z [EnsureNestedLinkCreatedRecursively] Created or ensured composite link => Index=0, Source=1, Target=2 => Actual ID=3 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2943230Z [Trace] SetName called for link: 3 with name: 'child' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2943660Z [Trace] RemoveName called for link: 3 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2944050Z [Trace] RemoveName completed for link: 3 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2944420Z [Trace] SetName result: 118 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2944840Z [ProcessQuery] Created link ID #3 from substitution pattern. +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2945530Z [Test] Initial link creation completed +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2946080Z [Test] Step 2: Verifying initial state +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2946610Z [Trace] GetByName called for name: 'child' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2947070Z [Trace] GetByName result: 3 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2947530Z [Test] Initial child ID: 3 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2947990Z [Trace] GetByName called for name: 'father' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2948490Z [Trace] GetByName result: 1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2948920Z [Test] Initial father ID: 1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2949370Z [Trace] GetByName called for name: 'mother' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2949870Z [Trace] GetByName result: 2 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2950300Z [Test] Initial mother ID: 2 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2950730Z [Test] Initial links count: 3 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2951240Z [Test] Initial link: Index=(1: 1->1), Source=1, Target=1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2951860Z [Test] Initial link: Index=(2: 2->2), Source=2, Target=2 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2952450Z [Test] Initial link: Index=(3: 1->2), Source=1, Target=2 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2952960Z [Test] Initial state verification completed +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2953510Z [Test] Step 3: Updating link name from 'child' to 'son' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2954070Z [Test] Query: (((child: father mother)) ((son: father mother))) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2954640Z [Test] Current state before update: +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2955120Z [Trace] GetByName called for name: 'child' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2955590Z [Trace] GetByName result: 3 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2956080Z [Test] - child name exists: True +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2956500Z [Trace] GetByName called for name: 'son' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2956870Z [Trace] GetByName result: 0 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2957620Z [Test] - son name exists: False +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2958140Z [Trace] GetByName called for name: 'father' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2959340Z [Trace] GetByName result: 1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2960250Z [Test] - father name exists: True +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2960630Z [Trace] GetByName called for name: 'mother' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2961010Z [Trace] GetByName result: 2 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2961350Z [Test] - mother name exists: True +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2961730Z [Test] Starting ProcessQuery for update... +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2962120Z [Test] Current links before update: +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2962920Z [Test] Link: Index=(1: 1->1), Source=1, Target=1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2963340Z [Test] Link: Index=(2: 2->2), Source=2, Target=2 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2963750Z [Test] Link: Index=(3: 1->2), Source=1, Target=2 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2964250Z [ProcessQuery] Query: "(((child: father mother)) ((son: father mother)))" +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2964750Z [ProcessQuery] Parser returned 1 top-level link(s). +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2965210Z [ProcessQuery] Restriction link => Id="" Values.Count=1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2965690Z [ProcessQuery] Substitution link => Id="" Values.Count=1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2966210Z [ProcessQuery] Restriction patterns to parse: 1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2966660Z [ProcessQuery] Substitution patterns to parse: 1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2967130Z [ValidateLinksExistOrWillBeCreated] Starting validation +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2967670Z [ValidateLinksExistOrWillBeCreated] Numeric links to be created: +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2968220Z [ValidateLinksExistOrWillBeCreated] Named links to be created: son +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2968700Z [Trace] GetByName called for name: 'child' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2987980Z [Trace] GetByName result: 3 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2988540Z [ValidateReferencesInPattern] Named link 'child' reference validated in restriction pattern +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2989080Z [Trace] GetByName called for name: 'father' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2989460Z [Trace] GetByName result: 1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2990000Z [ValidateReferencesInPattern] Named link 'father' reference validated in restriction pattern +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2990540Z [Trace] GetByName called for name: 'mother' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2990920Z [Trace] GetByName result: 2 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2991990Z [ValidateReferencesInPattern] Named link 'mother' reference validated in restriction pattern +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2992590Z [Trace] GetByName called for name: 'father' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2992960Z [Trace] GetByName result: 1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2993490Z [ValidateReferencesInPattern] Named link 'father' reference validated in substitution pattern +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2994040Z [Trace] GetByName called for name: 'mother' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2994410Z [Trace] GetByName result: 2 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2995200Z [ValidateReferencesInPattern] Named link 'mother' reference validated in substitution pattern +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2995790Z [ValidateLinksExistOrWillBeCreated] Validation completed +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2996450Z [ProcessQuery] Detected single sub-link with 2 sub-values => replaced with one composite restriction pattern. +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2997080Z [ProcessQuery] Converting restriction patterns => done. +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2997550Z [ProcessQuery] Converting substitution patterns => done. +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2998120Z [ProcessQuery] Finding solutions for restriction patterns... +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2998560Z [Trace] GetByName called for name: 'child' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2998920Z [Trace] GetByName result: 3 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2999290Z [Trace] GetByName called for name: 'father' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.2999650Z [Trace] GetByName result: 1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3000020Z [Trace] GetByName called for name: 'mother' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3000380Z [Trace] GetByName result: 2 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3000830Z [ProcessQuery] Found 1 total solution(s) matching restriction patterns. +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3001300Z [Trace] GetByName called for name: 'child' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3001660Z [Trace] GetByName result: 3 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3002020Z [Trace] GetByName called for name: 'father' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3002380Z [Trace] GetByName result: 1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3003360Z [Trace] GetByName called for name: 'mother' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3003840Z [Trace] GetByName result: 2 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3004410Z [Trace] GetByName called for name: 'son' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3004780Z [Trace] GetByName result: 0 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3005130Z [Trace] GetByName called for name: 'father' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3005510Z [Trace] GetByName result: 1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3005870Z [Trace] GetByName called for name: 'mother' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3006250Z [Trace] GetByName result: 2 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3006630Z [ProcessQuery] allSolutionsNoOperation=False +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3007130Z [ProcessQuery] Some solutions lead to actual changes => building operations. +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3007610Z [Trace] GetByName called for name: 'son' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3007970Z [Trace] GetByName result: 0 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3008330Z [Trace] GetByName called for name: 'father' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3008700Z [Trace] GetByName result: 1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3009060Z [Trace] GetByName called for name: 'mother' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3009430Z [Trace] GetByName result: 2 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3009790Z [Trace] GetByName called for name: 'child' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3010160Z [Trace] GetByName result: 3 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3010510Z [Trace] GetByName called for name: 'father' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3010880Z [Trace] GetByName result: 1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3011230Z [Trace] GetByName called for name: 'mother' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3011590Z [Trace] GetByName result: 2 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3012080Z [ProcessQuery] For a solution => substitution links count=1, restriction links count=1. +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3012650Z [ProcessQuery] => 2 operation(s) derived from these patterns. +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3013620Z [ProcessQuery] All planned operations => 2 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3014040Z [ProcessQuery] Applying all planned operations... +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3014570Z [ApplyAllPlannedOperations] Operation: before=(3:1->2), after=(0:0->0) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3015030Z [Trace] GetName called for link: 3 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3015390Z [Trace] GetName result: child +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3017820Z [ApplyAllPlannedOperations] Name for before.Index 3 = 'child' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3019270Z [ApplyAllPlannedOperations] Deleting link => ID=3, S=1, T=2 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3019760Z [RemoveLinks] Found 1 link(s) matching (ID=3, S=1, T=2). +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3020160Z [Trace] RemoveName called for link: 3 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3020540Z [Trace] RemoveName completed for link: 3 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3020930Z [RemoveLinks] Deleting link => ID=3, S=1, T=2 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3021340Z [Trace] Delete called with restriction: [3,1,2] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3021980Z [Trace] Debug: this._links is of type: Foundation.Data.Doublets.Cli.PinnedTypesDecorator`1[System.UInt32] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3022570Z [Trace] Debug: Calling underlying _links.Delete +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3024980Z [Trace] Debug: handlerWrapper invoked - before=3,1,2, after=3,0,0 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3026930Z [Test] Update ChangesHandler called: +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3027860Z [Test] - Before state: (3: 1->2) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3028860Z [Test] - After state: (3: 0->0) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3029990Z [Trace] GetByName called for name: 'child' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3030890Z [Trace] GetByName result: 0 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3031730Z [Test] - child name during change: 0 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3032630Z [Trace] GetByName called for name: 'son' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3033510Z [Trace] GetByName result: 0 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3034320Z [Test] - son name during change: 0 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3035230Z [Trace] GetByName called for name: 'father' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3036120Z [Trace] GetByName result: 1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3036950Z [Test] - father name during change: 1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3037980Z [Trace] GetByName called for name: 'mother' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3039040Z [Trace] GetByName result: 2 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3039960Z [Test] - mother name during change: 2 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3041080Z [Test] - All links during change: +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3041850Z [Test] Link: Index=(1: 1->1), Source=1, Target=1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3042420Z [Test] Link: Index=(2: 2->2), Source=2, Target=2 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3043370Z [Test] Link: Index=(3: 0->0), Source=0, Target=0 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3043990Z [Trace] Debug: handlerWrapper invoked - before=3,0,0, after=null +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3044940Z [Trace] RemoveName called for link: 3 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3045430Z [Trace] RemoveName completed for link: 3 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3045890Z [Test] Update ChangesHandler called: +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3046380Z [Test] - Before state: (3: 0->0) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3046830Z [Test] - After state: +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3047600Z [Trace] GetByName called for name: 'child' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3048100Z [Trace] GetByName result: 0 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3048590Z [Test] - child name during change: 0 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3049100Z [Trace] GetByName called for name: 'son' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3049540Z [Trace] GetByName result: 0 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3049970Z [Test] - son name during change: 0 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3050420Z [Trace] GetByName called for name: 'father' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3050910Z [Trace] GetByName result: 1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3051350Z [Test] - father name during change: 1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3051750Z [Trace] GetByName called for name: 'mother' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3052240Z [Trace] GetByName result: 2 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3052680Z [Test] - mother name during change: 2 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3053180Z [Test] - All links during change: +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3053660Z [Test] Link: Index=(1: 1->1), Source=1, Target=1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3054200Z [Test] Link: Index=(2: 2->2), Source=2, Target=2 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3055200Z [Trace] Debug: Delete result: 4294967295 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3055900Z [ApplyAllPlannedOperations] Operation: before=(0:0->0), after=(4294967292:1->2) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3056530Z [Trace] GetName called for link: 4294967292 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3057030Z [Trace] GetName result: String +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3057600Z [ApplyAllPlannedOperations] Name for after.Index 4294967292 = 'String' (pre-op) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3058370Z [ApplyAllPlannedOperations] Creating link => ID=4294967292, S=1, T=2 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3059490Z [CreateOrUpdateLink] Detected wildcard substitution => nested create & name. +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3060090Z [Trace] GetByName called for name: 'father' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3060600Z [Trace] GetByName result: 1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3061190Z [EnsureNestedLinkCreatedRecursively] Found existing named leaf 'father' => ID=1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3061800Z [Trace] GetByName called for name: 'mother' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3062180Z [Trace] GetByName result: 2 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3062750Z [EnsureNestedLinkCreatedRecursively] Found existing named leaf 'mother' => ID=2 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3063490Z [EnsureLinkCreated] Creating link for (S=1, T=2). +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3064010Z [EnsureLinkCreated] => assigned new ID=3 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3064500Z [Test] Update ChangesHandler called: +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3064970Z [Test] - Before state: +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3065440Z [Test] - After state: (3: 0->0) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3065920Z [Trace] GetByName called for name: 'child' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3066380Z [Trace] GetByName result: 0 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3066820Z [Test] - child name during change: 0 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3067330Z [Trace] GetByName called for name: 'son' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3067750Z [Trace] GetByName result: 0 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3068210Z [Test] - son name during change: 0 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3068690Z [Trace] GetByName called for name: 'father' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3069160Z [Trace] GetByName result: 1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3069530Z [Test] - father name during change: 1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3070040Z [Trace] GetByName called for name: 'mother' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3070510Z [Trace] GetByName result: 2 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3070860Z [Test] - mother name during change: 2 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3071230Z [Test] - All links during change: +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3071620Z [Test] Link: Index=(1: 1->1), Source=1, Target=1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3072050Z [Test] Link: Index=(2: 2->2), Source=2, Target=2 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3072470Z [Test] Link: Index=(3: 0->0), Source=0, Target=0 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3072910Z [Test] Creating new link: Index=3, Source=0, Target=0 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3073840Z [Test] Checking if link exists: True +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3074490Z [Test] Checking if source exists: False +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3075090Z [Test] Checking if target exists: False +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3075390Z [Test] Names before creation: +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3075940Z [Trace] GetByName called for name: 'child' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3076240Z [Trace] GetByName result: 0 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3076480Z [Test] - child: 0 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3076740Z [Trace] GetByName called for name: 'son' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3077040Z [Trace] GetByName result: 0 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3077270Z [Test] - son: 0 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3077540Z [Trace] GetByName called for name: 'father' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3077830Z [Trace] GetByName result: 1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3078080Z [Test] - father: 1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3078350Z [Trace] GetByName called for name: 'mother' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3078650Z [Trace] GetByName result: 2 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3078900Z [Test] - mother: 2 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3079160Z [Trace] Update called with restriction: [3] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3079550Z [Trace] Debug: handlerWrapper invoked - before=3,0,0, after=3,1,2 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3079940Z [Test] Update ChangesHandler called: +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3080340Z [Test] - Before state: (3: 0->0) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3080660Z [Test] - After state: (3: 1->2) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3080980Z [Trace] GetByName called for name: 'child' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3081380Z [Trace] GetByName result: 0 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3081750Z [Test] - child name during change: 0 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3082120Z [Trace] GetByName called for name: 'son' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3082480Z [Trace] GetByName result: 0 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3082820Z [Test] - son name during change: 0 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3083190Z [Trace] GetByName called for name: 'father' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3083560Z [Trace] GetByName result: 1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3083840Z [Test] - father name during change: 1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3084330Z [Trace] GetByName called for name: 'mother' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3084680Z [Trace] GetByName result: 2 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3085070Z [Test] - mother name during change: 2 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3085450Z [Test] - All links during change: +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3085830Z [Test] Link: Index=(1: 1->1), Source=1, Target=1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3086280Z [Test] Link: Index=(2: 2->2), Source=2, Target=2 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3086720Z [Test] Link: Index=(3: 1->2), Source=1, Target=2 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3087110Z [Trace] Update result: 4294967295 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3087770Z [EnsureNestedLinkCreatedRecursively] Created or ensured composite link => Index=0, Source=1, Target=2 => Actual ID=3 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3088430Z [Trace] SetName called for link: 3 with name: 'son' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3088790Z [Trace] RemoveName called for link: 3 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3089190Z [Trace] RemoveName completed for link: 3 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3089570Z [Trace] SetName result: 118 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3089960Z [Trace] GetName called for link: 4294967292 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3090300Z [Trace] GetName result: String +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3091740Z [ApplyAllPlannedOperations] Name for after.Index 4294967292 = 'String' (post-op) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3092390Z [ProcessQuery] Restoring unexpected deletions if any... +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3092930Z [RestoreUnexpectedLinkDeletions] No unexpected deletions found. +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3093470Z [ProcessQuery] Finished processing query. +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3093860Z [Test] Update operation completed +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3094190Z [Test] Step 4: Verifying final state +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3094930Z [Trace] GetByName called for name: 'child' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3095330Z [Trace] GetByName result: 0 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3095660Z [Test] Final child ID: 0 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3096000Z [Trace] GetByName called for name: 'son' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3096380Z [Trace] GetByName result: 3 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3096700Z [Test] Final son ID: 3 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3097460Z [Trace] GetByName called for name: 'father' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3097840Z [Trace] GetByName result: 1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3098830Z [Test] Final father ID: 1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3101950Z [Trace] GetByName called for name: 'mother' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3102870Z [Trace] GetByName result: 2 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3103550Z [Test] Final mother ID: 2 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3105050Z [Test] Final links count: 3 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3106010Z [Test] Final link: Index=(1: 1->1), Source=1, Target=1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3107100Z [Test] Final link: Index=(2: 2->2), Source=2, Target=2 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3108140Z [Test] Final link: Index=(3: 1->2), Source=1, Target=2 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3110060Z [Test] ===== UpdateNamedLinkNameTest completed successfully ===== +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3110810Z [Test] All links: (1: 1->1) (2: 2->2) (3: 3->3) (4: 4->4) (5: 5->5) (6: 6->6) (7: 5->6) (8: 4->7) (9: 3->8) (10: 2->9) (11: 1->10) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3111260Z [Test] All links: (1: 1->1) (2: 1->2) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3111570Z [Test] All links: (10: 10->10) (20: 10->20) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3112160Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateSingleLinkWithIndexAfterGapTest [13 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3113150Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeduplicateDuplicatePairWithNamedLinks_ShouldCreateOnlyOneSubLink [21 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3114260Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateNamedLinkWithAutoCreateMissingNamedReferences_ShouldCreatePointLinks [13 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3115310Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateMultipleLinksWithCrossReferences_ShouldSucceed [11 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3116290Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.MakeAllLinksToGoIntoFirstLinkUsingVariablesTest [2 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3117150Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.UpdateNamedLinkNameTest [6 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3117920Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.Create6LevelNestedLinksTest [3 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3118850Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateRightCompositeStringChildrenWithoutExtraLeaf_ShouldSucceed [2 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3119940Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateLinkWithAutoCreateMissingNumericReferences_ShouldCreatePointLinks [3 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3120660Z [Test] All links: (1: 1->1) (2: 2->2) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3121010Z [Test] All links: (1: 1->1) (2: 2->2) (3: 2->1) (4: 3->3) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3121390Z [Test] All links: (1: 1->1) (2: 1->2) (3: 3->1) (4: 1->4) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3121720Z [Test] All links: (1: 1->1) (2: 1->2) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3122170Z [Test] All links: (1: 1->1) (2: 2->2) (3: 3->3) (4: 4->4) (5: 5->5) (6: 4->5) (7: 3->6) (8: 2->7) (9: 1->8) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3122570Z [Test] All links: (1: 1->1) (2: 2->2) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3122860Z [Test] All links: (1: 1->2) (2: 2->2) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3123160Z [Test] All links: (1: 1->2) (2: 2->1) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3123670Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateMultipleLinksTest [5 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3124570Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeduplicateMixedNamedAndNumericLinks_ShouldReuseExistingLinks [3 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3125740Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.MatchSelfReferencingAndMakeThemGoOutFromFirstLinkUsingVariablesTest [2 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3126850Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateRightCompositeIntegerChildrenWithoutExtraLeaf_ShouldSucceed [2 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3128310Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.EnsureCreated_WithSpecialAnyReference_ShouldThrowControlledException [6 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3129220Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.Create5LevelNestedLinksTest [5 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3131050Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.MatchWithExactIndexAndDelete2LevelNestedLinksTest [7 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3133910Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.UpdateSingleLinkTest [4 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3236300Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.MixedMultipleUpdatesTest [3 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3244220Z [Test] All links: +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3351620Z [Test] All links: (1: 1->1) (2: 2->2) (3: 1->2) (4: 2->1) (5: 3->4) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3370020Z [Test] All links: (1: 1->1) (2: 2->1) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3406840Z [Test] All links: (1: 1->1) (2: 2->2) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3407370Z [Test] All links: (1: 1->2) (2: 1->1) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3407730Z [Test] All links: (3: 3->3) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3408230Z [Test] All links: (1: 1->1) (2: 18->20) (18: 1->21) (19: 1->20) (20: 20->20) (21: 21->21) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3409070Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.NestedDeleteAllLinksBySourceAndTargetTest1 [4 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3410160Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeduplicateWithDifferentPairs_ShouldNotDeduplicateDifferentLinks [11 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3411370Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateLeftCompositeStringChildrenWithoutExtraLeaf_ShouldSucceed [4 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3412450Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.NoExactMatch2LevelNestedLinksTest [9 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3413460Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.MakeAllLinksToGoOutOfFirstLinkUsingVariablesTest [7 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3414470Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateSingleLinkWithIndexAfterDoubleGapTest [3 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3415570Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.Issue20_SubstituteMatchedLinkAndOutgoingLink_ShouldPreserveExistingParts [5 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3417940Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteNamedFamilyLinksRemovesNamesTest [2 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3425040Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.ExactMatchAndDelete2LevelNestedLinksTest [2 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3425820Z [Test] All links: (1: 1->1) (2: 2->2) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3426240Z [Test] All links: (1: 0->0) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3426670Z [Test] All links: (1: 1->1) (2: 2->2) (3: 1->2) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3427100Z [Test] All links: (1: 1->1) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3427800Z [Trace] Constructing NamedTypesDecorator with names DB: /var/folders/tb/y368xp_x10s3ty1b_mtl5mxr0000gn/T/tmpwmsXZA.names.links +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3428470Z [Test] Starting UpdateNamedLinkNameTest +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3428900Z [Test] Step 1: Creating initial link +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3429370Z [ProcessQuery] Query: "(() ((child: father mother)))" +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3429880Z [ProcessQuery] Parser returned 1 top-level link(s). +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3430410Z [ProcessQuery] Restriction link => Id="" Values.Count=0 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3430940Z [ProcessQuery] Substitution link => Id="" Values.Count=1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3431560Z [ProcessQuery] No restriction, but substitution is non-empty => creation scenario. +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3433010Z [ValidateLinksExistOrWillBeCreated] Starting validation +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3433650Z [ValidateLinksExistOrWillBeCreated] Numeric links to be created: +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3434270Z [ValidateLinksExistOrWillBeCreated] Named links to be created: child +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3434820Z [Trace] GetByName called for name: 'father' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3435310Z [Trace] GetByName result: 0 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3436050Z [Trace] GetByName called for name: 'mother' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3436480Z [Trace] GetByName result: 0 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3436900Z [Trace] GetByName called for name: 'father' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3437330Z [Trace] GetByName result: 0 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3438560Z [ValidateLinksExistOrWillBeCreated] Auto-creating missing named reference 'father' as point link. +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3439220Z [Trace] GetByName called for name: 'father' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3439650Z [Trace] GetByName result: 0 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3440580Z [Trace] Update called with restriction: [1] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3441110Z [Trace] Debug: handlerWrapper invoked - before=1,0,0, after=1,0,0 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3441620Z [Trace] Update result: 4294967295 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3442080Z [Trace] SetName called for link: 1 with name: 'father' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3442550Z [Trace] RemoveName called for link: 1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3442980Z [Trace] RemoveName completed for link: 1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3443420Z [Trace] SetName result: 108 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3443970Z [Trace] Update called with restriction: [1,0,0] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3444510Z [Trace] Debug: handlerWrapper invoked - before=1,0,0, after=1,1,1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3452000Z [Trace] Update result: 4294967295 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3452780Z [Trace] GetByName called for name: 'mother' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3453260Z [Trace] GetByName result: 0 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3453910Z [ValidateLinksExistOrWillBeCreated] Auto-creating missing named reference 'mother' as point link. +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3454630Z [Trace] GetByName called for name: 'mother' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3455330Z [Trace] GetByName result: 0 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3455770Z [Trace] Update called with restriction: [2] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3456420Z [Trace] Debug: handlerWrapper invoked - before=2,0,0, after=2,0,0 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3456920Z [Trace] Update result: 4294967295 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3457390Z [Trace] SetName called for link: 2 with name: 'mother' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3457870Z [Trace] RemoveName called for link: 2 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3458390Z [Trace] RemoveName completed for link: 2 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3458910Z [Trace] SetName result: 110 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3459550Z [Trace] Update called with restriction: [2,0,0] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3460570Z [Trace] Debug: handlerWrapper invoked - before=2,0,0, after=2,2,2 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3461230Z [Trace] Update result: 4294967295 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3462190Z [ValidateLinksExistOrWillBeCreated] Validation completed +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3464610Z [Trace] GetByName called for name: 'father' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3465540Z [Trace] GetByName result: 1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3467080Z [EnsureNestedLinkCreatedRecursively] Found existing named leaf 'father' => ID=1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3468360Z [Trace] GetByName called for name: 'mother' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3469320Z [Trace] GetByName result: 2 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3470550Z [EnsureNestedLinkCreatedRecursively] Found existing named leaf 'mother' => ID=2 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3472730Z [EnsureLinkCreated] Creating link for (S=1, T=2). +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3473710Z [EnsureLinkCreated] => assigned new ID=3 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3474650Z [Trace] Update called with restriction: [3] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3476030Z [Trace] Debug: handlerWrapper invoked - before=3,0,0, after=3,1,2 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3477120Z [Trace] Update result: 4294967295 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3478700Z [EnsureNestedLinkCreatedRecursively] Created or ensured composite link => Index=0, Source=1, Target=2 => Actual ID=3 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3480380Z [Trace] SetName called for link: 3 with name: 'child' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3481650Z [Trace] RemoveName called for link: 3 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3482820Z [Trace] RemoveName completed for link: 3 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3512490Z [Trace] SetName result: 118 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3513090Z [ProcessQuery] Created link ID #3 from substitution pattern. +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3513620Z [Test] Initial link creation completed +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3514080Z [Test] Step 2: Verifying initial state +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3514780Z [Trace] GetByName called for name: 'child' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3517250Z [Trace] GetByName result: 3 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3518490Z [Test] Initial child ID: 3 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3519560Z [Trace] GetByName called for name: 'father' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3522440Z [Trace] GetByName result: 1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3522770Z [Test] Initial father ID: 1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3523510Z [Trace] GetByName called for name: 'mother' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3525010Z [Trace] GetByName result: 2 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3525430Z [Test] Initial mother ID: 2 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3525850Z [Test] All links: (1: 1->1) (2: 2->2) (3: 1->2) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3526440Z [Test] Initial links count: 3 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3526790Z [Test] Initial state verification completed +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3527110Z [Test] Step 3: Updating link name +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3527410Z [Test] Removing old name 'child' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3527710Z [Trace] RemoveName called for link: 3 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3528030Z [Trace] RemoveName completed for link: 3 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3528440Z [Test] Old name removed +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3528890Z [Test] Creating new link with name 'son' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3529390Z [ProcessQuery] Query: "(() ((son: father mother)))" +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3530180Z [ProcessQuery] Parser returned 1 top-level link(s). +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3530700Z [ProcessQuery] Restriction link => Id="" Values.Count=0 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3531240Z [ProcessQuery] Substitution link => Id="" Values.Count=1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3531960Z [ProcessQuery] No restriction, but substitution is non-empty => creation scenario. +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3532690Z [ValidateLinksExistOrWillBeCreated] Starting validation +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3533540Z [ValidateLinksExistOrWillBeCreated] Numeric links to be created: +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3534250Z [ValidateLinksExistOrWillBeCreated] Named links to be created: son +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3534860Z [Trace] GetByName called for name: 'father' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3535370Z [Trace] GetByName result: 1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3536000Z [ValidateReferencesInPattern] Named link 'father' reference validated in substitution pattern +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3536510Z [Trace] GetByName called for name: 'mother' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3536870Z [Trace] GetByName result: 2 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3537430Z [ValidateReferencesInPattern] Named link 'mother' reference validated in substitution pattern +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3538120Z [ValidateLinksExistOrWillBeCreated] Validation completed +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3538660Z [Trace] GetByName called for name: 'father' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3539070Z [Trace] GetByName result: 1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3539640Z [EnsureNestedLinkCreatedRecursively] Found existing named leaf 'father' => ID=1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3540150Z [Trace] GetByName called for name: 'mother' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3540580Z [Trace] GetByName result: 2 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3541150Z [EnsureNestedLinkCreatedRecursively] Found existing named leaf 'mother' => ID=2 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3541820Z [EnsureLinkCreated] Link already found => ID=3 => no-op. +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3542630Z [EnsureNestedLinkCreatedRecursively] Created or ensured composite link => Index=0, Source=1, Target=2 => Actual ID=3 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3543460Z [Trace] SetName called for link: 3 with name: 'son' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3543980Z [Trace] RemoveName called for link: 3 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3544490Z [Trace] RemoveName completed for link: 3 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3545000Z [Trace] SetName result: 123 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3545580Z [ProcessQuery] Created link ID #3 from substitution pattern. +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3546200Z [Test] New link creation completed +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3548020Z [Test] Step 4: Verifying final state +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3552480Z [Trace] GetByName called for name: 'child' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3553650Z [Trace] GetByName result: 0 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3555210Z [Trace] GetByName called for name: 'son' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3558130Z [Trace] GetByName result: 3 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3558540Z [Test] Final son ID: 3 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3559400Z [Trace] GetByName called for name: 'father' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3560510Z [Trace] GetByName result: 1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3561890Z [Test] Final father ID: 1 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3562220Z [Trace] GetByName called for name: 'mother' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3562590Z [Trace] GetByName result: 2 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3563070Z [Test] Final mother ID: 2 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3563550Z [Test] All links: (1: 1->1) (2: 2->2) (3: 1->2) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3564180Z [Test] Final links count: 3 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3564610Z [Test] Final state verification completed +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3565820Z [Test] UpdateNamedLinkNameTest completed successfully +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3566320Z [Test] All links: (1: 1->1) (2: 2->2) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3566890Z [Test] All links: (1: 1->1) (2: 2->2) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3567160Z [Test] All links: +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3567610Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteByNamesTest [3 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3568440Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateLinkWithVariableReferences_ShouldSucceed [2 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3569290Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.Create2LevelNestedLinksTest [1 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3570070Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteLinksByAnySourceTest [2 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3570850Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateTwoNamedLinksTest [3 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3571620Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.NoUpdateUsingVariablesTest [10 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3572490Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.MakeAllLinksSelfReferencingUsingVariablesTest [2 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3573350Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteMultipleLinksTest [1 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3574200Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.UpdateWithNonExistentReference_ShouldThrowException [3 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3574830Z [Test] All links: (2: 2->2) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3575200Z [Test] All links: (1: 1->1) (2: 2->2) (3: 3->3) (4: 2->3) (5: 1->4) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3575630Z [Test] All links: (1: 1->1) (2: 2->2) (3: 1->2) (4: 3->3) (5: 3->4) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3575970Z [Test] All links: (1: 1->1) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3576240Z [Test] All links: (1: 1->1) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3576520Z [Test] All links: (1: 1->1) (2: 2->2) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3576800Z [Test] All links: (1: 0->0) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3577060Z [Test] All links: +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3577560Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteSingleLinkTest_Source1Target2 [5 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3580470Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteNamedLinkTest [6 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3581240Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.Create3LevelNestedLinksTest [3 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3582130Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeduplicateTripleDuplicatePair_ShouldCreateOnlyOneSubLink [6 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3583100Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateLinkWithValidSelfReference_ShouldSucceed [2 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3583930Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateSingleLinkTest [3 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3584700Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreationDuringUpdateTest [2 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3585550Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateLinkWithWildcardReferences_ShouldSucceed [1 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3586430Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteSingleLinkTest_Source2Target2 [1 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3587090Z [Test] All links: (1: 1->1) (2: 2->2) (3: 1->2) (4: 3->3) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3587430Z [Test] All links: (1: 1->1) (2: 2->1) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3587710Z [Test] All links: +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3588240Z [Test] All links: (1: 1->1) (2: 2->2) (3: 3->3) (4: 4->4) (5: 5->5) (6: 6->6) (7: 7->7) (8: 6->7) (9: 5->8) (10: 4->9) (11: 3->10) (12: 2->11) (13: 1->12) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3588710Z [Test] All links: (1: 1->1) (2: 2->1) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3588980Z [Test] All links: +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3589310Z [Test] All links: (1: 1->1) (2: 2->2) (3: 1->2) (4: 3->3) (5: 4->4) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3594900Z [Test] All links: (1: 1->1) (2: 2->2) (3: 3->3) (4: 4->4) (5: 3->4) (6: 2->5) (7: 1->6) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3597240Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeduplicateNamedLinks_MultipleQueries_ShouldReuseSameIds [3 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3600270Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateLinkWithNonExistentReference_ShouldThrowException [1 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3603000Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.SwapSourceAndTargetForSingleLinkUsingVariablesTest [1 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3605560Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteAllLinksBySourceAndTargetTest2 [2 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3607870Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.Create7LevelNestedLinksTest [2 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3610140Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateLinkReferencingExistingLink_ShouldSucceed [2 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3612560Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteAllLinksBySourceAndTargetTest1 [1 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3616780Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeduplicateNestedDuplicates_ShouldDeduplicateAtAllLevels [2 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3619680Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.Create4LevelNestedLinksTest [6 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3621700Z [Test] All links: (1: 1->1) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:15.3622050Z [Test] All links: (1: 1->1) (2: 2->2) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:16.8533960Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateSingleLinkWithIndexTest [6 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:16.8535400Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateLinkWithSource2Target2Test [1 ms] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:18.3620030Z Passed Foundation.Data.Doublets.Cli.Tests.CliExportIntegrationTests.ExportAlias_WritesNamedReferences [2 s] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:20.4947020Z Passed Foundation.Data.Doublets.Cli.Tests.CliExportIntegrationTests.AlwaysTriggerOption_StoresTriggerAndAppliesItOnLaterChange [2 s] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:22.0594510Z Passed Foundation.Data.Doublets.Cli.Tests.CliExportIntegrationTests.ExportAlias_WritesNumberedReferences [1 s] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:28.7292930Z Passed Foundation.Data.Doublets.Cli.Tests.CliExportIntegrationTests.StructureOption_RendersLeftBranchWithIndexes [6 s] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:30.2570710Z [xUnit.net 00:00:16.26] Finished: Foundation.Data.Doublets.Cli.Tests +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:30.3078700Z Passed Foundation.Data.Doublets.Cli.Tests.CliExportIntegrationTests.ImportOption_ReadsNumberedLinoFile [1 s] +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:30.5133470Z +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:30.5159800Z Test Run Successful. +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:30.5161520Z Total tests: 187 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:30.5161850Z Passed: 187 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:30.5171370Z Total time: 18.6848 Seconds +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:30.5447950Z 1>Done Building Project "/Users/runner/work/link-cli/link-cli/csharp/Foundation.Data.Doublets.Cli.sln" (VSTest target(s)). +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:30.5597250Z +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:30.5598190Z Build succeeded. +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:30.5599040Z 0 Warning(s) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:30.5599830Z 0 Error(s) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:30.5600190Z +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:30.5601530Z Time Elapsed 00:00:19.40 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:30.7229300Z +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:30.7232000Z Attachments: +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:30.7250150Z /Users/runner/work/link-cli/link-cli/csharp/Foundation.Data.Doublets.Cli.Tests/TestResults/5b9de9e6-19e2-4ac0-b7f3-2f8dbb6286a2/coverage.cobertura.xml +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:30.7813280Z Post job cleanup. +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:31.4797130Z Post job cleanup. +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:31.5840010Z [command]/opt/homebrew/bin/git version +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:31.6039980Z git version 2.54.0 +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:31.6076440Z Copying '/Users/runner/.gitconfig' to '/Users/runner/work/_temp/56a4c3aa-7fff-46e9-a776-14d4d0a68c42/.gitconfig' +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:31.6088070Z Temporarily overriding HOME='/Users/runner/work/_temp/56a4c3aa-7fff-46e9-a776-14d4d0a68c42' before making global git config changes +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:31.6088930Z Adding repository directory to the temporary git global config as a safe directory +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:31.6091800Z [command]/opt/homebrew/bin/git config --global --add safe.directory /Users/runner/work/link-cli/link-cli +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:31.6188410Z [command]/opt/homebrew/bin/git config --local --name-only --get-regexp core\.sshCommand +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:31.6248400Z [command]/opt/homebrew/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :" +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:31.7078940Z [command]/opt/homebrew/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:31.7128810Z http.https://github.com/.extraheader +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:31.7138200Z [command]/opt/homebrew/bin/git config --local --unset-all http.https://github.com/.extraheader +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:31.7209020Z [command]/opt/homebrew/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'http\.https\:\/\/github\.com\/\.extraheader' && git config --local --unset-all 'http.https://github.com/.extraheader' || :" +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:31.8151210Z [command]/opt/homebrew/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir: +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:31.8425410Z [command]/opt/homebrew/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:31.9852340Z Cleaning up orphan processes +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:32.4838470Z Terminate orphan process: pid (1344) (VBCSCompiler) +Test (macos-latest) UNKNOWN STEP 2026-05-12T16:58:32.7986620Z ##[warning]Node.js 20 actions are deprecated. The following actions are running on Node.js 20 and may not work as expected: actions/checkout@v4, actions/setup-dotnet@v4. Actions will be forced to run with Node.js 24 by default starting June 2nd, 2026. Node.js 20 will be removed from the runner on September 16th, 2026. Please check if updated versions of these actions are available that support Node.js 24. To opt into Node.js 24 now, set the FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=true environment variable on the runner or in your workflow file. Once Node.js 24 becomes the default, you can temporarily opt out by setting ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION=true. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/ +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:51.7931497Z Current runner version: '2.334.0' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:51.7956367Z ##[group]Runner Image Provisioner +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:51.7957392Z Hosted Compute Agent +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:51.7958050Z Version: 20260213.493 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:51.7958619Z Commit: 5c115507f6dd24b8de37d8bbe0bb4509d0cc0fa3 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:51.7959328Z Build Date: 2026-02-13T00:28:41Z +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:51.7960013Z Worker ID: {430ed96d-5f83-40ab-91d5-0dd377c0a3be} +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:51.7960739Z Azure Region: westcentralus +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:51.7961288Z ##[endgroup] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:51.7962661Z ##[group]Operating System +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:51.7963248Z Ubuntu +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:51.7963750Z 24.04.4 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:51.7964302Z LTS +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:51.7964763Z ##[endgroup] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:51.7965631Z ##[group]Runner Image +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:51.7966264Z Image: ubuntu-24.04 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:51.7967030Z Version: 20260413.86.1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:51.7968343Z Included Software: https://github.com/actions/runner-images/blob/ubuntu24/20260413.86/images/ubuntu/Ubuntu2404-Readme.md +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:51.7969762Z Image Release: https://github.com/actions/runner-images/releases/tag/ubuntu24%2F20260413.86 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:51.7970686Z ##[endgroup] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:51.7973583Z ##[group]GITHUB_TOKEN Permissions +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:51.7975806Z Actions: write +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:51.7976443Z ArtifactMetadata: write +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:51.7977201Z Attestations: write +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:51.7977684Z Checks: write +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:51.7978261Z CodeQuality: write +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:51.7978792Z Contents: write +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:51.7979298Z Deployments: write +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:51.7979877Z Discussions: write +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:51.7980405Z Issues: write +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:51.7980916Z Metadata: read +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:51.7981404Z Models: read +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:51.7981933Z Packages: write +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:51.7982566Z Pages: write +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:51.7983056Z PullRequests: write +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:51.7983663Z RepositoryProjects: write +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:51.7984206Z SecurityEvents: write +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:51.7984797Z Statuses: write +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:51.7985320Z VulnerabilityAlerts: read +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:51.7985925Z ##[endgroup] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:51.7988382Z Secret source: Actions +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:51.7989219Z Prepare workflow directory +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:51.8448329Z Prepare all required actions +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:51.8485438Z Getting action download info +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:52.2718250Z Download action repository 'actions/checkout@v4' (SHA:34e114876b0b11c390a56381ad16ebd13914f8d5) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:52.4140176Z Download action repository 'actions/setup-dotnet@v4' (SHA:67a3573c9a986a3f9c594539f4ab511d57bb3ce9) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:53.1614278Z Download action repository 'codecov/codecov-action@v4' (SHA:b9fd7d16f6d7d1b5d2bec1a2887e65ceed900238) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:53.9050783Z Complete job name: Test (ubuntu-latest) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:53.9736575Z ##[group]Run actions/checkout@v4 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:53.9737508Z with: +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:53.9737833Z repository: link-foundation/link-cli +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:53.9738416Z token: *** +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:53.9738704Z ssh-strict: true +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:53.9739034Z ssh-user: git +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:53.9739342Z persist-credentials: true +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:53.9739683Z clean: true +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:53.9739992Z sparse-checkout-cone-mode: true +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:53.9740335Z fetch-depth: 1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:53.9740636Z fetch-tags: false +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:53.9740924Z show-progress: true +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:53.9741228Z lfs: false +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:53.9741515Z submodules: false +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:53.9741822Z set-safe-directory: true +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:53.9742304Z env: +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:53.9742604Z DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:53.9742984Z DOTNET_CLI_TELEMETRY_OPTOUT: true +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:53.9743335Z DOTNET_NOLOGO: true +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:53.9743646Z ##[endgroup] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:54.0880688Z Syncing repository: link-foundation/link-cli +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:54.0882333Z ##[group]Getting Git version info +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:54.0882843Z Working directory is '/home/runner/work/link-cli/link-cli' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:54.0883684Z [command]/usr/bin/git version +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:54.0917247Z git version 2.53.0 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:54.0942016Z ##[endgroup] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:54.0965306Z Temporarily overriding HOME='/home/runner/work/_temp/f2fc23fb-2830-4ee2-b3ac-85883955413f' before making global git config changes +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:54.0967161Z Adding repository directory to the temporary git global config as a safe directory +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:54.0972024Z [command]/usr/bin/git config --global --add safe.directory /home/runner/work/link-cli/link-cli +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:54.1007473Z Deleting the contents of '/home/runner/work/link-cli/link-cli' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:54.1011352Z ##[group]Initializing the repository +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:54.1016075Z [command]/usr/bin/git init /home/runner/work/link-cli/link-cli +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:54.1097421Z hint: Using 'master' as the name for the initial branch. This default branch name +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:54.1098498Z hint: will change to "main" in Git 3.0. To configure the initial branch name +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:54.1099520Z hint: to use in all of your new repositories, which will suppress this warning, +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:54.1100343Z hint: call: +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:54.1100765Z hint: +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:54.1101342Z hint: git config --global init.defaultBranch +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:54.1101985Z hint: +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:54.1102593Z hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:54.1103579Z hint: 'development'. The just-created branch can be renamed via this command: +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:54.1104369Z hint: +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:54.1104809Z hint: git branch -m +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:54.1105304Z hint: +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:54.1105971Z hint: Disable this message with "git config set advice.defaultBranchName false" +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:54.1107363Z Initialized empty Git repository in /home/runner/work/link-cli/link-cli/.git/ +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:54.1111991Z [command]/usr/bin/git remote add origin https://github.com/link-foundation/link-cli +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:54.1143872Z ##[endgroup] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:54.1144678Z ##[group]Disabling automatic garbage collection +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:54.1149145Z [command]/usr/bin/git config --local gc.auto 0 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:54.1178560Z ##[endgroup] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:54.1186257Z ##[group]Setting up auth +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:54.1187254Z [command]/usr/bin/git config --local --name-only --get-regexp core\.sshCommand +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:54.1218057Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :" +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:54.1524965Z [command]/usr/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:54.1556671Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'http\.https\:\/\/github\.com\/\.extraheader' && git config --local --unset-all 'http.https://github.com/.extraheader' || :" +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:54.1787585Z [command]/usr/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir: +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:54.1819248Z [command]/usr/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:54.2057281Z [command]/usr/bin/git config --local http.https://github.com/.extraheader AUTHORIZATION: basic *** +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:54.2093982Z ##[endgroup] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:54.2094655Z ##[group]Fetching the repository +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:54.2102123Z [command]/usr/bin/git -c protocol.version=2 fetch --no-tags --prune --no-recurse-submodules --depth=1 origin +d47e551d2d66c7bfe93f9a869ce9fab36347e317:refs/remotes/origin/main +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:55.3394464Z From https://github.com/link-foundation/link-cli +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:55.3395022Z * [new ref] d47e551d2d66c7bfe93f9a869ce9fab36347e317 -> origin/main +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:55.3423819Z ##[endgroup] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:55.3424385Z ##[group]Determining the checkout info +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:55.3426554Z ##[endgroup] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:55.3432196Z [command]/usr/bin/git sparse-checkout disable +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:55.3469896Z [command]/usr/bin/git config --local --unset-all extensions.worktreeConfig +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:55.3499823Z ##[group]Checking out the ref +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:55.3500511Z [command]/usr/bin/git checkout --progress --force -B main refs/remotes/origin/main +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:55.4139460Z Switched to a new branch 'main' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:55.4140739Z branch 'main' set up to track 'origin/main'. +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:55.4154221Z ##[endgroup] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:55.4201655Z [command]/usr/bin/git log -1 --format=%H +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:55.4228642Z d47e551d2d66c7bfe93f9a869ce9fab36347e317 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:55.4433321Z ##[group]Run actions/setup-dotnet@v4 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:55.4433600Z with: +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:55.4433777Z dotnet-version: 8.0.x +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:55.4433996Z cache: false +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:55.4434170Z env: +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:55.4434362Z DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:55.4434626Z DOTNET_CLI_TELEMETRY_OPTOUT: true +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:55.4434865Z DOTNET_NOLOGO: true +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:55.4435068Z ##[endgroup] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:55.6229106Z [command]/home/runner/work/_actions/actions/setup-dotnet/v4/externals/install-dotnet.sh --skip-non-versioned-files --runtime dotnet --channel LTS +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:56.0727654Z dotnet-install: Attempting to download using aka.ms link https://builds.dotnet.microsoft.com/dotnet/Runtime/10.0.7/dotnet-runtime-10.0.7-linux-x64.tar.gz +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:56.9591301Z dotnet-install: Remote file https://builds.dotnet.microsoft.com/dotnet/Runtime/10.0.7/dotnet-runtime-10.0.7-linux-x64.tar.gz size is 36689672 bytes. +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:56.9593915Z dotnet-install: Extracting archive from https://builds.dotnet.microsoft.com/dotnet/Runtime/10.0.7/dotnet-runtime-10.0.7-linux-x64.tar.gz +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:57.6707925Z dotnet-install: Downloaded file size is 36689672 bytes. +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:57.6708600Z dotnet-install: The remote and local file sizes are equal. +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:57.7005811Z dotnet-install: Installed version is 10.0.7 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:57.7067075Z dotnet-install: Adding to current process PATH: `/usr/share/dotnet`. Note: This change will be visible only when sourcing script. +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:57.7068826Z dotnet-install: Note that the script does not resolve dependencies during installation. +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:57.7070089Z dotnet-install: To check the list of dependencies, go to https://learn.microsoft.com/dotnet/core/install, select your operating system and check the "Dependencies" section. +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:57.7071087Z dotnet-install: Installation finished successfully. +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:57.7097230Z [command]/home/runner/work/_actions/actions/setup-dotnet/v4/externals/install-dotnet.sh --skip-non-versioned-files --channel 8.0 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:57:58.0894408Z dotnet-install: Attempting to download using aka.ms link https://builds.dotnet.microsoft.com/dotnet/Sdk/8.0.420/dotnet-sdk-8.0.420-linux-x64.tar.gz +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:01.3529824Z dotnet-install: Remote file https://builds.dotnet.microsoft.com/dotnet/Sdk/8.0.420/dotnet-sdk-8.0.420-linux-x64.tar.gz size is 216822173 bytes. +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:01.3535157Z dotnet-install: Extracting archive from https://builds.dotnet.microsoft.com/dotnet/Sdk/8.0.420/dotnet-sdk-8.0.420-linux-x64.tar.gz +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:06.2143673Z dotnet-install: Downloaded file size is 216822173 bytes. +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:06.2144453Z dotnet-install: The remote and local file sizes are equal. +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:06.4670785Z dotnet-install: Installed version is 8.0.420 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:06.4733326Z dotnet-install: Adding to current process PATH: `/usr/share/dotnet`. Note: This change will be visible only when sourcing script. +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:06.4734623Z dotnet-install: Note that the script does not resolve dependencies during installation. +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:06.4738530Z dotnet-install: To check the list of dependencies, go to https://learn.microsoft.com/dotnet/core/install, select your operating system and check the "Dependencies" section. +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:06.4739803Z dotnet-install: Installation finished successfully. +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:06.4956357Z ##[group]Run dotnet restore +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:06.4956681Z ^[[36;1mdotnet restore^[[0m +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:06.4985842Z shell: /usr/bin/bash -e {0} +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:06.4986099Z env: +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:06.4986303Z DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:06.4986590Z DOTNET_CLI_TELEMETRY_OPTOUT: true +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:06.4987131Z DOTNET_NOLOGO: true +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:06.4987344Z DOTNET_ROOT: /usr/share/dotnet +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:06.4987590Z ##[endgroup] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:08.3359029Z Determining projects to restore... +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:12.2174339Z Restored /home/runner/work/link-cli/link-cli/csharp/Foundation.Data.Doublets.Cli.Tests/Foundation.Data.Doublets.Cli.Tests.csproj (in 3.38 sec). +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:12.2195999Z Restored /home/runner/work/link-cli/link-cli/csharp/Foundation.Data.Doublets.Cli/Foundation.Data.Doublets.Cli.csproj (in 3.38 sec). +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:12.2571317Z ##[group]Run dotnet build --no-restore --configuration Release +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:12.2571816Z ^[[36;1mdotnet build --no-restore --configuration Release^[[0m +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:12.2594242Z shell: /usr/bin/bash -e {0} +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:12.2594494Z env: +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:12.2594700Z DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:12.2594973Z DOTNET_CLI_TELEMETRY_OPTOUT: true +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:12.2595210Z DOTNET_NOLOGO: true +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:12.2595411Z DOTNET_ROOT: /usr/share/dotnet +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:12.2595642Z ##[endgroup] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:17.6004106Z Foundation.Data.Doublets.Cli -> /home/runner/work/link-cli/link-cli/csharp/Foundation.Data.Doublets.Cli/bin/Release/net8/Foundation.Data.Doublets.Cli.dll +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:19.0444860Z Foundation.Data.Doublets.Cli.Tests -> /home/runner/work/link-cli/link-cli/csharp/Foundation.Data.Doublets.Cli.Tests/bin/Release/net8/Foundation.Data.Doublets.Cli.Tests.dll +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:19.0669394Z +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:19.0676178Z Build succeeded. +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:19.0676637Z 0 Warning(s) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:19.0677152Z 0 Error(s) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:19.0677992Z +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:19.0678382Z Time Elapsed 00:00:06.63 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:19.0865137Z ##[group]Run dotnet test --no-build --configuration Release --verbosity normal --collect:"XPlat Code Coverage" +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:19.0865897Z ^[[36;1mdotnet test --no-build --configuration Release --verbosity normal --collect:"XPlat Code Coverage"^[[0m +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:19.0888518Z shell: /usr/bin/bash -e {0} +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:19.0888743Z env: +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:19.0888948Z DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:19.0889208Z DOTNET_CLI_TELEMETRY_OPTOUT: true +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:19.0889441Z DOTNET_NOLOGO: true +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:19.0889638Z DOTNET_ROOT: /usr/share/dotnet +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:19.0889865Z ##[endgroup] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:19.2586435Z Build started 05/12/2026 16:58:19. +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:19.4205772Z 1>Project "/home/runner/work/link-cli/link-cli/csharp/Foundation.Data.Doublets.Cli.sln" on node 1 (VSTest target(s)). +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:19.4207646Z 1>ValidateSolutionConfiguration: +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:19.4208639Z Building solution configuration "Release|Any CPU". +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:19.7275194Z Test run for /home/runner/work/link-cli/link-cli/csharp/Foundation.Data.Doublets.Cli.Tests/bin/Release/net8/Foundation.Data.Doublets.Cli.Tests.dll (.NETCoreApp,Version=v8.0) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:20.0394716Z A total of 1 test files matched the specified pattern. +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.2848676Z [xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v3.1.5+1b188a7b0a (64-bit .NET 8.0.26) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.3518661Z [xUnit.net 00:00:00.08] Discovering: Foundation.Data.Doublets.Cli.Tests +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.4140188Z [xUnit.net 00:00:00.14] Discovered: Foundation.Data.Doublets.Cli.Tests +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.4604933Z [xUnit.net 00:00:00.19] Starting: Foundation.Data.Doublets.Cli.Tests +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.7118453Z Passed Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.NamedTypesDecorator_UsesProvidedPinnedTypesDecorator [9 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.7123748Z Passed Foundation.Data.Doublets.Cli.Tests.LinoDatabaseOutputTests.WriteToFile_WritesCompleteDatabaseAsLinoLines [103 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.7125455Z Passed Foundation.Data.Doublets.Cli.Tests.LinoDatabaseOutputTests.FormatStructure_RendersLeftBranchWithLinkIndexes [7 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.7127461Z Passed Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.NamedTypesDecorator_CanRemoveNames [27 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.7129142Z Passed Foundation.Data.Doublets.Cli.Tests.LinoDatabaseOutputTests.FormatStructure_RendersRepeatedSourceAndTargetAsReferenceOnRight [4 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.7130881Z Passed Foundation.Data.Doublets.Cli.Tests.LinoDatabaseOutputTests.FormatDatabase_EscapesNamesThatNeedQuoting [6 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.7132474Z Passed Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.NamedTypesDecorator_DeleteRemovesAssociatedNames [6 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.7134208Z Passed Foundation.Data.Doublets.Cli.Tests.LinoDatabaseOutputTests.FormatDatabase_UsesNamesForIndexesSourcesAndTargets_WhenNamesExist [5 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.7135901Z Passed Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.NamedTypesDecorator_CanSetAndGetNames [8 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.7137785Z Passed Foundation.Data.Doublets.Cli.Tests.LinoDatabaseOutputTests.FormatDatabase_SelectsQuoteStyleForNamesContainingQuotes [5 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.7139426Z Passed Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.NamedTypesDecorator_HandlesNonexistentNames [5 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.7141069Z Passed Foundation.Data.Doublets.Cli.Tests.LinoDatabaseOutputTests.FormatDatabase_UsesNumberedReferences_WhenLinksHaveNoNames [16 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.7142857Z Passed Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.NamedTypesDecorator_ReassigningExistingNameMovesNameToNewLink [18 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.7144513Z Passed Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.NamedTypesDecorator_ImplementsILinks [6 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.7146040Z Passed Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.NamedTypesDecorator_CanConstructFromDatabaseFilename [8 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.7162305Z Passed Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.NamedTypesDecorator_CanEnumeratePinnedTypes [20 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.7168202Z Passed Foundation.Data.Doublets.Cli.Tests.PinnedTypesTests.Should_Terminate_Enumeration_When_Iterated_Without_Take [38 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.7169323Z Passed Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.NamedTypesDecorator_CanOverwriteNames [7 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.7170374Z Passed Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.NamedTypesDecorator_ImplementsIPinnedTypes [4 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.7171352Z Passed Foundation.Data.Doublets.Cli.Tests.PinnedTypesTests.Should_Validate_Existing_Links_With_Ulong [10 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.7172327Z Passed Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.NamedTypesDecorator_ImplementsINamedTypes [4 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.7173247Z Passed Foundation.Data.Doublets.Cli.Tests.PinnedTypesTests.Should_Destructure_PinnedTypes [6 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.7174163Z Passed Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.NamedTypesDecorator_CanGetLinkByName [5 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.7175514Z Passed Foundation.Data.Doublets.Cli.Tests.PinnedTypesTests.Should_Validate_Existing_Links [4 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.7417378Z [Trace] Constructing NamedLinksDecorator with names DB: /tmp/tmpgkB9gZ.names.links +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.7426093Z Passed Foundation.Data.Doublets.Cli.Tests.PinnedTypesTests.Should_Reset_Enumerator [4 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.7427884Z Passed Foundation.Data.Doublets.Cli.Tests.PinnedTypesTests.Should_Throw_Exception_For_Invalid_Link_Structure [5 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.7429532Z Passed Foundation.Data.Doublets.Cli.Tests.PinnedTypesTests.Should_Create_And_Iterate_Over_Types [2 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.7431175Z Passed Foundation.Data.Doublets.Cli.Tests.PinnedTypesTests.Should_Create_And_Iterate_Over_Types_With_RealDataStore [2 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.7433002Z Passed Foundation.Data.Doublets.Cli.Tests.NamedLinksDecoratorTests.SetName_OverwriteOldName [7 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.7435061Z Passed Foundation.Data.Doublets.Cli.Tests.NamedLinksDecoratorTests.MakeNamesDatabaseFilename_CorrectlyGeneratesFilename(dbFilename: "test.db", expected: "test.names.links") [< 1 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.7438313Z Passed Foundation.Data.Doublets.Cli.Tests.NamedLinksDecoratorTests.MakeNamesDatabaseFilename_CorrectlyGeneratesFilename(dbFilename: "a.b.c", expected: "a.b.names.links") [< 1 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.7441082Z Passed Foundation.Data.Doublets.Cli.Tests.NamedLinksDecoratorTests.MakeNamesDatabaseFilename_CorrectlyGeneratesFilename(dbFilename: "/tmp/test.db", expected: "/tmp/test.names.links") [< 1 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.7443422Z Passed Foundation.Data.Doublets.Cli.Tests.NamedLinksDecoratorTests.AfterCreation_SetNameAndGetName_ShouldWork [4 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.7773684Z Passed Foundation.Data.Doublets.Cli.Tests.NamedLinksDecoratorTests.CanConstructNamedLinksDecorator [5 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.7775381Z Passed Foundation.Data.Doublets.Cli.Tests.NamedLinksDecoratorTests.RemoveName_NonExistent_DoesNotThrow [5 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.7777346Z Passed Foundation.Data.Doublets.Cli.Tests.NamedLinksDecoratorTests.RemoveName_ShouldReturnNullAfterRemoval [4 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.7778958Z Passed Foundation.Data.Doublets.Cli.Tests.NamedLinksDecoratorTests.SetNameAndGetName_ShouldReturnSameName [4 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.7780421Z Passed Foundation.Data.Doublets.Cli.Tests.NamedLinksDecoratorTests.DeleteLink_RemovesNameAutomatically [5 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.7781936Z Passed Foundation.Data.Doublets.Cli.Tests.PinnedTypesDecoratorTests.Should_Implement_Both_ILinks_And_IPinnedTypes [3 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.7783405Z Passed Foundation.Data.Doublets.Cli.Tests.PinnedTypesDecoratorTests.Should_Support_Deconstruction [2 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.7784805Z Passed Foundation.Data.Doublets.Cli.Tests.PinnedTypesDecoratorTests.Should_Work_As_ILinks_Decorator [2 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.7786563Z Passed Foundation.Data.Doublets.Cli.Tests.PinnedTypesDecoratorTests.Should_Enumerate_PinnedTypes [2 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.7966224Z === Debug: Alternative Scenario === +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.7967374Z Input changes: +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.7968105Z 1. (1: 1 2) -> (0: 0 0) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.7968753Z 2. (1: 1 2) -> (1: 2 1) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.7969365Z 3. (2: 2 1) -> (2: 1 2) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.7970083Z Actual simplified changes: +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.7970799Z 1. (1: 1 2) -> (1: 2 1) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.7971413Z 2. (2: 2 1) -> (2: 1 2) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.7972031Z Count: 2 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.7972589Z === End Debug === +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.8135295Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.ChangesSimplifierTests.SimplifyChanges_Issue26_AlternativeScenario_NoSimplificationOccurs [22 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.8138367Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.ChangesSimplifierTests.SimplifyChanges_NoChange_StillKeepsFirstAndLastState [1 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.8158839Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.ChangesSimplifierTests.SimplifyChanges_Issue26_UpdateOperationSimplification [< 1 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.8174618Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.ChangesSimplifierTests.SimplifyChanges_SpecificExample_RemovesIntermediateStates [1 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.8182833Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.ChangesSimplifierTests.SimplifyChanges_MultipleChainsFromSameBefore_RemovesIntermediateStates [< 1 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.8191669Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.ChangesSimplifierTests.SimplifyChanges_MultipleBranchesFromSameInitial_ProducesCorrectFinalStates [< 1 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.8193956Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.ChangesSimplifierTests.SimplifyChanges_MultipleBranchesFromSameInitial_ProducesCorrectFinalStates_InCorrectOrder [1 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.8195983Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.ChangesSimplifierTests.SimplifyChanges_SpecificExample_KeepsUnchangedStates [< 1 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.8311053Z [Test] All links: (1: 2->1) (2: 1->2) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.8442586Z [Trace] Constructing SimpleLinksDecorator with names DB: /tmp/tmpnw0qCn.names.links +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.8549516Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.PersistentTransformationDecoratorTests.NeverRemovesMatchingStoredTrigger [25 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.8551140Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.SwapSourceAndTargetForAllLinksUsingVariablesTest [336 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.8552357Z Passed Foundation.Data.Doublets.Cli.Tests.SimpleLinksDecoratorTests.CanConstructSimpleLinksDecorator [5 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.8553279Z Passed Foundation.Data.Doublets.Cli.Tests.SimpleLinksDecoratorTests.Delete_WithRestriction_DoesNotThrow [4 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.8554182Z Passed Foundation.Data.Doublets.Cli.Tests.SimpleLinksDecoratorTests.DeleteAfterGetOrCreate_DoesNotThrow_WithTracing [3 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.8555052Z Passed Foundation.Data.Doublets.Cli.Tests.SimpleLinksDecoratorTests.DeleteAfterGetOrCreate_DoesNotThrow [3 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.8556127Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.PersistentTransformationDecoratorTests.AlwaysTriggerIsStoredInLinksAndAppliedAfterWrite [19 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.8994564Z Passed Foundation.Data.Doublets.Cli.Tests.Issue62ReviewCoverageTests.ExplicitNumericIdUpdate_CanBeReversedWithAnotherUpdate [9 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.8997278Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.PersistentTransformationDecoratorTests.OnceTriggerDeletesItselfAfterFirstMatch [15 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.8999604Z Passed Foundation.Data.Doublets.Cli.Tests.Issue62ReviewCoverageTests.NamedLink_CreateDeleteRecreate_DoesNotLeaveStaleNameMapping [7 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.9001943Z Passed Foundation.Data.Doublets.Cli.Tests.UnicodeStringStorageTests.CreateAndRetriveUserDefinedTypeTest [12 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.9011814Z Passed Foundation.Data.Doublets.Cli.Tests.UnicodeStringStorageTests.CreateAndRetrieveMultipleStringTypesTest(typeName: "UnicodeSymbol") [3 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.9015489Z Passed Foundation.Data.Doublets.Cli.Tests.LinoDatabaseInputTests.ImportText_ReproducesNumberedLinksAtTheirExplicitIndexes [16 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.9026106Z Passed Foundation.Data.Doublets.Cli.Tests.UnicodeStringStorageTests.CreateAndRetrieveMultipleStringTypesTest(typeName: "EmptyString") [3 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.9029244Z Passed Foundation.Data.Doublets.Cli.Tests.UnicodeStringStorageTests.CreateAndRetrieveMultipleStringTypesTest(typeName: "String") [3 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.9241784Z Passed Foundation.Data.Doublets.Cli.Tests.LinoDatabaseInputTests.ImportText_TreatsOutOfRangeNumbersAsNames [11 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.9245860Z Passed Foundation.Data.Doublets.Cli.Tests.UnicodeStringStorageTests.CreateAndRetrieveMultipleStringTypesTest(typeName: "Name") [5 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.9248357Z Passed Foundation.Data.Doublets.Cli.Tests.UnicodeStringStorageTests.CreateAndRetrieveMultipleStringTypesTest(typeName: "UnicodeSequence") [4 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.9250406Z Passed Foundation.Data.Doublets.Cli.Tests.LinoDatabaseInputTests.ImportText_UnquotesNamesWrittenByExporter [6 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.9252377Z Passed Foundation.Data.Doublets.Cli.Tests.UnicodeStringStorageTests.CreateAndRetrieveMultipleStringTypesTest(typeName: "Type") [4 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.9254294Z Passed Foundation.Data.Doublets.Cli.Tests.LinoDatabaseInputTests.ImportText_CreatesNamedReferencesAsPointLinks [5 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.9256225Z Passed Foundation.Data.Doublets.Cli.Tests.UnicodeStringStorageTests.NameIsRemovedWhenExternalReferenceIsDeletedTest [4 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.9258271Z Passed Foundation.Data.Doublets.Cli.Tests.UnicodeStringStorageTests.NameExternalReferenceTest [7 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.9479980Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.BasicQueryProcessor.DeleteSingleLinkTest_Source2Target2 [9 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.9481643Z Passed Foundation.Data.Doublets.Cli.Tests.UnicodeStringStorageTests.CreateAndRetrieveUnicodeStringTest [4 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.9483007Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.BasicQueryProcessor.DeleteMultipleLinksTest [5 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.9497956Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.BasicQueryProcessor.CreateSingleLinkTest [5 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.9499803Z Passed Foundation.Data.Doublets.Cli.Tests.UnicodeStringStorageTests.CreateAndRetrieveSimpleStringTest [7 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.9501712Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.BasicQueryProcessor.UpdateSingleLinkTest [3 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.9503515Z Passed Foundation.Data.Doublets.Cli.Tests.UnicodeStringStorageTests.DeletingNonNamedLinkDoesNotAffectOtherNamesTest [6 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.9505467Z Passed Foundation.Data.Doublets.Cli.Tests.UnicodeStringStorageTests.CreateAndRetrieveEmptyStringTest [3 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.9699762Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.BasicQueryProcessor.CreateLinkWithSource2Target2Test [5 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.9708399Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.BasicQueryProcessor.MultipleUpdatesTest [3 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.9710012Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.BasicQueryProcessor.CreateMultipleLinksTest [2 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.9711756Z Passed Foundation.Data.Doublets.Cli.Tests.UnicodeStringStorageTests.RetrieveTypeByNameTest [7 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.9713472Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.BasicQueryProcessor.DeleteSingleLinkTest_Source1Target2 [3 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.9715248Z Passed Foundation.Data.Doublets.Cli.Tests.UnicodeStringStorageTests.CreateAndRetrieveMultipleStringsTest [8 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.9717225Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.CreateLinkWithSource2Target2Test [8 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.9718977Z Passed Foundation.Data.Doublets.Cli.Tests.UnicodeStringStorageTests.NameIsRemovedWhenLinkIsDeletedTest [3 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.9757315Z [Test] All links: (1: 2->1) (2: 2->2) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.9811449Z [Test] All links: (1: 1->2) (2: 2->1) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.9861503Z [Test] All links: (1: 1->1) (3: 3->3) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.9884139Z Passed Foundation.Data.Doublets.Cli.Tests.UnicodeStringStorageTests.ExternalReferenceCanUseNameThatAlreadyExistsInternallyTest [3 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.9906115Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.NameLookupConsistencyTest [132 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.9908380Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.DeleteAllLinksByIndexTest [9 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.9910341Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.DeleteAllLinksBySourceAndTargetTest [3 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.9927949Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.DeleteLinksByAnyTargetTest [2 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.9952499Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.SwapEqualSourceAndTargetUsingVariablesHasAllChangesTest [8 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.9954762Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.DeleteLinksByAnySourceTest [2 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.9956512Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.DeleteMultipleLinksTest [2 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:21.9958216Z [Test] All links: (1: 1->1) (2: 2->1) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0000128Z [Test] All links: (21: 21->21) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0057753Z [Test] All links: (1: 1->1) (2: 2->2) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0118571Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.MultipleUpdatesTest [6 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0138070Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.CreateMultipleLinksTest [2 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0140231Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreationWithEmptySlotDuringUpdateTest [5 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0142582Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateLeftCompositeIntegerChildrenWithoutExtraLeaf_ShouldSucceed [5 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0144797Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.ReverseSourceWithTargetUsingVariablesTest [10 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0146657Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.CreateSingleLinkTest [3 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0149107Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.Issue20_SubstituteFullPointWithUnboundParts_ShouldKeepFullPoint [8 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0150963Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.NoUpdateUsingVariablesTest [5 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0153025Z [Test] All links: (2: 2->2) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0154225Z [Trace] Constructing NamedTypesDecorator with names DB: /tmp/tmpy5Pp2l.names.links +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0158169Z [ProcessQuery] Query: "(() ((link: link link)))" +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0158790Z [ProcessQuery] Parser returned 1 top-level link(s). +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0159363Z [ProcessQuery] Restriction link => Id="" Values.Count=0 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0159970Z [ProcessQuery] Substitution link => Id="" Values.Count=1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0160810Z [ProcessQuery] No restriction, but substitution is non-empty => creation scenario. +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0161627Z [ValidateLinksExistOrWillBeCreated] Starting validation +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0162385Z [ValidateLinksExistOrWillBeCreated] Numeric links to be created: +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0163209Z [ValidateLinksExistOrWillBeCreated] Named links to be created: link +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0163847Z [Trace] GetByName called for name: 'link' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0164265Z [Trace] GetByName result: 0 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0164983Z [ValidateReferencesInPattern] Named link 'link' reference validated in substitution pattern +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0165702Z [Trace] GetByName called for name: 'link' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0166088Z [Trace] GetByName result: 0 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0166998Z [ValidateReferencesInPattern] Named link 'link' reference validated in substitution pattern +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0167886Z [ValidateLinksExistOrWillBeCreated] Validation completed +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0168465Z [Trace] GetByName called for name: 'link' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0168908Z [Trace] GetByName result: 0 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0169613Z [Trace] Update called with restriction: [1] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0179384Z [Trace] Debug: handlerWrapper invoked - before=1,0,0, after=1,0,0 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0182407Z [Trace] Update result: 4294967295 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0183104Z [EnsureNestedLinkCreatedRecursively] Created named leaf 'link' => ID=1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0183824Z [Trace] SetName called for link: 1 with name: 'link' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0184323Z [Trace] RemoveName called for link: 1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0184799Z [Trace] RemoveName completed for link: 1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0185237Z [Trace] SetName result: 100 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0185874Z [EnsureNestedLinkCreatedRecursively] Updating link ID=1 => Source=1, Target=1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0186609Z [Trace] Update called with restriction: [1,0,0] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0187428Z [Trace] Debug: handlerWrapper invoked - before=1,0,0, after=1,1,1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0188326Z [EnsureNestedLinkCreatedRecursively] Update handler: before=(1: 0->0), after=(1: 1->1) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0189093Z [Trace] Update result: 4294967295 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0189618Z [ProcessQuery] Created link ID #1 from substitution pattern. +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0190130Z [Test] All links: (1: 1->1) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0190502Z [Trace] GetByName called for name: 'link' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0190925Z [Trace] GetByName result: 1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0200576Z [Trace] GetName called for link: 1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0201248Z [Trace] GetName result: link +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0247430Z [Test] All links: (1: 1->1) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0272031Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.MatchAndDelete2LevelNestedLinksTest [4 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0275589Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.DeleteSingleLinkTest_Source1Target2 [3 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0277557Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.MixedMultipleUpdatesTest [3 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0279293Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteLinksByAnyTargetTest [4 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0280993Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.DeleteSingleLinkTest_Source2Target2 [2 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0283112Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.CreationWithEmptySlotDuringUpdateTest [4 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0284979Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateNamedLinkWithStringId_ShouldCreateSingleLink [9 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0287146Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.CreateSingleLinkWithIndexAfterDoubleGapTest [3 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0407528Z [Test] All links: (1: 1->1) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0471211Z [Test] All links: +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0530179Z [Test] All links: (1: 1->1) (2: 2->2) (3: 1->2) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0549507Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeletionDuringUpdateTest [8 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0558229Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.MultipleUpdatesTest [5 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0579242Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.CreateSingleLinkWithIndexAfterGapTest [3 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0581309Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateNamedLinkWithMissingNamedReferences_ShouldThrowException [5 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0583350Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.CreationDuringUpdateTest [5 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0587070Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateLinkWithIntegerId_ShouldCreateSingleLink [6 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0589084Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.UpdateSingleLinkTest [4 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0590716Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.CreateSingleLinkWithIndexTest [3 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0592199Z [Test] All links: (1: 1->2) (2: 1->1) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0650828Z [Test] All links: (1: 1->1) (2: 2->2) (3: 2->1) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0695249Z [Test] All links: (2: 2->2) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0744984Z [Test] All links: (1: 1->1) (2: 2->2) (3: 2->1) (4: 3->3) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0798751Z [Test] All links: (1: 1->1) (2: 2->2) (3: 1->2) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0840008Z [Test] All links: (1: 1->2) (2: 2->1) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0887616Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteAllLinksByIndexTest [7 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0889109Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.DeletionDuringUpdateTest [6 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0890544Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateNamedFamilyLinksTest [5 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0901471Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeduplicateDuplicatePairWithNumericLinks_ShouldCreateOnlyOneSubLink [5 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0904266Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.StringAliasesInVariableRestriction_ShouldConstrainMatchesToNamedLinks [6 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0906520Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateSingleLinkWithIndexAfterGapTest [4 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0908876Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeduplicateDuplicatePairWithNamedLinks_ShouldCreateOnlyOneSubLink [5 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0913450Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateNamedLinkWithAutoCreateMissingNamedReferences_ShouldCreatePointLinks [4 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0916131Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateMultipleLinksWithCrossReferences_ShouldSucceed [4 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0918065Z [Test] All links: (1: 2->1) (2: 1->1) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0918883Z [Test] ===== Starting UpdateNamedLinkNameTest ===== +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0919725Z [Trace] Constructing NamedTypesDecorator with names DB: /tmp/tmp4M5pv0.names.links +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0952453Z [Test] Constants: Null=0, Any=4294967292, Continue=4294967295 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0961540Z [Test] Step 1: Creating initial link +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0962095Z [Test] Query: (() ((child: father mother))) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0962504Z [ProcessQuery] Query: "(() ((child: father mother)))" +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0963076Z [ProcessQuery] Parser returned 1 top-level link(s). +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0963448Z [ProcessQuery] Restriction link => Id="" Values.Count=0 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0964020Z [ProcessQuery] Substitution link => Id="" Values.Count=1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0964957Z [ProcessQuery] No restriction, but substitution is non-empty => creation scenario. +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0965792Z [ValidateLinksExistOrWillBeCreated] Starting validation +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0966608Z [ValidateLinksExistOrWillBeCreated] Numeric links to be created: +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0967663Z [ValidateLinksExistOrWillBeCreated] Named links to be created: child +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0968409Z [Trace] GetByName called for name: 'father' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0968863Z [Trace] GetByName result: 0 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0969291Z [Trace] GetByName called for name: 'mother' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0969684Z [Trace] GetByName result: 0 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0970083Z [Trace] GetByName called for name: 'father' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0970877Z [Trace] GetByName result: 0 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0974584Z [ValidateLinksExistOrWillBeCreated] Auto-creating missing named reference 'father' as point link. +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0979753Z [Trace] GetByName called for name: 'father' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0980763Z [Trace] GetByName result: 0 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0981209Z [Trace] Update called with restriction: [1] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0982141Z [Trace] Debug: handlerWrapper invoked - before=1,0,0, after=1,0,0 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0982882Z [Trace] Update result: 4294967295 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0983320Z [Trace] SetName called for link: 1 with name: 'father' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0983760Z [Trace] RemoveName called for link: 1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0984754Z [Trace] RemoveName completed for link: 1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0989433Z [Trace] SetName result: 108 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0990324Z [Trace] Update called with restriction: [1,0,0] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0991263Z [Trace] Debug: handlerWrapper invoked - before=1,0,0, after=1,1,1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0991771Z [Trace] Update result: 4294967295 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0992178Z [Trace] GetByName called for name: 'mother' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0992583Z [Trace] GetByName result: 0 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0993188Z [ValidateLinksExistOrWillBeCreated] Auto-creating missing named reference 'mother' as point link. +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0993815Z [Trace] GetByName called for name: 'mother' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0994204Z [Trace] GetByName result: 0 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0994584Z [Trace] Update called with restriction: [2] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0995059Z [Trace] Debug: handlerWrapper invoked - before=2,0,0, after=2,0,0 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0995519Z [Trace] Update result: 4294967295 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0995959Z [Trace] SetName called for link: 2 with name: 'mother' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0996394Z [Trace] RemoveName called for link: 2 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0997085Z [Trace] RemoveName completed for link: 2 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0997673Z [Trace] SetName result: 110 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.0999499Z [Trace] Update called with restriction: [2,0,0] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1000291Z [Trace] Debug: handlerWrapper invoked - before=2,0,0, after=2,2,2 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1000960Z [Trace] Update result: 4294967295 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1001617Z [ValidateLinksExistOrWillBeCreated] Validation completed +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1002306Z [Trace] GetByName called for name: 'father' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1002844Z [Trace] GetByName result: 1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1003613Z [EnsureNestedLinkCreatedRecursively] Found existing named leaf 'father' => ID=1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1004418Z [Trace] GetByName called for name: 'mother' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1004954Z [Trace] GetByName result: 2 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1005718Z [EnsureNestedLinkCreatedRecursively] Found existing named leaf 'mother' => ID=2 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1006582Z [EnsureLinkCreated] Creating link for (S=1, T=2). +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1007728Z [EnsureLinkCreated] => assigned new ID=3 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1008305Z [Trace] Update called with restriction: [3] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1009061Z [Trace] Debug: handlerWrapper invoked - before=3,0,0, after=3,1,2 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1009726Z [Trace] Update result: 4294967295 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1010644Z [EnsureNestedLinkCreatedRecursively] Created or ensured composite link => Index=0, Source=1, Target=2 => Actual ID=3 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1011536Z [Trace] SetName called for link: 3 with name: 'child' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1012160Z [Trace] RemoveName called for link: 3 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1012764Z [Trace] RemoveName completed for link: 3 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1013501Z [Trace] SetName result: 118 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1014308Z [ProcessQuery] Created link ID #3 from substitution pattern. +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1015232Z [Test] Initial link creation completed +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1015525Z [Test] Step 2: Verifying initial state +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1016007Z [Trace] GetByName called for name: 'child' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1016283Z [Trace] GetByName result: 3 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1016533Z [Test] Initial child ID: 3 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1016997Z [Trace] GetByName called for name: 'father' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1017423Z [Trace] GetByName result: 1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1037454Z [Test] Initial father ID: 1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1037782Z [Trace] GetByName called for name: 'mother' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1038107Z [Trace] GetByName result: 2 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1038340Z [Test] Initial mother ID: 2 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1038577Z [Test] Initial links count: 3 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1038900Z [Test] Initial link: Index=(1: 1->1), Source=1, Target=1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1039281Z [Test] Initial link: Index=(2: 2->2), Source=2, Target=2 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1039623Z [Test] Initial link: Index=(3: 1->2), Source=1, Target=2 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1039948Z [Test] Initial state verification completed +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1040285Z [Test] Step 3: Updating link name from 'child' to 'son' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1040901Z [Test] Query: (((child: father mother)) ((son: father mother))) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1041265Z [Test] Current state before update: +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1041540Z [Trace] GetByName called for name: 'child' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1041812Z [Trace] GetByName result: 3 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1042087Z [Test] - child name exists: True +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1042359Z [Trace] GetByName called for name: 'son' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1042618Z [Trace] GetByName result: 0 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1042854Z [Test] - son name exists: False +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1043123Z [Trace] GetByName called for name: 'father' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1043387Z [Trace] GetByName result: 1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1043622Z [Test] - father name exists: True +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1043882Z [Trace] GetByName called for name: 'mother' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1044144Z [Trace] GetByName result: 2 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1044363Z [Test] - mother name exists: True +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1044623Z [Test] Starting ProcessQuery for update... +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1044907Z [Test] Current links before update: +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1045205Z [Test] Link: Index=(1: 1->1), Source=1, Target=1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1045533Z [Test] Link: Index=(2: 2->2), Source=2, Target=2 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1045835Z [Test] Link: Index=(3: 1->2), Source=1, Target=2 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1046241Z [ProcessQuery] Query: "(((child: father mother)) ((son: father mother)))" +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1046652Z [ProcessQuery] Parser returned 1 top-level link(s). +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1047224Z [ProcessQuery] Restriction link => Id="" Values.Count=1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1047587Z [ProcessQuery] Substitution link => Id="" Values.Count=1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1047940Z [ProcessQuery] Restriction patterns to parse: 1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1048381Z [ProcessQuery] Substitution patterns to parse: 1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1048930Z [ValidateLinksExistOrWillBeCreated] Starting validation +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1049651Z [ValidateLinksExistOrWillBeCreated] Numeric links to be created: +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1050403Z [ValidateLinksExistOrWillBeCreated] Named links to be created: son +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1051082Z [Trace] GetByName called for name: 'child' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1051795Z [Trace] GetByName result: 3 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1052547Z [ValidateReferencesInPattern] Named link 'child' reference validated in restriction pattern +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1053303Z [Trace] GetByName called for name: 'father' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1053757Z [Trace] GetByName result: 1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1054554Z [ValidateReferencesInPattern] Named link 'father' reference validated in restriction pattern +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1055307Z [Trace] GetByName called for name: 'mother' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1055765Z [Trace] GetByName result: 2 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1056464Z [ValidateReferencesInPattern] Named link 'mother' reference validated in restriction pattern +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1057370Z [Trace] GetByName called for name: 'father' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1057634Z [Trace] GetByName result: 1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1058064Z [ValidateReferencesInPattern] Named link 'father' reference validated in substitution pattern +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1058523Z [Trace] GetByName called for name: 'mother' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1058784Z [Trace] GetByName result: 2 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1059201Z [ValidateReferencesInPattern] Named link 'mother' reference validated in substitution pattern +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1059705Z [ValidateLinksExistOrWillBeCreated] Validation completed +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1060300Z [ProcessQuery] Detected single sub-link with 2 sub-values => replaced with one composite restriction pattern. +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1060836Z [ProcessQuery] Converting restriction patterns => done. +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1061213Z [ProcessQuery] Converting substitution patterns => done. +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1061602Z [ProcessQuery] Finding solutions for restriction patterns... +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1061948Z [Trace] GetByName called for name: 'child' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1062221Z [Trace] GetByName result: 3 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1062472Z [Trace] GetByName called for name: 'father' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1062735Z [Trace] GetByName result: 1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1063188Z [Trace] GetByName called for name: 'mother' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1063468Z [Trace] GetByName result: 2 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1063817Z [ProcessQuery] Found 1 total solution(s) matching restriction patterns. +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1064198Z [Trace] GetByName called for name: 'child' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1064463Z [Trace] GetByName result: 3 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1064699Z [Trace] GetByName called for name: 'father' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1064958Z [Trace] GetByName result: 1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1065195Z [Trace] GetByName called for name: 'mother' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1065461Z [Trace] GetByName result: 2 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1065698Z [Trace] GetByName called for name: 'son' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1065961Z [Trace] GetByName result: 0 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1066197Z [Trace] GetByName called for name: 'father' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1066455Z [Trace] GetByName result: 1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1066690Z [Trace] GetByName called for name: 'mother' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1067258Z [Trace] GetByName result: 2 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1067530Z [ProcessQuery] allSolutionsNoOperation=False +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1067943Z [ProcessQuery] Some solutions lead to actual changes => building operations. +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1068351Z [Trace] GetByName called for name: 'son' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1068605Z [Trace] GetByName result: 0 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1068851Z [Trace] GetByName called for name: 'father' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1069103Z [Trace] GetByName result: 1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1069343Z [Trace] GetByName called for name: 'mother' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1069606Z [Trace] GetByName result: 2 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1069841Z [Trace] GetByName called for name: 'child' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1070125Z [Trace] GetByName result: 3 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1070359Z [Trace] GetByName called for name: 'father' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1070620Z [Trace] GetByName result: 1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1070847Z [Trace] GetByName called for name: 'mother' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1071104Z [Trace] GetByName result: 2 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1071487Z [ProcessQuery] For a solution => substitution links count=1, restriction links count=1. +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1071995Z [ProcessQuery] => 2 operation(s) derived from these patterns. +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1072660Z [ProcessQuery] All planned operations => 2 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1073174Z [ProcessQuery] Applying all planned operations... +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1073860Z [ApplyAllPlannedOperations] Operation: before=(3:1->2), after=(0:0->0) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1074473Z [Trace] GetName called for link: 3 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1074856Z [Trace] GetName result: child +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1075367Z [ApplyAllPlannedOperations] Name for before.Index 3 = 'child' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1076073Z [ApplyAllPlannedOperations] Deleting link => ID=3, S=1, T=2 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1076963Z [RemoveLinks] Found 1 link(s) matching (ID=3, S=1, T=2). +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1077460Z [Trace] RemoveName called for link: 3 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1077893Z [Trace] RemoveName completed for link: 3 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1078334Z [RemoveLinks] Deleting link => ID=3, S=1, T=2 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1078829Z [Trace] Delete called with restriction: [3,1,2] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1079749Z [Trace] Debug: this._links is of type: Foundation.Data.Doublets.Cli.PinnedTypesDecorator`1[System.UInt32] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1080995Z [Trace] Debug: Calling underlying _links.Delete +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1081618Z [Trace] Debug: handlerWrapper invoked - before=3,1,2, after=3,0,0 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1082240Z [Test] Update ChangesHandler called: +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1082635Z [Test] - Before state: (3: 1->2) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1083010Z [Test] - After state: (3: 0->0) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1083421Z [Trace] GetByName called for name: 'child' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1083866Z [Trace] GetByName result: 0 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1084258Z [Test] - child name during change: 0 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1084697Z [Trace] GetByName called for name: 'son' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1085130Z [Trace] GetByName result: 0 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1085518Z [Test] - son name during change: 0 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1085931Z [Trace] GetByName called for name: 'father' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1086362Z [Trace] GetByName result: 1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1087245Z [Test] - father name during change: 1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1087733Z [Trace] GetByName called for name: 'mother' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1088205Z [Trace] GetByName result: 2 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1088592Z [Test] - mother name during change: 2 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1089014Z [Test] - All links during change: +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1089482Z [Test] Link: Index=(1: 1->1), Source=1, Target=1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1089998Z [Test] Link: Index=(2: 2->2), Source=2, Target=2 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1090530Z [Test] Link: Index=(3: 0->0), Source=0, Target=0 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1091220Z [Trace] Debug: handlerWrapper invoked - before=3,0,0, after=null +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1091746Z [Trace] RemoveName called for link: 3 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1092127Z [Trace] RemoveName completed for link: 3 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1092521Z [Test] Update ChangesHandler called: +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1092919Z [Test] - Before state: (3: 0->0) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1093275Z [Test] - After state: +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1093652Z [Trace] GetByName called for name: 'child' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1094040Z [Trace] GetByName result: 0 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1094404Z [Test] - child name during change: 0 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1094816Z [Trace] GetByName called for name: 'son' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1095221Z [Trace] GetByName result: 0 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1095590Z [Test] - son name during change: 0 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1095988Z [Trace] GetByName called for name: 'father' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1096257Z [Trace] GetByName result: 1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1096485Z [Test] - father name during change: 1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1097022Z [Trace] GetByName called for name: 'mother' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1097282Z [Trace] GetByName result: 2 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1097517Z [Test] - mother name during change: 2 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1097768Z [Test] - All links during change: +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1098071Z [Test] Link: Index=(1: 1->1), Source=1, Target=1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1098384Z [Test] Link: Index=(2: 2->2), Source=2, Target=2 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1098657Z [Trace] Debug: Delete result: 4294967295 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1099160Z [ApplyAllPlannedOperations] Operation: before=(0:0->0), after=(4294967292:1->2) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1099786Z [Trace] GetName called for link: 4294967292 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1100057Z [Trace] GetName result: String +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1100447Z [ApplyAllPlannedOperations] Name for after.Index 4294967292 = 'String' (pre-op) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1100953Z [ApplyAllPlannedOperations] Creating link => ID=4294967292, S=1, T=2 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1101457Z [CreateOrUpdateLink] Detected wildcard substitution => nested create & name. +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1101852Z [Trace] GetByName called for name: 'father' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1102113Z [Trace] GetByName result: 1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1102492Z [EnsureNestedLinkCreatedRecursively] Found existing named leaf 'father' => ID=1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1102911Z [Trace] GetByName called for name: 'mother' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1103159Z [Trace] GetByName result: 2 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1103560Z [EnsureNestedLinkCreatedRecursively] Found existing named leaf 'mother' => ID=2 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1104005Z [EnsureLinkCreated] Creating link for (S=1, T=2). +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1104306Z [EnsureLinkCreated] => assigned new ID=3 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1104579Z [Test] Update ChangesHandler called: +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1104819Z [Test] - Before state: +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1105049Z [Test] - After state: (3: 0->0) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1105300Z [Trace] GetByName called for name: 'child' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1105561Z [Trace] GetByName result: 0 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1105785Z [Test] - child name during change: 0 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1106048Z [Trace] GetByName called for name: 'son' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1106300Z [Trace] GetByName result: 0 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1106523Z [Test] - son name during change: 0 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1107001Z [Trace] GetByName called for name: 'father' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1107275Z [Trace] GetByName result: 1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1107512Z [Test] - father name during change: 1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1107771Z [Trace] GetByName called for name: 'mother' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1108026Z [Trace] GetByName result: 2 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1108386Z [Test] - mother name during change: 2 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1108656Z [Test] - All links during change: +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1108942Z [Test] Link: Index=(1: 1->1), Source=1, Target=1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1109244Z [Test] Link: Index=(2: 2->2), Source=2, Target=2 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1109543Z [Test] Link: Index=(3: 0->0), Source=0, Target=0 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1109857Z [Test] Creating new link: Index=3, Source=0, Target=0 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1110161Z [Test] Checking if link exists: True +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1110417Z [Test] Checking if source exists: False +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1110685Z [Test] Checking if target exists: False +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1110935Z [Test] Names before creation: +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1111213Z [Trace] GetByName called for name: 'child' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1111475Z [Trace] GetByName result: 0 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1111671Z [Test] - child: 0 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1111887Z [Trace] GetByName called for name: 'son' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1112134Z [Trace] GetByName result: 0 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1112343Z [Test] - son: 0 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1112617Z [Trace] GetByName called for name: 'father' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1112877Z [Trace] GetByName result: 1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1113085Z [Test] - father: 1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1113299Z [Trace] GetByName called for name: 'mother' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1113544Z [Trace] GetByName result: 2 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1113752Z [Test] - mother: 2 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1113973Z [Trace] Update called with restriction: [3] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1114311Z [Trace] Debug: handlerWrapper invoked - before=3,0,0, after=3,1,2 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1114659Z [Test] Update ChangesHandler called: +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1114906Z [Test] - Before state: (3: 0->0) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1115148Z [Test] - After state: (3: 1->2) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1115390Z [Trace] GetByName called for name: 'child' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1115647Z [Trace] GetByName result: 0 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1115870Z [Test] - child name during change: 0 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1116128Z [Trace] GetByName called for name: 'son' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1116383Z [Trace] GetByName result: 0 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1116850Z [Test] - son name during change: 0 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1117128Z [Trace] GetByName called for name: 'father' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1117379Z [Trace] GetByName result: 1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1117612Z [Test] - father name during change: 1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1117868Z [Trace] GetByName called for name: 'mother' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1118123Z [Trace] GetByName result: 2 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1118344Z [Test] - mother name during change: 2 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1118592Z [Test] - All links during change: +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1118863Z [Test] Link: Index=(1: 1->1), Source=1, Target=1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1119156Z [Test] Link: Index=(2: 2->2), Source=2, Target=2 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1119452Z [Test] Link: Index=(3: 1->2), Source=1, Target=2 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1119714Z [Trace] Update result: 4294967295 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1120253Z [EnsureNestedLinkCreatedRecursively] Created or ensured composite link => Index=0, Source=1, Target=2 => Actual ID=3 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1120814Z [Trace] SetName called for link: 3 with name: 'son' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1121123Z [Trace] RemoveName called for link: 3 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1121392Z [Trace] RemoveName completed for link: 3 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1121658Z [Trace] SetName result: 118 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1121900Z [Trace] GetName called for link: 4294967292 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1122157Z [Trace] GetName result: String +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1122565Z [ApplyAllPlannedOperations] Name for after.Index 4294967292 = 'String' (post-op) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1123031Z [ProcessQuery] Restoring unexpected deletions if any... +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1123447Z [RestoreUnexpectedLinkDeletions] No unexpected deletions found. +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1123816Z [ProcessQuery] Finished processing query. +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1124106Z [Test] Update operation completed +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1124371Z [Test] Step 4: Verifying final state +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1124643Z [Trace] GetByName called for name: 'child' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1124918Z [Trace] GetByName result: 0 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1125344Z [Test] Final child ID: 0 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1125714Z [Trace] GetByName called for name: 'son' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1126100Z [Trace] GetByName result: 3 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1126425Z [Test] Final son ID: 3 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1126930Z [Trace] GetByName called for name: 'father' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1127353Z [Trace] GetByName result: 1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1127672Z [Test] Final father ID: 1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1128056Z [Trace] GetByName called for name: 'mother' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1128486Z [Trace] GetByName result: 2 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1128814Z [Test] Final mother ID: 2 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1129127Z [Test] Final links count: 3 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1129531Z [Test] Final link: Index=(1: 1->1), Source=1, Target=1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1130103Z [Test] Final link: Index=(2: 2->2), Source=2, Target=2 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1130646Z [Test] Final link: Index=(3: 1->2), Source=1, Target=2 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1131293Z [Test] ===== UpdateNamedLinkNameTest completed successfully ===== +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1132381Z [Test] All links: (1: 1->1) (2: 2->2) (3: 3->3) (4: 4->4) (5: 5->5) (6: 6->6) (7: 5->6) (8: 4->7) (9: 3->8) (10: 2->9) (11: 1->10) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1144474Z [Test] All links: (1: 1->1) (2: 1->2) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1187653Z [Test] All links: (10: 10->10) (20: 10->20) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1240591Z [Test] All links: (1: 1->1) (2: 2->2) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1294690Z [Test] All links: (1: 1->1) (2: 2->2) (3: 2->1) (4: 3->3) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1349005Z [Test] All links: (1: 1->1) (2: 1->2) (3: 3->1) (4: 1->4) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1400423Z [Test] All links: (1: 1->1) (2: 1->2) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1455404Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.MakeAllLinksToGoIntoFirstLinkUsingVariablesTest [5 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1458144Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.UpdateNamedLinkNameTest [13 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1460130Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.Create6LevelNestedLinksTest [5 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1462379Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateRightCompositeStringChildrenWithoutExtraLeaf_ShouldSucceed [5 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1465494Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateLinkWithAutoCreateMissingNumericReferences_ShouldCreatePointLinks [5 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1467993Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateMultipleLinksTest [5 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1470079Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeduplicateMixedNamedAndNumericLinks_ShouldReuseExistingLinks [5 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1472644Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.MatchSelfReferencingAndMakeThemGoOutFromFirstLinkUsingVariablesTest [5 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1475389Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateRightCompositeIntegerChildrenWithoutExtraLeaf_ShouldSucceed [5 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1516174Z [Test] All links: (1: 1->1) (2: 2->2) (3: 3->3) (4: 4->4) (5: 5->5) (6: 4->5) (7: 3->6) (8: 2->7) (9: 1->8) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1571425Z [Test] All links: (1: 1->1) (2: 2->2) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1620197Z [Test] All links: (1: 1->2) (2: 2->2) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1666046Z [Test] All links: (1: 1->2) (2: 2->1) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1711467Z [Test] All links: +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1759894Z [Test] All links: (1: 1->1) (2: 2->2) (3: 1->2) (4: 2->1) (5: 3->4) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1802777Z [Test] All links: (1: 1->1) (2: 2->1) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1845706Z [Test] All links: (1: 1->1) (2: 2->2) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1892859Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.EnsureCreated_WithSpecialAnyReference_ShouldThrowControlledException [5 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1899397Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.Create5LevelNestedLinksTest [6 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1901835Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.MatchWithExactIndexAndDelete2LevelNestedLinksTest [5 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1912540Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.UpdateSingleLinkTest [4 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1914490Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.MixedMultipleUpdatesTest [4 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1916446Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.NestedDeleteAllLinksBySourceAndTargetTest1 [4 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1918833Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeduplicateWithDifferentPairs_ShouldNotDeduplicateDifferentLinks [4 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1921097Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateLeftCompositeStringChildrenWithoutExtraLeaf_ShouldSucceed [4 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1923368Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.NoExactMatch2LevelNestedLinksTest [4 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1924779Z [Test] All links: (1: 1->2) (2: 1->1) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.1948380Z [Test] All links: (3: 3->3) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2012534Z [Test] All links: (1: 1->1) (2: 18->20) (18: 1->21) (19: 1->20) (20: 20->20) (21: 21->21) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2105099Z [Test] All links: (1: 1->1) (2: 2->2) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2177228Z [Test] All links: (1: 0->0) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2214688Z [Test] All links: (1: 1->1) (2: 2->2) (3: 1->2) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2247744Z [Test] All links: (1: 1->1) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2271280Z [Trace] Constructing NamedTypesDecorator with names DB: /tmp/tmpblWLVD.names.links +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2290609Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.MakeAllLinksToGoOutOfFirstLinkUsingVariablesTest [5 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2304990Z [Test] Starting UpdateNamedLinkNameTest +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2305642Z [Test] Step 1: Creating initial link +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2306339Z [ProcessQuery] Query: "(() ((child: father mother)))" +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2307401Z [ProcessQuery] Parser returned 1 top-level link(s). +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2308442Z [ProcessQuery] Restriction link => Id="" Values.Count=0 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2309133Z [ProcessQuery] Substitution link => Id="" Values.Count=1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2310118Z [ProcessQuery] No restriction, but substitution is non-empty => creation scenario. +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2310955Z [ValidateLinksExistOrWillBeCreated] Starting validation +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2311671Z [ValidateLinksExistOrWillBeCreated] Numeric links to be created: +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2312461Z [ValidateLinksExistOrWillBeCreated] Named links to be created: child +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2313111Z [Trace] GetByName called for name: 'father' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2313533Z [Trace] GetByName result: 0 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2313934Z [Trace] GetByName called for name: 'mother' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2314362Z [Trace] GetByName result: 0 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2314643Z [Trace] GetByName called for name: 'father' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2314906Z [Trace] GetByName result: 0 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2315374Z [ValidateLinksExistOrWillBeCreated] Auto-creating missing named reference 'father' as point link. +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2315877Z [Trace] GetByName called for name: 'father' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2316127Z [Trace] GetByName result: 0 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2316372Z [Trace] Update called with restriction: [1] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2317011Z [Trace] Debug: handlerWrapper invoked - before=1,0,0, after=1,0,0 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2317356Z [Trace] Update result: 4294967295 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2317658Z [Trace] SetName called for link: 1 with name: 'father' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2317969Z [Trace] RemoveName called for link: 1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2318248Z [Trace] RemoveName completed for link: 1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2318504Z [Trace] SetName result: 108 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2318765Z [Trace] Update called with restriction: [1,0,0] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2319124Z [Trace] Debug: handlerWrapper invoked - before=1,0,0, after=1,1,1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2319712Z [Trace] Update result: 4294967295 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2320193Z [Trace] GetByName called for name: 'mother' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2320451Z [Trace] GetByName result: 0 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2320900Z [ValidateLinksExistOrWillBeCreated] Auto-creating missing named reference 'mother' as point link. +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2321365Z [Trace] GetByName called for name: 'mother' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2321616Z [Trace] GetByName result: 0 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2321851Z [Trace] Update called with restriction: [2] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2322207Z [Trace] Debug: handlerWrapper invoked - before=2,0,0, after=2,0,0 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2322529Z [Trace] Update result: 4294967295 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2322818Z [Trace] SetName called for link: 2 with name: 'mother' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2323122Z [Trace] RemoveName called for link: 2 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2323386Z [Trace] RemoveName completed for link: 2 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2323650Z [Trace] SetName result: 110 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2323909Z [Trace] Update called with restriction: [2,0,0] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2324271Z [Trace] Debug: handlerWrapper invoked - before=2,0,0, after=2,2,2 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2324588Z [Trace] Update result: 4294967295 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2324905Z [ValidateLinksExistOrWillBeCreated] Validation completed +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2325253Z [Trace] GetByName called for name: 'father' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2325506Z [Trace] GetByName result: 1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2325899Z [EnsureNestedLinkCreatedRecursively] Found existing named leaf 'father' => ID=1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2326334Z [Trace] GetByName called for name: 'mother' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2326610Z [Trace] GetByName result: 2 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2327207Z [EnsureNestedLinkCreatedRecursively] Found existing named leaf 'mother' => ID=2 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2327666Z [EnsureLinkCreated] Creating link for (S=1, T=2). +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2327969Z [EnsureLinkCreated] => assigned new ID=3 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2328259Z [Trace] Update called with restriction: [3] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2328620Z [Trace] Debug: handlerWrapper invoked - before=3,0,0, after=3,1,2 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2328951Z [Trace] Update result: 4294967295 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2329503Z [EnsureNestedLinkCreatedRecursively] Created or ensured composite link => Index=0, Source=1, Target=2 => Actual ID=3 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2330490Z [Trace] SetName called for link: 3 with name: 'child' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2330954Z [Trace] RemoveName called for link: 3 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2331369Z [Trace] RemoveName completed for link: 3 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2331798Z [Trace] SetName result: 118 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2332312Z [ProcessQuery] Created link ID #3 from substitution pattern. +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2332862Z [Test] Initial link creation completed +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2333300Z [Test] Step 2: Verifying initial state +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2333736Z [Trace] GetByName called for name: 'child' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2334166Z [Trace] GetByName result: 3 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2334521Z [Test] Initial child ID: 3 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2334932Z [Trace] GetByName called for name: 'father' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2335362Z [Trace] GetByName result: 1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2335716Z [Test] Initial father ID: 1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2336148Z [Trace] GetByName called for name: 'mother' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2336617Z [Trace] GetByName result: 2 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2337135Z [Test] Initial mother ID: 2 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2337557Z [Test] All links: (1: 1->1) (2: 2->2) (3: 1->2) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2338044Z [Test] Initial links count: 3 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2338465Z [Test] Initial state verification completed +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2338915Z [Test] Step 3: Updating link name +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2339315Z [Test] Removing old name 'child' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2339736Z [Trace] RemoveName called for link: 3 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2340891Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateSingleLinkWithIndexAfterDoubleGapTest [3 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2342940Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.Issue20_SubstituteMatchedLinkAndOutgoingLink_ShouldPreserveExistingParts [7 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2345086Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteNamedFamilyLinksRemovesNamesTest [3 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2347041Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.ExactMatchAndDelete2LevelNestedLinksTest [3 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2348687Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteByNamesTest [4 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2350375Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateLinkWithVariableReferences_ShouldSucceed [3 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2352099Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.Create2LevelNestedLinksTest [3 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2353658Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteLinksByAnySourceTest [3 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2354702Z [Trace] RemoveName completed for link: 3 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2355131Z [Test] Old name removed +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2355513Z [Test] Creating new link with name 'son' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2356033Z [ProcessQuery] Query: "(() ((son: father mother)))" +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2356636Z [ProcessQuery] Parser returned 1 top-level link(s). +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2357382Z [ProcessQuery] Restriction link => Id="" Values.Count=0 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2358005Z [ProcessQuery] Substitution link => Id="" Values.Count=1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2358795Z [ProcessQuery] No restriction, but substitution is non-empty => creation scenario. +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2359625Z [ValidateLinksExistOrWillBeCreated] Starting validation +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2360409Z [ValidateLinksExistOrWillBeCreated] Numeric links to be created: +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2361186Z [ValidateLinksExistOrWillBeCreated] Named links to be created: son +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2361850Z [Trace] GetByName called for name: 'father' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2362305Z [Trace] GetByName result: 1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2363073Z [ValidateReferencesInPattern] Named link 'father' reference validated in substitution pattern +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2363882Z [Trace] GetByName called for name: 'mother' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2364336Z [Trace] GetByName result: 2 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2365279Z [ValidateReferencesInPattern] Named link 'mother' reference validated in substitution pattern +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2366196Z [ValidateLinksExistOrWillBeCreated] Validation completed +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2367033Z [Trace] GetByName called for name: 'father' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2367471Z [Trace] GetByName result: 1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2368112Z [EnsureNestedLinkCreatedRecursively] Found existing named leaf 'father' => ID=1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2368801Z [Trace] GetByName called for name: 'mother' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2369222Z [Trace] GetByName result: 2 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2369834Z [EnsureNestedLinkCreatedRecursively] Found existing named leaf 'mother' => ID=2 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2370343Z [EnsureLinkCreated] Link already found => ID=3 => no-op. +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2370968Z [EnsureNestedLinkCreatedRecursively] Created or ensured composite link => Index=0, Source=1, Target=2 => Actual ID=3 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2371559Z [Trace] SetName called for link: 3 with name: 'son' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2371878Z [Trace] RemoveName called for link: 3 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2372160Z [Trace] RemoveName completed for link: 3 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2372433Z [Trace] SetName result: 123 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2372750Z [ProcessQuery] Created link ID #3 from substitution pattern. +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2373095Z [Test] New link creation completed +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2373354Z [Test] Step 4: Verifying final state +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2373647Z [Trace] GetByName called for name: 'child' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2373924Z [Trace] GetByName result: 0 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2374172Z [Trace] GetByName called for name: 'son' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2374442Z [Trace] GetByName result: 3 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2374654Z [Test] Final son ID: 3 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2374892Z [Trace] GetByName called for name: 'father' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2375151Z [Trace] GetByName result: 1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2375375Z [Test] Final father ID: 1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2375618Z [Trace] GetByName called for name: 'mother' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2376077Z [Trace] GetByName result: 2 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2376312Z [Test] Final mother ID: 2 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2376579Z [Test] All links: (1: 1->1) (2: 2->2) (3: 1->2) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2377123Z [Test] Final links count: 3 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2377546Z [Test] Final state verification completed +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2378092Z [Test] UpdateNamedLinkNameTest completed successfully +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2385478Z [Test] All links: (1: 1->1) (2: 2->2) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2450903Z [Test] All links: (1: 1->1) (2: 2->2) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2506289Z [Test] All links: +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2607307Z [Test] All links: (2: 2->2) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2720881Z [Test] All links: (1: 1->1) (2: 2->2) (3: 3->3) (4: 2->3) (5: 1->4) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2809790Z [Test] All links: (1: 1->1) (2: 2->2) (3: 1->2) (4: 3->3) (5: 3->4) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2878871Z [Test] All links: (1: 1->1) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2898412Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateTwoNamedLinksTest [6 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2900334Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.NoUpdateUsingVariablesTest [7 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2902643Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.MakeAllLinksSelfReferencingUsingVariablesTest [6 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2905155Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteMultipleLinksTest [4 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2907498Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.UpdateWithNonExistentReference_ShouldThrowException [5 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2909596Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteSingleLinkTest_Source1Target2 [4 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2911463Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteNamedLinkTest [6 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2913315Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.Create3LevelNestedLinksTest [4 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2915534Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeduplicateTripleDuplicatePair_ShouldCreateOnlyOneSubLink [7 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.2927063Z [Test] All links: (1: 1->1) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.3006686Z [Test] All links: (1: 1->1) (2: 2->2) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.3095778Z [Test] All links: (1: 0->0) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.3155896Z [Test] All links: +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.3247141Z [Test] All links: (1: 1->1) (2: 2->2) (3: 1->2) (4: 3->3) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.3343617Z [Test] All links: (1: 1->1) (2: 2->1) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.3389306Z [Test] All links: +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.3438486Z [Test] All links: (1: 1->1) (2: 2->2) (3: 3->3) (4: 4->4) (5: 5->5) (6: 6->6) (7: 7->7) (8: 6->7) (9: 5->8) (10: 4->9) (11: 3->10) (12: 2->11) (13: 1->12) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.3469190Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateLinkWithValidSelfReference_ShouldSucceed [5 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.3471209Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateSingleLinkTest [8 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.3472887Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreationDuringUpdateTest [6 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.3474746Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateLinkWithWildcardReferences_ShouldSucceed [6 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.3476449Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteSingleLinkTest_Source2Target2 [5 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.3478367Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeduplicateNamedLinks_MultipleQueries_ShouldReuseSameIds [6 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.3479890Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateLinkWithNonExistentReference_ShouldThrowException [5 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.3481803Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.SwapSourceAndTargetForSingleLinkUsingVariablesTest [5 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.3484114Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteAllLinksBySourceAndTargetTest2 [4 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.3485288Z [Test] All links: (1: 1->1) (2: 2->1) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.3529222Z [Test] All links: +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.3574690Z [Test] All links: (1: 1->1) (2: 2->2) (3: 1->2) (4: 3->3) (5: 4->4) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.3615635Z [Test] All links: (1: 1->1) (2: 2->2) (3: 3->3) (4: 4->4) (5: 3->4) (6: 2->5) (7: 1->6) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.3660004Z [Test] All links: (1: 1->1) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:22.3700684Z [Test] All links: (1: 1->1) (2: 2->2) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:23.8482426Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.Create7LevelNestedLinksTest [4 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:23.8483794Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateLinkReferencingExistingLink_ShouldSucceed [4 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:23.8484915Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteAllLinksBySourceAndTargetTest1 [4 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:23.8485991Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeduplicateNestedDuplicates_ShouldDeduplicateAtAllLevels [4 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:23.8487238Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.Create4LevelNestedLinksTest [4 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:23.8488120Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateSingleLinkWithIndexTest [4 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:23.8489066Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateLinkWithSource2Target2Test [3 ms] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:25.3473000Z Passed Foundation.Data.Doublets.Cli.Tests.CliExportIntegrationTests.ExportAlias_WritesNamedReferences [2 s] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:28.1900365Z Passed Foundation.Data.Doublets.Cli.Tests.CliExportIntegrationTests.AlwaysTriggerOption_StoresTriggerAndAppliesItOnLaterChange [3 s] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:30.0034021Z Passed Foundation.Data.Doublets.Cli.Tests.CliExportIntegrationTests.ExportAlias_WritesNumberedReferences [1 s] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:38.9835668Z Passed Foundation.Data.Doublets.Cli.Tests.CliExportIntegrationTests.StructureOption_RendersLeftBranchWithIndexes [8 s] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:40.7384126Z [xUnit.net 00:00:19.47] Finished: Foundation.Data.Doublets.Cli.Tests +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:41.2130681Z Passed Foundation.Data.Doublets.Cli.Tests.CliExportIntegrationTests.ImportOption_ReadsNumberedLinoFile [1 s] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:41.2234923Z +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:41.2275185Z Test Run Successful. +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:41.2275604Z Total tests: 187 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:41.2275887Z Passed: 187 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:41.2278044Z Total time: 21.1849 Seconds +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:41.2498472Z 1>Done Building Project "/home/runner/work/link-cli/link-cli/csharp/Foundation.Data.Doublets.Cli.sln" (VSTest target(s)). +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:41.2597603Z +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:41.2598355Z Build succeeded. +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:41.2598908Z 0 Warning(s) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:41.2599457Z 0 Error(s) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:41.2599763Z +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:41.2600158Z Time Elapsed 00:00:22.00 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:41.4271446Z +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:41.4277326Z Attachments: +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:41.4279924Z /home/runner/work/link-cli/link-cli/csharp/Foundation.Data.Doublets.Cli.Tests/TestResults/421d8b4a-b7bb-4f8f-9d5a-48070ce41a69/coverage.cobertura.xml +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:41.4862376Z ##[group]Run codecov/codecov-action@v4 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:41.4862646Z with: +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:41.4862825Z fail_ci_if_error: false +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:41.4863032Z env: +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:41.4863210Z DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:41.4863474Z DOTNET_CLI_TELEMETRY_OPTOUT: true +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:41.4863701Z DOTNET_NOLOGO: true +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:41.4863911Z DOTNET_ROOT: /usr/share/dotnet +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:41.4864136Z ##[endgroup] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:41.5783186Z eventName: push +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:41.5792347Z ==> linux OS detected +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:41.9053029Z https://cli.codecov.io/latest/linux/codecov.SHA256SUM +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:42.0576037Z gpg: directory '/home/runner/.gnupg' created +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:42.0577782Z gpg: keybox '/home/runner/.gnupg/pubring.kbx' created +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:42.0591650Z gpg: /home/runner/.gnupg/trustdb.gpg: trustdb created +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:42.0593145Z gpg: key 806BB28AED779869: public key "Codecov Uploader (Codecov Uploader Verification Key) " imported +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:42.0698445Z gpg: Total number processed: 1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:42.0698763Z gpg: imported: 1 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:42.0753510Z gpg: Signature made Tue Apr 21 19:28:03 2026 UTC +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:42.0754193Z gpg: using RSA key 27034E7FDB850E0BBC2C62FF806BB28AED779869 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:42.0756686Z gpg: Good signature from "Codecov Uploader (Codecov Uploader Verification Key) " [unknown] +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:42.0757680Z gpg: WARNING: This key is not certified with a trusted signature! +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:42.0758147Z gpg: There is no indication that the signature belongs to the owner. +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:42.0758620Z Primary key fingerprint: 2703 4E7F DB85 0E0B BC2C 62FF 806B B28A ED77 9869 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:42.0982233Z ==> Uploader SHASUM verified (8930c4bb30254a42f3d8c340706b1be340885e20c0df5160a24efa2e030e662b codecov) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:42.0983123Z ==> Running version latest +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:42.1847624Z Could not pull latest version information: SyntaxError: Unexpected token '<', " Running git config --global --add safe.directory /home/runner/work/link-cli/link-cli +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:42.1940204Z [command]/usr/bin/git config --global --add safe.directory /home/runner/work/link-cli/link-cli +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:42.1993547Z ==> Running command '/home/runner/work/_actions/codecov/codecov-action/v4/dist/codecov create-commit' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:42.1996203Z [command]/home/runner/work/_actions/codecov/codecov-action/v4/dist/codecov create-commit --git-service github +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:42.5651969Z info - 2026-05-12 16:58:42,564 -- ci service found: github-actions +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:42.5749804Z warning - 2026-05-12 16:58:42,574 -- No config file could be found. Ignoring config. +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:42.6042661Z warning - 2026-05-12 16:58:42,603 -- Branch `main` is protected but no token was provided +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:42.6043589Z warning - 2026-05-12 16:58:42,603 -- For information on Codecov upload tokens, see https://docs.codecov.com/docs/codecov-tokens +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:42.8798158Z info - 2026-05-12 16:58:42,879 -- Commit creating complete +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:42.8798827Z error - 2026-05-12 16:58:42,879 -- Commit creating failed: {"message":"Token required - not valid tokenless upload"} +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:42.9848104Z Sentry is attempting to send 2 pending events +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:42.9848468Z Waiting up to 2 seconds +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:42.9848702Z Press Ctrl-C to quit +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:43.0879805Z ==> Running command '/home/runner/work/_actions/codecov/codecov-action/v4/dist/codecov create-report' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:43.0881797Z [command]/home/runner/work/_actions/codecov/codecov-action/v4/dist/codecov create-report --git-service github +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:43.4484674Z info - 2026-05-12 16:58:43,448 -- ci service found: github-actions +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:43.4580506Z warning - 2026-05-12 16:58:43,457 -- No config file could be found. Ignoring config. +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:43.8610824Z info - 2026-05-12 16:58:43,860 -- Report creating complete +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:43.8614706Z error - 2026-05-12 16:58:43,861 -- Report creating failed: {"message":"Token required - not valid tokenless upload"} +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:43.9664336Z Sentry is attempting to send 1 pending events +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:43.9664683Z Waiting up to 2 seconds +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:43.9664925Z Press Ctrl-C to quit +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:44.0307964Z ==> Running command '/home/runner/work/_actions/codecov/codecov-action/v4/dist/codecov do-upload' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:44.0309375Z [command]/home/runner/work/_actions/codecov/codecov-action/v4/dist/codecov do-upload --git-service github +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:44.3894523Z info - 2026-05-12 16:58:44,388 -- ci service found: github-actions +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:44.3994105Z warning - 2026-05-12 16:58:44,398 -- No config file could be found. Ignoring config. +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:44.4299060Z warning - 2026-05-12 16:58:44,429 -- xcrun is not installed or can't be found. +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:44.4404140Z warning - 2026-05-12 16:58:44,440 -- No gcov data found. +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:44.4407716Z warning - 2026-05-12 16:58:44,440 -- coverage.py is not installed or can't be found. +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:44.4699180Z info - 2026-05-12 16:58:44,469 -- Found 2 coverage files to report +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:44.4700674Z info - 2026-05-12 16:58:44,469 -- > /home/runner/work/link-cli/link-cli/csharp/Foundation.Data.Doublets.Cli.Tests/TestResults/421d8b4a-b7bb-4f8f-9d5a-48070ce41a69/coverage.cobertura.xml +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:44.4701957Z info - 2026-05-12 16:58:44,469 -- > /home/runner/work/link-cli/link-cli/rust/tests/issue62_review_coverage_tests.rs +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:44.9947801Z info - 2026-05-12 16:58:44,994 -- Upload queued for processing complete +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:44.9948753Z error - 2026-05-12 16:58:44,994 -- Upload queued for processing failed: {"message":"Token required - not valid tokenless upload"} +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:45.1018417Z Sentry is attempting to send 1 pending events +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:45.1018793Z Waiting up to 2 seconds +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:45.1019027Z Press Ctrl-C to quit +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:45.1815824Z Post job cleanup. +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:45.3574766Z Post job cleanup. +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:45.4578410Z [command]/usr/bin/git version +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:45.4617899Z git version 2.53.0 +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:45.4654842Z Copying '/home/runner/.gitconfig' to '/home/runner/work/_temp/160c7b0e-a3f8-4add-8e22-6ee877639d91/.gitconfig' +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:45.4664654Z Temporarily overriding HOME='/home/runner/work/_temp/160c7b0e-a3f8-4add-8e22-6ee877639d91' before making global git config changes +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:45.4665976Z Adding repository directory to the temporary git global config as a safe directory +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:45.4671016Z [command]/usr/bin/git config --global --add safe.directory /home/runner/work/link-cli/link-cli +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:45.4715248Z [command]/usr/bin/git config --local --name-only --get-regexp core\.sshCommand +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:45.4749272Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :" +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:45.4993907Z [command]/usr/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:45.5017346Z http.https://github.com/.extraheader +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:45.5030471Z [command]/usr/bin/git config --local --unset-all http.https://github.com/.extraheader +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:45.5065119Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'http\.https\:\/\/github\.com\/\.extraheader' && git config --local --unset-all 'http.https://github.com/.extraheader' || :" +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:45.5301008Z [command]/usr/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir: +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:45.5335712Z [command]/usr/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:45.5688712Z Cleaning up orphan processes +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:45.5991212Z Terminate orphan process: pid (2773) (dotnet) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:45.6019750Z Terminate orphan process: pid (2846) (VBCSCompiler) +Test (ubuntu-latest) UNKNOWN STEP 2026-05-12T16:58:45.6055104Z ##[warning]Node.js 20 actions are deprecated. The following actions are running on Node.js 20 and may not work as expected: actions/checkout@v4, actions/setup-dotnet@v4, codecov/codecov-action@v4. Actions will be forced to run with Node.js 24 by default starting June 2nd, 2026. Node.js 20 will be removed from the runner on September 16th, 2026. Please check if updated versions of these actions are available that support Node.js 24. To opt into Node.js 24 now, set the FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=true environment variable on the runner or in your workflow file. Once Node.js 24 becomes the default, you can temporarily opt out by setting ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION=true. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/ +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:51.7328819Z Current runner version: '2.334.0' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:51.7351780Z ##[group]Runner Image Provisioner +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:51.7352437Z Hosted Compute Agent +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:51.7352814Z Version: 20260422.526 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:51.7353298Z Commit: e1a9e573f4d0838b3a7c1b07401aeb29ed3635a9 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:51.7353790Z Build Date: 2026-04-22T09:31:31Z +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:51.7354352Z Worker ID: {f490e55e-a1c3-4ca3-b2fd-45018ebca95b} +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:51.7354921Z Azure Region: westcentralus +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:51.7355373Z ##[endgroup] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:51.7356377Z ##[group]Operating System +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:51.7356829Z Microsoft Windows Server 2025 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:51.7357262Z 10.0.26100 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:51.7357580Z Datacenter +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:51.7357936Z ##[endgroup] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:51.7358297Z ##[group]Runner Image +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:51.7358727Z Image: windows-2025-vs2026 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:51.7359143Z Version: 20260428.85.1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:51.7360348Z Included Software: https://github.com/actions/runner-images/blob/win25-vs2026/20260428.85/images/windows/Windows2025-VS2026-Readme.md +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:51.7361707Z Image Release: https://github.com/actions/runner-images/releases/tag/win25-vs2026%2F20260428.85 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:51.7362506Z ##[endgroup] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:51.7365075Z ##[group]GITHUB_TOKEN Permissions +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:51.7367022Z Actions: write +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:51.7367397Z ArtifactMetadata: write +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:51.7367830Z Attestations: write +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:51.7368179Z Checks: write +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:51.7368552Z CodeQuality: write +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:51.7368890Z Contents: write +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:51.7369288Z Deployments: write +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:51.7369662Z Discussions: write +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:51.7370050Z Issues: write +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:51.7370478Z Metadata: read +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:51.7370847Z Models: read +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:51.7371204Z Packages: write +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:51.7371636Z Pages: write +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:51.7372061Z PullRequests: write +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:51.7372500Z RepositoryProjects: write +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:51.7372935Z SecurityEvents: write +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:51.7373385Z Statuses: write +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:51.7373724Z VulnerabilityAlerts: read +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:51.7374153Z ##[endgroup] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:51.7376014Z Secret source: Actions +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:51.7376583Z Prepare workflow directory +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:51.7748838Z Prepare all required actions +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:51.7780320Z Getting action download info +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:52.1801180Z Download action repository 'actions/checkout@v4' (SHA:34e114876b0b11c390a56381ad16ebd13914f8d5) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:52.2753042Z Download action repository 'actions/setup-dotnet@v4' (SHA:67a3573c9a986a3f9c594539f4ab511d57bb3ce9) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:53.4995151Z Download action repository 'codecov/codecov-action@v4' (SHA:b9fd7d16f6d7d1b5d2bec1a2887e65ceed900238) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:54.1458138Z Complete job name: Test (windows-latest) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:54.2548668Z ##[group]Run actions/checkout@v4 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:54.2549332Z with: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:54.2549516Z repository: link-foundation/link-cli +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:54.2550012Z token: *** +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:54.2550177Z ssh-strict: true +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:54.2550356Z ssh-user: git +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:54.2550541Z persist-credentials: true +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:54.2550733Z clean: true +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:54.2550924Z sparse-checkout-cone-mode: true +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:54.2551128Z fetch-depth: 1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:54.2551300Z fetch-tags: false +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:54.2551478Z show-progress: true +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:54.2551655Z lfs: false +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:54.2551813Z submodules: false +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:54.2551996Z set-safe-directory: true +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:54.2552326Z env: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:54.2552504Z DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:54.2552745Z DOTNET_CLI_TELEMETRY_OPTOUT: true +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:54.2552947Z DOTNET_NOLOGO: true +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:54.2553156Z ##[endgroup] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:54.3936985Z Syncing repository: link-foundation/link-cli +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:54.3938374Z ##[group]Getting Git version info +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:54.3940934Z Working directory is 'D:\a\link-cli\link-cli' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:54.4447350Z [command]"C:\Program Files\Git\bin\git.exe" version +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:54.6927680Z git version 2.54.0.windows.1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:54.6974277Z ##[endgroup] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:54.6991144Z Temporarily overriding HOME='D:\a\_temp\e9e55125-69f7-49e9-86de-aa0e76fc7c65' before making global git config changes +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:54.6992050Z Adding repository directory to the temporary git global config as a safe directory +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:54.7001104Z [command]"C:\Program Files\Git\bin\git.exe" config --global --add safe.directory D:\a\link-cli\link-cli +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:54.7381258Z Deleting the contents of 'D:\a\link-cli\link-cli' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:54.7396684Z ##[group]Initializing the repository +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:54.7404910Z [command]"C:\Program Files\Git\bin\git.exe" init D:\a\link-cli\link-cli +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:54.8089925Z Initialized empty Git repository in D:/a/link-cli/link-cli/.git/ +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:54.8142562Z [command]"C:\Program Files\Git\bin\git.exe" remote add origin https://github.com/link-foundation/link-cli +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:54.8433135Z ##[endgroup] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:54.8433643Z ##[group]Disabling automatic garbage collection +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:54.8443545Z [command]"C:\Program Files\Git\bin\git.exe" config --local gc.auto 0 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:54.8697582Z ##[endgroup] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:54.8698058Z ##[group]Setting up auth +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:54.8710082Z [command]"C:\Program Files\Git\bin\git.exe" config --local --name-only --get-regexp core\.sshCommand +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:54.8972455Z [command]"C:\Program Files\Git\bin\git.exe" submodule foreach --recursive "sh -c \"git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :\"" +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:55.9825431Z [command]"C:\Program Files\Git\bin\git.exe" config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:56.0072692Z [command]"C:\Program Files\Git\bin\git.exe" submodule foreach --recursive "sh -c \"git config --local --name-only --get-regexp 'http\.https\:\/\/github\.com\/\.extraheader' && git config --local --unset-all 'http.https://github.com/.extraheader' || :\"" +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:56.4541633Z [command]"C:\Program Files\Git\bin\git.exe" config --local --name-only --get-regexp ^includeIf\.gitdir: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:56.4794104Z [command]"C:\Program Files\Git\bin\git.exe" submodule foreach --recursive "git config --local --show-origin --name-only --get-regexp remote.origin.url" +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:56.8992227Z [command]"C:\Program Files\Git\bin\git.exe" config --local http.https://github.com/.extraheader "AUTHORIZATION: basic ***" +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:56.9240219Z ##[endgroup] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:56.9250524Z ##[group]Fetching the repository +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:56.9253123Z [command]"C:\Program Files\Git\bin\git.exe" -c protocol.version=2 fetch --no-tags --prune --no-recurse-submodules --depth=1 origin +d47e551d2d66c7bfe93f9a869ce9fab36347e317:refs/remotes/origin/main +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:58.3176306Z From https://github.com/link-foundation/link-cli +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:58.3177022Z * [new ref] d47e551d2d66c7bfe93f9a869ce9fab36347e317 -> origin/main +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:58.3341908Z ##[endgroup] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:58.3342380Z ##[group]Determining the checkout info +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:58.3344294Z ##[endgroup] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:58.3357120Z [command]"C:\Program Files\Git\bin\git.exe" sparse-checkout disable +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:58.3637062Z [command]"C:\Program Files\Git\bin\git.exe" config --local --unset-all extensions.worktreeConfig +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:58.3908929Z ##[group]Checking out the ref +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:58.3918424Z [command]"C:\Program Files\Git\bin\git.exe" checkout --progress --force -B main refs/remotes/origin/main +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:58.5422583Z Switched to a new branch 'main' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:58.5434695Z branch 'main' set up to track 'origin/main'. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:58.5483699Z ##[endgroup] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:58.5749509Z [command]"C:\Program Files\Git\bin\git.exe" log -1 --format=%H +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:58.5977253Z d47e551d2d66c7bfe93f9a869ce9fab36347e317 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:58.6313102Z ##[group]Run actions/setup-dotnet@v4 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:58.6313491Z with: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:58.6313672Z dotnet-version: 8.0.x +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:58.6313973Z cache: false +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:58.6314149Z env: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:58.6314355Z DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:58.6314622Z DOTNET_CLI_TELEMETRY_OPTOUT: true +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:58.6314896Z DOTNET_NOLOGO: true +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:58.6315149Z ##[endgroup] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:57:58.8905655Z [command]"C:\Program Files\PowerShell\7\pwsh.exe" -NoLogo -Sta -NoProfile -NonInteractive -ExecutionPolicy Unrestricted -Command & 'D:\a\_actions\actions\setup-dotnet\v4\externals\install-dotnet.ps1' -SkipNonVersionedFiles -Runtime dotnet -Channel LTS +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:58:10.1077290Z dotnet-install: .NET Core Runtime with version '10.0.7' is already installed. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:58:10.9828104Z [command]"C:\Program Files\PowerShell\7\pwsh.exe" -NoLogo -Sta -NoProfile -NonInteractive -ExecutionPolicy Unrestricted -Command & 'D:\a\_actions\actions\setup-dotnet\v4\externals\install-dotnet.ps1' -SkipNonVersionedFiles -Channel 8.0 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:58:12.3935917Z dotnet-install: .NET Core SDK with version '8.0.420' is already installed. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:58:12.4944608Z ##[group]Run dotnet restore +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:58:12.4944873Z ^[[36;1mdotnet restore^[[0m +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:58:12.4999728Z shell: C:\Program Files\PowerShell\7\pwsh.EXE -command ". '{0}'" +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:58:12.5000008Z env: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:58:12.5000156Z DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:58:12.5000367Z DOTNET_CLI_TELEMETRY_OPTOUT: true +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:58:12.5000545Z DOTNET_NOLOGO: true +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:58:12.5000697Z DOTNET_ROOT: C:\Program Files\dotnet +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:58:12.5000890Z ##[endgroup] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:58:27.8678068Z Determining projects to restore... +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:06.4557668Z Restored D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli\Foundation.Data.Doublets.Cli.csproj (in 37.34 sec). +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:08.8045842Z Restored D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\Foundation.Data.Doublets.Cli.Tests.csproj (in 39.99 sec). +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:08.9331829Z ##[group]Run dotnet build --no-restore --configuration Release +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:08.9332241Z ^[[36;1mdotnet build --no-restore --configuration Release^[[0m +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:08.9381816Z shell: C:\Program Files\PowerShell\7\pwsh.EXE -command ". '{0}'" +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:08.9382063Z env: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:08.9382219Z DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:08.9382409Z DOTNET_CLI_TELEMETRY_OPTOUT: true +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:08.9382584Z DOTNET_NOLOGO: true +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:08.9383033Z DOTNET_ROOT: C:\Program Files\dotnet +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:08.9383240Z ##[endgroup] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:22.9737774Z Foundation.Data.Doublets.Cli -> D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli\bin\Release\net8\Foundation.Data.Doublets.Cli.dll +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:24.3503439Z Foundation.Data.Doublets.Cli.Tests -> D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\bin\Release\net8\Foundation.Data.Doublets.Cli.Tests.dll +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:24.3923887Z +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:24.3929492Z Build succeeded. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:24.3936643Z 0 Warning(s) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:24.3939181Z 0 Error(s) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:24.3939402Z +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:24.3940046Z Time Elapsed 00:00:15.08 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:24.5069662Z ##[group]Run dotnet test --no-build --configuration Release --verbosity normal --collect:"XPlat Code Coverage" +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:24.5070318Z ^[[36;1mdotnet test --no-build --configuration Release --verbosity normal --collect:"XPlat Code Coverage"^[[0m +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:24.5118605Z shell: C:\Program Files\PowerShell\7\pwsh.EXE -command ". '{0}'" +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:24.5118869Z env: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:24.5119018Z DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:24.5119227Z DOTNET_CLI_TELEMETRY_OPTOUT: true +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:24.5119406Z DOTNET_NOLOGO: true +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:24.5119758Z DOTNET_ROOT: C:\Program Files\dotnet +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:24.5119931Z ##[endgroup] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:24.8950032Z Build started 5/12/2026 4:59:24 PM. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:25.0026272Z 1>Project "D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.sln" on node 1 (VSTest target(s)). +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:25.0026951Z 1>ValidateSolutionConfiguration: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:25.0027647Z Building solution configuration "Release|Any CPU". +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:25.2639185Z Test run for D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\bin\Release\net8\Foundation.Data.Doublets.Cli.Tests.dll (.NETCoreApp,Version=v8.0) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:25.8420825Z A total of 1 test files matched the specified pattern. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.3471686Z [xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v3.1.5+1b188a7b0a (64-bit .NET 8.0.26) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.4840243Z [xUnit.net 00:00:00.15] Discovering: Foundation.Data.Doublets.Cli.Tests +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.6092770Z [xUnit.net 00:00:00.27] Discovered: Foundation.Data.Doublets.Cli.Tests +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.6404154Z [xUnit.net 00:00:00.30] Starting: Foundation.Data.Doublets.Cli.Tests +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.8276640Z [xUnit.net 00:00:00.49] Foundation.Data.Doublets.Cli.Tests.NamedLinksDecoratorTests.SetName_OverwriteOldName [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.8278402Z [xUnit.net 00:00:00.49] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpocly1h.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.8280561Z [xUnit.net 00:00:00.49] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.8281335Z [xUnit.net 00:00:00.49] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.8282772Z [xUnit.net 00:00:00.49] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\NamedLinksDecoratorTests.cs(86,0): at Foundation.Data.Doublets.Cli.Tests.NamedLinksDecoratorTests.SetName_OverwriteOldName() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.8284398Z [xUnit.net 00:00:00.49] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.8285165Z [xUnit.net 00:00:00.49] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.8932155Z [xUnit.net 00:00:00.56] Foundation.Data.Doublets.Cli.Tests.NamedLinksDecoratorTests.MakeNamesDatabaseFilename_CorrectlyGeneratesFilename(dbFilename: "/tmp/test.db", expected: "/tmp/test.names.links") [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.8933949Z [xUnit.net 00:00:00.56] Assert.Equal() Failure: Strings differ +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.8935597Z [xUnit.net 00:00:00.56] ↓ (pos 0) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.8936271Z [xUnit.net 00:00:00.56] Expected: "/tmp/test.names.links" +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.8936889Z [xUnit.net 00:00:00.56] Actual: "\\tmp\\test.names.links" +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.8937832Z [xUnit.net 00:00:00.56] ↑ (pos 0) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.8938234Z [xUnit.net 00:00:00.56] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.8940088Z [xUnit.net 00:00:00.56] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\NamedLinksDecoratorTests.cs(44,0): at Foundation.Data.Doublets.Cli.Tests.NamedLinksDecoratorTests.MakeNamesDatabaseFilename_CorrectlyGeneratesFilename(String dbFilename, String expected) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.8944553Z [xUnit.net 00:00:00.56] at InvokeStub_NamedLinksDecoratorTests.MakeNamesDatabaseFilename_CorrectlyGeneratesFilename(Object, Span`1) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.8946289Z [xUnit.net 00:00:00.56] at System.Reflection.MethodBaseInvoker.InvokeWithFewArgs(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.8962545Z [xUnit.net 00:00:00.56] Foundation.Data.Doublets.Cli.Tests.NamedLinksDecoratorTests.AfterCreation_SetNameAndGetName_ShouldWork [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.8964828Z [xUnit.net 00:00:00.56] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpflgspi.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.8968625Z [xUnit.net 00:00:00.56] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.8969133Z [xUnit.net 00:00:00.56] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.8971803Z [xUnit.net 00:00:00.56] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\NamedLinksDecoratorTests.cs(147,0): at Foundation.Data.Doublets.Cli.Tests.NamedLinksDecoratorTests.AfterCreation_SetNameAndGetName_ShouldWork() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.8973582Z [xUnit.net 00:00:00.56] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.8974532Z [xUnit.net 00:00:00.56] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.8992654Z [Trace] Constructing NamedLinksDecorator with names DB: C:\Users\runneradmin\AppData\Local\Temp\tmpqthlag.names.links +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9032272Z [xUnit.net 00:00:00.57] Foundation.Data.Doublets.Cli.Tests.NamedLinksDecoratorTests.CanConstructNamedLinksDecorator [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9033616Z [xUnit.net 00:00:00.57] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpqthlag.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9034849Z [xUnit.net 00:00:00.57] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9035471Z [xUnit.net 00:00:00.57] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9037120Z [xUnit.net 00:00:00.57] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\NamedLinksDecoratorTests.cs(29,0): at Foundation.Data.Doublets.Cli.Tests.NamedLinksDecoratorTests.CanConstructNamedLinksDecorator() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9039608Z [xUnit.net 00:00:00.57] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9040798Z [xUnit.net 00:00:00.57] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9056293Z [xUnit.net 00:00:00.57] Foundation.Data.Doublets.Cli.Tests.NamedLinksDecoratorTests.RemoveName_NonExistent_DoesNotThrow [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9057828Z [xUnit.net 00:00:00.57] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpgzw4u4.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9059091Z [xUnit.net 00:00:00.57] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9059844Z [xUnit.net 00:00:00.57] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9063218Z [xUnit.net 00:00:00.57] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\NamedLinksDecoratorTests.cs(127,0): at Foundation.Data.Doublets.Cli.Tests.NamedLinksDecoratorTests.RemoveName_NonExistent_DoesNotThrow() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9065200Z [xUnit.net 00:00:00.57] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9066878Z [xUnit.net 00:00:00.57] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9081684Z [xUnit.net 00:00:00.57] Foundation.Data.Doublets.Cli.Tests.NamedLinksDecoratorTests.RemoveName_ShouldReturnNullAfterRemoval [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9083217Z [xUnit.net 00:00:00.57] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmphilh1b.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9084506Z [xUnit.net 00:00:00.57] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9085498Z [xUnit.net 00:00:00.57] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9087462Z [xUnit.net 00:00:00.57] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\NamedLinksDecoratorTests.cs(108,0): at Foundation.Data.Doublets.Cli.Tests.NamedLinksDecoratorTests.RemoveName_ShouldReturnNullAfterRemoval() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9090661Z [xUnit.net 00:00:00.57] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9092023Z [xUnit.net 00:00:00.57] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9693603Z [Test] All links: (1: 2->1) (2: 1->2) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9861173Z === Debug: Alternative Scenario === +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9861968Z Input changes: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9862514Z 1. (1: 1 2) -> (0: 0 0) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9918827Z 2. (1: 1 2) -> (1: 2 1) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9926584Z 3. (2: 2 1) -> (2: 1 2) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9927109Z Actual simplified changes: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9927562Z 1. (1: 1 2) -> (1: 2 1) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9927977Z 2. (2: 2 1) -> (2: 1 2) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9928391Z Count: 2 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9928756Z === End Debug === +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9934984Z [xUnit.net 00:00:00.60] Foundation.Data.Doublets.Cli.Tests.NamedLinksDecoratorTests.SetNameAndGetName_ShouldReturnSameName [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9936053Z Failed Foundation.Data.Doublets.Cli.Tests.NamedLinksDecoratorTests.SetName_OverwriteOldName [121 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9936913Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9937666Z [xUnit.net 00:00:00.60] Foundation.Data.Doublets.Cli.Tests.NamedLinksDecoratorTests.DeleteLink_RemovesNameAutomatically [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9939372Z [xUnit.net 00:00:00.62] Foundation.Data.Doublets.Cli.Tests.Tests.PersistentTransformationDecoratorTests.NeverRemovesMatchingStoredTrigger [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9940839Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpocly1h.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9942704Z [xUnit.net 00:00:00.64] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.SwapSourceAndTargetForAllLinksUsingVariablesTest [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9943648Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9943937Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9945036Z at Foundation.Data.Doublets.Cli.Tests.NamedLinksDecoratorTests.SetName_OverwriteOldName() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\NamedLinksDecoratorTests.cs:line 86 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9946420Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9947326Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9948586Z Passed Foundation.Data.Doublets.Cli.Tests.NamedLinksDecoratorTests.MakeNamesDatabaseFilename_CorrectlyGeneratesFilename(dbFilename: "test.db", expected: "test.names.links") [< 1 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9950404Z Passed Foundation.Data.Doublets.Cli.Tests.NamedLinksDecoratorTests.MakeNamesDatabaseFilename_CorrectlyGeneratesFilename(dbFilename: "a.b.c", expected: "a.b.names.links") [< 1 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9952295Z Failed Foundation.Data.Doublets.Cli.Tests.NamedLinksDecoratorTests.MakeNamesDatabaseFilename_CorrectlyGeneratesFilename(dbFilename: "/tmp/test.db", expected: "/tmp/test.names.links") [1 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9953423Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9953947Z Assert.Equal() Failure: Strings differ +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9954510Z ↓ (pos 0) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9954777Z Expected: "/tmp/test.names.links" +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9955078Z Actual: "\\tmp\\test.names.links" +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9955403Z ↑ (pos 0) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9955600Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9956925Z at Foundation.Data.Doublets.Cli.Tests.NamedLinksDecoratorTests.MakeNamesDatabaseFilename_CorrectlyGeneratesFilename(String dbFilename, String expected) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\NamedLinksDecoratorTests.cs:line 44 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9958786Z at InvokeStub_NamedLinksDecoratorTests.MakeNamesDatabaseFilename_CorrectlyGeneratesFilename(Object, Span`1) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9960630Z at System.Reflection.MethodBaseInvoker.InvokeWithFewArgs(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9961925Z Failed Foundation.Data.Doublets.Cli.Tests.NamedLinksDecoratorTests.AfterCreation_SetNameAndGetName_ShouldWork [2 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9962652Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9963395Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpflgspi.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9964196Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9964456Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9965611Z at Foundation.Data.Doublets.Cli.Tests.NamedLinksDecoratorTests.AfterCreation_SetNameAndGetName_ShouldWork() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\NamedLinksDecoratorTests.cs:line 147 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9967114Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9968020Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9968977Z Failed Foundation.Data.Doublets.Cli.Tests.NamedLinksDecoratorTests.CanConstructNamedLinksDecorator [7 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9969659Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9970389Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpqthlag.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9971181Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9971455Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9972630Z at Foundation.Data.Doublets.Cli.Tests.NamedLinksDecoratorTests.CanConstructNamedLinksDecorator() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\NamedLinksDecoratorTests.cs:line 29 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9974122Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9975012Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9975917Z Failed Foundation.Data.Doublets.Cli.Tests.NamedLinksDecoratorTests.RemoveName_NonExistent_DoesNotThrow [2 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9976540Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9977148Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpgzw4u4.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9977649Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9977833Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9978585Z [xUnit.net 00:00:00.64] Foundation.Data.Doublets.Cli.Tests.Tests.PersistentTransformationDecoratorTests.AlwaysTriggerIsStoredInLinksAndAppliedAfterWrite [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9979910Z [xUnit.net 00:00:00.65] Foundation.Data.Doublets.Cli.Tests.Tests.PersistentTransformationDecoratorTests.OnceTriggerDeletesItselfAfterFirstMatch [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9980789Z [xUnit.net 00:00:00.66] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.NameLookupConsistencyTest [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9981910Z at Foundation.Data.Doublets.Cli.Tests.NamedLinksDecoratorTests.RemoveName_NonExistent_DoesNotThrow() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\NamedLinksDecoratorTests.cs:line 127 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9982750Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9983280Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9983837Z Failed Foundation.Data.Doublets.Cli.Tests.NamedLinksDecoratorTests.RemoveName_ShouldReturnNullAfterRemoval [2 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9984251Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9984874Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmphilh1b.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9985441Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9985660Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9986909Z at Foundation.Data.Doublets.Cli.Tests.NamedLinksDecoratorTests.RemoveName_ShouldReturnNullAfterRemoval() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\NamedLinksDecoratorTests.cs:line 108 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9988257Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9989109Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9990338Z [xUnit.net 00:00:00.60] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpwxndyq.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9996869Z [xUnit.net 00:00:00.60] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9997455Z [xUnit.net 00:00:00.60] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:32.9999665Z [xUnit.net 00:00:00.60] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\NamedLinksDecoratorTests.cs(63,0): at Foundation.Data.Doublets.Cli.Tests.NamedLinksDecoratorTests.SetNameAndGetName_ShouldReturnSameName() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0001519Z [xUnit.net 00:00:00.60] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0002700Z [xUnit.net 00:00:00.60] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0004084Z [xUnit.net 00:00:00.60] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpuykc5l.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0005056Z [xUnit.net 00:00:00.60] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0005549Z [xUnit.net 00:00:00.60] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0007775Z [xUnit.net 00:00:00.60] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\NamedLinksDecoratorTests.cs(171,0): at Foundation.Data.Doublets.Cli.Tests.NamedLinksDecoratorTests.DeleteLink_RemovesNameAutomatically() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0013446Z [xUnit.net 00:00:00.60] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0014643Z [xUnit.net 00:00:00.60] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0015957Z [xUnit.net 00:00:00.62] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpks3ot0.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0016887Z [xUnit.net 00:00:00.62] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0017328Z [xUnit.net 00:00:00.62] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0020130Z [xUnit.net 00:00:00.62] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\PersistentTransformationDecoratorTests.cs(113,0): at Foundation.Data.Doublets.Cli.Tests.Tests.PersistentTransformationDecoratorTests.DeleteIfExists(String path) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0023028Z [xUnit.net 00:00:00.62] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\PersistentTransformationDecoratorTests.cs(90,0): at Foundation.Data.Doublets.Cli.Tests.Tests.PersistentTransformationDecoratorTests.RunWithPersistentLinks(Action`2 action) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0025766Z [xUnit.net 00:00:00.62] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\PersistentTransformationDecoratorTests.cs(60,0): at Foundation.Data.Doublets.Cli.Tests.Tests.PersistentTransformationDecoratorTests.NeverRemovesMatchingStoredTrigger() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0028008Z [xUnit.net 00:00:00.62] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0029199Z [xUnit.net 00:00:00.62] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0030612Z [xUnit.net 00:00:00.64] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpa2cnbz.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0031566Z [xUnit.net 00:00:00.64] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0032041Z [xUnit.net 00:00:00.64] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0033684Z [xUnit.net 00:00:00.64] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0036254Z [xUnit.net 00:00:00.64] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(446,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.SwapSourceAndTargetForAllLinksUsingVariablesTest() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0038172Z [xUnit.net 00:00:00.64] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0044379Z [xUnit.net 00:00:00.64] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0046332Z [xUnit.net 00:00:00.64] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmprgbdux.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0047675Z [xUnit.net 00:00:00.64] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0048199Z [xUnit.net 00:00:00.64] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0049892Z [xUnit.net 00:00:00.64] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\PersistentTransformationDecoratorTests.cs(113,0): at Foundation.Data.Doublets.Cli.Tests.Tests.PersistentTransformationDecoratorTests.DeleteIfExists(String path) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0053032Z [xUnit.net 00:00:00.64] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\PersistentTransformationDecoratorTests.cs(90,0): at Foundation.Data.Doublets.Cli.Tests.Tests.PersistentTransformationDecoratorTests.RunWithPersistentLinks(Action`2 action) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0058132Z [xUnit.net 00:00:00.64] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\PersistentTransformationDecoratorTests.cs(13,0): at Foundation.Data.Doublets.Cli.Tests.Tests.PersistentTransformationDecoratorTests.AlwaysTriggerIsStoredInLinksAndAppliedAfterWrite() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0060546Z [xUnit.net 00:00:00.64] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0061711Z [xUnit.net 00:00:00.64] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0063353Z [xUnit.net 00:00:00.65] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmppcv4ad.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0064257Z [xUnit.net 00:00:00.65] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0064551Z [xUnit.net 00:00:00.65] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0065517Z [xUnit.net 00:00:00.65] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\PersistentTransformationDecoratorTests.cs(113,0): at Foundation.Data.Doublets.Cli.Tests.Tests.PersistentTransformationDecoratorTests.DeleteIfExists(String path) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0067861Z [xUnit.net 00:00:00.65] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\PersistentTransformationDecoratorTests.cs(90,0): at Foundation.Data.Doublets.Cli.Tests.Tests.PersistentTransformationDecoratorTests.RunWithPersistentLinks(Action`2 action) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0069484Z [xUnit.net 00:00:00.65] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\PersistentTransformationDecoratorTests.cs(35,0): at Foundation.Data.Doublets.Cli.Tests.Tests.PersistentTransformationDecoratorTests.OnceTriggerDeletesItselfAfterFirstMatch() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0070694Z [xUnit.net 00:00:00.65] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0071374Z [xUnit.net 00:00:00.65] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0071986Z Failed Foundation.Data.Doublets.Cli.Tests.NamedLinksDecoratorTests.SetNameAndGetName_ShouldReturnSameName [2 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0072408Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0072847Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpwxndyq.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0073317Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0073498Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0074206Z at Foundation.Data.Doublets.Cli.Tests.NamedLinksDecoratorTests.SetNameAndGetName_ShouldReturnSameName() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\NamedLinksDecoratorTests.cs:line 63 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0075063Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0075664Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0076363Z Failed Foundation.Data.Doublets.Cli.Tests.NamedLinksDecoratorTests.DeleteLink_RemovesNameAutomatically [15 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0076961Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0077399Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpuykc5l.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0078192Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0078468Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0079686Z at Foundation.Data.Doublets.Cli.Tests.NamedLinksDecoratorTests.DeleteLink_RemovesNameAutomatically() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\NamedLinksDecoratorTests.cs:line 171 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0081381Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0082279Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0083459Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.PersistentTransformationDecoratorTests.NeverRemovesMatchingStoredTrigger [30 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0084373Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0085138Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpks3ot0.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0085969Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0086461Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0087830Z at Foundation.Data.Doublets.Cli.Tests.Tests.PersistentTransformationDecoratorTests.DeleteIfExists(String path) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\PersistentTransformationDecoratorTests.cs:line 113 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0090178Z at Foundation.Data.Doublets.Cli.Tests.Tests.PersistentTransformationDecoratorTests.RunWithPersistentLinks(Action`2 action) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\PersistentTransformationDecoratorTests.cs:line 90 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0093126Z at Foundation.Data.Doublets.Cli.Tests.Tests.PersistentTransformationDecoratorTests.NeverRemovesMatchingStoredTrigger() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\PersistentTransformationDecoratorTests.cs:line 60 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0094996Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0098947Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0102800Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.SwapSourceAndTargetForAllLinksUsingVariablesTest [300 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0103719Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0104466Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpa2cnbz.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0105824Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0106134Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0107588Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0110539Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.SwapSourceAndTargetForAllLinksUsingVariablesTest() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 446 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0116758Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0118561Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0119830Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.PersistentTransformationDecoratorTests.AlwaysTriggerIsStoredInLinksAndAppliedAfterWrite [16 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0120822Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0121586Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmprgbdux.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0122420Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0122710Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0124099Z at Foundation.Data.Doublets.Cli.Tests.Tests.PersistentTransformationDecoratorTests.DeleteIfExists(String path) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\PersistentTransformationDecoratorTests.cs:line 113 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0126450Z at Foundation.Data.Doublets.Cli.Tests.Tests.PersistentTransformationDecoratorTests.RunWithPersistentLinks(Action`2 action) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\PersistentTransformationDecoratorTests.cs:line 90 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0130015Z at Foundation.Data.Doublets.Cli.Tests.Tests.PersistentTransformationDecoratorTests.AlwaysTriggerIsStoredInLinksAndAppliedAfterWrite() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\PersistentTransformationDecoratorTests.cs:line 13 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0140525Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0143581Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0150733Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.PersistentTransformationDecoratorTests.OnceTriggerDeletesItselfAfterFirstMatch [7 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0151902Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0153100Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmppcv4ad.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0153916Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0154198Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0155146Z at Foundation.Data.Doublets.Cli.Tests.Tests.PersistentTransformationDecoratorTests.DeleteIfExists(String path) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\PersistentTransformationDecoratorTests.cs:line 113 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0156706Z at Foundation.Data.Doublets.Cli.Tests.Tests.PersistentTransformationDecoratorTests.RunWithPersistentLinks(Action`2 action) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\PersistentTransformationDecoratorTests.cs:line 90 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0158106Z at Foundation.Data.Doublets.Cli.Tests.Tests.PersistentTransformationDecoratorTests.OnceTriggerDeletesItselfAfterFirstMatch() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\PersistentTransformationDecoratorTests.cs:line 35 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0159429Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0159963Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0160626Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.ChangesSimplifierTests.SimplifyChanges_Issue26_AlternativeScenario_NoSimplificationOccurs [14 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0161391Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.ChangesSimplifierTests.SimplifyChanges_NoChange_StillKeepsFirstAndLastState [1 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0162289Z [xUnit.net 00:00:00.66] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpwz232l.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0162846Z [xUnit.net 00:00:00.66] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0163146Z [xUnit.net 00:00:00.66] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0164153Z [xUnit.net 00:00:00.66] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0165560Z [xUnit.net 00:00:00.66] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1137,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.NameLookupConsistencyTest() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0166558Z [xUnit.net 00:00:00.66] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0167521Z [xUnit.net 00:00:00.66] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0168396Z [xUnit.net 00:00:00.66] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.SwapEqualSourceAndTargetUsingVariablesHasAllChangesTest [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0169222Z [xUnit.net 00:00:00.67] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.MultipleUpdatesTest [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0169940Z [xUnit.net 00:00:00.67] Foundation.Data.Doublets.Cli.Tests.LinoDatabaseOutputTests.WriteToFile_WritesCompleteDatabaseAsLinoLines [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0170727Z [xUnit.net 00:00:00.67] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreationWithEmptySlotDuringUpdateTest [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0172095Z [xUnit.net 00:00:00.67] Foundation.Data.Doublets.Cli.Tests.LinoDatabaseOutputTests.FormatStructure_RendersLeftBranchWithLinkIndexes [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0172978Z [xUnit.net 00:00:00.68] Foundation.Data.Doublets.Cli.Tests.LinoDatabaseOutputTests.FormatStructure_RendersRepeatedSourceAndTargetAsReferenceOnRight [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0173969Z [xUnit.net 00:00:00.68] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateLeftCompositeIntegerChildrenWithoutExtraLeaf_ShouldSucceed [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0174575Z [Test] All links: (1: 2->1) (2: 2->2) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0175176Z [xUnit.net 00:00:00.66] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpff21ck.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0175836Z [xUnit.net 00:00:00.66] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0176176Z [xUnit.net 00:00:00.66] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0177273Z [xUnit.net 00:00:00.66] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0179047Z [xUnit.net 00:00:00.66] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(465,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.SwapEqualSourceAndTargetUsingVariablesHasAllChangesTest() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0180189Z [xUnit.net 00:00:00.66] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0180862Z [xUnit.net 00:00:00.66] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0181577Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.ChangesSimplifierTests.SimplifyChanges_Issue26_UpdateOperationSimplification [< 1 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0182332Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.ChangesSimplifierTests.SimplifyChanges_SpecificExample_RemovesIntermediateStates [< 1 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0183035Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.NameLookupConsistencyTest [17 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0183444Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0183894Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpwz232l.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0184375Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0184549Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0185336Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0186567Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.NameLookupConsistencyTest() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1137 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0187413Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0187938Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0188596Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.ChangesSimplifierTests.SimplifyChanges_MultipleChainsFromSameBefore_RemovesIntermediateStates [4 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0189442Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.ChangesSimplifierTests.SimplifyChanges_MultipleBranchesFromSameInitial_ProducesCorrectFinalStates [1 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0190487Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.ChangesSimplifierTests.SimplifyChanges_MultipleBranchesFromSameInitial_ProducesCorrectFinalStates_InCorrectOrder [1 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0191882Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.ChangesSimplifierTests.SimplifyChanges_SpecificExample_KeepsUnchangedStates [< 1 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0193681Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.SwapEqualSourceAndTargetUsingVariablesHasAllChangesTest [10 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0194669Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0195393Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpff21ck.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0196838Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0197129Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0198771Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0201463Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.SwapEqualSourceAndTargetUsingVariablesHasAllChangesTest() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 465 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0203322Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0204260Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0204892Z [Test] All links: (1: 1->2) (2: 2->1) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0205943Z [xUnit.net 00:00:00.67] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpa30dfk.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0206974Z [xUnit.net 00:00:00.67] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0207468Z [xUnit.net 00:00:00.67] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0209252Z [xUnit.net 00:00:00.67] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0211741Z [xUnit.net 00:00:00.67] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(576,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.MultipleUpdatesTest() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0213417Z [xUnit.net 00:00:00.67] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0221154Z [xUnit.net 00:00:00.67] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0222549Z [xUnit.net 00:00:00.67] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmp4bkilf.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0223480Z [xUnit.net 00:00:00.67] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0223955Z [xUnit.net 00:00:00.67] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0225850Z [xUnit.net 00:00:00.67] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\LinoDatabaseOutputTests.cs(162,0): at Foundation.Data.Doublets.Cli.Tests.LinoDatabaseOutputTests.WithNamedLinks(Action`1 test) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0228258Z [xUnit.net 00:00:00.67] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\LinoDatabaseOutputTests.cs(94,0): at Foundation.Data.Doublets.Cli.Tests.LinoDatabaseOutputTests.WriteToFile_WritesCompleteDatabaseAsLinoLines() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0230023Z [xUnit.net 00:00:00.67] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0235185Z [xUnit.net 00:00:00.67] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0235958Z [Test] All links: (1: 1->1) (3: 3->3) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0237041Z [xUnit.net 00:00:00.67] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpbkyhxb.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0238007Z [xUnit.net 00:00:00.67] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0238490Z [xUnit.net 00:00:00.67] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0246441Z [xUnit.net 00:00:00.67] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0256148Z [xUnit.net 00:00:00.67] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(633,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreationWithEmptySlotDuringUpdateTest() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0258463Z [xUnit.net 00:00:00.67] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0260666Z [xUnit.net 00:00:00.67] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0262009Z [xUnit.net 00:00:00.67] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpojajxx.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0262996Z [xUnit.net 00:00:00.67] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0263442Z [xUnit.net 00:00:00.67] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0266174Z [xUnit.net 00:00:00.68] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\LinoDatabaseOutputTests.cs(162,0): at Foundation.Data.Doublets.Cli.Tests.LinoDatabaseOutputTests.WithNamedLinks(Action`1 test) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0268314Z [xUnit.net 00:00:00.68] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\LinoDatabaseOutputTests.cs(119,0): at Foundation.Data.Doublets.Cli.Tests.LinoDatabaseOutputTests.FormatStructure_RendersLeftBranchWithLinkIndexes() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0269929Z [xUnit.net 00:00:00.68] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0271045Z [xUnit.net 00:00:00.68] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0271707Z [Test] All links: (1: 1->1) (2: 2->1) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0272696Z [xUnit.net 00:00:00.68] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpezntcl.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0273574Z [xUnit.net 00:00:00.68] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0274024Z [xUnit.net 00:00:00.68] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0275363Z [xUnit.net 00:00:00.68] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\LinoDatabaseOutputTests.cs(162,0): at Foundation.Data.Doublets.Cli.Tests.LinoDatabaseOutputTests.WithNamedLinks(Action`1 test) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0278136Z [xUnit.net 00:00:00.68] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\LinoDatabaseOutputTests.cs(135,0): at Foundation.Data.Doublets.Cli.Tests.LinoDatabaseOutputTests.FormatStructure_RendersRepeatedSourceAndTargetAsReferenceOnRight() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0280002Z [xUnit.net 00:00:00.68] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0281612Z [xUnit.net 00:00:00.68] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0283063Z [xUnit.net 00:00:00.68] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpe3v3xe.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0284042Z [xUnit.net 00:00:00.68] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0284544Z [xUnit.net 00:00:00.68] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0286273Z [xUnit.net 00:00:00.68] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0288095Z [xUnit.net 00:00:00.68] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1187,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateLeftCompositeIntegerChildrenWithoutExtraLeaf_ShouldSucceed() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0289236Z [xUnit.net 00:00:00.68] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0289904Z [xUnit.net 00:00:00.68] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0290650Z [xUnit.net 00:00:00.69] Foundation.Data.Doublets.Cli.Tests.LinoDatabaseOutputTests.FormatDatabase_EscapesNamesThatNeedQuoting [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0291456Z [xUnit.net 00:00:00.69] Foundation.Data.Doublets.Cli.Tests.LinoDatabaseInputTests.ImportText_ReproducesNumberedLinksAtTheirExplicitIndexes [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0292315Z [xUnit.net 00:00:00.69] Foundation.Data.Doublets.Cli.Tests.LinoDatabaseOutputTests.FormatDatabase_UsesNamesForIndexesSourcesAndTargets_WhenNamesExist [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0293220Z [xUnit.net 00:00:00.69] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmprahppd.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0294083Z [xUnit.net 00:00:00.69] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0294386Z [xUnit.net 00:00:00.69] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0295359Z [xUnit.net 00:00:00.69] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\LinoDatabaseOutputTests.cs(162,0): at Foundation.Data.Doublets.Cli.Tests.LinoDatabaseOutputTests.WithNamedLinks(Action`1 test) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0296874Z [xUnit.net 00:00:00.69] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\LinoDatabaseOutputTests.cs(48,0): at Foundation.Data.Doublets.Cli.Tests.LinoDatabaseOutputTests.FormatDatabase_EscapesNamesThatNeedQuoting() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0297866Z [xUnit.net 00:00:00.69] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0298532Z [xUnit.net 00:00:00.69] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0299132Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.MultipleUpdatesTest [4 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0299513Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0299979Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpa30dfk.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0300467Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0300649Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0301607Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0302937Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.MultipleUpdatesTest() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 576 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0303793Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0304329Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0304903Z Failed Foundation.Data.Doublets.Cli.Tests.LinoDatabaseOutputTests.WriteToFile_WritesCompleteDatabaseAsLinoLines [16 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0305329Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0305843Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmp4bkilf.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0306304Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0306489Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0307151Z at Foundation.Data.Doublets.Cli.Tests.LinoDatabaseOutputTests.WithNamedLinks(Action`1 test) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\LinoDatabaseOutputTests.cs:line 162 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0308237Z at Foundation.Data.Doublets.Cli.Tests.LinoDatabaseOutputTests.WriteToFile_WritesCompleteDatabaseAsLinoLines() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\LinoDatabaseOutputTests.cs:line 94 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0309124Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0309643Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0310559Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreationWithEmptySlotDuringUpdateTest [5 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0311288Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0317165Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpbkyhxb.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0318053Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0318520Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0320955Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0323778Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreationWithEmptySlotDuringUpdateTest() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 633 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0328568Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0330614Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0331713Z Failed Foundation.Data.Doublets.Cli.Tests.LinoDatabaseOutputTests.FormatStructure_RendersLeftBranchWithLinkIndexes [5 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0332816Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0333870Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpojajxx.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0334984Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0335278Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0336403Z at Foundation.Data.Doublets.Cli.Tests.LinoDatabaseOutputTests.WithNamedLinks(Action`1 test) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\LinoDatabaseOutputTests.cs:line 162 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0337924Z at Foundation.Data.Doublets.Cli.Tests.LinoDatabaseOutputTests.FormatStructure_RendersLeftBranchWithLinkIndexes() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\LinoDatabaseOutputTests.cs:line 119 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0338975Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0339516Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0340241Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateLeftCompositeIntegerChildrenWithoutExtraLeaf_ShouldSucceed [3 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0340793Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0341256Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpe3v3xe.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0342477Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0342656Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0343472Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0344865Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateLeftCompositeIntegerChildrenWithoutExtraLeaf_ShouldSucceed() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1187 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0350226Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0351227Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0352361Z Failed Foundation.Data.Doublets.Cli.Tests.LinoDatabaseOutputTests.FormatStructure_RendersRepeatedSourceAndTargetAsReferenceOnRight [3 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0353305Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0393753Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpezntcl.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0404836Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0422388Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0423934Z at Foundation.Data.Doublets.Cli.Tests.LinoDatabaseOutputTests.WithNamedLinks(Action`1 test) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\LinoDatabaseOutputTests.cs:line 162 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0427887Z at Foundation.Data.Doublets.Cli.Tests.LinoDatabaseOutputTests.FormatStructure_RendersRepeatedSourceAndTargetAsReferenceOnRight() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\LinoDatabaseOutputTests.cs:line 135 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0429601Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0430542Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0431547Z Failed Foundation.Data.Doublets.Cli.Tests.LinoDatabaseOutputTests.FormatDatabase_EscapesNamesThatNeedQuoting [8 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0432264Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0433001Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmprahppd.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0433798Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0434057Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0435165Z at Foundation.Data.Doublets.Cli.Tests.LinoDatabaseOutputTests.WithNamedLinks(Action`1 test) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\LinoDatabaseOutputTests.cs:line 162 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0437387Z at Foundation.Data.Doublets.Cli.Tests.LinoDatabaseOutputTests.FormatDatabase_EscapesNamesThatNeedQuoting() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\LinoDatabaseOutputTests.cs:line 48 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0438875Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0440010Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0441269Z [xUnit.net 00:00:00.69] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpwdtbyr.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0442190Z [xUnit.net 00:00:00.69] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0442662Z [xUnit.net 00:00:00.69] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0444067Z [xUnit.net 00:00:00.69] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\LinoDatabaseInputTests.cs(108,0): at Foundation.Data.Doublets.Cli.Tests.LinoDatabaseInputTests.WithNamedLinks(Action`1 test) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0446514Z [xUnit.net 00:00:00.69] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\LinoDatabaseInputTests.cs(12,0): at Foundation.Data.Doublets.Cli.Tests.LinoDatabaseInputTests.ImportText_ReproducesNumberedLinksAtTheirExplicitIndexes() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0448284Z [xUnit.net 00:00:00.69] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0449443Z [xUnit.net 00:00:00.69] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0450805Z [xUnit.net 00:00:00.69] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmp3jycg1.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0451740Z [xUnit.net 00:00:00.69] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0452238Z [xUnit.net 00:00:00.69] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0454634Z [xUnit.net 00:00:00.69] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\LinoDatabaseOutputTests.cs(162,0): at Foundation.Data.Doublets.Cli.Tests.LinoDatabaseOutputTests.WithNamedLinks(Action`1 test) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0457307Z [xUnit.net 00:00:00.69] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\LinoDatabaseOutputTests.cs(25,0): at Foundation.Data.Doublets.Cli.Tests.LinoDatabaseOutputTests.FormatDatabase_UsesNamesForIndexesSourcesAndTargets_WhenNamesExist() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0459341Z [xUnit.net 00:00:00.69] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0460565Z [xUnit.net 00:00:00.69] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0461825Z [xUnit.net 00:00:00.69] Foundation.Data.Doublets.Cli.Tests.LinoDatabaseInputTests.ImportText_TreatsOutOfRangeNumbersAsNames [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0463156Z [xUnit.net 00:00:00.70] Foundation.Data.Doublets.Cli.Tests.LinoDatabaseOutputTests.FormatDatabase_SelectsQuoteStyleForNamesContainingQuotes [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0464565Z [xUnit.net 00:00:00.70] Foundation.Data.Doublets.Cli.Tests.LinoDatabaseOutputTests.FormatDatabase_UsesNumberedReferences_WhenLinksHaveNoNames [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0468113Z [xUnit.net 00:00:00.70] Foundation.Data.Doublets.Cli.Tests.LinoDatabaseInputTests.ImportText_UnquotesNamesWrittenByExporter [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0469540Z [xUnit.net 00:00:00.70] Foundation.Data.Doublets.Cli.Tests.LinoDatabaseInputTests.ImportText_CreatesNamedReferencesAsPointLinks [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0471027Z [xUnit.net 00:00:00.70] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.Issue20_SubstituteFullPointWithUnboundParts_ShouldKeepFullPoint [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0472714Z [xUnit.net 00:00:00.70] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmprzkkvp.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0473661Z [xUnit.net 00:00:00.70] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0474365Z [xUnit.net 00:00:00.70] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0475253Z [xUnit.net 00:00:00.70] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\LinoDatabaseInputTests.cs(108,0): at Foundation.Data.Doublets.Cli.Tests.LinoDatabaseInputTests.WithNamedLinks(Action`1 test) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0476767Z [xUnit.net 00:00:00.70] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\LinoDatabaseInputTests.cs(57,0): at Foundation.Data.Doublets.Cli.Tests.LinoDatabaseInputTests.ImportText_TreatsOutOfRangeNumbersAsNames() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0477756Z [xUnit.net 00:00:00.70] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0478546Z [xUnit.net 00:00:00.70] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0479632Z [xUnit.net 00:00:00.70] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmppppq35.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0480423Z [xUnit.net 00:00:00.70] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0480799Z [xUnit.net 00:00:00.70] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0481771Z [xUnit.net 00:00:00.70] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\LinoDatabaseOutputTests.cs(162,0): at Foundation.Data.Doublets.Cli.Tests.LinoDatabaseOutputTests.WithNamedLinks(Action`1 test) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0483070Z [xUnit.net 00:00:00.70] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\LinoDatabaseOutputTests.cs(71,0): at Foundation.Data.Doublets.Cli.Tests.LinoDatabaseOutputTests.FormatDatabase_SelectsQuoteStyleForNamesContainingQuotes() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0484097Z [xUnit.net 00:00:00.70] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0484767Z [xUnit.net 00:00:00.70] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0485548Z [xUnit.net 00:00:00.70] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpqalerz.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0486082Z [xUnit.net 00:00:00.70] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0486359Z [xUnit.net 00:00:00.70] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0487155Z [xUnit.net 00:00:00.70] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\LinoDatabaseOutputTests.cs(162,0): at Foundation.Data.Doublets.Cli.Tests.LinoDatabaseOutputTests.WithNamedLinks(Action`1 test) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0488562Z [xUnit.net 00:00:00.70] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\LinoDatabaseOutputTests.cs(11,0): at Foundation.Data.Doublets.Cli.Tests.LinoDatabaseOutputTests.FormatDatabase_UsesNumberedReferences_WhenLinksHaveNoNames() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0489721Z [xUnit.net 00:00:00.70] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0490378Z [xUnit.net 00:00:00.70] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0491148Z [xUnit.net 00:00:00.70] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpfhwagm.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0491676Z [xUnit.net 00:00:00.70] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0491964Z [xUnit.net 00:00:00.70] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0493407Z [xUnit.net 00:00:00.70] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\LinoDatabaseInputTests.cs(108,0): at Foundation.Data.Doublets.Cli.Tests.LinoDatabaseInputTests.WithNamedLinks(Action`1 test) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0494630Z [xUnit.net 00:00:00.70] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\LinoDatabaseInputTests.cs(78,0): at Foundation.Data.Doublets.Cli.Tests.LinoDatabaseInputTests.ImportText_UnquotesNamesWrittenByExporter() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0495813Z [xUnit.net 00:00:00.70] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0496722Z [xUnit.net 00:00:00.70] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0497245Z [Test] All links: (21: 21->21) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0497818Z [xUnit.net 00:00:00.70] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpu42rz4.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0498348Z [xUnit.net 00:00:00.70] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0498648Z [xUnit.net 00:00:00.70] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0499444Z [xUnit.net 00:00:00.70] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\LinoDatabaseInputTests.cs(108,0): at Foundation.Data.Doublets.Cli.Tests.LinoDatabaseInputTests.WithNamedLinks(Action`1 test) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0500648Z [xUnit.net 00:00:00.70] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\LinoDatabaseInputTests.cs(32,0): at Foundation.Data.Doublets.Cli.Tests.LinoDatabaseInputTests.ImportText_CreatesNamedReferencesAsPointLinks() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0501613Z [xUnit.net 00:00:00.70] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0502271Z [xUnit.net 00:00:00.70] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0503094Z [xUnit.net 00:00:00.70] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpszvmax.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0503650Z [xUnit.net 00:00:00.70] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0503924Z [xUnit.net 00:00:00.70] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0504865Z [xUnit.net 00:00:00.70] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0507284Z [xUnit.net 00:00:00.70] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1553,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.Issue20_SubstituteFullPointWithUnboundParts_ShouldKeepFullPoint() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0512119Z [xUnit.net 00:00:00.70] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0513731Z [xUnit.net 00:00:00.71] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0515274Z Failed Foundation.Data.Doublets.Cli.Tests.LinoDatabaseInputTests.ImportText_ReproducesNumberedLinksAtTheirExplicitIndexes [9 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0516050Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0516806Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpwdtbyr.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0517649Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0517940Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0519866Z at Foundation.Data.Doublets.Cli.Tests.LinoDatabaseInputTests.WithNamedLinks(Action`1 test) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\LinoDatabaseInputTests.cs:line 108 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0523647Z at Foundation.Data.Doublets.Cli.Tests.LinoDatabaseInputTests.ImportText_ReproducesNumberedLinksAtTheirExplicitIndexes() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\LinoDatabaseInputTests.cs:line 12 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0525451Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0526381Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0527508Z Failed Foundation.Data.Doublets.Cli.Tests.LinoDatabaseOutputTests.FormatDatabase_UsesNamesForIndexesSourcesAndTargets_WhenNamesExist [2 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0528502Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0529205Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmp3jycg1.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0529992Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0530275Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0531390Z at Foundation.Data.Doublets.Cli.Tests.LinoDatabaseOutputTests.WithNamedLinks(Action`1 test) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\LinoDatabaseOutputTests.cs:line 162 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0533406Z at Foundation.Data.Doublets.Cli.Tests.LinoDatabaseOutputTests.FormatDatabase_UsesNamesForIndexesSourcesAndTargets_WhenNamesExist() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\LinoDatabaseOutputTests.cs:line 25 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0540001Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0540972Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0541925Z Failed Foundation.Data.Doublets.Cli.Tests.LinoDatabaseInputTests.ImportText_TreatsOutOfRangeNumbersAsNames [6 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0542611Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0543374Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmprzkkvp.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0544174Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0544467Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0545566Z at Foundation.Data.Doublets.Cli.Tests.LinoDatabaseInputTests.WithNamedLinks(Action`1 test) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\LinoDatabaseInputTests.cs:line 108 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0547034Z at Foundation.Data.Doublets.Cli.Tests.LinoDatabaseInputTests.ImportText_TreatsOutOfRangeNumbersAsNames() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\LinoDatabaseInputTests.cs:line 57 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0547975Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0548503Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0549144Z Failed Foundation.Data.Doublets.Cli.Tests.LinoDatabaseOutputTests.FormatDatabase_SelectsQuoteStyleForNamesContainingQuotes [7 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0549601Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0550038Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmppppq35.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0550496Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0550664Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0551310Z at Foundation.Data.Doublets.Cli.Tests.LinoDatabaseOutputTests.WithNamedLinks(Action`1 test) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\LinoDatabaseOutputTests.cs:line 162 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0552429Z at Foundation.Data.Doublets.Cli.Tests.LinoDatabaseOutputTests.FormatDatabase_SelectsQuoteStyleForNamesContainingQuotes() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\LinoDatabaseOutputTests.cs:line 71 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0553461Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0554023Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0554641Z Failed Foundation.Data.Doublets.Cli.Tests.LinoDatabaseOutputTests.FormatDatabase_UsesNumberedReferences_WhenLinksHaveNoNames [3 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0555086Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0555665Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpqalerz.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0556229Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0556413Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0557171Z at Foundation.Data.Doublets.Cli.Tests.LinoDatabaseOutputTests.WithNamedLinks(Action`1 test) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\LinoDatabaseOutputTests.cs:line 162 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0572496Z at Foundation.Data.Doublets.Cli.Tests.LinoDatabaseOutputTests.FormatDatabase_UsesNumberedReferences_WhenLinksHaveNoNames() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\LinoDatabaseOutputTests.cs:line 11 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0577578Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0581540Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0582546Z Failed Foundation.Data.Doublets.Cli.Tests.LinoDatabaseInputTests.ImportText_UnquotesNamesWrittenByExporter [4 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0583272Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0584433Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpfhwagm.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0585395Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0585687Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0586790Z at Foundation.Data.Doublets.Cli.Tests.LinoDatabaseInputTests.WithNamedLinks(Action`1 test) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\LinoDatabaseInputTests.cs:line 108 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0589329Z at Foundation.Data.Doublets.Cli.Tests.LinoDatabaseInputTests.ImportText_UnquotesNamesWrittenByExporter() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\LinoDatabaseInputTests.cs:line 78 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0590879Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0591795Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0592790Z Failed Foundation.Data.Doublets.Cli.Tests.LinoDatabaseInputTests.ImportText_CreatesNamedReferencesAsPointLinks [2 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0593366Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0593839Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpu42rz4.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0594298Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0594486Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0595122Z at Foundation.Data.Doublets.Cli.Tests.LinoDatabaseInputTests.WithNamedLinks(Action`1 test) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\LinoDatabaseInputTests.cs:line 108 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0596633Z at Foundation.Data.Doublets.Cli.Tests.LinoDatabaseInputTests.ImportText_CreatesNamedReferencesAsPointLinks() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\LinoDatabaseInputTests.cs:line 32 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0597503Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0598026Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0598843Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.Issue20_SubstituteFullPointWithUnboundParts_ShouldKeepFullPoint [26 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0599369Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0599824Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpszvmax.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0600306Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0600479Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0601271Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0602685Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.Issue20_SubstituteFullPointWithUnboundParts_ShouldKeepFullPoint() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1553 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0603634Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0604166Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0604847Z [xUnit.net 00:00:00.71] Foundation.Data.Doublets.Cli.Tests.SimpleLinksDecoratorTests.CanConstructSimpleLinksDecorator [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0605554Z [xUnit.net 00:00:00.71] Foundation.Data.Doublets.Cli.Tests.SimpleLinksDecoratorTests.Delete_WithRestriction_DoesNotThrow [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0606340Z [xUnit.net 00:00:00.72] Foundation.Data.Doublets.Cli.Tests.SimpleLinksDecoratorTests.DeleteAfterGetOrCreate_DoesNotThrow_WithTracing [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0607217Z [xUnit.net 00:00:00.72] Foundation.Data.Doublets.Cli.Tests.SimpleLinksDecoratorTests.DeleteAfterGetOrCreate_DoesNotThrow [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0608073Z [xUnit.net 00:00:00.72] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.MatchAndDelete2LevelNestedLinksTest [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0609046Z [xUnit.net 00:00:00.71] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpbzu2el.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0609579Z [xUnit.net 00:00:00.71] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0609875Z [xUnit.net 00:00:00.71] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0610804Z [xUnit.net 00:00:00.71] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\SimpleLinksDecoratorTests.cs(23,0): at Foundation.Data.Doublets.Cli.Tests.SimpleLinksDecoratorTests.CanConstructSimpleLinksDecorator() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0611850Z [xUnit.net 00:00:00.71] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0612565Z [xUnit.net 00:00:00.71] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0613445Z [xUnit.net 00:00:00.71] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpuxifga.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0614886Z [xUnit.net 00:00:00.71] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0615183Z [xUnit.net 00:00:00.71] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0616150Z [xUnit.net 00:00:00.71] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\SimpleLinksDecoratorTests.cs(48,0): at Foundation.Data.Doublets.Cli.Tests.SimpleLinksDecoratorTests.Delete_WithRestriction_DoesNotThrow() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0617123Z [xUnit.net 00:00:00.71] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0617890Z [xUnit.net 00:00:00.71] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0618530Z [Trace] Constructing SimpleLinksDecorator with names DB: C:\Users\runneradmin\AppData\Local\Temp\tmpvbk3kp.names.links +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0619311Z [xUnit.net 00:00:00.72] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpvbk3kp.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0619849Z [xUnit.net 00:00:00.72] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0620124Z [xUnit.net 00:00:00.72] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0621083Z [xUnit.net 00:00:00.72] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\SimpleLinksDecoratorTests.cs(85,0): at Foundation.Data.Doublets.Cli.Tests.SimpleLinksDecoratorTests.DeleteAfterGetOrCreate_DoesNotThrow_WithTracing() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0622076Z [xUnit.net 00:00:00.72] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0622733Z [xUnit.net 00:00:00.72] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0623497Z [xUnit.net 00:00:00.72] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpmwgnlq.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0624017Z [xUnit.net 00:00:00.72] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0624284Z [xUnit.net 00:00:00.72] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0625115Z [xUnit.net 00:00:00.72] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\SimpleLinksDecoratorTests.cs(67,0): at Foundation.Data.Doublets.Cli.Tests.SimpleLinksDecoratorTests.DeleteAfterGetOrCreate_DoesNotThrow() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0626061Z [xUnit.net 00:00:00.72] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0626498Z [Test] All links: (1: 1->1) (2: 2->2) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0626911Z [xUnit.net 00:00:00.72] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0627704Z [xUnit.net 00:00:00.72] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmp4s2s4w.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0628249Z [xUnit.net 00:00:00.72] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0628521Z [xUnit.net 00:00:00.72] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0629474Z [xUnit.net 00:00:00.72] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0630872Z [xUnit.net 00:00:00.72] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(355,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.MatchAndDelete2LevelNestedLinksTest() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0631867Z [xUnit.net 00:00:00.72] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.0632516Z [xUnit.net 00:00:00.72] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.1771016Z Failed Foundation.Data.Doublets.Cli.Tests.SimpleLinksDecoratorTests.CanConstructSimpleLinksDecorator [6 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.1771977Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.1772827Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpbzu2el.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.1773993Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.1774598Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.1775499Z at Foundation.Data.Doublets.Cli.Tests.SimpleLinksDecoratorTests.CanConstructSimpleLinksDecorator() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\SimpleLinksDecoratorTests.cs:line 23 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.1776381Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.1776919Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.1777642Z Failed Foundation.Data.Doublets.Cli.Tests.SimpleLinksDecoratorTests.Delete_WithRestriction_DoesNotThrow [3 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.1778024Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.1778476Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpuxifga.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.1779281Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.1779536Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.1780239Z at Foundation.Data.Doublets.Cli.Tests.SimpleLinksDecoratorTests.Delete_WithRestriction_DoesNotThrow() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\SimpleLinksDecoratorTests.cs:line 48 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.1781079Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.1781607Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.1782188Z Passed Foundation.Data.Doublets.Cli.Tests.PinnedTypesDecoratorTests.Should_Implement_Both_ILinks_And_IPinnedTypes [12 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.1782853Z Failed Foundation.Data.Doublets.Cli.Tests.SimpleLinksDecoratorTests.DeleteAfterGetOrCreate_DoesNotThrow_WithTracing [2 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.1783290Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.1783991Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpvbk3kp.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.1784459Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.1784645Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.1785489Z at Foundation.Data.Doublets.Cli.Tests.SimpleLinksDecoratorTests.DeleteAfterGetOrCreate_DoesNotThrow_WithTracing() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\SimpleLinksDecoratorTests.cs:line 85 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.1786359Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.1786894Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.1787442Z Failed Foundation.Data.Doublets.Cli.Tests.SimpleLinksDecoratorTests.DeleteAfterGetOrCreate_DoesNotThrow [2 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.1787838Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.1788258Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpmwgnlq.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.1788717Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.1788884Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.1789566Z at Foundation.Data.Doublets.Cli.Tests.SimpleLinksDecoratorTests.DeleteAfterGetOrCreate_DoesNotThrow() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\SimpleLinksDecoratorTests.cs:line 67 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.1790403Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.1790917Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.1791523Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.MatchAndDelete2LevelNestedLinksTest [16 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.1792095Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.1792544Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmp4s2s4w.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.1793020Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.1793181Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.1793958Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.1795328Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.MatchAndDelete2LevelNestedLinksTest() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 355 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.1796218Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.1796745Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.1797271Z Passed Foundation.Data.Doublets.Cli.Tests.PinnedTypesDecoratorTests.Should_Support_Deconstruction [122 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.1902864Z [Test] All links: (2: 2->2) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.1914321Z [xUnit.net 00:00:00.85] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteLinksByAnyTargetTest [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.1918414Z [xUnit.net 00:00:00.85] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpmmcqkn.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.1926293Z [xUnit.net 00:00:00.85] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.1927188Z [xUnit.net 00:00:00.85] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.1930209Z [xUnit.net 00:00:00.85] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.1932485Z [xUnit.net 00:00:00.85] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(723,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteLinksByAnyTargetTest() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.1933685Z [xUnit.net 00:00:00.86] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.1934383Z [xUnit.net 00:00:00.86] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.1935010Z [Trace] Constructing NamedTypesDecorator with names DB: C:\Users\runneradmin\AppData\Local\Temp\tmpwz3mtg.names.links +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2221958Z [xUnit.net 00:00:00.89] Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.NamedTypesDecorator_UsesProvidedPinnedTypesDecorator [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2223546Z [xUnit.net 00:00:00.89] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpdylkfo.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2224143Z [xUnit.net 00:00:00.89] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2224444Z [xUnit.net 00:00:00.89] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2225249Z [xUnit.net 00:00:00.89] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\NamedTypesDecoratorTests.cs(28,0): at Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.Dispose() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2226815Z [xUnit.net 00:00:00.89] /_/src/xunit.execution/Extensions/ReflectionAbstractionExtensions.cs(79,0): at ReflectionAbstractionExtensions.DisposeTestClass(ITest test, Object testClass, IMessageBus messageBus, ExecutionTimer timer, CancellationTokenSource cancellationTokenSource) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2244475Z Passed Foundation.Data.Doublets.Cli.Tests.PinnedTypesTests.Should_Terminate_Enumeration_When_Iterated_Without_Take [118 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2245560Z Passed Foundation.Data.Doublets.Cli.Tests.PinnedTypesDecoratorTests.Should_Work_As_ILinks_Decorator [9 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2246272Z Passed Foundation.Data.Doublets.Cli.Tests.PinnedTypesDecoratorTests.Should_Enumerate_PinnedTypes [5 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2246928Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteLinksByAnyTargetTest [133 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2247347Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2248241Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpmmcqkn.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2248744Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2248933Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2249749Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2250990Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteLinksByAnyTargetTest() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 723 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2251861Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2252414Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2252965Z Passed Foundation.Data.Doublets.Cli.Tests.PinnedTypesTests.Should_Validate_Existing_Links_With_Ulong [15 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2253670Z Passed Foundation.Data.Doublets.Cli.Tests.PinnedTypesTests.Should_Destructure_PinnedTypes [27 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2254324Z Failed Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.NamedTypesDecorator_UsesProvidedPinnedTypesDecorator [30 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2254780Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2255230Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpdylkfo.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2255689Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2255857Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2256454Z at Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.Dispose() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\NamedTypesDecoratorTests.cs:line 28 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2257616Z at ReflectionAbstractionExtensions.DisposeTestClass(ITest test, Object testClass, IMessageBus messageBus, ExecutionTimer timer, CancellationTokenSource cancellationTokenSource) in /_/src/xunit.execution/Extensions/ReflectionAbstractionExtensions.cs:line 79 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2510302Z [xUnit.net 00:00:00.91] Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.NamedTypesDecorator_CanRemoveNames [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2512213Z [xUnit.net 00:00:00.91] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmp4jvjp2.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2513771Z [xUnit.net 00:00:00.91] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2514255Z [xUnit.net 00:00:00.91] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2515546Z [xUnit.net 00:00:00.91] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\NamedTypesDecoratorTests.cs(28,0): at Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.Dispose() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2517627Z [xUnit.net 00:00:00.91] /_/src/xunit.execution/Extensions/ReflectionAbstractionExtensions.cs(79,0): at ReflectionAbstractionExtensions.DisposeTestClass(ITest test, Object testClass, IMessageBus messageBus, ExecutionTimer timer, CancellationTokenSource cancellationTokenSource) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2591272Z [xUnit.net 00:00:00.92] Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.NamedTypesDecorator_DeleteRemovesAssociatedNames [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2593102Z [xUnit.net 00:00:00.92] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpr3n3u3.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2594794Z [xUnit.net 00:00:00.92] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2595298Z [xUnit.net 00:00:00.92] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2596934Z [xUnit.net 00:00:00.92] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\NamedTypesDecoratorTests.cs(28,0): at Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.Dispose() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2599304Z [xUnit.net 00:00:00.92] /_/src/xunit.execution/Extensions/ReflectionAbstractionExtensions.cs(79,0): at ReflectionAbstractionExtensions.DisposeTestClass(ITest test, Object testClass, IMessageBus messageBus, ExecutionTimer timer, CancellationTokenSource cancellationTokenSource) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2810628Z [xUnit.net 00:00:00.94] Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.NamedTypesDecorator_CanSetAndGetNames [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2812608Z [xUnit.net 00:00:00.94] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpul5kfe.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2813811Z [xUnit.net 00:00:00.94] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2814387Z [xUnit.net 00:00:00.94] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2815720Z [xUnit.net 00:00:00.94] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\NamedTypesDecoratorTests.cs(28,0): at Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.Dispose() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2817678Z [xUnit.net 00:00:00.94] /_/src/xunit.execution/Extensions/ReflectionAbstractionExtensions.cs(79,0): at ReflectionAbstractionExtensions.DisposeTestClass(ITest test, Object testClass, IMessageBus messageBus, ExecutionTimer timer, CancellationTokenSource cancellationTokenSource) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2833680Z [ProcessQuery] Query: "(() ((link: link link)))" +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2835503Z [ProcessQuery] Parser returned 1 top-level link(s). +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2836059Z [ProcessQuery] Restriction link => Id="" Values.Count=0 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2836551Z [ProcessQuery] Substitution link => Id="" Values.Count=1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2837172Z [ProcessQuery] No restriction, but substitution is non-empty => creation scenario. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2837761Z [ValidateLinksExistOrWillBeCreated] Starting validation +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2838269Z [ValidateLinksExistOrWillBeCreated] Numeric links to be created: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2839343Z [ValidateLinksExistOrWillBeCreated] Named links to be created: link +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2840556Z [Trace] GetByName called for name: 'link' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2840862Z [Trace] GetByName result: 0 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2841746Z [ValidateReferencesInPattern] Named link 'link' reference validated in substitution pattern +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2842442Z [Trace] GetByName called for name: 'link' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2842705Z [Trace] GetByName result: 0 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2843163Z [ValidateReferencesInPattern] Named link 'link' reference validated in substitution pattern +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2843730Z [ValidateLinksExistOrWillBeCreated] Validation completed +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2844105Z [Trace] GetByName called for name: 'link' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2844385Z [Trace] GetByName result: 0 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2846979Z [Trace] Update called with restriction: [1] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2853859Z [Trace] Debug: handlerWrapper invoked - before=1,0,0, after=1,0,0 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2854429Z [Trace] Update result: 4294967295 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2855159Z [EnsureNestedLinkCreatedRecursively] Created named leaf 'link' => ID=1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2855710Z [Trace] SetName called for link: 1 with name: 'link' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2856096Z [Trace] RemoveName called for link: 1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2856697Z [Trace] RemoveName completed for link: 1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2857014Z [Trace] SetName result: 100 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2859080Z [EnsureNestedLinkCreatedRecursively] Updating link ID=1 => Source=1, Target=1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2859644Z [Trace] Update called with restriction: [1,0,0] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2860095Z [Trace] Debug: handlerWrapper invoked - before=1,0,0, after=1,1,1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2860888Z [EnsureNestedLinkCreatedRecursively] Update handler: before=(1: 0->0), after=(1: 1->1) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2861719Z [Trace] Update result: 4294967295 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2861989Z [ProcessQuery] Created link ID #1 from substitution pattern. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2862337Z [Test] All links: (1: 1->1) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2863269Z [Trace] GetByName called for name: 'link' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2863588Z [Trace] GetByName result: 1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2863892Z [Trace] GetName called for link: 1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2864355Z [Trace] GetName result: link +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2892842Z Passed Foundation.Data.Doublets.Cli.Tests.PinnedTypesTests.Should_Validate_Existing_Links [16 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2894134Z Failed Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.NamedTypesDecorator_CanRemoveNames [28 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2894938Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2896004Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmp4jvjp2.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2898050Z [xUnit.net 00:00:00.95] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateNamedLinkWithStringId_ShouldCreateSingleLink [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2898650Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2898840Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2899475Z at Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.Dispose() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\NamedTypesDecoratorTests.cs:line 28 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2900645Z at ReflectionAbstractionExtensions.DisposeTestClass(ITest test, Object testClass, IMessageBus messageBus, ExecutionTimer timer, CancellationTokenSource cancellationTokenSource) in /_/src/xunit.execution/Extensions/ReflectionAbstractionExtensions.cs:line 79 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2901579Z Passed Foundation.Data.Doublets.Cli.Tests.PinnedTypesTests.Should_Reset_Enumerator [18 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2902152Z Failed Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.NamedTypesDecorator_DeleteRemovesAssociatedNames [7 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2902585Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2903019Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpr3n3u3.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2903483Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2903667Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2904247Z at Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.Dispose() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\NamedTypesDecoratorTests.cs:line 28 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2905379Z at ReflectionAbstractionExtensions.DisposeTestClass(ITest test, Object testClass, IMessageBus messageBus, ExecutionTimer timer, CancellationTokenSource cancellationTokenSource) in /_/src/xunit.execution/Extensions/ReflectionAbstractionExtensions.cs:line 79 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2906360Z Passed Foundation.Data.Doublets.Cli.Tests.PinnedTypesTests.Should_Throw_Exception_For_Invalid_Link_Structure [6 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2906935Z Passed Foundation.Data.Doublets.Cli.Tests.PinnedTypesTests.Should_Create_And_Iterate_Over_Types [8 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2907513Z Failed Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.NamedTypesDecorator_CanSetAndGetNames [21 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2908102Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2908538Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpul5kfe.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2908997Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2909163Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2909752Z at Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.Dispose() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\NamedTypesDecoratorTests.cs:line 28 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2910888Z at ReflectionAbstractionExtensions.DisposeTestClass(ITest test, Object testClass, IMessageBus messageBus, ExecutionTimer timer, CancellationTokenSource cancellationTokenSource) in /_/src/xunit.execution/Extensions/ReflectionAbstractionExtensions.cs:line 79 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2912000Z Passed Foundation.Data.Doublets.Cli.Tests.PinnedTypesTests.Should_Create_And_Iterate_Over_Types_With_RealDataStore [13 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2913010Z [xUnit.net 00:00:00.95] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpwz3mtg.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2913584Z [xUnit.net 00:00:00.95] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2913896Z [xUnit.net 00:00:00.95] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2914905Z [xUnit.net 00:00:00.95] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2916422Z [xUnit.net 00:00:00.95] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1152,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateNamedLinkWithStringId_ShouldCreateSingleLink() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2917517Z [xUnit.net 00:00:00.95] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.2918317Z [xUnit.net 00:00:00.95] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.3960084Z [xUnit.net 00:00:01.06] Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.NamedTypesDecorator_HandlesNonexistentNames [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.3961839Z [xUnit.net 00:00:01.06] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpmgo0ms.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.3962664Z [xUnit.net 00:00:01.06] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.3963115Z [xUnit.net 00:00:01.06] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.3964472Z [xUnit.net 00:00:01.06] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\NamedTypesDecoratorTests.cs(28,0): at Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.Dispose() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.3967019Z [xUnit.net 00:00:01.06] /_/src/xunit.execution/Extensions/ReflectionAbstractionExtensions.cs(79,0): at ReflectionAbstractionExtensions.DisposeTestClass(ITest test, Object testClass, IMessageBus messageBus, ExecutionTimer timer, CancellationTokenSource cancellationTokenSource) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.6787340Z [xUnit.net 00:00:01.34] Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.NamedTypesDecorator_ReassigningExistingNameMovesNameToNewLink [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.6792072Z [xUnit.net 00:00:01.34] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmppn01le.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.6792760Z [xUnit.net 00:00:01.34] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.6793492Z [xUnit.net 00:00:01.34] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.6798452Z [xUnit.net 00:00:01.34] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\NamedTypesDecoratorTests.cs(28,0): at Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.Dispose() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.6800666Z [xUnit.net 00:00:01.34] /_/src/xunit.execution/Extensions/ReflectionAbstractionExtensions.cs(79,0): at ReflectionAbstractionExtensions.DisposeTestClass(ITest test, Object testClass, IMessageBus messageBus, ExecutionTimer timer, CancellationTokenSource cancellationTokenSource) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.7746313Z [xUnit.net 00:00:01.44] Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.NamedTypesDecorator_ImplementsILinks [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.7747543Z [xUnit.net 00:00:01.44] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmphjpth0.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.7748134Z [xUnit.net 00:00:01.44] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.7748461Z [xUnit.net 00:00:01.44] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.7749237Z [xUnit.net 00:00:01.44] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\NamedTypesDecoratorTests.cs(28,0): at Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.Dispose() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.7750569Z [xUnit.net 00:00:01.44] /_/src/xunit.execution/Extensions/ReflectionAbstractionExtensions.cs(79,0): at ReflectionAbstractionExtensions.DisposeTestClass(ITest test, Object testClass, IMessageBus messageBus, ExecutionTimer timer, CancellationTokenSource cancellationTokenSource) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.7766954Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateNamedLinkWithStringId_ShouldCreateSingleLink [96 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.7768707Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.7770405Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpwz3mtg.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.7771529Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.7771721Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.7772534Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.7773994Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateNamedLinkWithStringId_ShouldCreateSingleLink() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1152 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.7775208Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.7775759Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.7776375Z Failed Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.NamedTypesDecorator_HandlesNonexistentNames [114 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.7777000Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.7777439Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpmgo0ms.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.7777900Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.7778077Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.7778669Z at Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.Dispose() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\NamedTypesDecoratorTests.cs:line 28 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.7779830Z at ReflectionAbstractionExtensions.DisposeTestClass(ITest test, Object testClass, IMessageBus messageBus, ExecutionTimer timer, CancellationTokenSource cancellationTokenSource) in /_/src/xunit.execution/Extensions/ReflectionAbstractionExtensions.cs:line 79 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.7781033Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.CreateLinkWithSource2Target2Test [110 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.7781901Z Failed Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.NamedTypesDecorator_ReassigningExistingNameMovesNameToNewLink [282 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.7782386Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.7782805Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmppn01le.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.7783272Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.7783445Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.7784140Z at Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.Dispose() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\NamedTypesDecoratorTests.cs:line 28 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.7785331Z at ReflectionAbstractionExtensions.DisposeTestClass(ITest test, Object testClass, IMessageBus messageBus, ExecutionTimer timer, CancellationTokenSource cancellationTokenSource) in /_/src/xunit.execution/Extensions/ReflectionAbstractionExtensions.cs:line 79 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.7786327Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.DeleteAllLinksByIndexTest [280 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.7786951Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.DeleteAllLinksBySourceAndTargetTest [93 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.7787588Z Failed Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.NamedTypesDecorator_ImplementsILinks [95 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.7787981Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.7788424Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmphjpth0.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.7788888Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.7789060Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.7789655Z at Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.Dispose() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\NamedTypesDecoratorTests.cs:line 28 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.7790787Z at ReflectionAbstractionExtensions.DisposeTestClass(ITest test, Object testClass, IMessageBus messageBus, ExecutionTimer timer, CancellationTokenSource cancellationTokenSource) in /_/src/xunit.execution/Extensions/ReflectionAbstractionExtensions.cs:line 79 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.7794493Z [xUnit.net 00:00:01.44] Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.NamedTypesDecorator_CanConstructFromDatabaseFilename [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.7797353Z [xUnit.net 00:00:01.44] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmprdampa.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.7798311Z [xUnit.net 00:00:01.44] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.7798769Z [xUnit.net 00:00:01.44] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.7800154Z [xUnit.net 00:00:01.44] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\NamedTypesDecoratorTests.cs(258,0): at Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.NamedTypesDecorator_CanConstructFromDatabaseFilename() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.7801222Z [xUnit.net 00:00:01.44] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.7802092Z [xUnit.net 00:00:01.44] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.9126684Z [Test] All links: (1: 1->1) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.9138768Z [xUnit.net 00:00:01.58] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeletionDuringUpdateTest [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.9140252Z [xUnit.net 00:00:01.58] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpmm5qzy.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.9141874Z [xUnit.net 00:00:01.58] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.9142483Z [xUnit.net 00:00:01.58] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.9144444Z [xUnit.net 00:00:01.58] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.9147044Z [xUnit.net 00:00:01.58] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(652,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeletionDuringUpdateTest() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.9149746Z [xUnit.net 00:00:01.58] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:33.9150882Z [xUnit.net 00:00:01.58] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.0660512Z [xUnit.net 00:00:01.73] Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.NamedTypesDecorator_CanEnumeratePinnedTypes [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.0662200Z [xUnit.net 00:00:01.73] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpzgedko.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.0663561Z [xUnit.net 00:00:01.73] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.0664210Z [xUnit.net 00:00:01.73] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.0665790Z [xUnit.net 00:00:01.73] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\NamedTypesDecoratorTests.cs(28,0): at Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.Dispose() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.0668365Z [xUnit.net 00:00:01.73] /_/src/xunit.execution/Extensions/ReflectionAbstractionExtensions.cs(79,0): at ReflectionAbstractionExtensions.DisposeTestClass(ITest test, Object testClass, IMessageBus messageBus, ExecutionTimer timer, CancellationTokenSource cancellationTokenSource) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.0831389Z Failed Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.NamedTypesDecorator_CanConstructFromDatabaseFilename [4 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.0832439Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.0834292Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmprdampa.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.0835169Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.0835461Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.0837200Z at Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.NamedTypesDecorator_CanConstructFromDatabaseFilename() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\NamedTypesDecoratorTests.cs:line 258 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.0838813Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.0839735Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.0840708Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeletionDuringUpdateTest [626 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.0841411Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.0842215Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpmm5qzy.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.0843053Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.0843338Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.0844704Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.0847209Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeletionDuringUpdateTest() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 652 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.0849165Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.0850100Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.0851057Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.DeleteLinksByAnyTargetTest [269 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.0853039Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.DeleteLinksByAnySourceTest [20 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.0854537Z Failed Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.NamedTypesDecorator_CanEnumeratePinnedTypes [283 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.0855538Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.0856300Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpzgedko.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.0857071Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.0857360Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.0858384Z at Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.Dispose() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\NamedTypesDecoratorTests.cs:line 28 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.0860456Z at ReflectionAbstractionExtensions.DisposeTestClass(ITest test, Object testClass, IMessageBus messageBus, ExecutionTimer timer, CancellationTokenSource cancellationTokenSource) in /_/src/xunit.execution/Extensions/ReflectionAbstractionExtensions.cs:line 79 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.0862175Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.DeleteMultipleLinksTest [17 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.1058585Z [xUnit.net 00:00:01.77] Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.NamedTypesDecorator_CanOverwriteNames [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.1060086Z [xUnit.net 00:00:01.77] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmp2fyfhx.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.1061413Z [xUnit.net 00:00:01.77] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.1062040Z [xUnit.net 00:00:01.77] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.1063481Z [xUnit.net 00:00:01.77] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\NamedTypesDecoratorTests.cs(28,0): at Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.Dispose() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.1064994Z [xUnit.net 00:00:01.77] /_/src/xunit.execution/Extensions/ReflectionAbstractionExtensions.cs(79,0): at ReflectionAbstractionExtensions.DisposeTestClass(ITest test, Object testClass, IMessageBus messageBus, ExecutionTimer timer, CancellationTokenSource cancellationTokenSource) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.1165131Z [xUnit.net 00:00:01.78] Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.NamedTypesDecorator_ImplementsIPinnedTypes [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.1166727Z [xUnit.net 00:00:01.78] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpt5sh2t.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.1168396Z [xUnit.net 00:00:01.78] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.1169043Z [xUnit.net 00:00:01.78] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.1170559Z [xUnit.net 00:00:01.78] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\NamedTypesDecoratorTests.cs(28,0): at Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.Dispose() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.1174042Z [xUnit.net 00:00:01.78] /_/src/xunit.execution/Extensions/ReflectionAbstractionExtensions.cs(79,0): at ReflectionAbstractionExtensions.DisposeTestClass(ITest test, Object testClass, IMessageBus messageBus, ExecutionTimer timer, CancellationTokenSource cancellationTokenSource) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.4060883Z [xUnit.net 00:00:02.07] Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.NamedTypesDecorator_ImplementsINamedTypes [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.4062413Z [xUnit.net 00:00:02.07] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpsgiwuq.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.4063375Z [xUnit.net 00:00:02.07] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.4064144Z [xUnit.net 00:00:02.07] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.4069774Z [xUnit.net 00:00:02.07] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\NamedTypesDecoratorTests.cs(28,0): at Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.Dispose() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.4071889Z [xUnit.net 00:00:02.07] /_/src/xunit.execution/Extensions/ReflectionAbstractionExtensions.cs(79,0): at ReflectionAbstractionExtensions.DisposeTestClass(ITest test, Object testClass, IMessageBus messageBus, ExecutionTimer timer, CancellationTokenSource cancellationTokenSource) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.4269525Z [xUnit.net 00:00:02.09] Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.NamedTypesDecorator_CanGetLinkByName [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.4271377Z [xUnit.net 00:00:02.09] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmp2uu0l5.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.4272696Z [xUnit.net 00:00:02.09] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.4273173Z [xUnit.net 00:00:02.09] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.4274368Z [xUnit.net 00:00:02.09] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\NamedTypesDecoratorTests.cs(28,0): at Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.Dispose() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.4275726Z [xUnit.net 00:00:02.09] /_/src/xunit.execution/Extensions/ReflectionAbstractionExtensions.cs(79,0): at ReflectionAbstractionExtensions.DisposeTestClass(ITest test, Object testClass, IMessageBus messageBus, ExecutionTimer timer, CancellationTokenSource cancellationTokenSource) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.7183059Z Failed Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.NamedTypesDecorator_CanOverwriteNames [41 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.7183866Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.7184720Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmp2fyfhx.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.7186853Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.7187575Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.7188686Z at Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.Dispose() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\NamedTypesDecoratorTests.cs:line 28 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.7190961Z at ReflectionAbstractionExtensions.DisposeTestClass(ITest test, Object testClass, IMessageBus messageBus, ExecutionTimer timer, CancellationTokenSource cancellationTokenSource) in /_/src/xunit.execution/Extensions/ReflectionAbstractionExtensions.cs:line 79 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.7194313Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.CreateMultipleLinksTest [28 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.7195425Z Failed Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.NamedTypesDecorator_ImplementsIPinnedTypes [10 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.7196172Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.7196926Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpt5sh2t.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.7197691Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.7197951Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.7204317Z at Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.Dispose() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\NamedTypesDecoratorTests.cs:line 28 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.7206500Z at ReflectionAbstractionExtensions.DisposeTestClass(ITest test, Object testClass, IMessageBus messageBus, ExecutionTimer timer, CancellationTokenSource cancellationTokenSource) in /_/src/xunit.execution/Extensions/ReflectionAbstractionExtensions.cs:line 79 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.7208501Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.ReverseSourceWithTargetUsingVariablesTest [21 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.7209743Z Failed Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.NamedTypesDecorator_ImplementsINamedTypes [289 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.7211048Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.7211812Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpsgiwuq.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.7212606Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.7212902Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.7214235Z at Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.Dispose() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\NamedTypesDecoratorTests.cs:line 28 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.7216389Z at ReflectionAbstractionExtensions.DisposeTestClass(ITest test, Object testClass, IMessageBus messageBus, ExecutionTimer timer, CancellationTokenSource cancellationTokenSource) in /_/src/xunit.execution/Extensions/ReflectionAbstractionExtensions.cs:line 79 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.7218075Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.CreateSingleLinkTest [280 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.7219072Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.NoUpdateUsingVariablesTest [13 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.7219708Z Failed Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.NamedTypesDecorator_CanGetLinkByName [20 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.7220107Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.7220553Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmp2uu0l5.tmp' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.7221037Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.7221221Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.7221824Z at Foundation.Data.Doublets.Cli.Tests.NamedTypesDecoratorTests.Dispose() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\NamedTypesDecoratorTests.cs:line 28 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.7222978Z at ReflectionAbstractionExtensions.DisposeTestClass(ITest test, Object testClass, IMessageBus messageBus, ExecutionTimer timer, CancellationTokenSource cancellationTokenSource) in /_/src/xunit.execution/Extensions/ReflectionAbstractionExtensions.cs:line 79 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.7223990Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.DeleteSingleLinkTest_Source1Target2 [289 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.8589017Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.MixedMultipleUpdatesTest [22 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.8590195Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.DeleteSingleLinkTest_Source2Target2 [12 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.8591387Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.CreationWithEmptySlotDuringUpdateTest [8 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.8592601Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.CreateSingleLinkWithIndexAfterDoubleGapTest [53 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.8593688Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.MultipleUpdatesTest [19 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.8595067Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.CreateSingleLinkWithIndexAfterGapTest [6 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.8596151Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.CreationDuringUpdateTest [4 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.8597082Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.UpdateSingleLinkTest [4 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.8598911Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.CreateSingleLinkWithIndexTest [7 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.8642094Z [xUnit.net 00:00:02.53] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateNamedLinkWithMissingNamedReferences_ShouldThrowException [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.8643894Z [xUnit.net 00:00:02.53] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmp4yhfrb.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.8646286Z [xUnit.net 00:00:02.53] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.8647751Z [xUnit.net 00:00:02.53] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.8649732Z [xUnit.net 00:00:02.53] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.8657407Z [xUnit.net 00:00:02.53] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1743,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateNamedLinkWithMissingNamedReferences_ShouldThrowException() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.8659734Z [xUnit.net 00:00:02.53] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.8660876Z [xUnit.net 00:00:02.53] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9050893Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.MixedQueryProcessor.DeletionDuringUpdateTest [4 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9052238Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateNamedLinkWithMissingNamedReferences_ShouldThrowException [948 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9053139Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9053749Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmp4yhfrb.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9054253Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9054522Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9055416Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9056785Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateNamedLinkWithMissingNamedReferences_ShouldThrowException() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1743 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9057769Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9058293Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9058840Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.BasicQueryProcessor.DeleteSingleLinkTest_Source2Target2 [10 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9059437Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.BasicQueryProcessor.DeleteMultipleLinksTest [4 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9060005Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.BasicQueryProcessor.CreateSingleLinkTest [5 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9060548Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.BasicQueryProcessor.UpdateSingleLinkTest [4 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9061116Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.BasicQueryProcessor.CreateLinkWithSource2Target2Test [6 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9061696Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.BasicQueryProcessor.MultipleUpdatesTest [8 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9129372Z [Test] All links: (1: 1->1) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9141736Z [xUnit.net 00:00:02.58] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateLinkWithIntegerId_ShouldCreateSingleLink [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9146523Z [xUnit.net 00:00:02.58] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmp3toj5d.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9147542Z [xUnit.net 00:00:02.58] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9148258Z [xUnit.net 00:00:02.58] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9152750Z [xUnit.net 00:00:02.58] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9175282Z [xUnit.net 00:00:02.58] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1172,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateLinkWithIntegerId_ShouldCreateSingleLink() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9177214Z [xUnit.net 00:00:02.58] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9178359Z [xUnit.net 00:00:02.58] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9459043Z [xUnit.net 00:00:02.61] Foundation.Data.Doublets.Cli.Tests.Issue62ReviewCoverageTests.ExplicitNumericIdUpdate_CanBeReversedWithAnotherUpdate [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9460795Z [xUnit.net 00:00:02.61] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpxvcamx.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9462152Z [xUnit.net 00:00:02.61] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9462856Z [xUnit.net 00:00:02.61] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9464756Z [xUnit.net 00:00:02.61] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\Issue62ReviewCoverageTests.cs(61,0): at Foundation.Data.Doublets.Cli.Tests.Issue62ReviewCoverageTests.RunTestWithLinks(Action`1 testAction) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9468039Z [xUnit.net 00:00:02.61] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\Issue62ReviewCoverageTests.cs(15,0): at Foundation.Data.Doublets.Cli.Tests.Issue62ReviewCoverageTests.ExplicitNumericIdUpdate_CanBeReversedWithAnotherUpdate() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9469937Z [xUnit.net 00:00:02.61] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9471204Z [xUnit.net 00:00:02.61] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9493238Z [xUnit.net 00:00:02.61] Foundation.Data.Doublets.Cli.Tests.Issue62ReviewCoverageTests.NamedLink_CreateDeleteRecreate_DoesNotLeaveStaleNameMapping [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9494807Z [xUnit.net 00:00:02.61] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpytvjqt.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9496000Z [xUnit.net 00:00:02.61] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9496576Z [xUnit.net 00:00:02.61] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9498150Z [xUnit.net 00:00:02.61] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\Issue62ReviewCoverageTests.cs(61,0): at Foundation.Data.Doublets.Cli.Tests.Issue62ReviewCoverageTests.RunTestWithLinks(Action`1 testAction) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9501973Z [xUnit.net 00:00:02.61] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\Issue62ReviewCoverageTests.cs(31,0): at Foundation.Data.Doublets.Cli.Tests.Issue62ReviewCoverageTests.NamedLink_CreateDeleteRecreate_DoesNotLeaveStaleNameMapping() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9503923Z [xUnit.net 00:00:02.61] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9505073Z [xUnit.net 00:00:02.61] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9721393Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.BasicQueryProcessor.CreateMultipleLinksTest [4 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9722533Z Passed Foundation.Data.Doublets.Cli.Tests.Tests.BasicQueryProcessor.DeleteSingleLinkTest_Source1Target2 [4 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9724699Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateLinkWithIntegerId_ShouldCreateSingleLink [50 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9725740Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9726471Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmp3toj5d.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9727217Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9727768Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9729054Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9731408Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateLinkWithIntegerId_ShouldCreateSingleLink() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1172 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9733038Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9733764Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9734670Z Failed Foundation.Data.Doublets.Cli.Tests.Issue62ReviewCoverageTests.ExplicitNumericIdUpdate_CanBeReversedWithAnotherUpdate [31 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9735392Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9736040Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpxvcamx.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9736805Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9737073Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9738195Z at Foundation.Data.Doublets.Cli.Tests.Issue62ReviewCoverageTests.RunTestWithLinks(Action`1 testAction) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\Issue62ReviewCoverageTests.cs:line 61 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9740136Z at Foundation.Data.Doublets.Cli.Tests.Issue62ReviewCoverageTests.ExplicitNumericIdUpdate_CanBeReversedWithAnotherUpdate() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\Issue62ReviewCoverageTests.cs:line 15 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9741648Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9742509Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9743792Z Failed Foundation.Data.Doublets.Cli.Tests.Issue62ReviewCoverageTests.NamedLink_CreateDeleteRecreate_DoesNotLeaveStaleNameMapping [3 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9744560Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9745281Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpytvjqt.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9746087Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9746421Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9748338Z at Foundation.Data.Doublets.Cli.Tests.Issue62ReviewCoverageTests.RunTestWithLinks(Action`1 testAction) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\Issue62ReviewCoverageTests.cs:line 61 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9750393Z at Foundation.Data.Doublets.Cli.Tests.Issue62ReviewCoverageTests.NamedLink_CreateDeleteRecreate_DoesNotLeaveStaleNameMapping() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\Issue62ReviewCoverageTests.cs:line 31 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9751868Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9752740Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9753698Z Passed Foundation.Data.Doublets.Cli.Tests.UnicodeStringStorageTests.CreateAndRetriveUserDefinedTypeTest [6 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9755145Z Passed Foundation.Data.Doublets.Cli.Tests.UnicodeStringStorageTests.CreateAndRetrieveMultipleStringTypesTest(typeName: "UnicodeSymbol") [4 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:34.9756585Z Passed Foundation.Data.Doublets.Cli.Tests.UnicodeStringStorageTests.CreateAndRetrieveMultipleStringTypesTest(typeName: "EmptyString") [8 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.1020788Z Passed Foundation.Data.Doublets.Cli.Tests.UnicodeStringStorageTests.CreateAndRetrieveMultipleStringTypesTest(typeName: "String") [51 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.1022743Z Passed Foundation.Data.Doublets.Cli.Tests.UnicodeStringStorageTests.CreateAndRetrieveMultipleStringTypesTest(typeName: "Name") [14 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.1023674Z Passed Foundation.Data.Doublets.Cli.Tests.UnicodeStringStorageTests.CreateAndRetrieveMultipleStringTypesTest(typeName: "UnicodeSequence") [5 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.1024556Z Passed Foundation.Data.Doublets.Cli.Tests.UnicodeStringStorageTests.CreateAndRetrieveMultipleStringTypesTest(typeName: "Type") [7 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.1025383Z Passed Foundation.Data.Doublets.Cli.Tests.UnicodeStringStorageTests.NameIsRemovedWhenExternalReferenceIsDeletedTest [21 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.1026046Z Passed Foundation.Data.Doublets.Cli.Tests.UnicodeStringStorageTests.NameExternalReferenceTest [8 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.1026652Z Passed Foundation.Data.Doublets.Cli.Tests.UnicodeStringStorageTests.CreateAndRetrieveUnicodeStringTest [8 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.1027468Z Passed Foundation.Data.Doublets.Cli.Tests.UnicodeStringStorageTests.CreateAndRetrieveSimpleStringTest [4 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.1028162Z Passed Foundation.Data.Doublets.Cli.Tests.UnicodeStringStorageTests.DeletingNonNamedLinkDoesNotAffectOtherNamesTest [6 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4637978Z [Test] All links: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4646850Z [xUnit.net 00:00:03.13] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteAllLinksByIndexTest [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4648432Z [xUnit.net 00:00:03.13] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpgrazxw.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4649900Z [xUnit.net 00:00:03.13] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4650509Z [xUnit.net 00:00:03.13] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4652439Z [xUnit.net 00:00:03.13] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4655502Z [xUnit.net 00:00:03.13] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(810,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteAllLinksByIndexTest() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4657351Z [xUnit.net 00:00:03.13] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4658841Z [xUnit.net 00:00:03.13] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4672177Z [Test] All links: (1: 1->1) (2: 2->2) (3: 1->2) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4684762Z [xUnit.net 00:00:03.13] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateNamedFamilyLinksTest [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4686415Z [xUnit.net 00:00:03.13] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmp2a4zow.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4687698Z [xUnit.net 00:00:03.13] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4688281Z [xUnit.net 00:00:03.13] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4690104Z [xUnit.net 00:00:03.13] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4693392Z [xUnit.net 00:00:03.13] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(827,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateNamedFamilyLinksTest() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4695226Z [xUnit.net 00:00:03.13] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4696432Z [xUnit.net 00:00:03.13] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4703294Z [Test] All links: (1: 1->2) (2: 1->1) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4710271Z [xUnit.net 00:00:03.13] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeduplicateDuplicatePairWithNumericLinks_ShouldCreateOnlyOneSubLink [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4712116Z [xUnit.net 00:00:03.13] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpnaur1f.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4713093Z [xUnit.net 00:00:03.13] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4713583Z [xUnit.net 00:00:03.13] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4715313Z [xUnit.net 00:00:03.13] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4717340Z [xUnit.net 00:00:03.13] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1308,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeduplicateDuplicatePairWithNumericLinks_ShouldCreateOnlyOneSubLink() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4718873Z [xUnit.net 00:00:03.13] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4719974Z [xUnit.net 00:00:03.13] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4745843Z [Test] All links: (1: 1->1) (2: 2->2) (3: 2->1) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4755736Z [xUnit.net 00:00:03.14] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.StringAliasesInVariableRestriction_ShouldConstrainMatchesToNamedLinks [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4757556Z [xUnit.net 00:00:03.14] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpyp51gq.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4758909Z [xUnit.net 00:00:03.14] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4759793Z [xUnit.net 00:00:03.14] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4761620Z [xUnit.net 00:00:03.14] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4765861Z [xUnit.net 00:00:03.14] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1506,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.StringAliasesInVariableRestriction_ShouldConstrainMatchesToNamedLinks() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4768704Z [xUnit.net 00:00:03.14] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4769886Z [xUnit.net 00:00:03.14] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4773162Z [Test] All links: (2: 2->2) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4780912Z Passed Foundation.Data.Doublets.Cli.Tests.UnicodeStringStorageTests.CreateAndRetrieveEmptyStringTest [4 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4787349Z [xUnit.net 00:00:03.14] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateSingleLinkWithIndexAfterGapTest [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4789153Z Passed Foundation.Data.Doublets.Cli.Tests.UnicodeStringStorageTests.RetrieveTypeByNameTest [187 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4790853Z Passed Foundation.Data.Doublets.Cli.Tests.UnicodeStringStorageTests.CreateAndRetrieveMultipleStringsTest [51 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4792054Z Passed Foundation.Data.Doublets.Cli.Tests.UnicodeStringStorageTests.NameIsRemovedWhenLinkIsDeletedTest [6 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4793885Z Passed Foundation.Data.Doublets.Cli.Tests.UnicodeStringStorageTests.ExternalReferenceCanUseNameThatAlreadyExistsInternallyTest [112 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4795329Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteAllLinksByIndexTest [550 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4796072Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4796814Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpgrazxw.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4797857Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4798145Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4799512Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4801633Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteAllLinksByIndexTest() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 810 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4803126Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4804028Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4804940Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateNamedFamilyLinksTest [3 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4805570Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4806309Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmp2a4zow.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4807128Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4807408Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4808858Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4811111Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateNamedFamilyLinksTest() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 827 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4812692Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4813841Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4815029Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeduplicateDuplicatePairWithNumericLinks_ShouldCreateOnlyOneSubLink [2 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4815933Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4816393Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpnaur1f.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4816877Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4817232Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4818654Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4822626Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeduplicateDuplicatePairWithNumericLinks_ShouldCreateOnlyOneSubLink() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1308 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4825553Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4826444Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4828170Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.StringAliasesInVariableRestriction_ShouldConstrainMatchesToNamedLinks [4 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4829124Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4829889Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpyp51gq.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4830689Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4830979Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4832279Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4834628Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.StringAliasesInVariableRestriction_ShouldConstrainMatchesToNamedLinks() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1506 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4836484Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4837861Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4839250Z [xUnit.net 00:00:03.14] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmp51fhsc.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4840388Z [xUnit.net 00:00:03.14] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4840934Z [xUnit.net 00:00:03.14] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4842680Z [xUnit.net 00:00:03.14] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4845591Z [xUnit.net 00:00:03.14] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(46,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateSingleLinkWithIndexAfterGapTest() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4847517Z [xUnit.net 00:00:03.14] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4851185Z [xUnit.net 00:00:03.14] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4853813Z [xUnit.net 00:00:03.15] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeduplicateDuplicatePairWithNamedLinks_ShouldCreateOnlyOneSubLink [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4855604Z [xUnit.net 00:00:03.15] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateNamedLinkWithAutoCreateMissingNamedReferences_ShouldCreatePointLinks [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4860287Z [Test] All links: (1: 1->1) (2: 2->2) (3: 2->1) (4: 3->3) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4862144Z [xUnit.net 00:00:03.15] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmphwh3rd.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4864618Z [xUnit.net 00:00:03.15] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4865232Z [xUnit.net 00:00:03.15] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4866976Z [xUnit.net 00:00:03.15] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4869839Z [xUnit.net 00:00:03.15] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1267,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeduplicateDuplicatePairWithNamedLinks_ShouldCreateOnlyOneSubLink() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4872033Z [xUnit.net 00:00:03.15] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4873319Z [xUnit.net 00:00:03.15] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4874126Z [Test] All links: (1: 1->1) (2: 2->2) (3: 1->2) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4875324Z [xUnit.net 00:00:03.15] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpa02f0q.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4876949Z [xUnit.net 00:00:03.15] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4878493Z [xUnit.net 00:00:03.15] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4881274Z [xUnit.net 00:00:03.15] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4884312Z [xUnit.net 00:00:03.15] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1772,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateNamedLinkWithAutoCreateMissingNamedReferences_ShouldCreatePointLinks() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4886531Z [xUnit.net 00:00:03.15] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4887766Z [xUnit.net 00:00:03.15] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateMultipleLinksWithCrossReferences_ShouldSucceed [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4897534Z [xUnit.net 00:00:03.15] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4897992Z [Test] All links: (1: 1->2) (2: 2->1) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4898864Z [xUnit.net 00:00:03.15] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpunk0tn.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4899437Z [xUnit.net 00:00:03.15] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4899977Z [xUnit.net 00:00:03.15] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4901673Z [xUnit.net 00:00:03.15] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4904275Z [xUnit.net 00:00:03.15] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1690,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateMultipleLinksWithCrossReferences_ShouldSucceed() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4906982Z [xUnit.net 00:00:03.15] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4908276Z [xUnit.net 00:00:03.15] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4913845Z [xUnit.net 00:00:03.15] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.MakeAllLinksToGoIntoFirstLinkUsingVariablesTest [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4914841Z [Test] All links: (1: 2->1) (2: 1->1) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4915216Z [Test] ===== Starting UpdateNamedLinkNameTest ===== +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4916266Z [xUnit.net 00:00:03.15] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmp0a0kwp.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4917237Z [xUnit.net 00:00:03.15] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4918050Z [xUnit.net 00:00:03.15] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4920043Z [xUnit.net 00:00:03.15] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4923211Z [xUnit.net 00:00:03.16] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(517,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.MakeAllLinksToGoIntoFirstLinkUsingVariablesTest() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4925257Z [xUnit.net 00:00:03.16] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4926482Z [xUnit.net 00:00:03.16] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4927598Z [Trace] Constructing NamedTypesDecorator with names DB: C:\Users\runneradmin\AppData\Local\Temp\tmp0hmfm0.names.links +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4940535Z [Test] Constants: Null=0, Any=4294967292, Continue=4294967295 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4940990Z [Test] Step 1: Creating initial link +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4941538Z [Test] Query: (() ((child: father mother))) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4942818Z [ProcessQuery] Query: "(() ((child: father mother)))" +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4946490Z [ProcessQuery] Parser returned 1 top-level link(s). +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4948111Z [ProcessQuery] Restriction link => Id="" Values.Count=0 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4949927Z [ProcessQuery] Substitution link => Id="" Values.Count=1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4953071Z [ProcessQuery] No restriction, but substitution is non-empty => creation scenario. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4954253Z [ValidateLinksExistOrWillBeCreated] Starting validation +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4954920Z [ValidateLinksExistOrWillBeCreated] Numeric links to be created: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4955646Z [ValidateLinksExistOrWillBeCreated] Named links to be created: child +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4956253Z [Trace] GetByName called for name: 'father' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4956597Z [Trace] GetByName result: 0 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4956989Z [Trace] GetByName called for name: 'mother' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4957405Z [Trace] GetByName result: 0 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4957777Z [Trace] GetByName called for name: 'father' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4958339Z [Trace] GetByName result: 0 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4959050Z [ValidateLinksExistOrWillBeCreated] Auto-creating missing named reference 'father' as point link. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4959781Z [Trace] GetByName called for name: 'father' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4960206Z [Trace] GetByName result: 0 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4960823Z [Trace] Update called with restriction: [1] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4963856Z [Trace] Debug: handlerWrapper invoked - before=1,0,0, after=1,0,0 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4964502Z [Trace] Update result: 4294967295 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4967335Z [Trace] SetName called for link: 1 with name: 'father' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4968028Z [Trace] RemoveName called for link: 1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4968362Z [Trace] RemoveName completed for link: 1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4968937Z [Trace] SetName result: 108 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4969294Z [Trace] Update called with restriction: [1,0,0] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4969748Z [Trace] Debug: handlerWrapper invoked - before=1,0,0, after=1,1,1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4970184Z [Trace] Update result: 4294967295 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4970516Z [Trace] GetByName called for name: 'mother' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4970826Z [Trace] GetByName result: 0 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4982431Z [ValidateLinksExistOrWillBeCreated] Auto-creating missing named reference 'mother' as point link. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4983090Z [Trace] GetByName called for name: 'mother' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4983405Z [Trace] GetByName result: 0 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4983716Z [Trace] Update called with restriction: [2] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4984158Z [Trace] Debug: handlerWrapper invoked - before=2,0,0, after=2,0,0 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4984589Z [Trace] Update result: 4294967295 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4985236Z [Trace] SetName called for link: 2 with name: 'mother' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4985785Z [Trace] RemoveName called for link: 2 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4986264Z [Trace] RemoveName completed for link: 2 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4986580Z [Trace] SetName result: 110 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4986913Z [Trace] Update called with restriction: [2,0,0] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4987357Z [Trace] Debug: handlerWrapper invoked - before=2,0,0, after=2,2,2 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4987773Z [Trace] Update result: 4294967295 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4988167Z [ValidateLinksExistOrWillBeCreated] Validation completed +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4988602Z [Trace] GetByName called for name: 'father' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4988941Z [Trace] GetByName result: 1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4989440Z [EnsureNestedLinkCreatedRecursively] Found existing named leaf 'father' => ID=1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4990004Z [Trace] GetByName called for name: 'mother' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4990346Z [Trace] GetByName result: 2 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4990860Z [EnsureNestedLinkCreatedRecursively] Found existing named leaf 'mother' => ID=2 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4991449Z [EnsureLinkCreated] Creating link for (S=1, T=2). +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4991834Z [EnsureLinkCreated] => assigned new ID=3 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4992208Z [Trace] Update called with restriction: [3] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4992687Z [Trace] Debug: handlerWrapper invoked - before=3,0,0, after=3,1,2 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4993335Z [Trace] Update result: 4294967295 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4994021Z [EnsureNestedLinkCreatedRecursively] Created or ensured composite link => Index=0, Source=1, Target=2 => Actual ID=3 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4994729Z [Trace] SetName called for link: 3 with name: 'child' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4995110Z [Trace] RemoveName called for link: 3 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4995434Z [Trace] RemoveName completed for link: 3 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4996026Z [Trace] SetName result: 118 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4996403Z [ProcessQuery] Created link ID #3 from substitution pattern. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4996810Z [Test] Initial link creation completed +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4997133Z [Test] Step 2: Verifying initial state +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4997461Z [Trace] GetByName called for name: 'child' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4998136Z [Trace] GetByName result: 3 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4998448Z [Test] Initial child ID: 3 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4998757Z [Trace] GetByName called for name: 'father' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4999275Z [Trace] GetByName result: 1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4999560Z [Test] Initial father ID: 1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.4999852Z [Trace] GetByName called for name: 'mother' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5000159Z [Trace] GetByName result: 2 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5000397Z [Test] Initial mother ID: 2 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5000613Z [Test] Initial links count: 3 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5000962Z [Test] Initial link: Index=(1: 1->1), Source=1, Target=1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5001342Z [Test] Initial link: Index=(2: 2->2), Source=2, Target=2 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5001744Z [Test] Initial link: Index=(3: 1->2), Source=1, Target=2 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5002318Z [Test] Initial state verification completed +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5002779Z [Test] Step 3: Updating link name from 'child' to 'son' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5005512Z [Test] Query: (((child: father mother)) ((son: father mother))) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5006536Z [Test] Current state before update: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5007212Z [Trace] GetByName called for name: 'child' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5007767Z [Trace] GetByName result: 3 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5008474Z [Test] - child name exists: True +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5009299Z [Trace] GetByName called for name: 'son' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5010063Z [Trace] GetByName result: 0 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5010570Z [Test] - son name exists: False +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5011224Z [Trace] GetByName called for name: 'father' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5011761Z [Trace] GetByName result: 1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5012274Z [Test] - father name exists: True +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5012941Z [Trace] GetByName called for name: 'mother' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5014089Z [Trace] GetByName result: 2 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5014413Z [Test] - mother name exists: True +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5014739Z [Test] Starting ProcessQuery for update... +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5015091Z [Test] Current links before update: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5015437Z [Test] Link: Index=(1: 1->1), Source=1, Target=1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5015828Z [Test] Link: Index=(2: 2->2), Source=2, Target=2 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5016519Z [Test] Link: Index=(3: 1->2), Source=1, Target=2 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5017177Z [ProcessQuery] Query: "(((child: father mother)) ((son: father mother)))" +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5017854Z [ProcessQuery] Parser returned 1 top-level link(s). +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5018320Z [ProcessQuery] Restriction link => Id="" Values.Count=1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5018775Z [ProcessQuery] Substitution link => Id="" Values.Count=1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5019196Z [ProcessQuery] Restriction patterns to parse: 1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5019599Z [ProcessQuery] Substitution patterns to parse: 1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5020032Z [ValidateLinksExistOrWillBeCreated] Starting validation +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5020560Z [ValidateLinksExistOrWillBeCreated] Numeric links to be created: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5021132Z [ValidateLinksExistOrWillBeCreated] Named links to be created: son +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5021598Z [Trace] GetByName called for name: 'child' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5021925Z [Trace] GetByName result: 3 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5022385Z [ValidateReferencesInPattern] Named link 'child' reference validated in restriction pattern +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5022905Z [Trace] GetByName called for name: 'father' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5023195Z [Trace] GetByName result: 1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5023670Z [ValidateReferencesInPattern] Named link 'father' reference validated in restriction pattern +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5024193Z [Trace] GetByName called for name: 'mother' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5024476Z [Trace] GetByName result: 2 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5024957Z [ValidateReferencesInPattern] Named link 'mother' reference validated in restriction pattern +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5025473Z [Trace] GetByName called for name: 'father' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5025763Z [Trace] GetByName result: 1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5026239Z [ValidateReferencesInPattern] Named link 'father' reference validated in substitution pattern +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5026742Z [Trace] GetByName called for name: 'mother' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5027011Z [Trace] GetByName result: 2 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5027682Z [ValidateReferencesInPattern] Named link 'mother' reference validated in substitution pattern +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5028324Z [ValidateLinksExistOrWillBeCreated] Validation completed +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5029061Z [ProcessQuery] Detected single sub-link with 2 sub-values => replaced with one composite restriction pattern. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5029745Z [ProcessQuery] Converting restriction patterns => done. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5030204Z [ProcessQuery] Converting substitution patterns => done. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5030675Z [ProcessQuery] Finding solutions for restriction patterns... +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5031100Z [Trace] GetByName called for name: 'child' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5031574Z [Trace] GetByName result: 3 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5031907Z [Trace] GetByName called for name: 'father' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5032232Z [Trace] GetByName result: 1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5032531Z [Trace] GetByName called for name: 'mother' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5032847Z [Trace] GetByName result: 2 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5033290Z [ProcessQuery] Found 1 total solution(s) matching restriction patterns. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5033769Z [Trace] GetByName called for name: 'child' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5034096Z [Trace] GetByName result: 3 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5034404Z [Trace] GetByName called for name: 'father' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5034729Z [Trace] GetByName result: 1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5035029Z [Trace] GetByName called for name: 'mother' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5035347Z [Trace] GetByName result: 2 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5035648Z [Trace] GetByName called for name: 'son' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5035954Z [Trace] GetByName result: 0 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5036210Z [Trace] GetByName called for name: 'father' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5036488Z [Trace] GetByName result: 1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5036662Z [Trace] GetByName called for name: 'mother' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5037156Z [Trace] GetByName result: 2 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5037349Z [ProcessQuery] allSolutionsNoOperation=False +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5037655Z [ProcessQuery] Some solutions lead to actual changes => building operations. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5037942Z [Trace] GetByName called for name: 'son' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5038137Z [Trace] GetByName result: 0 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5038314Z [Trace] GetByName called for name: 'father' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5038503Z [Trace] GetByName result: 1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5038667Z [Trace] GetByName called for name: 'mother' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5038860Z [Trace] GetByName result: 2 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5039030Z [Trace] GetByName called for name: 'child' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5039218Z [Trace] GetByName result: 3 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5039394Z [Trace] GetByName called for name: 'father' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5039577Z [Trace] GetByName result: 1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5039750Z [Trace] GetByName called for name: 'mother' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5039927Z [Trace] GetByName result: 2 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5040693Z [xUnit.net 00:00:03.16] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.UpdateNamedLinkNameTest [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5041978Z [xUnit.net 00:00:03.16] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.Create6LevelNestedLinksTest [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5042988Z [ProcessQuery] For a solution => substitution links count=1, restriction links count=1. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5043581Z [ProcessQuery] => 2 operation(s) derived from these patterns. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5044304Z [ProcessQuery] All planned operations => 2 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5044889Z [ProcessQuery] Applying all planned operations... +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5045432Z [ApplyAllPlannedOperations] Operation: before=(3:1->2), after=(0:0->0) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5048001Z [Trace] GetName called for link: 3 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5048562Z [Trace] GetName result: child +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5049737Z [ApplyAllPlannedOperations] Name for before.Index 3 = 'child' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5052226Z [ApplyAllPlannedOperations] Deleting link => ID=3, S=1, T=2 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5053153Z [RemoveLinks] Found 1 link(s) matching (ID=3, S=1, T=2). +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5053570Z [Trace] RemoveName called for link: 3 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5054075Z [Trace] RemoveName completed for link: 3 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5054443Z [RemoveLinks] Deleting link => ID=3, S=1, T=2 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5054811Z [Trace] Delete called with restriction: [3,1,2] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5055481Z [Trace] Debug: this._links is of type: Foundation.Data.Doublets.Cli.PinnedTypesDecorator`1[System.UInt32] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5056121Z [Trace] Debug: Calling underlying _links.Delete +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5056589Z [Trace] Debug: handlerWrapper invoked - before=3,1,2, after=3,0,0 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5057281Z [Test] Update ChangesHandler called: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5057592Z [Test] - Before state: (3: 1->2) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5058039Z [Test] - After state: (3: 0->0) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5058318Z [Trace] GetByName called for name: 'child' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5058637Z [Trace] GetByName result: 0 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5058920Z [Test] - child name during change: 0 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5059246Z [Trace] GetByName called for name: 'son' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5059548Z [Trace] GetByName result: 0 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5059825Z [Test] - son name during change: 0 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5060146Z [Trace] GetByName called for name: 'father' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5060458Z [Trace] GetByName result: 1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5060734Z [Test] - father name during change: 1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5061065Z [Trace] GetByName called for name: 'mother' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5061382Z [Trace] GetByName result: 2 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5061655Z [Test] - mother name during change: 2 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5061959Z [Test] - All links during change: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5062289Z [Test] Link: Index=(1: 1->1), Source=1, Target=1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5062681Z [Test] Link: Index=(2: 2->2), Source=2, Target=2 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5063033Z [Test] Link: Index=(3: 0->0), Source=0, Target=0 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5063468Z [Trace] Debug: handlerWrapper invoked - before=3,0,0, after=null +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5063900Z [Trace] RemoveName called for link: 3 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5064224Z [Trace] RemoveName completed for link: 3 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5064572Z [Test] Update ChangesHandler called: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5064887Z [Test] - Before state: (3: 0->0) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5065168Z [Test] - After state: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5065446Z [Trace] GetByName called for name: 'child' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5065779Z [Trace] GetByName result: 0 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5066062Z [Test] - child name during change: 0 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5066391Z [Trace] GetByName called for name: 'son' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5066703Z [Trace] GetByName result: 0 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5066986Z [Test] - son name during change: 0 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5067319Z [Trace] GetByName called for name: 'father' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5067648Z [Trace] GetByName result: 1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5067935Z [Test] - father name during change: 1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5068252Z [Trace] GetByName called for name: 'mother' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5068539Z [Trace] GetByName result: 2 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5068791Z [Test] - mother name during change: 2 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5069095Z [Test] - All links during change: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5069414Z [Test] Link: Index=(1: 1->1), Source=1, Target=1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5069789Z [Test] Link: Index=(2: 2->2), Source=2, Target=2 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5070137Z [Trace] Debug: Delete result: 4294967295 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5070596Z [ApplyAllPlannedOperations] Operation: before=(0:0->0), after=(4294967292:1->2) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5071086Z [Trace] GetName called for link: 4294967292 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5071403Z [Trace] GetName result: String +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5071885Z [ApplyAllPlannedOperations] Name for after.Index 4294967292 = 'String' (pre-op) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5072506Z [ApplyAllPlannedOperations] Creating link => ID=4294967292, S=1, T=2 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5074174Z [CreateOrUpdateLink] Detected wildcard substitution => nested create & name. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5074814Z [Trace] GetByName called for name: 'father' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5075144Z [Trace] GetByName result: 1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5081241Z [EnsureNestedLinkCreatedRecursively] Found existing named leaf 'father' => ID=1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5082870Z [Trace] GetByName called for name: 'mother' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5084236Z [Trace] GetByName result: 2 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5084734Z [EnsureNestedLinkCreatedRecursively] Found existing named leaf 'mother' => ID=2 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5085320Z [EnsureLinkCreated] Creating link for (S=1, T=2). +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5085693Z [EnsureLinkCreated] => assigned new ID=3 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5086034Z [Test] Update ChangesHandler called: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5086327Z [Test] - Before state: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5086584Z [Test] - After state: (3: 0->0) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5086904Z [Trace] GetByName called for name: 'child' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5087707Z [Trace] GetByName result: 0 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5087979Z [Test] - child name during change: 0 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5088433Z [Trace] GetByName called for name: 'son' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5088876Z [Trace] GetByName result: 0 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5089152Z [Test] - son name during change: 0 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5089483Z [Trace] GetByName called for name: 'father' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5089807Z [Trace] GetByName result: 1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5090066Z [Test] - father name during change: 1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5090402Z [Trace] GetByName called for name: 'mother' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5090709Z [Trace] GetByName result: 2 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5090986Z [Test] - mother name during change: 2 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5091279Z [Test] - All links during change: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5091628Z [Test] Link: Index=(1: 1->1), Source=1, Target=1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5091999Z [Test] Link: Index=(2: 2->2), Source=2, Target=2 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5092376Z [Test] Link: Index=(3: 0->0), Source=0, Target=0 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5092782Z [Test] Creating new link: Index=3, Source=0, Target=0 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5093146Z [Test] Checking if link exists: True +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5093473Z [Test] Checking if source exists: False +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5096024Z [Test] Checking if target exists: False +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5096421Z [Test] Names before creation: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5096737Z [Trace] GetByName called for name: 'child' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5097063Z [Trace] GetByName result: 0 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5097295Z [Test] - child: 0 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5097554Z [Trace] GetByName called for name: 'son' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5097861Z [Trace] GetByName result: 0 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5098089Z [Test] - son: 0 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5098324Z [Trace] GetByName called for name: 'father' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5098632Z [Trace] GetByName result: 1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5098857Z [Test] - father: 1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5099100Z [Trace] GetByName called for name: 'mother' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5099431Z [Trace] GetByName result: 2 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5099633Z [Test] - mother: 2 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5099875Z [Trace] Update called with restriction: [3] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5100287Z [Trace] Debug: handlerWrapper invoked - before=3,0,0, after=3,1,2 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5100685Z [Test] Update ChangesHandler called: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5100995Z [Test] - Before state: (3: 0->0) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5101295Z [Test] - After state: (3: 1->2) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5101575Z [Trace] GetByName called for name: 'child' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5101879Z [Trace] GetByName result: 0 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5102151Z [Test] - child name during change: 0 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5102487Z [Trace] GetByName called for name: 'son' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5102749Z [Trace] GetByName result: 0 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5102976Z [Test] - son name during change: 0 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5103278Z [Trace] GetByName called for name: 'father' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5103578Z [Trace] GetByName result: 1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5103869Z [Test] - father name during change: 1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5104156Z [Trace] GetByName called for name: 'mother' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5104821Z [Trace] GetByName result: 2 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5105326Z [Test] - mother name during change: 2 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5105617Z [Test] - All links during change: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5105963Z [Test] Link: Index=(1: 1->1), Source=1, Target=1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5106526Z [Test] Link: Index=(2: 2->2), Source=2, Target=2 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5106905Z [Test] Link: Index=(3: 1->2), Source=1, Target=2 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5107240Z [Trace] Update result: 4294967295 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5107936Z [EnsureNestedLinkCreatedRecursively] Created or ensured composite link => Index=0, Source=1, Target=2 => Actual ID=3 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5108683Z [Trace] SetName called for link: 3 with name: 'son' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5109052Z [Trace] RemoveName called for link: 3 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5109390Z [Trace] RemoveName completed for link: 3 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5109706Z [Trace] SetName result: 118 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5110148Z [Trace] GetName called for link: 4294967292 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5110481Z [Trace] GetName result: String +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5110986Z [ApplyAllPlannedOperations] Name for after.Index 4294967292 = 'String' (post-op) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5111579Z [ProcessQuery] Restoring unexpected deletions if any... +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5112113Z [RestoreUnexpectedLinkDeletions] No unexpected deletions found. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5112591Z [ProcessQuery] Finished processing query. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5112928Z [Test] Update operation completed +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5113230Z [Test] Step 4: Verifying final state +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5113512Z [Trace] GetByName called for name: 'child' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5113834Z [Trace] GetByName result: 0 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5114087Z [Test] Final child ID: 0 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5114370Z [Trace] GetByName called for name: 'son' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5114661Z [Trace] GetByName result: 3 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5115117Z [Test] Final son ID: 3 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5115395Z [Trace] GetByName called for name: 'father' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5115718Z [Trace] GetByName result: 1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5115984Z [Test] Final father ID: 1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5116265Z [Trace] GetByName called for name: 'mother' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5116582Z [Trace] GetByName result: 2 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5116822Z [Test] Final mother ID: 2 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5117067Z [Test] Final links count: 3 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5117376Z [Test] Final link: Index=(1: 1->1), Source=1, Target=1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5117787Z [Test] Final link: Index=(2: 2->2), Source=2, Target=2 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5118175Z [Test] Final link: Index=(3: 1->2), Source=1, Target=2 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5118575Z [Test] ===== UpdateNamedLinkNameTest completed successfully ===== +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5119610Z [xUnit.net 00:00:03.16] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmp0hmfm0.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5120488Z [xUnit.net 00:00:03.16] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5121008Z [xUnit.net 00:00:03.16] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5122701Z [xUnit.net 00:00:03.16] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5125099Z [xUnit.net 00:00:03.16] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(930,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.UpdateNamedLinkNameTest() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5126437Z [xUnit.net 00:00:03.16] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5127437Z [xUnit.net 00:00:03.16] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5128328Z [Test] All links: (1: 1->1) (2: 2->2) (3: 3->3) (4: 4->4) (5: 5->5) (6: 6->6) (7: 5->6) (8: 4->7) (9: 3->8) (10: 2->9) (11: 1->10) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5129375Z [xUnit.net 00:00:03.16] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpf5cgrw.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5130099Z [xUnit.net 00:00:03.16] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5130473Z [xUnit.net 00:00:03.16] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5132074Z [xUnit.net 00:00:03.16] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5134500Z [xUnit.net 00:00:03.16] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(205,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.Create6LevelNestedLinksTest() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5137216Z [xUnit.net 00:00:03.16] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5138368Z [xUnit.net 00:00:03.16] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5142483Z [xUnit.net 00:00:03.17] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateRightCompositeStringChildrenWithoutExtraLeaf_ShouldSucceed [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5146845Z [xUnit.net 00:00:03.17] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateLinkWithAutoCreateMissingNumericReferences_ShouldCreatePointLinks [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5148409Z [xUnit.net 00:00:03.17] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateMultipleLinksTest [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5149215Z [Test] All links: (1: 1->1) (2: 1->2) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5150286Z [xUnit.net 00:00:03.17] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmp4qsslw.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5151482Z [xUnit.net 00:00:03.17] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5152320Z [xUnit.net 00:00:03.17] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5154041Z [xUnit.net 00:00:03.17] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5157154Z [xUnit.net 00:00:03.17] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1241,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateRightCompositeStringChildrenWithoutExtraLeaf_ShouldSucceed() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5159291Z [xUnit.net 00:00:03.17] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5160455Z [xUnit.net 00:00:03.17] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5160881Z [Test] All links: (10: 10->10) (20: 10->20) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5161496Z [xUnit.net 00:00:03.17] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmp3i5nvh.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5162064Z [xUnit.net 00:00:03.17] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5162341Z [xUnit.net 00:00:03.17] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5163295Z [xUnit.net 00:00:03.17] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5165335Z [xUnit.net 00:00:03.17] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1758,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateLinkWithAutoCreateMissingNumericReferences_ShouldCreatePointLinks() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5166656Z [xUnit.net 00:00:03.17] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5168178Z [xUnit.net 00:00:03.17] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5168727Z [Test] All links: (1: 1->1) (2: 2->2) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5169297Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateSingleLinkWithIndexAfterGapTest [2 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5170215Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5174535Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmp51fhsc.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5176541Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5176858Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5178277Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5180519Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateSingleLinkWithIndexAfterGapTest() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 46 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5182120Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5182792Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5183750Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeduplicateDuplicatePairWithNamedLinks_ShouldCreateOnlyOneSubLink [4 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5184321Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5184796Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmphwh3rd.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5185276Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5185463Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5186389Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5187865Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeduplicateDuplicatePairWithNamedLinks_ShouldCreateOnlyOneSubLink() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1267 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5188873Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5189395Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5190142Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateNamedLinkWithAutoCreateMissingNamedReferences_ShouldCreatePointLinks [2 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5191029Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5191776Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpa02f0q.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5192540Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5192825Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5194741Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5197669Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateNamedLinkWithAutoCreateMissingNamedReferences_ShouldCreatePointLinks() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1772 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5202611Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5203515Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5204972Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateMultipleLinksWithCrossReferences_ShouldSucceed [2 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5205968Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5206712Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpunk0tn.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5207496Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5207775Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5209078Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5211291Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateMultipleLinksWithCrossReferences_ShouldSucceed() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1690 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5212892Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5213774Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5214832Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.MakeAllLinksToGoIntoFirstLinkUsingVariablesTest [3 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5215694Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5216455Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmp0a0kwp.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5217479Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5217758Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5219126Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5221454Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.MakeAllLinksToGoIntoFirstLinkUsingVariablesTest() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 517 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5225961Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5228002Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5229323Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.UpdateNamedLinkNameTest [6 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5229998Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5230779Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmp0hmfm0.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5231612Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5231898Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5233272Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5235599Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.UpdateNamedLinkNameTest() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 930 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5237100Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5238260Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5239232Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.Create6LevelNestedLinksTest [2 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5240060Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5240818Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpf5cgrw.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5241634Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5242015Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5243375Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5245850Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.Create6LevelNestedLinksTest() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 205 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5247397Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5248284Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5254811Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateRightCompositeStringChildrenWithoutExtraLeaf_ShouldSucceed [2 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5256555Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5257371Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmp4qsslw.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5258217Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5258494Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5259816Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5262528Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateRightCompositeStringChildrenWithoutExtraLeaf_ShouldSucceed() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1241 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5264330Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5265259Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5266588Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateLinkWithAutoCreateMissingNumericReferences_ShouldCreatePointLinks [2 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5267643Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5268446Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmp3i5nvh.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5269293Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5269564Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5270457Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5272034Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateLinkWithAutoCreateMissingNumericReferences_ShouldCreatePointLinks() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1758 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5273244Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5273783Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5274571Z [xUnit.net 00:00:03.17] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpyqgvnl.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5275959Z [xUnit.net 00:00:03.17] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5276698Z [xUnit.net 00:00:03.17] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5278444Z [xUnit.net 00:00:03.17] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5286194Z [xUnit.net 00:00:03.17] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(93,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateMultipleLinksTest() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5287514Z [xUnit.net 00:00:03.17] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5288240Z [xUnit.net 00:00:03.17] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5288705Z [Test] All links: (1: 1->1) (2: 2->2) (3: 2->1) (4: 3->3) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5289412Z [xUnit.net 00:00:03.18] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeduplicateMixedNamedAndNumericLinks_ShouldReuseExistingLinks [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5290478Z [xUnit.net 00:00:03.18] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.MatchSelfReferencingAndMakeThemGoOutFromFirstLinkUsingVariablesTest [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5291540Z [xUnit.net 00:00:03.18] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateRightCompositeIntegerChildrenWithoutExtraLeaf_ShouldSucceed [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5292535Z [xUnit.net 00:00:03.19] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.EnsureCreated_WithSpecialAnyReference_ShouldThrowControlledException [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5293381Z [xUnit.net 00:00:03.19] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.Create5LevelNestedLinksTest [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5294506Z [xUnit.net 00:00:03.19] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.MatchWithExactIndexAndDelete2LevelNestedLinksTest [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5295479Z [xUnit.net 00:00:03.18] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpfwuvgx.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5296035Z [xUnit.net 00:00:03.18] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5296316Z [xUnit.net 00:00:03.18] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5297289Z [xUnit.net 00:00:03.18] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5299537Z [xUnit.net 00:00:03.18] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1367,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeduplicateMixedNamedAndNumericLinks_ShouldReuseExistingLinks() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5301693Z [xUnit.net 00:00:03.18] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5302938Z [xUnit.net 00:00:03.18] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5303652Z [Test] All links: (1: 1->1) (2: 1->2) (3: 3->1) (4: 1->4) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5304743Z [xUnit.net 00:00:03.18] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpjgwwgi.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5305916Z [xUnit.net 00:00:03.18] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5306393Z [xUnit.net 00:00:03.18] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5308074Z [xUnit.net 00:00:03.18] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5311012Z [xUnit.net 00:00:03.18] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(555,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.MatchSelfReferencingAndMakeThemGoOutFromFirstLinkUsingVariablesTest() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5313124Z [xUnit.net 00:00:03.18] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5314203Z [xUnit.net 00:00:03.18] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5314639Z [Test] All links: (1: 1->1) (2: 1->2) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5315350Z [xUnit.net 00:00:03.18] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmp5qyzew.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5315912Z [xUnit.net 00:00:03.18] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5316190Z [xUnit.net 00:00:03.18] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5317141Z [xUnit.net 00:00:03.18] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5318709Z [xUnit.net 00:00:03.18] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1204,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateRightCompositeIntegerChildrenWithoutExtraLeaf_ShouldSucceed() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5321771Z [xUnit.net 00:00:03.18] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5325907Z [xUnit.net 00:00:03.18] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5328827Z [xUnit.net 00:00:03.19] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpski1wk.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5330810Z [xUnit.net 00:00:03.19] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5331313Z [xUnit.net 00:00:03.19] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5333059Z [xUnit.net 00:00:03.19] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5335721Z [xUnit.net 00:00:03.19] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1569,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.EnsureCreated_WithSpecialAnyReference_ShouldThrowControlledException() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5337050Z [xUnit.net 00:00:03.19] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5337925Z [xUnit.net 00:00:03.19] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5338439Z [Test] All links: (1: 1->1) (2: 2->2) (3: 3->3) (4: 4->4) (5: 5->5) (6: 4->5) (7: 3->6) (8: 2->7) (9: 1->8) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5339126Z [xUnit.net 00:00:03.19] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmptwl3e4.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5339788Z [xUnit.net 00:00:03.19] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5340080Z [xUnit.net 00:00:03.19] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5341036Z [xUnit.net 00:00:03.19] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5342400Z [xUnit.net 00:00:03.19] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(166,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.Create5LevelNestedLinksTest() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5343385Z [xUnit.net 00:00:03.19] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5344043Z [xUnit.net 00:00:03.19] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5344440Z [Test] All links: (1: 1->1) (2: 2->2) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5345349Z [xUnit.net 00:00:03.19] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpyhcsup.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5346281Z [xUnit.net 00:00:03.19] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5346745Z [xUnit.net 00:00:03.19] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5348428Z [xUnit.net 00:00:03.19] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5351563Z [xUnit.net 00:00:03.19] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(336,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.MatchWithExactIndexAndDelete2LevelNestedLinksTest() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5353449Z [xUnit.net 00:00:03.19] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5357555Z [xUnit.net 00:00:03.19] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5361317Z [xUnit.net 00:00:03.20] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.UpdateSingleLinkTest [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5362596Z [xUnit.net 00:00:03.20] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.MixedMultipleUpdatesTest [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5363398Z [Test] All links: (1: 1->2) (2: 2->2) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5364469Z [xUnit.net 00:00:03.20] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpvubevn.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5365418Z [xUnit.net 00:00:03.20] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5366066Z [xUnit.net 00:00:03.20] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5368309Z [xUnit.net 00:00:03.20] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5374195Z [xUnit.net 00:00:03.20] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(297,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.UpdateSingleLinkTest() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5376252Z [xUnit.net 00:00:03.20] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5377596Z [xUnit.net 00:00:03.20] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5378285Z [Test] All links: (1: 1->2) (2: 2->1) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5379319Z [xUnit.net 00:00:03.20] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmp3c1ww2.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5380294Z [xUnit.net 00:00:03.20] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5380770Z [xUnit.net 00:00:03.20] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5382414Z [xUnit.net 00:00:03.20] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5385726Z [xUnit.net 00:00:03.20] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(595,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.MixedMultipleUpdatesTest() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5394813Z [xUnit.net 00:00:03.20] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5396256Z [xUnit.net 00:00:03.20] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5398155Z [xUnit.net 00:00:03.20] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.NestedDeleteAllLinksBySourceAndTargetTest1 [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5399469Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateMultipleLinksTest [2 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5400140Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5400884Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpyqgvnl.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5401716Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5401997Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5403385Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5405529Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateMultipleLinksTest() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 93 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5407059Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5408003Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5409246Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeduplicateMixedNamedAndNumericLinks_ShouldReuseExistingLinks [2 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5410193Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5411111Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpfwuvgx.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5411870Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5412056Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5412853Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5414385Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeduplicateMixedNamedAndNumericLinks_ShouldReuseExistingLinks() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1367 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5415513Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5416079Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5417217Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.MatchSelfReferencingAndMakeThemGoOutFromFirstLinkUsingVariablesTest [2 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5418481Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5419243Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpjgwwgi.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5420054Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5420662Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5421996Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5424442Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.MatchSelfReferencingAndMakeThemGoOutFromFirstLinkUsingVariablesTest() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 555 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5427961Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5429552Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5430294Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateRightCompositeIntegerChildrenWithoutExtraLeaf_ShouldSucceed [2 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5430862Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5431333Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmp5qyzew.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5431982Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5432169Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5432961Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5434488Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateRightCompositeIntegerChildrenWithoutExtraLeaf_ShouldSucceed() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1204 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5435504Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5436025Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5436696Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.EnsureCreated_WithSpecialAnyReference_ShouldThrowControlledException [2 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5437206Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5437901Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpski1wk.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5438401Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5438572Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5439340Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5440805Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.EnsureCreated_WithSpecialAnyReference_ShouldThrowControlledException() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1569 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5441785Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5442313Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5442879Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.Create5LevelNestedLinksTest [2 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5443290Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5443741Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmptwl3e4.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5444207Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5444382Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5445153Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5448611Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.Create5LevelNestedLinksTest() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 166 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5450858Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5451399Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5452230Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.MatchWithExactIndexAndDelete2LevelNestedLinksTest [2 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5452747Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5453222Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpyhcsup.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5453713Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5453921Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5454819Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5456147Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.MatchWithExactIndexAndDelete2LevelNestedLinksTest() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 336 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5457094Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5457616Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5458148Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.UpdateSingleLinkTest [4 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5458528Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5459117Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpvubevn.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5459600Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5459776Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5460550Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5461734Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.UpdateSingleLinkTest() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 297 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5462646Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5463156Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5463707Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.MixedMultipleUpdatesTest [2 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5464099Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5464533Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmp3c1ww2.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5465002Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5465157Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5465913Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5467118Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.MixedMultipleUpdatesTest() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 595 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5467941Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5468550Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5469090Z [Test] All links: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5469744Z [xUnit.net 00:00:03.20] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpowemuu.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5470442Z [xUnit.net 00:00:03.20] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5470729Z [xUnit.net 00:00:03.20] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5471722Z [xUnit.net 00:00:03.20] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5473332Z [xUnit.net 00:00:03.20] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(776,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.NestedDeleteAllLinksBySourceAndTargetTest1() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5474493Z [xUnit.net 00:00:03.20] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5475143Z [xUnit.net 00:00:03.20] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5475996Z [xUnit.net 00:00:03.21] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeduplicateWithDifferentPairs_ShouldNotDeduplicateDifferentLinks [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5476656Z [Test] All links: (1: 1->1) (2: 2->2) (3: 1->2) (4: 2->1) (5: 3->4) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5477520Z [xUnit.net 00:00:03.21] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmp2pugtd.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5478174Z [xUnit.net 00:00:03.21] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5478549Z [xUnit.net 00:00:03.21] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5479508Z [xUnit.net 00:00:03.21] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5481089Z [xUnit.net 00:00:03.21] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1396,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeduplicateWithDifferentPairs_ShouldNotDeduplicateDifferentLinks() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5482185Z [xUnit.net 00:00:03.21] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5482840Z [xUnit.net 00:00:03.21] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5490715Z [Test] All links: (1: 1->1) (2: 2->1) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5498786Z [xUnit.net 00:00:03.21] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateLeftCompositeStringChildrenWithoutExtraLeaf_ShouldSucceed [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5500618Z [xUnit.net 00:00:03.21] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpqm0wwz.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5501918Z [xUnit.net 00:00:03.21] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5502494Z [xUnit.net 00:00:03.21] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5506835Z [xUnit.net 00:00:03.21] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5509907Z [xUnit.net 00:00:03.21] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1221,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateLeftCompositeStringChildrenWithoutExtraLeaf_ShouldSucceed() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5512063Z [xUnit.net 00:00:03.21] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5513554Z [xUnit.net 00:00:03.21] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5519518Z [Test] All links: (1: 1->1) (2: 2->2) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5526901Z [xUnit.net 00:00:03.22] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.NoExactMatch2LevelNestedLinksTest [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5528558Z [xUnit.net 00:00:03.22] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmp22qgjo.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5529800Z [xUnit.net 00:00:03.22] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5530368Z [xUnit.net 00:00:03.22] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5532193Z [xUnit.net 00:00:03.22] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5534893Z [xUnit.net 00:00:03.22] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(374,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.NoExactMatch2LevelNestedLinksTest() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5535980Z [xUnit.net 00:00:03.22] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5536636Z [xUnit.net 00:00:03.22] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5547264Z [Test] All links: (1: 1->2) (2: 1->1) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5554634Z [xUnit.net 00:00:03.22] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.MakeAllLinksToGoOutOfFirstLinkUsingVariablesTest [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5557098Z [xUnit.net 00:00:03.22] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpl4pxqt.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5558273Z [xUnit.net 00:00:03.22] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5558820Z [xUnit.net 00:00:03.22] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5560518Z [xUnit.net 00:00:03.22] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5563509Z [xUnit.net 00:00:03.22] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(498,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.MakeAllLinksToGoOutOfFirstLinkUsingVariablesTest() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5565513Z [xUnit.net 00:00:03.22] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5566723Z [xUnit.net 00:00:03.22] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5573581Z [Test] All links: (3: 3->3) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5579072Z [xUnit.net 00:00:03.22] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateSingleLinkWithIndexAfterDoubleGapTest [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5581601Z [xUnit.net 00:00:03.22] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmplzhw13.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5582895Z [xUnit.net 00:00:03.22] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5583494Z [xUnit.net 00:00:03.22] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5585277Z [xUnit.net 00:00:03.22] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5588868Z [xUnit.net 00:00:03.22] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(61,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateSingleLinkWithIndexAfterDoubleGapTest() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5590829Z [xUnit.net 00:00:03.22] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5592035Z [xUnit.net 00:00:03.22] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5613803Z [Test] All links: (1: 1->1) (2: 18->20) (18: 1->21) (19: 1->20) (20: 20->20) (21: 21->21) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5622527Z [xUnit.net 00:00:03.23] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.Issue20_SubstituteMatchedLinkAndOutgoingLink_ShouldPreserveExistingParts [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5624503Z [xUnit.net 00:00:03.23] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpvke4u1.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5625513Z [xUnit.net 00:00:03.23] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5626007Z [xUnit.net 00:00:03.23] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5627717Z [xUnit.net 00:00:03.23] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5630441Z [xUnit.net 00:00:03.23] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1529,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.Issue20_SubstituteMatchedLinkAndOutgoingLink_ShouldPreserveExistingParts() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5633839Z [xUnit.net 00:00:03.23] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5635003Z [xUnit.net 00:00:03.23] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5651706Z [xUnit.net 00:00:03.23] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteNamedFamilyLinksRemovesNamesTest [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5653784Z [xUnit.net 00:00:03.23] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmp2hstni.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5655041Z [xUnit.net 00:00:03.23] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5655648Z [xUnit.net 00:00:03.23] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5657459Z [xUnit.net 00:00:03.23] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5660532Z [xUnit.net 00:00:03.23] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1081,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteNamedFamilyLinksRemovesNamesTest() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5661699Z [xUnit.net 00:00:03.23] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5662381Z [xUnit.net 00:00:03.23] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5671646Z [Test] All links: (1: 1->1) (2: 2->2) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5678179Z [xUnit.net 00:00:03.23] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.ExactMatchAndDelete2LevelNestedLinksTest [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5683440Z [xUnit.net 00:00:03.23] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpuyxvgs.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5684855Z [xUnit.net 00:00:03.23] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5685465Z [xUnit.net 00:00:03.23] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5687526Z [xUnit.net 00:00:03.23] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5694172Z [xUnit.net 00:00:03.23] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(317,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.ExactMatchAndDelete2LevelNestedLinksTest() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5696097Z [xUnit.net 00:00:03.23] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5697612Z [xUnit.net 00:00:03.23] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5699386Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.NestedDeleteAllLinksBySourceAndTargetTest1 [3 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5700505Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5701283Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpowemuu.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5702262Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5703320Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5705038Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5714162Z [xUnit.net 00:00:03.23] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteByNamesTest [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5715905Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.NestedDeleteAllLinksBySourceAndTargetTest1() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 776 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5717623Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5718509Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5719549Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeduplicateWithDifferentPairs_ShouldNotDeduplicateDifferentLinks [3 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5720122Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5720595Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmp2pugtd.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5721081Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5721253Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5722286Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5724682Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeduplicateWithDifferentPairs_ShouldNotDeduplicateDifferentLinks() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1396 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5726061Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5726593Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5727557Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateLeftCompositeStringChildrenWithoutExtraLeaf_ShouldSucceed [6 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5728505Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5729240Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpqm0wwz.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5730661Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5730947Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5732375Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5737267Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateLeftCompositeStringChildrenWithoutExtraLeaf_ShouldSucceed() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1221 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5739353Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5740298Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5741352Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.NoExactMatch2LevelNestedLinksTest [2 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5742118Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5742846Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmp22qgjo.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5743805Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5743984Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5744784Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5746425Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.NoExactMatch2LevelNestedLinksTest() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 374 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5747325Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5747867Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5748539Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.MakeAllLinksToGoOutOfFirstLinkUsingVariablesTest [2 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5749040Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5749500Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpl4pxqt.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5749965Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5750378Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5751180Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5752510Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.MakeAllLinksToGoOutOfFirstLinkUsingVariablesTest() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 498 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5753557Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5754438Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5755545Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateSingleLinkWithIndexAfterDoubleGapTest [2 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5756358Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5757109Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmplzhw13.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5757911Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5758170Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5759473Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5764085Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateSingleLinkWithIndexAfterDoubleGapTest() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 61 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5787640Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5788707Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5790099Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.Issue20_SubstituteMatchedLinkAndOutgoingLink_ShouldPreserveExistingParts [4 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5790931Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5791665Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpvke4u1.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5792822Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5793078Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5794421Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5796772Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.Issue20_SubstituteMatchedLinkAndOutgoingLink_ShouldPreserveExistingParts() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1529 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5798483Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5799741Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5800928Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteNamedFamilyLinksRemovesNamesTest [2 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5801749Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5802539Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmp2hstni.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5803381Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5803649Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5805044Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5809368Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteNamedFamilyLinksRemovesNamesTest() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1081 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5810987Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5875314Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5876378Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.ExactMatchAndDelete2LevelNestedLinksTest [2 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5877065Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5878272Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpuyxvgs.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5879077Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5879351Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5880663Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5882853Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.ExactMatchAndDelete2LevelNestedLinksTest() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 317 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5885403Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5886379Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5887637Z [xUnit.net 00:00:03.23] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpmxwjpi.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5888408Z [xUnit.net 00:00:03.23] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5889110Z [xUnit.net 00:00:03.23] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5891206Z [xUnit.net 00:00:03.23] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5893442Z [xUnit.net 00:00:03.23] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1120,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteByNamesTest() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5895050Z [xUnit.net 00:00:03.24] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5895905Z [xUnit.net 00:00:03.24] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5897194Z [xUnit.net 00:00:03.24] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateLinkWithVariableReferences_ShouldSucceed [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5898642Z [xUnit.net 00:00:03.24] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.Create2LevelNestedLinksTest [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5899957Z [xUnit.net 00:00:03.25] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteLinksByAnySourceTest [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5901215Z [xUnit.net 00:00:03.25] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateTwoNamedLinksTest [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5902053Z [Test] All links: (1: 0->0) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5903100Z [xUnit.net 00:00:03.24] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpd2ahet.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5904116Z [xUnit.net 00:00:03.24] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5904612Z [xUnit.net 00:00:03.24] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5906338Z [xUnit.net 00:00:03.24] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5907926Z [xUnit.net 00:00:03.24] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1791,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateLinkWithVariableReferences_ShouldSucceed() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5909360Z [xUnit.net 00:00:03.24] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5910052Z [xUnit.net 00:00:03.24] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5910472Z [Test] All links: (1: 1->1) (2: 2->2) (3: 1->2) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5911088Z [xUnit.net 00:00:03.24] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpo021q4.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.5911642Z [xUnit.net 00:00:03.24] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7229332Z [xUnit.net 00:00:03.24] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7231397Z [xUnit.net 00:00:03.24] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7233985Z [xUnit.net 00:00:03.24] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(109,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.Create2LevelNestedLinksTest() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7235392Z [xUnit.net 00:00:03.24] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7236821Z [xUnit.net 00:00:03.24] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7237368Z [Test] All links: (1: 1->1) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7237980Z [xUnit.net 00:00:03.25] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpq33hmt.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7238541Z [xUnit.net 00:00:03.25] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7238833Z [xUnit.net 00:00:03.25] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7239908Z [xUnit.net 00:00:03.25] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7241655Z [xUnit.net 00:00:03.25] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(741,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteLinksByAnySourceTest() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7242993Z [xUnit.net 00:00:03.25] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7244135Z [xUnit.net 00:00:03.25] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7245214Z [Trace] Constructing NamedTypesDecorator with names DB: C:\Users\runneradmin\AppData\Local\Temp\tmpkyv1rm.names.links +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7245887Z [Test] Starting UpdateNamedLinkNameTest +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7246239Z [Test] Step 1: Creating initial link +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7246617Z [ProcessQuery] Query: "(() ((child: father mother)))" +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7247058Z [ProcessQuery] Parser returned 1 top-level link(s). +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7247453Z [ProcessQuery] Restriction link => Id="" Values.Count=0 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7247844Z [ProcessQuery] Substitution link => Id="" Values.Count=1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7248359Z [ProcessQuery] No restriction, but substitution is non-empty => creation scenario. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7248861Z [ValidateLinksExistOrWillBeCreated] Starting validation +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7249380Z [ValidateLinksExistOrWillBeCreated] Numeric links to be created: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7249954Z [ValidateLinksExistOrWillBeCreated] Named links to be created: child +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7250425Z [Trace] GetByName called for name: 'father' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7250751Z [Trace] GetByName result: 0 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7251030Z [Trace] GetByName called for name: 'mother' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7251325Z [Trace] GetByName result: 0 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7251587Z [Trace] GetByName called for name: 'father' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7251862Z [Trace] GetByName result: 0 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7252420Z [ValidateLinksExistOrWillBeCreated] Auto-creating missing named reference 'father' as point link. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7253386Z [Trace] GetByName called for name: 'father' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7253719Z [Trace] GetByName result: 0 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7254001Z [Trace] Update called with restriction: [1] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7254989Z [Trace] Debug: handlerWrapper invoked - before=1,0,0, after=1,0,0 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7255454Z [Trace] Update result: 4294967295 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7255811Z [Trace] SetName called for link: 1 with name: 'father' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7256183Z [Trace] RemoveName called for link: 1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7256912Z [Trace] RemoveName completed for link: 1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7257248Z [Trace] SetName result: 108 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7257542Z [Trace] Update called with restriction: [1,0,0] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7257948Z [Trace] Debug: handlerWrapper invoked - before=1,0,0, after=1,1,1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7258287Z [Trace] Update result: 4294967295 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7259118Z [Trace] GetByName called for name: 'mother' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7259385Z [Trace] GetByName result: 0 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7259876Z [ValidateLinksExistOrWillBeCreated] Auto-creating missing named reference 'mother' as point link. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7260403Z [Trace] GetByName called for name: 'mother' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7260714Z [Trace] GetByName result: 0 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7260994Z [Trace] Update called with restriction: [2] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7261408Z [Trace] Debug: handlerWrapper invoked - before=2,0,0, after=2,0,0 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7261816Z [Trace] Update result: 4294967295 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7262151Z [Trace] SetName called for link: 2 with name: 'mother' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7262529Z [Trace] RemoveName called for link: 2 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7262851Z [Trace] RemoveName completed for link: 2 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7263251Z [Trace] SetName result: 110 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7263541Z [Trace] Update called with restriction: [2,0,0] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7264009Z [Trace] Debug: handlerWrapper invoked - before=2,0,0, after=2,2,2 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7264418Z [Trace] Update result: 4294967295 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7264798Z [ValidateLinksExistOrWillBeCreated] Validation completed +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7265281Z [Trace] GetByName called for name: 'father' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7265597Z [Trace] GetByName result: 1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7266088Z [EnsureNestedLinkCreatedRecursively] Found existing named leaf 'father' => ID=1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7266628Z [Trace] GetByName called for name: 'mother' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7266953Z [Trace] GetByName result: 2 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7267445Z [EnsureNestedLinkCreatedRecursively] Found existing named leaf 'mother' => ID=2 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7268010Z [EnsureLinkCreated] Creating link for (S=1, T=2). +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7268395Z [EnsureLinkCreated] => assigned new ID=3 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7268740Z [Trace] Update called with restriction: [3] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7269159Z [Trace] Debug: handlerWrapper invoked - before=3,0,0, after=3,1,2 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7269570Z [Trace] Update result: 4294967295 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7270221Z [EnsureNestedLinkCreatedRecursively] Created or ensured composite link => Index=0, Source=1, Target=2 => Actual ID=3 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7270962Z [Trace] SetName called for link: 3 with name: 'child' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7271342Z [Trace] RemoveName called for link: 3 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7271701Z [Trace] RemoveName completed for link: 3 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7272002Z [Trace] SetName result: 118 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7272379Z [ProcessQuery] Created link ID #3 from substitution pattern. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7272804Z [Test] Initial link creation completed +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7273119Z [Test] Step 2: Verifying initial state +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7273418Z [Trace] GetByName called for name: 'child' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7273677Z [Trace] GetByName result: 3 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7273914Z [Test] Initial child ID: 3 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7274177Z [Trace] GetByName called for name: 'father' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7274466Z [Trace] GetByName result: 1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7274969Z [Test] Initial father ID: 1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7275250Z [Trace] GetByName called for name: 'mother' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7275527Z [Trace] GetByName result: 2 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7275754Z [Test] Initial mother ID: 2 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7276064Z [Test] All links: (1: 1->1) (2: 2->2) (3: 1->2) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7279062Z [Test] Initial links count: 3 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7279860Z [Test] Initial state verification completed +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7280452Z [Test] Step 3: Updating link name +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7280781Z [Test] Removing old name 'child' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7281084Z [Trace] RemoveName called for link: 3 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7281392Z [Trace] RemoveName completed for link: 3 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7281675Z [Test] Old name removed +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7281854Z [Test] Creating new link with name 'son' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7282087Z [ProcessQuery] Query: "(() ((son: father mother)))" +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7282338Z [ProcessQuery] Parser returned 1 top-level link(s). +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7283063Z [ProcessQuery] Restriction link => Id="" Values.Count=0 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7283335Z [ProcessQuery] Substitution link => Id="" Values.Count=1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7283694Z [ProcessQuery] No restriction, but substitution is non-empty => creation scenario. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7284048Z [ValidateLinksExistOrWillBeCreated] Starting validation +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7284373Z [ValidateLinksExistOrWillBeCreated] Numeric links to be created: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7284727Z [ValidateLinksExistOrWillBeCreated] Named links to be created: son +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7285009Z [Trace] GetByName called for name: 'father' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7285210Z [Trace] GetByName result: 1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7285527Z [ValidateReferencesInPattern] Named link 'father' reference validated in substitution pattern +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7285885Z [Trace] GetByName called for name: 'mother' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7286070Z [Trace] GetByName result: 2 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7286379Z [ValidateReferencesInPattern] Named link 'mother' reference validated in substitution pattern +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7286766Z [ValidateLinksExistOrWillBeCreated] Validation completed +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7287148Z [Trace] GetByName called for name: 'father' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7287441Z [Trace] GetByName result: 1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7288097Z [EnsureNestedLinkCreatedRecursively] Found existing named leaf 'father' => ID=1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7288694Z [Trace] GetByName called for name: 'mother' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7288990Z [Trace] GetByName result: 2 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7289411Z [EnsureNestedLinkCreatedRecursively] Found existing named leaf 'mother' => ID=2 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7289896Z [EnsureLinkCreated] Link already found => ID=3 => no-op. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7290560Z [EnsureNestedLinkCreatedRecursively] Created or ensured composite link => Index=0, Source=1, Target=2 => Actual ID=3 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7291228Z [Trace] SetName called for link: 3 with name: 'son' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7291541Z [Trace] RemoveName called for link: 3 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7291849Z [Trace] RemoveName completed for link: 3 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7292123Z [Trace] SetName result: 123 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7292450Z [ProcessQuery] Created link ID #3 from substitution pattern. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7292801Z [Test] New link creation completed +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7293079Z [Test] Step 4: Verifying final state +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7293400Z [Trace] GetByName called for name: 'child' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7293693Z [Trace] GetByName result: 0 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7293972Z [Trace] GetByName called for name: 'son' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7294250Z [Trace] GetByName result: 3 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7294481Z [Test] Final son ID: 3 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7295049Z [Trace] GetByName called for name: 'father' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7295328Z [Trace] GetByName result: 1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7295556Z [Test] Final father ID: 1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7295833Z [Trace] GetByName called for name: 'mother' +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7296147Z [Trace] GetByName result: 2 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7296391Z [Test] Final mother ID: 2 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7296683Z [Test] All links: (1: 1->1) (2: 2->2) (3: 1->2) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7297003Z [Test] Final links count: 3 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7297281Z [Test] Final state verification completed +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7297668Z [Test] UpdateNamedLinkNameTest completed successfully +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7298932Z [xUnit.net 00:00:03.25] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpkyv1rm.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7299883Z [xUnit.net 00:00:03.25] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7300335Z [xUnit.net 00:00:03.25] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7301939Z [xUnit.net 00:00:03.25] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7304790Z [xUnit.net 00:00:03.25] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(859,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateTwoNamedLinksTest() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7305413Z [xUnit.net 00:00:03.25] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7305931Z [xUnit.net 00:00:03.25] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7306631Z [xUnit.net 00:00:03.26] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.NoUpdateUsingVariablesTest [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7307408Z [xUnit.net 00:00:03.39] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.MakeAllLinksSelfReferencingUsingVariablesTest [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7307539Z [Test] All links: (1: 1->1) (2: 2->2) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7308371Z [xUnit.net 00:00:03.26] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpholdtq.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7308501Z [xUnit.net 00:00:03.26] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7308782Z [xUnit.net 00:00:03.26] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7310095Z [xUnit.net 00:00:03.26] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7311256Z [xUnit.net 00:00:03.26] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(393,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.NoUpdateUsingVariablesTest() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7311919Z [xUnit.net 00:00:03.26] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7312778Z [xUnit.net 00:00:03.26] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7312908Z [Test] All links: (1: 1->1) (2: 2->2) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7313709Z [xUnit.net 00:00:03.39] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpwls0ij.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7313852Z [xUnit.net 00:00:03.39] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7314122Z [xUnit.net 00:00:03.39] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7315428Z [xUnit.net 00:00:03.39] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7316719Z [xUnit.net 00:00:03.39] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(536,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.MakeAllLinksSelfReferencingUsingVariablesTest() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7317525Z [xUnit.net 00:00:03.39] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7318048Z [xUnit.net 00:00:03.39] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7318148Z [Test] All links: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7318765Z [xUnit.net 00:00:03.39] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteMultipleLinksTest [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7319603Z [xUnit.net 00:00:03.39] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpqidow1.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7345689Z [xUnit.net 00:00:03.39] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7346458Z [xUnit.net 00:00:03.39] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7349358Z [xUnit.net 00:00:03.39] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7352319Z [xUnit.net 00:00:03.39] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(706,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteMultipleLinksTest() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7353529Z [xUnit.net 00:00:03.39] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7354224Z [xUnit.net 00:00:03.39] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7354729Z [xUnit.net 00:00:03.40] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.UpdateWithNonExistentReference_ShouldThrowException [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7355244Z [xUnit.net 00:00:03.40] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpzmbf1m.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7355326Z [xUnit.net 00:00:03.40] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7355489Z [xUnit.net 00:00:03.40] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7356249Z [xUnit.net 00:00:03.40] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7357007Z [xUnit.net 00:00:03.40] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1725,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.UpdateWithNonExistentReference_ShouldThrowException() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7357369Z [xUnit.net 00:00:03.40] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7357677Z [xUnit.net 00:00:03.40] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7357933Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteByNamesTest [3 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7357987Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7358549Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpmxwjpi.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7358605Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7358713Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7359487Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7360016Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteByNamesTest() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1120 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7360270Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7360486Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7360842Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateLinkWithVariableReferences_ShouldSucceed [2 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7361043Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7361651Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpd2ahet.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7361728Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7361888Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7362935Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7363975Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateLinkWithVariableReferences_ShouldSucceed() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1791 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7364425Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7364772Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7365229Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.Create2LevelNestedLinksTest [2 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7365312Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7365910Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpo021q4.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7365979Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7366129Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7367478Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7368483Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.Create2LevelNestedLinksTest() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 109 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7368933Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7369297Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7369790Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteLinksByAnySourceTest [5 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7369873Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7370512Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpq33hmt.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7370593Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7370755Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7371753Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7372837Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteLinksByAnySourceTest() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 741 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7373610Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7373976Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7374435Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateTwoNamedLinksTest [4 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7374522Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7375218Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpkyv1rm.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7375286Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7375436Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7376548Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7377455Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateTwoNamedLinksTest() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 859 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7377882Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7378194Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7378646Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.NoUpdateUsingVariablesTest [5 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7378719Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7379287Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpholdtq.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7379358Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7379497Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7380485Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7381386Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.NoUpdateUsingVariablesTest() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 393 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7381810Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7382131Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7382773Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.MakeAllLinksSelfReferencingUsingVariablesTest [133 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7382859Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7383489Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpwls0ij.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7383569Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7383726Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7384757Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7386071Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.MakeAllLinksSelfReferencingUsingVariablesTest() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 536 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7386521Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7386867Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7387330Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteMultipleLinksTest [2 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7387399Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7388053Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpqidow1.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7388273Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7388434Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7389595Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7390579Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteMultipleLinksTest() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 706 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7391027Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7391393Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7392065Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.UpdateWithNonExistentReference_ShouldThrowException [2 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7392142Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7392739Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpzmbf1m.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7392788Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7392886Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7393785Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7394436Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.UpdateWithNonExistentReference_ShouldThrowException() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1725 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7394716Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7394928Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7395354Z [xUnit.net 00:00:03.40] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteSingleLinkTest_Source1Target2 [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7395441Z [Test] All links: (2: 2->2) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7395937Z [xUnit.net 00:00:03.40] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpvi50gh.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7396023Z [xUnit.net 00:00:03.40] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7396201Z [xUnit.net 00:00:03.40] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7396979Z [xUnit.net 00:00:03.40] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7397769Z [xUnit.net 00:00:03.40] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(670,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteSingleLinkTest_Source1Target2() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7398126Z [xUnit.net 00:00:03.40] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7398424Z [xUnit.net 00:00:03.40] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7407088Z [xUnit.net 00:00:03.40] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteNamedLinkTest [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7407940Z [xUnit.net 00:00:03.40] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpjwj50w.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7409826Z [xUnit.net 00:00:03.40] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7410395Z [xUnit.net 00:00:03.40] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7412196Z [xUnit.net 00:00:03.40] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7413490Z [xUnit.net 00:00:03.40] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1105,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteNamedLinkTest() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7414188Z [xUnit.net 00:00:03.40] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7414786Z [xUnit.net 00:00:03.40] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7429941Z [Test] All links: (1: 1->1) (2: 2->2) (3: 3->3) (4: 2->3) (5: 1->4) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7906499Z [xUnit.net 00:00:03.45] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.Create3LevelNestedLinksTest [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7907426Z [xUnit.net 00:00:03.45] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpimjprp.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7907937Z [xUnit.net 00:00:03.45] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7908319Z [xUnit.net 00:00:03.45] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7909746Z [xUnit.net 00:00:03.45] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7911062Z [xUnit.net 00:00:03.45] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(126,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.Create3LevelNestedLinksTest() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7911768Z [xUnit.net 00:00:03.45] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7912383Z [xUnit.net 00:00:03.45] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7925190Z [Test] All links: (1: 1->1) (2: 2->2) (3: 1->2) (4: 3->3) (5: 3->4) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7941735Z [xUnit.net 00:00:03.46] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeduplicateTripleDuplicatePair_ShouldCreateOnlyOneSubLink [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7942546Z [xUnit.net 00:00:03.46] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpoajnsi.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7942971Z [xUnit.net 00:00:03.46] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7944019Z [xUnit.net 00:00:03.46] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7946402Z [xUnit.net 00:00:03.46] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7948328Z [xUnit.net 00:00:03.46] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1332,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeduplicateTripleDuplicatePair_ShouldCreateOnlyOneSubLink() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7950204Z [xUnit.net 00:00:03.46] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7952183Z [xUnit.net 00:00:03.46] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7975883Z [xUnit.net 00:00:03.46] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateLinkWithValidSelfReference_ShouldSucceed [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7976024Z [Test] All links: (1: 1->1) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7982221Z [xUnit.net 00:00:03.46] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpq424gm.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7982597Z [xUnit.net 00:00:03.46] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7983025Z [xUnit.net 00:00:03.46] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7984545Z [xUnit.net 00:00:03.46] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7986002Z [xUnit.net 00:00:03.46] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1675,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateLinkWithValidSelfReference_ShouldSucceed() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7986979Z [xUnit.net 00:00:03.46] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7987790Z [xUnit.net 00:00:03.46] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.7996843Z [Test] All links: (1: 1->1) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8012959Z [xUnit.net 00:00:03.46] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateSingleLinkTest [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8014119Z [xUnit.net 00:00:03.46] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmp2jtycu.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8014655Z [xUnit.net 00:00:03.46] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8015106Z [xUnit.net 00:00:03.46] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8016624Z [xUnit.net 00:00:03.46] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8017893Z [xUnit.net 00:00:03.46] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(16,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateSingleLinkTest() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8018605Z [xUnit.net 00:00:03.46] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8019417Z [xUnit.net 00:00:03.46] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8026540Z [Test] All links: (1: 1->1) (2: 2->2) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8039999Z [xUnit.net 00:00:03.47] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreationDuringUpdateTest [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8041220Z [xUnit.net 00:00:03.47] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpyculdl.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8041669Z [xUnit.net 00:00:03.47] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8042286Z [xUnit.net 00:00:03.47] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8046005Z [xUnit.net 00:00:03.47] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8048086Z [xUnit.net 00:00:03.47] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(614,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreationDuringUpdateTest() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8048897Z [xUnit.net 00:00:03.47] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8049586Z [xUnit.net 00:00:03.47] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8055447Z [Test] All links: (1: 0->0) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8071526Z [xUnit.net 00:00:03.47] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateLinkWithWildcardReferences_ShouldSucceed [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8072376Z [xUnit.net 00:00:03.47] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpy3dhdi.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8072568Z [xUnit.net 00:00:03.47] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8073064Z [xUnit.net 00:00:03.47] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8074625Z [xUnit.net 00:00:03.47] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8077997Z [xUnit.net 00:00:03.47] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1805,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateLinkWithWildcardReferences_ShouldSucceed() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8080025Z [xUnit.net 00:00:03.47] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8080728Z [xUnit.net 00:00:03.47] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8083493Z [Test] All links: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8106872Z [xUnit.net 00:00:03.47] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteSingleLinkTest_Source2Target2 [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8107679Z [xUnit.net 00:00:03.47] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmptlrd3d.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8119091Z [xUnit.net 00:00:03.47] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8131895Z [xUnit.net 00:00:03.47] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8134146Z [xUnit.net 00:00:03.47] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8136688Z [xUnit.net 00:00:03.47] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(689,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteSingleLinkTest_Source2Target2() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8137384Z [xUnit.net 00:00:03.47] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8138072Z [xUnit.net 00:00:03.47] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8156999Z [xUnit.net 00:00:03.48] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeduplicateNamedLinks_MultipleQueries_ShouldReuseSameIds [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8157815Z [xUnit.net 00:00:03.48] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateLinkWithNonExistentReference_ShouldThrowException [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8158371Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteSingleLinkTest_Source1Target2 [4 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8158456Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8159122Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpvi50gh.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8159200Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8159374Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8160503Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8161474Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteSingleLinkTest_Source1Target2() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 670 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8161899Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8162235Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8162661Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteNamedLinkTest [3 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8162748Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8163408Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpjwj50w.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8163495Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8163662Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8164761Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8165987Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteNamedLinkTest() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1105 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8166428Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8166794Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8167305Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.Create3LevelNestedLinksTest [2 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8167400Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8168053Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpimjprp.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8168127Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8168520Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8169648Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8170617Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.Create3LevelNestedLinksTest() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 126 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8171055Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8171920Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8172615Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeduplicateTripleDuplicatePair_ShouldCreateOnlyOneSubLink [3 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8172713Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8173337Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpoajnsi.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8173405Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8173576Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8174624Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8175740Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeduplicateTripleDuplicatePair_ShouldCreateOnlyOneSubLink() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1332 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8176173Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8176522Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8177101Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateLinkWithValidSelfReference_ShouldSucceed [3 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8177176Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8177792Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpq424gm.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8177867Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8178029Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8179096Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8180206Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateLinkWithValidSelfReference_ShouldSucceed() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1675 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8180636Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8181010Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8181480Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateSingleLinkTest [2 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8181563Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8182218Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmp2jtycu.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8182293Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8182456Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8184093Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8186877Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateSingleLinkTest() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 16 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8187355Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8188236Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8188722Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreationDuringUpdateTest [2 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8188799Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8189413Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpyculdl.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8189486Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8189643Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8190672Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8191524Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreationDuringUpdateTest() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 614 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8191930Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8192269Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8192856Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateLinkWithWildcardReferences_ShouldSucceed [2 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8192930Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8193549Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpy3dhdi.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8193622Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8193768Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8194811Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8195864Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateLinkWithWildcardReferences_ShouldSucceed() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1805 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8196268Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8196614Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8197124Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteSingleLinkTest_Source2Target2 [2 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8197198Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8197821Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmptlrd3d.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8197896Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8198050Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8200392Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8201482Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteSingleLinkTest_Source2Target2() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 689 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8201932Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8202305Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8202927Z [Test] All links: (1: 1->1) (2: 2->2) (3: 1->2) (4: 3->3) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8203842Z [xUnit.net 00:00:03.48] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpbobdsq.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8203985Z [xUnit.net 00:00:03.48] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8204265Z [xUnit.net 00:00:03.48] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8205623Z [xUnit.net 00:00:03.48] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8207278Z [xUnit.net 00:00:03.48] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1470,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeduplicateNamedLinks_MultipleQueries_ShouldReuseSameIds() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8207899Z [xUnit.net 00:00:03.48] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8208479Z [xUnit.net 00:00:03.48] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8209291Z [xUnit.net 00:00:03.48] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmprn0wbd.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8209418Z [xUnit.net 00:00:03.48] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8209699Z [xUnit.net 00:00:03.48] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8211043Z [xUnit.net 00:00:03.48] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8212422Z [xUnit.net 00:00:03.48] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1659,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateLinkWithNonExistentReference_ShouldThrowException() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8213027Z [xUnit.net 00:00:03.48] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8213548Z [xUnit.net 00:00:03.48] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8214554Z [xUnit.net 00:00:03.48] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.SwapSourceAndTargetForSingleLinkUsingVariablesTest [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8214693Z [Test] All links: (1: 1->1) (2: 2->1) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8216136Z [xUnit.net 00:00:03.48] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmp0j2uv1.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8216481Z [xUnit.net 00:00:03.48] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8217079Z [xUnit.net 00:00:03.48] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8218619Z [xUnit.net 00:00:03.48] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8220429Z [xUnit.net 00:00:03.48] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(426,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.SwapSourceAndTargetForSingleLinkUsingVariablesTest() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8221584Z [xUnit.net 00:00:03.48] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8234130Z [xUnit.net 00:00:03.48] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8234975Z [xUnit.net 00:00:03.49] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteAllLinksBySourceAndTargetTest2 [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8235394Z [Test] All links: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8236380Z [xUnit.net 00:00:03.49] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpdeaoti.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8236635Z [xUnit.net 00:00:03.49] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8237028Z [xUnit.net 00:00:03.49] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8238716Z [xUnit.net 00:00:03.49] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8240060Z [xUnit.net 00:00:03.49] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(793,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteAllLinksBySourceAndTargetTest2() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8240889Z [xUnit.net 00:00:03.49] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8241542Z [xUnit.net 00:00:03.49] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8254810Z [Test] All links: (1: 1->1) (2: 2->2) (3: 3->3) (4: 4->4) (5: 5->5) (6: 6->6) (7: 7->7) (8: 6->7) (9: 5->8) (10: 4->9) (11: 3->10) (12: 2->11) (13: 1->12) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8260674Z [xUnit.net 00:00:03.49] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.Create7LevelNestedLinksTest [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8261530Z [xUnit.net 00:00:03.49] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpi5rrzr.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8262008Z [xUnit.net 00:00:03.49] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8262427Z [xUnit.net 00:00:03.49] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8264237Z [xUnit.net 00:00:03.49] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8265636Z [xUnit.net 00:00:03.49] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(249,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.Create7LevelNestedLinksTest() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8266464Z [xUnit.net 00:00:03.49] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8267298Z [xUnit.net 00:00:03.49] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8284904Z [Test] All links: (1: 1->1) (2: 2->1) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8300320Z [xUnit.net 00:00:03.49] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateLinkReferencingExistingLink_ShouldSucceed [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8301147Z [xUnit.net 00:00:03.49] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpjnzcya.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8301593Z [xUnit.net 00:00:03.49] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8302484Z [xUnit.net 00:00:03.49] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8304246Z [xUnit.net 00:00:03.49] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8309939Z [xUnit.net 00:00:03.49] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1706,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateLinkReferencingExistingLink_ShouldSucceed() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8310630Z [xUnit.net 00:00:03.49] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8311444Z [xUnit.net 00:00:03.49] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8311723Z [Test] All links: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8320900Z [xUnit.net 00:00:03.50] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteAllLinksBySourceAndTargetTest1 [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8321791Z [xUnit.net 00:00:03.50] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpoj3f2e.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8323849Z [xUnit.net 00:00:03.50] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8324284Z [xUnit.net 00:00:03.50] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8325741Z [xUnit.net 00:00:03.50] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8327329Z [xUnit.net 00:00:03.50] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(759,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteAllLinksBySourceAndTargetTest1() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8328387Z [xUnit.net 00:00:03.50] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8329052Z [xUnit.net 00:00:03.50] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8346524Z [Test] All links: (1: 1->1) (2: 2->2) (3: 1->2) (4: 3->3) (5: 4->4) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8359807Z [xUnit.net 00:00:03.50] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeduplicateNestedDuplicates_ShouldDeduplicateAtAllLevels [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8360655Z [xUnit.net 00:00:03.50] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpwhawew.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8361135Z [xUnit.net 00:00:03.50] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8361552Z [xUnit.net 00:00:03.50] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8363274Z [xUnit.net 00:00:03.50] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8364824Z [xUnit.net 00:00:03.50] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1434,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeduplicateNestedDuplicates_ShouldDeduplicateAtAllLevels() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8365575Z [xUnit.net 00:00:03.50] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8367017Z [xUnit.net 00:00:03.50] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8373422Z [Test] All links: (1: 1->1) (2: 2->2) (3: 3->3) (4: 4->4) (5: 3->4) (6: 2->5) (7: 1->6) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8398807Z [xUnit.net 00:00:03.50] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.Create4LevelNestedLinksTest [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8399705Z [xUnit.net 00:00:03.50] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpg3hs3f.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8403682Z [xUnit.net 00:00:03.50] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8404178Z [xUnit.net 00:00:03.50] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8405987Z [xUnit.net 00:00:03.50] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8411935Z [xUnit.net 00:00:03.50] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(145,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.Create4LevelNestedLinksTest() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8413371Z [xUnit.net 00:00:03.50] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8414166Z [xUnit.net 00:00:03.50] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8414843Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeduplicateNamedLinks_MultipleQueries_ShouldReuseSameIds [3 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8415077Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8415857Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpbobdsq.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8416103Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8416395Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8417664Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8418853Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeduplicateNamedLinks_MultipleQueries_ShouldReuseSameIds() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1470 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8419301Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8419673Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8420386Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateLinkWithNonExistentReference_ShouldThrowException [2 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8420464Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8421327Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmprn0wbd.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8421414Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8421576Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8423487Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8424655Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateLinkWithNonExistentReference_ShouldThrowException() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1659 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8425637Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8426018Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8427005Z [xUnit.net 00:00:03.50] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateSingleLinkWithIndexTest [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8427684Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.SwapSourceAndTargetForSingleLinkUsingVariablesTest [2 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8427959Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8428673Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmp0j2uv1.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8430195Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8430660Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8431784Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8432527Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.SwapSourceAndTargetForSingleLinkUsingVariablesTest() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 426 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8432801Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8433021Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8433381Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteAllLinksBySourceAndTargetTest2 [2 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8433438Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8433831Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpdeaoti.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8433885Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8433991Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8434623Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8435210Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteAllLinksBySourceAndTargetTest2() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 793 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8435478Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8435688Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8435995Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.Create7LevelNestedLinksTest [3 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8436046Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8436577Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpi5rrzr.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8436627Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8436731Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8437338Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8437881Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.Create7LevelNestedLinksTest() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 249 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8438518Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8438736Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8439101Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateLinkReferencingExistingLink_ShouldSucceed [3 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8439161Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8439544Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpjnzcya.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8439591Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8439705Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8440333Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8440950Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateLinkReferencingExistingLink_ShouldSucceed() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1706 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8441206Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8441474Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8441939Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteAllLinksBySourceAndTargetTest1 [2 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8442043Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8442661Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpoj3f2e.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8442714Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8442824Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8443471Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8444061Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeleteAllLinksBySourceAndTargetTest1() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 759 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8444321Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8444532Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8444914Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeduplicateNestedDuplicates_ShouldDeduplicateAtAllLevels [3 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8444972Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8445449Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpwhawew.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8445498Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8445602Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8446209Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8446838Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.DeduplicateNestedDuplicates_ShouldDeduplicateAtAllLevels() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1434 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8447154Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8447359Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8447644Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.Create4LevelNestedLinksTest [2 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8447704Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8448058Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpg3hs3f.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8448105Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8448203Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8448805Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8449354Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.Create4LevelNestedLinksTest() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 145 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8449606Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8449808Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8449898Z [Test] All links: (1: 1->1) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8450405Z [xUnit.net 00:00:03.50] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmphtq4oy.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8450488Z [xUnit.net 00:00:03.50] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8450655Z [xUnit.net 00:00:03.50] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8451430Z [xUnit.net 00:00:03.50] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8452088Z [xUnit.net 00:00:03.50] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(31,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateSingleLinkWithIndexTest() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8452436Z [xUnit.net 00:00:03.50] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.8452725Z [xUnit.net 00:00:03.50] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.9315362Z [Test] All links: (1: 1->1) (2: 2->2) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.9324374Z [xUnit.net 00:00:03.60] Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateLinkWithSource2Target2Test [FAIL] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.9325870Z [xUnit.net 00:00:03.60] System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpsurze2.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.9326200Z [xUnit.net 00:00:03.60] Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.9326537Z [xUnit.net 00:00:03.60] at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.9327873Z [xUnit.net 00:00:03.60] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(1606,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.9329249Z [xUnit.net 00:00:03.60] D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs(76,0): at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateLinkWithSource2Target2Test() +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.9329836Z [xUnit.net 00:00:03.60] at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:35.9330324Z [xUnit.net 00:00:03.60] at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:37.3415866Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateSingleLinkWithIndexTest [2 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:37.3416357Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:37.3416874Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmphtq4oy.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:37.3417409Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:37.3417599Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:37.3418399Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:37.3419820Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateSingleLinkWithIndexTest() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 31 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:37.3420707Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:37.3421241Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:37.3421828Z Failed Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateLinkWithSource2Target2Test [90 ms] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:37.3422272Z Error Message: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:37.3422725Z System.IO.IOException : The process cannot access the file 'C:\Users\runneradmin\AppData\Local\Temp\tmpsurze2.names.links' because it is being used by another process. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:37.3423202Z Stack Trace: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:37.3423388Z at System.IO.FileSystem.DeleteFile(String fullPath) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:37.3424160Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.RunTestWithLinks(Action`1 testAction, Boolean enableTracing) in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 1606 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:37.3425395Z at Foundation.Data.Doublets.Cli.Tests.Tests.AdvancedMixedQueryProcessor.CreateLinkWithSource2Target2Test() in D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\AdvancedMixedQueryProcessor.cs:line 76 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:37.3426275Z at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:37.3427531Z at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:37.3428360Z Passed Foundation.Data.Doublets.Cli.Tests.CliExportIntegrationTests.ExportAlias_WritesNamedReferences [3 s] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:40.7411087Z Passed Foundation.Data.Doublets.Cli.Tests.CliExportIntegrationTests.AlwaysTriggerOption_StoresTriggerAndAppliesItOnLaterChange [3 s] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:42.4269754Z Passed Foundation.Data.Doublets.Cli.Tests.CliExportIntegrationTests.ExportAlias_WritesNumberedReferences [1 s] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:50.7915626Z Passed Foundation.Data.Doublets.Cli.Tests.CliExportIntegrationTests.StructureOption_RendersLeftBranchWithIndexes [8 s] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:52.4559351Z [xUnit.net 00:00:20.12] Finished: Foundation.Data.Doublets.Cli.Tests +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:52.9096061Z Passed Foundation.Data.Doublets.Cli.Tests.CliExportIntegrationTests.ImportOption_ReadsNumberedLinoFile [1 s] +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:52.9180169Z +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:52.9212200Z Test Run Failed. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:52.9212547Z Total tests: 187 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:52.9212737Z Passed: 73 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:52.9212877Z Failed: 114 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:52.9214438Z Total time: 27.0763 Seconds +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:52.9346231Z 1>Project "D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.sln" (1) is building "D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\Foundation.Data.Doublets.Cli.Tests.csproj" (2) on node 1 (VSTest target(s)). +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:52.9346997Z 2>_VSTestConsole: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:52.9347231Z MSB4181: The "VSTestTask" task returned false but did not log an error. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:52.9366186Z 2>Done Building Project "D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\Foundation.Data.Doublets.Cli.Tests.csproj" (VSTest target(s)) -- FAILED. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:52.9454486Z 1>Done Building Project "D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.sln" (VSTest target(s)) -- FAILED. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:52.9538909Z +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:52.9539277Z Build FAILED. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:52.9539543Z 0 Warning(s) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:52.9539852Z 0 Error(s) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:52.9541241Z +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:52.9541428Z Time Elapsed 00:00:28.06 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:53.1150995Z +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:53.1156450Z Attachments: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:53.1157586Z D:\a\link-cli\link-cli\csharp\Foundation.Data.Doublets.Cli.Tests\TestResults\885df34c-f21e-4258-bbbb-1c457cb21d13\coverage.cobertura.xml +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:53.2521144Z ##[error]Process completed with exit code 1. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:53.2692532Z Post job cleanup. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:53.4643260Z Post job cleanup. +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:53.6496157Z [command]"C:\Program Files\Git\bin\git.exe" version +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:53.6744142Z git version 2.54.0.windows.1 +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:53.6816057Z Temporarily overriding HOME='D:\a\_temp\ebf15d70-9f93-432b-9921-7a4a66d52cd0' before making global git config changes +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:53.6817360Z Adding repository directory to the temporary git global config as a safe directory +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:53.6826733Z [command]"C:\Program Files\Git\bin\git.exe" config --global --add safe.directory D:\a\link-cli\link-cli +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:53.7093676Z [command]"C:\Program Files\Git\bin\git.exe" config --local --name-only --get-regexp core\.sshCommand +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:53.7350548Z [command]"C:\Program Files\Git\bin\git.exe" submodule foreach --recursive "sh -c \"git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :\"" +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:54.2740378Z [command]"C:\Program Files\Git\bin\git.exe" config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:54.2957657Z http.https://github.com/.extraheader +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:54.3002725Z [command]"C:\Program Files\Git\bin\git.exe" config --local --unset-all http.https://github.com/.extraheader +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:54.3270716Z [command]"C:\Program Files\Git\bin\git.exe" submodule foreach --recursive "sh -c \"git config --local --name-only --get-regexp 'http\.https\:\/\/github\.com\/\.extraheader' && git config --local --unset-all 'http.https://github.com/.extraheader' || :\"" +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:54.7993440Z [command]"C:\Program Files\Git\bin\git.exe" config --local --name-only --get-regexp ^includeIf\.gitdir: +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:54.8259273Z [command]"C:\Program Files\Git\bin\git.exe" submodule foreach --recursive "git config --local --show-origin --name-only --get-regexp remote.origin.url" +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:55.3174792Z Cleaning up orphan processes +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:55.3259206Z Terminate orphan process: pid (2520) (dotnet) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:55.3302843Z Terminate orphan process: pid (2548) (conhost) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:55.3450288Z Terminate orphan process: pid (5824) (VBCSCompiler) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:55.3507554Z Terminate orphan process: pid (840) (conhost) +Test (windows-latest) UNKNOWN STEP 2026-05-12T16:59:55.3563392Z ##[warning]Node.js 20 actions are deprecated. The following actions are running on Node.js 20 and may not work as expected: actions/checkout@v4, actions/setup-dotnet@v4. Actions will be forced to run with Node.js 24 by default starting June 2nd, 2026. Node.js 20 will be removed from the runner on September 16th, 2026. Please check if updated versions of these actions are available that support Node.js 24. To opt into Node.js 24 now, set the FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=true environment variable on the runner or in your workflow file. Once Node.js 24 becomes the default, you can temporarily opt out by setting ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION=true. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/ +Build Package UNKNOWN STEP 2026-05-12T17:00:01.2925421Z Current runner version: '2.334.0' +Build Package UNKNOWN STEP 2026-05-12T17:00:01.2960959Z ##[group]Runner Image Provisioner +Build Package UNKNOWN STEP 2026-05-12T17:00:01.2962123Z Hosted Compute Agent +Build Package UNKNOWN STEP 2026-05-12T17:00:01.2962979Z Version: 20260213.493 +Build Package UNKNOWN STEP 2026-05-12T17:00:01.2964092Z Commit: 5c115507f6dd24b8de37d8bbe0bb4509d0cc0fa3 +Build Package UNKNOWN STEP 2026-05-12T17:00:01.2965353Z Build Date: 2026-02-13T00:28:41Z +Build Package UNKNOWN STEP 2026-05-12T17:00:01.2967050Z Worker ID: {28d15f0c-211f-470b-b0f4-2e464e7082c3} +Build Package UNKNOWN STEP 2026-05-12T17:00:01.2968507Z Azure Region: eastus +Build Package UNKNOWN STEP 2026-05-12T17:00:01.2969431Z ##[endgroup] +Build Package UNKNOWN STEP 2026-05-12T17:00:01.2971895Z ##[group]Operating System +Build Package UNKNOWN STEP 2026-05-12T17:00:01.2972920Z Ubuntu +Build Package UNKNOWN STEP 2026-05-12T17:00:01.2973741Z 24.04.4 +Build Package UNKNOWN STEP 2026-05-12T17:00:01.2974659Z LTS +Build Package UNKNOWN STEP 2026-05-12T17:00:01.2975390Z ##[endgroup] +Build Package UNKNOWN STEP 2026-05-12T17:00:01.2976216Z ##[group]Runner Image +Build Package UNKNOWN STEP 2026-05-12T17:00:01.2977259Z Image: ubuntu-24.04 +Build Package UNKNOWN STEP 2026-05-12T17:00:01.2978470Z Version: 20260413.86.1 +Build Package UNKNOWN STEP 2026-05-12T17:00:01.2980581Z Included Software: https://github.com/actions/runner-images/blob/ubuntu24/20260413.86/images/ubuntu/Ubuntu2404-Readme.md +Build Package UNKNOWN STEP 2026-05-12T17:00:01.2983193Z Image Release: https://github.com/actions/runner-images/releases/tag/ubuntu24%2F20260413.86 +Build Package UNKNOWN STEP 2026-05-12T17:00:01.2984868Z ##[endgroup] +Build Package UNKNOWN STEP 2026-05-12T17:00:01.2990310Z ##[group]GITHUB_TOKEN Permissions +Build Package UNKNOWN STEP 2026-05-12T17:00:01.2993546Z Actions: write +Build Package UNKNOWN STEP 2026-05-12T17:00:01.2994387Z ArtifactMetadata: write +Build Package UNKNOWN STEP 2026-05-12T17:00:01.2995301Z Attestations: write +Build Package UNKNOWN STEP 2026-05-12T17:00:01.2996257Z Checks: write +Build Package UNKNOWN STEP 2026-05-12T17:00:01.2997075Z CodeQuality: write +Build Package UNKNOWN STEP 2026-05-12T17:00:01.2998166Z Contents: write +Build Package UNKNOWN STEP 2026-05-12T17:00:01.2999063Z Deployments: write +Build Package UNKNOWN STEP 2026-05-12T17:00:01.2999859Z Discussions: write +Build Package UNKNOWN STEP 2026-05-12T17:00:01.3000683Z Issues: write +Build Package UNKNOWN STEP 2026-05-12T17:00:01.3001691Z Metadata: read +Build Package UNKNOWN STEP 2026-05-12T17:00:01.3002520Z Models: read +Build Package UNKNOWN STEP 2026-05-12T17:00:01.3003345Z Packages: write +Build Package UNKNOWN STEP 2026-05-12T17:00:01.3004469Z Pages: write +Build Package UNKNOWN STEP 2026-05-12T17:00:01.3005276Z PullRequests: write +Build Package UNKNOWN STEP 2026-05-12T17:00:01.3006053Z RepositoryProjects: write +Build Package UNKNOWN STEP 2026-05-12T17:00:01.3007115Z SecurityEvents: write +Build Package UNKNOWN STEP 2026-05-12T17:00:01.3008294Z Statuses: write +Build Package UNKNOWN STEP 2026-05-12T17:00:01.3009082Z VulnerabilityAlerts: read +Build Package UNKNOWN STEP 2026-05-12T17:00:01.3010107Z ##[endgroup] +Build Package UNKNOWN STEP 2026-05-12T17:00:01.3012797Z Secret source: Actions +Build Package UNKNOWN STEP 2026-05-12T17:00:01.3014180Z Prepare workflow directory +Build Package UNKNOWN STEP 2026-05-12T17:00:01.3618352Z Prepare all required actions +Build Package UNKNOWN STEP 2026-05-12T17:00:01.3673196Z Getting action download info +Build Package UNKNOWN STEP 2026-05-12T17:00:01.7688303Z Download action repository 'actions/checkout@v4' (SHA:34e114876b0b11c390a56381ad16ebd13914f8d5) +Build Package UNKNOWN STEP 2026-05-12T17:00:01.8869569Z Download action repository 'actions/setup-dotnet@v4' (SHA:67a3573c9a986a3f9c594539f4ab511d57bb3ce9) +Build Package UNKNOWN STEP 2026-05-12T17:00:02.1086720Z Download action repository 'actions/upload-artifact@v4' (SHA:ea165f8d65b6e75b540449e92b4886f43607fa02) +Build Package UNKNOWN STEP 2026-05-12T17:00:02.3143046Z Complete job name: Build Package +Build Package UNKNOWN STEP 2026-05-12T17:00:02.3910729Z ##[group]Run actions/checkout@v4 +Build Package UNKNOWN STEP 2026-05-12T17:00:02.3911620Z with: +Build Package UNKNOWN STEP 2026-05-12T17:00:02.3912064Z repository: link-foundation/link-cli +Build Package UNKNOWN STEP 2026-05-12T17:00:02.3912800Z token: *** +Build Package UNKNOWN STEP 2026-05-12T17:00:02.3913209Z ssh-strict: true +Build Package UNKNOWN STEP 2026-05-12T17:00:02.3913650Z ssh-user: git +Build Package UNKNOWN STEP 2026-05-12T17:00:02.3914067Z persist-credentials: true +Build Package UNKNOWN STEP 2026-05-12T17:00:02.3914540Z clean: true +Build Package UNKNOWN STEP 2026-05-12T17:00:02.3914982Z sparse-checkout-cone-mode: true +Build Package UNKNOWN STEP 2026-05-12T17:00:02.3915481Z fetch-depth: 1 +Build Package UNKNOWN STEP 2026-05-12T17:00:02.3915900Z fetch-tags: false +Build Package UNKNOWN STEP 2026-05-12T17:00:02.3916327Z show-progress: true +Build Package UNKNOWN STEP 2026-05-12T17:00:02.3916756Z lfs: false +Build Package UNKNOWN STEP 2026-05-12T17:00:02.3917138Z submodules: false +Build Package UNKNOWN STEP 2026-05-12T17:00:02.3917566Z set-safe-directory: true +Build Package UNKNOWN STEP 2026-05-12T17:00:02.3918518Z env: +Build Package UNKNOWN STEP 2026-05-12T17:00:02.3918969Z DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true +Build Package UNKNOWN STEP 2026-05-12T17:00:02.3919545Z DOTNET_CLI_TELEMETRY_OPTOUT: true +Build Package UNKNOWN STEP 2026-05-12T17:00:02.3920058Z DOTNET_NOLOGO: true +Build Package UNKNOWN STEP 2026-05-12T17:00:02.3920482Z ##[endgroup] +Build Package UNKNOWN STEP 2026-05-12T17:00:02.5017559Z Syncing repository: link-foundation/link-cli +Build Package UNKNOWN STEP 2026-05-12T17:00:02.5019673Z ##[group]Getting Git version info +Build Package UNKNOWN STEP 2026-05-12T17:00:02.5020394Z Working directory is '/home/runner/work/link-cli/link-cli' +Build Package UNKNOWN STEP 2026-05-12T17:00:02.5021376Z [command]/usr/bin/git version +Build Package UNKNOWN STEP 2026-05-12T17:00:02.5057275Z git version 2.53.0 +Build Package UNKNOWN STEP 2026-05-12T17:00:02.5083389Z ##[endgroup] +Build Package UNKNOWN STEP 2026-05-12T17:00:02.5097467Z Temporarily overriding HOME='/home/runner/work/_temp/8d41cefe-0ab3-40d4-aa61-4c019a75b67c' before making global git config changes +Build Package UNKNOWN STEP 2026-05-12T17:00:02.5100165Z Adding repository directory to the temporary git global config as a safe directory +Build Package UNKNOWN STEP 2026-05-12T17:00:02.5110617Z [command]/usr/bin/git config --global --add safe.directory /home/runner/work/link-cli/link-cli +Build Package UNKNOWN STEP 2026-05-12T17:00:02.5141552Z Deleting the contents of '/home/runner/work/link-cli/link-cli' +Build Package UNKNOWN STEP 2026-05-12T17:00:02.5145176Z ##[group]Initializing the repository +Build Package UNKNOWN STEP 2026-05-12T17:00:02.5149141Z [command]/usr/bin/git init /home/runner/work/link-cli/link-cli +Build Package UNKNOWN STEP 2026-05-12T17:00:02.5225800Z hint: Using 'master' as the name for the initial branch. This default branch name +Build Package UNKNOWN STEP 2026-05-12T17:00:02.5227916Z hint: will change to "main" in Git 3.0. To configure the initial branch name +Build Package UNKNOWN STEP 2026-05-12T17:00:02.5229085Z hint: to use in all of your new repositories, which will suppress this warning, +Build Package UNKNOWN STEP 2026-05-12T17:00:02.5229896Z hint: call: +Build Package UNKNOWN STEP 2026-05-12T17:00:02.5230274Z hint: +Build Package UNKNOWN STEP 2026-05-12T17:00:02.5230784Z hint: git config --global init.defaultBranch +Build Package UNKNOWN STEP 2026-05-12T17:00:02.5231408Z hint: +Build Package UNKNOWN STEP 2026-05-12T17:00:02.5232378Z hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and +Build Package UNKNOWN STEP 2026-05-12T17:00:02.5234041Z hint: 'development'. The just-created branch can be renamed via this command: +Build Package UNKNOWN STEP 2026-05-12T17:00:02.5235341Z hint: +Build Package UNKNOWN STEP 2026-05-12T17:00:02.5235905Z hint: git branch -m +Build Package UNKNOWN STEP 2026-05-12T17:00:02.5236374Z hint: +Build Package UNKNOWN STEP 2026-05-12T17:00:02.5237064Z hint: Disable this message with "git config set advice.defaultBranchName false" +Build Package UNKNOWN STEP 2026-05-12T17:00:02.5238791Z Initialized empty Git repository in /home/runner/work/link-cli/link-cli/.git/ +Build Package UNKNOWN STEP 2026-05-12T17:00:02.5240464Z [command]/usr/bin/git remote add origin https://github.com/link-foundation/link-cli +Build Package UNKNOWN STEP 2026-05-12T17:00:02.5268953Z ##[endgroup] +Build Package UNKNOWN STEP 2026-05-12T17:00:02.5270169Z ##[group]Disabling automatic garbage collection +Build Package UNKNOWN STEP 2026-05-12T17:00:02.5272512Z [command]/usr/bin/git config --local gc.auto 0 +Build Package UNKNOWN STEP 2026-05-12T17:00:02.5300157Z ##[endgroup] +Build Package UNKNOWN STEP 2026-05-12T17:00:02.5301303Z ##[group]Setting up auth +Build Package UNKNOWN STEP 2026-05-12T17:00:02.5306400Z [command]/usr/bin/git config --local --name-only --get-regexp core\.sshCommand +Build Package UNKNOWN STEP 2026-05-12T17:00:02.5335581Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :" +Build Package UNKNOWN STEP 2026-05-12T17:00:02.5609653Z [command]/usr/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader +Build Package UNKNOWN STEP 2026-05-12T17:00:02.5639249Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'http\.https\:\/\/github\.com\/\.extraheader' && git config --local --unset-all 'http.https://github.com/.extraheader' || :" +Build Package UNKNOWN STEP 2026-05-12T17:00:02.5851422Z [command]/usr/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir: +Build Package UNKNOWN STEP 2026-05-12T17:00:02.5881049Z [command]/usr/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url +Build Package UNKNOWN STEP 2026-05-12T17:00:02.6103962Z [command]/usr/bin/git config --local http.https://github.com/.extraheader AUTHORIZATION: basic *** +Build Package UNKNOWN STEP 2026-05-12T17:00:02.6136884Z ##[endgroup] +Build Package UNKNOWN STEP 2026-05-12T17:00:02.6138602Z ##[group]Fetching the repository +Build Package UNKNOWN STEP 2026-05-12T17:00:02.6146923Z [command]/usr/bin/git -c protocol.version=2 fetch --no-tags --prune --no-recurse-submodules --depth=1 origin +d47e551d2d66c7bfe93f9a869ce9fab36347e317:refs/remotes/origin/main +Build Package UNKNOWN STEP 2026-05-12T17:00:04.5962808Z From https://github.com/link-foundation/link-cli +Build Package UNKNOWN STEP 2026-05-12T17:00:04.5964831Z * [new ref] d47e551d2d66c7bfe93f9a869ce9fab36347e317 -> origin/main +Build Package UNKNOWN STEP 2026-05-12T17:00:04.5990897Z ##[endgroup] +Build Package UNKNOWN STEP 2026-05-12T17:00:04.5991656Z ##[group]Determining the checkout info +Build Package UNKNOWN STEP 2026-05-12T17:00:04.5993594Z ##[endgroup] +Build Package UNKNOWN STEP 2026-05-12T17:00:04.5999122Z [command]/usr/bin/git sparse-checkout disable +Build Package UNKNOWN STEP 2026-05-12T17:00:04.6034179Z [command]/usr/bin/git config --local --unset-all extensions.worktreeConfig +Build Package UNKNOWN STEP 2026-05-12T17:00:04.6058832Z ##[group]Checking out the ref +Build Package UNKNOWN STEP 2026-05-12T17:00:04.6062851Z [command]/usr/bin/git checkout --progress --force -B main refs/remotes/origin/main +Build Package UNKNOWN STEP 2026-05-12T17:00:04.6654199Z Switched to a new branch 'main' +Build Package UNKNOWN STEP 2026-05-12T17:00:04.6654896Z branch 'main' set up to track 'origin/main'. +Build Package UNKNOWN STEP 2026-05-12T17:00:04.6667212Z ##[endgroup] +Build Package UNKNOWN STEP 2026-05-12T17:00:04.6705339Z [command]/usr/bin/git log -1 --format=%H +Build Package UNKNOWN STEP 2026-05-12T17:00:04.6726383Z d47e551d2d66c7bfe93f9a869ce9fab36347e317 +Build Package UNKNOWN STEP 2026-05-12T17:00:04.6925252Z ##[group]Run actions/setup-dotnet@v4 +Build Package UNKNOWN STEP 2026-05-12T17:00:04.6925607Z with: +Build Package UNKNOWN STEP 2026-05-12T17:00:04.6925828Z dotnet-version: 8.0.x +Build Package UNKNOWN STEP 2026-05-12T17:00:04.6926081Z cache: false +Build Package UNKNOWN STEP 2026-05-12T17:00:04.6926293Z env: +Build Package UNKNOWN STEP 2026-05-12T17:00:04.6926522Z DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true +Build Package UNKNOWN STEP 2026-05-12T17:00:04.6926836Z DOTNET_CLI_TELEMETRY_OPTOUT: true +Build Package UNKNOWN STEP 2026-05-12T17:00:04.6927121Z DOTNET_NOLOGO: true +Build Package UNKNOWN STEP 2026-05-12T17:00:04.6927347Z ##[endgroup] +Build Package UNKNOWN STEP 2026-05-12T17:00:04.8729842Z [command]/home/runner/work/_actions/actions/setup-dotnet/v4/externals/install-dotnet.sh --skip-non-versioned-files --runtime dotnet --channel LTS +Build Package UNKNOWN STEP 2026-05-12T17:00:05.1069568Z dotnet-install: Attempting to download using aka.ms link https://builds.dotnet.microsoft.com/dotnet/Runtime/10.0.7/dotnet-runtime-10.0.7-linux-x64.tar.gz +Build Package UNKNOWN STEP 2026-05-12T17:00:05.4832867Z dotnet-install: Remote file https://builds.dotnet.microsoft.com/dotnet/Runtime/10.0.7/dotnet-runtime-10.0.7-linux-x64.tar.gz size is 36689672 bytes. +Build Package UNKNOWN STEP 2026-05-12T17:00:05.4836674Z dotnet-install: Extracting archive from https://builds.dotnet.microsoft.com/dotnet/Runtime/10.0.7/dotnet-runtime-10.0.7-linux-x64.tar.gz +Build Package UNKNOWN STEP 2026-05-12T17:00:06.1472803Z dotnet-install: Downloaded file size is 36689672 bytes. +Build Package UNKNOWN STEP 2026-05-12T17:00:06.1473800Z dotnet-install: The remote and local file sizes are equal. +Build Package UNKNOWN STEP 2026-05-12T17:00:06.1752829Z dotnet-install: Installed version is 10.0.7 +Build Package UNKNOWN STEP 2026-05-12T17:00:06.1814991Z dotnet-install: Adding to current process PATH: `/usr/share/dotnet`. Note: This change will be visible only when sourcing script. +Build Package UNKNOWN STEP 2026-05-12T17:00:06.1816864Z dotnet-install: Note that the script does not resolve dependencies during installation. +Build Package UNKNOWN STEP 2026-05-12T17:00:06.1818644Z dotnet-install: To check the list of dependencies, go to https://learn.microsoft.com/dotnet/core/install, select your operating system and check the "Dependencies" section. +Build Package UNKNOWN STEP 2026-05-12T17:00:06.1819531Z dotnet-install: Installation finished successfully. +Build Package UNKNOWN STEP 2026-05-12T17:00:06.1860857Z [command]/home/runner/work/_actions/actions/setup-dotnet/v4/externals/install-dotnet.sh --skip-non-versioned-files --channel 8.0 +Build Package UNKNOWN STEP 2026-05-12T17:00:06.4577517Z dotnet-install: Attempting to download using aka.ms link https://builds.dotnet.microsoft.com/dotnet/Sdk/8.0.420/dotnet-sdk-8.0.420-linux-x64.tar.gz +Build Package UNKNOWN STEP 2026-05-12T17:00:07.3798258Z dotnet-install: Remote file https://builds.dotnet.microsoft.com/dotnet/Sdk/8.0.420/dotnet-sdk-8.0.420-linux-x64.tar.gz size is 216822173 bytes. +Build Package UNKNOWN STEP 2026-05-12T17:00:07.3802441Z dotnet-install: Extracting archive from https://builds.dotnet.microsoft.com/dotnet/Sdk/8.0.420/dotnet-sdk-8.0.420-linux-x64.tar.gz +Build Package UNKNOWN STEP 2026-05-12T17:00:11.7125199Z dotnet-install: Downloaded file size is 216822173 bytes. +Build Package UNKNOWN STEP 2026-05-12T17:00:11.7125675Z dotnet-install: The remote and local file sizes are equal. +Build Package UNKNOWN STEP 2026-05-12T17:00:11.9500698Z dotnet-install: Installed version is 8.0.420 +Build Package UNKNOWN STEP 2026-05-12T17:00:11.9560262Z dotnet-install: Adding to current process PATH: `/usr/share/dotnet`. Note: This change will be visible only when sourcing script. +Build Package UNKNOWN STEP 2026-05-12T17:00:11.9561453Z dotnet-install: Note that the script does not resolve dependencies during installation. +Build Package UNKNOWN STEP 2026-05-12T17:00:11.9563188Z dotnet-install: To check the list of dependencies, go to https://learn.microsoft.com/dotnet/core/install, select your operating system and check the "Dependencies" section. +Build Package UNKNOWN STEP 2026-05-12T17:00:11.9564694Z dotnet-install: Installation finished successfully. +Build Package UNKNOWN STEP 2026-05-12T17:00:11.9700883Z ##[group]Run dotnet restore +Build Package UNKNOWN STEP 2026-05-12T17:00:11.9701194Z ^[[36;1mdotnet restore^[[0m +Build Package UNKNOWN STEP 2026-05-12T17:00:11.9728025Z shell: /usr/bin/bash -e {0} +Build Package UNKNOWN STEP 2026-05-12T17:00:11.9728407Z env: +Build Package UNKNOWN STEP 2026-05-12T17:00:11.9728659Z DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true +Build Package UNKNOWN STEP 2026-05-12T17:00:11.9728939Z DOTNET_CLI_TELEMETRY_OPTOUT: true +Build Package UNKNOWN STEP 2026-05-12T17:00:11.9729181Z DOTNET_NOLOGO: true +Build Package UNKNOWN STEP 2026-05-12T17:00:11.9729385Z DOTNET_ROOT: /usr/share/dotnet +Build Package UNKNOWN STEP 2026-05-12T17:00:11.9729611Z ##[endgroup] +Build Package UNKNOWN STEP 2026-05-12T17:00:14.4067638Z Determining projects to restore... +Build Package UNKNOWN STEP 2026-05-12T17:00:17.0759526Z Restored /home/runner/work/link-cli/link-cli/csharp/Foundation.Data.Doublets.Cli/Foundation.Data.Doublets.Cli.csproj (in 2.02 sec). +Build Package UNKNOWN STEP 2026-05-12T17:00:17.0785757Z Restored /home/runner/work/link-cli/link-cli/csharp/Foundation.Data.Doublets.Cli.Tests/Foundation.Data.Doublets.Cli.Tests.csproj (in 2.02 sec). +Build Package UNKNOWN STEP 2026-05-12T17:00:17.1120094Z ##[group]Run dotnet build --no-restore --configuration Release +Build Package UNKNOWN STEP 2026-05-12T17:00:17.1120622Z ^[[36;1mdotnet build --no-restore --configuration Release^[[0m +Build Package UNKNOWN STEP 2026-05-12T17:00:17.1142127Z shell: /usr/bin/bash -e {0} +Build Package UNKNOWN STEP 2026-05-12T17:00:17.1142395Z env: +Build Package UNKNOWN STEP 2026-05-12T17:00:17.1142626Z DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true +Build Package UNKNOWN STEP 2026-05-12T17:00:17.1142928Z DOTNET_CLI_TELEMETRY_OPTOUT: true +Build Package UNKNOWN STEP 2026-05-12T17:00:17.1143217Z DOTNET_NOLOGO: true +Build Package UNKNOWN STEP 2026-05-12T17:00:17.1143440Z DOTNET_ROOT: /usr/share/dotnet +Build Package UNKNOWN STEP 2026-05-12T17:00:17.1143689Z ##[endgroup] +Build Package UNKNOWN STEP 2026-05-12T17:00:24.2852672Z Foundation.Data.Doublets.Cli -> /home/runner/work/link-cli/link-cli/csharp/Foundation.Data.Doublets.Cli/bin/Release/net8/Foundation.Data.Doublets.Cli.dll +Build Package UNKNOWN STEP 2026-05-12T17:00:25.5641450Z Foundation.Data.Doublets.Cli.Tests -> /home/runner/work/link-cli/link-cli/csharp/Foundation.Data.Doublets.Cli.Tests/bin/Release/net8/Foundation.Data.Doublets.Cli.Tests.dll +Build Package UNKNOWN STEP 2026-05-12T17:00:25.5852595Z +Build Package UNKNOWN STEP 2026-05-12T17:00:25.5859964Z Build succeeded. +Build Package UNKNOWN STEP 2026-05-12T17:00:25.5860608Z 0 Warning(s) +Build Package UNKNOWN STEP 2026-05-12T17:00:25.5860972Z 0 Error(s) +Build Package UNKNOWN STEP 2026-05-12T17:00:25.5861361Z +Build Package UNKNOWN STEP 2026-05-12T17:00:25.5861912Z Time Elapsed 00:00:08.30 +Build Package UNKNOWN STEP 2026-05-12T17:00:25.6039540Z ##[group]Run dotnet pack --no-build --configuration Release --output ./artifacts +Build Package UNKNOWN STEP 2026-05-12T17:00:25.6040130Z ^[[36;1mdotnet pack --no-build --configuration Release --output ./artifacts^[[0m +Build Package UNKNOWN STEP 2026-05-12T17:00:25.6061579Z shell: /usr/bin/bash -e {0} +Build Package UNKNOWN STEP 2026-05-12T17:00:25.6061804Z env: +Build Package UNKNOWN STEP 2026-05-12T17:00:25.6062007Z DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true +Build Package UNKNOWN STEP 2026-05-12T17:00:25.6062283Z DOTNET_CLI_TELEMETRY_OPTOUT: true +Build Package UNKNOWN STEP 2026-05-12T17:00:25.6062525Z DOTNET_NOLOGO: true +Build Package UNKNOWN STEP 2026-05-12T17:00:25.6062723Z DOTNET_ROOT: /usr/share/dotnet +Build Package UNKNOWN STEP 2026-05-12T17:00:25.6062947Z ##[endgroup] +Build Package UNKNOWN STEP 2026-05-12T17:00:26.1817042Z Foundation.Data.Doublets.Cli -> /home/runner/work/link-cli/link-cli/csharp/Foundation.Data.Doublets.Cli/bin/Release/net8/publish/ +Build Package UNKNOWN STEP 2026-05-12T17:00:26.5321870Z Successfully created package '/home/runner/work/link-cli/link-cli/csharp/artifacts/clink.2.3.0.nupkg'. +Build Package UNKNOWN STEP 2026-05-12T17:00:26.5644072Z ##[group]Run actions/upload-artifact@v4 +Build Package UNKNOWN STEP 2026-05-12T17:00:26.5644358Z with: +Build Package UNKNOWN STEP 2026-05-12T17:00:26.5644534Z name: nuget-package +Build Package UNKNOWN STEP 2026-05-12T17:00:26.5644748Z path: csharp/artifacts/*.nupkg +Build Package UNKNOWN STEP 2026-05-12T17:00:26.5645003Z if-no-files-found: warn +Build Package UNKNOWN STEP 2026-05-12T17:00:26.5645218Z compression-level: 6 +Build Package UNKNOWN STEP 2026-05-12T17:00:26.5645413Z overwrite: false +Build Package UNKNOWN STEP 2026-05-12T17:00:26.5645610Z include-hidden-files: false +Build Package UNKNOWN STEP 2026-05-12T17:00:26.5645819Z env: +Build Package UNKNOWN STEP 2026-05-12T17:00:26.5646007Z DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true +Build Package UNKNOWN STEP 2026-05-12T17:00:26.5646266Z DOTNET_CLI_TELEMETRY_OPTOUT: true +Build Package UNKNOWN STEP 2026-05-12T17:00:26.5646503Z DOTNET_NOLOGO: true +Build Package UNKNOWN STEP 2026-05-12T17:00:26.5646710Z DOTNET_ROOT: /usr/share/dotnet +Build Package UNKNOWN STEP 2026-05-12T17:00:26.5646923Z ##[endgroup] +Build Package UNKNOWN STEP 2026-05-12T17:00:26.7855802Z With the provided path, there will be 1 file uploaded +Build Package UNKNOWN STEP 2026-05-12T17:00:26.7862081Z Artifact name is valid! +Build Package UNKNOWN STEP 2026-05-12T17:00:26.7863019Z Root directory input is valid! +Build Package UNKNOWN STEP 2026-05-12T17:00:26.9475568Z Beginning upload of artifact content to blob storage +Build Package UNKNOWN STEP 2026-05-12T17:00:27.1018125Z Uploaded bytes 509845 +Build Package UNKNOWN STEP 2026-05-12T17:00:27.1238089Z Finished uploading artifact content to blob storage! +Build Package UNKNOWN STEP 2026-05-12T17:00:27.1242359Z SHA256 digest of uploaded artifact zip is 78b53c42543bd6eda0d21cab055e3b20be1f8068718ce47aef5d4b6a70fbf168 +Build Package UNKNOWN STEP 2026-05-12T17:00:27.1244331Z Finalizing artifact upload +Build Package UNKNOWN STEP 2026-05-12T17:00:27.2253372Z Artifact nuget-package.zip successfully finalized. Artifact ID 6950604963 +Build Package UNKNOWN STEP 2026-05-12T17:00:27.2255039Z Artifact nuget-package has been successfully uploaded! Final size is 509845 bytes. Artifact ID is 6950604963 +Build Package UNKNOWN STEP 2026-05-12T17:00:27.2264830Z Artifact download URL: https://github.com/link-foundation/link-cli/actions/runs/25749404027/artifacts/6950604963 +Build Package UNKNOWN STEP 2026-05-12T17:00:27.2424374Z Post job cleanup. +Build Package UNKNOWN STEP 2026-05-12T17:00:27.4386807Z Post job cleanup. +Build Package UNKNOWN STEP 2026-05-12T17:00:27.5358371Z [command]/usr/bin/git version +Build Package UNKNOWN STEP 2026-05-12T17:00:27.5398405Z git version 2.53.0 +Build Package UNKNOWN STEP 2026-05-12T17:00:27.5443182Z Temporarily overriding HOME='/home/runner/work/_temp/7811226b-aacd-48dd-8ed1-bf87a6f5dbd6' before making global git config changes +Build Package UNKNOWN STEP 2026-05-12T17:00:27.5444812Z Adding repository directory to the temporary git global config as a safe directory +Build Package UNKNOWN STEP 2026-05-12T17:00:27.5448964Z [command]/usr/bin/git config --global --add safe.directory /home/runner/work/link-cli/link-cli +Build Package UNKNOWN STEP 2026-05-12T17:00:27.5486507Z [command]/usr/bin/git config --local --name-only --get-regexp core\.sshCommand +Build Package UNKNOWN STEP 2026-05-12T17:00:27.5519455Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :" +Build Package UNKNOWN STEP 2026-05-12T17:00:27.5759356Z [command]/usr/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader +Build Package UNKNOWN STEP 2026-05-12T17:00:27.5778473Z http.https://github.com/.extraheader +Build Package UNKNOWN STEP 2026-05-12T17:00:27.5791211Z [command]/usr/bin/git config --local --unset-all http.https://github.com/.extraheader +Build Package UNKNOWN STEP 2026-05-12T17:00:27.5823830Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'http\.https\:\/\/github\.com\/\.extraheader' && git config --local --unset-all 'http.https://github.com/.extraheader' || :" +Build Package UNKNOWN STEP 2026-05-12T17:00:27.6054659Z [command]/usr/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir: +Build Package UNKNOWN STEP 2026-05-12T17:00:27.6086956Z [command]/usr/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url +Build Package UNKNOWN STEP 2026-05-12T17:00:27.6455192Z Cleaning up orphan processes +Build Package UNKNOWN STEP 2026-05-12T17:00:27.6784372Z Terminate orphan process: pid (2806) (dotnet) +Build Package UNKNOWN STEP 2026-05-12T17:00:27.6806124Z Terminate orphan process: pid (2864) (VBCSCompiler) +Build Package UNKNOWN STEP 2026-05-12T17:00:27.6830420Z ##[warning]Node.js 20 actions are deprecated. The following actions are running on Node.js 20 and may not work as expected: actions/checkout@v4, actions/setup-dotnet@v4, actions/upload-artifact@v4. Actions will be forced to run with Node.js 24 by default starting June 2nd, 2026. Node.js 20 will be removed from the runner on September 16th, 2026. Please check if updated versions of these actions are available that support Node.js 24. To opt into Node.js 24 now, set the FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=true environment variable on the runner or in your workflow file. Once Node.js 24 becomes the default, you can temporarily opt out by setting ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION=true. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/ +Release UNKNOWN STEP 2026-05-12T17:00:38.3389228Z Current runner version: '2.334.0' +Release UNKNOWN STEP 2026-05-12T17:00:38.3427831Z ##[group]Runner Image Provisioner +Release UNKNOWN STEP 2026-05-12T17:00:38.3429221Z Hosted Compute Agent +Release UNKNOWN STEP 2026-05-12T17:00:38.3430146Z Version: 20260213.493 +Release UNKNOWN STEP 2026-05-12T17:00:38.3431658Z Commit: 5c115507f6dd24b8de37d8bbe0bb4509d0cc0fa3 +Release UNKNOWN STEP 2026-05-12T17:00:38.3432821Z Build Date: 2026-02-13T00:28:41Z +Release UNKNOWN STEP 2026-05-12T17:00:38.3434576Z Worker ID: {2973f1b8-a984-433f-9884-12eacea0cb86} +Release UNKNOWN STEP 2026-05-12T17:00:38.3436005Z Azure Region: eastus +Release UNKNOWN STEP 2026-05-12T17:00:38.3436950Z ##[endgroup] +Release UNKNOWN STEP 2026-05-12T17:00:38.3439493Z ##[group]Operating System +Release UNKNOWN STEP 2026-05-12T17:00:38.3440653Z Ubuntu +Release UNKNOWN STEP 2026-05-12T17:00:38.3441838Z 24.04.4 +Release UNKNOWN STEP 2026-05-12T17:00:38.3442855Z LTS +Release UNKNOWN STEP 2026-05-12T17:00:38.3443727Z ##[endgroup] +Release UNKNOWN STEP 2026-05-12T17:00:38.3444614Z ##[group]Runner Image +Release UNKNOWN STEP 2026-05-12T17:00:38.3445708Z Image: ubuntu-24.04 +Release UNKNOWN STEP 2026-05-12T17:00:38.3446599Z Version: 20260413.86.1 +Release UNKNOWN STEP 2026-05-12T17:00:38.3448715Z Included Software: https://github.com/actions/runner-images/blob/ubuntu24/20260413.86/images/ubuntu/Ubuntu2404-Readme.md +Release UNKNOWN STEP 2026-05-12T17:00:38.3451362Z Image Release: https://github.com/actions/runner-images/releases/tag/ubuntu24%2F20260413.86 +Release UNKNOWN STEP 2026-05-12T17:00:38.3453273Z ##[endgroup] +Release UNKNOWN STEP 2026-05-12T17:00:38.3455263Z ##[group]GITHUB_TOKEN Permissions +Release UNKNOWN STEP 2026-05-12T17:00:38.3458437Z Contents: write +Release UNKNOWN STEP 2026-05-12T17:00:38.3459494Z Metadata: read +Release UNKNOWN STEP 2026-05-12T17:00:38.3460428Z Packages: write +Release UNKNOWN STEP 2026-05-12T17:00:38.3461260Z ##[endgroup] +Release UNKNOWN STEP 2026-05-12T17:00:38.3464915Z Secret source: Actions +Release UNKNOWN STEP 2026-05-12T17:00:38.3466075Z Prepare workflow directory +Release UNKNOWN STEP 2026-05-12T17:00:38.4074594Z Prepare all required actions +Release UNKNOWN STEP 2026-05-12T17:00:38.4113344Z Getting action download info +Release UNKNOWN STEP 2026-05-12T17:00:38.7197851Z Download action repository 'actions/checkout@v4' (SHA:34e114876b0b11c390a56381ad16ebd13914f8d5) +Release UNKNOWN STEP 2026-05-12T17:00:39.5609889Z Download action repository 'actions/setup-dotnet@v4' (SHA:67a3573c9a986a3f9c594539f4ab511d57bb3ce9) +Release UNKNOWN STEP 2026-05-12T17:00:39.7968969Z Download action repository 'actions/setup-node@v4' (SHA:49933ea5288caeca8642d1e84afbd3f7d6820020) +Release UNKNOWN STEP 2026-05-12T17:00:40.0829072Z Complete job name: Release +Release UNKNOWN STEP 2026-05-12T17:00:40.1592894Z ##[group]Run actions/checkout@v4 +Release UNKNOWN STEP 2026-05-12T17:00:40.1593596Z with: +Release UNKNOWN STEP 2026-05-12T17:00:40.1593852Z fetch-depth: 0 +Release UNKNOWN STEP 2026-05-12T17:00:40.1594147Z repository: link-foundation/link-cli +Release UNKNOWN STEP 2026-05-12T17:00:40.1594739Z token: *** +Release UNKNOWN STEP 2026-05-12T17:00:40.1594986Z ssh-strict: true +Release UNKNOWN STEP 2026-05-12T17:00:40.1595236Z ssh-user: git +Release UNKNOWN STEP 2026-05-12T17:00:40.1595488Z persist-credentials: true +Release UNKNOWN STEP 2026-05-12T17:00:40.1595787Z clean: true +Release UNKNOWN STEP 2026-05-12T17:00:40.1596047Z sparse-checkout-cone-mode: true +Release UNKNOWN STEP 2026-05-12T17:00:40.1596374Z fetch-tags: false +Release UNKNOWN STEP 2026-05-12T17:00:40.1596648Z show-progress: true +Release UNKNOWN STEP 2026-05-12T17:00:40.1596898Z lfs: false +Release UNKNOWN STEP 2026-05-12T17:00:40.1597130Z submodules: false +Release UNKNOWN STEP 2026-05-12T17:00:40.1597385Z set-safe-directory: true +Release UNKNOWN STEP 2026-05-12T17:00:40.1597898Z env: +Release UNKNOWN STEP 2026-05-12T17:00:40.1598169Z DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true +Release UNKNOWN STEP 2026-05-12T17:00:40.1598511Z DOTNET_CLI_TELEMETRY_OPTOUT: true +Release UNKNOWN STEP 2026-05-12T17:00:40.1598818Z DOTNET_NOLOGO: true +Release UNKNOWN STEP 2026-05-12T17:00:40.1599090Z ##[endgroup] +Release UNKNOWN STEP 2026-05-12T17:00:40.2766513Z Syncing repository: link-foundation/link-cli +Release UNKNOWN STEP 2026-05-12T17:00:40.2768164Z ##[group]Getting Git version info +Release UNKNOWN STEP 2026-05-12T17:00:40.2768687Z Working directory is '/home/runner/work/link-cli/link-cli' +Release UNKNOWN STEP 2026-05-12T17:00:40.2769346Z [command]/usr/bin/git version +Release UNKNOWN STEP 2026-05-12T17:00:40.4129268Z git version 2.53.0 +Release UNKNOWN STEP 2026-05-12T17:00:40.4169631Z ##[endgroup] +Release UNKNOWN STEP 2026-05-12T17:00:40.4200694Z Temporarily overriding HOME='/home/runner/work/_temp/354376bd-093b-48a3-b68c-ac42a6ef1f50' before making global git config changes +Release UNKNOWN STEP 2026-05-12T17:00:40.4202122Z Adding repository directory to the temporary git global config as a safe directory +Release UNKNOWN STEP 2026-05-12T17:00:40.4209610Z [command]/usr/bin/git config --global --add safe.directory /home/runner/work/link-cli/link-cli +Release UNKNOWN STEP 2026-05-12T17:00:40.4256998Z Deleting the contents of '/home/runner/work/link-cli/link-cli' +Release UNKNOWN STEP 2026-05-12T17:00:40.4262461Z ##[group]Initializing the repository +Release UNKNOWN STEP 2026-05-12T17:00:40.4269331Z [command]/usr/bin/git init /home/runner/work/link-cli/link-cli +Release UNKNOWN STEP 2026-05-12T17:00:40.4561266Z hint: Using 'master' as the name for the initial branch. This default branch name +Release UNKNOWN STEP 2026-05-12T17:00:40.4562767Z hint: will change to "main" in Git 3.0. To configure the initial branch name +Release UNKNOWN STEP 2026-05-12T17:00:40.4563877Z hint: to use in all of your new repositories, which will suppress this warning, +Release UNKNOWN STEP 2026-05-12T17:00:40.4564833Z hint: call: +Release UNKNOWN STEP 2026-05-12T17:00:40.4565273Z hint: +Release UNKNOWN STEP 2026-05-12T17:00:40.4565881Z hint: git config --global init.defaultBranch +Release UNKNOWN STEP 2026-05-12T17:00:40.4566574Z hint: +Release UNKNOWN STEP 2026-05-12T17:00:40.4567214Z hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and +Release UNKNOWN STEP 2026-05-12T17:00:40.4568287Z hint: 'development'. The just-created branch can be renamed via this command: +Release UNKNOWN STEP 2026-05-12T17:00:40.4569115Z hint: +Release UNKNOWN STEP 2026-05-12T17:00:40.4569545Z hint: git branch -m +Release UNKNOWN STEP 2026-05-12T17:00:40.4570040Z hint: +Release UNKNOWN STEP 2026-05-12T17:00:40.4570707Z hint: Disable this message with "git config set advice.defaultBranchName false" +Release UNKNOWN STEP 2026-05-12T17:00:40.4572252Z Initialized empty Git repository in /home/runner/work/link-cli/link-cli/.git/ +Release UNKNOWN STEP 2026-05-12T17:00:40.4579158Z [command]/usr/bin/git remote add origin https://github.com/link-foundation/link-cli +Release UNKNOWN STEP 2026-05-12T17:00:40.4613124Z ##[endgroup] +Release UNKNOWN STEP 2026-05-12T17:00:40.4613944Z ##[group]Disabling automatic garbage collection +Release UNKNOWN STEP 2026-05-12T17:00:40.4619054Z [command]/usr/bin/git config --local gc.auto 0 +Release UNKNOWN STEP 2026-05-12T17:00:40.4649815Z ##[endgroup] +Release UNKNOWN STEP 2026-05-12T17:00:40.4650644Z ##[group]Setting up auth +Release UNKNOWN STEP 2026-05-12T17:00:40.4658995Z [command]/usr/bin/git config --local --name-only --get-regexp core\.sshCommand +Release UNKNOWN STEP 2026-05-12T17:00:40.4692479Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :" +Release UNKNOWN STEP 2026-05-12T17:00:40.6027469Z [command]/usr/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader +Release UNKNOWN STEP 2026-05-12T17:00:40.6061238Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'http\.https\:\/\/github\.com\/\.extraheader' && git config --local --unset-all 'http.https://github.com/.extraheader' || :" +Release UNKNOWN STEP 2026-05-12T17:00:40.6287139Z [command]/usr/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir: +Release UNKNOWN STEP 2026-05-12T17:00:40.6322132Z [command]/usr/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url +Release UNKNOWN STEP 2026-05-12T17:00:40.6557535Z [command]/usr/bin/git config --local http.https://github.com/.extraheader AUTHORIZATION: basic *** +Release UNKNOWN STEP 2026-05-12T17:00:40.6595452Z ##[endgroup] +Release UNKNOWN STEP 2026-05-12T17:00:40.6596412Z ##[group]Fetching the repository +Release UNKNOWN STEP 2026-05-12T17:00:40.6605793Z [command]/usr/bin/git -c protocol.version=2 fetch --prune --no-recurse-submodules origin +refs/heads/*:refs/remotes/origin/* +refs/tags/*:refs/tags/* +Release UNKNOWN STEP 2026-05-12T17:00:41.2440241Z From https://github.com/link-foundation/link-cli +Release UNKNOWN STEP 2026-05-12T17:00:41.2443115Z * [new branch] claude/code-review-and-issues-01WwM3yFJiaRwTrhABNoUkYa -> origin/claude/code-review-and-issues-01WwM3yFJiaRwTrhABNoUkYa +Release UNKNOWN STEP 2026-05-12T17:00:41.2445024Z * [new branch] issue-11-36571c97 -> origin/issue-11-36571c97 +Release UNKNOWN STEP 2026-05-12T17:00:41.2446320Z * [new branch] issue-12-fc4292e4 -> origin/issue-12-fc4292e4 +Release UNKNOWN STEP 2026-05-12T17:00:41.2447540Z * [new branch] issue-15-d0c58a82 -> origin/issue-15-d0c58a82 +Release UNKNOWN STEP 2026-05-12T17:00:41.2448911Z * [new branch] issue-17-1bd2fb57 -> origin/issue-17-1bd2fb57 +Release UNKNOWN STEP 2026-05-12T17:00:41.2449995Z * [new branch] issue-18-f86143d5 -> origin/issue-18-f86143d5 +Release UNKNOWN STEP 2026-05-12T17:00:41.2451272Z * [new branch] issue-19-9de6817b -> origin/issue-19-9de6817b +Release UNKNOWN STEP 2026-05-12T17:00:41.2452802Z * [new branch] issue-20-aba7a4fa -> origin/issue-20-aba7a4fa +Release UNKNOWN STEP 2026-05-12T17:00:41.2454024Z * [new branch] issue-22-889744b4 -> origin/issue-22-889744b4 +Release UNKNOWN STEP 2026-05-12T17:00:41.2455176Z * [new branch] issue-23-e23fa86d -> origin/issue-23-e23fa86d +Release UNKNOWN STEP 2026-05-12T17:00:41.2456395Z * [new branch] issue-24-3e3135c5 -> origin/issue-24-3e3135c5 +Release UNKNOWN STEP 2026-05-12T17:00:41.2457986Z * [new branch] issue-25-4c1591ce -> origin/issue-25-4c1591ce +Release UNKNOWN STEP 2026-05-12T17:00:41.2459131Z * [new branch] issue-26-c9ed9c27 -> origin/issue-26-c9ed9c27 +Release UNKNOWN STEP 2026-05-12T17:00:41.2460429Z * [new branch] issue-3-af35a436 -> origin/issue-3-af35a436 +Release UNKNOWN STEP 2026-05-12T17:00:41.2461907Z * [new branch] issue-30-7073054f -> origin/issue-30-7073054f +Release UNKNOWN STEP 2026-05-12T17:00:41.2462754Z * [new branch] issue-31-e51b89e4 -> origin/issue-31-e51b89e4 +Release UNKNOWN STEP 2026-05-12T17:00:41.2463471Z * [new branch] issue-32-3b3efd02 -> origin/issue-32-3b3efd02 +Release UNKNOWN STEP 2026-05-12T17:00:41.2463966Z * [new branch] issue-33-a60a3c86 -> origin/issue-33-a60a3c86 +Release UNKNOWN STEP 2026-05-12T17:00:41.2464422Z * [new branch] issue-34-22f3c425 -> origin/issue-34-22f3c425 +Release UNKNOWN STEP 2026-05-12T17:00:41.2464867Z * [new branch] issue-35-391818e8 -> origin/issue-35-391818e8 +Release UNKNOWN STEP 2026-05-12T17:00:41.2465302Z * [new branch] issue-56-73ae4c3a -> origin/issue-56-73ae4c3a +Release UNKNOWN STEP 2026-05-12T17:00:41.2465794Z * [new branch] issue-58-2571f420 -> origin/issue-58-2571f420 +Release UNKNOWN STEP 2026-05-12T17:00:41.2466255Z * [new branch] issue-63-452491b85cd2 -> origin/issue-63-452491b85cd2 +Release UNKNOWN STEP 2026-05-12T17:00:41.2466727Z * [new branch] issue-65-5d06345e60dc -> origin/issue-65-5d06345e60dc +Release UNKNOWN STEP 2026-05-12T17:00:41.2467197Z * [new branch] issue-67-d67d72474036 -> origin/issue-67-d67d72474036 +Release UNKNOWN STEP 2026-05-12T17:00:41.2467719Z * [new branch] issue-69-43fc7f1a4ec3 -> origin/issue-69-43fc7f1a4ec3 +Release UNKNOWN STEP 2026-05-12T17:00:41.2468183Z * [new branch] issue-71-c1debd4cdf5e -> origin/issue-71-c1debd4cdf5e +Release UNKNOWN STEP 2026-05-12T17:00:41.2468710Z * [new branch] issue-73-d71d2656d381 -> origin/issue-73-d71d2656d381 +Release UNKNOWN STEP 2026-05-12T17:00:41.2469237Z * [new branch] issue-75-2384a28fe185 -> origin/issue-75-2384a28fe185 +Release UNKNOWN STEP 2026-05-12T17:00:41.2469771Z * [new branch] issue-77-388911d8eea6 -> origin/issue-77-388911d8eea6 +Release UNKNOWN STEP 2026-05-12T17:00:41.2470239Z * [new branch] issue-79-49ca4f759246 -> origin/issue-79-49ca4f759246 +Release UNKNOWN STEP 2026-05-12T17:00:41.2470984Z * [new branch] issue-79-c80df6f859e8 -> origin/issue-79-c80df6f859e8 +Release UNKNOWN STEP 2026-05-12T17:00:41.2471848Z * [new branch] issue-8-e91a69e5 -> origin/issue-8-e91a69e5 +Release UNKNOWN STEP 2026-05-12T17:00:41.2472296Z * [new branch] main -> origin/main +Release UNKNOWN STEP 2026-05-12T17:00:41.2472701Z * [new branch] named-links -> origin/named-links +Release UNKNOWN STEP 2026-05-12T17:00:41.2473142Z * [new branch] nested-creation-1 -> origin/nested-creation-1 +Release UNKNOWN STEP 2026-05-12T17:00:41.2473545Z * [new tag] 1.0.1 -> 1.0.1 +Release UNKNOWN STEP 2026-05-12T17:00:41.2473902Z * [new tag] rust-v0.1.0 -> rust-v0.1.0 +Release UNKNOWN STEP 2026-05-12T17:00:41.2474258Z * [new tag] rust-v0.2.0 -> rust-v0.2.0 +Release UNKNOWN STEP 2026-05-12T17:00:41.2474609Z * [new tag] v1.2.1 -> v1.2.1 +Release UNKNOWN STEP 2026-05-12T17:00:41.2474950Z * [new tag] v1.2.2 -> v1.2.2 +Release UNKNOWN STEP 2026-05-12T17:00:41.2475288Z * [new tag] v1.2.3 -> v1.2.3 +Release UNKNOWN STEP 2026-05-12T17:00:41.2475658Z * [new tag] v1.3.0 -> v1.3.0 +Release UNKNOWN STEP 2026-05-12T17:00:41.2475990Z * [new tag] v1.3.1 -> v1.3.1 +Release UNKNOWN STEP 2026-05-12T17:00:41.2476342Z * [new tag] v1.4.0 -> v1.4.0 +Release UNKNOWN STEP 2026-05-12T17:00:41.2476675Z * [new tag] v1.4.1 -> v1.4.1 +Release UNKNOWN STEP 2026-05-12T17:00:41.2476995Z * [new tag] v1.5.0 -> v1.5.0 +Release UNKNOWN STEP 2026-05-12T17:00:41.2477358Z * [new tag] v1.6.0 -> v1.6.0 +Release UNKNOWN STEP 2026-05-12T17:00:41.2477678Z * [new tag] v1.7.0 -> v1.7.0 +Release UNKNOWN STEP 2026-05-12T17:00:41.2478003Z * [new tag] v1.7.1 -> v1.7.1 +Release UNKNOWN STEP 2026-05-12T17:00:41.2478342Z * [new tag] v1.7.2 -> v1.7.2 +Release UNKNOWN STEP 2026-05-12T17:00:41.2478659Z * [new tag] v1.7.3 -> v1.7.3 +Release UNKNOWN STEP 2026-05-12T17:00:41.2478989Z * [new tag] v1.7.4 -> v1.7.4 +Release UNKNOWN STEP 2026-05-12T17:00:41.2479314Z * [new tag] v1.8.0 -> v1.8.0 +Release UNKNOWN STEP 2026-05-12T17:00:41.2479636Z * [new tag] v2.0.2 -> v2.0.2 +Release UNKNOWN STEP 2026-05-12T17:00:41.2480165Z * [new tag] v2.1.0 -> v2.1.0 +Release UNKNOWN STEP 2026-05-12T17:00:41.2480499Z * [new tag] v2.1.1 -> v2.1.1 +Release UNKNOWN STEP 2026-05-12T17:00:41.2480822Z * [new tag] v2.1.2 -> v2.1.2 +Release UNKNOWN STEP 2026-05-12T17:00:41.2481151Z * [new tag] v2.1.3 -> v2.1.3 +Release UNKNOWN STEP 2026-05-12T17:00:41.2481773Z * [new tag] v2.2.0 -> v2.2.0 +Release UNKNOWN STEP 2026-05-12T17:00:41.2482128Z * [new tag] v2.2.1 -> v2.2.1 +Release UNKNOWN STEP 2026-05-12T17:00:41.2482450Z * [new tag] v2.2.2 -> v2.2.2 +Release UNKNOWN STEP 2026-05-12T17:00:41.2482768Z * [new tag] v2.4.0 -> v2.4.0 +Release UNKNOWN STEP 2026-05-12T17:00:41.2542342Z [command]/usr/bin/git branch --list --remote origin/main +Release UNKNOWN STEP 2026-05-12T17:00:41.2571815Z origin/main +Release UNKNOWN STEP 2026-05-12T17:00:41.2580655Z [command]/usr/bin/git rev-parse refs/remotes/origin/main +Release UNKNOWN STEP 2026-05-12T17:00:41.2601817Z d47e551d2d66c7bfe93f9a869ce9fab36347e317 +Release UNKNOWN STEP 2026-05-12T17:00:41.2606263Z ##[endgroup] +Release UNKNOWN STEP 2026-05-12T17:00:41.2606766Z ##[group]Determining the checkout info +Release UNKNOWN STEP 2026-05-12T17:00:41.2607485Z ##[endgroup] +Release UNKNOWN STEP 2026-05-12T17:00:41.2612277Z [command]/usr/bin/git sparse-checkout disable +Release UNKNOWN STEP 2026-05-12T17:00:41.2648466Z [command]/usr/bin/git config --local --unset-all extensions.worktreeConfig +Release UNKNOWN STEP 2026-05-12T17:00:41.2674444Z ##[group]Checking out the ref +Release UNKNOWN STEP 2026-05-12T17:00:41.2679425Z [command]/usr/bin/git checkout --progress --force -B main refs/remotes/origin/main +Release UNKNOWN STEP 2026-05-12T17:00:41.3291172Z Switched to a new branch 'main' +Release UNKNOWN STEP 2026-05-12T17:00:41.3292804Z branch 'main' set up to track 'origin/main'. +Release UNKNOWN STEP 2026-05-12T17:00:41.3305480Z ##[endgroup] +Release UNKNOWN STEP 2026-05-12T17:00:41.3344467Z [command]/usr/bin/git log -1 --format=%H +Release UNKNOWN STEP 2026-05-12T17:00:41.3368554Z d47e551d2d66c7bfe93f9a869ce9fab36347e317 +Release UNKNOWN STEP 2026-05-12T17:00:41.3568500Z ##[group]Run actions/setup-dotnet@v4 +Release UNKNOWN STEP 2026-05-12T17:00:41.3568844Z with: +Release UNKNOWN STEP 2026-05-12T17:00:41.3569055Z dotnet-version: 8.0.x +Release UNKNOWN STEP 2026-05-12T17:00:41.3569306Z cache: false +Release UNKNOWN STEP 2026-05-12T17:00:41.3569513Z env: +Release UNKNOWN STEP 2026-05-12T17:00:41.3569726Z DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true +Release UNKNOWN STEP 2026-05-12T17:00:41.3570054Z DOTNET_CLI_TELEMETRY_OPTOUT: true +Release UNKNOWN STEP 2026-05-12T17:00:41.3570329Z DOTNET_NOLOGO: true +Release UNKNOWN STEP 2026-05-12T17:00:41.3570560Z ##[endgroup] +Release UNKNOWN STEP 2026-05-12T17:00:41.5601250Z [command]/home/runner/work/_actions/actions/setup-dotnet/v4/externals/install-dotnet.sh --skip-non-versioned-files --runtime dotnet --channel LTS +Release UNKNOWN STEP 2026-05-12T17:00:41.8186009Z dotnet-install: Attempting to download using aka.ms link https://builds.dotnet.microsoft.com/dotnet/Runtime/10.0.7/dotnet-runtime-10.0.7-linux-x64.tar.gz +Release UNKNOWN STEP 2026-05-12T17:00:42.0570527Z dotnet-install: Remote file https://builds.dotnet.microsoft.com/dotnet/Runtime/10.0.7/dotnet-runtime-10.0.7-linux-x64.tar.gz size is 36689672 bytes. +Release UNKNOWN STEP 2026-05-12T17:00:42.0574172Z dotnet-install: Extracting archive from https://builds.dotnet.microsoft.com/dotnet/Runtime/10.0.7/dotnet-runtime-10.0.7-linux-x64.tar.gz +Release UNKNOWN STEP 2026-05-12T17:00:42.7408620Z dotnet-install: Downloaded file size is 36689672 bytes. +Release UNKNOWN STEP 2026-05-12T17:00:42.7409938Z dotnet-install: The remote and local file sizes are equal. +Release UNKNOWN STEP 2026-05-12T17:00:42.7689915Z dotnet-install: Installed version is 10.0.7 +Release UNKNOWN STEP 2026-05-12T17:00:42.7748821Z dotnet-install: Adding to current process PATH: `/usr/share/dotnet`. Note: This change will be visible only when sourcing script. +Release UNKNOWN STEP 2026-05-12T17:00:42.7750685Z dotnet-install: Note that the script does not resolve dependencies during installation. +Release UNKNOWN STEP 2026-05-12T17:00:42.7752788Z dotnet-install: To check the list of dependencies, go to https://learn.microsoft.com/dotnet/core/install, select your operating system and check the "Dependencies" section. +Release UNKNOWN STEP 2026-05-12T17:00:42.7755871Z dotnet-install: Installation finished successfully. +Release UNKNOWN STEP 2026-05-12T17:00:42.7783666Z [command]/home/runner/work/_actions/actions/setup-dotnet/v4/externals/install-dotnet.sh --skip-non-versioned-files --channel 8.0 +Release UNKNOWN STEP 2026-05-12T17:00:43.1973319Z dotnet-install: Attempting to download using aka.ms link https://builds.dotnet.microsoft.com/dotnet/Sdk/8.0.420/dotnet-sdk-8.0.420-linux-x64.tar.gz +Release UNKNOWN STEP 2026-05-12T17:00:44.1749435Z dotnet-install: Remote file https://builds.dotnet.microsoft.com/dotnet/Sdk/8.0.420/dotnet-sdk-8.0.420-linux-x64.tar.gz size is 216822173 bytes. +Release UNKNOWN STEP 2026-05-12T17:00:44.1752255Z dotnet-install: Extracting archive from https://builds.dotnet.microsoft.com/dotnet/Sdk/8.0.420/dotnet-sdk-8.0.420-linux-x64.tar.gz +Release UNKNOWN STEP 2026-05-12T17:00:48.6323173Z dotnet-install: Downloaded file size is 216822173 bytes. +Release UNKNOWN STEP 2026-05-12T17:00:48.6324069Z dotnet-install: The remote and local file sizes are equal. +Release UNKNOWN STEP 2026-05-12T17:00:48.8826275Z dotnet-install: Installed version is 8.0.420 +Release UNKNOWN STEP 2026-05-12T17:00:48.8886327Z dotnet-install: Adding to current process PATH: `/usr/share/dotnet`. Note: This change will be visible only when sourcing script. +Release UNKNOWN STEP 2026-05-12T17:00:48.8887943Z dotnet-install: Note that the script does not resolve dependencies during installation. +Release UNKNOWN STEP 2026-05-12T17:00:48.8889957Z dotnet-install: To check the list of dependencies, go to https://learn.microsoft.com/dotnet/core/install, select your operating system and check the "Dependencies" section. +Release UNKNOWN STEP 2026-05-12T17:00:48.8891603Z dotnet-install: Installation finished successfully. +Release UNKNOWN STEP 2026-05-12T17:00:48.9092221Z ##[group]Run actions/setup-node@v4 +Release UNKNOWN STEP 2026-05-12T17:00:48.9092552Z with: +Release UNKNOWN STEP 2026-05-12T17:00:48.9092753Z node-version: 20.x +Release UNKNOWN STEP 2026-05-12T17:00:48.9092973Z always-auth: false +Release UNKNOWN STEP 2026-05-12T17:00:48.9093180Z check-latest: false +Release UNKNOWN STEP 2026-05-12T17:00:48.9093499Z token: *** +Release UNKNOWN STEP 2026-05-12T17:00:48.9093682Z env: +Release UNKNOWN STEP 2026-05-12T17:00:48.9093879Z DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true +Release UNKNOWN STEP 2026-05-12T17:00:48.9094169Z DOTNET_CLI_TELEMETRY_OPTOUT: true +Release UNKNOWN STEP 2026-05-12T17:00:48.9094433Z DOTNET_NOLOGO: true +Release UNKNOWN STEP 2026-05-12T17:00:48.9094665Z DOTNET_ROOT: /usr/share/dotnet +Release UNKNOWN STEP 2026-05-12T17:00:48.9094894Z ##[endgroup] +Release UNKNOWN STEP 2026-05-12T17:00:49.1244185Z Found in cache @ /opt/hostedtoolcache/node/20.20.2/x64 +Release UNKNOWN STEP 2026-05-12T17:00:49.1253195Z ##[group]Environment details +Release UNKNOWN STEP 2026-05-12T17:00:52.1959489Z node: v20.20.2 +Release UNKNOWN STEP 2026-05-12T17:00:52.1959873Z npm: 10.8.2 +Release UNKNOWN STEP 2026-05-12T17:00:52.1960161Z yarn: 1.22.22 +Release UNKNOWN STEP 2026-05-12T17:00:52.1973218Z ##[endgroup] +Release UNKNOWN STEP 2026-05-12T17:00:52.2064583Z ##[group]Run # Count changeset files (excluding README.md and config.json) +Release UNKNOWN STEP 2026-05-12T17:00:52.2065182Z ^[[36;1m# Count changeset files (excluding README.md and config.json)^[[0m +Release UNKNOWN STEP 2026-05-12T17:00:52.2065751Z ^[[36;1mCHANGESET_COUNT=$(find csharp/.changeset -name "*.md" ! -name "README.md" 2>/dev/null | wc -l)^[[0m +Release UNKNOWN STEP 2026-05-12T17:00:52.2066290Z ^[[36;1mecho "Found $CHANGESET_COUNT changeset file(s)"^[[0m +Release UNKNOWN STEP 2026-05-12T17:00:52.2066803Z ^[[36;1mecho "has_changesets=$([[ $CHANGESET_COUNT -gt 0 ]] && echo 'true' || echo 'false')" >> $GITHUB_OUTPUT^[[0m +Release UNKNOWN STEP 2026-05-12T17:00:52.2067343Z ^[[36;1mecho "changeset_count=$CHANGESET_COUNT" >> $GITHUB_OUTPUT^[[0m +Release UNKNOWN STEP 2026-05-12T17:00:52.2097425Z shell: /usr/bin/bash -e {0} +Release UNKNOWN STEP 2026-05-12T17:00:52.2097671Z env: +Release UNKNOWN STEP 2026-05-12T17:00:52.2097888Z DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true +Release UNKNOWN STEP 2026-05-12T17:00:52.2098172Z DOTNET_CLI_TELEMETRY_OPTOUT: true +Release UNKNOWN STEP 2026-05-12T17:00:52.2098421Z DOTNET_NOLOGO: true +Release UNKNOWN STEP 2026-05-12T17:00:52.2098638Z DOTNET_ROOT: /usr/share/dotnet +Release UNKNOWN STEP 2026-05-12T17:00:52.2098927Z ##[endgroup] +Release UNKNOWN STEP 2026-05-12T17:00:52.2281641Z Found 12 changeset file(s) +Release UNKNOWN STEP 2026-05-12T17:00:52.2344159Z ##[group]Run echo "Multiple changesets detected, merging..." +Release UNKNOWN STEP 2026-05-12T17:00:52.2344607Z ^[[36;1mecho "Multiple changesets detected, merging..."^[[0m +Release UNKNOWN STEP 2026-05-12T17:00:52.2344966Z ^[[36;1mnode csharp/scripts/merge-changesets.mjs \^[[0m +Release UNKNOWN STEP 2026-05-12T17:00:52.2345291Z ^[[36;1m --dir csharp/.changeset \^[[0m +Release UNKNOWN STEP 2026-05-12T17:00:52.2345611Z ^[[36;1m --package-name Foundation.Data.Doublets.Cli^[[0m +Release UNKNOWN STEP 2026-05-12T17:00:52.2366934Z shell: /usr/bin/bash -e {0} +Release UNKNOWN STEP 2026-05-12T17:00:52.2367175Z env: +Release UNKNOWN STEP 2026-05-12T17:00:52.2367384Z DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true +Release UNKNOWN STEP 2026-05-12T17:00:52.2367659Z DOTNET_CLI_TELEMETRY_OPTOUT: true +Release UNKNOWN STEP 2026-05-12T17:00:52.2367903Z DOTNET_NOLOGO: true +Release UNKNOWN STEP 2026-05-12T17:00:52.2368111Z DOTNET_ROOT: /usr/share/dotnet +Release UNKNOWN STEP 2026-05-12T17:00:52.2368347Z ##[endgroup] +Release UNKNOWN STEP 2026-05-12T17:00:52.2411931Z Multiple changesets detected, merging... +Release UNKNOWN STEP 2026-05-12T17:00:52.2753157Z Checking for multiple changesets to merge... +Release UNKNOWN STEP 2026-05-12T17:00:52.2757742Z Found 12 changeset file(s) +Release UNKNOWN STEP 2026-05-12T17:00:52.2758475Z Multiple changesets found, merging... +Release UNKNOWN STEP 2026-05-12T17:00:52.2759024Z - add-export-alias.md +Release UNKNOWN STEP 2026-05-12T17:00:52.2759473Z - add-lino-input-import.md +Release UNKNOWN STEP 2026-05-12T17:00:52.2759940Z - add-lino-output-export.md +Release UNKNOWN STEP 2026-05-12T17:00:52.2760448Z - add-named-types-decorator.md +Release UNKNOWN STEP 2026-05-12T17:00:52.2761032Z - add-persistent-transformation-triggers.md +Release UNKNOWN STEP 2026-05-12T17:00:52.2761900Z - add-pinned-types-decorator.md +Release UNKNOWN STEP 2026-05-12T17:00:52.2762415Z - fix-issue-20-substitution.md +Release UNKNOWN STEP 2026-05-12T17:00:52.2762943Z - fix-issue-62-review-coverage.md +Release UNKNOWN STEP 2026-05-12T17:00:52.2763561Z - split-csharp-scripts.md +Release UNKNOWN STEP 2026-05-12T17:00:52.2764085Z - support-string-id-aliases.md +Release UNKNOWN STEP 2026-05-12T17:00:52.2764658Z - update-links-notation-dependency.md +Release UNKNOWN STEP 2026-05-12T17:00:52.2765201Z - validate-missing-references.md +Release UNKNOWN STEP 2026-05-12T17:00:52.2780417Z +Release UNKNOWN STEP 2026-05-12T17:00:52.2780610Z Merge summary: +Release UNKNOWN STEP 2026-05-12T17:00:52.2781026Z Bump types found: minor, patch +Release UNKNOWN STEP 2026-05-12T17:00:52.2782185Z Using highest: minor +Release UNKNOWN STEP 2026-05-12T17:00:52.2783068Z Descriptions to merge: 12 +Release UNKNOWN STEP 2026-05-12T17:00:52.2788382Z +Release UNKNOWN STEP 2026-05-12T17:00:52.2789013Z Created merged changeset: merged-a4d5814f-74c7-4bf6-b933-cd14063970c7.md +Release UNKNOWN STEP 2026-05-12T17:00:52.2789540Z +Release UNKNOWN STEP 2026-05-12T17:00:52.2789782Z Removing original changeset files: +Release UNKNOWN STEP 2026-05-12T17:00:52.2790763Z Removed: add-export-alias.md +Release UNKNOWN STEP 2026-05-12T17:00:52.2791776Z Removed: add-lino-input-import.md +Release UNKNOWN STEP 2026-05-12T17:00:52.2792625Z Removed: add-lino-output-export.md +Release UNKNOWN STEP 2026-05-12T17:00:52.2793368Z Removed: add-named-types-decorator.md +Release UNKNOWN STEP 2026-05-12T17:00:52.2794105Z Removed: add-persistent-transformation-triggers.md +Release UNKNOWN STEP 2026-05-12T17:00:52.2794780Z Removed: add-pinned-types-decorator.md +Release UNKNOWN STEP 2026-05-12T17:00:52.2795470Z Removed: fix-issue-20-substitution.md +Release UNKNOWN STEP 2026-05-12T17:00:52.2796186Z Removed: fix-issue-62-review-coverage.md +Release UNKNOWN STEP 2026-05-12T17:00:52.2796875Z Removed: split-csharp-scripts.md +Release UNKNOWN STEP 2026-05-12T17:00:52.2797792Z Removed: support-string-id-aliases.md +Release UNKNOWN STEP 2026-05-12T17:00:52.2798436Z Removed: update-links-notation-dependency.md +Release UNKNOWN STEP 2026-05-12T17:00:52.2799117Z Removed: validate-missing-references.md +Release UNKNOWN STEP 2026-05-12T17:00:52.2800255Z +Release UNKNOWN STEP 2026-05-12T17:00:52.2800590Z Changeset merge completed successfully +Release UNKNOWN STEP 2026-05-12T17:00:52.2801097Z +Release UNKNOWN STEP 2026-05-12T17:00:52.2801313Z Merged changeset content: +Release UNKNOWN STEP 2026-05-12T17:00:52.2801889Z --- +Release UNKNOWN STEP 2026-05-12T17:00:52.2802171Z 'Foundation.Data.Doublets.Cli': minor +Release UNKNOWN STEP 2026-05-12T17:00:52.2802431Z --- +Release UNKNOWN STEP 2026-05-12T17:00:52.2802523Z +Release UNKNOWN STEP 2026-05-12T17:00:52.2802765Z Added `--export` as an alias for `--out` database export. +Release UNKNOWN STEP 2026-05-12T17:00:52.2803010Z +Release UNKNOWN STEP 2026-05-12T17:00:52.2803729Z Added `--in`/`--lino-input`/`--import` database import support for reading LiNo files into the links database with named references enabled by default. +Release UNKNOWN STEP 2026-05-12T17:00:52.2804298Z +Release UNKNOWN STEP 2026-05-12T17:00:52.2804974Z Added `--out`/`--lino-output` database export support that writes the complete links database as LiNo with named references when available. +Release UNKNOWN STEP 2026-05-12T17:00:52.2805511Z +Release UNKNOWN STEP 2026-05-12T17:00:52.2806689Z Added a universal `NamedTypesDecorator` that implements both links operations and named type lookups, with automatic cleanup and uniqueness checks for external-reference names. +Release UNKNOWN STEP 2026-05-12T17:00:52.2807980Z +Release UNKNOWN STEP 2026-05-12T17:00:52.2809182Z Added binary links-backed persistent transformation triggers with `--always`, `--once`, `--never`, `--triggers-file`, and `--embed-triggers`. +Release UNKNOWN STEP 2026-05-12T17:00:52.2809988Z +Release UNKNOWN STEP 2026-05-12T17:00:52.2810850Z Added `IPinnedTypes` and `PinnedTypesDecorator`, and composed pinned type support into `NamedTypesDecorator`. +Release UNKNOWN STEP 2026-05-12T17:00:52.2811317Z +Release UNKNOWN STEP 2026-05-12T17:00:52.2812572Z Fixed self-link substitution with outgoing links by preserving unbound substitution parts from the matched link and rejecting unsupported link addresses during explicit creation. +Release UNKNOWN STEP 2026-05-12T17:00:52.2813295Z +Release UNKNOWN STEP 2026-05-12T17:00:52.2814056Z Fixed explicit indexed numeric updates so auto-created numeric references do not steal the substitution pair, and added issue 62 regression coverage. +Release UNKNOWN STEP 2026-05-12T17:00:52.2814882Z +Release UNKNOWN STEP 2026-05-12T17:00:52.2815270Z Moved C# release automation into `csharp/scripts/` and packaged the C# README +Release UNKNOWN STEP 2026-05-12T17:00:52.2815734Z with the NuGet tool. +Release UNKNOWN STEP 2026-05-12T17:00:52.2815896Z +Release UNKNOWN STEP 2026-05-12T17:00:52.2816378Z Added full string ID alias support for advanced LiNo queries through the named types decorator. +Release UNKNOWN STEP 2026-05-12T17:00:52.2816844Z +Release UNKNOWN STEP 2026-05-12T17:00:52.2817670Z Updated the C# LiNo parser dependency to the current `Link.Foundation.Links.Notation` package and refreshed supported NuGet package versions. +Release UNKNOWN STEP 2026-05-12T17:00:52.2818350Z +Release UNKNOWN STEP 2026-05-12T17:00:52.2819253Z Added strict validation for missing numeric and named link references, plus `--auto-create-missing-references` to create missing references as self-referential point links. +Release UNKNOWN STEP 2026-05-12T17:00:52.2820044Z +Release UNKNOWN STEP 2026-05-12T17:00:52.2874053Z ##[group]Run node csharp/scripts/version-and-commit.mjs --mode changeset +Release UNKNOWN STEP 2026-05-12T17:00:52.2874595Z ^[[36;1mnode csharp/scripts/version-and-commit.mjs --mode changeset^[[0m +Release UNKNOWN STEP 2026-05-12T17:00:52.2896449Z shell: /usr/bin/bash -e {0} +Release UNKNOWN STEP 2026-05-12T17:00:52.2896684Z env: +Release UNKNOWN STEP 2026-05-12T17:00:52.2896891Z DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true +Release UNKNOWN STEP 2026-05-12T17:00:52.2897175Z DOTNET_CLI_TELEMETRY_OPTOUT: true +Release UNKNOWN STEP 2026-05-12T17:00:52.2897413Z DOTNET_NOLOGO: true +Release UNKNOWN STEP 2026-05-12T17:00:52.2897629Z DOTNET_ROOT: /usr/share/dotnet +Release UNKNOWN STEP 2026-05-12T17:00:52.2897865Z ##[endgroup] +Release UNKNOWN STEP 2026-05-12T17:00:52.3322446Z Found 1 changeset file(s) +Release UNKNOWN STEP 2026-05-12T17:00:52.3331039Z Bump types found: minor +Release UNKNOWN STEP 2026-05-12T17:00:52.3331779Z Using highest: minor +Release UNKNOWN STEP 2026-05-12T17:00:52.3364058Z Tag csharp-v2.4.0 already exists +Release UNKNOWN STEP 2026-05-12T17:00:52.3366786Z Output: already_released=true +Release UNKNOWN STEP 2026-05-12T17:00:52.3367397Z Output: new_version=2.4.0 +Release UNKNOWN STEP 2026-05-12T17:00:52.3485794Z Post job cleanup. +Release UNKNOWN STEP 2026-05-12T17:00:52.5296673Z Post job cleanup. +Release UNKNOWN STEP 2026-05-12T17:00:52.7008355Z Post job cleanup. +Release UNKNOWN STEP 2026-05-12T17:00:52.8084001Z [command]/usr/bin/git version +Release UNKNOWN STEP 2026-05-12T17:00:52.8124449Z git version 2.53.0 +Release UNKNOWN STEP 2026-05-12T17:00:52.8172243Z Temporarily overriding HOME='/home/runner/work/_temp/b94a0c50-293e-4229-9f87-6e56526390f1' before making global git config changes +Release UNKNOWN STEP 2026-05-12T17:00:52.8173423Z Adding repository directory to the temporary git global config as a safe directory +Release UNKNOWN STEP 2026-05-12T17:00:52.8186780Z [command]/usr/bin/git config --global --add safe.directory /home/runner/work/link-cli/link-cli +Release UNKNOWN STEP 2026-05-12T17:00:52.8226295Z [command]/usr/bin/git config --local --name-only --get-regexp core\.sshCommand +Release UNKNOWN STEP 2026-05-12T17:00:52.8260657Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :" +Release UNKNOWN STEP 2026-05-12T17:00:52.8494550Z [command]/usr/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader +Release UNKNOWN STEP 2026-05-12T17:00:52.8519219Z http.https://github.com/.extraheader +Release UNKNOWN STEP 2026-05-12T17:00:52.8532681Z [command]/usr/bin/git config --local --unset-all http.https://github.com/.extraheader +Release UNKNOWN STEP 2026-05-12T17:00:52.8566270Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'http\.https\:\/\/github\.com\/\.extraheader' && git config --local --unset-all 'http.https://github.com/.extraheader' || :" +Release UNKNOWN STEP 2026-05-12T17:00:52.8793478Z [command]/usr/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir: +Release UNKNOWN STEP 2026-05-12T17:00:52.8826492Z [command]/usr/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url +Release UNKNOWN STEP 2026-05-12T17:00:52.9157991Z Cleaning up orphan processes +Release UNKNOWN STEP 2026-05-12T17:00:52.9471321Z ##[warning]Node.js 20 actions are deprecated. The following actions are running on Node.js 20 and may not work as expected: actions/checkout@v4, actions/setup-dotnet@v4, actions/setup-node@v4. Actions will be forced to run with Node.js 24 by default starting June 2nd, 2026. Node.js 20 will be removed from the runner on September 16th, 2026. Please check if updated versions of these actions are available that support Node.js 24. To opt into Node.js 24 now, set the FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=true environment variable on the runner or in your workflow file. Once Node.js 24 becomes the default, you can temporarily opt out by setting ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION=true. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/ diff --git a/docs/case-studies/issue-82/evidence/runs-for-d47e551.json b/docs/case-studies/issue-82/evidence/runs-for-d47e551.json new file mode 100644 index 0000000..f00d09f --- /dev/null +++ b/docs/case-studies/issue-82/evidence/runs-for-d47e551.json @@ -0,0 +1 @@ +{"total_count":2,"workflow_runs":[{"id":25749404027,"name":"C# CI/CD Pipeline","node_id":"WFR_kwLONXCAbs8AAAAF_si5ew","head_branch":"main","head_sha":"d47e551d2d66c7bfe93f9a869ce9fab36347e317","path":".github/workflows/csharp.yml","display_title":"Merge pull request #81 from link-foundation/issue-79-c80df6f859e8","run_number":76,"event":"push","status":"completed","conclusion":"success","workflow_id":131965046,"check_suite_id":68651161842,"check_suite_node_id":"CS_kwDONXCAbs8AAAAP--2Y8g","url":"https://api.github.com/repos/link-foundation/link-cli/actions/runs/25749404027","html_url":"https://github.com/link-foundation/link-cli/actions/runs/25749404027","pull_requests":[],"created_at":"2026-05-12T16:57:36Z","updated_at":"2026-05-12T17:00:55Z","actor":{"login":"konard","id":1431904,"node_id":"MDQ6VXNlcjE0MzE5MDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1431904?v=4","gravatar_id":"","url":"https://api.github.com/users/konard","html_url":"https://github.com/konard","followers_url":"https://api.github.com/users/konard/followers","following_url":"https://api.github.com/users/konard/following{/other_user}","gists_url":"https://api.github.com/users/konard/gists{/gist_id}","starred_url":"https://api.github.com/users/konard/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/konard/subscriptions","organizations_url":"https://api.github.com/users/konard/orgs","repos_url":"https://api.github.com/users/konard/repos","events_url":"https://api.github.com/users/konard/events{/privacy}","received_events_url":"https://api.github.com/users/konard/received_events","type":"User","user_view_type":"public","site_admin":false},"run_attempt":1,"referenced_workflows":[],"run_started_at":"2026-05-12T16:57:36Z","triggering_actor":{"login":"konard","id":1431904,"node_id":"MDQ6VXNlcjE0MzE5MDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1431904?v=4","gravatar_id":"","url":"https://api.github.com/users/konard","html_url":"https://github.com/konard","followers_url":"https://api.github.com/users/konard/followers","following_url":"https://api.github.com/users/konard/following{/other_user}","gists_url":"https://api.github.com/users/konard/gists{/gist_id}","starred_url":"https://api.github.com/users/konard/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/konard/subscriptions","organizations_url":"https://api.github.com/users/konard/orgs","repos_url":"https://api.github.com/users/konard/repos","events_url":"https://api.github.com/users/konard/events{/privacy}","received_events_url":"https://api.github.com/users/konard/received_events","type":"User","user_view_type":"public","site_admin":false},"jobs_url":"https://api.github.com/repos/link-foundation/link-cli/actions/runs/25749404027/jobs","logs_url":"https://api.github.com/repos/link-foundation/link-cli/actions/runs/25749404027/logs","check_suite_url":"https://api.github.com/repos/link-foundation/link-cli/check-suites/68651161842","artifacts_url":"https://api.github.com/repos/link-foundation/link-cli/actions/runs/25749404027/artifacts","cancel_url":"https://api.github.com/repos/link-foundation/link-cli/actions/runs/25749404027/cancel","rerun_url":"https://api.github.com/repos/link-foundation/link-cli/actions/runs/25749404027/rerun","previous_attempt_url":null,"workflow_url":"https://api.github.com/repos/link-foundation/link-cli/actions/workflows/131965046","head_commit":{"id":"d47e551d2d66c7bfe93f9a869ce9fab36347e317","tree_id":"d9dcefae9e3fd1dd03e77cb2dcd0856e8534fdf3","message":"Merge pull request #81 from link-foundation/issue-79-c80df6f859e8\n\nfix: auto-deploy GitHub Pages and attach NuGet packages to releases","timestamp":"2026-05-12T16:57:31Z","author":{"name":"Konstantin Diachenko","email":"drakonard@gmail.com"},"committer":{"name":"GitHub","email":"noreply@github.com"}},"repository":{"id":896565358,"node_id":"R_kgDONXCAbg","name":"link-cli","full_name":"link-foundation/link-cli","private":false,"owner":{"login":"link-foundation","id":176174013,"node_id":"O_kgDOCoAzvQ","avatar_url":"https://avatars.githubusercontent.com/u/176174013?v=4","gravatar_id":"","url":"https://api.github.com/users/link-foundation","html_url":"https://github.com/link-foundation","followers_url":"https://api.github.com/users/link-foundation/followers","following_url":"https://api.github.com/users/link-foundation/following{/other_user}","gists_url":"https://api.github.com/users/link-foundation/gists{/gist_id}","starred_url":"https://api.github.com/users/link-foundation/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/link-foundation/subscriptions","organizations_url":"https://api.github.com/users/link-foundation/orgs","repos_url":"https://api.github.com/users/link-foundation/repos","events_url":"https://api.github.com/users/link-foundation/events{/privacy}","received_events_url":"https://api.github.com/users/link-foundation/received_events","type":"Organization","user_view_type":"public","site_admin":false},"html_url":"https://github.com/link-foundation/link-cli","description":"A CLI tool to manipulate links.","fork":false,"url":"https://api.github.com/repos/link-foundation/link-cli","forks_url":"https://api.github.com/repos/link-foundation/link-cli/forks","keys_url":"https://api.github.com/repos/link-foundation/link-cli/keys{/key_id}","collaborators_url":"https://api.github.com/repos/link-foundation/link-cli/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/link-foundation/link-cli/teams","hooks_url":"https://api.github.com/repos/link-foundation/link-cli/hooks","issue_events_url":"https://api.github.com/repos/link-foundation/link-cli/issues/events{/number}","events_url":"https://api.github.com/repos/link-foundation/link-cli/events","assignees_url":"https://api.github.com/repos/link-foundation/link-cli/assignees{/user}","branches_url":"https://api.github.com/repos/link-foundation/link-cli/branches{/branch}","tags_url":"https://api.github.com/repos/link-foundation/link-cli/tags","blobs_url":"https://api.github.com/repos/link-foundation/link-cli/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/link-foundation/link-cli/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/link-foundation/link-cli/git/refs{/sha}","trees_url":"https://api.github.com/repos/link-foundation/link-cli/git/trees{/sha}","statuses_url":"https://api.github.com/repos/link-foundation/link-cli/statuses/{sha}","languages_url":"https://api.github.com/repos/link-foundation/link-cli/languages","stargazers_url":"https://api.github.com/repos/link-foundation/link-cli/stargazers","contributors_url":"https://api.github.com/repos/link-foundation/link-cli/contributors","subscribers_url":"https://api.github.com/repos/link-foundation/link-cli/subscribers","subscription_url":"https://api.github.com/repos/link-foundation/link-cli/subscription","commits_url":"https://api.github.com/repos/link-foundation/link-cli/commits{/sha}","git_commits_url":"https://api.github.com/repos/link-foundation/link-cli/git/commits{/sha}","comments_url":"https://api.github.com/repos/link-foundation/link-cli/comments{/number}","issue_comment_url":"https://api.github.com/repos/link-foundation/link-cli/issues/comments{/number}","contents_url":"https://api.github.com/repos/link-foundation/link-cli/contents/{+path}","compare_url":"https://api.github.com/repos/link-foundation/link-cli/compare/{base}...{head}","merges_url":"https://api.github.com/repos/link-foundation/link-cli/merges","archive_url":"https://api.github.com/repos/link-foundation/link-cli/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/link-foundation/link-cli/downloads","issues_url":"https://api.github.com/repos/link-foundation/link-cli/issues{/number}","pulls_url":"https://api.github.com/repos/link-foundation/link-cli/pulls{/number}","milestones_url":"https://api.github.com/repos/link-foundation/link-cli/milestones{/number}","notifications_url":"https://api.github.com/repos/link-foundation/link-cli/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/link-foundation/link-cli/labels{/name}","releases_url":"https://api.github.com/repos/link-foundation/link-cli/releases{/id}","deployments_url":"https://api.github.com/repos/link-foundation/link-cli/deployments"},"head_repository":{"id":896565358,"node_id":"R_kgDONXCAbg","name":"link-cli","full_name":"link-foundation/link-cli","private":false,"owner":{"login":"link-foundation","id":176174013,"node_id":"O_kgDOCoAzvQ","avatar_url":"https://avatars.githubusercontent.com/u/176174013?v=4","gravatar_id":"","url":"https://api.github.com/users/link-foundation","html_url":"https://github.com/link-foundation","followers_url":"https://api.github.com/users/link-foundation/followers","following_url":"https://api.github.com/users/link-foundation/following{/other_user}","gists_url":"https://api.github.com/users/link-foundation/gists{/gist_id}","starred_url":"https://api.github.com/users/link-foundation/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/link-foundation/subscriptions","organizations_url":"https://api.github.com/users/link-foundation/orgs","repos_url":"https://api.github.com/users/link-foundation/repos","events_url":"https://api.github.com/users/link-foundation/events{/privacy}","received_events_url":"https://api.github.com/users/link-foundation/received_events","type":"Organization","user_view_type":"public","site_admin":false},"html_url":"https://github.com/link-foundation/link-cli","description":"A CLI tool to manipulate links.","fork":false,"url":"https://api.github.com/repos/link-foundation/link-cli","forks_url":"https://api.github.com/repos/link-foundation/link-cli/forks","keys_url":"https://api.github.com/repos/link-foundation/link-cli/keys{/key_id}","collaborators_url":"https://api.github.com/repos/link-foundation/link-cli/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/link-foundation/link-cli/teams","hooks_url":"https://api.github.com/repos/link-foundation/link-cli/hooks","issue_events_url":"https://api.github.com/repos/link-foundation/link-cli/issues/events{/number}","events_url":"https://api.github.com/repos/link-foundation/link-cli/events","assignees_url":"https://api.github.com/repos/link-foundation/link-cli/assignees{/user}","branches_url":"https://api.github.com/repos/link-foundation/link-cli/branches{/branch}","tags_url":"https://api.github.com/repos/link-foundation/link-cli/tags","blobs_url":"https://api.github.com/repos/link-foundation/link-cli/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/link-foundation/link-cli/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/link-foundation/link-cli/git/refs{/sha}","trees_url":"https://api.github.com/repos/link-foundation/link-cli/git/trees{/sha}","statuses_url":"https://api.github.com/repos/link-foundation/link-cli/statuses/{sha}","languages_url":"https://api.github.com/repos/link-foundation/link-cli/languages","stargazers_url":"https://api.github.com/repos/link-foundation/link-cli/stargazers","contributors_url":"https://api.github.com/repos/link-foundation/link-cli/contributors","subscribers_url":"https://api.github.com/repos/link-foundation/link-cli/subscribers","subscription_url":"https://api.github.com/repos/link-foundation/link-cli/subscription","commits_url":"https://api.github.com/repos/link-foundation/link-cli/commits{/sha}","git_commits_url":"https://api.github.com/repos/link-foundation/link-cli/git/commits{/sha}","comments_url":"https://api.github.com/repos/link-foundation/link-cli/comments{/number}","issue_comment_url":"https://api.github.com/repos/link-foundation/link-cli/issues/comments{/number}","contents_url":"https://api.github.com/repos/link-foundation/link-cli/contents/{+path}","compare_url":"https://api.github.com/repos/link-foundation/link-cli/compare/{base}...{head}","merges_url":"https://api.github.com/repos/link-foundation/link-cli/merges","archive_url":"https://api.github.com/repos/link-foundation/link-cli/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/link-foundation/link-cli/downloads","issues_url":"https://api.github.com/repos/link-foundation/link-cli/issues{/number}","pulls_url":"https://api.github.com/repos/link-foundation/link-cli/pulls{/number}","milestones_url":"https://api.github.com/repos/link-foundation/link-cli/milestones{/number}","notifications_url":"https://api.github.com/repos/link-foundation/link-cli/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/link-foundation/link-cli/labels{/name}","releases_url":"https://api.github.com/repos/link-foundation/link-cli/releases{/id}","deployments_url":"https://api.github.com/repos/link-foundation/link-cli/deployments"}},{"id":25749403949,"name":"WebAssembly CI","node_id":"WFR_kwLONXCAbs8AAAAF_si5LQ","head_branch":"main","head_sha":"d47e551d2d66c7bfe93f9a869ce9fab36347e317","path":".github/workflows/wasm.yml","display_title":"Merge pull request #81 from link-foundation/issue-79-c80df6f859e8","run_number":49,"event":"push","status":"completed","conclusion":"success","workflow_id":188109243,"check_suite_id":68651161601,"check_suite_node_id":"CS_kwDONXCAbs8AAAAP--2YAQ","url":"https://api.github.com/repos/link-foundation/link-cli/actions/runs/25749403949","html_url":"https://github.com/link-foundation/link-cli/actions/runs/25749403949","pull_requests":[],"created_at":"2026-05-12T16:57:36Z","updated_at":"2026-05-12T17:01:45Z","actor":{"login":"konard","id":1431904,"node_id":"MDQ6VXNlcjE0MzE5MDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1431904?v=4","gravatar_id":"","url":"https://api.github.com/users/konard","html_url":"https://github.com/konard","followers_url":"https://api.github.com/users/konard/followers","following_url":"https://api.github.com/users/konard/following{/other_user}","gists_url":"https://api.github.com/users/konard/gists{/gist_id}","starred_url":"https://api.github.com/users/konard/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/konard/subscriptions","organizations_url":"https://api.github.com/users/konard/orgs","repos_url":"https://api.github.com/users/konard/repos","events_url":"https://api.github.com/users/konard/events{/privacy}","received_events_url":"https://api.github.com/users/konard/received_events","type":"User","user_view_type":"public","site_admin":false},"run_attempt":1,"referenced_workflows":[],"run_started_at":"2026-05-12T16:57:36Z","triggering_actor":{"login":"konard","id":1431904,"node_id":"MDQ6VXNlcjE0MzE5MDQ=","avatar_url":"https://avatars.githubusercontent.com/u/1431904?v=4","gravatar_id":"","url":"https://api.github.com/users/konard","html_url":"https://github.com/konard","followers_url":"https://api.github.com/users/konard/followers","following_url":"https://api.github.com/users/konard/following{/other_user}","gists_url":"https://api.github.com/users/konard/gists{/gist_id}","starred_url":"https://api.github.com/users/konard/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/konard/subscriptions","organizations_url":"https://api.github.com/users/konard/orgs","repos_url":"https://api.github.com/users/konard/repos","events_url":"https://api.github.com/users/konard/events{/privacy}","received_events_url":"https://api.github.com/users/konard/received_events","type":"User","user_view_type":"public","site_admin":false},"jobs_url":"https://api.github.com/repos/link-foundation/link-cli/actions/runs/25749403949/jobs","logs_url":"https://api.github.com/repos/link-foundation/link-cli/actions/runs/25749403949/logs","check_suite_url":"https://api.github.com/repos/link-foundation/link-cli/check-suites/68651161601","artifacts_url":"https://api.github.com/repos/link-foundation/link-cli/actions/runs/25749403949/artifacts","cancel_url":"https://api.github.com/repos/link-foundation/link-cli/actions/runs/25749403949/cancel","rerun_url":"https://api.github.com/repos/link-foundation/link-cli/actions/runs/25749403949/rerun","previous_attempt_url":null,"workflow_url":"https://api.github.com/repos/link-foundation/link-cli/actions/workflows/188109243","head_commit":{"id":"d47e551d2d66c7bfe93f9a869ce9fab36347e317","tree_id":"d9dcefae9e3fd1dd03e77cb2dcd0856e8534fdf3","message":"Merge pull request #81 from link-foundation/issue-79-c80df6f859e8\n\nfix: auto-deploy GitHub Pages and attach NuGet packages to releases","timestamp":"2026-05-12T16:57:31Z","author":{"name":"Konstantin Diachenko","email":"drakonard@gmail.com"},"committer":{"name":"GitHub","email":"noreply@github.com"}},"repository":{"id":896565358,"node_id":"R_kgDONXCAbg","name":"link-cli","full_name":"link-foundation/link-cli","private":false,"owner":{"login":"link-foundation","id":176174013,"node_id":"O_kgDOCoAzvQ","avatar_url":"https://avatars.githubusercontent.com/u/176174013?v=4","gravatar_id":"","url":"https://api.github.com/users/link-foundation","html_url":"https://github.com/link-foundation","followers_url":"https://api.github.com/users/link-foundation/followers","following_url":"https://api.github.com/users/link-foundation/following{/other_user}","gists_url":"https://api.github.com/users/link-foundation/gists{/gist_id}","starred_url":"https://api.github.com/users/link-foundation/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/link-foundation/subscriptions","organizations_url":"https://api.github.com/users/link-foundation/orgs","repos_url":"https://api.github.com/users/link-foundation/repos","events_url":"https://api.github.com/users/link-foundation/events{/privacy}","received_events_url":"https://api.github.com/users/link-foundation/received_events","type":"Organization","user_view_type":"public","site_admin":false},"html_url":"https://github.com/link-foundation/link-cli","description":"A CLI tool to manipulate links.","fork":false,"url":"https://api.github.com/repos/link-foundation/link-cli","forks_url":"https://api.github.com/repos/link-foundation/link-cli/forks","keys_url":"https://api.github.com/repos/link-foundation/link-cli/keys{/key_id}","collaborators_url":"https://api.github.com/repos/link-foundation/link-cli/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/link-foundation/link-cli/teams","hooks_url":"https://api.github.com/repos/link-foundation/link-cli/hooks","issue_events_url":"https://api.github.com/repos/link-foundation/link-cli/issues/events{/number}","events_url":"https://api.github.com/repos/link-foundation/link-cli/events","assignees_url":"https://api.github.com/repos/link-foundation/link-cli/assignees{/user}","branches_url":"https://api.github.com/repos/link-foundation/link-cli/branches{/branch}","tags_url":"https://api.github.com/repos/link-foundation/link-cli/tags","blobs_url":"https://api.github.com/repos/link-foundation/link-cli/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/link-foundation/link-cli/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/link-foundation/link-cli/git/refs{/sha}","trees_url":"https://api.github.com/repos/link-foundation/link-cli/git/trees{/sha}","statuses_url":"https://api.github.com/repos/link-foundation/link-cli/statuses/{sha}","languages_url":"https://api.github.com/repos/link-foundation/link-cli/languages","stargazers_url":"https://api.github.com/repos/link-foundation/link-cli/stargazers","contributors_url":"https://api.github.com/repos/link-foundation/link-cli/contributors","subscribers_url":"https://api.github.com/repos/link-foundation/link-cli/subscribers","subscription_url":"https://api.github.com/repos/link-foundation/link-cli/subscription","commits_url":"https://api.github.com/repos/link-foundation/link-cli/commits{/sha}","git_commits_url":"https://api.github.com/repos/link-foundation/link-cli/git/commits{/sha}","comments_url":"https://api.github.com/repos/link-foundation/link-cli/comments{/number}","issue_comment_url":"https://api.github.com/repos/link-foundation/link-cli/issues/comments{/number}","contents_url":"https://api.github.com/repos/link-foundation/link-cli/contents/{+path}","compare_url":"https://api.github.com/repos/link-foundation/link-cli/compare/{base}...{head}","merges_url":"https://api.github.com/repos/link-foundation/link-cli/merges","archive_url":"https://api.github.com/repos/link-foundation/link-cli/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/link-foundation/link-cli/downloads","issues_url":"https://api.github.com/repos/link-foundation/link-cli/issues{/number}","pulls_url":"https://api.github.com/repos/link-foundation/link-cli/pulls{/number}","milestones_url":"https://api.github.com/repos/link-foundation/link-cli/milestones{/number}","notifications_url":"https://api.github.com/repos/link-foundation/link-cli/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/link-foundation/link-cli/labels{/name}","releases_url":"https://api.github.com/repos/link-foundation/link-cli/releases{/id}","deployments_url":"https://api.github.com/repos/link-foundation/link-cli/deployments"},"head_repository":{"id":896565358,"node_id":"R_kgDONXCAbg","name":"link-cli","full_name":"link-foundation/link-cli","private":false,"owner":{"login":"link-foundation","id":176174013,"node_id":"O_kgDOCoAzvQ","avatar_url":"https://avatars.githubusercontent.com/u/176174013?v=4","gravatar_id":"","url":"https://api.github.com/users/link-foundation","html_url":"https://github.com/link-foundation","followers_url":"https://api.github.com/users/link-foundation/followers","following_url":"https://api.github.com/users/link-foundation/following{/other_user}","gists_url":"https://api.github.com/users/link-foundation/gists{/gist_id}","starred_url":"https://api.github.com/users/link-foundation/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/link-foundation/subscriptions","organizations_url":"https://api.github.com/users/link-foundation/orgs","repos_url":"https://api.github.com/users/link-foundation/repos","events_url":"https://api.github.com/users/link-foundation/events{/privacy}","received_events_url":"https://api.github.com/users/link-foundation/received_events","type":"Organization","user_view_type":"public","site_admin":false},"html_url":"https://github.com/link-foundation/link-cli","description":"A CLI tool to manipulate links.","fork":false,"url":"https://api.github.com/repos/link-foundation/link-cli","forks_url":"https://api.github.com/repos/link-foundation/link-cli/forks","keys_url":"https://api.github.com/repos/link-foundation/link-cli/keys{/key_id}","collaborators_url":"https://api.github.com/repos/link-foundation/link-cli/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/link-foundation/link-cli/teams","hooks_url":"https://api.github.com/repos/link-foundation/link-cli/hooks","issue_events_url":"https://api.github.com/repos/link-foundation/link-cli/issues/events{/number}","events_url":"https://api.github.com/repos/link-foundation/link-cli/events","assignees_url":"https://api.github.com/repos/link-foundation/link-cli/assignees{/user}","branches_url":"https://api.github.com/repos/link-foundation/link-cli/branches{/branch}","tags_url":"https://api.github.com/repos/link-foundation/link-cli/tags","blobs_url":"https://api.github.com/repos/link-foundation/link-cli/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/link-foundation/link-cli/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/link-foundation/link-cli/git/refs{/sha}","trees_url":"https://api.github.com/repos/link-foundation/link-cli/git/trees{/sha}","statuses_url":"https://api.github.com/repos/link-foundation/link-cli/statuses/{sha}","languages_url":"https://api.github.com/repos/link-foundation/link-cli/languages","stargazers_url":"https://api.github.com/repos/link-foundation/link-cli/stargazers","contributors_url":"https://api.github.com/repos/link-foundation/link-cli/contributors","subscribers_url":"https://api.github.com/repos/link-foundation/link-cli/subscribers","subscription_url":"https://api.github.com/repos/link-foundation/link-cli/subscription","commits_url":"https://api.github.com/repos/link-foundation/link-cli/commits{/sha}","git_commits_url":"https://api.github.com/repos/link-foundation/link-cli/git/commits{/sha}","comments_url":"https://api.github.com/repos/link-foundation/link-cli/comments{/number}","issue_comment_url":"https://api.github.com/repos/link-foundation/link-cli/issues/comments{/number}","contents_url":"https://api.github.com/repos/link-foundation/link-cli/contents/{+path}","compare_url":"https://api.github.com/repos/link-foundation/link-cli/compare/{base}...{head}","merges_url":"https://api.github.com/repos/link-foundation/link-cli/merges","archive_url":"https://api.github.com/repos/link-foundation/link-cli/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/link-foundation/link-cli/downloads","issues_url":"https://api.github.com/repos/link-foundation/link-cli/issues{/number}","pulls_url":"https://api.github.com/repos/link-foundation/link-cli/pulls{/number}","milestones_url":"https://api.github.com/repos/link-foundation/link-cli/milestones{/number}","notifications_url":"https://api.github.com/repos/link-foundation/link-cli/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/link-foundation/link-cli/labels{/name}","releases_url":"https://api.github.com/repos/link-foundation/link-cli/releases{/id}","deployments_url":"https://api.github.com/repos/link-foundation/link-cli/deployments"}}]} \ No newline at end of file diff --git a/docs/case-studies/issue-82/evidence/template-csharp-file-tree.json b/docs/case-studies/issue-82/evidence/template-csharp-file-tree.json new file mode 100644 index 0000000..85e889a --- /dev/null +++ b/docs/case-studies/issue-82/evidence/template-csharp-file-tree.json @@ -0,0 +1 @@ +{"sha":"91767095e51946bfe3551b550dbfc51a0989c6ac","url":"https://api.github.com/repos/link-foundation/csharp-ai-driven-development-pipeline-template/git/trees/91767095e51946bfe3551b550dbfc51a0989c6ac","tree":[{"path":".changeset","mode":"040000","type":"tree","sha":"70249b789d5b6f9d5cdaf8aa6526c9977fccdf5f","url":"https://api.github.com/repos/link-foundation/csharp-ai-driven-development-pipeline-template/git/trees/70249b789d5b6f9d5cdaf8aa6526c9977fccdf5f"},{"path":".changeset/README.md","mode":"100644","type":"blob","sha":"eeb0abf2bbbd555e5b5dd0f20cf1f8ca61c51fcf","size":1684,"url":"https://api.github.com/repos/link-foundation/csharp-ai-driven-development-pipeline-template/git/blobs/eeb0abf2bbbd555e5b5dd0f20cf1f8ca61c51fcf"},{"path":".changeset/add-changesets-workflow.md","mode":"100644","type":"blob","sha":"126618a04f43f1f7a2e0b322049ad33e06c260e4","size":521,"url":"https://api.github.com/repos/link-foundation/csharp-ai-driven-development-pipeline-template/git/blobs/126618a04f43f1f7a2e0b322049ad33e06c260e4"},{"path":".changeset/attach-nuget-release-assets.md","mode":"100644","type":"blob","sha":"7ff204afbfff4d6f86050412852ae9ce996c89a5","size":115,"url":"https://api.github.com/repos/link-foundation/csharp-ai-driven-development-pipeline-template/git/blobs/7ff204afbfff4d6f86050412852ae9ce996c89a5"},{"path":".changeset/config.json","mode":"100644","type":"blob","sha":"1f3c3b4554affbfe359ec682c0438384276ef06b","size":249,"url":"https://api.github.com/repos/link-foundation/csharp-ai-driven-development-pipeline-template/git/blobs/1f3c3b4554affbfe359ec682c0438384276ef06b"},{"path":".changeset/fix-ci-workflow-dependencies.md","mode":"100644","type":"blob","sha":"d4ed572cbaa1cd5d5625ecd36ade159fec519162","size":493,"url":"https://api.github.com/repos/link-foundation/csharp-ai-driven-development-pipeline-template/git/blobs/d4ed572cbaa1cd5d5625ecd36ade159fec519162"},{"path":".changeset/fix-csharp-release-format.md","mode":"100644","type":"blob","sha":"0a0f1b886e3e09c83ad24ccb749c38f3f29b4f68","size":181,"url":"https://api.github.com/repos/link-foundation/csharp-ai-driven-development-pipeline-template/git/blobs/0a0f1b886e3e09c83ad24ccb749c38f3f29b4f68"},{"path":".editorconfig","mode":"100644","type":"blob","sha":"003e409ef2bc5c502b0977cc98ce80793341d5d0","size":9714,"url":"https://api.github.com/repos/link-foundation/csharp-ai-driven-development-pipeline-template/git/blobs/003e409ef2bc5c502b0977cc98ce80793341d5d0"},{"path":".github","mode":"040000","type":"tree","sha":"9468108441f5b291e60117dc75da4926aa6906ae","url":"https://api.github.com/repos/link-foundation/csharp-ai-driven-development-pipeline-template/git/trees/9468108441f5b291e60117dc75da4926aa6906ae"},{"path":".github/workflows","mode":"040000","type":"tree","sha":"8e6d8a0585b8ea4d5365513cec7875222e2f4092","url":"https://api.github.com/repos/link-foundation/csharp-ai-driven-development-pipeline-template/git/trees/8e6d8a0585b8ea4d5365513cec7875222e2f4092"},{"path":".github/workflows/release.yml","mode":"100644","type":"blob","sha":"7bc4bed27fa9aaa842b5de630f072bf12646796c","size":17824,"url":"https://api.github.com/repos/link-foundation/csharp-ai-driven-development-pipeline-template/git/blobs/7bc4bed27fa9aaa842b5de630f072bf12646796c"},{"path":".gitignore","mode":"100644","type":"blob","sha":"e6e61d0337870308198cf5917360485ad1264cae","size":1184,"url":"https://api.github.com/repos/link-foundation/csharp-ai-driven-development-pipeline-template/git/blobs/e6e61d0337870308198cf5917360485ad1264cae"},{"path":".pre-commit-config.yaml","mode":"100644","type":"blob","sha":"6a627f4dc5d7dd7702b36348e19348112af13287","size":890,"url":"https://api.github.com/repos/link-foundation/csharp-ai-driven-development-pipeline-template/git/blobs/6a627f4dc5d7dd7702b36348e19348112af13287"},{"path":"CHANGELOG.md","mode":"100644","type":"blob","sha":"88f176aba542b3580f76470229fe3b32793424b5","size":284,"url":"https://api.github.com/repos/link-foundation/csharp-ai-driven-development-pipeline-template/git/blobs/88f176aba542b3580f76470229fe3b32793424b5"},{"path":"CONTRIBUTING.md","mode":"100644","type":"blob","sha":"816c4bfea8b21f306c8c3e98037b2920ce04f924","size":8407,"url":"https://api.github.com/repos/link-foundation/csharp-ai-driven-development-pipeline-template/git/blobs/816c4bfea8b21f306c8c3e98037b2920ce04f924"},{"path":"Directory.Build.props","mode":"100644","type":"blob","sha":"54cdb4e9590e471ec90d854f37ff20c316df63ab","size":551,"url":"https://api.github.com/repos/link-foundation/csharp-ai-driven-development-pipeline-template/git/blobs/54cdb4e9590e471ec90d854f37ff20c316df63ab"},{"path":"LICENSE","mode":"100644","type":"blob","sha":"fdddb29aa445bf3d6a5d843d6dd77e10a9f99657","size":1211,"url":"https://api.github.com/repos/link-foundation/csharp-ai-driven-development-pipeline-template/git/blobs/fdddb29aa445bf3d6a5d843d6dd77e10a9f99657"},{"path":"MyPackage.sln","mode":"100644","type":"blob","sha":"5fc5c6ad807e4c72132ba25f436d450d8adf4885","size":1480,"url":"https://api.github.com/repos/link-foundation/csharp-ai-driven-development-pipeline-template/git/blobs/5fc5c6ad807e4c72132ba25f436d450d8adf4885"},{"path":"README.md","mode":"100644","type":"blob","sha":"f59d6b7bcecce2a9e6113dc92c97da36a3bbb6c9","size":10267,"url":"https://api.github.com/repos/link-foundation/csharp-ai-driven-development-pipeline-template/git/blobs/f59d6b7bcecce2a9e6113dc92c97da36a3bbb6c9"},{"path":"examples","mode":"040000","type":"tree","sha":"ff372b916db3b953ea03011f9e2f640b32065f97","url":"https://api.github.com/repos/link-foundation/csharp-ai-driven-development-pipeline-template/git/trees/ff372b916db3b953ea03011f9e2f640b32065f97"},{"path":"examples/BasicUsage.cs","mode":"100644","type":"blob","sha":"3f92ab4c44deadf133d36fe854bd154abb3fd17d","size":1328,"url":"https://api.github.com/repos/link-foundation/csharp-ai-driven-development-pipeline-template/git/blobs/3f92ab4c44deadf133d36fe854bd154abb3fd17d"},{"path":"examples/BasicUsage.csproj","mode":"100644","type":"blob","sha":"68665ca0e2eb40274c10bced10b05dbaa368474a","size":376,"url":"https://api.github.com/repos/link-foundation/csharp-ai-driven-development-pipeline-template/git/blobs/68665ca0e2eb40274c10bced10b05dbaa368474a"},{"path":"scripts","mode":"040000","type":"tree","sha":"89a2f23651ef430464993f9a1253a78baab8cf34","url":"https://api.github.com/repos/link-foundation/csharp-ai-driven-development-pipeline-template/git/trees/89a2f23651ef430464993f9a1253a78baab8cf34"},{"path":"scripts/bump-version.mjs","mode":"100644","type":"blob","sha":"8a983af2ee4bcdda4f6e8b3110e3783d04a550c7","size":2618,"url":"https://api.github.com/repos/link-foundation/csharp-ai-driven-development-pipeline-template/git/blobs/8a983af2ee4bcdda4f6e8b3110e3783d04a550c7"},{"path":"scripts/check-file-size.mjs","mode":"100644","type":"blob","sha":"b3a2f02e499ef03bad86a8a0879775592ef4e3cc","size":2361,"url":"https://api.github.com/repos/link-foundation/csharp-ai-driven-development-pipeline-template/git/blobs/b3a2f02e499ef03bad86a8a0879775592ef4e3cc"},{"path":"scripts/create-github-release.mjs","mode":"100644","type":"blob","sha":"75a90d3609fcc1684383fb6caa6643f3dee84c1f","size":13248,"url":"https://api.github.com/repos/link-foundation/csharp-ai-driven-development-pipeline-template/git/blobs/75a90d3609fcc1684383fb6caa6643f3dee84c1f"},{"path":"scripts/create-github-release.test.mjs","mode":"100644","type":"blob","sha":"ce553fb04ac585eaefd8ff24cc9ba29165d8fe1f","size":7228,"url":"https://api.github.com/repos/link-foundation/csharp-ai-driven-development-pipeline-template/git/blobs/ce553fb04ac585eaefd8ff24cc9ba29165d8fe1f"},{"path":"scripts/detect-code-changes.mjs","mode":"100644","type":"blob","sha":"fe3a8a7bf46647e316c41deac7606c2eb4e3f627","size":6932,"url":"https://api.github.com/repos/link-foundation/csharp-ai-driven-development-pipeline-template/git/blobs/fe3a8a7bf46647e316c41deac7606c2eb4e3f627"},{"path":"scripts/merge-changesets.mjs","mode":"100644","type":"blob","sha":"c6476c2a694dc71479fa469fe60e1c249810a913","size":6404,"url":"https://api.github.com/repos/link-foundation/csharp-ai-driven-development-pipeline-template/git/blobs/c6476c2a694dc71479fa469fe60e1c249810a913"},{"path":"scripts/validate-changeset.mjs","mode":"100644","type":"blob","sha":"1d3f484719a393525c5114dc49d9ac11ff3ce243","size":8229,"url":"https://api.github.com/repos/link-foundation/csharp-ai-driven-development-pipeline-template/git/blobs/1d3f484719a393525c5114dc49d9ac11ff3ce243"},{"path":"scripts/version-and-commit.mjs","mode":"100644","type":"blob","sha":"1c490a3c19709c8c904202123097d1b1ee3a4f51","size":11083,"url":"https://api.github.com/repos/link-foundation/csharp-ai-driven-development-pipeline-template/git/blobs/1c490a3c19709c8c904202123097d1b1ee3a4f51"},{"path":"src","mode":"040000","type":"tree","sha":"6affa369f62969862e9aa7696268e2cf57195177","url":"https://api.github.com/repos/link-foundation/csharp-ai-driven-development-pipeline-template/git/trees/6affa369f62969862e9aa7696268e2cf57195177"},{"path":"src/MyPackage","mode":"040000","type":"tree","sha":"27dee3a196c7dfb06cbadf208d52f1674198c19c","url":"https://api.github.com/repos/link-foundation/csharp-ai-driven-development-pipeline-template/git/trees/27dee3a196c7dfb06cbadf208d52f1674198c19c"},{"path":"src/MyPackage/Calculator.cs","mode":"100644","type":"blob","sha":"1a8a00ba9f09221f40b766c06f2e8ac0084a58b4","size":1811,"url":"https://api.github.com/repos/link-foundation/csharp-ai-driven-development-pipeline-template/git/blobs/1a8a00ba9f09221f40b766c06f2e8ac0084a58b4"},{"path":"src/MyPackage/MyPackage.csproj","mode":"100644","type":"blob","sha":"541030f2dd3b23c02f0c9496af434823e9199606","size":1293,"url":"https://api.github.com/repos/link-foundation/csharp-ai-driven-development-pipeline-template/git/blobs/541030f2dd3b23c02f0c9496af434823e9199606"},{"path":"src/MyPackage/PackageInfo.cs","mode":"100644","type":"blob","sha":"1382fc2e788cdb10c4f7df2f867a359110e41385","size":455,"url":"https://api.github.com/repos/link-foundation/csharp-ai-driven-development-pipeline-template/git/blobs/1382fc2e788cdb10c4f7df2f867a359110e41385"},{"path":"tests","mode":"040000","type":"tree","sha":"05ce34aa858458d7a880812a7467b7c095fb7296","url":"https://api.github.com/repos/link-foundation/csharp-ai-driven-development-pipeline-template/git/trees/05ce34aa858458d7a880812a7467b7c095fb7296"},{"path":"tests/MyPackage.Tests","mode":"040000","type":"tree","sha":"e481628485ba6ef0f64ecc3161135a3193fbb3e5","url":"https://api.github.com/repos/link-foundation/csharp-ai-driven-development-pipeline-template/git/trees/e481628485ba6ef0f64ecc3161135a3193fbb3e5"},{"path":"tests/MyPackage.Tests/CalculatorTests.cs","mode":"100644","type":"blob","sha":"bd5eab0a4178c858eacebd27fca0f9172703a02c","size":3812,"url":"https://api.github.com/repos/link-foundation/csharp-ai-driven-development-pipeline-template/git/blobs/bd5eab0a4178c858eacebd27fca0f9172703a02c"},{"path":"tests/MyPackage.Tests/MyPackage.Tests.csproj","mode":"100644","type":"blob","sha":"f581f60a1b17a1c5cf0f8a91867c86130dab02eb","size":1863,"url":"https://api.github.com/repos/link-foundation/csharp-ai-driven-development-pipeline-template/git/blobs/f581f60a1b17a1c5cf0f8a91867c86130dab02eb"},{"path":"tests/MyPackage.Tests/PackageInfoTests.cs","mode":"100644","type":"blob","sha":"38a7f1c9a1bb58b86c68aa6e26ab8b079d531c6b","size":507,"url":"https://api.github.com/repos/link-foundation/csharp-ai-driven-development-pipeline-template/git/blobs/38a7f1c9a1bb58b86c68aa6e26ab8b079d531c6b"}],"truncated":false} \ No newline at end of file diff --git a/docs/case-studies/issue-82/evidence/template-csharp-workflows.json b/docs/case-studies/issue-82/evidence/template-csharp-workflows.json new file mode 100644 index 0000000..3534056 --- /dev/null +++ b/docs/case-studies/issue-82/evidence/template-csharp-workflows.json @@ -0,0 +1 @@ +[{"name":"release.yml","path":".github/workflows/release.yml","sha":"7bc4bed27fa9aaa842b5de630f072bf12646796c","size":17824,"url":"https://api.github.com/repos/link-foundation/csharp-ai-driven-development-pipeline-template/contents/.github/workflows/release.yml?ref=main","html_url":"https://github.com/link-foundation/csharp-ai-driven-development-pipeline-template/blob/main/.github/workflows/release.yml","git_url":"https://api.github.com/repos/link-foundation/csharp-ai-driven-development-pipeline-template/git/blobs/7bc4bed27fa9aaa842b5de630f072bf12646796c","download_url":"https://raw.githubusercontent.com/link-foundation/csharp-ai-driven-development-pipeline-template/main/.github/workflows/release.yml","type":"file","_links":{"self":"https://api.github.com/repos/link-foundation/csharp-ai-driven-development-pipeline-template/contents/.github/workflows/release.yml?ref=main","git":"https://api.github.com/repos/link-foundation/csharp-ai-driven-development-pipeline-template/git/blobs/7bc4bed27fa9aaa842b5de630f072bf12646796c","html":"https://github.com/link-foundation/csharp-ai-driven-development-pipeline-template/blob/main/.github/workflows/release.yml"}}] \ No newline at end of file diff --git a/docs/case-studies/issue-82/evidence/template-js-file-tree.json b/docs/case-studies/issue-82/evidence/template-js-file-tree.json new file mode 100644 index 0000000..e42aed4 --- /dev/null +++ b/docs/case-studies/issue-82/evidence/template-js-file-tree.json @@ -0,0 +1 @@ +{"sha":"31e9fb441b7d51677852a7b1ad4484c221daed9d","url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/trees/31e9fb441b7d51677852a7b1ad4484c221daed9d","tree":[{"path":".changeset","mode":"040000","type":"tree","sha":"0cdcc2280a516e91fdca8c34b33881b389d80612","url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/trees/0cdcc2280a516e91fdca8c34b33881b389d80612"},{"path":".changeset/README.md","mode":"100644","type":"blob","sha":"e5b6d8d6a67ad0dca8f20117fbfc72e076882d00","size":510,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/e5b6d8d6a67ad0dca8f20117fbfc72e076882d00"},{"path":".changeset/config.json","mode":"100644","type":"blob","sha":"2be13d43105bb89e816ee8d0949fd4a8c1830676","size":271,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/2be13d43105bb89e816ee8d0949fd4a8c1830676"},{"path":".github","mode":"040000","type":"tree","sha":"c5e2f49be884bcfc46202d79a8ef38bb2be02239","url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/trees/c5e2f49be884bcfc46202d79a8ef38bb2be02239"},{"path":".github/actions","mode":"040000","type":"tree","sha":"5879e09f31671188eca3e88b263dd2e06bc268d9","url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/trees/5879e09f31671188eca3e88b263dd2e06bc268d9"},{"path":".github/actions/publish-dockerhub","mode":"040000","type":"tree","sha":"3fc5e709b6e5a57d27b5f0925a509fd213c3b0ac","url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/trees/3fc5e709b6e5a57d27b5f0925a509fd213c3b0ac"},{"path":".github/actions/publish-dockerhub/action.yml","mode":"100644","type":"blob","sha":"e6afff6888140797760d2d46400718c041539c0f","size":1586,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/e6afff6888140797760d2d46400718c041539c0f"},{"path":".github/workflows","mode":"040000","type":"tree","sha":"9f40a97e5ad411392d3e633cbe8dd9cb7fbfd881","url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/trees/9f40a97e5ad411392d3e633cbe8dd9cb7fbfd881"},{"path":".github/workflows/example-app.yml","mode":"100644","type":"blob","sha":"6a81458c243c45295aebb5b0915b85a42d08f12f","size":5372,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/6a81458c243c45295aebb5b0915b85a42d08f12f"},{"path":".github/workflows/links.yml","mode":"100644","type":"blob","sha":"3e910dce849396a942ca83b0f8ce5b5e91ace0e0","size":3197,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/3e910dce849396a942ca83b0f8ce5b5e91ace0e0"},{"path":".github/workflows/release.yml","mode":"100644","type":"blob","sha":"0facf849bd97ec6796be0fbf1362fba3a3aaf79a","size":23017,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/0facf849bd97ec6796be0fbf1362fba3a3aaf79a"},{"path":".gitignore","mode":"100644","type":"blob","sha":"d6a4d9047490a69e097860182c47a9488aae57e5","size":2195,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/d6a4d9047490a69e097860182c47a9488aae57e5"},{"path":".gitkeep","mode":"100644","type":"blob","sha":"44531a16d8f245b43aa9eecb00bfd5ab1544b569","size":204,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/44531a16d8f245b43aa9eecb00bfd5ab1544b569"},{"path":".husky","mode":"040000","type":"tree","sha":"0ebd40652be4585810e310f9870e6c349b79cf42","url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/trees/0ebd40652be4585810e310f9870e6c349b79cf42"},{"path":".husky/pre-commit","mode":"100644","type":"blob","sha":"2312dc587f61186ccf0d627d678d851b9eef7b82","size":16,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/2312dc587f61186ccf0d627d678d851b9eef7b82"},{"path":".jscpd.json","mode":"100644","type":"blob","sha":"db02eb16e3eedd5152d8406305ac60adb5303d35","size":429,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/db02eb16e3eedd5152d8406305ac60adb5303d35"},{"path":".lycheeignore","mode":"100644","type":"blob","sha":"6285ad244b6c8469a0f988d71d3cb2545d35b552","size":721,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/6285ad244b6c8469a0f988d71d3cb2545d35b552"},{"path":".prettierignore","mode":"100644","type":"blob","sha":"ad7422b0a12d8ba5fa8b523f80fa363985ba5ed2","size":183,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/ad7422b0a12d8ba5fa8b523f80fa363985ba5ed2"},{"path":".prettierrc","mode":"100644","type":"blob","sha":"3171de5af7f79900ca857d7462c20b108430a958","size":173,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/3171de5af7f79900ca857d7462c20b108430a958"},{"path":".secretlintrc.json","mode":"100644","type":"blob","sha":"7a1a5df3c28e6739fd639bc2a2eac39f62f9a122","size":92,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/7a1a5df3c28e6739fd639bc2a2eac39f62f9a122"},{"path":"CHANGELOG.md","mode":"100644","type":"blob","sha":"cb80c8e8684128a6326f996b3f26dbd1f39e3b70","size":9284,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/cb80c8e8684128a6326f996b3f26dbd1f39e3b70"},{"path":"LICENSE","mode":"100644","type":"blob","sha":"fdddb29aa445bf3d6a5d843d6dd77e10a9f99657","size":1211,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/fdddb29aa445bf3d6a5d843d6dd77e10a9f99657"},{"path":"README.md","mode":"100644","type":"blob","sha":"727162cbec449922dfee173deb9bea0b0ad5bc46","size":13612,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/727162cbec449922dfee173deb9bea0b0ad5bc46"},{"path":"bin","mode":"040000","type":"tree","sha":"c536cd94ede3509ce1747982e05ea325825e4651","url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/trees/c536cd94ede3509ce1747982e05ea325825e4651"},{"path":"bin/example-package-name.js","mode":"100755","type":"blob","sha":"9edc8df84a060cebc5b9a33d805a058436e446c4","size":1940,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/9edc8df84a060cebc5b9a33d805a058436e446c4"},{"path":"bunfig.toml","mode":"100644","type":"blob","sha":"ee9088076ce8f1b1191e57fa0b352d9987f45be5","size":136,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/ee9088076ce8f1b1191e57fa0b352d9987f45be5"},{"path":"deno.json","mode":"100644","type":"blob","sha":"2617bdad48861afb3728d00ed2086248bd941397","size":121,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/2617bdad48861afb3728d00ed2086248bd941397"},{"path":"docs","mode":"040000","type":"tree","sha":"3db143afe47af3f63d497d8676582896bb4134c1","url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/trees/3db143afe47af3f63d497d8676582896bb4134c1"},{"path":"docs/BEST-PRACTICES.md","mode":"100644","type":"blob","sha":"0addc3662dd7224c1a354d3e4562910a5016a65d","size":9357,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/0addc3662dd7224c1a354d3e4562910a5016a65d"},{"path":"docs/CONTRIBUTING.md","mode":"100644","type":"blob","sha":"b517e15349348a6f2c725371105809376df2e09e","size":4691,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/b517e15349348a6f2c725371105809376df2e09e"},{"path":"docs/case-studies","mode":"040000","type":"tree","sha":"816f7860cd2f23c5352d51806bf8efebb10c5794","url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/trees/816f7860cd2f23c5352d51806bf8efebb10c5794"},{"path":"docs/case-studies/issue-13","mode":"040000","type":"tree","sha":"83d751de7f342febe5a478dc1aa8afeb09df0437","url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/trees/83d751de7f342febe5a478dc1aa8afeb09df0437"},{"path":"docs/case-studies/issue-13/README.md","mode":"100644","type":"blob","sha":"4240ba09297c62b04e4723f5205a515fe6c76a76","size":7506,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/4240ba09297c62b04e4723f5205a515fe6c76a76"},{"path":"docs/case-studies/issue-13/hive-mind-issue-960.json","mode":"100644","type":"blob","sha":"6ae0c75dc93183e84012c4d621f7ff45a1e85ab4","size":2202,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/6ae0c75dc93183e84012c4d621f7ff45a1e85ab4"},{"path":"docs/case-studies/issue-13/hive-mind-pr-961-diff.txt","mode":"100644","type":"blob","sha":"ecf74200e52c77859a53df980bfa28a95a695a2c","size":27983,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/ecf74200e52c77859a53df980bfa28a95a695a2c"},{"path":"docs/case-studies/issue-13/hive-mind-pr-961.json","mode":"100644","type":"blob","sha":"3415e7d7db73b9bf577ba00c558eb856b8bd512c","size":6745,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/3415e7d7db73b9bf577ba00c558eb856b8bd512c"},{"path":"docs/case-studies/issue-21","mode":"040000","type":"tree","sha":"8ceaad7f0862d8166a7be01d8038e01dec89f43f","url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/trees/8ceaad7f0862d8166a7be01d8038e01dec89f43f"},{"path":"docs/case-studies/issue-21/README.md","mode":"100644","type":"blob","sha":"1a26fcba8943ec81eff9e8819a43f266328313fb","size":14434,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/1a26fcba8943ec81eff9e8819a43f266328313fb"},{"path":"docs/case-studies/issue-21/ci-logs","mode":"040000","type":"tree","sha":"def1a9ae3b42140676c37663c1f81fe86431dc81","url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/trees/def1a9ae3b42140676c37663c1f81fe86431dc81"},{"path":"docs/case-studies/issue-21/ci-logs/run-20803315337.txt","mode":"100644","type":"blob","sha":"a62468e1e45ca89d6c21424e0d1e871078b7b5ec","size":133670,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/a62468e1e45ca89d6c21424e0d1e871078b7b5ec"},{"path":"docs/case-studies/issue-21/ci-logs/run-20885464993.txt","mode":"100644","type":"blob","sha":"20541feb33031aa60099af8d8213470b4384bc0e","size":155417,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/20541feb33031aa60099af8d8213470b4384bc0e"},{"path":"docs/case-studies/issue-21/issue-111-data.txt","mode":"100644","type":"blob","sha":"42a4b7b4687914dea32905cab0835ac43ba44a36","size":700,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/42a4b7b4687914dea32905cab0835ac43ba44a36"},{"path":"docs/case-studies/issue-21/issue-113-data.txt","mode":"100644","type":"blob","sha":"157d5bd29fcd9f80e4b97c98308f90fbf9c0b4a3","size":708,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/157d5bd29fcd9f80e4b97c98308f90fbf9c0b4a3"},{"path":"docs/case-studies/issue-21/pr-112-data.json","mode":"100644","type":"blob","sha":"2bde54d68433cb1db973e8fc7a3ff96b28cfeba4","size":4967,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/2bde54d68433cb1db973e8fc7a3ff96b28cfeba4"},{"path":"docs/case-studies/issue-21/pr-112-diff.patch","mode":"100644","type":"blob","sha":"9a61051d2643cf8d43205bf902576c136579b658","size":140742,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/9a61051d2643cf8d43205bf902576c136579b658"},{"path":"docs/case-studies/issue-21/pr-114-data.json","mode":"100644","type":"blob","sha":"bb5f52db99e307cce9c67de5f45f3f7c0eafeca8","size":7852,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/bb5f52db99e307cce9c67de5f45f3f7c0eafeca8"},{"path":"docs/case-studies/issue-21/pr-114-diff.patch","mode":"100644","type":"blob","sha":"33f28bdfa6ba98300f0a4ffb3335c6a36862b298","size":31790,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/33f28bdfa6ba98300f0a4ffb3335c6a36862b298"},{"path":"docs/case-studies/issue-23","mode":"040000","type":"tree","sha":"fdaf95be9969fb93231b55fdf9a7a8dcf7d25b1e","url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/trees/fdaf95be9969fb93231b55fdf9a7a8dcf7d25b1e"},{"path":"docs/case-studies/issue-23/README.md","mode":"100644","type":"blob","sha":"3a8e974437af04ba3cbb23fe804be4ebb3fd4ec5","size":9202,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/3a8e974437af04ba3cbb23fe804be4ebb3fd4ec5"},{"path":"docs/case-studies/issue-23/data","mode":"040000","type":"tree","sha":"1277e86873b3e1469bb8e76f54e8cf5977b4cbc2","url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/trees/1277e86873b3e1469bb8e76f54e8cf5977b4cbc2"},{"path":"docs/case-studies/issue-23/data/hive-mind-check-version.mjs","mode":"100644","type":"blob","sha":"d177e0f8996fb2ea13878762b32a3ddc118d7fc3","size":3689,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/d177e0f8996fb2ea13878762b32a3ddc118d7fc3"},{"path":"docs/case-studies/issue-23/data/hive-mind-ci.yml","mode":"100644","type":"blob","sha":"b464861d9f38abbd9893395100b807e99a0aa873","size":3,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/b464861d9f38abbd9893395100b807e99a0aa873"},{"path":"docs/case-studies/issue-23/data/hive-mind-eslint.config.mjs","mode":"100644","type":"blob","sha":"ac4d804b59be76659fb96c468c7bdd12a10a0d7e","size":2312,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/ac4d804b59be76659fb96c468c7bdd12a10a0d7e"},{"path":"docs/case-studies/issue-23/data/hive-mind-release.yml","mode":"100644","type":"blob","sha":"f7730771b91d644f9861e821921ccaf57dfb00ec","size":85858,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/f7730771b91d644f9861e821921ccaf57dfb00ec"},{"path":"docs/case-studies/issue-23/data/issue-1126-details.txt","mode":"100644","type":"blob","sha":"686a3eae848a63a25af64799fa490f4a46411b83","size":485,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/686a3eae848a63a25af64799fa490f4a46411b83"},{"path":"docs/case-studies/issue-23/data/issue-1141-comments.json","mode":"100644","type":"blob","sha":"0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc","size":2,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc"},{"path":"docs/case-studies/issue-23/data/issue-1141-details.txt","mode":"100644","type":"blob","sha":"f66b85d7dd36bd9b880b1326ffebee17bb45b969","size":1151,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/f66b85d7dd36bd9b880b1326ffebee17bb45b969"},{"path":"docs/case-studies/issue-23/data/pr-1127-conversation-comments.json","mode":"100644","type":"blob","sha":"bae16e06b841f0a19ddb6e96d689812f44c89bd3","size":17911,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/bae16e06b841f0a19ddb6e96d689812f44c89bd3"},{"path":"docs/case-studies/issue-23/data/pr-1127-diff.txt","mode":"100644","type":"blob","sha":"1c10df9d656e357ae0067c3225e245348b4c20b8","size":11091,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/1c10df9d656e357ae0067c3225e245348b4c20b8"},{"path":"docs/case-studies/issue-23/data/pr-1127-review-comments.json","mode":"100644","type":"blob","sha":"0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc","size":2,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc"},{"path":"docs/case-studies/issue-23/data/pr-1142-conversation-comments.json","mode":"100644","type":"blob","sha":"340a0373059f1c82ab6e29bfa1287a3f3696de53","size":8054,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/340a0373059f1c82ab6e29bfa1287a3f3696de53"},{"path":"docs/case-studies/issue-23/data/pr-1142-diff.txt","mode":"100644","type":"blob","sha":"6ec5321e04e194106aa9e5c57f722803f4907115","size":27946,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/6ec5321e04e194106aa9e5c57f722803f4907115"},{"path":"docs/case-studies/issue-23/data/pr-1142-review-comments.json","mode":"100644","type":"blob","sha":"0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc","size":2,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc"},{"path":"docs/case-studies/issue-25","mode":"040000","type":"tree","sha":"bc3d2d28e71905861b014eac07a85a9038f81629","url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/trees/bc3d2d28e71905861b014eac07a85a9038f81629"},{"path":"docs/case-studies/issue-25/DETAILED-COMPARISON.md","mode":"100644","type":"blob","sha":"51fcbe8ba6d381928e23542df83d7192d4be982b","size":17912,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/51fcbe8ba6d381928e23542df83d7192d4be982b"},{"path":"docs/case-studies/issue-25/README.md","mode":"100644","type":"blob","sha":"10e19af530e13ea946942010df0ba5bd273d188d","size":10084,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/10e19af530e13ea946942010df0ba5bd273d188d"},{"path":"docs/case-studies/issue-25/data","mode":"040000","type":"tree","sha":"8e3025b393e4e46b60648445069e92cffcd6ba25","url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/trees/8e3025b393e4e46b60648445069e92cffcd6ba25"},{"path":"docs/case-studies/issue-25/data/hive-mind-file-tree.txt","mode":"100644","type":"blob","sha":"d0fb16c96e0aa58e71f53b64c5012a9919dff6c4","size":84928,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/d0fb16c96e0aa58e71f53b64c5012a9919dff6c4"},{"path":"docs/case-studies/issue-25/data/issue-1274-case-study.md","mode":"100644","type":"blob","sha":"6102ea583918590ca11e9cd725c0288679757d79","size":9175,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/6102ea583918590ca11e9cd725c0288679757d79"},{"path":"docs/case-studies/issue-25/data/issue-1278-case-study.md","mode":"100644","type":"blob","sha":"f9bc708565466c654d41b4824686c1f3fde3f9f7","size":13738,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/f9bc708565466c654d41b4824686c1f3fde3f9f7"},{"path":"docs/case-studies/issue-25/data/template-file-tree.txt","mode":"100644","type":"blob","sha":"4af61d7e9eb7a96d4045badf2ab896bd30aec9b8","size":3372,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/4af61d7e9eb7a96d4045badf2ab896bd30aec9b8"},{"path":"docs/case-studies/issue-29","mode":"040000","type":"tree","sha":"626db2e81a46cef4af1eea05b1aca703ae85cb15","url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/trees/626db2e81a46cef4af1eea05b1aca703ae85cb15"},{"path":"docs/case-studies/issue-29/README.md","mode":"100644","type":"blob","sha":"df6f5b5a6e695f2d3a34496db4fbe18fb682e9e7","size":6303,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/df6f5b5a6e695f2d3a34496db4fbe18fb682e9e7"},{"path":"docs/case-studies/issue-3","mode":"040000","type":"tree","sha":"87355591b48402586bdc201c45295d4318562d0f","url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/trees/87355591b48402586bdc201c45295d4318562d0f"},{"path":"docs/case-studies/issue-3/README.md","mode":"100644","type":"blob","sha":"cb499c982431d42276b0d220d6e2c0be8aa9db6c","size":10928,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/cb499c982431d42276b0d220d6e2c0be8aa9db6c"},{"path":"docs/case-studies/issue-3/created-issues.md","mode":"100644","type":"blob","sha":"8d274a177a7d701f4eca924a0e0e7e9ab515e7f9","size":1274,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/8d274a177a7d701f4eca924a0e0e7e9ab515e7f9"},{"path":"docs/case-studies/issue-3/issue-data.json","mode":"100644","type":"blob","sha":"9a79ea323d9678ecdc9d4d710b8ba46b61a5e55f","size":4625,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/9a79ea323d9678ecdc9d4d710b8ba46b61a5e55f"},{"path":"docs/case-studies/issue-3/original-format-release-notes.mjs","mode":"100644","type":"blob","sha":"6592be615307575e63d80f682f2458bc2bc596cb","size":7649,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/6592be615307575e63d80f682f2458bc2bc596cb"},{"path":"docs/case-studies/issue-3/reference-pr-59-diff.txt","mode":"100644","type":"blob","sha":"78ad4aced552e07bfc57936e231e42e886431464","size":23744,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/78ad4aced552e07bfc57936e231e42e886431464"},{"path":"docs/case-studies/issue-3/reference-pr-59.json","mode":"100644","type":"blob","sha":"4e8c49d707edce4fa721e329197276f6c5284998","size":7914,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/4e8c49d707edce4fa721e329197276f6c5284998"},{"path":"docs/case-studies/issue-3/release-v0.1.0.json","mode":"100644","type":"blob","sha":"421a03f99c59fd3f90a0db29710baabec2efa046","size":1008,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/421a03f99c59fd3f90a0db29710baabec2efa046"},{"path":"docs/case-studies/issue-3/repositories-with-same-script.json","mode":"100644","type":"blob","sha":"a43feeb47fe3a106f0a3719a8eb247a87ec4f8b0","size":771,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/a43feeb47fe3a106f0a3719a8eb247a87ec4f8b0"},{"path":"docs/case-studies/issue-3/research-notes.md","mode":"100644","type":"blob","sha":"9b121414628c2cd9e2005cddc4f1835e948216e0","size":1394,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/9b121414628c2cd9e2005cddc4f1835e948216e0"},{"path":"docs/case-studies/issue-31","mode":"040000","type":"tree","sha":"cbe589a1b202c7cfebdb28d60a57494e7a40c486","url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/trees/cbe589a1b202c7cfebdb28d60a57494e7a40c486"},{"path":"docs/case-studies/issue-31/README.md","mode":"100644","type":"blob","sha":"d1af67f1749fdf2563580f722d1a0ba1af133c68","size":4832,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/d1af67f1749fdf2563580f722d1a0ba1af133c68"},{"path":"docs/case-studies/issue-31/web-capture-pr49-commits.json","mode":"100644","type":"blob","sha":"98837b09fb090fda8dafa41d5e21deac2922b060","size":2633,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/98837b09fb090fda8dafa41d5e21deac2922b060"},{"path":"docs/case-studies/issue-33","mode":"040000","type":"tree","sha":"8207f537cc6c8bbdf0d68403529da28b30ed0dd8","url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/trees/8207f537cc6c8bbdf0d68403529da28b30ed0dd8"},{"path":"docs/case-studies/issue-33/README.md","mode":"100644","type":"blob","sha":"9ea7d4313d8de96b21c0e5eee68f3e4730140866","size":7513,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/9ea7d4313d8de96b21c0e5eee68f3e4730140866"},{"path":"docs/case-studies/issue-33/ci-logs","mode":"040000","type":"tree","sha":"502e5b1c396577db4fcc0138f0af852450ad4da1","url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/trees/502e5b1c396577db4fcc0138f0af852450ad4da1"},{"path":"docs/case-studies/issue-33/ci-logs/release-24395209194.txt","mode":"100644","type":"blob","sha":"364d1424f87d4b83307b9929a7911fcb104839fb","size":786370,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/364d1424f87d4b83307b9929a7911fcb104839fb"},{"path":"docs/case-studies/issue-33/ci-logs/upstream-nodejs-62430.json","mode":"100644","type":"blob","sha":"1202138f19c247d9c53be06f7b539afbd7ffb89a","size":2053,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/1202138f19c247d9c53be06f7b539afbd7ffb89a"},{"path":"docs/case-studies/issue-33/ci-logs/upstream-npm-cli-9151.json","mode":"100644","type":"blob","sha":"b5a72cccbd560ba720394e4b476608dc53915110","size":6870,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/b5a72cccbd560ba720394e4b476608dc53915110"},{"path":"docs/case-studies/issue-33/ci-logs/upstream-runner-images-13883.json","mode":"100644","type":"blob","sha":"fb9133223f9fb47b3933bba70ce9dce1207e4e43","size":4055,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/fb9133223f9fb47b3933bba70ce9dce1207e4e43"},{"path":"docs/case-studies/issue-36","mode":"040000","type":"tree","sha":"ec5c4dba3840a3d33c3358156973144ba68e4fdb","url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/trees/ec5c4dba3840a3d33c3358156973144ba68e4fdb"},{"path":"docs/case-studies/issue-36/README.md","mode":"100644","type":"blob","sha":"eeef8d57301beb189c3c1d33c48236897c79584e","size":5048,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/eeef8d57301beb189c3c1d33c48236897c79584e"},{"path":"docs/case-studies/issue-36/ci-logs","mode":"040000","type":"tree","sha":"1084e31a96587e733667613e8315afcce302a62c","url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/trees/1084e31a96587e733667613e8315afcce302a62c"},{"path":"docs/case-studies/issue-36/ci-logs/release-24399965550.txt","mode":"100644","type":"blob","sha":"b27caae8745d5233aff3960abfde293370d59622","size":845925,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/b27caae8745d5233aff3960abfde293370d59622"},{"path":"docs/case-studies/issue-38","mode":"040000","type":"tree","sha":"5e8dc46788e00b88f588922d77831dee54e0fd5f","url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/trees/5e8dc46788e00b88f588922d77831dee54e0fd5f"},{"path":"docs/case-studies/issue-38/CASE-STUDY.md","mode":"100644","type":"blob","sha":"44c49b962bcbcfb317e3f7269144a4e9adbad90e","size":3067,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/44c49b962bcbcfb317e3f7269144a4e9adbad90e"},{"path":"docs/case-studies/issue-40","mode":"040000","type":"tree","sha":"bae91bf6cce9bba67787767596ce3650cbef242c","url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/trees/bae91bf6cce9bba67787767596ce3650cbef242c"},{"path":"docs/case-studies/issue-40/CICD-COMPARISON.md","mode":"100644","type":"blob","sha":"dcc0662bbfa535600b0508b4abe5f7906f6fab09","size":10773,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/dcc0662bbfa535600b0508b4abe5f7906f6fab09"},{"path":"docs/case-studies/issue-40/README.md","mode":"100644","type":"blob","sha":"141a57808f16d380b35f62fb2088a63828a09d72","size":13277,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/141a57808f16d380b35f62fb2088a63828a09d72"},{"path":"docs/case-studies/issue-40/data","mode":"040000","type":"tree","sha":"eb4358c3ff4a31e03e5a3f20a272f797074122df","url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/trees/eb4358c3ff4a31e03e5a3f20a272f797074122df"},{"path":"docs/case-studies/issue-40/data/ci-run-25212337438.json","mode":"100644","type":"blob","sha":"6ba06512776d76ac7fdd42bbfd386ea3d7d6bf11","size":411,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/6ba06512776d76ac7fdd42bbfd386ea3d7d6bf11"},{"path":"docs/case-studies/issue-40/data/ci-runs-branch.json","mode":"100644","type":"blob","sha":"53d01b68b5c31786f0db4606d8982dfac7450356","size":197,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/53d01b68b5c31786f0db4606d8982dfac7450356"},{"path":"docs/case-studies/issue-40/data/downstream-web-capture-issue-98.json","mode":"100644","type":"blob","sha":"9eec8aaaafad9306078d1402c38114a080926dbf","size":2335,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/9eec8aaaafad9306078d1402c38114a080926dbf"},{"path":"docs/case-studies/issue-40/data/downstream-web-capture-pr-99.diff","mode":"100644","type":"blob","sha":"33ac3c7c6100fbb9355ccd35a5b2a0b3676c675b","size":35718,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/33ac3c7c6100fbb9355ccd35a5b2a0b3676c675b"},{"path":"docs/case-studies/issue-40/data/downstream-web-capture-pr-99.json","mode":"100644","type":"blob","sha":"5466c04cd452251ba2fa9142c7f5f8b65dd2a432","size":6895,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/5466c04cd452251ba2fa9142c7f5f8b65dd2a432"},{"path":"docs/case-studies/issue-40/data/issue-40.json","mode":"100644","type":"blob","sha":"f56937f019b5bde2f2ee9cf1761559b343c0edc0","size":5646,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/f56937f019b5bde2f2ee9cf1761559b343c0edc0"},{"path":"docs/case-studies/issue-40/data/js-cicd-files.txt","mode":"100644","type":"blob","sha":"74669dac64e1e2e9fa005ef10cf1c1a6913a5a83","size":767,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/74669dac64e1e2e9fa005ef10cf1c1a6913a5a83"},{"path":"docs/case-studies/issue-40/data/js-template-file-tree.txt","mode":"100644","type":"blob","sha":"4da2f847e90677a8a38e2dbb8a58895ff0463f1c","size":4718,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/4da2f847e90677a8a38e2dbb8a58895ff0463f1c"},{"path":"docs/case-studies/issue-40/data/pr-43.json","mode":"100644","type":"blob","sha":"dfac2dcad34b62d2e4edb9b48c37ad60ce3b1f5d","size":7356,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/dfac2dcad34b62d2e4edb9b48c37ad60ce3b1f5d"},{"path":"docs/case-studies/issue-40/data/related-js-merged-prs.json","mode":"100644","type":"blob","sha":"19d1be1136b48816a56410966ee5e71bc29597ae","size":228,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/19d1be1136b48816a56410966ee5e71bc29597ae"},{"path":"docs/case-studies/issue-40/data/rust-cicd-files.txt","mode":"100644","type":"blob","sha":"4e8ca4cf7dd7e49856f983a0c8abf6e2bbf1430a","size":486,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/4e8ca4cf7dd7e49856f983a0c8abf6e2bbf1430a"},{"path":"docs/case-studies/issue-40/data/rust-template-file-tree.txt","mode":"100644","type":"blob","sha":"26f06a79bf244229cf8ef15f12300e9fc4af9300","size":3283,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/26f06a79bf244229cf8ef15f12300e9fc4af9300"},{"path":"docs/case-studies/issue-40/data/rust-template-head.txt","mode":"100644","type":"blob","sha":"13690f5598b5637035d11317b3c32d72c3ce57ac","size":46,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/13690f5598b5637035d11317b3c32d72c3ce57ac"},{"path":"docs/case-studies/issue-40/data/shields-broken-prefixed-badge.svg","mode":"100644","type":"blob","sha":"6c8701aa112c554eee24d9fdaf8f225032a4f541","size":1123,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/6c8701aa112c554eee24d9fdaf8f225032a4f541"},{"path":"docs/case-studies/issue-40/data/shields-broken-prefixed-prerelease-badge.svg","mode":"100644","type":"blob","sha":"6c8701aa112c554eee24d9fdaf8f225032a4f541","size":1123,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/6c8701aa112c554eee24d9fdaf8f225032a4f541"},{"path":"docs/case-studies/issue-40/data/shields-working-normalized-badge.svg","mode":"100644","type":"blob","sha":"0f2c111a6329420dc96ec24f4fe3cda0af62e8a6","size":1083,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/0f2c111a6329420dc96ec24f4fe3cda0af62e8a6"},{"path":"docs/case-studies/issue-40/data/shields-working-prerelease-badge.svg","mode":"100644","type":"blob","sha":"fea633df9d9d5af5248916497de2fc981479a24d","size":1114,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/fea633df9d9d5af5248916497de2fc981479a24d"},{"path":"docs/case-studies/issue-40/rust-template","mode":"040000","type":"tree","sha":"ea8240c09668e20193b8871bb3fd473d9f385f7f","url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/trees/ea8240c09668e20193b8871bb3fd473d9f385f7f"},{"path":"docs/case-studies/issue-40/rust-template/create-github-release.rs","mode":"100644","type":"blob","sha":"fb45ae8ad9baa3d49a1e0007f959e0ffb5b0144a","size":7005,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/fb45ae8ad9baa3d49a1e0007f959e0ffb5b0144a"},{"path":"docs/case-studies/issue-40/rust-template/release.yml","mode":"100644","type":"blob","sha":"e8b6fb77030f59ecbb748c3e98c2d1cdeba0e079","size":16372,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/e8b6fb77030f59ecbb748c3e98c2d1cdeba0e079"},{"path":"docs/case-studies/issue-41","mode":"040000","type":"tree","sha":"201e76d4d1a316eb7577d5cd8d4368487e5b7554","url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/trees/201e76d4d1a316eb7577d5cd8d4368487e5b7554"},{"path":"docs/case-studies/issue-41/README.md","mode":"100644","type":"blob","sha":"e7a11e92f4d85d7e038c8a70f18a11cd19b77ecd","size":11477,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/e7a11e92f4d85d7e038c8a70f18a11cd19b77ecd"},{"path":"docs/case-studies/issue-41/data","mode":"040000","type":"tree","sha":"6415121b0f8210e5c8057076436c90e00d043051","url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/trees/6415121b0f8210e5c8057076436c90e00d043051"},{"path":"docs/case-studies/issue-41/data/hive-mind-check-file-line-limits.sh","mode":"100644","type":"blob","sha":"65630d5c03e8fc939158a1ea0ae7a0bd6f2c39b7","size":3061,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/65630d5c03e8fc939158a1ea0ae7a0bd6f2c39b7"},{"path":"docs/case-studies/issue-41/data/hive-mind-file-tree.txt","mode":"100644","type":"blob","sha":"a34017ffb02a64aa83ac0bfb79f09bf516883d19","size":149581,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/a34017ffb02a64aa83ac0bfb79f09bf516883d19"},{"path":"docs/case-studies/issue-41/data/hive-mind-issue-1593-case-study.md","mode":"100644","type":"blob","sha":"e06ec2958ee042bf0880209664c18509dc946ad9","size":5126,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/e06ec2958ee042bf0880209664c18509dc946ad9"},{"path":"docs/case-studies/issue-41/data/hive-mind-issue-1593-comments.json","mode":"100644","type":"blob","sha":"0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc","size":2,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc"},{"path":"docs/case-studies/issue-41/data/hive-mind-issue-1593.json","mode":"100644","type":"blob","sha":"974f28e357c4a075c4d4cc1bb0d385507f16f332","size":5063,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/974f28e357c4a075c4d4cc1bb0d385507f16f332"},{"path":"docs/case-studies/issue-41/data/hive-mind-issue-1730-case-study.md","mode":"100644","type":"blob","sha":"bb5c8cee718a3f5589831531974d36b7dfac95a1","size":11040,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/bb5c8cee718a3f5589831531974d36b7dfac95a1"},{"path":"docs/case-studies/issue-41/data/hive-mind-issue-1730-comments.json","mode":"100644","type":"blob","sha":"0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc","size":2,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc"},{"path":"docs/case-studies/issue-41/data/hive-mind-issue-1730.json","mode":"100644","type":"blob","sha":"1f233f4ddcfcb852074e51885bdecfa349fcbcb9","size":5509,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/1f233f4ddcfcb852074e51885bdecfa349fcbcb9"},{"path":"docs/case-studies/issue-41/data/js-template-check-file-line-limits-before.sh","mode":"100755","type":"blob","sha":"ae66f276e915cebabf8fc40fb2f21034acb24540","size":1634,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/ae66f276e915cebabf8fc40fb2f21034acb24540"},{"path":"docs/case-studies/issue-41/data/js-template-eslint.config.js","mode":"100644","type":"blob","sha":"ee9438eaf039289497c80c99dd512e54601be5e8","size":2850,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/ee9438eaf039289497c80c99dd512e54601be5e8"},{"path":"docs/case-studies/issue-41/data/js-template-file-tree.txt","mode":"100644","type":"blob","sha":"0d097a3f8e1f718d11176cbe8fe31444516def9a","size":4857,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/0d097a3f8e1f718d11176cbe8fe31444516def9a"},{"path":"docs/case-studies/issue-41/data/js-template-issue-41-comments.json","mode":"100644","type":"blob","sha":"3dad1f8506041d5a34ef8fee2f9791f4b3f3ff75","size":3398,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/3dad1f8506041d5a34ef8fee2f9791f4b3f3ff75"},{"path":"docs/case-studies/issue-41/data/js-template-issue-41.json","mode":"100644","type":"blob","sha":"b53a5ae005d9b1ef351fde3fbf8ca2e6388265a7","size":5693,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/b53a5ae005d9b1ef351fde3fbf8ca2e6388265a7"},{"path":"docs/case-studies/issue-41/data/js-template-release.yml","mode":"100644","type":"blob","sha":"7090eb5402bbe81fdda60c8a16e991cf33b22842","size":19369,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/7090eb5402bbe81fdda60c8a16e991cf33b22842"},{"path":"docs/case-studies/issue-41/data/js-template-warn-threshold-search-before.json","mode":"100644","type":"blob","sha":"fe51488c7066f6687ef680d6bfaa4f7768ef205c","size":3,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/fe51488c7066f6687ef680d6bfaa4f7768ef205c"},{"path":"docs/case-studies/issue-41/data/rust-template-check-file-size.rs","mode":"100644","type":"blob","sha":"f5eb668f5bea2a043c810163f6e506951fd1a2ea","size":2764,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/f5eb668f5bea2a043c810163f6e506951fd1a2ea"},{"path":"docs/case-studies/issue-41/data/rust-template-created-issue-url.txt","mode":"100644","type":"blob","sha":"48194880154ae0f69a51822eee76d87e4f95bf3f","size":90,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/48194880154ae0f69a51822eee76d87e4f95bf3f"},{"path":"docs/case-studies/issue-41/data/rust-template-file-tree.txt","mode":"100644","type":"blob","sha":"b450b235bffc24455f31e6f0803fa339699bd019","size":3730,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/b450b235bffc24455f31e6f0803fa339699bd019"},{"path":"docs/case-studies/issue-41/data/rust-template-issue-40.json","mode":"100644","type":"blob","sha":"252b8b76588b657cf639df12fca6a479ff248bd5","size":2561,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/252b8b76588b657cf639df12fca6a479ff248bd5"},{"path":"docs/case-studies/issue-41/data/rust-template-issues.json","mode":"100644","type":"blob","sha":"6da0d1785e2aaef43da001247d894f7989e5a846","size":10031,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/6da0d1785e2aaef43da001247d894f7989e5a846"},{"path":"docs/case-studies/issue-41/data/rust-template-max-lines-search.json","mode":"100644","type":"blob","sha":"fe51488c7066f6687ef680d6bfaa4f7768ef205c","size":3,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/fe51488c7066f6687ef680d6bfaa4f7768ef205c"},{"path":"docs/case-studies/issue-41/data/rust-template-release.yml","mode":"100644","type":"blob","sha":"e8b6fb77030f59ecbb748c3e98c2d1cdeba0e079","size":16372,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/e8b6fb77030f59ecbb748c3e98c2d1cdeba0e079"},{"path":"docs/case-studies/issue-42","mode":"040000","type":"tree","sha":"07f013b73159dd41e9c6daa13ab45d12d3494d6f","url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/trees/07f013b73159dd41e9c6daa13ab45d12d3494d6f"},{"path":"docs/case-studies/issue-42/README.md","mode":"100644","type":"blob","sha":"63c1cdeabfb47052b10f3003115185e53962d76f","size":6516,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/63c1cdeabfb47052b10f3003115185e53962d76f"},{"path":"docs/case-studies/issue-42/data","mode":"040000","type":"tree","sha":"bee9839eee803ec4fd02759b639b35151daa0e1a","url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/trees/bee9839eee803ec4fd02759b639b35151daa0e1a"},{"path":"docs/case-studies/issue-42/data/ci-runs-branch.json","mode":"100644","type":"blob","sha":"c4762b0ceeaf9f94548d6f0b0091907b8c61774c","size":197,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/c4762b0ceeaf9f94548d6f0b0091907b8c61774c"},{"path":"docs/case-studies/issue-42/data/issue-42-comments.json","mode":"100644","type":"blob","sha":"68b41b48f493453376926ded7f77289a6f886b5a","size":3398,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/68b41b48f493453376926ded7f77289a6f886b5a"},{"path":"docs/case-studies/issue-42/data/issue-42.json","mode":"100644","type":"blob","sha":"2141397162ffcddbbb1523094cc39d15ea96d034","size":3513,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/2141397162ffcddbbb1523094cc39d15ea96d034"},{"path":"docs/case-studies/issue-42/data/js-template-file-tree.txt","mode":"100644","type":"blob","sha":"b1155ad314a059cf5d88b4a2dfbe47eda3d0a833","size":4793,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/b1155ad314a059cf5d88b4a2dfbe47eda3d0a833"},{"path":"docs/case-studies/issue-42/data/js-template-pre-fix-head.txt","mode":"100644","type":"blob","sha":"12d1272ba47453fba0e3753446e5995c16e8fc29","size":41,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/12d1272ba47453fba0e3753446e5995c16e8fc29"},{"path":"docs/case-studies/issue-42/data/link-foundation-my-package-search.txt","mode":"100644","type":"blob","sha":"b65cceb6b0cb36a42fd83c8d4df48bd785f921d9","size":4692,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/b65cceb6b0cb36a42fd83c8d4df48bd785f921d9"},{"path":"docs/case-studies/issue-42/data/link-foundation-package-name-search.txt","mode":"100644","type":"blob","sha":"d06ee4f3368eb20ef0e3e20d8eaf7c51b47525af","size":7460,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/d06ee4f3368eb20ef0e3e20d8eaf7c51b47525af"},{"path":"docs/case-studies/issue-42/data/pr-45-conversation-comments.json","mode":"100644","type":"blob","sha":"fe51488c7066f6687ef680d6bfaa4f7768ef205c","size":3,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/fe51488c7066f6687ef680d6bfaa4f7768ef205c"},{"path":"docs/case-studies/issue-42/data/pr-45-review-comments.json","mode":"100644","type":"blob","sha":"fe51488c7066f6687ef680d6bfaa4f7768ef205c","size":3,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/fe51488c7066f6687ef680d6bfaa4f7768ef205c"},{"path":"docs/case-studies/issue-42/data/pr-45-reviews.json","mode":"100644","type":"blob","sha":"fe51488c7066f6687ef680d6bfaa4f7768ef205c","size":3,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/fe51488c7066f6687ef680d6bfaa4f7768ef205c"},{"path":"docs/case-studies/issue-42/data/pr-45.json","mode":"100644","type":"blob","sha":"d572a0d618c6e1dc0b55785879f47a4976e45d83","size":8012,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/d572a0d618c6e1dc0b55785879f47a4976e45d83"},{"path":"docs/case-studies/issue-42/data/related-merged-prs-check-release-needed.json","mode":"100644","type":"blob","sha":"d40584a362b598dfeeb83e256184502f8645a430","size":638,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/d40584a362b598dfeeb83e256184502f8645a430"},{"path":"docs/case-studies/issue-42/data/related-merged-prs-publish-to-npm.json","mode":"100644","type":"blob","sha":"fa8fc68a81e4beb9b9f022f5a0177333804ba6a3","size":1252,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/fa8fc68a81e4beb9b9f022f5a0177333804ba6a3"},{"path":"docs/case-studies/issue-42/data/rust-template-ci-cd-findings.txt","mode":"100644","type":"blob","sha":"c9006adf7c8151f39b1144cdf812d78b0bba3706","size":3070,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/c9006adf7c8151f39b1144cdf812d78b0bba3706"},{"path":"docs/case-studies/issue-42/data/rust-template-file-tree.txt","mode":"100644","type":"blob","sha":"4665a655c09cbc003d2d548813ccef33b55baec4","size":3222,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/4665a655c09cbc003d2d548813ccef33b55baec4"},{"path":"docs/case-studies/issue-42/data/rust-template-head.txt","mode":"100644","type":"blob","sha":"e0ae5c96230d55e2a0ece9aac2524f5dbb547148","size":41,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/e0ae5c96230d55e2a0ece9aac2524f5dbb547148"},{"path":"docs/case-studies/issue-56","mode":"040000","type":"tree","sha":"e2adce984ccbdc958c15e022fe365f25fdc4871b","url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/trees/e2adce984ccbdc958c15e022fe365f25fdc4871b"},{"path":"docs/case-studies/issue-56/README.md","mode":"100644","type":"blob","sha":"5472a380d84ec531d7d65ad1636943fc98c47e9e","size":11579,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/5472a380d84ec531d7d65ad1636943fc98c47e9e"},{"path":"docs/case-studies/issue-56/artifacts","mode":"040000","type":"tree","sha":"73b80761015ea1657603498aabbfcf879211bd4e","url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/trees/73b80761015ea1657603498aabbfcf879211bd4e"},{"path":"docs/case-studies/issue-56/artifacts/universal-app-mobile.png","mode":"100644","type":"blob","sha":"6b499c74e52dea4106193d97ddc7d4d9bfae6422","size":80586,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/6b499c74e52dea4106193d97ddc7d4d9bfae6422"},{"path":"docs/case-studies/issue-56/artifacts/universal-app-web.png","mode":"100644","type":"blob","sha":"b556f7d42a15bd06f82aaef6dfd1870de4f0cd6e","size":179773,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/b556f7d42a15bd06f82aaef6dfd1870de4f0cd6e"},{"path":"docs/case-studies/issue-56/data","mode":"040000","type":"tree","sha":"f9bfbadc68f917d045c980b7d98f4db424aa5060","url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/trees/f9bfbadc68f917d045c980b7d98f4db424aa5060"},{"path":"docs/case-studies/issue-56/data/actions-checkout-release.json","mode":"100644","type":"blob","sha":"3c7f153d82affbb7e1ed3e8b75161d35ee4f12cf","size":122,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/3c7f153d82affbb7e1ed3e8b75161d35ee4f12cf"},{"path":"docs/case-studies/issue-56/data/actions-configure-pages-release.json","mode":"100644","type":"blob","sha":"dd2331409299beef659c995a96db3b82faa6f667","size":58,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/dd2331409299beef659c995a96db3b82faa6f667"},{"path":"docs/case-studies/issue-56/data/actions-deploy-pages-release.json","mode":"100644","type":"blob","sha":"8a030d8fc12159783ba91340b2bd3711cf2f95a1","size":58,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/8a030d8fc12159783ba91340b2bd3711cf2f95a1"},{"path":"docs/case-studies/issue-56/data/actions-setup-node-release.json","mode":"100644","type":"blob","sha":"7a12823d671c0b3a2ee8b749cfe678734d9e8724","size":124,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/7a12823d671c0b3a2ee8b749cfe678734d9e8724"},{"path":"docs/case-studies/issue-56/data/actions-upload-artifact-release.json","mode":"100644","type":"blob","sha":"3998d30979d81b2c61d57247e3899d754445d76e","size":129,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/3998d30979d81b2c61d57247e3899d754445d76e"},{"path":"docs/case-studies/issue-56/data/actions-upload-pages-artifact-release.json","mode":"100644","type":"blob","sha":"df8443358aa99a7c71471a3d6df3e93be68bdcf7","size":58,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/df8443358aa99a7c71471a3d6df3e93be68bdcf7"},{"path":"docs/case-studies/issue-56/data/bun-test-final.log","mode":"100644","type":"blob","sha":"7f61e2762301df34f507ee40defb04509e16bf01","size":5369,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/7f61e2762301df34f507ee40defb04509e16bf01"},{"path":"docs/case-studies/issue-56/data/changeset-status-after-stage.log","mode":"100644","type":"blob","sha":"6125608d9786f91aeac648dd9746688792050569","size":260,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/6125608d9786f91aeac648dd9746688792050569"},{"path":"docs/case-studies/issue-56/data/check-file-line-limits-final-2.log","mode":"100644","type":"blob","sha":"3b33ea202f2662158c856c13ced1bc062408a258","size":1830,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/3b33ea202f2662158c856c13ced1bc062408a258"},{"path":"docs/case-studies/issue-56/data/check-mjs-syntax-final-2.log","mode":"100644","type":"blob","sha":"d4296eff7a16eef849cf690cf10dfa9d60591493","size":962,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/d4296eff7a16eef849cf690cf10dfa9d60591493"},{"path":"docs/case-studies/issue-56/data/deep-sdk-capacitor.config.ts","mode":"100644","type":"blob","sha":"39a98561bff5629cc2206ab202bc00ab70d5d45d","size":321,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/39a98561bff5629cc2206ab202bc00ab70d5d45d"},{"path":"docs/case-studies/issue-56/data/deep-sdk-electron-package.json","mode":"100644","type":"blob","sha":"2e713ea0f6c7934d74db79a192d0834d4525e122","size":2911,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/2e713ea0f6c7934d74db79a192d0834d4525e122"},{"path":"docs/case-studies/issue-56/data/deep-sdk-file-tree.txt","mode":"100644","type":"blob","sha":"57d07f56a204b060e44faa44e5c6407a1a1827d1","size":7845,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/57d07f56a204b060e44faa44e5c6407a1a1827d1"},{"path":"docs/case-studies/issue-56/data/deep-sdk-gh-pages.yml","mode":"100644","type":"blob","sha":"1df1ce27dbe53d4c58fe548f46cc342d1dde2761","size":2930,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/1df1ce27dbe53d4c58fe548f46cc342d1dde2761"},{"path":"docs/case-studies/issue-56/data/deep-sdk-package.json","mode":"100644","type":"blob","sha":"7c02a08faec43bfcf25d9a09d0904fc00a339480","size":3778,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/7c02a08faec43bfcf25d9a09d0904fc00a339480"},{"path":"docs/case-studies/issue-56/data/deep-sdk-repo.json","mode":"100644","type":"blob","sha":"0c711a4bfaa1f00e5c35174c504ef456d31b77c7","size":344,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/0c711a4bfaa1f00e5c35174c504ef456d31b77c7"},{"path":"docs/case-studies/issue-56/data/deno-test-final.log","mode":"100644","type":"blob","sha":"86703126adb14c07cee07a801714cbd27a2e2668","size":12781,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/86703126adb14c07cee07a801714cbd27a2e2668"},{"path":"docs/case-studies/issue-56/data/example-desktop-package-final-2.log","mode":"100644","type":"blob","sha":"7cedf02d2e323c1ff1f3c18e80ffb303703352cd","size":1292,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/7cedf02d2e323c1ff1f3c18e80ffb303703352cd"},{"path":"docs/case-studies/issue-56/data/example-mobile-sync-final-2.log","mode":"100644","type":"blob","sha":"fb1662b60a56ec7d3c22126fb1ed7ed229c8305b","size":625,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/fb1662b60a56ec7d3c22126fb1ed7ed229c8305b"},{"path":"docs/case-studies/issue-56/data/example-web-build-final-2.log","mode":"100644","type":"blob","sha":"14b2fda2a2d23c83da71fb40fecc7d38cc6fa39e","size":466,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/14b2fda2a2d23c83da71fb40fecc7d38cc6fa39e"},{"path":"docs/case-studies/issue-56/data/issue-56-comments.json","mode":"100644","type":"blob","sha":"0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc","size":2,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc"},{"path":"docs/case-studies/issue-56/data/issue-56.json","mode":"100644","type":"blob","sha":"3e08c4e2cadba2c5f41cd3f5e911a23097756d77","size":5024,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/3e08c4e2cadba2c5f41cd3f5e911a23097756d77"},{"path":"docs/case-studies/issue-56/data/link-foundation-code-search.json","mode":"100644","type":"blob","sha":"fe51488c7066f6687ef680d6bfaa4f7768ef205c","size":3,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/fe51488c7066f6687ef680d6bfaa4f7768ef205c"},{"path":"docs/case-studies/issue-56/data/npm-capacitor-cli.json","mode":"100644","type":"blob","sha":"d1a583dce4d4e36a420cc7882c53e652756704fd","size":268,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/d1a583dce4d4e36a420cc7882c53e652756704fd"},{"path":"docs/case-studies/issue-56/data/npm-capacitor-core.json","mode":"100644","type":"blob","sha":"d1a583dce4d4e36a420cc7882c53e652756704fd","size":268,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/d1a583dce4d4e36a420cc7882c53e652756704fd"},{"path":"docs/case-studies/issue-56/data/npm-check-final-4.log","mode":"100644","type":"blob","sha":"00404e50341b76d7c6642cb1efa4def388b0085f","size":524,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/00404e50341b76d7c6642cb1efa4def388b0085f"},{"path":"docs/case-studies/issue-56/data/npm-electron-forge-cli.json","mode":"100644","type":"blob","sha":"ec4183d044e0ea534bbf7b747420e23ccf15ed53","size":279,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/ec4183d044e0ea534bbf7b747420e23ccf15ed53"},{"path":"docs/case-studies/issue-56/data/npm-install-root.log","mode":"100644","type":"blob","sha":"4e70da35565c29705d1d025e6b750905a531542a","size":269,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/4e70da35565c29705d1d025e6b750905a531542a"},{"path":"docs/case-studies/issue-56/data/npm-install-universal-app-node20-compatible.log","mode":"100644","type":"blob","sha":"ecfa7964478025b50fd97214a9aebd8990418c3d","size":3407,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/ecfa7964478025b50fd97214a9aebd8990418c3d"},{"path":"docs/case-studies/issue-56/data/npm-test-final-3.log","mode":"100644","type":"blob","sha":"888e10e42bbde4fefebe9af992d1f76a132ada66","size":11932,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/888e10e42bbde4fefebe9af992d1f76a132ada66"},{"path":"docs/case-studies/issue-56/data/npm-vite.json","mode":"100644","type":"blob","sha":"8d95d054a7bfe783100d45eaa6b7cf5503e1176d","size":266,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/8d95d054a7bfe783100d45eaa6b7cf5503e1176d"},{"path":"docs/case-studies/issue-56/data/pr-57.json","mode":"100644","type":"blob","sha":"248d3a3d43c49aa5adb8023b615ae6be3153a27e","size":8201,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/248d3a3d43c49aa5adb8023b615ae6be3153a27e"},{"path":"docs/case-studies/issue-56/data/recent-merged-prs.json","mode":"100644","type":"blob","sha":"81c8e8cdfdc05540b902d561b79a293ae5753c6f","size":2170,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/81c8e8cdfdc05540b902d561b79a293ae5753c6f"},{"path":"docs/case-studies/issue-56/data/universal-app-test-before.log","mode":"100644","type":"blob","sha":"144c79b0931e5930c5136952caaeb49382107566","size":5907,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/144c79b0931e5930c5136952caaeb49382107566"},{"path":"docs/case-studies/issue-56/data/universal-app-test-final-2.log","mode":"100644","type":"blob","sha":"b29057aecee4cb8fa33bc7b7b0d369588e8f9248","size":1218,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/b29057aecee4cb8fa33bc7b7b0d369588e8f9248"},{"path":"docs/case-studies/issue-56/data/validate-changeset-final.log","mode":"100644","type":"blob","sha":"837a84ac2c1b92ec6f770f1805f0c8351ebd2ea7","size":508,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/837a84ac2c1b92ec6f770f1805f0c8351ebd2ea7"},{"path":"docs/case-studies/issue-56/data/vk-bot-desktop-build-renderer.mjs","mode":"100644","type":"blob","sha":"8c1c30bc9ecc91f4fe8a17806a571966bdbe183a","size":1511,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/8c1c30bc9ecc91f4fe8a17806a571966bdbe183a"},{"path":"docs/case-studies/issue-56/data/vk-bot-desktop-electron-main.cjs","mode":"100644","type":"blob","sha":"3b1bd5d146be2bcc75bb7ab7b2010aa53c2ee996","size":6128,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/3b1bd5d146be2bcc75bb7ab7b2010aa53c2ee996"},{"path":"docs/case-studies/issue-56/data/vk-bot-desktop-file-tree.txt","mode":"100644","type":"blob","sha":"92352becc1a7fd772f14fb5caaf7656d9a316834","size":32571,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/92352becc1a7fd772f14fb5caaf7656d9a316834"},{"path":"docs/case-studies/issue-56/data/vk-bot-desktop-js-workflow.yml","mode":"100644","type":"blob","sha":"090cb1790fbf183dbdb6f1e770a04a7043152637","size":51231,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/090cb1790fbf183dbdb6f1e770a04a7043152637"},{"path":"docs/case-studies/issue-56/data/vk-bot-desktop-package.json","mode":"100644","type":"blob","sha":"4e13d7f1a4e8f8ad24aa7652b61216636f99acd6","size":4667,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/4e13d7f1a4e8f8ad24aa7652b61216636f99acd6"},{"path":"docs/case-studies/issue-56/data/vk-bot-desktop-repo.json","mode":"100644","type":"blob","sha":"1c9bbc56fcb352985a43794d53a3657fabed6372","size":388,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/1c9bbc56fcb352985a43794d53a3657fabed6372"},{"path":"docs/case-studies/issue-58","mode":"040000","type":"tree","sha":"aff45a09ecf4d2343da1e3bc2f8a566e7db098b6","url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/trees/aff45a09ecf4d2343da1e3bc2f8a566e7db098b6"},{"path":"docs/case-studies/issue-58/README.md","mode":"100644","type":"blob","sha":"68c8f334e8d79c8e264c232953ec0ae66d999177","size":16087,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/68c8f334e8d79c8e264c232953ec0ae66d999177"},{"path":"docs/case-studies/issue-58/data","mode":"040000","type":"tree","sha":"22c03f259ea6ef5f838bb6f8dddf7156b0cefdf9","url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/trees/22c03f259ea6ef5f838bb6f8dddf7156b0cefdf9"},{"path":"docs/case-studies/issue-58/data/actions-configure-pages-release.json","mode":"100644","type":"blob","sha":"d7edac730c22fb4fb34c0f51dde00bcf987cb994","size":129,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/d7edac730c22fb4fb34c0f51dde00bcf987cb994"},{"path":"docs/case-studies/issue-58/data/actions-deploy-pages-release.json","mode":"100644","type":"blob","sha":"f234bbe5d4b37bc7139ae5eb0c063cdecd45375e","size":126,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/f234bbe5d4b37bc7139ae5eb0c063cdecd45375e"},{"path":"docs/case-studies/issue-58/data/actions-upload-artifact-release.json","mode":"100644","type":"blob","sha":"3998d30979d81b2c61d57247e3899d754445d76e","size":129,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/3998d30979d81b2c61d57247e3899d754445d76e"},{"path":"docs/case-studies/issue-58/data/actions-upload-pages-artifact-release.json","mode":"100644","type":"blob","sha":"7813651e3bdbf058671a23674e57dc5fd77fd055","size":135,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/7813651e3bdbf058671a23674e57dc5fd77fd055"},{"path":"docs/case-studies/issue-58/data/bun-test.log","mode":"100644","type":"blob","sha":"41dbb38a2b60b96ec4649d66397c16a02a461e55","size":5894,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/41dbb38a2b60b96ec4649d66397c16a02a461e55"},{"path":"docs/case-studies/issue-58/data/check-file-line-limits.log","mode":"100644","type":"blob","sha":"3b33ea202f2662158c856c13ced1bc062408a258","size":1830,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/3b33ea202f2662158c856c13ced1bc062408a258"},{"path":"docs/case-studies/issue-58/data/check-mjs-syntax.log","mode":"100644","type":"blob","sha":"d4296eff7a16eef849cf690cf10dfa9d60591493","size":962,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/d4296eff7a16eef849cf690cf10dfa9d60591493"},{"path":"docs/case-studies/issue-58/data/checks-and-release-25733140225.json","mode":"100644","type":"blob","sha":"e6ee8169579ffd7ffcabc2caa9f819b413277308","size":34615,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/e6ee8169579ffd7ffcabc2caa9f819b413277308"},{"path":"docs/case-studies/issue-58/data/checks-and-release-25733140225.log","mode":"100644","type":"blob","sha":"89176333af05dacd9e61d91c255fe14aab1da381","size":922703,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/89176333af05dacd9e61d91c255fe14aab1da381"},{"path":"docs/case-studies/issue-58/data/checks-and-release-25743983223.log","mode":"100644","type":"blob","sha":"6977b0ce9647db319a394062cc045969aaa054c8","size":862109,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/6977b0ce9647db319a394062cc045969aaa054c8"},{"path":"docs/case-studies/issue-58/data/ci-run-25743983223.json","mode":"100644","type":"blob","sha":"18fde5b129f00f12581516438d897ed479357bc7","size":28333,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/18fde5b129f00f12581516438d897ed479357bc7"},{"path":"docs/case-studies/issue-58/data/csharp-template-file-tree.txt","mode":"100644","type":"blob","sha":"d9d5a99a20d94c02448c1d204511122b8b5f23fd","size":942,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/d9d5a99a20d94c02448c1d204511122b8b5f23fd"},{"path":"docs/case-studies/issue-58/data/csharp-template-release.yml","mode":"100644","type":"blob","sha":"499b729cdb5811aa72d350eeddcf0f02663316f9","size":17724,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/499b729cdb5811aa72d350eeddcf0f02663316f9"},{"path":"docs/case-studies/issue-58/data/deno-test.log","mode":"100644","type":"blob","sha":"4e95e9205a4b87598c421effa1f39ad1f7c9942e","size":4002,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/4e95e9205a4b87598c421effa1f39ad1f7c9942e"},{"path":"docs/case-studies/issue-58/data/example-app-25733140224.json","mode":"100644","type":"blob","sha":"efbb9b42e3758516f9feb55d6227f52a457110aa","size":8976,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/efbb9b42e3758516f9feb55d6227f52a457110aa"},{"path":"docs/case-studies/issue-58/data/example-app-25733140224.log","mode":"100644","type":"blob","sha":"c04157f00887b181dfdef47f1e7fb272e802f736","size":167869,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/c04157f00887b181dfdef47f1e7fb272e802f736"},{"path":"docs/case-studies/issue-58/data/example-desktop-package.log","mode":"100644","type":"blob","sha":"a31473070434ac735c0db8c514a37bb2eba431ed","size":1320,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/a31473070434ac735c0db8c514a37bb2eba431ed"},{"path":"docs/case-studies/issue-58/data/example-mobile-sync.log","mode":"100644","type":"blob","sha":"9c4d5ca53c3e5920c2d91322916f133f8497b814","size":653,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/9c4d5ca53c3e5920c2d91322916f133f8497b814"},{"path":"docs/case-studies/issue-58/data/example-web-build.log","mode":"100644","type":"blob","sha":"751f367821563754645c88a66afdf5841400313c","size":494,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/751f367821563754645c88a66afdf5841400313c"},{"path":"docs/case-studies/issue-58/data/issue-58-comments.json","mode":"100644","type":"blob","sha":"0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc","size":2,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc"},{"path":"docs/case-studies/issue-58/data/issue-58.json","mode":"100644","type":"blob","sha":"43d2fd3f08f90b8058dd33fd185194baa4ef3fa6","size":2845,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/43d2fd3f08f90b8058dd33fd185194baa4ef3fa6"},{"path":"docs/case-studies/issue-58/data/js-template-file-tree.txt","mode":"100644","type":"blob","sha":"fc43d46a2c4459053b6a91ace927607dde4267bd","size":12582,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/fc43d46a2c4459053b6a91ace927607dde4267bd"},{"path":"docs/case-studies/issue-58/data/link-foundation-example-package-name-search.json","mode":"100644","type":"blob","sha":"fe51488c7066f6687ef680d6bfaa4f7768ef205c","size":3,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/fe51488c7066f6687ef680d6bfaa4f7768ef205c"},{"path":"docs/case-studies/issue-58/data/main-ci-runs.json","mode":"100644","type":"blob","sha":"ec48d538bd319d15807f0522e74f61ccc0fd62ff","size":8650,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/ec48d538bd319d15807f0522e74f61ccc0fd62ff"},{"path":"docs/case-studies/issue-58/data/npm-check-final.log","mode":"100644","type":"blob","sha":"cddd97e17a94b14621cfc02f3bf2d9caab8af99b","size":674,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/cddd97e17a94b14621cfc02f3bf2d9caab8af99b"},{"path":"docs/case-studies/issue-58/data/npm-example-package-name-view.json","mode":"100644","type":"blob","sha":"f10c59fe6679986d1b6d1d438ff2c3cf7e189f9e","size":896,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/f10c59fe6679986d1b6d1d438ff2c3cf7e189f9e"},{"path":"docs/case-studies/issue-58/data/npm-global-install.log","mode":"100644","type":"blob","sha":"260887b9e90b658a65b3f368460645e51156d0bf","size":29,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/260887b9e90b658a65b3f368460645e51156d0bf"},{"path":"docs/case-studies/issue-58/data/npm-install-after-metadata.log","mode":"100644","type":"blob","sha":"f0a4742a3e0436e9a943866a112389ab0f41f122","size":297,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/f0a4742a3e0436e9a943866a112389ab0f41f122"},{"path":"docs/case-studies/issue-58/data/npm-install-universal-app.log","mode":"100644","type":"blob","sha":"d255a7cb3eabaacc84795947fc658b04f3163734","size":3407,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/d255a7cb3eabaacc84795947fc658b04f3163734"},{"path":"docs/case-studies/issue-58/data/npm-install.log","mode":"100644","type":"blob","sha":"d32f92729c9c23ce52a83dcaf9c94b1f252cd414","size":279,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/d32f92729c9c23ce52a83dcaf9c94b1f252cd414"},{"path":"docs/case-studies/issue-58/data/npm-pack-dry-run-final.json","mode":"100644","type":"blob","sha":"523433b559cc79ee47c422537a613cb2a4a0984a","size":1140,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/523433b559cc79ee47c422537a613cb2a4a0984a"},{"path":"docs/case-studies/issue-58/data/npm-test-2.log","mode":"100644","type":"blob","sha":"63551cf4220a04ff91aed19395332db34c5b6d5a","size":12944,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/63551cf4220a04ff91aed19395332db34c5b6d5a"},{"path":"docs/case-studies/issue-58/data/npm-whoami.log","mode":"100644","type":"blob","sha":"ea0af632f5ca3ceb7cdda8d20698d9760946292b","size":275,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/ea0af632f5ca3ceb7cdda8d20698d9760946292b"},{"path":"docs/case-studies/issue-58/data/pages-enable-result.json","mode":"100644","type":"blob","sha":"bd113afcdcd98aa31e53819fc774f40dd6f3702f","size":404,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/bd113afcdcd98aa31e53819fc774f40dd6f3702f"},{"path":"docs/case-studies/issue-58/data/pages-status-after-enable.json","mode":"100644","type":"blob","sha":"bd113afcdcd98aa31e53819fc774f40dd6f3702f","size":404,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/bd113afcdcd98aa31e53819fc774f40dd6f3702f"},{"path":"docs/case-studies/issue-58/data/pr-57.diff","mode":"100644","type":"blob","sha":"8f15847b04dfe66e4434c8ba424b70c3c756567b","size":588460,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/8f15847b04dfe66e4434c8ba424b70c3c756567b"},{"path":"docs/case-studies/issue-58/data/pr-57.json","mode":"100644","type":"blob","sha":"ac38dc02634d0c8c60f563ffd01208239773bea5","size":10610,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/ac38dc02634d0c8c60f563ffd01208239773bea5"},{"path":"docs/case-studies/issue-58/data/pr-59-conversation-comments.json","mode":"100644","type":"blob","sha":"0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc","size":2,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc"},{"path":"docs/case-studies/issue-58/data/pr-59-review-comments.json","mode":"100644","type":"blob","sha":"0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc","size":2,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc"},{"path":"docs/case-studies/issue-58/data/pr-59-reviews.json","mode":"100644","type":"blob","sha":"0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc","size":2,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc"},{"path":"docs/case-studies/issue-58/data/pr-59.json","mode":"100644","type":"blob","sha":"959bb6287d292120ab307096f741385de4fa2376","size":1376,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/959bb6287d292120ab307096f741385de4fa2376"},{"path":"docs/case-studies/issue-58/data/python-template-file-tree.txt","mode":"100644","type":"blob","sha":"e0b8bb5a2d8e4060cef27c06f456570356094e07","size":817,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/e0b8bb5a2d8e4060cef27c06f456570356094e07"},{"path":"docs/case-studies/issue-58/data/python-template-release.yml","mode":"100644","type":"blob","sha":"c8999ba00878ebbe3c90efeedbe1787708e6937b","size":11674,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/c8999ba00878ebbe3c90efeedbe1787708e6937b"},{"path":"docs/case-studies/issue-58/data/regression-after-2.log","mode":"100644","type":"blob","sha":"151748754dbfc0a63ebb2f7a8b50541f83b734fb","size":2021,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/151748754dbfc0a63ebb2f7a8b50541f83b734fb"},{"path":"docs/case-studies/issue-58/data/regression-after-3.log","mode":"100644","type":"blob","sha":"753b1ddac2d1d3892e8de12f5786f34f6182c408","size":2202,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/753b1ddac2d1d3892e8de12f5786f34f6182c408"},{"path":"docs/case-studies/issue-58/data/regression-after.log","mode":"100644","type":"blob","sha":"c839b5158267e8a21817155392cece119a33321b","size":2021,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/c839b5158267e8a21817155392cece119a33321b"},{"path":"docs/case-studies/issue-58/data/regression-before.log","mode":"100644","type":"blob","sha":"1095318176f1a5c9a32c4449fd18ca9950da6603","size":11519,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/1095318176f1a5c9a32c4449fd18ca9950da6603"},{"path":"docs/case-studies/issue-58/data/rust-template-file-tree.txt","mode":"100644","type":"blob","sha":"a2207248efbca0d35b0cb76d61c3231f8a8ef4d5","size":5909,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/a2207248efbca0d35b0cb76d61c3231f8a8ef4d5"},{"path":"docs/case-studies/issue-58/data/rust-template-release.yml","mode":"100644","type":"blob","sha":"c3afcd9223549f041c824682f5f1e465454408e4","size":23022,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/c3afcd9223549f041c824682f5f1e465454408e4"},{"path":"docs/case-studies/issue-58/data/secretlint.log","mode":"100644","type":"blob","sha":"e69de29bb2d1d6434b8b29ae775ad8c2e48c5391","size":0,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/e69de29bb2d1d6434b8b29ae775ad8c2e48c5391"},{"path":"docs/case-studies/issue-58/data/validate-changeset.log","mode":"100644","type":"blob","sha":"e839af906d428243448fcc2b3861c63600426f58","size":549,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/e839af906d428243448fcc2b3861c63600426f58"},{"path":"docs/case-studies/issue-7","mode":"040000","type":"tree","sha":"357ac6bf964c20292c9af615816a3443c8e3e740","url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/trees/357ac6bf964c20292c9af615816a3443c8e3e740"},{"path":"docs/case-studies/issue-7/BEST-PRACTICES-COMPARISON.md","mode":"100644","type":"blob","sha":"16d3820926b0c7ed9dfa24e60a76874924766771","size":9478,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/16d3820926b0c7ed9dfa24e60a76874924766771"},{"path":"docs/case-studies/issue-7/FORMATTER-COMPARISON.md","mode":"100644","type":"blob","sha":"89daa474e1760ccf43c3a7165b28fdee9beb65ff","size":17660,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/89daa474e1760ccf43c3a7165b28fdee9beb65ff"},{"path":"docs/case-studies/issue-7/current-repository-analysis.json","mode":"100644","type":"blob","sha":"149f113a42b073f46ca5adfeb921b58496ce9235","size":1988,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/149f113a42b073f46ca5adfeb921b58496ce9235"},{"path":"docs/case-studies/issue-7/effect-template-analysis.json","mode":"100644","type":"blob","sha":"5be40318ed4346f5c649d6522a56a510f748df52","size":4644,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/5be40318ed4346f5c649d6522a56a510f748df52"},{"path":"eslint.config.js","mode":"100644","type":"blob","sha":"a4979d2138f9537a5e3c5465d87a47cce2ebf53d","size":3160,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/a4979d2138f9537a5e3c5465d87a47cce2ebf53d"},{"path":"examples","mode":"040000","type":"tree","sha":"1113ed7f988fb93ed5bef6f4ed23c4c44c8f5ede","url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/trees/1113ed7f988fb93ed5bef6f4ed23c4c44c8f5ede"},{"path":"examples/basic-usage.js","mode":"100644","type":"blob","sha":"714025b9b45a4fdfd2524ce6b162249b05d2a54c","size":747,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/714025b9b45a4fdfd2524ce6b162249b05d2a54c"},{"path":"examples/universal-app","mode":"040000","type":"tree","sha":"dffe41cc874978c31e991e9515ed5ae250de5202","url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/trees/dffe41cc874978c31e991e9515ed5ae250de5202"},{"path":"examples/universal-app/README.md","mode":"100644","type":"blob","sha":"00aab7fb5139c45ddf5400ab0639179e03b16b11","size":2054,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/00aab7fb5139c45ddf5400ab0639179e03b16b11"},{"path":"examples/universal-app/capacitor.config.json","mode":"100644","type":"blob","sha":"9d8ec491b62efedc0e47be610b3d57e71d6c1d96","size":156,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/9d8ec491b62efedc0e47be610b3d57e71d6c1d96"},{"path":"examples/universal-app/electron","mode":"040000","type":"tree","sha":"5fba57afdd998374f4a746a1109576558bdcfb8b","url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/trees/5fba57afdd998374f4a746a1109576558bdcfb8b"},{"path":"examples/universal-app/electron/main.cjs","mode":"100644","type":"blob","sha":"141cb19585cee1b6594c10cab49c66a3d5a5c226","size":1129,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/141cb19585cee1b6594c10cab49c66a3d5a5c226"},{"path":"examples/universal-app/electron/preload.cjs","mode":"100644","type":"blob","sha":"285d7f319e718e893796e4d385e5314ad079f303","size":151,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/285d7f319e718e893796e4d385e5314ad079f303"},{"path":"examples/universal-app/forge.config.cjs","mode":"100644","type":"blob","sha":"70dae7505911ec3800cdd9d37ddbf1acf90337d8","size":760,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/70dae7505911ec3800cdd9d37ddbf1acf90337d8"},{"path":"examples/universal-app/index.html","mode":"100644","type":"blob","sha":"2c0ba45de0e5c0a07e129aa7882394a68799e8dd","size":495,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/2c0ba45de0e5c0a07e129aa7882394a68799e8dd"},{"path":"examples/universal-app/package-lock.json","mode":"100644","type":"blob","sha":"04c1bf1a82db5bd6ed3d2478ad11273d6050aa9b","size":335543,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/04c1bf1a82db5bd6ed3d2478ad11273d6050aa9b"},{"path":"examples/universal-app/package.json","mode":"100644","type":"blob","sha":"230cc0db052c6f2cdd9bfbdf8a44d6246799137a","size":1590,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/230cc0db052c6f2cdd9bfbdf8a44d6246799137a"},{"path":"examples/universal-app/public","mode":"040000","type":"tree","sha":"b716a729a9807d9c5a999d91b9f4fa04355fb996","url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/trees/b716a729a9807d9c5a999d91b9f4fa04355fb996"},{"path":"examples/universal-app/public/favicon.svg","mode":"100644","type":"blob","sha":"68d6a43a251ee84b8bea4db2db4f9d56141a17e8","size":210,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/68d6a43a251ee84b8bea4db2db4f9d56141a17e8"},{"path":"examples/universal-app/src","mode":"040000","type":"tree","sha":"38e3bf15689af56effd42b44505afcb51d6e8bb1","url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/trees/38e3bf15689af56effd42b44505afcb51d6e8bb1"},{"path":"examples/universal-app/src/App.js","mode":"100644","type":"blob","sha":"8152275269a507524f1149347e2505ce96d894b1","size":3676,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/8152275269a507524f1149347e2505ce96d894b1"},{"path":"examples/universal-app/src/main.js","mode":"100644","type":"blob","sha":"0d76e39ad43a22879738c5b14e2fcd072109bfcc","size":240,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/0d76e39ad43a22879738c5b14e2fcd072109bfcc"},{"path":"examples/universal-app/src/styles.css","mode":"100644","type":"blob","sha":"7b08a2da6d7442ff063d49c1c2c52c22ec8e9124","size":3051,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/7b08a2da6d7442ff063d49c1c2c52c22ec8e9124"},{"path":"examples/universal-app/vite.config.js","mode":"100644","type":"blob","sha":"6782d92633f1a7b0093f1bf78fd8373546370d87","size":498,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/6782d92633f1a7b0093f1bf78fd8373546370d87"},{"path":"experiments","mode":"040000","type":"tree","sha":"129556b110c6ffe10b64208f9516aa67ebd07a32","url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/trees/129556b110c6ffe10b64208f9516aa67ebd07a32"},{"path":"experiments/test-changeset-scripts.mjs","mode":"100644","type":"blob","sha":"dcf30285827a8266eaa352312893b49daeb853b6","size":8385,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/dcf30285827a8266eaa352312893b49daeb853b6"},{"path":"experiments/test-check-release-needed.mjs","mode":"100644","type":"blob","sha":"43298882d8170a590eafee8621f670ad2510888a","size":2751,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/43298882d8170a590eafee8621f670ad2510888a"},{"path":"experiments/test-detect-changes.mjs","mode":"100644","type":"blob","sha":"e8fb3782f855d8dd754367cc57d8fc19ffbc7056","size":4045,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/e8fb3782f855d8dd754367cc57d8fc19ffbc7056"},{"path":"experiments/test-failure-detection.mjs","mode":"100644","type":"blob","sha":"3a48b6bfa83b18372254740741301d6dfebc7710","size":4472,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/3a48b6bfa83b18372254740741301d6dfebc7710"},{"path":"experiments/test-format-major-changes.mjs","mode":"100644","type":"blob","sha":"37087f15e2cad0a93181f9de1303f8d87fe64160","size":1557,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/37087f15e2cad0a93181f9de1303f8d87fe64160"},{"path":"experiments/test-format-minor-changes.mjs","mode":"100644","type":"blob","sha":"f8a4e854307b6718a94b9b441dc2d2dd3a61bbb8","size":1766,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/f8a4e854307b6718a94b9b441dc2d2dd3a61bbb8"},{"path":"experiments/test-format-no-hash.mjs","mode":"100644","type":"blob","sha":"103334ee87a099127b5d0445cc401ae953361ef2","size":1284,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/103334ee87a099127b5d0445cc401ae953361ef2"},{"path":"experiments/test-format-patch-changes.mjs","mode":"100644","type":"blob","sha":"1e65103d4ac3d1086c80dcce3170a06736511cfb","size":1460,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/1e65103d4ac3d1086c80dcce3170a06736511cfb"},{"path":"package-lock.json","mode":"100644","type":"blob","sha":"828deb77b8caf9d6afd6b3f5c66582738a700e01","size":144647,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/828deb77b8caf9d6afd6b3f5c66582738a700e01"},{"path":"package.json","mode":"100644","type":"blob","sha":"885a138663b5ba649533314d9df6eeebec8895ba","size":2462,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/885a138663b5ba649533314d9df6eeebec8895ba"},{"path":"scripts","mode":"040000","type":"tree","sha":"98b3a3b5fe2c371b467eb1ddf0892d600ca4f415","url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/trees/98b3a3b5fe2c371b467eb1ddf0892d600ca4f415"},{"path":"scripts/changeset-version.mjs","mode":"100644","type":"blob","sha":"368f2971324966734e791ec2eb1447b72ca1ffd3","size":2667,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/368f2971324966734e791ec2eb1447b72ca1ffd3"},{"path":"scripts/check-changesets.mjs","mode":"100644","type":"blob","sha":"3f7b7ac67fe0e7f003e664f3a15474d744a30972","size":1729,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/3f7b7ac67fe0e7f003e664f3a15474d744a30972"},{"path":"scripts/check-docker-publish.mjs","mode":"100644","type":"blob","sha":"e2793f140c2302c7ee811238dfa59b52a3655911","size":3528,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/e2793f140c2302c7ee811238dfa59b52a3655911"},{"path":"scripts/check-file-line-limits.sh","mode":"100755","type":"blob","sha":"70807d8de8b97abd26b125c139d0028c4f345630","size":2745,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/70807d8de8b97abd26b125c139d0028c4f345630"},{"path":"scripts/check-mjs-syntax.sh","mode":"100755","type":"blob","sha":"8982bb1b08906a978451e762f440b0267e80f492","size":634,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/8982bb1b08906a978451e762f440b0267e80f492"},{"path":"scripts/check-release-needed.mjs","mode":"100644","type":"blob","sha":"e2648f27ea2f1b87772f59f57de71b93adc336eb","size":3903,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/e2648f27ea2f1b87772f59f57de71b93adc336eb"},{"path":"scripts/check-version.mjs","mode":"100644","type":"blob","sha":"84d100bffc3d2c5385fa5417fd35901340e29ea9","size":3737,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/84d100bffc3d2c5385fa5417fd35901340e29ea9"},{"path":"scripts/check-web-archive.mjs","mode":"100644","type":"blob","sha":"2b8244d7d76d56d9acdf88b4ea766e35c554b1fe","size":8314,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/2b8244d7d76d56d9acdf88b4ea766e35c554b1fe"},{"path":"scripts/create-github-release.mjs","mode":"100644","type":"blob","sha":"3ad36d37845fdf63c24922004828426bb00e55a0","size":6136,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/3ad36d37845fdf63c24922004828426bb00e55a0"},{"path":"scripts/create-manual-changeset.mjs","mode":"100644","type":"blob","sha":"ca5678f1f112ffebec87b9be2937714a24bf1c69","size":3303,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/ca5678f1f112ffebec87b9be2937714a24bf1c69"},{"path":"scripts/detect-code-changes.mjs","mode":"100644","type":"blob","sha":"eff9c121f2e1e9366a3c72fa83428585bc08262a","size":4899,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/eff9c121f2e1e9366a3c72fa83428585bc08262a"},{"path":"scripts/format-github-release.mjs","mode":"100644","type":"blob","sha":"a7dbadb1630b314214cc7303c59f930e73cdf56f","size":3234,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/a7dbadb1630b314214cc7303c59f930e73cdf56f"},{"path":"scripts/format-release-notes-helpers.mjs","mode":"100644","type":"blob","sha":"f182524fc82d65649e8d9f34b96755bfe3d89692","size":974,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/f182524fc82d65649e8d9f34b96755bfe3d89692"},{"path":"scripts/format-release-notes.mjs","mode":"100644","type":"blob","sha":"94bd93adea40dc31aeb9532cdf5bf48c899c603a","size":8516,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/94bd93adea40dc31aeb9532cdf5bf48c899c603a"},{"path":"scripts/instant-version-bump.mjs","mode":"100644","type":"blob","sha":"da259fa8e32062408f564c3e35ae5e53ed20226a","size":5925,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/da259fa8e32062408f564c3e35ae5e53ed20226a"},{"path":"scripts/js-paths.mjs","mode":"100644","type":"blob","sha":"2f2534516b91aee79a6de039d15dfb21d5445dc4","size":5696,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/2f2534516b91aee79a6de039d15dfb21d5445dc4"},{"path":"scripts/merge-changesets.mjs","mode":"100644","type":"blob","sha":"4a64b19a20ab8369b2070809a3f7764e045f8365","size":6734,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/4a64b19a20ab8369b2070809a3f7764e045f8365"},{"path":"scripts/package-info.mjs","mode":"100644","type":"blob","sha":"cd096705e28a95c0737c361af2a312cc47f57797","size":2556,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/cd096705e28a95c0737c361af2a312cc47f57797"},{"path":"scripts/publish-to-npm.mjs","mode":"100644","type":"blob","sha":"264b78f94e88ca567c6fde8d15bb541e3652d3b0","size":9995,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/264b78f94e88ca567c6fde8d15bb541e3652d3b0"},{"path":"scripts/setup-npm.mjs","mode":"100644","type":"blob","sha":"2a8cb884279d89b5858244b939b03363c5806fb9","size":7774,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/2a8cb884279d89b5858244b939b03363c5806fb9"},{"path":"scripts/simulate-fresh-merge.sh","mode":"100755","type":"blob","sha":"6af7c6a77cd96b8b757a848ec5ced4834dd0d959","size":2007,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/6af7c6a77cd96b8b757a848ec5ced4834dd0d959"},{"path":"scripts/validate-changeset.mjs","mode":"100644","type":"blob","sha":"7d942f5a40114febb80db22ae00332721c4e16bf","size":8805,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/7d942f5a40114febb80db22ae00332721c4e16bf"},{"path":"scripts/version-and-commit.mjs","mode":"100644","type":"blob","sha":"0f63bc2ca83be245a6069fb505743de74b72b29f","size":9584,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/0f63bc2ca83be245a6069fb505743de74b72b29f"},{"path":"scripts/wait-for-npm.mjs","mode":"100644","type":"blob","sha":"0155e6850e06c5aa7c234e276e9e52da3bbe975e","size":4932,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/0155e6850e06c5aa7c234e276e9e52da3bbe975e"},{"path":"src","mode":"040000","type":"tree","sha":"2821810705ff1808b6fc000ba8e52fec62e640c0","url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/trees/2821810705ff1808b6fc000ba8e52fec62e640c0"},{"path":"src/index.d.ts","mode":"100644","type":"blob","sha":"658cd82a79657e0ec6727a883d8953d87f3fbe6f","size":651,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/658cd82a79657e0ec6727a883d8953d87f3fbe6f"},{"path":"src/index.js","mode":"100644","type":"blob","sha":"22705fde8c7f091053953d6015a8fc4503f5aecf","size":694,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/22705fde8c7f091053953d6015a8fc4503f5aecf"},{"path":"tests","mode":"040000","type":"tree","sha":"4dc9a7ad7ed7055e364ab417e42b7657913007e2","url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/trees/4dc9a7ad7ed7055e364ab417e42b7657913007e2"},{"path":"tests/check-file-line-limits.test.js","mode":"100644","type":"blob","sha":"c939c46f1fac26fdc8633a81166a244a82f40f69","size":4176,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/c939c46f1fac26fdc8633a81166a244a82f40f69"},{"path":"tests/ci-timeouts.test.js","mode":"100644","type":"blob","sha":"03021d3630dbf3f5ac8315a592e5c49ddbf7262b","size":3150,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/03021d3630dbf3f5ac8315a592e5c49ddbf7262b"},{"path":"tests/create-github-release.test.js","mode":"100644","type":"blob","sha":"570b2edb89f5917bd6db2ad2bf3c2bf67e47ba3c","size":10044,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/570b2edb89f5917bd6db2ad2bf3c2bf67e47ba3c"},{"path":"tests/docker-publish.test.js","mode":"100644","type":"blob","sha":"b97592ecbd94855e540bae880ebb8a0b17b96cb8","size":5552,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/b97592ecbd94855e540bae880ebb8a0b17b96cb8"},{"path":"tests/index.test.js","mode":"100644","type":"blob","sha":"15fbcb6e7506b227036495a1b0cb4cf44d142bb4","size":783,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/15fbcb6e7506b227036495a1b0cb4cf44d142bb4"},{"path":"tests/package-info.test.js","mode":"100644","type":"blob","sha":"f4b79428da2c2282d6682ca91b3fcf2414bb950a","size":1918,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/f4b79428da2c2282d6682ca91b3fcf2414bb950a"},{"path":"tests/package-metadata.test.js","mode":"100644","type":"blob","sha":"3757514159fbd93880d307fcbd5860c355a0a614","size":2623,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/3757514159fbd93880d307fcbd5860c355a0a614"},{"path":"tests/release-badge.test.js","mode":"100644","type":"blob","sha":"e97b25dddfbfb1657586eda781bfe3a8fcc56c4e","size":1768,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/e97b25dddfbfb1657586eda781bfe3a8fcc56c4e"},{"path":"tests/setup-npm.test.js","mode":"100644","type":"blob","sha":"fb821ffe2a3bba79a414cc745ad72ee1e1d8c224","size":1790,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/fb821ffe2a3bba79a414cc745ad72ee1e1d8c224"},{"path":"tests/tag-prefix.test.js","mode":"100644","type":"blob","sha":"4eed81efdf8acdf1dd137e0764ce49a2238ee354","size":994,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/4eed81efdf8acdf1dd137e0764ce49a2238ee354"},{"path":"tests/universal-app.test.js","mode":"100644","type":"blob","sha":"33ca39c7af273fdf32921391e10b9bc94838d86b","size":4456,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/33ca39c7af273fdf32921391e10b9bc94838d86b"}],"truncated":false} \ No newline at end of file diff --git a/docs/case-studies/issue-82/evidence/template-js-workflows.json b/docs/case-studies/issue-82/evidence/template-js-workflows.json new file mode 100644 index 0000000..6a19510 --- /dev/null +++ b/docs/case-studies/issue-82/evidence/template-js-workflows.json @@ -0,0 +1 @@ +[{"name":"example-app.yml","path":".github/workflows/example-app.yml","sha":"6a81458c243c45295aebb5b0915b85a42d08f12f","size":5372,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/contents/.github/workflows/example-app.yml?ref=main","html_url":"https://github.com/link-foundation/js-ai-driven-development-pipeline-template/blob/main/.github/workflows/example-app.yml","git_url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/6a81458c243c45295aebb5b0915b85a42d08f12f","download_url":"https://raw.githubusercontent.com/link-foundation/js-ai-driven-development-pipeline-template/main/.github/workflows/example-app.yml","type":"file","_links":{"self":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/contents/.github/workflows/example-app.yml?ref=main","git":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/6a81458c243c45295aebb5b0915b85a42d08f12f","html":"https://github.com/link-foundation/js-ai-driven-development-pipeline-template/blob/main/.github/workflows/example-app.yml"}},{"name":"links.yml","path":".github/workflows/links.yml","sha":"3e910dce849396a942ca83b0f8ce5b5e91ace0e0","size":3197,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/contents/.github/workflows/links.yml?ref=main","html_url":"https://github.com/link-foundation/js-ai-driven-development-pipeline-template/blob/main/.github/workflows/links.yml","git_url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/3e910dce849396a942ca83b0f8ce5b5e91ace0e0","download_url":"https://raw.githubusercontent.com/link-foundation/js-ai-driven-development-pipeline-template/main/.github/workflows/links.yml","type":"file","_links":{"self":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/contents/.github/workflows/links.yml?ref=main","git":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/3e910dce849396a942ca83b0f8ce5b5e91ace0e0","html":"https://github.com/link-foundation/js-ai-driven-development-pipeline-template/blob/main/.github/workflows/links.yml"}},{"name":"release.yml","path":".github/workflows/release.yml","sha":"0facf849bd97ec6796be0fbf1362fba3a3aaf79a","size":23017,"url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/contents/.github/workflows/release.yml?ref=main","html_url":"https://github.com/link-foundation/js-ai-driven-development-pipeline-template/blob/main/.github/workflows/release.yml","git_url":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/0facf849bd97ec6796be0fbf1362fba3a3aaf79a","download_url":"https://raw.githubusercontent.com/link-foundation/js-ai-driven-development-pipeline-template/main/.github/workflows/release.yml","type":"file","_links":{"self":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/contents/.github/workflows/release.yml?ref=main","git":"https://api.github.com/repos/link-foundation/js-ai-driven-development-pipeline-template/git/blobs/0facf849bd97ec6796be0fbf1362fba3a3aaf79a","html":"https://github.com/link-foundation/js-ai-driven-development-pipeline-template/blob/main/.github/workflows/release.yml"}}] \ No newline at end of file diff --git a/docs/case-studies/issue-82/evidence/template-rust-file-tree.json b/docs/case-studies/issue-82/evidence/template-rust-file-tree.json new file mode 100644 index 0000000..7c08182 --- /dev/null +++ b/docs/case-studies/issue-82/evidence/template-rust-file-tree.json @@ -0,0 +1 @@ +{"sha":"401cdd7af90d04435917fb9bd529410bb1670f9a","url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/trees/401cdd7af90d04435917fb9bd529410bb1670f9a","tree":[{"path":".github","mode":"040000","type":"tree","sha":"8a0bf060a799d7193245d2b89d0c18c6b043f469","url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/trees/8a0bf060a799d7193245d2b89d0c18c6b043f469"},{"path":".github/workflows","mode":"040000","type":"tree","sha":"259ba71ad1955a1b8dc395a15b1b2cb22459522a","url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/trees/259ba71ad1955a1b8dc395a15b1b2cb22459522a"},{"path":".github/workflows/release.yml","mode":"100644","type":"blob","sha":"885eb018d8a46298a78ea6dfa42103f7591f6505","size":23449,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/885eb018d8a46298a78ea6dfa42103f7591f6505"},{"path":".gitignore","mode":"100644","type":"blob","sha":"286351608df6c3dd74111b33af1549f9369b612b","size":859,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/286351608df6c3dd74111b33af1549f9369b612b"},{"path":".pre-commit-config.yaml","mode":"100644","type":"blob","sha":"ce4da867928025dcef4769c2d9f480a58c4e5aed","size":836,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/ce4da867928025dcef4769c2d9f480a58c4e5aed"},{"path":"CHANGELOG.md","mode":"100644","type":"blob","sha":"6e9a9ecf8980447d483370f8a9d16db94307440e","size":96926,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/6e9a9ecf8980447d483370f8a9d16db94307440e"},{"path":"CONTRIBUTING.md","mode":"100644","type":"blob","sha":"96300ba39e8a34e4c552db612a65ca7318f1c21d","size":7550,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/96300ba39e8a34e4c552db612a65ca7318f1c21d"},{"path":"Cargo.lock","mode":"100644","type":"blob","sha":"9fb1af04519464ce6026abf43d8f8f05adeed75e","size":9549,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/9fb1af04519464ce6026abf43d8f8f05adeed75e"},{"path":"Cargo.toml","mode":"100644","type":"blob","sha":"3e14df246143ef14e4d523540f726b84b82c7851","size":1257,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/3e14df246143ef14e4d523540f726b84b82c7851"},{"path":"LICENSE","mode":"100644","type":"blob","sha":"fdddb29aa445bf3d6a5d843d6dd77e10a9f99657","size":1211,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/fdddb29aa445bf3d6a5d843d6dd77e10a9f99657"},{"path":"README.md","mode":"100644","type":"blob","sha":"4f0ef71f231d61991714b0521288c1af639cb749","size":13585,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/4f0ef71f231d61991714b0521288c1af639cb749"},{"path":"changelog.d","mode":"040000","type":"tree","sha":"c523fbb7a086569384b3d2ab63e912f2dc381341","url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/trees/c523fbb7a086569384b3d2ab63e912f2dc381341"},{"path":"changelog.d/20251227_224645_changeset_support.md","mode":"100644","type":"blob","sha":"c25cd3f50e15bb8ccffb861550ceb75b1aecd9a6","size":608,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/c25cd3f50e15bb8ccffb861550ceb75b1aecd9a6"},{"path":"changelog.d/20251229_143823_fix_ci_workflow_dependencies.md","mode":"100644","type":"blob","sha":"2667f49968a660dfc73552f6319c77d511baf3bc","size":432,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/2667f49968a660dfc73552f6319c77d511baf3bc"},{"path":"changelog.d/20251231_115800_fix_readme_script_references.md","mode":"100644","type":"blob","sha":"7337c49f3c155911b752dbe40db4fc74170abf08","size":286,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/7337c49f3c155911b752dbe40db4fc74170abf08"},{"path":"changelog.d/20260107_apply_best_practices.md","mode":"100644","type":"blob","sha":"a2d856358c41413e7d3ca32ea13d27f5e1ea7438","size":830,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/a2d856358c41413e7d3ca32ea13d27f5e1ea7438"},{"path":"changelog.d/20260108_171124_fix_changelog_check.md","mode":"100644","type":"blob","sha":"56d16879e9d14ab21b824e2f0c646f266825fe9d","size":857,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/56d16879e9d14ab21b824e2f0c646f266825fe9d"},{"path":"changelog.d/20260108_171435_prevent_manual_version_modification.md","mode":"100644","type":"blob","sha":"132467f8dc02a84fe9d9be0a7b12652289fbf071","size":455,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/132467f8dc02a84fe9d9be0a7b12652289fbf071"},{"path":"changelog.d/20260108_apply_lino_objects_codec_fixes.md","mode":"100644","type":"blob","sha":"c1ac23bbe4a3e28afe5e89db84be08af527bd13c","size":497,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/c1ac23bbe4a3e28afe5e89db84be08af527bd13c"},{"path":"changelog.d/20260111_multi_language_support.md","mode":"100644","type":"blob","sha":"6c8f81dd63d80f9ec9056cd32c06a14b1062e8ca","size":694,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/6c8f81dd63d80f9ec9056cd32c06a14b1062e8ca"},{"path":"changelog.d/20260119_best_practices_from_browser_commander.md","mode":"100644","type":"blob","sha":"b4bca1d666f008de6afd345ef7df20cbdc2ec3ee","size":1137,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/b4bca1d666f008de6afd345ef7df20cbdc2ec3ee"},{"path":"changelog.d/20260311_translate_scripts_to_rust.md","mode":"100644","type":"blob","sha":"4df7c4ac4b9ef39ed6033827004c0a0948dd6a15","size":383,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/4df7c4ac4b9ef39ed6033827004c0a0948dd6a15"},{"path":"changelog.d/20260413-ci-cd-best-practices.md","mode":"100644","type":"blob","sha":"65a108f11bbd760b185cf033355ac67b3e081cd0","size":1052,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/65a108f11bbd760b185cf033355ac67b3e081cd0"},{"path":"changelog.d/20260413_fix_cargo_token_fallback.md","mode":"100644","type":"blob","sha":"87ca39c76b53118ab39b7bc8ae87af7721320cc1","size":474,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/87ca39c76b53118ab39b7bc8ae87af7721320cc1"},{"path":"changelog.d/20260413_fix_crates_io_check.md","mode":"100644","type":"blob","sha":"9fd4fefc6a834598cb90b013e7c040c6287d00d6","size":658,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/9fd4fefc6a834598cb90b013e7c040c6287d00d6"},{"path":"changelog.d/20260413_fix_lookahead_regex.md","mode":"100644","type":"blob","sha":"f5011def0a986e6ca16675c9b91b2561f4a432dc","size":742,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/f5011def0a986e6ca16675c9b91b2561f4a432dc"},{"path":"changelog.d/20260414_fix_per_commit_diff.md","mode":"100644","type":"blob","sha":"c1a11c1eb2f728a01adf96bf5031d54c34c4b0f0","size":231,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/c1a11c1eb2f728a01adf96bf5031d54c34c4b0f0"},{"path":"changelog.d/20260415_fix_workspace_release_scripts.md","mode":"100644","type":"blob","sha":"5db05492683268ff46133e5dff7d8c0dd9da8934","size":130,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/5db05492683268ff46133e5dff7d8c0dd9da8934"},{"path":"changelog.d/20260501_decouple_docs_deploy.md","mode":"100644","type":"blob","sha":"6b7692807e0b5b3496032c4af65df4aeb9018965","size":186,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/6b7692807e0b5b3496032c4af65df4aeb9018965"},{"path":"changelog.d/20260503_111500_ci_timeouts.md","mode":"100644","type":"blob","sha":"05d08498122f62fb5e0234e4311d31be516b348e","size":121,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/05d08498122f62fb5e0234e4311d31be516b348e"},{"path":"changelog.d/20260503_111700_file_size_warning_threshold.md","mode":"100644","type":"blob","sha":"cc99b1930009100ed8996c77cba21ad80989265d","size":167,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/cc99b1930009100ed8996c77cba21ad80989265d"},{"path":"changelog.d/20260509_031015_human_readable_release_titles.md","mode":"100644","type":"blob","sha":"4615bd63260247f53f1700e8b1e80f98ede2503a","size":129,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/4615bd63260247f53f1700e8b1e80f98ede2503a"},{"path":"changelog.d/20260509_205000_docker_hub_release_publishing.md","mode":"100644","type":"blob","sha":"193993ed946a3c7ca42018a72a0c873ba0fe672a","size":365,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/193993ed946a3c7ca42018a72a0c873ba0fe672a"},{"path":"changelog.d/20260512_172908_github_pages_artifact_deploy.md","mode":"100644","type":"blob","sha":"6ba258c49c111f57371a7ae7b3779f898bcafcd8","size":220,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/6ba258c49c111f57371a7ae7b3779f898bcafcd8"},{"path":"changelog.d/README.md","mode":"100644","type":"blob","sha":"b3437e321d87768eb8a7ab42943d5d1ca4968f74","size":3235,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/b3437e321d87768eb8a7ab42943d5d1ca4968f74"},{"path":"docs","mode":"040000","type":"tree","sha":"b333a51690091849578cc7a8d0cdcfba9e80ed86","url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/trees/b333a51690091849578cc7a8d0cdcfba9e80ed86"},{"path":"docs/case-studies","mode":"040000","type":"tree","sha":"2c971ff0192e2d133dc41fbc86d90d641d623e76","url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/trees/2c971ff0192e2d133dc41fbc86d90d641d623e76"},{"path":"docs/case-studies/issue-11","mode":"040000","type":"tree","sha":"6fbae06a4dae4e1a83540b01d75db18f4210ccd6","url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/trees/6fbae06a4dae4e1a83540b01d75db18f4210ccd6"},{"path":"docs/case-studies/issue-11/README.md","mode":"100644","type":"blob","sha":"b5ab5bbb85503311eb336181e7d9fd4505453cf3","size":8907,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/b5ab5bbb85503311eb336181e7d9fd4505453cf3"},{"path":"docs/case-studies/issue-11/analysis-crates-io.md","mode":"100644","type":"blob","sha":"024cd600ef1d15e43abb9a5384223246772fc246","size":6801,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/024cd600ef1d15e43abb9a5384223246772fc246"},{"path":"docs/case-studies/issue-11/analysis-set-output.md","mode":"100644","type":"blob","sha":"a9efdcb8e3e978e1578a7ee9d451a09d1885c4be","size":4331,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/a9efdcb8e3e978e1578a7ee9d451a09d1885c4be"},{"path":"docs/case-studies/issue-11/analysis-workflow-dispatch.md","mode":"100644","type":"blob","sha":"9ebd84b350473d7ac0f608f012b452a539d2c952","size":5375,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/9ebd84b350473d7ac0f608f012b452a539d2c952"},{"path":"docs/case-studies/issue-11/online-research.md","mode":"100644","type":"blob","sha":"e3e9e559634729b2aec17c11ee39d036a40bd922","size":6372,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/e3e9e559634729b2aec17c11ee39d036a40bd922"},{"path":"docs/case-studies/issue-17","mode":"040000","type":"tree","sha":"aad724267a03679e8ffacb3124419ecfdfae33d8","url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/trees/aad724267a03679e8ffacb3124419ecfdfae33d8"},{"path":"docs/case-studies/issue-17/README.md","mode":"100644","type":"blob","sha":"15efc07ca23a9f151c3c5477e773905f39418f9b","size":5870,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/15efc07ca23a9f151c3c5477e773905f39418f9b"},{"path":"docs/case-studies/issue-19","mode":"040000","type":"tree","sha":"cdca87eb853443d107b4b3e041e3b50e1a45b801","url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/trees/cdca87eb853443d107b4b3e041e3b50e1a45b801"},{"path":"docs/case-studies/issue-19/README.md","mode":"100644","type":"blob","sha":"7374ddd74cdcfcd00f5bce7c268587719d4e71fa","size":10930,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/7374ddd74cdcfcd00f5bce7c268587719d4e71fa"},{"path":"docs/case-studies/issue-19/ci-logs","mode":"040000","type":"tree","sha":"d4cc5eba4781540b4c41fcfc16be2e57ab4b79a1","url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/trees/d4cc5eba4781540b4c41fcfc16be2e57ab4b79a1"},{"path":"docs/case-studies/issue-19/ci-logs/ci-run-20885464993.log.gz","mode":"100644","type":"blob","sha":"6c166e69fa2be24b1a29196e5c9da17454e9db42","size":20042,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/6c166e69fa2be24b1a29196e5c9da17454e9db42"},{"path":"docs/case-studies/issue-19/pr-114-data","mode":"040000","type":"tree","sha":"2835b1d1894bb45742f72148aab6af268cdea777","url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/trees/2835b1d1894bb45742f72148aab6af268cdea777"},{"path":"docs/case-studies/issue-19/pr-114-data/issue-113-details.txt","mode":"100644","type":"blob","sha":"157d5bd29fcd9f80e4b97c98308f90fbf9c0b4a3","size":708,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/157d5bd29fcd9f80e4b97c98308f90fbf9c0b4a3"},{"path":"docs/case-studies/issue-19/pr-114-data/pr-commits.json","mode":"100644","type":"blob","sha":"a2801784966fabf146d0b96d743a9c60592e8710","size":3550,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/a2801784966fabf146d0b96d743a9c60592e8710"},{"path":"docs/case-studies/issue-19/pr-114-data/pr-conversation-comments.json","mode":"100644","type":"blob","sha":"cf016694029137ad3d281e33f8fb6177dd390aa5","size":8310,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/cf016694029137ad3d281e33f8fb6177dd390aa5"},{"path":"docs/case-studies/issue-19/pr-114-data/pr-details.json","mode":"100644","type":"blob","sha":"b25c430f066566fc3112b56c509e7ef70cc5453c","size":6727,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/b25c430f066566fc3112b56c509e7ef70cc5453c"},{"path":"docs/case-studies/issue-19/pr-114-data/pr-diff.patch","mode":"100644","type":"blob","sha":"33f28bdfa6ba98300f0a4ffb3335c6a36862b298","size":31790,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/33f28bdfa6ba98300f0a4ffb3335c6a36862b298"},{"path":"docs/case-studies/issue-19/pr-114-data/pr-review-comments.json","mode":"100644","type":"blob","sha":"0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc","size":2,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc"},{"path":"docs/case-studies/issue-19/pr-114-data/pr-reviews.json","mode":"100644","type":"blob","sha":"0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc","size":2,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc"},{"path":"docs/case-studies/issue-19/pr-114-data/solution-draft-log-1.txt.gz","mode":"100644","type":"blob","sha":"a7a5d631c9dfb75cd776a457ffbd97593c9c58c2","size":89348,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/a7a5d631c9dfb75cd776a457ffbd97593c9c58c2"},{"path":"docs/case-studies/issue-19/pr-114-data/solution-draft-log-2.txt.gz","mode":"100644","type":"blob","sha":"49262ff5ad0490f1c8f67dd2c885d69975b5950d","size":69878,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/49262ff5ad0490f1c8f67dd2c885d69975b5950d"},{"path":"docs/case-studies/issue-21","mode":"040000","type":"tree","sha":"a4a636dae23000abc6232931f8018199a2d08e66","url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/trees/a4a636dae23000abc6232931f8018199a2d08e66"},{"path":"docs/case-studies/issue-21/README.md","mode":"100644","type":"blob","sha":"c40aa5d96686a9b49d20963fc6c66e79c2fc4840","size":9651,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/c40aa5d96686a9b49d20963fc6c66e79c2fc4840"},{"path":"docs/case-studies/issue-21/browser-commander-issue-27.md","mode":"100644","type":"blob","sha":"29c1e3ab6250027c30c4e443002a563d0bf5fc44","size":3766,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/29c1e3ab6250027c30c4e443002a563d0bf5fc44"},{"path":"docs/case-studies/issue-21/browser-commander-issue-29.md","mode":"100644","type":"blob","sha":"6fcae8cdc9a23a5ecb263a0c1330d199d72e473f","size":5448,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/6fcae8cdc9a23a5ecb263a0c1330d199d72e473f"},{"path":"docs/case-studies/issue-21/browser-commander-issue-31.md","mode":"100644","type":"blob","sha":"829c1441ef8e4e962013f409653d6a0b33995722","size":4224,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/829c1441ef8e4e962013f409653d6a0b33995722"},{"path":"docs/case-studies/issue-21/browser-commander-issue-33.md","mode":"100644","type":"blob","sha":"a3ec042b03e2fe3b90eae029fe03546327e531d8","size":6909,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/a3ec042b03e2fe3b90eae029fe03546327e531d8"},{"path":"docs/case-studies/issue-21/browser-commander-rust.yml","mode":"100644","type":"blob","sha":"57661e0231d725a7564578ef3b61ab7fe9349e5f","size":14865,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/57661e0231d725a7564578ef3b61ab7fe9349e5f"},{"path":"docs/case-studies/issue-25","mode":"040000","type":"tree","sha":"a048ad4bfec83550f05dfd3d6eecf8fa95a61cd6","url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/trees/a048ad4bfec83550f05dfd3d6eecf8fa95a61cd6"},{"path":"docs/case-studies/issue-25/README.md","mode":"100644","type":"blob","sha":"09a520e6418009da786c05210280f51a6853071b","size":4724,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/09a520e6418009da786c05210280f51a6853071b"},{"path":"docs/case-studies/issue-29","mode":"040000","type":"tree","sha":"f40a9f5cd044a5133c0501ee85549b3628848c88","url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/trees/f40a9f5cd044a5133c0501ee85549b3628848c88"},{"path":"docs/case-studies/issue-29/README.md","mode":"100644","type":"blob","sha":"b09746912b1bbb1433cdff345bbadd82bf63f167","size":6614,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/b09746912b1bbb1433cdff345bbadd82bf63f167"},{"path":"docs/case-studies/issue-32","mode":"040000","type":"tree","sha":"ca29ebcfb86c3a59593abacccb3bca3213bda227","url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/trees/ca29ebcfb86c3a59593abacccb3bca3213bda227"},{"path":"docs/case-studies/issue-32/README.md","mode":"100644","type":"blob","sha":"7f145043605f4b031223e86a26a046e18beea366","size":5520,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/7f145043605f4b031223e86a26a046e18beea366"},{"path":"docs/case-studies/issue-34","mode":"040000","type":"tree","sha":"62e2e40ac4349d6d52e5f409f1064de687f5883a","url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/trees/62e2e40ac4349d6d52e5f409f1064de687f5883a"},{"path":"docs/case-studies/issue-34/README.md","mode":"100644","type":"blob","sha":"19033efc28b660cd278a1ecd25604df6aaa2d2f5","size":7573,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/19033efc28b660cd278a1ecd25604df6aaa2d2f5"},{"path":"docs/case-studies/issue-38","mode":"040000","type":"tree","sha":"b988b5cb25351472ffb22f1ab9d1a6aea6b73955","url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/trees/b988b5cb25351472ffb22f1ab9d1a6aea6b73955"},{"path":"docs/case-studies/issue-38/README.md","mode":"100644","type":"blob","sha":"ee4cb2ac55722cd2ef6d26617acee67ae9666d1f","size":10260,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/ee4cb2ac55722cd2ef6d26617acee67ae9666d1f"},{"path":"docs/case-studies/issue-38/raw-data","mode":"040000","type":"tree","sha":"4db9a94e6fd1842b33dc2978bd3e50c2d4cc86dc","url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/trees/4db9a94e6fd1842b33dc2978bd3e50c2d4cc86dc"},{"path":"docs/case-studies/issue-38/raw-data/downstream-meta-after-run-24985948212.json","mode":"100644","type":"blob","sha":"209d9e25eafe1983b3bc8f5ca8918432620cc272","size":19101,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/209d9e25eafe1983b3bc8f5ca8918432620cc272"},{"path":"docs/case-studies/issue-38/raw-data/downstream-meta-after-run-24985948212.log.gz","mode":"100644","type":"blob","sha":"9ad8a22a9994fb8514f1e8d8497cd8f8af424590","size":106114,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/9ad8a22a9994fb8514f1e8d8497cd8f8af424590"},{"path":"docs/case-studies/issue-38/raw-data/downstream-meta-before-run-24983875003.json","mode":"100644","type":"blob","sha":"4d96d47cb6829ca820991adb8d340ad4c2327a23","size":18003,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/4d96d47cb6829ca820991adb8d340ad4c2327a23"},{"path":"docs/case-studies/issue-38/raw-data/downstream-meta-before-run-24983875003.log.gz","mode":"100644","type":"blob","sha":"b97a011f2c745cde8826e0c3b61b9e6305ae07c1","size":116384,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/b97a011f2c745cde8826e0c3b61b9e6305ae07c1"},{"path":"docs/case-studies/issue-38/raw-data/downstream-meta-ontology-issue-3.json","mode":"100644","type":"blob","sha":"17d78f5f4eacf2afd581ea564ee81ceb8940a40e","size":2010,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/17d78f5f4eacf2afd581ea564ee81ceb8940a40e"},{"path":"docs/case-studies/issue-38/raw-data/downstream-meta-ontology-pr-4.json","mode":"100644","type":"blob","sha":"281cc7e954c717275cb7cf99933e4978687385bc","size":5352,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/281cc7e954c717275cb7cf99933e4978687385bc"},{"path":"docs/case-studies/issue-38/raw-data/issue-38-comments.json","mode":"100644","type":"blob","sha":"48ae41eb529138051a32376a5b8f1c5cec68f818","size":3487,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/48ae41eb529138051a32376a5b8f1c5cec68f818"},{"path":"docs/case-studies/issue-38/raw-data/issue-38.json","mode":"100644","type":"blob","sha":"1e0884882204e6aced0020e6c4dd08af5f9ec18f","size":4414,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/1e0884882204e6aced0020e6c4dd08af5f9ec18f"},{"path":"docs/case-studies/issue-38/raw-data/js-template-issue-search.json","mode":"100644","type":"blob","sha":"fe51488c7066f6687ef680d6bfaa4f7768ef205c","size":3,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/fe51488c7066f6687ef680d6bfaa4f7768ef205c"},{"path":"docs/case-studies/issue-38/raw-data/main-run-24465255225.json","mode":"100644","type":"blob","sha":"09127279e57ef8d57f08ff24a2ffcaaacbbf025a","size":16733,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/09127279e57ef8d57f08ff24a2ffcaaacbbf025a"},{"path":"docs/case-studies/issue-38/raw-data/main-run-24465255225.log.gz","mode":"100644","type":"blob","sha":"5abf2592c57f21a5fb30eb2ba1372653fca772e2","size":89367,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/5abf2592c57f21a5fb30eb2ba1372653fca772e2"},{"path":"docs/case-studies/issue-38/raw-data/main-runs.json","mode":"100644","type":"blob","sha":"0a153a2d3b42eb63d4638794e65b899678c48dab","size":3872,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/0a153a2d3b42eb63d4638794e65b899678c48dab"},{"path":"docs/case-studies/issue-38/raw-data/pr-39-conversation-comments.json","mode":"100644","type":"blob","sha":"0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc","size":2,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc"},{"path":"docs/case-studies/issue-38/raw-data/pr-39-review-comments.json","mode":"100644","type":"blob","sha":"0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc","size":2,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc"},{"path":"docs/case-studies/issue-38/raw-data/pr-39-reviews.json","mode":"100644","type":"blob","sha":"0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc","size":2,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/0637a088a01e8ddab3bf3fa98dbe804cbde1a0dc"},{"path":"docs/case-studies/issue-38/raw-data/pr-39.json","mode":"100644","type":"blob","sha":"2e9908e82f9a3b57e5de45d406ba1e66281bcc8b","size":964,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/2e9908e82f9a3b57e5de45d406ba1e66281bcc8b"},{"path":"docs/case-studies/issue-38/raw-data/pr-branch-runs.json","mode":"100644","type":"blob","sha":"32383fec8592fcf2ebf671a9e88314940ceeecfd","size":396,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/32383fec8592fcf2ebf671a9e88314940ceeecfd"},{"path":"docs/case-studies/issue-38/raw-data/pr-run-25212295127.json","mode":"100644","type":"blob","sha":"69f226d68dba2e467b7d15528f4286a470fd54b5","size":10861,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/69f226d68dba2e467b7d15528f4286a470fd54b5"},{"path":"docs/case-studies/issue-38/raw-data/pr-run-25212295127.log.gz","mode":"100644","type":"blob","sha":"b83c2f71a145fe6e4e95c2d5fec992b1d9ccaf87","size":72323,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/b83c2f71a145fe6e4e95c2d5fec992b1d9ccaf87"},{"path":"docs/case-studies/issue-38/raw-data/rust-template-issue-search.json","mode":"100644","type":"blob","sha":"cc8a938ca1b825dd757a5acad7871d4d10850ff6","size":276,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/cc8a938ca1b825dd757a5acad7871d4d10850ff6"},{"path":"docs/case-studies/issue-38/template-data","mode":"040000","type":"tree","sha":"c3dcb75593d8409564e663b5f2004731719cdf41","url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/trees/c3dcb75593d8409564e663b5f2004731719cdf41"},{"path":"docs/case-studies/issue-38/template-data/js-template-ci-tree.txt","mode":"100644","type":"blob","sha":"371d093f1b8416613e32a4d059f7e6a2fe65276f","size":1719,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/371d093f1b8416613e32a4d059f7e6a2fe65276f"},{"path":"docs/case-studies/issue-38/template-data/js-template-links.yml","mode":"100644","type":"blob","sha":"3b7271b1a82aaf42c0c99aae87faede8f623c87f","size":3035,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/3b7271b1a82aaf42c0c99aae87faede8f623c87f"},{"path":"docs/case-studies/issue-38/template-data/js-template-release.yml","mode":"100644","type":"blob","sha":"7090eb5402bbe81fdda60c8a16e991cf33b22842","size":19369,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/7090eb5402bbe81fdda60c8a16e991cf33b22842"},{"path":"docs/case-studies/issue-38/template-data/rust-template-ci-tree.txt","mode":"100644","type":"blob","sha":"bcabbb200fab940c8472fce393c20573a2619a3b","size":464,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/bcabbb200fab940c8472fce393c20573a2619a3b"},{"path":"docs/case-studies/issue-38/template-data/rust-template-release-after.yml","mode":"100644","type":"blob","sha":"1bc4e06dd6560721361bd5883d99321c9a23704f","size":16624,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/1bc4e06dd6560721361bd5883d99321c9a23704f"},{"path":"docs/case-studies/issue-38/template-data/rust-template-release-before.yml","mode":"100644","type":"blob","sha":"e8b6fb77030f59ecbb748c3e98c2d1cdeba0e079","size":16372,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/e8b6fb77030f59ecbb748c3e98c2d1cdeba0e079"},{"path":"docs/ci-cd","mode":"040000","type":"tree","sha":"aa8a72b360fca75a1908896477d82c90ce9c155b","url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/trees/aa8a72b360fca75a1908896477d82c90ce9c155b"},{"path":"docs/ci-cd/troubleshooting.md","mode":"100644","type":"blob","sha":"b38e5dd7e629121546c47d7b5628e62cc2c0ebac","size":7994,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/b38e5dd7e629121546c47d7b5628e62cc2c0ebac"},{"path":"examples","mode":"040000","type":"tree","sha":"5bc4b2f0ddedb1ccf752d6824e9c207445827022","url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/trees/5bc4b2f0ddedb1ccf752d6824e9c207445827022"},{"path":"examples/basic_usage.rs","mode":"100644","type":"blob","sha":"be9a37ff13abba31b59376b0400db983a21d6da5","size":183,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/be9a37ff13abba31b59376b0400db983a21d6da5"},{"path":"experiments","mode":"040000","type":"tree","sha":"9d74d9926248fd8f13d7308b1314f80a2e737b5e","url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/trees/9d74d9926248fd8f13d7308b1314f80a2e737b5e"},{"path":"experiments/test-changelog-parsing.rs","mode":"100644","type":"blob","sha":"bf19a4571ee8554eb3faeb7c04f828981b907c30","size":3100,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/bf19a4571ee8554eb3faeb7c04f828981b907c30"},{"path":"experiments/test-crates-io-check.rs","mode":"100644","type":"blob","sha":"0741c6f066b24cf0c23a519ed366a81b7038a002","size":2946,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/0741c6f066b24cf0c23a519ed366a81b7038a002"},{"path":"experiments/test-detect-code-changes.sh","mode":"100644","type":"blob","sha":"b63302f0abaa763b12957b2f5005b6e367a74505","size":3146,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/b63302f0abaa763b12957b2f5005b6e367a74505"},{"path":"experiments/test-version-check-dependencies.sh","mode":"100755","type":"blob","sha":"17b269a3046644d8d2721b6fb569bb918d1bc928","size":812,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/17b269a3046644d8d2721b6fb569bb918d1bc928"},{"path":"experiments/test-version-check.sh","mode":"100755","type":"blob","sha":"57c317d7fe9e8db8cf25ef6b34f7d0c953aa2d70","size":1420,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/57c317d7fe9e8db8cf25ef6b34f7d0c953aa2d70"},{"path":"scripts","mode":"040000","type":"tree","sha":"8157ab91d639e5dedec762f5e90066cd0b553783","url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/trees/8157ab91d639e5dedec762f5e90066cd0b553783"},{"path":"scripts/bump-version.rs","mode":"100644","type":"blob","sha":"fe1daee3e9284555bbf5cf8cc012fc47b2967cec","size":4940,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/fe1daee3e9284555bbf5cf8cc012fc47b2967cec"},{"path":"scripts/check-changelog-fragment.rs","mode":"100644","type":"blob","sha":"70faf74947a515cde4a20f959415bafc3d33472c","size":5230,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/70faf74947a515cde4a20f959415bafc3d33472c"},{"path":"scripts/check-file-size.rs","mode":"100644","type":"blob","sha":"64d3eb13937a19b9d6e9be7b3834ba8353a735b3","size":8066,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/64d3eb13937a19b9d6e9be7b3834ba8353a735b3"},{"path":"scripts/check-release-needed.rs","mode":"100644","type":"blob","sha":"b97c5e432eb1ec41158e3847a77e9ef686b5ac7c","size":13507,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/b97c5e432eb1ec41158e3847a77e9ef686b5ac7c"},{"path":"scripts/check-version-modification.rs","mode":"100644","type":"blob","sha":"09ebb332aba4e42aed1cc40e0132f71abf5a412b","size":4917,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/09ebb332aba4e42aed1cc40e0132f71abf5a412b"},{"path":"scripts/collect-changelog.rs","mode":"100644","type":"blob","sha":"63b7d8c39d58fe2cb31b3333d645603a5850b156","size":7325,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/63b7d8c39d58fe2cb31b3333d645603a5850b156"},{"path":"scripts/create-changelog-fragment.rs","mode":"100644","type":"blob","sha":"08e145b18bcd5b689bebd7b7abdcac62810a6bda","size":3280,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/08e145b18bcd5b689bebd7b7abdcac62810a6bda"},{"path":"scripts/create-github-release.rs","mode":"100644","type":"blob","sha":"2a914a03a45ac52c80c4fa62ee2608d7b101982e","size":12545,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/2a914a03a45ac52c80c4fa62ee2608d7b101982e"},{"path":"scripts/detect-code-changes.rs","mode":"100644","type":"blob","sha":"3a5769e580449a92867f379b87acf50c73651b07","size":7070,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/3a5769e580449a92867f379b87acf50c73651b07"},{"path":"scripts/get-bump-type.rs","mode":"100644","type":"blob","sha":"187e018765c64b91863fa35fb480eb2a50efb760","size":5331,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/187e018765c64b91863fa35fb480eb2a50efb760"},{"path":"scripts/get-version.rs","mode":"100644","type":"blob","sha":"07d2886789b6b59984c7221025e26ea64aa9e53e","size":1964,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/07d2886789b6b59984c7221025e26ea64aa9e53e"},{"path":"scripts/git-config.rs","mode":"100644","type":"blob","sha":"8936793f10940d56a6d78d5bcd70248787b100d5","size":1953,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/8936793f10940d56a6d78d5bcd70248787b100d5"},{"path":"scripts/publish-crate.rs","mode":"100644","type":"blob","sha":"ad46ced8fa5e30c11a603d9d2cdea26aa904dfa5","size":6648,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/ad46ced8fa5e30c11a603d9d2cdea26aa904dfa5"},{"path":"scripts/rust-paths.rs","mode":"100644","type":"blob","sha":"e1a0b9214fe91d563ef4fab3f0e29f61d862164f","size":8380,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/e1a0b9214fe91d563ef4fab3f0e29f61d862164f"},{"path":"scripts/version-and-commit.rs","mode":"100644","type":"blob","sha":"0a242424e9822cc939192dd29c7761b4edfae1e9","size":18597,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/0a242424e9822cc939192dd29c7761b4edfae1e9"},{"path":"scripts/wait-for-crate.rs","mode":"100644","type":"blob","sha":"ee80cca922e74045f658742323984fd2aa836365","size":5287,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/ee80cca922e74045f658742323984fd2aa836365"},{"path":"src","mode":"040000","type":"tree","sha":"37cae03414d82f09d33a05aaf7374bc022ae29e0","url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/trees/37cae03414d82f09d33a05aaf7374bc022ae29e0"},{"path":"src/lib.rs","mode":"100644","type":"blob","sha":"490125beab071bf26797c966b0ef9e0a7148e058","size":32,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/490125beab071bf26797c966b0ef9e0a7148e058"},{"path":"src/main.rs","mode":"100644","type":"blob","sha":"3b8bdfe6217b48c3fd2c2fd66a5e9dcdb3cc0cd5","size":444,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/3b8bdfe6217b48c3fd2c2fd66a5e9dcdb3cc0cd5"},{"path":"src/sum.rs","mode":"100644","type":"blob","sha":"e0960d283b99065b95cbeb2b742a83865db7888d","size":66,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/e0960d283b99065b95cbeb2b742a83865db7888d"},{"path":"tests","mode":"040000","type":"tree","sha":"4afeb67caadc13f252fd057dcfeeb0370708eb09","url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/trees/4afeb67caadc13f252fd057dcfeeb0370708eb09"},{"path":"tests/integration","mode":"040000","type":"tree","sha":"a99363a908bd8e4c38637da3e115602eec71ee36","url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/trees/a99363a908bd8e4c38637da3e115602eec71ee36"},{"path":"tests/integration/mod.rs","mode":"100644","type":"blob","sha":"47e2280b07d1efc5bd685915506ba6410bd6a089","size":9,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/47e2280b07d1efc5bd685915506ba6410bd6a089"},{"path":"tests/integration/sum.rs","mode":"100644","type":"blob","sha":"b0d15bcdaf90712755b22a76fe88a4f69a1d2521","size":1059,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/b0d15bcdaf90712755b22a76fe88a4f69a1d2521"},{"path":"tests/unit","mode":"040000","type":"tree","sha":"d6357a25562e91247cac70f9614aece52be3d2f0","url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/trees/d6357a25562e91247cac70f9614aece52be3d2f0"},{"path":"tests/unit/ci-cd","mode":"040000","type":"tree","sha":"baa21e70fe3dab150ec854fa864821fc5ad045ed","url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/trees/baa21e70fe3dab150ec854fa864821fc5ad045ed"},{"path":"tests/unit/ci-cd/changelog_parsing.rs","mode":"100644","type":"blob","sha":"9945412dee4e26b9f135cd31558bf4dfdbb0f488","size":2308,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/9945412dee4e26b9f135cd31558bf4dfdbb0f488"},{"path":"tests/unit/ci-cd/mod.rs","mode":"100644","type":"blob","sha":"7ced4c51ef2ac4a615929043c373d4fc873a8d64","size":289,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/7ced4c51ef2ac4a615929043c373d4fc873a8d64"},{"path":"tests/unit/ci-cd/workflow_release.rs","mode":"100644","type":"blob","sha":"9048e83b7eca5fc83419c03889173c3643e809b8","size":8728,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/9048e83b7eca5fc83419c03889173c3643e809b8"},{"path":"tests/unit/ci-cd/workspace_manifest_resolution.rs","mode":"100644","type":"blob","sha":"10ce4c4df7000ba70f18b158677d22bc3d19d2ca","size":3799,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/10ce4c4df7000ba70f18b158677d22bc3d19d2ca"},{"path":"tests/unit/mod.rs","mode":"100644","type":"blob","sha":"7c158e60a04372aeff255c35aeb12ac7e3ffb9ea","size":46,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/7c158e60a04372aeff255c35aeb12ac7e3ffb9ea"},{"path":"tests/unit/sum.rs","mode":"100644","type":"blob","sha":"84937f6b08f7f883a582874d4a6a127e04dc588c","size":417,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/84937f6b08f7f883a582874d4a6a127e04dc588c"}],"truncated":false} \ No newline at end of file diff --git a/docs/case-studies/issue-82/evidence/template-rust-workflows.json b/docs/case-studies/issue-82/evidence/template-rust-workflows.json new file mode 100644 index 0000000..ceb1413 --- /dev/null +++ b/docs/case-studies/issue-82/evidence/template-rust-workflows.json @@ -0,0 +1 @@ +[{"name":"release.yml","path":".github/workflows/release.yml","sha":"885eb018d8a46298a78ea6dfa42103f7591f6505","size":23449,"url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/contents/.github/workflows/release.yml?ref=main","html_url":"https://github.com/link-foundation/rust-ai-driven-development-pipeline-template/blob/main/.github/workflows/release.yml","git_url":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/885eb018d8a46298a78ea6dfa42103f7591f6505","download_url":"https://raw.githubusercontent.com/link-foundation/rust-ai-driven-development-pipeline-template/main/.github/workflows/release.yml","type":"file","_links":{"self":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/contents/.github/workflows/release.yml?ref=main","git":"https://api.github.com/repos/link-foundation/rust-ai-driven-development-pipeline-template/git/blobs/885eb018d8a46298a78ea6dfa42103f7591f6505","html":"https://github.com/link-foundation/rust-ai-driven-development-pipeline-template/blob/main/.github/workflows/release.yml"}}] \ No newline at end of file diff --git a/docs/case-studies/issue-82/evidence/templates/csharp/release.yml b/docs/case-studies/issue-82/evidence/templates/csharp/release.yml new file mode 100644 index 0000000..7bc4bed --- /dev/null +++ b/docs/case-studies/issue-82/evidence/templates/csharp/release.yml @@ -0,0 +1,487 @@ +name: CI/CD Pipeline + +on: + push: + branches: + - main + pull_request: + types: [opened, synchronize, reopened] + workflow_dispatch: + inputs: + release_mode: + description: 'Release mode' + required: true + type: choice + default: 'instant' + options: + - instant + - changeset-pr + bump_type: + description: 'Version bump type' + required: true + type: choice + options: + - patch + - minor + - major + description: + description: 'Release description (optional)' + required: false + type: string + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +env: + DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true + DOTNET_CLI_TELEMETRY_OPTOUT: true + DOTNET_NOLOGO: true + +jobs: + # === DETECT CHANGES - determines which jobs should run === + detect-changes: + name: Detect Changes + runs-on: ubuntu-latest + if: github.event_name != 'workflow_dispatch' + outputs: + cs-changed: ${{ steps.changes.outputs.cs-changed }} + csproj-changed: ${{ steps.changes.outputs.csproj-changed }} + sln-changed: ${{ steps.changes.outputs.sln-changed }} + props-changed: ${{ steps.changes.outputs.props-changed }} + mjs-changed: ${{ steps.changes.outputs.mjs-changed }} + docs-changed: ${{ steps.changes.outputs.docs-changed }} + workflow-changed: ${{ steps.changes.outputs.workflow-changed }} + any-code-changed: ${{ steps.changes.outputs.any-code-changed }} + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup Bun + uses: oven-sh/setup-bun@v2 + with: + bun-version: latest + + - name: Detect changes + id: changes + env: + GITHUB_EVENT_NAME: ${{ github.event_name }} + GITHUB_BASE_SHA: ${{ github.event.pull_request.base.sha }} + GITHUB_HEAD_SHA: ${{ github.event.pull_request.head.sha }} + run: bun run scripts/detect-code-changes.mjs + + # === CHANGESET CHECK - only runs on PRs with code changes === + # Docs-only PRs (./docs folder, markdown files) don't require changesets + changeset-check: + name: Changeset Validation + runs-on: ubuntu-latest + needs: [detect-changes] + if: github.event_name == 'pull_request' && needs.detect-changes.outputs.any-code-changed == 'true' + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup Bun + uses: oven-sh/setup-bun@v2 + with: + bun-version: latest + + - name: Validate changeset + env: + GITHUB_BASE_REF: ${{ github.base_ref }} + GITHUB_BASE_SHA: ${{ github.event.pull_request.base.sha }} + GITHUB_HEAD_SHA: ${{ github.event.pull_request.head.sha }} + run: | + # Skip changeset check for automated release PRs + if [[ "${{ github.head_ref }}" == "changeset-release/"* ]] || [[ "${{ github.head_ref }}" == "changeset-manual-release-"* ]]; then + echo "Skipping changeset check for automated release PR" + exit 0 + fi + + # Run changeset validation script + bun run scripts/validate-changeset.mjs + + # === LINT AND FORMAT CHECK === + # Lint runs independently of changeset-check - it's a fast check that should always run + # See: https://github.com/link-foundation/js-ai-driven-development-pipeline-template/pull/18 for why this dependency was removed + lint: + name: Lint and Format Check + runs-on: ubuntu-latest + needs: [detect-changes] + if: | + github.event_name == 'push' || + github.event_name == 'workflow_dispatch' || + needs.detect-changes.outputs.cs-changed == 'true' || + needs.detect-changes.outputs.csproj-changed == 'true' || + needs.detect-changes.outputs.sln-changed == 'true' || + needs.detect-changes.outputs.props-changed == 'true' || + needs.detect-changes.outputs.mjs-changed == 'true' || + needs.detect-changes.outputs.docs-changed == 'true' || + needs.detect-changes.outputs.workflow-changed == 'true' + steps: + - uses: actions/checkout@v4 + + - name: Setup .NET + uses: actions/setup-dotnet@v4 + with: + dotnet-version: '8.0.x' + + - name: Setup Bun + uses: oven-sh/setup-bun@v2 + with: + bun-version: latest + + - name: Restore dependencies + run: dotnet restore + + - name: Check formatting + run: dotnet format --verify-no-changes --verbosity diagnostic + + - name: Build with warnings as errors + run: dotnet build --no-restore --configuration Release /warnaserror + + - name: Run script tests + run: bun test scripts/*.test.mjs + + - name: Check file size limit + run: bun run scripts/check-file-size.mjs + + # === TEST ON MULTIPLE OS === + test: + name: Test (${{ matrix.os }}) + runs-on: ${{ matrix.os }} + needs: [detect-changes, changeset-check] + # Run if: push event, workflow_dispatch, OR changeset-check succeeded, OR changeset-check was skipped (docs-only PR) + if: always() && (github.event_name == 'push' || github.event_name == 'workflow_dispatch' || needs.changeset-check.result == 'success' || needs.changeset-check.result == 'skipped') + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, macos-latest, windows-latest] + steps: + - uses: actions/checkout@v4 + + - name: Setup .NET + uses: actions/setup-dotnet@v4 + with: + dotnet-version: '8.0.x' + + - name: Restore dependencies + run: dotnet restore + + - name: Build + run: dotnet build --no-restore --configuration Release + + - name: Run tests + run: dotnet test --no-build --configuration Release --verbosity normal --collect:"XPlat Code Coverage" + + - name: Upload coverage to Codecov + if: matrix.os == 'ubuntu-latest' + uses: codecov/codecov-action@v4 + with: + fail_ci_if_error: false + + # === BUILD PACKAGE === + # Only runs if lint and test pass + build: + name: Build Package + runs-on: ubuntu-latest + needs: [lint, test] + if: always() && needs.lint.result == 'success' && needs.test.result == 'success' + steps: + - uses: actions/checkout@v4 + + - name: Setup .NET + uses: actions/setup-dotnet@v4 + with: + dotnet-version: '8.0.x' + + - name: Restore dependencies + run: dotnet restore + + - name: Build Release + run: dotnet build --no-restore --configuration Release + + - name: Pack NuGet package + run: dotnet pack --no-build --configuration Release --output ./artifacts + + - name: Upload artifacts + uses: actions/upload-artifact@v4 + with: + name: nuget-package + path: ./artifacts/*.nupkg + + # === AUTOMATIC RELEASE === + # Runs on push to main using changesets + release: + name: Release + needs: [lint, test, build] + if: always() && github.ref == 'refs/heads/main' && github.event_name == 'push' && needs.lint.result == 'success' && needs.test.result == 'success' && needs.build.result == 'success' + runs-on: ubuntu-latest + permissions: + contents: write + packages: write + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup .NET + uses: actions/setup-dotnet@v4 + with: + dotnet-version: '8.0.x' + + - name: Setup Bun + uses: oven-sh/setup-bun@v2 + with: + bun-version: latest + + - name: Check for changesets + id: check_changesets + run: | + # Count changeset files (excluding README.md and config.json) + CHANGESET_COUNT=$(find .changeset -name "*.md" ! -name "README.md" 2>/dev/null | wc -l) + echo "Found $CHANGESET_COUNT changeset file(s)" + echo "has_changesets=$([[ $CHANGESET_COUNT -gt 0 ]] && echo 'true' || echo 'false')" >> $GITHUB_OUTPUT + echo "changeset_count=$CHANGESET_COUNT" >> $GITHUB_OUTPUT + + - name: Merge multiple changesets + if: steps.check_changesets.outputs.has_changesets == 'true' && steps.check_changesets.outputs.changeset_count > 1 + run: | + echo "Multiple changesets detected, merging..." + bun run scripts/merge-changesets.mjs + + - name: Version and commit + if: steps.check_changesets.outputs.has_changesets == 'true' + id: version + run: bun run scripts/version-and-commit.mjs --mode changeset + + - name: Build release package + if: steps.version.outputs.version_committed == 'true' + run: | + dotnet restore + dotnet build --configuration Release + dotnet pack --no-build --configuration Release --output ./artifacts + + - name: Resolve NuGet package id + if: steps.version.outputs.version_committed == 'true' + id: package + run: | + PACKAGE_ID=$(dotnet msbuild src/MyPackage/MyPackage.csproj -getProperty:PackageId | tail -n 1 | tr -d '\r') + if [ -z "$PACKAGE_ID" ]; then + PACKAGE_ID=$(dotnet msbuild src/MyPackage/MyPackage.csproj -getProperty:AssemblyName | tail -n 1 | tr -d '\r') + fi + if [ -z "$PACKAGE_ID" ]; then + PACKAGE_ID="MyPackage" + fi + PACKAGE_ID_LOWER=$(echo "$PACKAGE_ID" | tr '[:upper:]' '[:lower:]') + echo "id=$PACKAGE_ID" >> "$GITHUB_OUTPUT" + echo "flat_container_id=$PACKAGE_ID_LOWER" >> "$GITHUB_OUTPUT" + + - name: Publish to NuGet + id: nuget_publish + if: steps.version.outputs.version_committed == 'true' + env: + NUGET_API_KEY: ${{ secrets.NUGET_API_KEY }} + run: | + if [ -n "$NUGET_API_KEY" ]; then + dotnet nuget push ./artifacts/*.nupkg --api-key $NUGET_API_KEY --source https://api.nuget.org/v3/index.json --skip-duplicate + echo "published=true" >> "$GITHUB_OUTPUT" + else + echo "NUGET_API_KEY not set, skipping NuGet publish" + echo "published=false" >> "$GITHUB_OUTPUT" + fi + + - name: Verify package on NuGet + if: steps.version.outputs.version_committed == 'true' && steps.nuget_publish.outputs.published == 'true' + run: | + PACKAGE_ID="${{ steps.package.outputs.id }}" + PACKAGE_ID_LOWER="${{ steps.package.outputs.flat_container_id }}" + VERSION="${{ steps.version.outputs.new_version }}" + for DELAY in 0 5 10 20 30 60; do + if [ "$DELAY" != "0" ]; then + sleep "$DELAY" + fi + STATUS=$(curl -sS -o /dev/null -w '%{http_code}' "https://api.nuget.org/v3-flatcontainer/${PACKAGE_ID_LOWER}/${VERSION}/${PACKAGE_ID_LOWER}.nuspec" || true) + echo "NuGet status for ${PACKAGE_ID}@${VERSION}: ${STATUS}" + if [ "$STATUS" = "200" ]; then + echo "Verified ${PACKAGE_ID}@${VERSION} is available on NuGet" + exit 0 + fi + done + echo "::error title=NuGet verification failed::${PACKAGE_ID}@${VERSION} was not available from NuGet after publish." + exit 1 + + - name: Create GitHub Release + if: steps.version.outputs.version_committed == 'true' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + bun run scripts/create-github-release.mjs \ + --release-version "${{ steps.version.outputs.new_version }}" \ + --repository "${{ github.repository }}" \ + --tag-prefix "csharp_v" \ + --language "C#" \ + --package-id "${{ steps.package.outputs.id }}" \ + --assets-glob "./artifacts/*.nupkg" + + # === MANUAL INSTANT RELEASE === + # Triggered via workflow_dispatch with instant mode + instant-release: + name: Instant Release + needs: [lint, test, build] + if: github.event_name == 'workflow_dispatch' && github.event.inputs.release_mode == 'instant' && needs.lint.result == 'success' && needs.test.result == 'success' && needs.build.result == 'success' + runs-on: ubuntu-latest + permissions: + contents: write + packages: write + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + token: ${{ secrets.GITHUB_TOKEN }} + + - name: Setup .NET + uses: actions/setup-dotnet@v4 + with: + dotnet-version: '8.0.x' + + - name: Setup Bun + uses: oven-sh/setup-bun@v2 + with: + bun-version: latest + + - name: Version and commit + id: version + run: | + bun run scripts/version-and-commit.mjs \ + --mode instant \ + --bump-type "${{ github.event.inputs.bump_type }}" \ + --description "${{ github.event.inputs.description }}" + + - name: Build package + if: steps.version.outputs.version_committed == 'true' + run: | + dotnet restore + dotnet build --configuration Release + dotnet pack --no-build --configuration Release --output ./artifacts + + - name: Resolve NuGet package id + if: steps.version.outputs.version_committed == 'true' + id: package + run: | + PACKAGE_ID=$(dotnet msbuild src/MyPackage/MyPackage.csproj -getProperty:PackageId | tail -n 1 | tr -d '\r') + if [ -z "$PACKAGE_ID" ]; then + PACKAGE_ID=$(dotnet msbuild src/MyPackage/MyPackage.csproj -getProperty:AssemblyName | tail -n 1 | tr -d '\r') + fi + if [ -z "$PACKAGE_ID" ]; then + PACKAGE_ID="MyPackage" + fi + PACKAGE_ID_LOWER=$(echo "$PACKAGE_ID" | tr '[:upper:]' '[:lower:]') + echo "id=$PACKAGE_ID" >> "$GITHUB_OUTPUT" + echo "flat_container_id=$PACKAGE_ID_LOWER" >> "$GITHUB_OUTPUT" + + - name: Publish to NuGet + id: nuget_publish + if: steps.version.outputs.version_committed == 'true' + env: + NUGET_API_KEY: ${{ secrets.NUGET_API_KEY }} + run: | + if [ -n "$NUGET_API_KEY" ]; then + dotnet nuget push ./artifacts/*.nupkg --api-key $NUGET_API_KEY --source https://api.nuget.org/v3/index.json --skip-duplicate + echo "published=true" >> "$GITHUB_OUTPUT" + else + echo "NUGET_API_KEY not set, skipping NuGet publish" + echo "published=false" >> "$GITHUB_OUTPUT" + fi + + - name: Verify package on NuGet + if: steps.version.outputs.version_committed == 'true' && steps.nuget_publish.outputs.published == 'true' + run: | + PACKAGE_ID="${{ steps.package.outputs.id }}" + PACKAGE_ID_LOWER="${{ steps.package.outputs.flat_container_id }}" + VERSION="${{ steps.version.outputs.new_version }}" + for DELAY in 0 5 10 20 30 60; do + if [ "$DELAY" != "0" ]; then + sleep "$DELAY" + fi + STATUS=$(curl -sS -o /dev/null -w '%{http_code}' "https://api.nuget.org/v3-flatcontainer/${PACKAGE_ID_LOWER}/${VERSION}/${PACKAGE_ID_LOWER}.nuspec" || true) + echo "NuGet status for ${PACKAGE_ID}@${VERSION}: ${STATUS}" + if [ "$STATUS" = "200" ]; then + echo "Verified ${PACKAGE_ID}@${VERSION} is available on NuGet" + exit 0 + fi + done + echo "::error title=NuGet verification failed::${PACKAGE_ID}@${VERSION} was not available from NuGet after publish." + exit 1 + + - name: Create GitHub Release + if: steps.version.outputs.version_committed == 'true' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + bun run scripts/create-github-release.mjs \ + --release-version "${{ steps.version.outputs.new_version }}" \ + --repository "${{ github.repository }}" \ + --tag-prefix "csharp_v" \ + --language "C#" \ + --package-id "${{ steps.package.outputs.id }}" \ + --assets-glob "./artifacts/*.nupkg" + + # === MANUAL CHANGESET PR === + # Creates a pull request with the changeset for review + changeset-pr: + name: Create Changeset PR + if: github.event_name == 'workflow_dispatch' && github.event.inputs.release_mode == 'changeset-pr' + runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup Bun + uses: oven-sh/setup-bun@v2 + with: + bun-version: latest + + - name: Create changeset file + run: | + CHANGESET_ID=$(date +%s) + CHANGESET_FILE=".changeset/manual-release-${CHANGESET_ID}.md" + + cat > "$CHANGESET_FILE" << 'EOF' + --- + 'MyPackage': ${{ github.event.inputs.bump_type }} + --- + + ${{ github.event.inputs.description || 'Manual release' }} + EOF + + echo "Created changeset: $CHANGESET_FILE" + + - name: Create Pull Request + uses: peter-evans/create-pull-request@v7 + with: + token: ${{ secrets.GITHUB_TOKEN }} + commit-message: 'chore: add changeset for manual ${{ github.event.inputs.bump_type }} release' + branch: changeset-manual-release-${{ github.run_id }} + delete-branch: true + title: 'chore: manual ${{ github.event.inputs.bump_type }} release' + body: | + ## Manual Release Request + + This PR was created by a manual workflow trigger to prepare a **${{ github.event.inputs.bump_type }}** release. + + ### Release Details + - **Type:** ${{ github.event.inputs.bump_type }} + - **Description:** ${{ github.event.inputs.description || 'Manual release' }} + - **Triggered by:** @${{ github.actor }} + + ### Next Steps + 1. Review the changeset in this PR + 2. Merge this PR to main + 3. The automated release workflow will version, publish, and create a GitHub release diff --git a/docs/case-studies/issue-82/evidence/templates/csharp/scripts/bump-version.mjs b/docs/case-studies/issue-82/evidence/templates/csharp/scripts/bump-version.mjs new file mode 100644 index 0000000..8a983af --- /dev/null +++ b/docs/case-studies/issue-82/evidence/templates/csharp/scripts/bump-version.mjs @@ -0,0 +1,102 @@ +#!/usr/bin/env node + +/** + * Bump version in csproj file + * Usage: bun run scripts/bump-version.mjs --bump-type [--dry-run] + */ + +import { readFileSync, writeFileSync } from 'fs'; + +// Simple argument parsing +const args = process.argv.slice(2); +const getArg = (name) => { + const index = args.indexOf(`--${name}`); + if (index === -1) return null; + return args[index + 1]; +}; +const hasFlag = (name) => args.includes(`--${name}`); + +const bumpType = getArg('bump-type'); +const dryRun = hasFlag('dry-run'); + +if (!bumpType || !['major', 'minor', 'patch'].includes(bumpType)) { + console.error( + 'Usage: bun run scripts/bump-version.mjs --bump-type [--dry-run]' + ); + process.exit(1); +} + +const CSPROJ_PATH = 'src/MyPackage/MyPackage.csproj'; + +/** + * Get current version from csproj + * @returns {{major: number, minor: number, patch: number}} + */ +function getCurrentVersion() { + const csproj = readFileSync(CSPROJ_PATH, 'utf-8'); + const match = csproj.match(/(\d+)\.(\d+)\.(\d+)<\/Version>/); + + if (!match) { + console.error('Error: Could not parse version from csproj'); + process.exit(1); + } + + return { + major: parseInt(match[1], 10), + minor: parseInt(match[2], 10), + patch: parseInt(match[3], 10), + }; +} + +/** + * Calculate new version based on bump type + * @param {{major: number, minor: number, patch: number}} current + * @param {string} bumpType + * @returns {string} + */ +function calculateNewVersion(current, bumpType) { + const { major, minor, patch } = current; + + switch (bumpType) { + case 'major': + return `${major + 1}.0.0`; + case 'minor': + return `${major}.${minor + 1}.0`; + case 'patch': + return `${major}.${minor}.${patch + 1}`; + default: + throw new Error(`Invalid bump type: ${bumpType}`); + } +} + +/** + * Update version in csproj file + * @param {string} newVersion + */ +function updateCsproj(newVersion) { + let csproj = readFileSync(CSPROJ_PATH, 'utf-8'); + csproj = csproj.replace( + /[^<]+<\/Version>/, + `${newVersion}` + ); + writeFileSync(CSPROJ_PATH, csproj, 'utf-8'); +} + +try { + const current = getCurrentVersion(); + const currentStr = `${current.major}.${current.minor}.${current.patch}`; + const newVersion = calculateNewVersion(current, bumpType); + + console.log(`Current version: ${currentStr}`); + console.log(`New version: ${newVersion}`); + + if (dryRun) { + console.log('Dry run - no changes made'); + } else { + updateCsproj(newVersion); + console.log('Updated csproj'); + } +} catch (error) { + console.error('Error:', error.message); + process.exit(1); +} diff --git a/docs/case-studies/issue-82/evidence/templates/csharp/scripts/check-file-size.mjs b/docs/case-studies/issue-82/evidence/templates/csharp/scripts/check-file-size.mjs new file mode 100644 index 0000000..b3a2f02 --- /dev/null +++ b/docs/case-studies/issue-82/evidence/templates/csharp/scripts/check-file-size.mjs @@ -0,0 +1,97 @@ +#!/usr/bin/env node + +/** + * Check for files exceeding the maximum allowed line count + * Exits with error code 1 if any files exceed the limit + */ + +import { readFileSync, readdirSync, statSync } from 'fs'; +import { join, relative, extname } from 'path'; + +const MAX_LINES = 1000; +const FILE_EXTENSIONS = ['.cs']; +const EXCLUDE_PATTERNS = ['bin', 'obj', '.git', 'node_modules', 'artifacts']; + +/** + * Check if a path should be excluded + * @param {string} path + * @returns {boolean} + */ +function shouldExclude(path) { + return EXCLUDE_PATTERNS.some((pattern) => path.includes(pattern)); +} + +/** + * Recursively find all C# files in a directory + * @param {string} directory + * @returns {string[]} + */ +function findCSharpFiles(directory) { + const files = []; + + function walkDir(dir) { + const entries = readdirSync(dir, { withFileTypes: true }); + + for (const entry of entries) { + const fullPath = join(dir, entry.name); + + if (shouldExclude(fullPath)) { + continue; + } + + if (entry.isDirectory()) { + walkDir(fullPath); + } else if (entry.isFile() && FILE_EXTENSIONS.includes(extname(entry.name))) { + files.push(fullPath); + } + } + } + + walkDir(directory); + return files; +} + +/** + * Count lines in a file + * @param {string} filePath + * @returns {number} + */ +function countLines(filePath) { + const content = readFileSync(filePath, 'utf-8'); + return content.split('\n').length; +} + +try { + const cwd = process.cwd(); + console.log(`\nChecking C# files for maximum ${MAX_LINES} lines...\n`); + + const files = findCSharpFiles(cwd); + const violations = []; + + for (const file of files) { + const lineCount = countLines(file); + if (lineCount > MAX_LINES) { + violations.push({ + file: relative(cwd, file), + lines: lineCount, + }); + } + } + + if (violations.length === 0) { + console.log(`Checked ${files.length} file(s) - all within the line limit\n`); + process.exit(0); + } else { + console.log('Found files exceeding the line limit:\n'); + for (const violation of violations) { + console.log( + ` ${violation.file}: ${violation.lines} lines (exceeds ${MAX_LINES})` + ); + } + console.log(`\nPlease refactor these files to be under ${MAX_LINES} lines\n`); + process.exit(1); + } +} catch (error) { + console.error('Error:', error.message); + process.exit(1); +} diff --git a/docs/case-studies/issue-82/evidence/templates/csharp/scripts/create-github-release.mjs b/docs/case-studies/issue-82/evidence/templates/csharp/scripts/create-github-release.mjs new file mode 100644 index 0000000..75a90d3 --- /dev/null +++ b/docs/case-studies/issue-82/evidence/templates/csharp/scripts/create-github-release.mjs @@ -0,0 +1,504 @@ +#!/usr/bin/env bun + +/** + * Create GitHub Release from CHANGELOG.md + * Usage: bun run scripts/create-github-release.mjs --release-version --repository [--tag-prefix ] [--language ] [--package-id ] [--assets-glob ] + */ + +import { spawnSync } from 'node:child_process'; +import { + existsSync, + readFileSync, + readdirSync, + statSync, +} from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const USAGE = + 'Usage: bun run scripts/create-github-release.mjs --release-version --repository [--tag-prefix ] [--language ] [--package-id ] [--assets-glob ]'; + +/** + * Parse CLI arguments. + * @param {string[]} argv + * @param {NodeJS.ProcessEnv} env + * @returns {{assetsGlob: string, releaseVersion: string, repository: string, tagPrefix: string, language: string, packageId: string}} + */ +export function parseArgs(argv, env = process.env) { + const config = { + assetsGlob: env.ASSETS_GLOB ?? '', + language: env.LANGUAGE ?? 'C#', + packageId: env.PACKAGE_ID ?? '', + releaseVersion: env.VERSION ?? '', + repository: env.REPOSITORY ?? '', + tagPrefix: env.TAG_PREFIX ?? 'csharp_v', + }; + + for (let index = 0; index < argv.length; index++) { + const arg = argv[index]; + + if (arg === '--release-version' || arg === '--version') { + config.releaseVersion = readOptionValue(argv, index, arg); + index++; + } else if (arg.startsWith('--release-version=')) { + config.releaseVersion = arg.slice('--release-version='.length); + } else if (arg.startsWith('--version=')) { + config.releaseVersion = arg.slice('--version='.length); + } else if (arg === '--repository') { + config.repository = readOptionValue(argv, index, arg); + index++; + } else if (arg.startsWith('--repository=')) { + config.repository = arg.slice('--repository='.length); + } else if (arg === '--tag-prefix') { + config.tagPrefix = readOptionValue(argv, index, arg); + index++; + } else if (arg.startsWith('--tag-prefix=')) { + config.tagPrefix = arg.slice('--tag-prefix='.length); + } else if (arg === '--language') { + config.language = readOptionValue(argv, index, arg); + index++; + } else if (arg.startsWith('--language=')) { + config.language = arg.slice('--language='.length); + } else if (arg === '--package-id') { + config.packageId = readOptionValue(argv, index, arg); + index++; + } else if (arg.startsWith('--package-id=')) { + config.packageId = arg.slice('--package-id='.length); + } else if (arg === '--assets-glob') { + config.assetsGlob = readOptionValue(argv, index, arg); + index++; + } else if (arg.startsWith('--assets-glob=')) { + config.assetsGlob = arg.slice('--assets-glob='.length); + } + } + + return config; +} + +/** + * Read a CLI option value. + * @param {string[]} argv + * @param {number} index + * @param {string} optionName + * @returns {string} + */ +function readOptionValue(argv, index, optionName) { + const value = argv[index + 1]; + + if (value === undefined || value.startsWith('--')) { + throw new Error(`Missing value for ${optionName}`); + } + + return value; +} + +/** + * Escape text for a regular expression. + * @param {string} value + * @returns {string} + */ +function escapeRegex(value) { + return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); +} + +/** + * Normalize release versions to bare semver. + * @param {string} releaseVersion + * @returns {string} + */ +export function normalizeReleaseVersion(releaseVersion) { + const trimmedVersion = String(releaseVersion ?? '').trim(); + const semverTagMatch = trimmedVersion.match( + /(?:^|[-_])v?(\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?)$/i + ); + + if (semverTagMatch) { + return semverTagMatch[1]; + } + + return trimmedVersion + .replace(/^[A-Za-z][A-Za-z0-9]*[-_]/, '') + .replace(/^v/i, ''); +} + +/** + * Build a release tag. + * @param {string} tagPrefix + * @param {string} releaseVersion + * @returns {string} + */ +export function buildReleaseTag(tagPrefix, releaseVersion) { + return `${tagPrefix}${normalizeReleaseVersion(releaseVersion)}`; +} + +/** + * Build a release title. + * @param {string} language + * @param {string} releaseVersion + * @returns {string} + */ +export function buildReleaseTitle(language, releaseVersion) { + const releaseLanguage = language.trim() || 'C#'; + return `[${releaseLanguage}] ${normalizeReleaseVersion(releaseVersion)}`; +} + +/** + * Build a NuGet badge markdown link. + * @param {string} packageId + * @returns {string} + */ +export function buildNuGetBadge(packageId) { + const encodedPackageId = encodeURIComponent(packageId); + return `[![NuGet](https://img.shields.io/nuget/v/${encodedPackageId}.svg)](https://www.nuget.org/packages/${encodedPackageId})`; +} + +/** + * Append a NuGet badge unless release notes already include a shields.io badge. + * @param {string} releaseNotes + * @param {string} packageId + * @returns {string} + */ +export function appendNuGetBadgeIfMissing(releaseNotes, packageId) { + if (!packageId || /img\.shields\.io/i.test(releaseNotes)) { + return releaseNotes; + } + + return `${releaseNotes}\n\n---\n\n${buildNuGetBadge(packageId)}`; +} + +/** + * Extract changelog content for a specific version + * @param {string} changelog + * @param {string} version + * @returns {string} + */ +export function extractReleaseNotes(changelog, version) { + const semver = normalizeReleaseVersion(version); + + // Find the section for this version + const escapedVersion = escapeRegex(semver); + const pattern = new RegExp( + `(?:^|\\n)## \\[?${escapedVersion}\\]?[^\\n]*\\n([\\s\\S]*?)(?=\\n## \\[?\\d|$)` + ); + const match = changelog.match(pattern); + + if (match) { + const releaseNotes = match[1].trim(); + return releaseNotes || `Release ${semver}`; + } + + return `Release ${semver}`; +} + +/** + * Find a package id by scanning project files. + * @param {string} rootDir + * @returns {string} + */ +export function findPackageId(rootDir = '.') { + const candidates = []; + + walkProjectFiles(rootDir, candidates); + + for (const csprojPath of candidates) { + const csproj = readFileSync(csprojPath, 'utf-8'); + const packageIdMatch = csproj.match(/([^<]+)<\/PackageId>/); + if (packageIdMatch) { + return packageIdMatch[1].trim(); + } + + const assemblyNameMatch = csproj.match( + /([^<]+)<\/AssemblyName>/ + ); + if (assemblyNameMatch) { + return assemblyNameMatch[1].trim(); + } + } + + if (candidates.length > 0) { + return path.basename(candidates[0], '.csproj'); + } + + return ''; +} + +/** + * Walk project files under a root directory. + * @param {string} dir + * @param {string[]} candidates + * @param {number} depth + */ +function walkProjectFiles(dir, candidates, depth = 0) { + if (depth > 4) { + return; + } + + let entries; + try { + entries = readdirSync(dir); + } catch { + return; + } + + for (const entry of entries) { + if ( + entry === '.git' || + entry === 'bin' || + entry === 'obj' || + entry === 'node_modules' + ) { + continue; + } + + const fullPath = path.join(dir, entry); + let stat; + try { + stat = statSync(fullPath); + } catch { + continue; + } + + if (stat.isDirectory()) { + walkProjectFiles(fullPath, candidates, depth + 1); + } else if (fullPath.endsWith('.csproj')) { + candidates.push(fullPath); + } + } +} + +/** + * Build the GitHub release API payload. + * @param {{changelog: string, language: string, packageId: string, releaseVersion: string, tagPrefix: string}} options + * @returns {string} + */ +export function buildReleasePayload({ + changelog, + language, + packageId, + releaseVersion, + tagPrefix, +}) { + const semver = normalizeReleaseVersion(releaseVersion); + const releaseNotes = appendNuGetBadgeIfMissing( + extractReleaseNotes(changelog, semver), + packageId + ); + + return JSON.stringify({ + tag_name: buildReleaseTag(tagPrefix, semver), + name: buildReleaseTitle(language, semver), + body: releaseNotes, + }); +} + +/** + * Create a GitHub release using gh. + * @param {{payload: string, repository: string, spawn?: typeof spawnSync}} options + * @returns {{alreadyExists: boolean}} + */ +export function createRelease({ payload, repository, spawn = spawnSync }) { + const result = spawn( + 'gh', + ['api', `repos/${repository}/releases`, '-X', 'POST', '--input', '-'], + { + encoding: 'utf-8', + input: payload, + } + ); + + if (result.error) { + throw new Error(`gh api failed to start: ${result.error.message}`); + } + + if (result.status === 0) { + return { alreadyExists: false }; + } + + const output = [result.stderr, result.stdout] + .filter((value) => typeof value === 'string' && value.trim()) + .join('\n'); + + if (/already_exists|already exists/i.test(output)) { + return { alreadyExists: true }; + } + + throw new Error(`gh api failed with code ${result.status}: ${output}`); +} + +/** + * Resolve a simple release asset glob. + * + * Supports exact file paths or `*` in the file name portion, such as + * `artifacts/*.nupkg`. Matches are returned in deterministic path order. + * + * @param {string} assetsGlob + * @param {string} cwd + * @returns {string[]} + */ +export function resolveReleaseAssets(assetsGlob, cwd = '.') { + const pattern = String(assetsGlob ?? '').trim(); + if (!pattern) { + return []; + } + + const absolutePattern = path.isAbsolute(pattern) + ? pattern + : path.resolve(cwd, pattern); + const assetDirectory = path.dirname(absolutePattern); + const filePattern = path.basename(absolutePattern); + + if (!filePattern.includes('*')) { + try { + return existsSync(absolutePattern) && statSync(absolutePattern).isFile() + ? [absolutePattern] + : []; + } catch { + return []; + } + } + + let entries; + try { + entries = readdirSync(assetDirectory, { withFileTypes: true }); + } catch { + return []; + } + + const filePatternRegex = new RegExp( + `^${escapeRegex(filePattern).replace(/\\\*/g, '.*')}$` + ); + + return entries + .filter((entry) => entry.isFile() && filePatternRegex.test(entry.name)) + .map((entry) => path.join(assetDirectory, entry.name)) + .sort(); +} + +/** + * Upload release assets using gh. + * @param {{assetPaths: string[], repository: string, tag: string, spawn?: typeof spawnSync}} options + * @returns {void} + */ +export function uploadReleaseAssets({ + assetPaths, + repository, + tag, + spawn = spawnSync, +}) { + if (assetPaths.length === 0) { + return; + } + + const result = spawn( + 'gh', + [ + 'release', + 'upload', + tag, + ...assetPaths, + '--clobber', + '--repo', + repository, + ], + { encoding: 'utf-8' } + ); + + if (result.error) { + throw new Error(`gh release upload failed to start: ${result.error.message}`); + } + + if (result.status !== 0) { + const output = [result.stderr, result.stdout] + .filter((value) => typeof value === 'string' && value.trim()) + .join('\n'); + + throw new Error( + `gh release upload failed with code ${result.status}: ${output}` + ); + } +} + +/** + * Run the CLI. + * @param {{argv?: string[], cwd?: string, env?: NodeJS.ProcessEnv, spawn?: typeof spawnSync, stderr?: typeof console.error, stdout?: typeof console.log}} options + * @returns {number} + */ +export function main({ + argv = process.argv.slice(2), + cwd = process.cwd(), + env = process.env, + spawn = spawnSync, + stderr = console.error, + stdout = console.log, +} = {}) { + try { + const { + assetsGlob, + language, + packageId, + releaseVersion, + repository, + tagPrefix, + } = + parseArgs(argv, env); + + if (!releaseVersion || !repository) { + stderr('Error: Missing required arguments'); + stderr(USAGE); + return 1; + } + + const changelogPath = path.join(cwd, 'CHANGELOG.md'); + const changelog = existsSync(changelogPath) + ? readFileSync(changelogPath, 'utf-8') + : ''; + const resolvedPackageId = packageId || findPackageId(cwd); + const tag = buildReleaseTag(tagPrefix, releaseVersion); + const payload = buildReleasePayload({ + changelog, + language, + packageId: resolvedPackageId, + releaseVersion, + tagPrefix, + }); + + stdout(`Creating GitHub release for ${tag}...`); + + const result = createRelease({ payload, repository, spawn }); + + if (result.alreadyExists) { + stdout(`GitHub release already exists: ${tag}, reconciling assets`); + } else { + stdout(`Created GitHub release: ${tag}`); + } + + if (assetsGlob) { + const assetPaths = resolveReleaseAssets(assetsGlob, cwd); + + if (assetPaths.length === 0) { + throw new Error(`No release assets matched ${assetsGlob}`); + } + + stdout(`Uploading ${assetPaths.length} release asset(s) to ${tag}...`); + uploadReleaseAssets({ assetPaths, repository, spawn, tag }); + stdout(`Uploaded ${assetPaths.length} release asset(s) to ${tag}`); + } + + return 0; + } catch (error) { + stderr(`Error creating release: ${error.message}`); + return 1; + } +} + +function isCliEntryPoint() { + return ( + typeof process !== 'undefined' && + process.argv?.[1] && + fileURLToPath(import.meta.url) === path.resolve(process.argv[1]) + ); +} + +if (isCliEntryPoint()) { + process.exitCode = main(); +} diff --git a/docs/case-studies/issue-82/evidence/templates/csharp/scripts/create-github-release.test.mjs b/docs/case-studies/issue-82/evidence/templates/csharp/scripts/create-github-release.test.mjs new file mode 100644 index 0000000..ce553fb --- /dev/null +++ b/docs/case-studies/issue-82/evidence/templates/csharp/scripts/create-github-release.test.mjs @@ -0,0 +1,239 @@ +import { describe, expect, test } from 'bun:test'; +import { + mkdirSync, + mkdtempSync, + rmSync, + writeFileSync, +} from 'node:fs'; +import { tmpdir } from 'node:os'; +import path from 'node:path'; + +import { + appendNuGetBadgeIfMissing, + buildNuGetBadge, + buildReleasePayload, + buildReleaseTag, + buildReleaseTitle, + findPackageId, + main, + normalizeReleaseVersion, + parseArgs, +} from './create-github-release.mjs'; + +describe('create-github-release helpers', () => { + test('parseArgs defaults to the C# release format and accepts package id', () => { + const config = parseArgs([ + '--release-version', + '1.2.3', + '--repository', + 'owner/repo', + '--package-id', + 'MyPackage', + ]); + + expect(config).toEqual({ + assetsGlob: '', + language: 'C#', + packageId: 'MyPackage', + releaseVersion: '1.2.3', + repository: 'owner/repo', + tagPrefix: 'csharp_v', + }); + }); + + test('normalizes release versions from legacy and language-prefixed tags', () => { + expect(normalizeReleaseVersion('csharp-v1.2.3')).toBe('1.2.3'); + expect(normalizeReleaseVersion('csharp_v1.2.3')).toBe('1.2.3'); + expect(normalizeReleaseVersion('v1.2.3')).toBe('1.2.3'); + expect(normalizeReleaseVersion('1.2.3-beta.1+build.7')).toBe( + '1.2.3-beta.1+build.7' + ); + }); + + test('builds C# release tags and titles from bare semver', () => { + expect(buildReleaseTag('csharp_v', '1.2.3')).toBe('csharp_v1.2.3'); + expect(buildReleaseTag('csharp_v', 'csharp-v1.2.3')).toBe( + 'csharp_v1.2.3' + ); + expect(buildReleaseTitle('C#', 'csharp_v1.2.3')).toBe('[C#] 1.2.3'); + }); + + test('appends a NuGet shields.io badge when release notes do not have one', () => { + const notes = appendNuGetBadgeIfMissing('- Fix release title', 'MyPackage'); + + expect(notes).toContain('- Fix release title'); + expect(notes).toContain( + '[![NuGet](https://img.shields.io/nuget/v/MyPackage.svg)]' + ); + expect(notes).toContain('https://www.nuget.org/packages/MyPackage'); + }); + + test('does not append a second badge when release notes already contain shields.io', () => { + const notes = appendNuGetBadgeIfMissing( + `${buildNuGetBadge('MyPackage')}\n\n- Existing badge`, + 'MyPackage' + ); + + expect(notes.match(/img\.shields\.io/g)).toHaveLength(1); + }); + + test('builds a GitHub release payload with C# title and NuGet badge', () => { + const payload = JSON.parse( + buildReleasePayload({ + changelog: '## [1.2.3] - 2026-05-09\n\n- Fix release metadata\n', + language: 'C#', + packageId: 'MyPackage', + releaseVersion: '1.2.3', + tagPrefix: 'csharp_v', + }) + ); + + expect(payload).toEqual({ + tag_name: 'csharp_v1.2.3', + name: '[C#] 1.2.3', + body: + '- Fix release metadata\n\n---\n\n' + + '[![NuGet](https://img.shields.io/nuget/v/MyPackage.svg)]' + + '(https://www.nuget.org/packages/MyPackage)', + }); + }); + + test('findPackageId reads PackageId from a project file', () => { + const projectRoot = mkdtempSync(path.join(tmpdir(), 'csharp-release-')); + try { + mkdirSync(path.join(projectRoot, 'src', 'Example'), { + recursive: true, + }); + writeFileSync( + path.join(projectRoot, 'src', 'Example', 'Example.csproj'), + 'Example.Package' + ); + + expect(findPackageId(projectRoot)).toBe('Example.Package'); + } finally { + rmSync(projectRoot, { force: true, recursive: true }); + } + }); + + test('uploads matching NuGet package assets after creating a release', () => { + const projectRoot = mkdtempSync(path.join(tmpdir(), 'csharp-release-')); + try { + mkdirSync(path.join(projectRoot, 'artifacts'), { recursive: true }); + writeFileSync( + path.join(projectRoot, 'CHANGELOG.md'), + '## [1.2.3] - 2026-05-12\n\n- Attach package assets\n' + ); + writeFileSync( + path.join(projectRoot, 'artifacts', 'MyPackage.1.2.3.nupkg'), + 'fake nupkg' + ); + writeFileSync( + path.join(projectRoot, 'artifacts', 'MyPackage.1.2.3.snupkg'), + 'symbols package' + ); + + const calls = []; + const stdoutMessages = []; + const stderrMessages = []; + const spawn = (command, args, options) => { + calls.push({ args, command, options }); + return { status: 0, stderr: '', stdout: '' }; + }; + + const exitCode = main({ + argv: [ + '--release-version', + '1.2.3', + '--repository', + 'owner/repo', + '--assets-glob', + 'artifacts/*.nupkg', + ], + cwd: projectRoot, + env: {}, + spawn, + stderr: (message) => stderrMessages.push(message), + stdout: (message) => stdoutMessages.push(message), + }); + + expect(exitCode).toBe(0); + expect(stderrMessages).toEqual([]); + expect(calls).toHaveLength(2); + expect(calls[0].command).toBe('gh'); + expect(calls[0].args).toEqual([ + 'api', + 'repos/owner/repo/releases', + '-X', + 'POST', + '--input', + '-', + ]); + expect(calls[1].command).toBe('gh'); + expect(calls[1].args).toEqual([ + 'release', + 'upload', + 'csharp_v1.2.3', + path.join(projectRoot, 'artifacts', 'MyPackage.1.2.3.nupkg'), + '--clobber', + '--repo', + 'owner/repo', + ]); + expect(stdoutMessages).toContain( + 'Uploading 1 release asset(s) to csharp_v1.2.3...' + ); + } finally { + rmSync(projectRoot, { force: true, recursive: true }); + } + }); + + test('uploads matching NuGet package assets when the release already exists', () => { + const projectRoot = mkdtempSync(path.join(tmpdir(), 'csharp-release-')); + try { + mkdirSync(path.join(projectRoot, 'artifacts'), { recursive: true }); + writeFileSync( + path.join(projectRoot, 'CHANGELOG.md'), + '## [1.2.3] - 2026-05-12\n\n- Attach package assets\n' + ); + writeFileSync( + path.join(projectRoot, 'artifacts', 'MyPackage.1.2.3.nupkg'), + 'fake nupkg' + ); + + const calls = []; + const stdoutMessages = []; + const spawn = (command, args, options) => { + calls.push({ args, command, options }); + if (args[0] === 'api') { + return { status: 1, stderr: 'already_exists', stdout: '' }; + } + + return { status: 0, stderr: '', stdout: '' }; + }; + + const exitCode = main({ + argv: [ + '--release-version', + '1.2.3', + '--repository', + 'owner/repo', + '--assets-glob', + 'artifacts/*.nupkg', + ], + cwd: projectRoot, + env: {}, + spawn, + stdout: (message) => stdoutMessages.push(message), + }); + + expect(exitCode).toBe(0); + expect(calls).toHaveLength(2); + expect(calls[1].args[0]).toBe('release'); + expect(calls[1].args[1]).toBe('upload'); + expect(stdoutMessages).toContain( + 'GitHub release already exists: csharp_v1.2.3, reconciling assets' + ); + } finally { + rmSync(projectRoot, { force: true, recursive: true }); + } + }); +}); diff --git a/docs/case-studies/issue-82/evidence/templates/csharp/scripts/detect-code-changes.mjs b/docs/case-studies/issue-82/evidence/templates/csharp/scripts/detect-code-changes.mjs new file mode 100644 index 0000000..fe3a8a7 --- /dev/null +++ b/docs/case-studies/issue-82/evidence/templates/csharp/scripts/detect-code-changes.mjs @@ -0,0 +1,204 @@ +#!/usr/bin/env node + +/** + * Detect code changes for CI/CD pipeline + * + * This script detects what types of files have changed between two commits + * and outputs the results for use in GitHub Actions workflow conditions. + * + * Key behavior: + * - For PRs: compares PR head against base branch + * - For pushes: compares HEAD against HEAD^ + * - Excludes certain folders and file types from "code changes" detection + * + * Excluded from code changes (don't require changesets): + * - Markdown files (*.md) in any folder + * - .changeset/ folder (changeset metadata) + * - docs/ folder (documentation) + * - experiments/ folder (experimental scripts) + * - examples/ folder (example scripts) + * + * Usage: + * bun run scripts/detect-code-changes.mjs + * + * Environment variables (set by GitHub Actions): + * - GITHUB_EVENT_NAME: 'pull_request' or 'push' + * - GITHUB_BASE_SHA: Base commit SHA for PR + * - GITHUB_HEAD_SHA: Head commit SHA for PR + * + * Outputs (written to GITHUB_OUTPUT): + * - cs-changed: 'true' if any .cs files changed + * - csproj-changed: 'true' if any .csproj files changed + * - sln-changed: 'true' if any .sln files changed + * - props-changed: 'true' if any .props files changed (Directory.Build.props etc.) + * - mjs-changed: 'true' if any .mjs files changed (scripts) + * - docs-changed: 'true' if any .md files changed + * - workflow-changed: 'true' if any .github/workflows/ files changed + * - any-code-changed: 'true' if any code files changed (excludes docs, changesets, experiments, examples) + */ + +import { execSync } from 'child_process'; +import { appendFileSync } from 'fs'; + +/** + * Execute a shell command and return trimmed output + * @param {string} command - The command to execute + * @returns {string} - The trimmed command output + */ +function exec(command) { + try { + return execSync(command, { encoding: 'utf-8' }).trim(); + } catch (error) { + console.error(`Error executing command: ${command}`); + console.error(error.message); + return ''; + } +} + +/** + * Write output to GitHub Actions output file + * @param {string} name - Output name + * @param {string} value - Output value + */ +function setOutput(name, value) { + const outputFile = process.env.GITHUB_OUTPUT; + if (outputFile) { + appendFileSync(outputFile, `${name}=${value}\n`); + } + console.log(`${name}=${value}`); +} + +/** + * Get the list of changed files between two commits + * @returns {string[]} Array of changed file paths + */ +function getChangedFiles() { + const eventName = process.env.GITHUB_EVENT_NAME || 'local'; + + if (eventName === 'pull_request') { + const baseSha = process.env.GITHUB_BASE_SHA; + const headSha = process.env.GITHUB_HEAD_SHA; + + if (baseSha && headSha) { + console.log(`Comparing PR: ${baseSha}...${headSha}`); + try { + // Ensure we have the base commit + try { + execSync(`git cat-file -e ${baseSha}`, { stdio: 'ignore' }); + } catch { + console.log('Base commit not available locally, attempting fetch...'); + execSync(`git fetch origin ${baseSha}`, { stdio: 'inherit' }); + } + const output = exec(`git diff --name-only ${baseSha} ${headSha}`); + return output ? output.split('\n').filter(Boolean) : []; + } catch (error) { + console.error(`Git diff failed: ${error.message}`); + } + } + } + + // For push events or fallback + console.log('Comparing HEAD^ to HEAD'); + try { + const output = exec('git diff --name-only HEAD^ HEAD'); + return output ? output.split('\n').filter(Boolean) : []; + } catch { + // If HEAD^ doesn't exist (first commit), list all files in HEAD + console.log('HEAD^ not available, listing all files in HEAD'); + const output = exec('git ls-tree --name-only -r HEAD'); + return output ? output.split('\n').filter(Boolean) : []; + } +} + +/** + * Check if a file should be excluded from code changes detection + * @param {string} filePath - The file path to check + * @returns {boolean} True if the file should be excluded + */ +function isExcludedFromCodeChanges(filePath) { + // Exclude markdown files in any folder + if (filePath.endsWith('.md')) { + return true; + } + + // Exclude specific folders from code changes + const excludedFolders = ['.changeset/', 'docs/', 'experiments/', 'examples/']; + + for (const folder of excludedFolders) { + if (filePath.startsWith(folder)) { + return true; + } + } + + return false; +} + +/** + * Main function to detect changes + */ +function detectChanges() { + console.log('Detecting file changes for CI/CD...\n'); + + const changedFiles = getChangedFiles(); + + console.log('Changed files:'); + if (changedFiles.length === 0) { + console.log(' (none)'); + } else { + changedFiles.forEach((file) => console.log(` ${file}`)); + } + console.log(''); + + // Detect .cs file changes (C# source files) + const csChanged = changedFiles.some((file) => file.endsWith('.cs')); + setOutput('cs-changed', csChanged ? 'true' : 'false'); + + // Detect .csproj file changes (project files) + const csprojChanged = changedFiles.some((file) => file.endsWith('.csproj')); + setOutput('csproj-changed', csprojChanged ? 'true' : 'false'); + + // Detect .sln file changes (solution files) + const slnChanged = changedFiles.some((file) => file.endsWith('.sln')); + setOutput('sln-changed', slnChanged ? 'true' : 'false'); + + // Detect .props file changes (Directory.Build.props, etc.) + const propsChanged = changedFiles.some((file) => file.endsWith('.props')); + setOutput('props-changed', propsChanged ? 'true' : 'false'); + + // Detect .mjs file changes (scripts) + const mjsChanged = changedFiles.some((file) => file.endsWith('.mjs')); + setOutput('mjs-changed', mjsChanged ? 'true' : 'false'); + + // Detect documentation changes (any .md file) + const docsChanged = changedFiles.some((file) => file.endsWith('.md')); + setOutput('docs-changed', docsChanged ? 'true' : 'false'); + + // Detect workflow changes + const workflowChanged = changedFiles.some((file) => + file.startsWith('.github/workflows/') + ); + setOutput('workflow-changed', workflowChanged ? 'true' : 'false'); + + // Detect code changes (excluding docs, changesets, experiments, examples folders, and markdown files) + const codeChangedFiles = changedFiles.filter( + (file) => !isExcludedFromCodeChanges(file) + ); + + console.log('\nFiles considered as code changes:'); + if (codeChangedFiles.length === 0) { + console.log(' (none)'); + } else { + codeChangedFiles.forEach((file) => console.log(` ${file}`)); + } + console.log(''); + + // Check if any code files changed (.cs, .csproj, .sln, .props, .mjs, .json, .yml, .yaml, or workflow files) + const codePattern = /\.(cs|csproj|sln|props|mjs|json|yml|yaml)$|\.github\/workflows\//; + const codeChanged = codeChangedFiles.some((file) => codePattern.test(file)); + setOutput('any-code-changed', codeChanged ? 'true' : 'false'); + + console.log('\nChange detection completed.'); +} + +// Run the detection +detectChanges(); diff --git a/docs/case-studies/issue-82/evidence/templates/csharp/scripts/merge-changesets.mjs b/docs/case-studies/issue-82/evidence/templates/csharp/scripts/merge-changesets.mjs new file mode 100644 index 0000000..c6476c2 --- /dev/null +++ b/docs/case-studies/issue-82/evidence/templates/csharp/scripts/merge-changesets.mjs @@ -0,0 +1,264 @@ +#!/usr/bin/env bun + +/** + * Merge multiple changeset files into a single changeset + * + * Key behavior: + * - Combines all pending changesets into a single changeset file + * - Uses the highest version bump type (major > minor > patch) + * - Preserves all descriptions in chronological order (by file modification time) + * - Removes the individual changeset files after merging + * - Does nothing if there's only one or no changesets + * + * This script is run before versioning to ensure a clean release + * even when multiple PRs have merged before a release cycle. + * + * IMPORTANT: Update the package name below to match your csproj + */ + +import { + readdirSync, + readFileSync, + writeFileSync, + unlinkSync, + statSync, +} from 'fs'; +import { join } from 'path'; + +// Package name must match the package name in the changeset files +const PACKAGE_NAME = 'MyPackage'; +const CHANGESET_DIR = '.changeset'; + +// Version bump type priority (higher number = higher priority) +const BUMP_PRIORITY = { + patch: 1, + minor: 2, + major: 3, +}; + +/** + * Generate a random changeset file name (similar to what @changesets/cli does) + * @returns {string} + */ +function generateChangesetName() { + const adjectives = [ + 'bright', + 'calm', + 'cool', + 'cyan', + 'dark', + 'fast', + 'gold', + 'good', + 'green', + 'happy', + 'kind', + 'loud', + 'neat', + 'nice', + 'pink', + 'proud', + 'quick', + 'red', + 'rich', + 'safe', + 'shy', + 'soft', + 'sweet', + 'tall', + 'warm', + 'wise', + 'young', + ]; + const nouns = [ + 'apple', + 'bird', + 'book', + 'car', + 'cat', + 'cloud', + 'desk', + 'dog', + 'door', + 'fish', + 'flower', + 'frog', + 'grass', + 'house', + 'key', + 'lake', + 'leaf', + 'moon', + 'mouse', + 'owl', + 'park', + 'rain', + 'river', + 'rock', + 'sea', + 'star', + 'sun', + 'tree', + 'wave', + 'wind', + ]; + + const randomAdjective = + adjectives[Math.floor(Math.random() * adjectives.length)]; + const randomNoun = nouns[Math.floor(Math.random() * nouns.length)]; + + return `${randomAdjective}-${randomNoun}`; +} + +/** + * Parse a changeset file and extract its metadata + * @param {string} filePath + * @returns {{type: string, description: string, mtime: Date} | null} + */ +function parseChangeset(filePath) { + try { + const content = readFileSync(filePath, 'utf-8'); + const stats = statSync(filePath); + + // Extract version type - support both quoted and unquoted package names + const versionTypeRegex = new RegExp( + `^['"]?${PACKAGE_NAME.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}['"]?:\\s+(major|minor|patch)`, + 'm' + ); + const versionTypeMatch = content.match(versionTypeRegex); + + if (!versionTypeMatch) { + console.warn( + `Warning: Could not parse version type from ${filePath}, skipping` + ); + return null; + } + + // Extract description + const parts = content.split('---'); + const description = + parts.length >= 3 ? parts.slice(2).join('---').trim() : ''; + + return { + type: versionTypeMatch[1], + description, + mtime: stats.mtime, + }; + } catch (error) { + console.warn(`Warning: Failed to parse ${filePath}: ${error.message}`); + return null; + } +} + +/** + * Get the highest priority bump type + * @param {string[]} types + * @returns {string} + */ +function getHighestBumpType(types) { + let highest = 'patch'; + for (const type of types) { + if (BUMP_PRIORITY[type] > BUMP_PRIORITY[highest]) { + highest = type; + } + } + return highest; +} + +/** + * Create a merged changeset file + * @param {string} type + * @param {string[]} descriptions + * @returns {string} + */ +function createMergedChangeset(type, descriptions) { + const combinedDescription = descriptions.join('\n\n'); + + return `--- +'${PACKAGE_NAME}': ${type} +--- + +${combinedDescription} +`; +} + +function main() { + console.log('Checking for multiple changesets to merge...'); + + // Get all changeset files + const changesetFiles = readdirSync(CHANGESET_DIR).filter( + (file) => + file.endsWith('.md') && file !== 'README.md' && file !== 'config.json' + ); + + console.log(`Found ${changesetFiles.length} changeset file(s)`); + + // If 0 or 1 changesets, nothing to merge + if (changesetFiles.length <= 1) { + console.log('No merging needed (0 or 1 changeset found)'); + return; + } + + console.log('Multiple changesets found, merging...'); + changesetFiles.forEach((file) => console.log(` - ${file}`)); + + // Parse all changesets + const parsedChangesets = []; + for (const file of changesetFiles) { + const filePath = join(CHANGESET_DIR, file); + const parsed = parseChangeset(filePath); + if (parsed) { + parsedChangesets.push({ + file, + filePath, + ...parsed, + }); + } + } + + if (parsedChangesets.length === 0) { + console.error('Error: No valid changesets could be parsed'); + process.exit(1); + } + + // Sort by modification time (oldest first) to preserve chronological order + parsedChangesets.sort((a, b) => a.mtime.getTime() - b.mtime.getTime()); + + // Determine the highest bump type + const bumpTypes = parsedChangesets.map((c) => c.type); + const highestBumpType = getHighestBumpType(bumpTypes); + + console.log(`\nMerge summary:`); + console.log(` Bump types found: ${[...new Set(bumpTypes)].join(', ')}`); + console.log(` Using highest: ${highestBumpType}`); + + // Collect descriptions in chronological order + const descriptions = parsedChangesets + .filter((c) => c.description) + .map((c) => c.description); + + console.log(` Descriptions to merge: ${descriptions.length}`); + + // Create merged changeset content + const mergedContent = createMergedChangeset(highestBumpType, descriptions); + + // Generate a unique name for the merged changeset + const mergedFileName = `merged-${generateChangesetName()}.md`; + const mergedFilePath = join(CHANGESET_DIR, mergedFileName); + + // Write the merged changeset + writeFileSync(mergedFilePath, mergedContent); + console.log(`\nCreated merged changeset: ${mergedFileName}`); + + // Remove the original changeset files + console.log('\nRemoving original changeset files:'); + for (const changeset of parsedChangesets) { + unlinkSync(changeset.filePath); + console.log(` Removed: ${changeset.file}`); + } + + console.log('\nChangeset merge completed successfully'); + console.log(`\nMerged changeset content:\n${mergedContent}`); +} + +main(); diff --git a/docs/case-studies/issue-82/evidence/templates/csharp/scripts/validate-changeset.mjs b/docs/case-studies/issue-82/evidence/templates/csharp/scripts/validate-changeset.mjs new file mode 100644 index 0000000..1d3f484 --- /dev/null +++ b/docs/case-studies/issue-82/evidence/templates/csharp/scripts/validate-changeset.mjs @@ -0,0 +1,268 @@ +#!/usr/bin/env bun + +/** + * Validate changeset for CI - ensures exactly one valid changeset is added by the PR + * + * Key behavior: + * - Only checks changeset files ADDED by the current PR (not pre-existing ones) + * - Uses git diff to compare PR head against base branch + * - Validates that the PR adds exactly one changeset with proper format + * - Falls back to checking all changesets for local development + * + * IMPORTANT: Update the package name below to match your csproj + */ + +import { execSync } from 'child_process'; +import { readFileSync, readdirSync, existsSync } from 'fs'; +import { join } from 'path'; + +// Package name must match the package name in the changeset files +const PACKAGE_NAME = 'MyPackage'; +const CHANGESET_DIR = '.changeset'; + +/** + * Ensure a git commit is available locally, fetching if necessary + * @param {string} sha The commit SHA to check + */ +function ensureCommitAvailable(sha) { + try { + execSync(`git cat-file -e ${sha}`, { stdio: 'ignore' }); + } catch { + console.log('Base commit not available locally, attempting fetch...'); + try { + execSync(`git fetch origin ${sha}`, { stdio: 'inherit' }); + } catch { + execSync(`git fetch origin`, { stdio: 'inherit' }); + } + } +} + +/** + * Parse git diff output and extract added changeset files + * @param {string} diffOutput Output from git diff --name-status + * @returns {string[]} Array of added changeset file names + */ +function parseAddedChangesets(diffOutput) { + const addedChangesets = []; + for (const line of diffOutput.trim().split('\n')) { + if (!line) { + continue; + } + const [status, filePath] = line.split('\t'); + if ( + status === 'A' && + filePath.startsWith(`${CHANGESET_DIR}/`) && + filePath.endsWith('.md') && + !filePath.endsWith('README.md') + ) { + addedChangesets.push(filePath.replace(`${CHANGESET_DIR}/`, '')); + } + } + return addedChangesets; +} + +/** + * Try to get changesets using explicit SHA comparison + * @param {string} baseSha Base commit SHA + * @param {string} headSha Head commit SHA + * @returns {string[] | null} Array of changeset files or null if failed + */ +function tryExplicitShaComparison(baseSha, headSha) { + console.log(`Comparing ${baseSha}...${headSha}`); + try { + ensureCommitAvailable(baseSha); + const diffOutput = execSync( + `git diff --name-status ${baseSha} ${headSha}`, + { encoding: 'utf-8' } + ); + return parseAddedChangesets(diffOutput); + } catch (error) { + console.log(`Git diff with explicit SHAs failed: ${error.message}`); + return null; + } +} + +/** + * Try to get changesets using base branch comparison + * @param {string} prBase Base branch name + * @returns {string[] | null} Array of changeset files or null if failed + */ +function tryBaseBranchComparison(prBase) { + console.log(`Comparing against base branch: ${prBase}`); + try { + try { + execSync(`git fetch origin ${prBase}`, { stdio: 'inherit' }); + } catch { + // Ignore fetch errors, we might already have it + } + const diffOutput = execSync( + `git diff --name-status origin/${prBase}...HEAD`, + { encoding: 'utf-8' } + ); + return parseAddedChangesets(diffOutput); + } catch (error) { + console.log(`Git diff with base ref failed: ${error.message}`); + return null; + } +} + +/** + * Fallback: get all changesets in directory + * @returns {string[]} Array of all changeset file names + */ +function getAllChangesets() { + console.log( + 'Warning: Could not determine PR diff, checking all changesets in directory' + ); + if (!existsSync(CHANGESET_DIR)) { + return []; + } + return readdirSync(CHANGESET_DIR).filter( + (file) => + file.endsWith('.md') && file !== 'README.md' && file !== 'config.json' + ); +} + +/** + * Get changeset files added in the current PR using git diff + * @returns {string[]} Array of added changeset file names + */ +function getAddedChangesetFiles() { + const baseSha = process.env.GITHUB_BASE_SHA || process.env.BASE_SHA; + const headSha = process.env.GITHUB_HEAD_SHA || process.env.HEAD_SHA; + + // Try explicit SHAs first + if (baseSha && headSha) { + const result = tryExplicitShaComparison(baseSha, headSha); + if (result !== null) { + return result; + } + } + + // Try base branch comparison + const prBase = process.env.GITHUB_BASE_REF; + if (prBase) { + const result = tryBaseBranchComparison(prBase); + if (result !== null) { + return result; + } + } + + // Fallback to checking all changesets + return getAllChangesets(); +} + +/** + * Validate a single changeset file + * @param {string} filePath Full path to the changeset file + * @returns {{valid: boolean, type?: string, description?: string, error?: string}} + */ +function validateChangesetFile(filePath) { + try { + const content = readFileSync(filePath, 'utf-8'); + + // Check if changeset has a valid type (major, minor, or patch) + const versionTypeRegex = new RegExp( + `^['"]${PACKAGE_NAME.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}['"]:\\s+(major|minor|patch)`, + 'm' + ); + const versionTypeMatch = content.match(versionTypeRegex); + + if (!versionTypeMatch) { + return { + valid: false, + error: `Changeset must specify a version type: major, minor, or patch\nExpected format:\n---\n'${PACKAGE_NAME}': patch\n---\n\nYour description here`, + }; + } + + // Extract description (everything after the closing ---) and check it's not empty + const parts = content.split('---'); + if (parts.length < 3) { + return { + valid: false, + error: + "Changeset must include a description of the changes (after the closing '---')", + }; + } + + const description = parts.slice(2).join('---').trim(); + if (!description) { + return { + valid: false, + error: 'Changeset must include a non-empty description of the changes', + }; + } + + return { + valid: true, + type: versionTypeMatch[1], + description, + }; + } catch (error) { + return { + valid: false, + error: `Failed to read changeset file: ${error.message}`, + }; + } +} + +try { + console.log('Validating changesets added by this PR...'); + + // Get changeset files added in this PR + const addedChangesetFiles = getAddedChangesetFiles(); + const changesetCount = addedChangesetFiles.length; + + console.log(`Found ${changesetCount} changeset file(s) added by this PR`); + if (changesetCount > 0) { + console.log('Added changesets:'); + addedChangesetFiles.forEach((file) => console.log(` - ${file}`)); + } + + // Ensure exactly one changeset file was added + if (changesetCount === 0) { + console.error( + '::error::No changeset found in this PR. Please add a changeset file in .changeset/ directory.' + ); + console.error('\nTo create a changeset, add a file like .changeset/my-change.md with:'); + console.error(`---\n'${PACKAGE_NAME}': patch\n---\n\nDescription of your changes`); + process.exit(1); + } else if (changesetCount > 1) { + console.error( + `::error::Multiple changesets found in this PR (${changesetCount}). Each PR should add exactly ONE changeset.` + ); + console.error('::error::Found changeset files added by this PR:'); + addedChangesetFiles.forEach((file) => console.error(` ${file}`)); + console.error( + '\n::error::Please combine these into a single changeset or remove the extras.' + ); + process.exit(1); + } + + // Validate the single changeset file + const changesetFile = join(CHANGESET_DIR, addedChangesetFiles[0]); + console.log(`Validating changeset: ${changesetFile}`); + + const validation = validateChangesetFile(changesetFile); + + if (!validation.valid) { + console.error(`::error::${validation.error}`); + console.error(`\nFile content of ${changesetFile}:`); + try { + console.error(readFileSync(changesetFile, 'utf-8')); + } catch { + console.error('(could not read file)'); + } + process.exit(1); + } + + console.log('Changeset validation passed'); + console.log(` Type: ${validation.type}`); + console.log(` Description: ${validation.description}`); +} catch (error) { + console.error('Error during changeset validation:', error.message); + if (process.env.DEBUG) { + console.error('Stack trace:', error.stack); + } + process.exit(1); +} diff --git a/docs/case-studies/issue-82/evidence/templates/csharp/scripts/version-and-commit.mjs b/docs/case-studies/issue-82/evidence/templates/csharp/scripts/version-and-commit.mjs new file mode 100644 index 0000000..1c490a3 --- /dev/null +++ b/docs/case-studies/issue-82/evidence/templates/csharp/scripts/version-and-commit.mjs @@ -0,0 +1,414 @@ +#!/usr/bin/env node + +/** + * Bump version in csproj, update changelog, and commit changes + * Used by the CI/CD pipeline for releases + * + * Usage: + * Changeset mode: bun run scripts/version-and-commit.mjs --mode changeset + * Instant mode: bun run scripts/version-and-commit.mjs --mode instant --bump-type [--description ] + */ + +import { + readFileSync, + writeFileSync, + appendFileSync, + readdirSync, + existsSync, + unlinkSync, +} from 'fs'; +import { join } from 'path'; +import { execSync } from 'child_process'; + +// Package name must match the package name in the changeset files +const PACKAGE_NAME = 'MyPackage'; +const CSPROJ_PATH = 'src/MyPackage/MyPackage.csproj'; +const CHANGESET_DIR = '.changeset'; +const CHANGELOG_FILE = 'CHANGELOG.md'; + +// Version bump type priority (higher number = higher priority) +const BUMP_PRIORITY = { + patch: 1, + minor: 2, + major: 3, +}; + +// Simple argument parsing +const args = process.argv.slice(2); +const getArg = (name) => { + const index = args.indexOf(`--${name}`); + if (index === -1) return null; + return args[index + 1] || ''; +}; + +const mode = getArg('mode') || 'instant'; +const bumpTypeArg = getArg('bump-type'); +const description = getArg('description') || ''; + +/** + * Execute a shell command + * @param {string} command + * @param {boolean} silent + * @returns {string} + */ +function exec(command, silent = false) { + try { + return execSync(command, { encoding: 'utf-8', stdio: silent ? 'pipe' : 'inherit' }); + } catch (error) { + if (silent) return ''; + throw error; + } +} + +/** + * Append to GitHub Actions output file + * @param {string} key + * @param {string} value + */ +function setOutput(key, value) { + const outputFile = process.env.GITHUB_OUTPUT; + if (outputFile) { + appendFileSync(outputFile, `${key}=${value}\n`); + } + console.log(`Output: ${key}=${value}`); +} + +/** + * Get current version from csproj + * @returns {{major: number, minor: number, patch: number}} + */ +function getCurrentVersion() { + const csproj = readFileSync(CSPROJ_PATH, 'utf-8'); + const match = csproj.match(/(\d+)\.(\d+)\.(\d+)<\/Version>/); + + if (!match) { + console.error('Error: Could not parse version from csproj'); + process.exit(1); + } + + return { + major: parseInt(match[1], 10), + minor: parseInt(match[2], 10), + patch: parseInt(match[3], 10), + }; +} + +/** + * Calculate new version based on bump type + * @param {{major: number, minor: number, patch: number}} current + * @param {string} bumpType + * @returns {string} + */ +function calculateNewVersion(current, bumpType) { + const { major, minor, patch } = current; + + switch (bumpType) { + case 'major': + return `${major + 1}.0.0`; + case 'minor': + return `${major}.${minor + 1}.0`; + case 'patch': + return `${major}.${minor}.${patch + 1}`; + default: + throw new Error(`Invalid bump type: ${bumpType}`); + } +} + +/** + * Update version in csproj + * @param {string} newVersion + */ +function updateCsproj(newVersion) { + let csproj = readFileSync(CSPROJ_PATH, 'utf-8'); + csproj = csproj.replace( + /[^<]+<\/Version>/, + `${newVersion}` + ); + writeFileSync(CSPROJ_PATH, csproj, 'utf-8'); + console.log(`Updated csproj to version ${newVersion}`); +} + +/** + * Check if a git tag exists for this version + * @param {string} version + * @returns {boolean} + */ +function checkTagExists(version) { + try { + exec(`git rev-parse v${version}`, true); + return true; + } catch { + return false; + } +} + +/** + * Parse a changeset file and extract its metadata + * @param {string} filePath + * @returns {{type: string, description: string} | null} + */ +function parseChangeset(filePath) { + try { + const content = readFileSync(filePath, 'utf-8'); + + // Extract version type - support both quoted and unquoted package names + const versionTypeRegex = new RegExp( + `^['"]?${PACKAGE_NAME.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}['"]?:\\s+(major|minor|patch)`, + 'm' + ); + const versionTypeMatch = content.match(versionTypeRegex); + + if (!versionTypeMatch) { + console.warn(`Warning: Could not parse version type from ${filePath}`); + return null; + } + + // Extract description + const parts = content.split('---'); + const desc = parts.length >= 3 ? parts.slice(2).join('---').trim() : ''; + + return { + type: versionTypeMatch[1], + description: desc, + }; + } catch (error) { + console.warn(`Warning: Failed to parse ${filePath}: ${error.message}`); + return null; + } +} + +/** + * Get the highest priority bump type + * @param {string[]} types + * @returns {string} + */ +function getHighestBumpType(types) { + let highest = 'patch'; + for (const type of types) { + if (BUMP_PRIORITY[type] > BUMP_PRIORITY[highest]) { + highest = type; + } + } + return highest; +} + +/** + * Get changeset files from .changeset directory + * @returns {string[]} + */ +function getChangesetFiles() { + if (!existsSync(CHANGESET_DIR)) { + return []; + } + return readdirSync(CHANGESET_DIR).filter( + (file) => + file.endsWith('.md') && file !== 'README.md' && file !== 'config.json' + ); +} + +/** + * Process changesets and return bump type and descriptions + * @returns {{bumpType: string, descriptions: string[]} | null} + */ +function processChangesets() { + const files = getChangesetFiles(); + + if (files.length === 0) { + console.log('No changeset files found'); + return null; + } + + console.log(`Found ${files.length} changeset file(s)`); + + const parsedChangesets = []; + for (const file of files) { + const filePath = join(CHANGESET_DIR, file); + const parsed = parseChangeset(filePath); + if (parsed) { + parsedChangesets.push({ + file, + filePath, + ...parsed, + }); + } + } + + if (parsedChangesets.length === 0) { + console.log('No valid changesets could be parsed'); + return null; + } + + const bumpTypes = parsedChangesets.map((c) => c.type); + const highestBumpType = getHighestBumpType(bumpTypes); + const descriptions = parsedChangesets + .filter((c) => c.description) + .map((c) => c.description); + + console.log(`Bump types found: ${[...new Set(bumpTypes)].join(', ')}`); + console.log(`Using highest: ${highestBumpType}`); + + return { + bumpType: highestBumpType, + descriptions, + }; +} + +/** + * Update CHANGELOG.md with new version entry + * @param {string} version + * @param {string[]} descriptions + */ +function updateChangelog(version, descriptions) { + const dateStr = new Date().toISOString().split('T')[0]; + const content = descriptions.join('\n\n'); + const newEntry = `\n## [${version}] - ${dateStr}\n\n${content}\n`; + + if (existsSync(CHANGELOG_FILE)) { + let changelog = readFileSync(CHANGELOG_FILE, 'utf-8'); + const lines = changelog.split('\n'); + let insertIndex = -1; + + // Find the first version entry + for (let i = 0; i < lines.length; i++) { + if (lines[i].startsWith('## [')) { + insertIndex = i; + break; + } + } + + if (insertIndex >= 0) { + lines.splice(insertIndex, 0, newEntry); + changelog = lines.join('\n'); + } else { + // No existing version entries, append after header + changelog += newEntry; + } + + writeFileSync(CHANGELOG_FILE, changelog, 'utf-8'); + console.log(`Updated CHANGELOG.md with version ${version}`); + } else { + // Create new changelog file + const newChangelog = `# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +${newEntry}`; + writeFileSync(CHANGELOG_FILE, newChangelog, 'utf-8'); + console.log(`Created CHANGELOG.md with version ${version}`); + } +} + +/** + * Remove processed changeset files + */ +function removeChangesetFiles() { + const files = getChangesetFiles(); + for (const file of files) { + const filePath = join(CHANGESET_DIR, file); + unlinkSync(filePath); + console.log(`Removed changeset: ${file}`); + } +} + +try { + // Configure git + exec('git config user.name "github-actions[bot]"'); + exec('git config user.email "github-actions[bot]@users.noreply.github.com"'); + + let bumpType; + let descriptions = []; + + if (mode === 'changeset') { + // Changeset mode: get bump type from changesets + const result = processChangesets(); + if (!result) { + console.log('No changesets to process, exiting'); + setOutput('version_committed', 'false'); + setOutput('already_released', 'false'); + process.exit(0); + } + bumpType = result.bumpType; + descriptions = result.descriptions; + } else if (mode === 'instant') { + // Instant mode: use provided bump type + if (!bumpTypeArg || !['major', 'minor', 'patch'].includes(bumpTypeArg)) { + console.error( + 'Usage: bun run scripts/version-and-commit.mjs --mode instant --bump-type [--description ]' + ); + process.exit(1); + } + bumpType = bumpTypeArg; + if (description) { + descriptions = [description]; + } + } else { + console.error('Invalid mode. Use --mode changeset or --mode instant'); + process.exit(1); + } + + const current = getCurrentVersion(); + const newVersion = calculateNewVersion(current, bumpType); + + // Check if this version was already released + if (checkTagExists(newVersion)) { + console.log(`Tag v${newVersion} already exists`); + setOutput('already_released', 'true'); + setOutput('new_version', newVersion); + process.exit(0); + } + + // Update version in csproj + updateCsproj(newVersion); + + // Update changelog if we have descriptions + if (descriptions.length > 0) { + updateChangelog(newVersion, descriptions); + } + + // Remove changeset files (only in changeset mode) + if (mode === 'changeset') { + removeChangesetFiles(); + } + + // Stage all changed files + exec(`git add ${CSPROJ_PATH} ${CHANGELOG_FILE} ${CHANGESET_DIR}/`); + + // Check if there are changes to commit + try { + exec('git diff --cached --quiet', true); + // No changes to commit + console.log('No changes to commit'); + setOutput('version_committed', 'false'); + setOutput('new_version', newVersion); + process.exit(0); + } catch { + // There are changes to commit (git diff exits with 1 when there are differences) + } + + // Commit changes + const commitMsg = description + ? `chore: release v${newVersion}\n\n${description}` + : `chore: release v${newVersion}`; + exec(`git commit -m "${commitMsg.replace(/"/g, '\\"')}"`); + console.log(`Committed version ${newVersion}`); + + // Create tag + const tagMsg = description + ? `Release v${newVersion}\n\n${description}` + : `Release v${newVersion}`; + exec(`git tag -a v${newVersion} -m "${tagMsg.replace(/"/g, '\\"')}"`); + console.log(`Created tag v${newVersion}`); + + // Push changes and tag + exec('git push'); + exec('git push --tags'); + console.log('Pushed changes and tags'); + + setOutput('version_committed', 'true'); + setOutput('new_version', newVersion); +} catch (error) { + console.error('Error:', error.message); + process.exit(1); +} diff --git a/docs/case-studies/issue-82/evidence/templates/csharp/workflows/release.yml b/docs/case-studies/issue-82/evidence/templates/csharp/workflows/release.yml new file mode 100644 index 0000000..7bc4bed --- /dev/null +++ b/docs/case-studies/issue-82/evidence/templates/csharp/workflows/release.yml @@ -0,0 +1,487 @@ +name: CI/CD Pipeline + +on: + push: + branches: + - main + pull_request: + types: [opened, synchronize, reopened] + workflow_dispatch: + inputs: + release_mode: + description: 'Release mode' + required: true + type: choice + default: 'instant' + options: + - instant + - changeset-pr + bump_type: + description: 'Version bump type' + required: true + type: choice + options: + - patch + - minor + - major + description: + description: 'Release description (optional)' + required: false + type: string + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +env: + DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true + DOTNET_CLI_TELEMETRY_OPTOUT: true + DOTNET_NOLOGO: true + +jobs: + # === DETECT CHANGES - determines which jobs should run === + detect-changes: + name: Detect Changes + runs-on: ubuntu-latest + if: github.event_name != 'workflow_dispatch' + outputs: + cs-changed: ${{ steps.changes.outputs.cs-changed }} + csproj-changed: ${{ steps.changes.outputs.csproj-changed }} + sln-changed: ${{ steps.changes.outputs.sln-changed }} + props-changed: ${{ steps.changes.outputs.props-changed }} + mjs-changed: ${{ steps.changes.outputs.mjs-changed }} + docs-changed: ${{ steps.changes.outputs.docs-changed }} + workflow-changed: ${{ steps.changes.outputs.workflow-changed }} + any-code-changed: ${{ steps.changes.outputs.any-code-changed }} + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup Bun + uses: oven-sh/setup-bun@v2 + with: + bun-version: latest + + - name: Detect changes + id: changes + env: + GITHUB_EVENT_NAME: ${{ github.event_name }} + GITHUB_BASE_SHA: ${{ github.event.pull_request.base.sha }} + GITHUB_HEAD_SHA: ${{ github.event.pull_request.head.sha }} + run: bun run scripts/detect-code-changes.mjs + + # === CHANGESET CHECK - only runs on PRs with code changes === + # Docs-only PRs (./docs folder, markdown files) don't require changesets + changeset-check: + name: Changeset Validation + runs-on: ubuntu-latest + needs: [detect-changes] + if: github.event_name == 'pull_request' && needs.detect-changes.outputs.any-code-changed == 'true' + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup Bun + uses: oven-sh/setup-bun@v2 + with: + bun-version: latest + + - name: Validate changeset + env: + GITHUB_BASE_REF: ${{ github.base_ref }} + GITHUB_BASE_SHA: ${{ github.event.pull_request.base.sha }} + GITHUB_HEAD_SHA: ${{ github.event.pull_request.head.sha }} + run: | + # Skip changeset check for automated release PRs + if [[ "${{ github.head_ref }}" == "changeset-release/"* ]] || [[ "${{ github.head_ref }}" == "changeset-manual-release-"* ]]; then + echo "Skipping changeset check for automated release PR" + exit 0 + fi + + # Run changeset validation script + bun run scripts/validate-changeset.mjs + + # === LINT AND FORMAT CHECK === + # Lint runs independently of changeset-check - it's a fast check that should always run + # See: https://github.com/link-foundation/js-ai-driven-development-pipeline-template/pull/18 for why this dependency was removed + lint: + name: Lint and Format Check + runs-on: ubuntu-latest + needs: [detect-changes] + if: | + github.event_name == 'push' || + github.event_name == 'workflow_dispatch' || + needs.detect-changes.outputs.cs-changed == 'true' || + needs.detect-changes.outputs.csproj-changed == 'true' || + needs.detect-changes.outputs.sln-changed == 'true' || + needs.detect-changes.outputs.props-changed == 'true' || + needs.detect-changes.outputs.mjs-changed == 'true' || + needs.detect-changes.outputs.docs-changed == 'true' || + needs.detect-changes.outputs.workflow-changed == 'true' + steps: + - uses: actions/checkout@v4 + + - name: Setup .NET + uses: actions/setup-dotnet@v4 + with: + dotnet-version: '8.0.x' + + - name: Setup Bun + uses: oven-sh/setup-bun@v2 + with: + bun-version: latest + + - name: Restore dependencies + run: dotnet restore + + - name: Check formatting + run: dotnet format --verify-no-changes --verbosity diagnostic + + - name: Build with warnings as errors + run: dotnet build --no-restore --configuration Release /warnaserror + + - name: Run script tests + run: bun test scripts/*.test.mjs + + - name: Check file size limit + run: bun run scripts/check-file-size.mjs + + # === TEST ON MULTIPLE OS === + test: + name: Test (${{ matrix.os }}) + runs-on: ${{ matrix.os }} + needs: [detect-changes, changeset-check] + # Run if: push event, workflow_dispatch, OR changeset-check succeeded, OR changeset-check was skipped (docs-only PR) + if: always() && (github.event_name == 'push' || github.event_name == 'workflow_dispatch' || needs.changeset-check.result == 'success' || needs.changeset-check.result == 'skipped') + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, macos-latest, windows-latest] + steps: + - uses: actions/checkout@v4 + + - name: Setup .NET + uses: actions/setup-dotnet@v4 + with: + dotnet-version: '8.0.x' + + - name: Restore dependencies + run: dotnet restore + + - name: Build + run: dotnet build --no-restore --configuration Release + + - name: Run tests + run: dotnet test --no-build --configuration Release --verbosity normal --collect:"XPlat Code Coverage" + + - name: Upload coverage to Codecov + if: matrix.os == 'ubuntu-latest' + uses: codecov/codecov-action@v4 + with: + fail_ci_if_error: false + + # === BUILD PACKAGE === + # Only runs if lint and test pass + build: + name: Build Package + runs-on: ubuntu-latest + needs: [lint, test] + if: always() && needs.lint.result == 'success' && needs.test.result == 'success' + steps: + - uses: actions/checkout@v4 + + - name: Setup .NET + uses: actions/setup-dotnet@v4 + with: + dotnet-version: '8.0.x' + + - name: Restore dependencies + run: dotnet restore + + - name: Build Release + run: dotnet build --no-restore --configuration Release + + - name: Pack NuGet package + run: dotnet pack --no-build --configuration Release --output ./artifacts + + - name: Upload artifacts + uses: actions/upload-artifact@v4 + with: + name: nuget-package + path: ./artifacts/*.nupkg + + # === AUTOMATIC RELEASE === + # Runs on push to main using changesets + release: + name: Release + needs: [lint, test, build] + if: always() && github.ref == 'refs/heads/main' && github.event_name == 'push' && needs.lint.result == 'success' && needs.test.result == 'success' && needs.build.result == 'success' + runs-on: ubuntu-latest + permissions: + contents: write + packages: write + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup .NET + uses: actions/setup-dotnet@v4 + with: + dotnet-version: '8.0.x' + + - name: Setup Bun + uses: oven-sh/setup-bun@v2 + with: + bun-version: latest + + - name: Check for changesets + id: check_changesets + run: | + # Count changeset files (excluding README.md and config.json) + CHANGESET_COUNT=$(find .changeset -name "*.md" ! -name "README.md" 2>/dev/null | wc -l) + echo "Found $CHANGESET_COUNT changeset file(s)" + echo "has_changesets=$([[ $CHANGESET_COUNT -gt 0 ]] && echo 'true' || echo 'false')" >> $GITHUB_OUTPUT + echo "changeset_count=$CHANGESET_COUNT" >> $GITHUB_OUTPUT + + - name: Merge multiple changesets + if: steps.check_changesets.outputs.has_changesets == 'true' && steps.check_changesets.outputs.changeset_count > 1 + run: | + echo "Multiple changesets detected, merging..." + bun run scripts/merge-changesets.mjs + + - name: Version and commit + if: steps.check_changesets.outputs.has_changesets == 'true' + id: version + run: bun run scripts/version-and-commit.mjs --mode changeset + + - name: Build release package + if: steps.version.outputs.version_committed == 'true' + run: | + dotnet restore + dotnet build --configuration Release + dotnet pack --no-build --configuration Release --output ./artifacts + + - name: Resolve NuGet package id + if: steps.version.outputs.version_committed == 'true' + id: package + run: | + PACKAGE_ID=$(dotnet msbuild src/MyPackage/MyPackage.csproj -getProperty:PackageId | tail -n 1 | tr -d '\r') + if [ -z "$PACKAGE_ID" ]; then + PACKAGE_ID=$(dotnet msbuild src/MyPackage/MyPackage.csproj -getProperty:AssemblyName | tail -n 1 | tr -d '\r') + fi + if [ -z "$PACKAGE_ID" ]; then + PACKAGE_ID="MyPackage" + fi + PACKAGE_ID_LOWER=$(echo "$PACKAGE_ID" | tr '[:upper:]' '[:lower:]') + echo "id=$PACKAGE_ID" >> "$GITHUB_OUTPUT" + echo "flat_container_id=$PACKAGE_ID_LOWER" >> "$GITHUB_OUTPUT" + + - name: Publish to NuGet + id: nuget_publish + if: steps.version.outputs.version_committed == 'true' + env: + NUGET_API_KEY: ${{ secrets.NUGET_API_KEY }} + run: | + if [ -n "$NUGET_API_KEY" ]; then + dotnet nuget push ./artifacts/*.nupkg --api-key $NUGET_API_KEY --source https://api.nuget.org/v3/index.json --skip-duplicate + echo "published=true" >> "$GITHUB_OUTPUT" + else + echo "NUGET_API_KEY not set, skipping NuGet publish" + echo "published=false" >> "$GITHUB_OUTPUT" + fi + + - name: Verify package on NuGet + if: steps.version.outputs.version_committed == 'true' && steps.nuget_publish.outputs.published == 'true' + run: | + PACKAGE_ID="${{ steps.package.outputs.id }}" + PACKAGE_ID_LOWER="${{ steps.package.outputs.flat_container_id }}" + VERSION="${{ steps.version.outputs.new_version }}" + for DELAY in 0 5 10 20 30 60; do + if [ "$DELAY" != "0" ]; then + sleep "$DELAY" + fi + STATUS=$(curl -sS -o /dev/null -w '%{http_code}' "https://api.nuget.org/v3-flatcontainer/${PACKAGE_ID_LOWER}/${VERSION}/${PACKAGE_ID_LOWER}.nuspec" || true) + echo "NuGet status for ${PACKAGE_ID}@${VERSION}: ${STATUS}" + if [ "$STATUS" = "200" ]; then + echo "Verified ${PACKAGE_ID}@${VERSION} is available on NuGet" + exit 0 + fi + done + echo "::error title=NuGet verification failed::${PACKAGE_ID}@${VERSION} was not available from NuGet after publish." + exit 1 + + - name: Create GitHub Release + if: steps.version.outputs.version_committed == 'true' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + bun run scripts/create-github-release.mjs \ + --release-version "${{ steps.version.outputs.new_version }}" \ + --repository "${{ github.repository }}" \ + --tag-prefix "csharp_v" \ + --language "C#" \ + --package-id "${{ steps.package.outputs.id }}" \ + --assets-glob "./artifacts/*.nupkg" + + # === MANUAL INSTANT RELEASE === + # Triggered via workflow_dispatch with instant mode + instant-release: + name: Instant Release + needs: [lint, test, build] + if: github.event_name == 'workflow_dispatch' && github.event.inputs.release_mode == 'instant' && needs.lint.result == 'success' && needs.test.result == 'success' && needs.build.result == 'success' + runs-on: ubuntu-latest + permissions: + contents: write + packages: write + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + token: ${{ secrets.GITHUB_TOKEN }} + + - name: Setup .NET + uses: actions/setup-dotnet@v4 + with: + dotnet-version: '8.0.x' + + - name: Setup Bun + uses: oven-sh/setup-bun@v2 + with: + bun-version: latest + + - name: Version and commit + id: version + run: | + bun run scripts/version-and-commit.mjs \ + --mode instant \ + --bump-type "${{ github.event.inputs.bump_type }}" \ + --description "${{ github.event.inputs.description }}" + + - name: Build package + if: steps.version.outputs.version_committed == 'true' + run: | + dotnet restore + dotnet build --configuration Release + dotnet pack --no-build --configuration Release --output ./artifacts + + - name: Resolve NuGet package id + if: steps.version.outputs.version_committed == 'true' + id: package + run: | + PACKAGE_ID=$(dotnet msbuild src/MyPackage/MyPackage.csproj -getProperty:PackageId | tail -n 1 | tr -d '\r') + if [ -z "$PACKAGE_ID" ]; then + PACKAGE_ID=$(dotnet msbuild src/MyPackage/MyPackage.csproj -getProperty:AssemblyName | tail -n 1 | tr -d '\r') + fi + if [ -z "$PACKAGE_ID" ]; then + PACKAGE_ID="MyPackage" + fi + PACKAGE_ID_LOWER=$(echo "$PACKAGE_ID" | tr '[:upper:]' '[:lower:]') + echo "id=$PACKAGE_ID" >> "$GITHUB_OUTPUT" + echo "flat_container_id=$PACKAGE_ID_LOWER" >> "$GITHUB_OUTPUT" + + - name: Publish to NuGet + id: nuget_publish + if: steps.version.outputs.version_committed == 'true' + env: + NUGET_API_KEY: ${{ secrets.NUGET_API_KEY }} + run: | + if [ -n "$NUGET_API_KEY" ]; then + dotnet nuget push ./artifacts/*.nupkg --api-key $NUGET_API_KEY --source https://api.nuget.org/v3/index.json --skip-duplicate + echo "published=true" >> "$GITHUB_OUTPUT" + else + echo "NUGET_API_KEY not set, skipping NuGet publish" + echo "published=false" >> "$GITHUB_OUTPUT" + fi + + - name: Verify package on NuGet + if: steps.version.outputs.version_committed == 'true' && steps.nuget_publish.outputs.published == 'true' + run: | + PACKAGE_ID="${{ steps.package.outputs.id }}" + PACKAGE_ID_LOWER="${{ steps.package.outputs.flat_container_id }}" + VERSION="${{ steps.version.outputs.new_version }}" + for DELAY in 0 5 10 20 30 60; do + if [ "$DELAY" != "0" ]; then + sleep "$DELAY" + fi + STATUS=$(curl -sS -o /dev/null -w '%{http_code}' "https://api.nuget.org/v3-flatcontainer/${PACKAGE_ID_LOWER}/${VERSION}/${PACKAGE_ID_LOWER}.nuspec" || true) + echo "NuGet status for ${PACKAGE_ID}@${VERSION}: ${STATUS}" + if [ "$STATUS" = "200" ]; then + echo "Verified ${PACKAGE_ID}@${VERSION} is available on NuGet" + exit 0 + fi + done + echo "::error title=NuGet verification failed::${PACKAGE_ID}@${VERSION} was not available from NuGet after publish." + exit 1 + + - name: Create GitHub Release + if: steps.version.outputs.version_committed == 'true' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + bun run scripts/create-github-release.mjs \ + --release-version "${{ steps.version.outputs.new_version }}" \ + --repository "${{ github.repository }}" \ + --tag-prefix "csharp_v" \ + --language "C#" \ + --package-id "${{ steps.package.outputs.id }}" \ + --assets-glob "./artifacts/*.nupkg" + + # === MANUAL CHANGESET PR === + # Creates a pull request with the changeset for review + changeset-pr: + name: Create Changeset PR + if: github.event_name == 'workflow_dispatch' && github.event.inputs.release_mode == 'changeset-pr' + runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup Bun + uses: oven-sh/setup-bun@v2 + with: + bun-version: latest + + - name: Create changeset file + run: | + CHANGESET_ID=$(date +%s) + CHANGESET_FILE=".changeset/manual-release-${CHANGESET_ID}.md" + + cat > "$CHANGESET_FILE" << 'EOF' + --- + 'MyPackage': ${{ github.event.inputs.bump_type }} + --- + + ${{ github.event.inputs.description || 'Manual release' }} + EOF + + echo "Created changeset: $CHANGESET_FILE" + + - name: Create Pull Request + uses: peter-evans/create-pull-request@v7 + with: + token: ${{ secrets.GITHUB_TOKEN }} + commit-message: 'chore: add changeset for manual ${{ github.event.inputs.bump_type }} release' + branch: changeset-manual-release-${{ github.run_id }} + delete-branch: true + title: 'chore: manual ${{ github.event.inputs.bump_type }} release' + body: | + ## Manual Release Request + + This PR was created by a manual workflow trigger to prepare a **${{ github.event.inputs.bump_type }}** release. + + ### Release Details + - **Type:** ${{ github.event.inputs.bump_type }} + - **Description:** ${{ github.event.inputs.description || 'Manual release' }} + - **Triggered by:** @${{ github.actor }} + + ### Next Steps + 1. Review the changeset in this PR + 2. Merge this PR to main + 3. The automated release workflow will version, publish, and create a GitHub release diff --git a/docs/case-studies/issue-82/evidence/templates/js/example-app.yml b/docs/case-studies/issue-82/evidence/templates/js/example-app.yml new file mode 100644 index 0000000..6a81458 --- /dev/null +++ b/docs/case-studies/issue-82/evidence/templates/js/example-app.yml @@ -0,0 +1,187 @@ +name: Example app + +on: + pull_request: + types: [opened, synchronize, reopened] + paths: + - 'examples/universal-app/**' + - 'src/**' + - 'package.json' + - 'package-lock.json' + - '.github/workflows/example-app.yml' + push: + branches: + - main + paths: + - 'examples/universal-app/**' + - 'src/**' + - 'package.json' + - 'package-lock.json' + - '.github/workflows/example-app.yml' + workflow_dispatch: + +permissions: + contents: read + pages: write + id-token: write + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: ${{ github.ref == 'refs/heads/main' }} + +jobs: + web-build: + name: Build web app + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - uses: actions/checkout@v6 + + - name: Setup Node.js + uses: actions/setup-node@v6 + with: + node-version: '24.x' + cache: npm + cache-dependency-path: examples/universal-app/package-lock.json + + - name: Configure GitHub Pages + if: github.event_name == 'push' && github.ref == 'refs/heads/main' + uses: actions/configure-pages@v6 + + - name: Install app dependencies + run: npm ci --prefix examples/universal-app + + - name: Build app + run: npm run example:web:build + env: + GITHUB_PAGES: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }} + VITE_REPOSITORY_URL: https://github.com/${{ github.repository }} + + - name: Upload web build artifact + uses: actions/upload-artifact@v7 + with: + name: universal-example-web + path: examples/universal-app/dist + if-no-files-found: error + + - name: Upload GitHub Pages artifact + if: github.event_name == 'push' && github.ref == 'refs/heads/main' + uses: actions/upload-pages-artifact@v5 + with: + path: examples/universal-app/dist + + pages-deploy: + name: Deploy GitHub Pages + needs: [web-build] + if: github.event_name == 'push' && github.ref == 'refs/heads/main' + runs-on: ubuntu-latest + timeout-minutes: 10 + permissions: + pages: write + id-token: write + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - name: Deploy Pages artifact + id: deployment + uses: actions/deploy-pages@v5 + + desktop-package: + name: Package desktop app (${{ matrix.os }}) + runs-on: ${{ matrix.os }} + timeout-minutes: 20 + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, macos-latest, windows-latest] + steps: + - uses: actions/checkout@v6 + + - name: Setup Node.js + uses: actions/setup-node@v6 + with: + node-version: '24.x' + cache: npm + cache-dependency-path: examples/universal-app/package-lock.json + + - name: Install app dependencies + run: npm ci --prefix examples/universal-app + + - name: Package Electron app + run: npm run example:desktop:package + env: + VITE_REPOSITORY_URL: https://github.com/${{ github.repository }} + + - name: Upload desktop package + uses: actions/upload-artifact@v7 + with: + name: universal-example-desktop-${{ matrix.os }} + path: examples/universal-app/out + if-no-files-found: error + + android-build: + name: Build Android app + if: github.event_name == 'workflow_dispatch' && vars.EXAMPLE_APP_ENABLE_ANDROID_BUILD == 'true' + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - uses: actions/checkout@v6 + + - name: Setup Node.js + uses: actions/setup-node@v6 + with: + node-version: '24.x' + cache: npm + cache-dependency-path: examples/universal-app/package-lock.json + + - name: Setup Java + uses: actions/setup-java@v5 + with: + distribution: temurin + java-version: '21' + + - name: Setup Android SDK + uses: android-actions/setup-android@v3 + + - name: Install app dependencies + run: npm ci --prefix examples/universal-app + + - name: Add Android project + run: npm --prefix examples/universal-app run mobile:android:add + + - name: Build Android project + run: npm --prefix examples/universal-app run mobile:android:build + + - name: Upload Android output + uses: actions/upload-artifact@v7 + with: + name: universal-example-android + path: | + examples/universal-app/android/app/build/outputs/**/*.apk + examples/universal-app/android/app/build/outputs/**/*.aab + if-no-files-found: warn + + ios-build: + name: Build iOS app + if: github.event_name == 'workflow_dispatch' && vars.EXAMPLE_APP_ENABLE_IOS_BUILD == 'true' + runs-on: macos-latest + timeout-minutes: 30 + steps: + - uses: actions/checkout@v6 + + - name: Setup Node.js + uses: actions/setup-node@v6 + with: + node-version: '24.x' + cache: npm + cache-dependency-path: examples/universal-app/package-lock.json + + - name: Install app dependencies + run: npm ci --prefix examples/universal-app + + - name: Add iOS project + run: npm --prefix examples/universal-app run mobile:ios:add + + - name: Build iOS project + run: npm --prefix examples/universal-app run mobile:ios:build diff --git a/docs/case-studies/issue-82/evidence/templates/js/links.yml b/docs/case-studies/issue-82/evidence/templates/js/links.yml new file mode 100644 index 0000000..3e910dc --- /dev/null +++ b/docs/case-studies/issue-82/evidence/templates/js/links.yml @@ -0,0 +1,84 @@ +name: Broken Link Checker + +on: + push: + branches: + - main + paths: + - '**.md' + - '**.html' + - '.github/workflows/links.yml' + pull_request: + types: [opened, synchronize, reopened] + paths: + - '**.md' + - '**.html' + - '.github/workflows/links.yml' + workflow_dispatch: + +jobs: + link-checker: + name: Check Links + runs-on: ubuntu-latest + # Typical run: <1min with lychee cache. 10min prevents slow + # external hosts or Wayback Machine probes from hanging the workflow. + timeout-minutes: 10 + permissions: + contents: read + steps: + - uses: actions/checkout@v6 + + - name: Check links with lychee + id: lychee + uses: lycheeverse/lychee-action@v2 + with: + # Check all Markdown and HTML files + # Exclude case-studies directory - these are research documents from + # external repos with references to files and issues that don't exist + # in this repository (similar exclusion pattern as eslint.config.js) + args: >- + --verbose + --no-progress + --cache + --max-cache-age 1d + --max-retries 3 + --timeout 30 + --exclude-path docs/case-studies + './**/*.md' + './**/*.html' + # Don't fail the workflow immediately - we want to check web archive first + fail: false + # Output file for broken links report (used by check-web-archive.mjs) + output: lychee/out.md + # Write a job summary + jobSummary: true + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Check broken links against Web Archive + if: steps.lychee.outputs.exit_code != 0 + id: webarchive + run: node scripts/check-web-archive.mjs + env: + LYCHEE_OUTPUT: lychee/out.md + + - name: Fail if broken links found and no web archive fallback + if: steps.lychee.outputs.exit_code != 0 && steps.webarchive.outputs.all_archived != 'true' + run: | + echo "::error::Broken links were detected with no Web Archive fallback available." + echo "" + echo "What happened:" + echo " lychee found one or more broken links in the *.md and *.html files of this repository." + echo " The Web Archive (Wayback Machine) check found no archived versions for some of them." + echo "" + echo "How to fix:" + echo " 1. Review the 'Check links with lychee' step above for a full list of broken links." + echo " 2. For links marked with a '::notice::' annotation above, a Web Archive version exists." + echo " Replace those broken links with the suggested archive.org URL." + echo " 3. For links with no archive version, either:" + echo " a. Find an updated URL that points to the same or equivalent content." + echo " b. Remove the link if the content is no longer relevant." + echo " c. Add the URL to .lycheeignore if it is a known false positive." + echo "" + echo "Report location: lychee/out.md (available as a workflow artifact if configured)." + exit 1 diff --git a/docs/case-studies/issue-82/evidence/templates/js/release.yml b/docs/case-studies/issue-82/evidence/templates/js/release.yml new file mode 100644 index 0000000..0facf84 --- /dev/null +++ b/docs/case-studies/issue-82/evidence/templates/js/release.yml @@ -0,0 +1,617 @@ +name: Checks and release + +on: + push: + branches: + - main + pull_request: + types: [opened, synchronize, reopened] + # Manual release support - consolidated here to work with npm trusted publishing + # npm only allows ONE workflow file as trusted publisher, so all publishing + # must go through this workflow (release.yml) + workflow_dispatch: + inputs: + release_mode: + description: 'Manual release mode' + required: true + type: choice + default: 'instant' + options: + - instant + - changeset-pr + bump_type: + description: 'Manual release type' + required: true + type: choice + options: + - patch + - minor + - major + description: + description: 'Manual release description (optional)' + required: false + type: string + +# Concurrency: Only one workflow run per branch at a time +# - For main branch (releases): cancel older runs to prevent blocking newer releases +# When multiple commits are pushed quickly, we want the latest to release, not wait +# - For PR branches: queue runs to avoid cancelling checks on force-pushes +# See: docs/case-studies/issue-25/DETAILED-COMPARISON.md for context +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: ${{ github.ref == 'refs/heads/main' }} + +jobs: + # === DETECT CHANGES - determines which jobs should run === + detect-changes: + name: Detect Changes + runs-on: ubuntu-latest + # Typical run: ~6s. Cap at 5min so a hung detection step + # surfaces quickly instead of stalling the whole pipeline. + timeout-minutes: 5 + if: github.event_name != 'workflow_dispatch' + outputs: + mjs-changed: ${{ steps.changes.outputs.mjs-changed }} + js-changed: ${{ steps.changes.outputs.js-changed }} + package-changed: ${{ steps.changes.outputs.package-changed }} + docs-changed: ${{ steps.changes.outputs.docs-changed }} + workflow-changed: ${{ steps.changes.outputs.workflow-changed }} + any-code-changed: ${{ steps.changes.outputs.any-code-changed }} + steps: + - uses: actions/checkout@v6 + with: + fetch-depth: 0 + + - name: Detect changes + id: changes + run: node scripts/detect-code-changes.mjs + + # === FAST CHECKS - run before slow tests for fastest feedback === + # See: hive-mind CI/CD best practices principle #5 (fast-fail job ordering) + + # Syntax check all .mjs files with node --check (~7s) + test-compilation: + name: Test Compilation + runs-on: ubuntu-latest + # Typical run: <10s. Tight cap fails fast on syntax-check hangs. + timeout-minutes: 5 + needs: [detect-changes] + if: | + github.event_name == 'push' || + needs.detect-changes.outputs.mjs-changed == 'true' || + needs.detect-changes.outputs.js-changed == 'true' + steps: + - uses: actions/checkout@v6 + + - name: Check .mjs syntax + run: bash scripts/check-mjs-syntax.sh + + # Enforce 1500-line limit on .mjs files and release.yml + check-file-line-limits: + name: Check File Line Limits + runs-on: ubuntu-latest + # Typical run: <10s. This job only walks tracked files and counts lines. + timeout-minutes: 5 + needs: [detect-changes] + if: | + github.event_name == 'push' || + needs.detect-changes.outputs.mjs-changed == 'true' || + needs.detect-changes.outputs.js-changed == 'true' || + needs.detect-changes.outputs.workflow-changed == 'true' + steps: + - uses: actions/checkout@v6 + with: + fetch-depth: 0 + + - name: Simulate fresh merge with base branch (PR only) + if: github.event_name == 'pull_request' + env: + BASE_REF: ${{ github.base_ref }} + run: bash scripts/simulate-fresh-merge.sh + + - name: Check file line limits + run: bash scripts/check-file-line-limits.sh + + # === VERSION CHANGE CHECK === + # Prohibit manual version changes in package.json - versions should only be changed by CI/CD + version-check: + name: Check for Manual Version Changes + runs-on: ubuntu-latest + # Typical run: ~6s. Read-only package.json diff inspection. + timeout-minutes: 5 + if: github.event_name == 'pull_request' + steps: + - uses: actions/checkout@v6 + with: + fetch-depth: 0 + + - name: Check for version changes in package.json + env: + GITHUB_HEAD_REF: ${{ github.head_ref }} + GITHUB_BASE_REF: ${{ github.base_ref }} + run: node scripts/check-version.mjs + + # === CHANGESET CHECK - only runs on PRs with code changes === + # Docs-only PRs (./docs folder, markdown files) don't require changesets + changeset-check: + name: Check for Changesets + runs-on: ubuntu-latest + # Typical run: <30s including npm install. 10min covers cold runners. + timeout-minutes: 10 + needs: [detect-changes] + if: github.event_name == 'pull_request' && needs.detect-changes.outputs.any-code-changed == 'true' + steps: + - uses: actions/checkout@v6 + with: + fetch-depth: 0 + + - name: Setup Node.js + uses: actions/setup-node@v6 + with: + node-version: '24.x' + + - name: Install dependencies + run: npm install + + - name: Check for changesets + env: + # Pass PR context to the validation script + GITHUB_BASE_REF: ${{ github.base_ref }} + GITHUB_BASE_SHA: ${{ github.event.pull_request.base.sha }} + GITHUB_HEAD_SHA: ${{ github.event.pull_request.head.sha }} + run: | + # Skip changeset check for automated version PRs + if [[ "${{ github.head_ref }}" == "changeset-release/"* ]]; then + echo "Skipping changeset check for automated release PR" + exit 0 + fi + + # Run changeset validation script + # This validates that exactly ONE changeset was ADDED by this PR + # Pre-existing changesets from other merged PRs are ignored + node scripts/validate-changeset.mjs + + # === LINT AND FORMAT CHECK === + # Lint runs independently of changeset-check - it's a fast check that should always run + # See: https://github.com/link-assistant/hive-mind/pull/1024 for why this dependency was removed + # IMPORTANT: ESLint includes max-lines rule (1500 lines) to ensure files stay maintainable + # See docs/case-studies/issue-23 for why fresh merge simulation is critical + lint: + name: Lint and Format Check + runs-on: ubuntu-latest + # Typical run: <1min including install, ESLint, Prettier, jscpd, + # and secretlint. 10min protects against a hung lint plugin. + timeout-minutes: 10 + needs: [detect-changes] + if: | + github.event_name == 'push' || + needs.detect-changes.outputs.mjs-changed == 'true' || + needs.detect-changes.outputs.js-changed == 'true' || + needs.detect-changes.outputs.docs-changed == 'true' || + needs.detect-changes.outputs.package-changed == 'true' || + needs.detect-changes.outputs.workflow-changed == 'true' + steps: + - uses: actions/checkout@v6 + with: + # For PRs, fetch enough history to merge with base branch + fetch-depth: 0 + + - name: Simulate fresh merge with base branch (PR only) + if: github.event_name == 'pull_request' + env: + BASE_REF: ${{ github.base_ref }} + run: bash scripts/simulate-fresh-merge.sh + + - name: Setup Node.js + uses: actions/setup-node@v6 + with: + node-version: '24.x' + + - name: Install dependencies + run: npm install + + - name: Run ESLint + run: npm run lint + + - name: Check formatting + run: npm run format:check + + - name: Check code duplication + run: npm run check:duplication + + - name: Check for secrets + run: npx --yes -p secretlint -p @secretlint/secretlint-rule-preset-recommend secretlint "**/*" + + # Test matrix: 3 runtimes (Node.js, Bun, Deno) x 3 OS (Ubuntu, macOS, Windows) + # IMPORTANT: Tests must validate the ACTUAL merge result, not a stale merge preview. + # See docs/case-studies/issue-23 for why this is critical. + # Fast-fail: slow test matrix only runs after fast checks pass (hive-mind principle #5) + test: + name: Test (${{ matrix.runtime }} on ${{ matrix.os }}) + runs-on: ${{ matrix.os }} + # Typical run: <1min per runtime/OS on warm runners, with Windows + # sometimes slower on cold starts. 10min fails hung tests well + # before GitHub Actions' 6h default. + timeout-minutes: 10 + needs: + [ + detect-changes, + changeset-check, + test-compilation, + lint, + check-file-line-limits, + ] + # Use !cancelled() instead of always() so cancellation propagates correctly (hive-mind issue #1278) + # Run if: push event, OR changeset-check succeeded, OR changeset-check was skipped (docs-only PR) + # AND all fast checks passed (or were skipped for irrelevant changes) + if: | + !cancelled() && + (github.event_name == 'push' || needs.changeset-check.result == 'success' || needs.changeset-check.result == 'skipped') && + (needs.test-compilation.result == 'success' || needs.test-compilation.result == 'skipped') && + (needs.lint.result == 'success' || needs.lint.result == 'skipped') && + (needs.check-file-line-limits.result == 'success' || needs.check-file-line-limits.result == 'skipped') + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, macos-latest, windows-latest] + runtime: [node, bun, deno] + steps: + - uses: actions/checkout@v6 + with: + # For PRs, fetch enough history to merge with base branch + fetch-depth: 0 + + - name: Simulate fresh merge with base branch (PR only) + if: github.event_name == 'pull_request' + env: + BASE_REF: ${{ github.base_ref }} + shell: bash + run: bash scripts/simulate-fresh-merge.sh + + - name: Setup Node.js + if: matrix.runtime == 'node' + uses: actions/setup-node@v6 + with: + node-version: '24.x' + + - name: Install dependencies (Node.js) + if: matrix.runtime == 'node' + run: npm install + + - name: Run tests (Node.js) + if: matrix.runtime == 'node' + run: npm test + + - name: Setup Bun + if: matrix.runtime == 'bun' + uses: oven-sh/setup-bun@v2 + with: + bun-version: latest + + - name: Install dependencies (Bun) + if: matrix.runtime == 'bun' + run: bun install + + - name: Run tests (Bun) + if: matrix.runtime == 'bun' + # --timeout caps an individual test at 30s, matching Node's + # --test-timeout budget while leaving headroom for cold runners. + run: bun test --timeout 30000 + + - name: Setup Deno + if: matrix.runtime == 'deno' + uses: denoland/setup-deno@v2 + with: + deno-version: v2.x + + - name: Run tests (Deno) + if: matrix.runtime == 'deno' + run: deno test --allow-read + + # === DOCUMENTATION VALIDATION === + # Validate documentation files when docs change (hive-mind principle #12) + validate-docs: + name: Validate Documentation + runs-on: ubuntu-latest + # Typical run: <10s. Pure shell checks over documentation files. + timeout-minutes: 5 + needs: [detect-changes] + if: | + github.event_name == 'push' || + needs.detect-changes.outputs.docs-changed == 'true' + steps: + - uses: actions/checkout@v6 + + - name: Check documentation file sizes + run: | + LIMIT=2500 + FAILURES=() + + echo "Checking that documentation files are under ${LIMIT} lines..." + + while IFS= read -r -d '' file; do + line_count=$(wc -l < "$file") + if [ "$line_count" -gt "$LIMIT" ]; then + echo "ERROR: $file has $line_count lines (limit: ${LIMIT})" + echo "::error file=$file::Documentation file has $line_count lines (limit: ${LIMIT})" + FAILURES+=("$file") + fi + done < <(find docs -name "*.md" -type f -print0 2>/dev/null) + + if [ "${#FAILURES[@]}" -gt 0 ]; then + echo "The following docs exceed the ${LIMIT} line limit:" + printf ' %s\n' "${FAILURES[@]}" + exit 1 + else + echo "All documentation files are within the ${LIMIT} line limit." + fi + + - name: Check required documentation files exist + run: | + REQUIRED_FILES=( + "docs/BEST-PRACTICES.md" + "docs/CONTRIBUTING.md" + "README.md" + "CHANGELOG.md" + ) + + MISSING=() + for file in "${REQUIRED_FILES[@]}"; do + if [ ! -f "$file" ]; then + echo "ERROR: Required documentation file missing: $file" + MISSING+=("$file") + else + echo "Found: $file" + fi + done + + if [ "${#MISSING[@]}" -gt 0 ]; then + echo "" + echo "Missing required documentation files:" + printf ' %s\n' "${MISSING[@]}" + exit 1 + else + echo "All required documentation files present." + fi + + # Release - only runs on main after tests pass (for push events) + release: + name: Release + needs: [lint, test] + # Typical run is well under 10min. 30min gives npm and GitHub + # release APIs room for retries without allowing a 6h hang. + timeout-minutes: 30 + # Use !cancelled() instead of always() so cancellation propagates correctly (hive-mind issue #1278) + # This is needed because lint/test jobs have a transitive dependency on changeset-check + if: | + !cancelled() && + github.ref == 'refs/heads/main' && + github.event_name == 'push' && + needs.lint.result == 'success' && + needs.test.result == 'success' + runs-on: ubuntu-latest + # Permissions required for npm OIDC trusted publishing + permissions: + contents: write + pull-requests: write + id-token: write + outputs: + published: ${{ steps.publish.outputs.published }} + published_version: ${{ steps.publish.outputs.published_version }} + steps: + - uses: actions/checkout@v6 + with: + fetch-depth: 0 + + - name: Setup Node.js + uses: actions/setup-node@v6 + with: + node-version: '24.x' + registry-url: 'https://registry.npmjs.org' + + - name: Install dependencies + run: npm install + + - name: Update npm for OIDC trusted publishing + run: node scripts/setup-npm.mjs + + - name: Check for changesets + id: check_changesets + run: node scripts/check-changesets.mjs + + - name: Check if release is needed + id: check_release + env: + HAS_CHANGESETS: ${{ steps.check_changesets.outputs.has_changesets }} + run: node scripts/check-release-needed.mjs + + - name: Merge multiple changesets + if: steps.check_changesets.outputs.has_changesets == 'true' && steps.check_changesets.outputs.changeset_count > 1 + run: | + echo "Multiple changesets detected, merging..." + node scripts/merge-changesets.mjs + + - name: Version packages and commit to main + if: steps.check_changesets.outputs.has_changesets == 'true' + id: version + run: node scripts/version-and-commit.mjs --mode changeset + + - name: Publish to npm + # Run if version was committed, if a previous attempt already committed (for re-runs), + # or if check-release-needed detected an unpublished version (self-healing, issue #36) + if: >- + steps.version.outputs.version_committed == 'true' || + steps.version.outputs.already_released == 'true' || + (steps.check_release.outputs.should_release == 'true' && steps.check_release.outputs.skip_bump == 'true') + id: publish + run: node scripts/publish-to-npm.mjs --should-pull + + - name: Create GitHub Release + if: steps.publish.outputs.published == 'true' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: node scripts/create-github-release.mjs --release-version "${{ steps.publish.outputs.published_version }}" --repository "${{ github.repository }}" + + - name: Format GitHub release notes + if: steps.publish.outputs.published == 'true' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: node scripts/format-github-release.mjs --release-version "${{ steps.publish.outputs.published_version }}" --repository "${{ github.repository }}" --commit-sha "${{ github.sha }}" + + # Manual Instant Release - triggered via workflow_dispatch with instant mode + # This job is in release.yml because npm trusted publishing + # only allows one workflow file to be registered as a trusted publisher + instant-release: + name: Instant Release + if: github.event_name == 'workflow_dispatch' && github.event.inputs.release_mode == 'instant' + runs-on: ubuntu-latest + # Same publish envelope as the automated release path. + timeout-minutes: 30 + # Permissions required for npm OIDC trusted publishing + permissions: + contents: write + pull-requests: write + id-token: write + outputs: + published: ${{ steps.publish.outputs.published }} + published_version: ${{ steps.publish.outputs.published_version }} + steps: + - uses: actions/checkout@v6 + with: + fetch-depth: 0 + + - name: Setup Node.js + uses: actions/setup-node@v6 + with: + node-version: '24.x' + registry-url: 'https://registry.npmjs.org' + + - name: Install dependencies + run: npm install + + - name: Update npm for OIDC trusted publishing + run: node scripts/setup-npm.mjs + + - name: Version packages and commit to main + id: version + run: node scripts/version-and-commit.mjs --mode instant --bump-type "${{ github.event.inputs.bump_type }}" --description "${{ github.event.inputs.description }}" + + - name: Publish to npm + # Run if version was committed OR if a previous attempt already committed (for re-runs) + if: steps.version.outputs.version_committed == 'true' || steps.version.outputs.already_released == 'true' + id: publish + run: node scripts/publish-to-npm.mjs + + - name: Create GitHub Release + if: steps.publish.outputs.published == 'true' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: node scripts/create-github-release.mjs --release-version "${{ steps.publish.outputs.published_version }}" --repository "${{ github.repository }}" + + - name: Format GitHub release notes + if: steps.publish.outputs.published == 'true' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: node scripts/format-github-release.mjs --release-version "${{ steps.publish.outputs.published_version }}" --repository "${{ github.repository }}" --commit-sha "${{ github.sha }}" + + # Optional Docker Hub publishing for packages that also ship Docker images. + # Set vars.DOCKERHUB_IMAGE to enable this path, then configure + # vars.DOCKERHUB_USERNAME and secrets.DOCKERHUB_TOKEN. + docker-publish: + name: Optional Docker Hub Publish + needs: [release, instant-release] + timeout-minutes: 30 + if: | + !cancelled() && + ( + (needs.release.result == 'success' && needs.release.outputs.published == 'true') || + (needs.instant-release.result == 'success' && needs.instant-release.outputs.published == 'true') + ) + runs-on: ubuntu-latest + permissions: + contents: read + env: + DOCKER_CONTEXT: ${{ vars.DOCKER_CONTEXT }} + DOCKERFILE: ${{ vars.DOCKERFILE }} + DOCKERHUB_IMAGE: ${{ vars.DOCKERHUB_IMAGE }} + DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }} + DOCKERHUB_USERNAME: ${{ vars.DOCKERHUB_USERNAME }} + RELEASE_VERSION: ${{ needs.release.outputs.published_version || needs.instant-release.outputs.published_version }} + steps: + - uses: actions/checkout@v6 + + - name: Check Docker publish configuration + id: docker_config + run: node scripts/check-docker-publish.mjs + + - name: Wait for npm package availability before Docker publish + if: steps.docker_config.outputs.enabled == 'true' + run: node scripts/wait-for-npm.mjs --release-version "${{ env.RELEASE_VERSION }}" + + - name: Publish Docker image to Docker Hub + if: steps.docker_config.outputs.enabled == 'true' + uses: ./.github/actions/publish-dockerhub + with: + context: ${{ steps.docker_config.outputs.context }} + file: ${{ steps.docker_config.outputs.dockerfile }} + image: ${{ steps.docker_config.outputs.image }} + token: ${{ env.DOCKERHUB_TOKEN }} + username: ${{ env.DOCKERHUB_USERNAME }} + version: ${{ env.RELEASE_VERSION }} + + # Manual Changeset PR - creates a pull request with the changeset for review + changeset-pr: + name: Create Changeset PR + if: github.event_name == 'workflow_dispatch' && github.event.inputs.release_mode == 'changeset-pr' + runs-on: ubuntu-latest + # PR creation only: install, create a changeset, format, and open a PR. + timeout-minutes: 10 + permissions: + contents: write + pull-requests: write + steps: + - uses: actions/checkout@v6 + with: + fetch-depth: 0 + + - name: Setup Node.js + uses: actions/setup-node@v6 + with: + node-version: '24.x' + + - name: Install dependencies + run: npm install + + - name: Create changeset file + run: node scripts/create-manual-changeset.mjs --bump-type "${{ github.event.inputs.bump_type }}" --description "${{ github.event.inputs.description }}" + + - name: Format changeset with Prettier + run: | + # Run Prettier on the changeset file to ensure it matches project style + npx prettier --write ".changeset/*.md" || true + + echo "Formatted changeset files" + + - name: Create Pull Request + uses: peter-evans/create-pull-request@v8 + with: + token: ${{ secrets.GITHUB_TOKEN }} + commit-message: 'chore: add changeset for manual ${{ github.event.inputs.bump_type }} release' + branch: changeset-manual-release-${{ github.run_id }} + delete-branch: true + title: 'chore: manual ${{ github.event.inputs.bump_type }} release' + body: | + ## Manual Release Request + + This PR was created by a manual workflow trigger to prepare a **${{ github.event.inputs.bump_type }}** release. + + ### Release Details + - **Type:** ${{ github.event.inputs.bump_type }} + - **Description:** ${{ github.event.inputs.description || 'Manual release' }} + - **Triggered by:** @${{ github.actor }} + + ### Next Steps + 1. Review the changeset in this PR + 2. Merge this PR to main + 3. The automated release workflow will create a version PR + 4. Merge the version PR to publish to npm and create a GitHub release diff --git a/docs/case-studies/issue-82/evidence/templates/js/scripts/changeset-version.mjs b/docs/case-studies/issue-82/evidence/templates/js/scripts/changeset-version.mjs new file mode 100644 index 0000000..368f297 --- /dev/null +++ b/docs/case-studies/issue-82/evidence/templates/js/scripts/changeset-version.mjs @@ -0,0 +1,75 @@ +#!/usr/bin/env bun + +/** + * Custom changeset version script that ensures package-lock.json is synchronized + * with package.json after version bumps. + * + * This script: + * 1. Detects the JavaScript package root (supports both single-language and multi-language repos) + * 2. Runs `changeset version` to update package versions + * 3. Runs `npm install` to synchronize package-lock.json with the new versions + * + * Configuration: + * - CLI: --js-root to explicitly set JavaScript root + * - Environment: JS_ROOT= + * + * Uses link-foundation libraries: + * - use-m: Dynamic package loading without package.json dependencies + * - command-stream: Modern shell command execution with streaming support + * + * Addresses issues documented in: + * - Issue #21: Supporting both single and multi-language repository structures + * - Reference: link-assistant/agent PR #112 (--legacy-peer-deps fix) + * - Reference: link-assistant/agent PR #114 (configurable package root) + */ + +import { getJsRoot, needsCd, parseJsRootConfig } from './js-paths.mjs'; + +// Load use-m dynamically +const { use } = eval( + await (await fetch('https://unpkg.com/use-m/use.js')).text() +); + +// Import command-stream for shell command execution +const { $ } = await use('command-stream'); + +// Store the original working directory to restore after cd commands +// IMPORTANT: command-stream's cd is a virtual command that calls process.chdir() +const originalCwd = process.cwd(); + +try { + // Get JavaScript package root (auto-detect or use explicit config) + const jsRootConfig = parseJsRootConfig(); + const jsRoot = getJsRoot({ jsRoot: jsRootConfig, verbose: true }); + + console.log('Running changeset version...'); + + // IMPORTANT: cd is a virtual command that calls process.chdir(), so we restore after + if (needsCd({ jsRoot })) { + await $`cd ${jsRoot} && npx changeset version`; + process.chdir(originalCwd); + } else { + await $`npx changeset version`; + } + + console.log('\nSynchronizing package-lock.json...'); + + // Use --legacy-peer-deps to handle peer dependency conflicts + // This addresses npm ERESOLVE errors documented in issue #111 / PR #112 + if (needsCd({ jsRoot })) { + await $`cd ${jsRoot} && npm install --package-lock-only --legacy-peer-deps`; + process.chdir(originalCwd); + } else { + await $`npm install --package-lock-only --legacy-peer-deps`; + } + + console.log('\n✅ Version bump complete with synchronized package-lock.json'); +} catch (error) { + // Restore cwd on error + process.chdir(originalCwd); + console.error('Error during version bump:', error.message); + if (process.env.DEBUG) { + console.error('Stack trace:', error.stack); + } + process.exit(1); +} diff --git a/docs/case-studies/issue-82/evidence/templates/js/scripts/check-changesets.mjs b/docs/case-studies/issue-82/evidence/templates/js/scripts/check-changesets.mjs new file mode 100644 index 0000000..3f7b7ac --- /dev/null +++ b/docs/case-studies/issue-82/evidence/templates/js/scripts/check-changesets.mjs @@ -0,0 +1,67 @@ +#!/usr/bin/env node + +/** + * Check for pending changeset files + * + * This script checks for pending changeset files in the .changeset directory + * and outputs the count and status for use in GitHub Actions workflow conditions. + * + * Usage: + * node scripts/check-changesets.mjs + * + * Outputs (written to GITHUB_OUTPUT): + * - has_changesets: 'true' if there are pending changesets + * - changeset_count: number of changeset files found + */ + +import { readdirSync, existsSync, appendFileSync } from 'fs'; + +const CHANGESET_DIR = '.changeset'; + +/** + * Write output to GitHub Actions output file + * @param {string} name - Output name + * @param {string} value - Output value + */ +function setOutput(name, value) { + const outputFile = process.env.GITHUB_OUTPUT; + if (outputFile) { + appendFileSync(outputFile, `${name}=${value}\n`); + } + console.log(`${name}=${value}`); +} + +/** + * Count changeset files in the .changeset directory + * @returns {number} Number of changeset files found + */ +function countChangesetFiles() { + if (!existsSync(CHANGESET_DIR)) { + return 0; + } + + const files = readdirSync(CHANGESET_DIR); + // Filter to only count .md files, excluding README.md + const changesetFiles = files.filter( + (file) => file.endsWith('.md') && file !== 'README.md' + ); + + return changesetFiles.length; +} + +/** + * Main function to check for changesets + */ +function checkChangesets() { + console.log('Checking for pending changeset files...\n'); + + const changesetCount = countChangesetFiles(); + + console.log(`Found ${changesetCount} changeset file(s)`); + + setOutput('has_changesets', changesetCount > 0 ? 'true' : 'false'); + setOutput('changeset_count', String(changesetCount)); +} + +// Run the check +checkChangesets(); diff --git a/docs/case-studies/issue-82/evidence/templates/js/scripts/check-docker-publish.mjs b/docs/case-studies/issue-82/evidence/templates/js/scripts/check-docker-publish.mjs new file mode 100644 index 0000000..e2793f1 --- /dev/null +++ b/docs/case-studies/issue-82/evidence/templates/js/scripts/check-docker-publish.mjs @@ -0,0 +1,143 @@ +#!/usr/bin/env node + +/** + * Validate optional Docker Hub publish configuration. + * + * Docker publishing is opt-in. Set DOCKERHUB_IMAGE to enable it, then provide: + * - DOCKERHUB_USERNAME: Docker Hub account name + * - DOCKERHUB_TOKEN: Docker Hub access token + * - DOCKERFILE: Dockerfile path (optional, defaults to ./Dockerfile) + * - DOCKER_CONTEXT: build context path (optional, defaults to .) + */ + +import { appendFileSync, existsSync } from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const DEFAULT_CONTEXT = '.'; +const DEFAULT_DOCKERFILE = './Dockerfile'; + +function clean(value) { + return typeof value === 'string' ? value.trim() : ''; +} + +function hasExplicitTag(image) { + const lastSegment = image.split('/').at(-1) ?? ''; + return lastSegment.includes(':'); +} + +function normalizeRelativePath(value, fallback) { + return clean(value) || fallback; +} + +function fileExists(cwd, filePath) { + return existsSync(path.resolve(cwd, filePath)); +} + +function directoryExists(cwd, directoryPath) { + return existsSync(path.resolve(cwd, directoryPath)); +} + +export function evaluateDockerPublishConfig({ + cwd = process.cwd(), + env = process.env, +} = {}) { + const image = clean(env.DOCKERHUB_IMAGE); + const username = clean(env.DOCKERHUB_USERNAME); + const token = clean(env.DOCKERHUB_TOKEN); + const context = normalizeRelativePath(env.DOCKER_CONTEXT, DEFAULT_CONTEXT); + const dockerfile = normalizeRelativePath(env.DOCKERFILE, DEFAULT_DOCKERFILE); + const errors = []; + + if (!image) { + return { + context, + dockerfile, + enabled: false, + errors, + image, + username, + }; + } + + if (/\s/.test(image)) { + errors.push('DOCKERHUB_IMAGE must not contain whitespace'); + } + + if (hasExplicitTag(image)) { + errors.push( + 'DOCKERHUB_IMAGE must not include a tag; release tags are generated from npm' + ); + } + + if (!username) { + errors.push('DOCKERHUB_USERNAME is required when DOCKERHUB_IMAGE is set'); + } + + if (!token) { + errors.push('DOCKERHUB_TOKEN is required when DOCKERHUB_IMAGE is set'); + } + + if (!directoryExists(cwd, context)) { + errors.push(`Docker context does not exist: ${context}`); + } + + if (!fileExists(cwd, dockerfile)) { + errors.push(`Dockerfile does not exist: ${dockerfile}`); + } + + return { + context, + dockerfile, + enabled: errors.length === 0, + errors, + image, + username, + }; +} + +function setOutput(name, value) { + const outputFile = process.env.GITHUB_OUTPUT; + if (outputFile) { + appendFileSync(outputFile, `${name}=${value}\n`); + } + console.log(`Output: ${name}=${value}`); +} + +function isCliEntryPoint() { + return ( + typeof process !== 'undefined' && + process.argv?.[1] && + fileURLToPath(import.meta.url) === path.resolve(process.argv[1]) + ); +} + +export function main({ env = process.env, stderr = console.error } = {}) { + const config = evaluateDockerPublishConfig({ env }); + + setOutput('enabled', config.enabled ? 'true' : 'false'); + setOutput('context', config.context); + setOutput('dockerfile', config.dockerfile); + setOutput('image', config.image); + + if (!config.image) { + console.log( + 'Docker Hub publishing is disabled: DOCKERHUB_IMAGE is not set' + ); + return 0; + } + + if (config.errors.length > 0) { + for (const error of config.errors) { + stderr(`::error::${error}`); + } + return 1; + } + + console.log(`Docker Hub publishing is enabled for ${config.image}`); + return 0; +} + +if (isCliEntryPoint()) { + process.exitCode = main(); +} diff --git a/docs/case-studies/issue-82/evidence/templates/js/scripts/check-file-line-limits.sh b/docs/case-studies/issue-82/evidence/templates/js/scripts/check-file-line-limits.sh new file mode 100755 index 0000000..70807d8 --- /dev/null +++ b/docs/case-studies/issue-82/evidence/templates/js/scripts/check-file-line-limits.sh @@ -0,0 +1,70 @@ +#!/usr/bin/env bash +# check-file-line-limits.sh +# +# Enforces a 1500-line limit on all .mjs files and on release.yml. +# +# Usage: +# bash scripts/check-file-line-limits.sh +# +# Exit code 0 = all files within limit; non-zero = one or more violations. + +set -euo pipefail + +LIMIT=1500 +WARN_THRESHOLD=1350 +FAILURES=() +WARNINGS=() + +echo "Checking that all .mjs files are under ${LIMIT} lines..." + +while IFS= read -r -d '' file; do + line_count=$(wc -l < "$file" | tr -d '[:space:]') + echo "$file: $line_count lines" + if [ "$line_count" -gt "$LIMIT" ]; then + echo "ERROR: $file has $line_count lines (limit: ${LIMIT})" + echo "::error file=$file::File has $line_count lines (limit: ${LIMIT})" + FAILURES+=("$file") + elif [ "$line_count" -gt "$WARN_THRESHOLD" ]; then + echo "WARNING: $file has $line_count lines (approaching limit of ${LIMIT}, warning threshold: ${WARN_THRESHOLD})" + echo "::warning file=$file::File has $line_count lines (approaching limit of ${LIMIT}). Consider extracting code to keep under ${WARN_THRESHOLD} lines and prevent concurrent PR merge limit violations." + WARNINGS+=("$file") + fi +done < <(find . -name "*.mjs" -type f -not -path "*/node_modules/*" -print0) + +echo "" +echo "Checking that .github/workflows/release.yml is under ${LIMIT} lines..." +RELEASE_YML=".github/workflows/release.yml" +if [ -f "$RELEASE_YML" ]; then + line_count=$(wc -l < "$RELEASE_YML" | tr -d '[:space:]') + echo "$RELEASE_YML: $line_count lines" + if [ "$line_count" -gt "$LIMIT" ]; then + echo "ERROR: $RELEASE_YML has $line_count lines (limit: ${LIMIT})" + echo "::error file=$RELEASE_YML::File has $line_count lines (limit: ${LIMIT}). Move inline scripts to ./scripts/ folder." + FAILURES+=("$RELEASE_YML") + elif [ "$line_count" -gt "$WARN_THRESHOLD" ]; then + echo "WARNING: $RELEASE_YML has $line_count lines (approaching limit of ${LIMIT}, warning threshold: ${WARN_THRESHOLD})" + echo "::warning file=$RELEASE_YML::File has $line_count lines (approaching limit of ${LIMIT}). Consider moving inline scripts to ./scripts/ folder." + WARNINGS+=("$RELEASE_YML") + fi +else + echo "WARNING: $RELEASE_YML not found, skipping" +fi + +echo "" +if [ "${#WARNINGS[@]}" -gt 0 ]; then + echo "The following files are approaching the ${LIMIT} line limit (>${WARN_THRESHOLD} lines):" + printf ' %s\n' "${WARNINGS[@]}" + echo "" + echo "Consider extracting code to prevent concurrent PR merge limit violations." + echo "" +fi + +if [ "${#FAILURES[@]}" -gt 0 ]; then + echo "The following files exceed the ${LIMIT} line limit:" + printf ' %s\n' "${FAILURES[@]}" + echo "" + echo "Move large inline scripts to the ./scripts/ folder to reduce file size." + exit 1 +else + echo "All checked files are within the ${LIMIT} line limit!" +fi diff --git a/docs/case-studies/issue-82/evidence/templates/js/scripts/check-mjs-syntax.sh b/docs/case-studies/issue-82/evidence/templates/js/scripts/check-mjs-syntax.sh new file mode 100755 index 0000000..8982bb1 --- /dev/null +++ b/docs/case-studies/issue-82/evidence/templates/js/scripts/check-mjs-syntax.sh @@ -0,0 +1,29 @@ +#!/usr/bin/env bash +# check-mjs-syntax.sh +# +# Checks Node.js syntax for all .mjs files in src/, scripts/, and tests/. +# +# Usage: +# bash scripts/check-mjs-syntax.sh +# +# Exit code 0 = all files pass syntax check; non-zero = syntax error found. + +set -euo pipefail + +echo "Checking syntax for all .mjs files..." + +CHECKED=0 +for dir in src scripts tests; do + if [ -d "$dir" ]; then + for file in "$dir"/*.mjs; do + if [ -f "$file" ]; then + echo "Checking $file..." + timeout 10s node --check "$file" + CHECKED=$((CHECKED + 1)) + fi + done + fi +done + +echo "" +echo "Syntax check passed for $CHECKED file(s)." diff --git a/docs/case-studies/issue-82/evidence/templates/js/scripts/check-release-needed.mjs b/docs/case-studies/issue-82/evidence/templates/js/scripts/check-release-needed.mjs new file mode 100644 index 0000000..e2648f2 --- /dev/null +++ b/docs/case-studies/issue-82/evidence/templates/js/scripts/check-release-needed.mjs @@ -0,0 +1,123 @@ +#!/usr/bin/env node + +/** + * Check if a release is needed based on changesets and npm registry state + * + * This script checks: + * 1. If there are changeset files to process + * 2. If the current version has already been published to npm + * + * IMPORTANT: This script checks npm (the source of truth for JS packages), + * NOT git tags. This is critical because: + * - Git tags can exist without the package being published + * - GitHub releases create tags but don't publish to npm + * - Only npm publication means users can actually install the package + * + * This provides a self-healing mechanism: if a previous release attempt + * failed or was skipped, the next push to main will detect the unpublished + * version and trigger a release without requiring a changeset. + * + * Analogous to check-release-needed.rs in the Rust template. + * + * Supports both single-language and multi-language repository structures: + * - Single-language: package.json in repository root + * - Multi-language: package.json in js/ subfolder + * + * Usage: node scripts/check-release-needed.mjs [--js-root ] + * + * Environment variables: + * - HAS_CHANGESETS: 'true' if changeset files exist (from check-changesets.mjs) + * + * Outputs (written to GITHUB_OUTPUT): + * - should_release: 'true' if a release should be created + * - skip_bump: 'true' if version bump should be skipped (version not yet published) + * + * Addresses issues documented in: + * - Issue #36: Release job silently skips when PRs merge without changesets + */ + +import { appendFileSync } from 'fs'; +import { execSync } from 'child_process'; + +import { getJsRoot, parseJsRootConfig } from './js-paths.mjs'; +import { readPackageInfo } from './package-info.mjs'; + +const jsRootConfig = parseJsRootConfig(); +const jsRoot = getJsRoot({ jsRoot: jsRootConfig, verbose: true }); + +/** + * Write output to GitHub Actions output file + * @param {string} name - Output name + * @param {string} value - Output value + */ +function setOutput(name, value) { + const outputFile = process.env.GITHUB_OUTPUT; + if (outputFile) { + appendFileSync(outputFile, `${name}=${value}\n`); + } + console.log(`Output: ${name}=${value}`); +} + +/** + * Get the package name and version from package.json + * @returns {{ name: string, version: string }} + */ +function getPackageInfo() { + return readPackageInfo({ jsRoot }); +} + +/** + * Check if a specific version is published on npm + * @param {string} packageName + * @param {string} version + * @returns {boolean} + */ +function checkVersionOnNpm(packageName, version) { + try { + const result = execSync(`npm view "${packageName}@${version}" version`, { + encoding: 'utf-8', + stdio: ['pipe', 'pipe', 'pipe'], + }); + return result.trim().includes(version); + } catch { + return false; + } +} + +function main() { + const hasChangesets = process.env.HAS_CHANGESETS === 'true'; + const { name: packageName, version: currentVersion } = getPackageInfo(); + + console.log(`Package: ${packageName}`); + console.log(`Current version: ${currentVersion}`); + console.log(`Has changesets: ${hasChangesets}`); + + if (hasChangesets) { + console.log('Found changesets, proceeding with release'); + setOutput('should_release', 'true'); + setOutput('skip_bump', 'false'); + return; + } + + console.log( + `Checking if ${packageName}@${currentVersion} is published on npm...` + ); + const isPublished = checkVersionOnNpm(packageName, currentVersion); + console.log(`Published on npm: ${isPublished}`); + + if (isPublished) { + console.log( + `No changesets and v${currentVersion} already published on npm — no release needed` + ); + setOutput('should_release', 'false'); + setOutput('skip_bump', 'false'); + } else { + console.log( + `No changesets but v${currentVersion} not yet published to npm — release needed (self-healing)` + ); + setOutput('should_release', 'true'); + setOutput('skip_bump', 'true'); + } +} + +main(); diff --git a/docs/case-studies/issue-82/evidence/templates/js/scripts/check-version.mjs b/docs/case-studies/issue-82/evidence/templates/js/scripts/check-version.mjs new file mode 100644 index 0000000..84d100b --- /dev/null +++ b/docs/case-studies/issue-82/evidence/templates/js/scripts/check-version.mjs @@ -0,0 +1,129 @@ +#!/usr/bin/env node + +/** + * Check for manual version modifications in package.json + * + * This script prevents manual version changes in pull requests. + * Versions should only be changed by the CI/CD pipeline using changesets. + * + * Key behavior: + * - For PRs: compares PR head against base branch to detect version changes + * - Skips check for automated release PRs (changeset-release/* branches) + * - Fails the build if manual version changes are detected + * + * Usage: + * node scripts/check-version.mjs + * + * Environment variables (set by GitHub Actions): + * - GITHUB_HEAD_REF: Branch name of the PR head + * - GITHUB_BASE_REF: Branch name of the PR base + * + * Exit codes: + * - 0: No manual version changes detected (or skipped for release PRs) + * - 1: Manual version changes detected + */ + +import { execSync } from 'child_process'; + +/** + * Execute a shell command and return trimmed output + * @param {string} command - The command to execute + * @returns {string} - The trimmed command output + */ +function exec(command) { + try { + return execSync(command, { encoding: 'utf-8' }).trim(); + } catch (error) { + console.error(`Error executing command: ${command}`); + console.error(error.message); + return ''; + } +} + +/** + * Check if this is an automated release PR that should skip version check + * @returns {boolean} True if version check should be skipped + */ +function shouldSkipVersionCheck() { + const headRef = process.env.GITHUB_HEAD_REF || ''; + + // Skip check for automated release PRs created by changeset + const skipPatterns = ['changeset-release/', 'changeset-manual-release-']; + + for (const pattern of skipPatterns) { + if (headRef.startsWith(pattern)) { + return true; + } + } + + return false; +} + +/** + * Get the version diff from package.json + * @returns {string} The version diff line if found, empty string otherwise + */ +function getVersionDiff() { + const baseRef = process.env.GITHUB_BASE_REF || 'main'; + + // Get the diff for package.json, looking for added lines with "version" + const diffCommand = `git diff origin/${baseRef}...HEAD -- package.json`; + const diff = exec(diffCommand); + + if (!diff) { + return ''; + } + + // Look for added lines (starting with +) containing "version" + // Match pattern: +"version": "x.y.z" + const versionChangePattern = /^\+\s*"version"\s*:\s*"[^"]+"/m; + const match = diff.match(versionChangePattern); + + return match ? match[0] : ''; +} + +/** + * Main function to check for version changes + */ +function checkVersion() { + console.log('Checking for manual version changes in package.json...\n'); + + // Check if we should skip the version check + if (shouldSkipVersionCheck()) { + const headRef = process.env.GITHUB_HEAD_REF || ''; + console.log(`Skipping version check for automated release PR: ${headRef}`); + process.exit(0); + } + + // Get the version diff + const versionDiff = getVersionDiff(); + + if (versionDiff) { + console.error('::error::Manual version change detected in package.json'); + console.error(''); + console.error( + 'Version changes in package.json are prohibited in pull requests.' + ); + console.error( + 'Versions are managed automatically by the CI/CD pipeline using changesets.' + ); + console.error(''); + console.error('To request a release:'); + console.error( + ' 1. Add a changeset file describing your changes (npx changeset)' + ); + console.error( + ' 2. The release workflow will automatically bump the version when merged' + ); + console.error(''); + console.error('Detected change:'); + console.error(versionDiff); + process.exit(1); + } + + console.log('No manual version changes detected - check passed'); + process.exit(0); +} + +// Run the check +checkVersion(); diff --git a/docs/case-studies/issue-82/evidence/templates/js/scripts/check-web-archive.mjs b/docs/case-studies/issue-82/evidence/templates/js/scripts/check-web-archive.mjs new file mode 100644 index 0000000..2b8244d --- /dev/null +++ b/docs/case-studies/issue-82/evidence/templates/js/scripts/check-web-archive.mjs @@ -0,0 +1,263 @@ +#!/usr/bin/env node + +/** + * Check broken links against the Wayback Machine (web.archive.org) + * + * This script reads the lychee link checker output (markdown format), + * extracts broken URLs, and checks each one against the Wayback Machine API. + * It then outputs a report with: + * - Links that have a web archive version (with suggestion to replace) + * - Links that have no web archive version (clearly marked as unrecoverable) + * + * Usage: + * node scripts/check-web-archive.mjs + * + * Environment variables: + * - LYCHEE_OUTPUT: Path to lychee markdown output file (default: lychee/out.md) + * + * GitHub Actions outputs: + * - all_archived: 'true' if all broken links have a web archive version + * + * Exit codes: + * - 0: All broken links have web archive versions (or no broken links) + * - 1: Some broken links have no web archive version + */ + +import { readFileSync, appendFileSync, existsSync } from 'fs'; + +const WAYBACK_API = 'https://archive.org/wayback/available?url='; + +/** + * Write output to GitHub Actions output file + * @param {string} name - Output name + * @param {string} value - Output value + */ +function setOutput(name, value) { + const outputFile = process.env.GITHUB_OUTPUT; + if (outputFile) { + appendFileSync(outputFile, `${name}=${value}\n`); + } + console.log(`${name}=${value}`); +} + +/** + * Extract broken URLs from lychee markdown output + * Lychee markdown format includes lines like: + * * [404] https://example.com/broken-link + * * [ERROR] https://another-broken.com + * @param {string} content - The markdown content from lychee + * @returns {string[]} Array of broken URLs + */ +function extractBrokenUrls(content) { + const urls = []; + + // Match lines with error status codes or ERROR markers followed by URLs + // Lychee output format: [STATUS_CODE] URL or bullet points with links + const urlPattern = + /\[(?:4\d\d|5\d\d|ERROR|TIMEOUT|UNKNOWN)\]\s+(https?:\/\/[^\s)]+)/gi; + let match; + + while ((match = urlPattern.exec(content)) !== null) { + const url = match[1].trim(); + if (url && !urls.includes(url)) { + urls.push(url); + } + } + + // Also match plain URL lines in broken sections + // Lychee sometimes outputs: `[ERROR] url | description` + const linePattern = /^\s*(?:\*|-)\s+.*?(https?:\/\/[^\s|)>\]]+)/gm; + let lineMatch; + + while ((lineMatch = linePattern.exec(content)) !== null) { + const url = lineMatch[1].trim().replace(/[.,;!?]+$/, ''); + if (url && !urls.includes(url) && url.startsWith('http')) { + urls.push(url); + } + } + + return urls; +} + +/** + * Check if a URL has an archived version in the Wayback Machine + * Uses the Wayback Machine Availability API: + * https://archive.org/help/wayback_api.php + * @param {string} url - The URL to check + * @returns {Promise<{available: boolean, archiveUrl: string|null, timestamp: string|null}>} + */ +async function checkWaybackMachine(url) { + const apiUrl = `${WAYBACK_API}${encodeURIComponent(url)}`; + + const controller = new AbortController(); + const timeoutId = globalThis.setTimeout(() => controller.abort(), 10000); + + try { + const response = await fetch(apiUrl, { + headers: { + 'User-Agent': 'broken-link-checker/1.0 (GitHub Actions CI)', + }, + signal: controller.signal, + }); + + if (!response.ok) { + console.warn(` Wayback API returned ${response.status} for ${url}`); + return { available: false, archiveUrl: null, timestamp: null }; + } + + const data = await response.json(); + + if (data.archived_snapshots?.closest?.available === true) { + const snapshot = data.archived_snapshots.closest; + const archiveUrl = snapshot.url.replace(/^http:\/\//, 'https://'); + return { + available: true, + archiveUrl, + timestamp: snapshot.timestamp, + }; + } + + return { available: false, archiveUrl: null, timestamp: null }; + } catch (error) { + console.warn( + ` Failed to check Wayback Machine for ${url}: ${error.message}` + ); + return { available: false, archiveUrl: null, timestamp: null }; + } finally { + globalThis.clearTimeout(timeoutId); + } +} + +/** + * Format a timestamp from Wayback Machine (YYYYMMDDHHmmss) to readable date + * @param {string} timestamp - e.g. "20231015143022" + * @returns {string} - e.g. "2023-10-15" + */ +function formatTimestamp(timestamp) { + if (!timestamp || timestamp.length < 8) { + return timestamp; + } + const year = timestamp.slice(0, 4); + const month = timestamp.slice(4, 6); + const day = timestamp.slice(6, 8); + return `${year}-${month}-${day}`; +} + +/** + * Main function + */ +async function main() { + const lycheeOutput = process.env.LYCHEE_OUTPUT || 'lychee/out.md'; + + console.log('=== Web Archive Fallback Check ===\n'); + console.log(`Reading lychee output from: ${lycheeOutput}\n`); + + if (!existsSync(lycheeOutput)) { + console.log('No lychee output file found. Skipping web archive check.'); + setOutput('all_archived', 'true'); + process.exit(0); + } + + const content = readFileSync(lycheeOutput, 'utf-8'); + const brokenUrls = extractBrokenUrls(content); + + if (brokenUrls.length === 0) { + console.log('No broken URLs found in lychee output.'); + setOutput('all_archived', 'true'); + process.exit(0); + } + + console.log( + `Found ${brokenUrls.length} broken URL(s). Checking Web Archive...\n` + ); + + const withArchive = []; + const withoutArchive = []; + + for (const url of brokenUrls) { + console.log(`Checking: ${url}`); + const result = await checkWaybackMachine(url); + + if (result.available) { + const date = formatTimestamp(result.timestamp); + console.log(` ✓ Archived on ${date}: ${result.archiveUrl}`); + withArchive.push({ url, archiveUrl: result.archiveUrl, date }); + } else { + console.log(' ✗ Not found in Web Archive'); + withoutArchive.push(url); + } + + // Small delay to avoid rate-limiting the Wayback API + await new Promise((resolve) => globalThis.setTimeout(resolve, 500)); + } + + console.log('\n=== Web Archive Check Summary ===\n'); + + if (withArchive.length > 0) { + console.log( + `✓ ${withArchive.length} broken link(s) have Web Archive versions - consider replacing:` + ); + for (const { url, archiveUrl, date } of withArchive) { + console.log(` Original: ${url}`); + console.log(` Archive (${date}): ${archiveUrl}`); + console.log(''); + } + + // Print GitHub Actions annotations as suggestions (one per link) + for (const { url, archiveUrl, date } of withArchive) { + console.log( + `::notice title=Broken link - Web Archive available (${date})::` + + `Broken link detected: ${url}\n` + + `A Web Archive snapshot from ${date} is available.\n` + + `Suggested fix: replace the broken link with the archived version:\n` + + ` ${archiveUrl}` + ); + } + } + + if (withoutArchive.length > 0) { + console.log( + `✗ ${withoutArchive.length} broken link(s) have NO Web Archive version:` + ); + for (const url of withoutArchive) { + console.log(` ${url}`); + } + console.log(''); + + // Print GitHub Actions annotations as errors (one per link) + for (const url of withoutArchive) { + console.log( + `::error title=Broken link - No Web Archive fallback::` + + `Broken link detected: ${url}\n` + + `No archived version was found in the Wayback Machine.\n` + + `How to fix:\n` + + ` 1. Find an updated URL for the same or equivalent content and replace the link.\n` + + ` 2. Remove the link if the content is no longer relevant.\n` + + ` 3. Add the URL to .lycheeignore if it is a known false positive (e.g. localhost, example.com).` + ); + } + } + + const allArchived = withoutArchive.length === 0; + setOutput('all_archived', allArchived ? 'true' : 'false'); + + if (!allArchived) { + console.log( + '\nAction required: Fix or remove the broken links listed above.' + ); + console.log( + 'For links with Web Archive versions, you can replace them with the suggested archive.org URLs.' + ); + process.exit(1); + } else { + console.log( + '\nAll broken links have Web Archive versions. Consider replacing them with the suggested archive.org URLs.' + ); + process.exit(0); + } +} + +main().catch((error) => { + console.error('Unexpected error:', error); + process.exit(1); +}); diff --git a/docs/case-studies/issue-82/evidence/templates/js/scripts/create-github-release.mjs b/docs/case-studies/issue-82/evidence/templates/js/scripts/create-github-release.mjs new file mode 100644 index 0000000..3ad36d3 --- /dev/null +++ b/docs/case-studies/issue-82/evidence/templates/js/scripts/create-github-release.mjs @@ -0,0 +1,217 @@ +#!/usr/bin/env bun + +/** + * Create GitHub Release from CHANGELOG.md + * Usage: node scripts/create-github-release.mjs --release-version --repository [--tag-prefix ] [--language ] + * release-version: Version number (e.g., 1.0.0) + * repository: GitHub repository (e.g., owner/repo) + * tag-prefix: Prefix for the git tag (default: "v", use "js-v" for multi-language repos) + * language: Human-readable language name for the release title (default: "JavaScript") + */ + +import { spawnSync } from 'node:child_process'; +import { readFileSync } from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const USAGE = + 'Usage: node scripts/create-github-release.mjs --release-version --repository [--tag-prefix ] [--language ]'; + +export function parseArgs(argv, env = process.env) { + const config = { + language: env.LANGUAGE ?? 'JavaScript', + releaseVersion: env.VERSION ?? '', + repository: env.REPOSITORY ?? '', + tagPrefix: env.TAG_PREFIX ?? 'v', + }; + + for (let index = 0; index < argv.length; index++) { + const arg = argv[index]; + + if (arg === '--release-version') { + config.releaseVersion = readOptionValue(argv, index, arg); + index++; + } else if (arg.startsWith('--release-version=')) { + config.releaseVersion = arg.slice('--release-version='.length); + } else if (arg === '--repository') { + config.repository = readOptionValue(argv, index, arg); + index++; + } else if (arg.startsWith('--repository=')) { + config.repository = arg.slice('--repository='.length); + } else if (arg === '--tag-prefix') { + config.tagPrefix = readOptionValue(argv, index, arg); + index++; + } else if (arg.startsWith('--tag-prefix=')) { + config.tagPrefix = arg.slice('--tag-prefix='.length); + } else if (arg === '--language') { + config.language = readOptionValue(argv, index, arg); + index++; + } else if (arg.startsWith('--language=')) { + config.language = arg.slice('--language='.length); + } + } + + return config; +} + +function readOptionValue(argv, index, optionName) { + const value = argv[index + 1]; + + if (value === undefined || value.startsWith('--')) { + throw new Error(`Missing value for ${optionName}`); + } + + return value; +} + +function escapeRegex(value) { + return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); +} + +export function extractReleaseNotes(changelog, version) { + // Read from CHANGELOG.md between this version header and the next version header. + const versionHeaderRegex = new RegExp( + `## ${escapeRegex(version)}[\\s\\S]*?(?=## \\d|$)` + ); + const match = changelog.match(versionHeaderRegex); + + if (!match) { + return `Release ${version}`; + } + + const releaseNotes = match[0].replace(`## ${version}`, '').trim(); + + return releaseNotes || `Release ${version}`; +} + +export function normalizeReleaseVersionForTitle(releaseVersion) { + const trimmedVersion = releaseVersion.trim(); + const semverTagMatch = trimmedVersion.match( + /(?:^|[-_])v?(\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?)$/i + ); + + if (semverTagMatch) { + return semverTagMatch[1]; + } + + return trimmedVersion + .replace(/^[A-Za-z][A-Za-z0-9]*[-_]/, '') + .replace(/^v/i, ''); +} + +export function buildReleaseTitle(language, releaseVersion) { + const titleLanguage = language.trim() || 'JavaScript'; + return `[${titleLanguage}] ${normalizeReleaseVersionForTitle(releaseVersion)}`; +} + +export function buildReleasePayload({ changelog, language, tag, version }) { + return JSON.stringify({ + tag_name: tag, + name: buildReleaseTitle(language ?? 'JavaScript', tag), + body: extractReleaseNotes(changelog, version), + }); +} + +function formatGhOutput(result) { + return [result.stderr, result.stdout] + .filter((output) => typeof output === 'string' && output.trim()) + .map((output) => output.trim()) + .join('\n'); +} + +function getGhExitDescription(result) { + if (result.signal) { + return `signal ${result.signal}`; + } + + if (typeof result.status === 'number') { + return `code ${result.status}`; + } + + return 'unknown exit status'; +} + +export function createRelease({ payload, repository, spawn = spawnSync }) { + const result = spawn( + 'gh', + ['api', `repos/${repository}/releases`, '-X', 'POST', '--input', '-'], + { + encoding: 'utf8', + input: payload, + } + ); + + if (result.error) { + throw new Error(`gh api failed to start: ${result.error.message}`); + } + + if (result.status === 0) { + return { alreadyExists: false }; + } + + const output = formatGhOutput(result); + + if (/already_exists/i.test(output)) { + return { alreadyExists: true }; + } + + const details = output ? `:\n${output}` : ''; + throw new Error( + `gh api failed with ${getGhExitDescription(result)}${details}` + ); +} + +export function main({ + argv = process.argv.slice(2), + cwd = process.cwd(), + env = process.env, + spawn = spawnSync, + stderr = console.error, + stdout = console.log, +} = {}) { + try { + const { + language, + releaseVersion: version, + repository, + tagPrefix, + } = parseArgs(argv, env); + + if (!version || !repository) { + stderr('Error: Missing required arguments'); + stderr(USAGE); + return 1; + } + + const tag = `${tagPrefix}${version}`; + + stdout(`Creating GitHub release for ${tag}...`); + + const changelog = readFileSync(path.join(cwd, 'CHANGELOG.md'), 'utf8'); + const payload = buildReleasePayload({ changelog, language, tag, version }); + const result = createRelease({ payload, repository, spawn }); + + if (result.alreadyExists) { + stdout(`GitHub release already exists: ${tag}. Skipping creation.`); + return 0; + } + + stdout(`\u2705 Created GitHub release: ${tag}`); + return 0; + } catch (error) { + stderr(`Error creating release: ${error.message}`); + return 1; + } +} + +function isCliEntryPoint() { + return ( + typeof process !== 'undefined' && + process.argv?.[1] && + fileURLToPath(import.meta.url) === path.resolve(process.argv[1]) + ); +} + +if (isCliEntryPoint()) { + process.exitCode = main(); +} diff --git a/docs/case-studies/issue-82/evidence/templates/js/scripts/create-manual-changeset.mjs b/docs/case-studies/issue-82/evidence/templates/js/scripts/create-manual-changeset.mjs new file mode 100644 index 0000000..ca5678f --- /dev/null +++ b/docs/case-studies/issue-82/evidence/templates/js/scripts/create-manual-changeset.mjs @@ -0,0 +1,100 @@ +#!/usr/bin/env bun + +/** + * Create a changeset file for manual releases + * Usage: node scripts/create-manual-changeset.mjs --bump-type [--description ] [--js-root ] + * + * Uses link-foundation libraries: + * - use-m: Dynamic package loading without package.json dependencies + * - command-stream: Modern shell command execution with streaming support + * - lino-arguments: Unified configuration from CLI args, env vars, and .lenv files + */ + +import { mkdirSync, writeFileSync } from 'fs'; +import { randomBytes } from 'crypto'; +import { join } from 'path'; + +import { getChangesetDir, getJsRoot, parseJsRootConfig } from './js-paths.mjs'; +import { formatChangesetHeader, readPackageInfo } from './package-info.mjs'; + +// Load use-m dynamically +const { use } = eval( + await (await fetch('https://unpkg.com/use-m/use.js')).text() +); + +// Import link-foundation libraries +const { $ } = await use('command-stream'); +const { makeConfig } = await use('lino-arguments'); + +// Parse CLI arguments using lino-arguments +const config = makeConfig({ + yargs: ({ yargs, getenv }) => + yargs + .option('bump-type', { + type: 'string', + default: getenv('BUMP_TYPE', ''), + describe: 'Version bump type: major, minor, or patch', + choices: ['major', 'minor', 'patch'], + }) + .option('description', { + type: 'string', + default: getenv('DESCRIPTION', ''), + describe: 'Description for the changeset', + }) + .option('js-root', { + type: 'string', + default: getenv('JS_ROOT', ''), + describe: + 'JavaScript package root directory (auto-detected if not specified)', + }), +}); + +try { + const { bumpType, description: descriptionArg, jsRoot: jsRootArg } = config; + + // Use provided description or default based on bump type + const description = descriptionArg || `Manual ${bumpType} release`; + + if (!bumpType || !['major', 'minor', 'patch'].includes(bumpType)) { + console.error( + 'Usage: node scripts/create-manual-changeset.mjs --bump-type [--description ]' + ); + process.exit(1); + } + + const jsRootConfig = jsRootArg || parseJsRootConfig(); + const jsRoot = getJsRoot({ jsRoot: jsRootConfig, verbose: true }); + const changesetDir = getChangesetDir({ jsRoot }); + const { name: packageName } = readPackageInfo({ jsRoot }); + + // Generate a random changeset ID + const changesetId = randomBytes(4).toString('hex'); + const changesetFile = join(changesetDir, `manual-release-${changesetId}.md`); + + // Create the changeset file with single quotes to match Prettier config + const content = `--- +${formatChangesetHeader(packageName, bumpType)} +--- + +${description} +`; + + mkdirSync(changesetDir, { recursive: true }); + writeFileSync(changesetFile, content, 'utf-8'); + + console.log(`Created changeset: ${changesetFile}`); + console.log('Content:'); + console.log(content); + + // Format with Prettier + console.log('\nFormatting with Prettier...'); + await $`npx prettier --write "${changesetFile}"`; + + console.log('\n✅ Changeset created and formatted successfully'); +} catch (error) { + console.error('Error creating changeset:', error.message); + if (process.env.DEBUG) { + console.error('Stack trace:', error.stack); + } + process.exit(1); +} diff --git a/docs/case-studies/issue-82/evidence/templates/js/scripts/detect-code-changes.mjs b/docs/case-studies/issue-82/evidence/templates/js/scripts/detect-code-changes.mjs new file mode 100644 index 0000000..eff9c12 --- /dev/null +++ b/docs/case-studies/issue-82/evidence/templates/js/scripts/detect-code-changes.mjs @@ -0,0 +1,153 @@ +#!/usr/bin/env node + +// Detect code changes for CI/CD pipeline +// +// Detects what types of files changed in the latest commit and outputs +// results for use in GitHub Actions workflow conditions. +// +// For PRs: GitHub Actions checks out a synthetic merge commit, so we +// compare HEAD^2^ to HEAD^2 (the PR head's per-commit diff). +// For pushes: compares HEAD^ to HEAD. +// This ensures a commit touching only non-code files skips tests, +// even when earlier commits in the same PR changed code. +// +// Excluded from code changes (don't require changesets): +// - Markdown files in any folder +// - .changeset/ folder (changeset metadata) +// - docs/ folder (documentation) +// - experiments/ folder (experimental scripts) +// - examples/ folder (example scripts) +// +// Outputs (written to GITHUB_OUTPUT): +// mjs-changed, js-changed, package-changed, docs-changed, +// workflow-changed, any-code-changed + +import { execSync } from 'child_process'; +import { appendFileSync } from 'fs'; + +function exec(command) { + try { + return execSync(command, { encoding: 'utf-8' }).trim(); + } catch (error) { + console.error(`Error executing command: ${command}`); + console.error(error.message); + return ''; + } +} + +function setOutput(name, value) { + const outputFile = process.env.GITHUB_OUTPUT; + if (outputFile) { + appendFileSync(outputFile, `${name}=${value}\n`); + } + console.log(`${name}=${value}`); +} + +function isMergeCommit() { + const parentCount = exec('git cat-file -p HEAD') + .split('\n') + .filter((line) => line.startsWith('parent ')).length; + return parentCount > 1; +} + +function getChangedFiles() { + // GitHub Actions checks out a synthetic merge commit for pull_request + // events: HEAD is the merge commit, HEAD^ is the base branch, HEAD^2 + // is the actual PR head. To get the per-commit diff (what the latest + // push actually changed), we compare HEAD^2^ to HEAD^2. + // For push events, HEAD is the real commit, so HEAD^ to HEAD works. + if (isMergeCommit()) { + console.log('Merge commit detected (pull_request event)'); + console.log('Comparing HEAD^2^ to HEAD^2 (per-commit diff of PR head)'); + try { + const output = exec('git diff --name-only HEAD^2^ HEAD^2'); + return output ? output.split('\n').filter(Boolean) : []; + } catch { + console.log( + 'HEAD^2^ not available (first commit in PR), listing files in HEAD^2' + ); + const output = exec('git diff --name-only HEAD^ HEAD^2'); + return output ? output.split('\n').filter(Boolean) : []; + } + } + + console.log('Comparing HEAD^ to HEAD'); + try { + const output = exec('git diff --name-only HEAD^ HEAD'); + return output ? output.split('\n').filter(Boolean) : []; + } catch { + console.log('HEAD^ not available, listing all files in HEAD'); + const output = exec('git ls-tree --name-only -r HEAD'); + return output ? output.split('\n').filter(Boolean) : []; + } +} + +function isExcludedFromCodeChanges(filePath) { + if (filePath.endsWith('.md')) { + return true; + } + + const excludedFolders = ['.changeset/', 'docs/', 'experiments/', 'examples/']; + + for (const folder of excludedFolders) { + if (filePath.startsWith(folder)) { + return true; + } + } + + return false; +} + +function detectChanges() { + console.log('Detecting file changes for CI/CD...\n'); + + const changedFiles = getChangedFiles(); + + console.log('Changed files:'); + if (changedFiles.length === 0) { + console.log(' (none)'); + } else { + changedFiles.forEach((file) => console.log(` ${file}`)); + } + console.log(''); + + const mjsChanged = changedFiles.some((file) => file.endsWith('.mjs')); + setOutput('mjs-changed', mjsChanged ? 'true' : 'false'); + + const jsChanged = changedFiles.some((file) => file.endsWith('.js')); + setOutput('js-changed', jsChanged ? 'true' : 'false'); + + const packageChanged = changedFiles.some((file) => file === 'package.json'); + setOutput('package-changed', packageChanged ? 'true' : 'false'); + + const docsChanged = changedFiles.some((file) => file.endsWith('.md')); + setOutput('docs-changed', docsChanged ? 'true' : 'false'); + + const workflowChanged = changedFiles.some((file) => + file.startsWith('.github/workflows/') + ); + setOutput('workflow-changed', workflowChanged ? 'true' : 'false'); + + const codeChangedFiles = changedFiles.filter( + (file) => !isExcludedFromCodeChanges(file) + ); + + console.log('\nFiles considered as code changes:'); + if (codeChangedFiles.length === 0) { + console.log(' (none)'); + } else { + codeChangedFiles.forEach((file) => console.log(` ${file}`)); + } + console.log(''); + + const codePattern = /\.(mjs|js|json|yml|yaml)$|\.github\/workflows\//; + const anyCodeChanged = codeChangedFiles.some((file) => + codePattern.test(file) + ); + setOutput('any-code-changed', anyCodeChanged ? 'true' : 'false'); + + console.log('\nChange detection completed.'); +} + +// Run the detection +detectChanges(); diff --git a/docs/case-studies/issue-82/evidence/templates/js/scripts/format-github-release.mjs b/docs/case-studies/issue-82/evidence/templates/js/scripts/format-github-release.mjs new file mode 100644 index 0000000..a7dbadb --- /dev/null +++ b/docs/case-studies/issue-82/evidence/templates/js/scripts/format-github-release.mjs @@ -0,0 +1,90 @@ +#!/usr/bin/env bun + +/** + * Format GitHub release notes using the format-release-notes.mjs script + * Usage: node scripts/format-github-release.mjs --release-version --repository --commit-sha [--tag-prefix ] + * release-version: Version number (e.g., 1.0.0) + * repository: GitHub repository (e.g., owner/repo) + * commit_sha: Commit SHA for PR detection + * tag-prefix: Prefix for the git tag (default: "v", use "js-v" for multi-language repos) + * + * Uses link-foundation libraries: + * - use-m: Dynamic package loading without package.json dependencies + * - command-stream: Modern shell command execution with streaming support + * - lino-arguments: Unified configuration from CLI args, env vars, and .lenv files + */ + +// Load use-m dynamically +const { use } = eval( + await (await fetch('https://unpkg.com/use-m/use.js')).text() +); + +// Import link-foundation libraries +const { $ } = await use('command-stream'); +const { makeConfig } = await use('lino-arguments'); + +// Parse CLI arguments using lino-arguments +// Note: Using --release-version instead of --version to avoid conflict with yargs' built-in --version flag +const config = makeConfig({ + yargs: ({ yargs, getenv }) => + yargs + .option('release-version', { + type: 'string', + default: getenv('VERSION', ''), + describe: 'Version number (e.g., 1.0.0)', + }) + .option('repository', { + type: 'string', + default: getenv('REPOSITORY', ''), + describe: 'GitHub repository (e.g., owner/repo)', + }) + .option('commit-sha', { + type: 'string', + default: getenv('COMMIT_SHA', ''), + describe: 'Commit SHA for PR detection', + }) + .option('tag-prefix', { + type: 'string', + default: getenv('TAG_PREFIX', 'v'), + describe: + 'Prefix for the git tag (e.g., "js-v" for multi-language repos)', + }), +}); + +const { releaseVersion: version, repository, commitSha, tagPrefix } = config; + +if (!version || !repository || !commitSha) { + console.error('Error: Missing required arguments'); + console.error( + 'Usage: node scripts/format-github-release.mjs --release-version --repository --commit-sha [--tag-prefix ]' + ); + process.exit(1); +} + +const tag = `${tagPrefix}${version}`; + +try { + // Get the release ID for this version + let releaseId = ''; + try { + const result = + await $`gh api "repos/${repository}/releases/tags/${tag}" --jq '.id'`.run( + { capture: true } + ); + releaseId = result.stdout.trim(); + } catch { + console.log(`\u26A0\uFE0F Could not find release for ${tag}`); + process.exit(0); + } + + if (releaseId) { + console.log(`Formatting release notes for ${tag}...`); + // Pass the trigger commit SHA for PR detection + // This allows proper PR lookup even if the changelog doesn't have a commit hash + await $`node scripts/format-release-notes.mjs --release-id "${releaseId}" --release-version "${tag}" --repository "${repository}" --commit-sha "${commitSha}"`; + console.log(`\u2705 Formatted release notes for ${tag}`); + } +} catch (error) { + console.error('Error formatting release:', error.message); + process.exit(1); +} diff --git a/docs/case-studies/issue-82/evidence/templates/js/scripts/format-release-notes-helpers.mjs b/docs/case-studies/issue-82/evidence/templates/js/scripts/format-release-notes-helpers.mjs new file mode 100644 index 0000000..f182524 --- /dev/null +++ b/docs/case-studies/issue-82/evidence/templates/js/scripts/format-release-notes-helpers.mjs @@ -0,0 +1,26 @@ +export function normalizeReleaseVersionForBadge(releaseVersion) { + const trimmedVersion = releaseVersion.trim(); + const semverTagMatch = trimmedVersion.match( + /(?:^|-)v?(\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?)$/i + ); + + if (semverTagMatch) { + return semverTagMatch[1]; + } + + return trimmedVersion + .replace(/^[A-Za-z][A-Za-z0-9]*-/, '') + .replace(/^v/i, ''); +} + +export function encodeShieldsStaticBadgeSegment(value) { + return encodeURIComponent(value).replace(/-/g, '--').replace(/_/g, '__'); +} + +export function buildNpmVersionBadge(packageName, releaseVersion) { + const versionWithoutV = normalizeReleaseVersionForBadge(releaseVersion); + const badgeVersion = encodeShieldsStaticBadgeSegment(versionWithoutV); + const packageVersionPath = encodeURIComponent(versionWithoutV); + + return `[![npm version](https://img.shields.io/badge/npm-${badgeVersion}-blue.svg)](https://www.npmjs.com/package/${packageName}/v/${packageVersionPath})`; +} diff --git a/docs/case-studies/issue-82/evidence/templates/js/scripts/format-release-notes.mjs b/docs/case-studies/issue-82/evidence/templates/js/scripts/format-release-notes.mjs new file mode 100644 index 0000000..94bd93a --- /dev/null +++ b/docs/case-studies/issue-82/evidence/templates/js/scripts/format-release-notes.mjs @@ -0,0 +1,230 @@ +#!/usr/bin/env node + +/** + * Script to format GitHub release notes with proper formatting: + * - Fix special characters like \n + * - Add link to PR that contains the release commit (if found) + * - Add shields.io NPM version badge + * - Format nicely with proper markdown + * + * PR Detection Logic: + * 1. Extract commit hash from changelog entry (if present) + * 2. Fall back to --commit-sha argument (passed from workflow) + * 3. Look up PRs that contain the commit via GitHub API + * 4. If no PR found, simply don't display any PR link (no guessing) + * + * Uses link-foundation libraries: + * - use-m: Dynamic package loading without package.json dependencies + * - command-stream: Modern shell command execution with streaming support + * - lino-arguments: Unified configuration from CLI args, env vars, and .lenv files + * + * Note: Uses --release-version instead of --version to avoid conflict with yargs' built-in --version flag. + */ + +import { getJsRoot, parseJsRootConfig } from './js-paths.mjs'; +import { readPackageInfo } from './package-info.mjs'; +import { + buildNpmVersionBadge, + normalizeReleaseVersionForBadge, +} from './format-release-notes-helpers.mjs'; + +// Load use-m dynamically +const { use } = eval( + await (await fetch('https://unpkg.com/use-m/use.js')).text() +); + +// Import link-foundation libraries +const { $ } = await use('command-stream'); +const { makeConfig } = await use('lino-arguments'); + +// Parse CLI arguments using lino-arguments +// Note: Using --release-version instead of --version to avoid conflict with yargs' built-in --version flag +const config = makeConfig({ + yargs: ({ yargs, getenv }) => + yargs + .option('release-version', { + type: 'string', + default: getenv('VERSION', ''), + describe: 'Version number (e.g., v0.8.36)', + }) + .option('release-id', { + type: 'string', + default: getenv('RELEASE_ID', ''), + describe: 'GitHub release ID', + }) + .option('repository', { + type: 'string', + default: getenv('REPOSITORY', ''), + describe: 'GitHub repository (e.g., owner/repo)', + }) + .option('commit-sha', { + type: 'string', + default: getenv('COMMIT_SHA', ''), + describe: 'Commit SHA for PR detection', + }) + .option('js-root', { + type: 'string', + default: getenv('JS_ROOT', ''), + describe: + 'JavaScript package root directory (auto-detected if not specified)', + }), +}); + +const releaseId = config.releaseId; +const version = config.releaseVersion; +const repository = config.repository; +const passedCommitSha = config.commitSha; +const jsRootConfig = config.jsRoot || parseJsRootConfig(); +const jsRoot = getJsRoot({ jsRoot: jsRootConfig, verbose: true }); +const { name: packageName } = readPackageInfo({ jsRoot }); + +if (!releaseId || !version || !repository) { + console.error( + 'Usage: format-release-notes.mjs --release-id --release-version --repository [--commit-sha ]' + ); + process.exit(1); +} + +try { + // Get current release body + const result = await $`gh api repos/${repository}/releases/${releaseId}`.run({ + capture: true, + }); + const releaseData = JSON.parse(result.stdout); + + const currentBody = releaseData.body || ''; + + // Skip if already formatted (has shields.io badge image) + if (currentBody.includes('img.shields.io')) { + console.log('ℹ️ Release notes already formatted'); + process.exit(0); + } + + // Extract changes section (Major, Minor, or Patch) + // This regex handles multiple formats: + // 1. With commit hash: "### [Major|Minor|Patch] Changes\n- abc1234: Description" + // 2. Without commit hash: "### [Major|Minor|Patch] Changes\n- Description" + const changesPattern = + /### (Major|Minor|Patch) Changes\s*\n\s*-\s+(?:([a-f0-9]+):\s+)?(.+?)$/s; + const changesMatch = currentBody.match(changesPattern); + + let commitHash = null; + let rawDescription = null; + let changeType = null; + + if (changesMatch) { + // Extract: [full match, changeType, commitHash (optional), description] + [, changeType, commitHash, rawDescription] = changesMatch; + console.log(`ℹ️ Found ${changeType} Changes section`); + + // If commitHash is undefined and description contains it, try to extract + if (!commitHash && rawDescription) { + // This handles the case where description itself might be null/undefined + // and we need to safely check for commit hash at the start + const descWithHashMatch = rawDescription.match(/^([a-f0-9]+):\s+(.+)$/s); + if (descWithHashMatch) { + [, commitHash, rawDescription] = descWithHashMatch; + } + } + } else { + console.log('⚠️ Could not parse changes from release notes'); + console.log(' Looking for pattern: ### [Major|Minor|Patch] Changes'); + process.exit(0); + } + + // Clean up the description: + // 1. Convert literal \n sequences (escaped newlines from GitHub API) to actual newlines + // 2. Remove leading/trailing quotes (including escaped quotes from command-stream shell escaping) + // 3. Remove any trailing npm package links or markdown that might be there + // 4. Normalize whitespace while preserving line breaks + const cleanDescription = rawDescription + .replace(/\\n/g, '\n') // Convert escaped \n to actual newlines + .replace(/^(\\['"])+/g, '') // Remove leading escaped quotes (e.g., \', \", \'', \'') + .replace(/(['"])+$/g, '') // Remove trailing unescaped quotes (e.g., ', ", '', '') + .replace(/^(['"])+/g, '') // Remove leading unescaped quotes + .replace(/📦.*$/s, '') // Remove any existing npm package info + .replace(/---.*$/s, '') // Remove any existing separators and everything after + .trim() + .split('\n') // Split by lines + .map((line) => line.trim()) // Trim whitespace from each line + .join('\n') // Rejoin with newlines + .replace(/\n{3,}/g, '\n\n'); // Normalize excessive blank lines (3+ becomes 2) + + // Find the PR that contains the release commit + // Uses commit hash from changelog or passed commit SHA from workflow + let prNumber = null; + + // Determine which commit SHA to use for PR lookup + const commitShaToLookup = commitHash || passedCommitSha; + + if (commitShaToLookup) { + const source = commitHash ? 'changelog' : 'workflow'; + console.log( + `ℹ️ Looking up PR for commit ${commitShaToLookup} (from ${source})` + ); + + try { + const prResult = + await $`gh api "repos/${repository}/commits/${commitShaToLookup}/pulls"`.run( + { capture: true } + ); + const prsData = JSON.parse(prResult.stdout); + + // Find the PR that's not the version bump PR (not "chore: version packages") + const relevantPr = prsData.find( + (pr) => !pr.title.includes('version packages') + ); + + if (relevantPr) { + prNumber = relevantPr.number; + console.log(`✅ Found PR #${prNumber} containing commit`); + } else if (prsData.length > 0) { + console.log( + '⚠️ Found PRs but all are version bump PRs, not linking any' + ); + } else { + console.log( + 'ℹ️ No PR found containing this commit - not adding PR link' + ); + } + } catch (error) { + console.log('⚠️ Could not find PR for commit', commitShaToLookup); + console.log(' Error:', error.message); + if (process.env.DEBUG) { + console.error(error); + } + } + } else { + // No commit hash available from any source + console.log('ℹ️ No commit SHA available - not adding PR link'); + } + + // Build formatted release notes + const versionWithoutV = normalizeReleaseVersionForBadge(version); + const npmBadge = buildNpmVersionBadge(packageName, version); + + let formattedBody = `${cleanDescription}`; + + // Add PR link if available + if (prNumber) { + formattedBody += `\n\n**Related Pull Request:** #${prNumber}`; + } + + formattedBody += `\n\n---\n\n${npmBadge}`; + + // Update the release using JSON input to properly handle special characters + const updatePayload = JSON.stringify({ body: formattedBody }); + await $`gh api repos/${repository}/releases/${releaseId} -X PATCH --input -`.run( + { stdin: updatePayload } + ); + + console.log(`✅ Formatted release notes for v${versionWithoutV}`); + if (prNumber) { + console.log(` - Added link to PR #${prNumber}`); + } + console.log(' - Added shields.io npm badge'); + console.log(' - Cleaned up formatting'); +} catch (error) { + console.error('❌ Error formatting release notes:', error.message); + process.exit(1); +} diff --git a/docs/case-studies/issue-82/evidence/templates/js/scripts/instant-version-bump.mjs b/docs/case-studies/issue-82/evidence/templates/js/scripts/instant-version-bump.mjs new file mode 100644 index 0000000..da259fa --- /dev/null +++ b/docs/case-studies/issue-82/evidence/templates/js/scripts/instant-version-bump.mjs @@ -0,0 +1,172 @@ +#!/usr/bin/env bun + +/** + * Instant version bump script for manual releases + * Bypasses the changeset workflow and directly updates version and changelog + * + * Usage: node scripts/instant-version-bump.mjs --bump-type [--description ] [--js-root ] + * + * Configuration: + * - CLI: --js-root to explicitly set JavaScript root + * - Environment: JS_ROOT= + * + * Uses link-foundation libraries: + * - use-m: Dynamic package loading without package.json dependencies + * - command-stream: Modern shell command execution with streaming support + * - lino-arguments: Unified configuration from CLI args, env vars, and .lenv files + * + * Addresses issues documented in: + * - Issue #21: Supporting both single and multi-language repository structures + * - Reference: link-assistant/agent PR #112 (--legacy-peer-deps fix) + * - Reference: link-assistant/agent PR #114 (configurable package root) + */ + +import { readFileSync, writeFileSync } from 'fs'; +import { join } from 'path'; + +import { + getJsRoot, + getPackageJsonPath, + needsCd, + parseJsRootConfig, +} from './js-paths.mjs'; + +// Load use-m dynamically +const { use } = eval( + await (await fetch('https://unpkg.com/use-m/use.js')).text() +); + +// Import link-foundation libraries +const { $ } = await use('command-stream'); +const { makeConfig } = await use('lino-arguments'); + +// Parse CLI arguments using lino-arguments +const config = makeConfig({ + yargs: ({ yargs, getenv }) => + yargs + .option('bump-type', { + type: 'string', + default: getenv('BUMP_TYPE', ''), + describe: 'Version bump type: major, minor, or patch', + choices: ['major', 'minor', 'patch'], + }) + .option('description', { + type: 'string', + default: getenv('DESCRIPTION', ''), + describe: 'Description for the version bump', + }) + .option('js-root', { + type: 'string', + default: getenv('JS_ROOT', ''), + describe: + 'JavaScript package root directory (auto-detected if not specified)', + }), +}); + +// Store the original working directory to restore after cd commands +// IMPORTANT: command-stream's cd is a virtual command that calls process.chdir() +const originalCwd = process.cwd(); + +try { + const { bumpType, description, jsRoot: jsRootArg } = config; + + // Get JavaScript package root (auto-detect or use explicit config) + const jsRootConfig = jsRootArg || parseJsRootConfig(); + const jsRoot = getJsRoot({ jsRoot: jsRootConfig, verbose: true }); + + const finalDescription = description || `Manual ${bumpType} release`; + + if (!bumpType || !['major', 'minor', 'patch'].includes(bumpType)) { + console.error( + 'Usage: node scripts/instant-version-bump.mjs --bump-type [--description ] [--js-root ]' + ); + process.exit(1); + } + + console.log(`\nBumping version (${bumpType})...`); + + // Get current version + const packageJsonPath = getPackageJsonPath({ jsRoot }); + const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8')); + const oldVersion = packageJson.version; + console.log(`Current version: ${oldVersion}`); + + // Bump version using npm version (doesn't create git tag) + // IMPORTANT: cd is a virtual command that calls process.chdir(), so we restore after + if (needsCd({ jsRoot })) { + await $`cd ${jsRoot} && npm version ${bumpType} --no-git-tag-version`; + process.chdir(originalCwd); + } else { + await $`npm version ${bumpType} --no-git-tag-version`; + } + + // Get new version + const updatedPackageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8')); + const newVersion = updatedPackageJson.version; + console.log(`New version: ${newVersion}`); + + // Update CHANGELOG.md + console.log('\nUpdating CHANGELOG.md...'); + const changelogPath = + jsRoot === '.' ? 'CHANGELOG.md' : join(jsRoot, 'CHANGELOG.md'); + let changelog = readFileSync(changelogPath, 'utf-8'); + + // Create new changelog entry + const newEntry = `## ${newVersion} + +### ${bumpType.charAt(0).toUpperCase() + bumpType.slice(1)} Changes + +- ${finalDescription} + +`; + + // Insert new entry after the first heading (# Changelog or similar) + // Look for the first ## heading and insert before it + const firstVersionMatch = changelog.match(/^## /m); + + if (firstVersionMatch) { + const insertPosition = firstVersionMatch.index; + changelog = + changelog.slice(0, insertPosition) + + newEntry + + changelog.slice(insertPosition); + } else { + // If no version headings exist, append after the main heading + const mainHeadingMatch = changelog.match(/^# .+$/m); + if (mainHeadingMatch) { + const insertPosition = + mainHeadingMatch.index + mainHeadingMatch[0].length; + changelog = `${changelog.slice(0, insertPosition)}\n\n${newEntry}${changelog.slice(insertPosition)}`; + } else { + // If no headings at all, prepend + changelog = `${newEntry}\n${changelog}`; + } + } + + writeFileSync(changelogPath, changelog, 'utf-8'); + console.log('✅ CHANGELOG.md updated'); + + // Synchronize package-lock.json + console.log('\nSynchronizing package-lock.json...'); + + // Use --legacy-peer-deps to handle peer dependency conflicts + // This addresses npm ERESOLVE errors documented in issue #111 / PR #112 + // IMPORTANT: cd is a virtual command that calls process.chdir(), so we restore after + if (needsCd({ jsRoot })) { + await $`cd ${jsRoot} && npm install --package-lock-only --legacy-peer-deps`; + process.chdir(originalCwd); + } else { + await $`npm install --package-lock-only --legacy-peer-deps`; + } + + console.log('\n✅ Instant version bump complete'); + console.log(`Version: ${oldVersion} → ${newVersion}`); +} catch (error) { + // Restore cwd on error + process.chdir(originalCwd); + console.error('Error during instant version bump:', error.message); + if (process.env.DEBUG) { + console.error('Stack trace:', error.stack); + } + process.exit(1); +} diff --git a/docs/case-studies/issue-82/evidence/templates/js/scripts/js-paths.mjs b/docs/case-studies/issue-82/evidence/templates/js/scripts/js-paths.mjs new file mode 100644 index 0000000..2f25345 --- /dev/null +++ b/docs/case-studies/issue-82/evidence/templates/js/scripts/js-paths.mjs @@ -0,0 +1,177 @@ +#!/usr/bin/env node + +/** + * JavaScript package path detection utility + * + * Automatically detects the JavaScript package root for both: + * - Single-language repositories (package.json in root) + * - Multi-language repositories (package.json in js/ subfolder) + * + * This utility addresses the issues documented in: + * - Issue #21: Supporting both single and multi-language repository structures + * - Reference: link-assistant/agent PR #114 + * + * Usage: + * import { getJsRoot, getPackageJsonPath, getChangesetDir, needsCd } from './js-paths.mjs'; + * + * const jsRoot = getJsRoot(); // Returns 'js' or '.' + * const pkgPath = getPackageJsonPath(); // Returns 'js/package.json' or './package.json' + * const changesetDir = getChangesetDir(); // Returns 'js/.changeset' or './.changeset' + * + * Configuration: + * - CLI: --js-root + * - Environment: JS_ROOT= + */ + +import { existsSync } from 'node:fs'; +import { join } from 'node:path'; + +// Cache for detected paths (computed once per process) +let cachedJsRoot = null; + +/** + * Detect JavaScript package root directory + * Checks in order: + * 1. ./package.json (single-language repo) + * 2. ./js/package.json (multi-language repo) + * + * @param {Object} options - Configuration options + * @param {string} [options.jsRoot] - Explicitly set JavaScript root (overrides auto-detection) + * @param {boolean} [options.verbose=false] - Log detection details + * @returns {string} The JavaScript root directory ('.' or 'js') + * @throws {Error} If no package.json is found in expected locations + */ +export function getJsRoot(options = {}) { + const { jsRoot: explicitRoot, verbose = false } = options; + + // If explicitly configured, use that + if (explicitRoot !== undefined && explicitRoot !== '') { + if (verbose) { + console.log( + `Using explicitly configured JavaScript root: ${explicitRoot}` + ); + } + return explicitRoot; + } + + // Return cached value if already computed + if (cachedJsRoot !== null) { + return cachedJsRoot; + } + + // Check for single-language repo (package.json in root) + if (existsSync('./package.json')) { + if (verbose) { + console.log('Detected single-language repository (package.json in root)'); + } + cachedJsRoot = '.'; + return cachedJsRoot; + } + + // Check for multi-language repo (package.json in js/ subfolder) + if (existsSync('./js/package.json')) { + if (verbose) { + console.log('Detected multi-language repository (package.json in js/)'); + } + cachedJsRoot = 'js'; + return cachedJsRoot; + } + + // No package.json found + throw new Error( + 'Could not find package.json in expected locations.\n' + + 'Searched in:\n' + + ' - ./package.json (single-language repository)\n' + + ' - ./js/package.json (multi-language repository)\n\n' + + 'To fix this, either:\n' + + ' 1. Run the script from the repository root\n' + + ' 2. Explicitly configure the JavaScript root using --js-root option\n' + + ' 3. Set the JS_ROOT environment variable' + ); +} + +/** + * Get the path to package.json + * @param {Object} options - Configuration options (passed to getJsRoot) + * @returns {string} Path to package.json + */ +export function getPackageJsonPath(options = {}) { + const jsRoot = + options.jsRoot !== undefined ? options.jsRoot : getJsRoot(options); + return jsRoot === '.' ? './package.json' : join(jsRoot, 'package.json'); +} + +/** + * Get the path to package-lock.json + * @param {Object} options - Configuration options (passed to getJsRoot) + * @returns {string} Path to package-lock.json + */ +export function getPackageLockPath(options = {}) { + const jsRoot = + options.jsRoot !== undefined ? options.jsRoot : getJsRoot(options); + return jsRoot === '.' + ? './package-lock.json' + : join(jsRoot, 'package-lock.json'); +} + +/** + * Get the path to .changeset directory + * @param {Object} options - Configuration options (passed to getJsRoot) + * @returns {string} Path to .changeset directory + */ +export function getChangesetDir(options = {}) { + const jsRoot = + options.jsRoot !== undefined ? options.jsRoot : getJsRoot(options); + return jsRoot === '.' ? './.changeset' : join(jsRoot, '.changeset'); +} + +/** + * Get the cd command prefix for running npm commands + * Returns empty string for single-language repos, 'cd js && ' for multi-language repos + * @param {Object} options - Configuration options (passed to getJsRoot) + * @returns {string} CD prefix for shell commands + */ +export function getCdPrefix(options = {}) { + const jsRoot = + options.jsRoot !== undefined ? options.jsRoot : getJsRoot(options); + return jsRoot === '.' ? '' : `cd ${jsRoot} && `; +} + +/** + * Check if we need to change directory before running npm commands + * @param {Object} options - Configuration options (passed to getJsRoot) + * @returns {boolean} True if cd is needed + */ +export function needsCd(options = {}) { + const jsRoot = + options.jsRoot !== undefined ? options.jsRoot : getJsRoot(options); + return jsRoot !== '.'; +} + +/** + * Reset the cached JavaScript root (useful for testing) + */ +export function resetCache() { + cachedJsRoot = null; +} + +/** + * Parse JavaScript root from CLI arguments or environment + * Supports --js-root argument and JS_ROOT environment variable + * @returns {string|undefined} Configured JavaScript root or undefined for auto-detection + */ +export function parseJsRootConfig() { + // Check CLI arguments + const args = process.argv.slice(2); + const jsRootIndex = args.indexOf('--js-root'); + if (jsRootIndex >= 0 && args[jsRootIndex + 1]) { + return args[jsRootIndex + 1]; + } + + // Check environment variable + if (process.env.JS_ROOT) { + return process.env.JS_ROOT; + } + + return undefined; +} diff --git a/docs/case-studies/issue-82/evidence/templates/js/scripts/merge-changesets.mjs b/docs/case-studies/issue-82/evidence/templates/js/scripts/merge-changesets.mjs new file mode 100644 index 0000000..4a64b19 --- /dev/null +++ b/docs/case-studies/issue-82/evidence/templates/js/scripts/merge-changesets.mjs @@ -0,0 +1,274 @@ +#!/usr/bin/env bun + +/** + * Merge multiple changeset files into a single changeset + * + * Key behavior: + * - Combines all pending changesets into a single changeset file + * - Uses the highest version bump type (major > minor > patch) + * - Preserves all descriptions in chronological order (by file modification time) + * - Removes the individual changeset files after merging + * - Does nothing if there's only one or no changesets + * + * This script is run before `changeset version` to ensure a clean release + * even when multiple PRs have merged before a release cycle. + */ + +import { + readdirSync, + readFileSync, + writeFileSync, + unlinkSync, + statSync, +} from 'fs'; +import { join } from 'path'; + +import { getChangesetDir, getJsRoot, parseJsRootConfig } from './js-paths.mjs'; +import { + formatChangesetHeader, + getChangesetVersionTypeRegex, + readPackageInfo, +} from './package-info.mjs'; + +// Version bump type priority (higher number = higher priority) +const BUMP_PRIORITY = { + patch: 1, + minor: 2, + major: 3, +}; + +/** + * Generate a random changeset file name (similar to what @changesets/cli does) + * @returns {string} + */ +function generateChangesetName() { + const adjectives = [ + 'bright', + 'calm', + 'cool', + 'cyan', + 'dark', + 'fast', + 'gold', + 'good', + 'green', + 'happy', + 'kind', + 'loud', + 'neat', + 'nice', + 'pink', + 'proud', + 'quick', + 'red', + 'rich', + 'safe', + 'shy', + 'soft', + 'sweet', + 'tall', + 'warm', + 'wise', + 'young', + ]; + const nouns = [ + 'apple', + 'bird', + 'book', + 'car', + 'cat', + 'cloud', + 'desk', + 'dog', + 'door', + 'fish', + 'flower', + 'frog', + 'grass', + 'house', + 'key', + 'lake', + 'leaf', + 'moon', + 'mouse', + 'owl', + 'park', + 'rain', + 'river', + 'rock', + 'sea', + 'star', + 'sun', + 'tree', + 'wave', + 'wind', + ]; + + const randomAdjective = + adjectives[Math.floor(Math.random() * adjectives.length)]; + const randomNoun = nouns[Math.floor(Math.random() * nouns.length)]; + + return `${randomAdjective}-${randomNoun}`; +} + +/** + * Parse a changeset file and extract its metadata + * @param {string} filePath + * @param {string} packageName + * @returns {{type: string, description: string, mtime: Date} | null} + */ +function parseChangeset(filePath, packageName) { + try { + const content = readFileSync(filePath, 'utf-8'); + const stats = statSync(filePath); + + // Extract version type - support both quoted and unquoted package names + const versionTypeRegex = getChangesetVersionTypeRegex(packageName, { + requireQuotes: false, + }); + const versionTypeMatch = content.match(versionTypeRegex); + + if (!versionTypeMatch) { + console.warn( + `Warning: Could not parse version type from ${filePath}, skipping` + ); + return null; + } + + // Extract description + const parts = content.split('---'); + const description = + parts.length >= 3 ? parts.slice(2).join('---').trim() : ''; + + return { + type: versionTypeMatch[1], + description, + mtime: stats.mtime, + }; + } catch (error) { + console.warn(`Warning: Failed to parse ${filePath}: ${error.message}`); + return null; + } +} + +/** + * Get the highest priority bump type + * @param {string[]} types + * @returns {string} + */ +function getHighestBumpType(types) { + let highest = 'patch'; + for (const type of types) { + if (BUMP_PRIORITY[type] > BUMP_PRIORITY[highest]) { + highest = type; + } + } + return highest; +} + +/** + * Create a merged changeset file + * @param {string} type + * @param {string[]} descriptions + * @param {string} packageName + * @returns {string} + */ +function createMergedChangeset(type, descriptions, packageName) { + const combinedDescription = descriptions.join('\n\n'); + + return `--- +${formatChangesetHeader(packageName, type)} +--- + +${combinedDescription} +`; +} + +function main() { + console.log('Checking for multiple changesets to merge...'); + const jsRootConfig = parseJsRootConfig(); + const jsRoot = getJsRoot({ jsRoot: jsRootConfig, verbose: true }); + const changesetDir = getChangesetDir({ jsRoot }); + const { name: packageName } = readPackageInfo({ jsRoot }); + console.log(`Package: ${packageName}`); + + // Get all changeset files + const changesetFiles = readdirSync(changesetDir).filter( + (file) => file.endsWith('.md') && file !== 'README.md' + ); + + console.log(`Found ${changesetFiles.length} changeset file(s)`); + + // If 0 or 1 changesets, nothing to merge + if (changesetFiles.length <= 1) { + console.log('No merging needed (0 or 1 changeset found)'); + return; + } + + console.log('Multiple changesets found, merging...'); + changesetFiles.forEach((file) => console.log(` - ${file}`)); + + // Parse all changesets + const parsedChangesets = []; + for (const file of changesetFiles) { + const filePath = join(changesetDir, file); + const parsed = parseChangeset(filePath, packageName); + if (parsed) { + parsedChangesets.push({ + file, + filePath, + ...parsed, + }); + } + } + + if (parsedChangesets.length === 0) { + console.error('Error: No valid changesets could be parsed'); + process.exit(1); + } + + // Sort by modification time (oldest first) to preserve chronological order + parsedChangesets.sort((a, b) => a.mtime.getTime() - b.mtime.getTime()); + + // Determine the highest bump type + const bumpTypes = parsedChangesets.map((c) => c.type); + const highestBumpType = getHighestBumpType(bumpTypes); + + console.log(`\nMerge summary:`); + console.log(` Bump types found: ${[...new Set(bumpTypes)].join(', ')}`); + console.log(` Using highest: ${highestBumpType}`); + + // Collect descriptions in chronological order + const descriptions = parsedChangesets + .filter((c) => c.description) + .map((c) => c.description); + + console.log(` Descriptions to merge: ${descriptions.length}`); + + // Create merged changeset content + const mergedContent = createMergedChangeset( + highestBumpType, + descriptions, + packageName + ); + + // Generate a unique name for the merged changeset + const mergedFileName = `merged-${generateChangesetName()}.md`; + const mergedFilePath = join(changesetDir, mergedFileName); + + // Write the merged changeset + writeFileSync(mergedFilePath, mergedContent); + console.log(`\nCreated merged changeset: ${mergedFileName}`); + + // Remove the original changeset files + console.log('\nRemoving original changeset files:'); + for (const changeset of parsedChangesets) { + unlinkSync(changeset.filePath); + console.log(` Removed: ${changeset.file}`); + } + + console.log('\nChangeset merge completed successfully'); + console.log(`\nMerged changeset content:\n${mergedContent}`); +} + +main(); diff --git a/docs/case-studies/issue-82/evidence/templates/js/scripts/package-info.mjs b/docs/case-studies/issue-82/evidence/templates/js/scripts/package-info.mjs new file mode 100644 index 0000000..cd09670 --- /dev/null +++ b/docs/case-studies/issue-82/evidence/templates/js/scripts/package-info.mjs @@ -0,0 +1,97 @@ +import { readFileSync } from 'node:fs'; + +import { getPackageJsonPath } from './js-paths.mjs'; + +/** + * Parse package metadata from a package.json file body. + * @param {string} packageJsonContent + * @param {string} packageJsonPath + * @returns {{name: string, version: string}} + */ +export function parsePackageInfo( + packageJsonContent, + packageJsonPath = 'package.json' +) { + let packageJson; + try { + packageJson = JSON.parse(packageJsonContent); + } catch (error) { + throw new Error(`Could not parse ${packageJsonPath}: ${error.message}`); + } + + if (typeof packageJson.name !== 'string' || packageJson.name.trim() === '') { + throw new Error(`Package name is missing in ${packageJsonPath}`); + } + + if ( + typeof packageJson.version !== 'string' || + packageJson.version.trim() === '' + ) { + throw new Error(`Package version is missing in ${packageJsonPath}`); + } + + return { + name: packageJson.name, + version: packageJson.version, + }; +} + +/** + * Read package name and version from the detected JavaScript package root. + * @param {Object} options - Configuration options (passed to getPackageJsonPath) + * @returns {{name: string, version: string}} + */ +export function readPackageInfo(options = {}) { + const packageJsonPath = getPackageJsonPath(options); + return parsePackageInfo( + readFileSync(packageJsonPath, 'utf8'), + packageJsonPath + ); +} + +/** + * Escape a string for safe use inside a regular expression. + * @param {string} value + * @returns {string} + */ +export function escapeRegExp(value) { + return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); +} + +/** + * Build a regex that matches the package bump line in a changeset. + * @param {string} packageName + * @param {Object} options + * @param {boolean} [options.requireQuotes=true] + * @returns {RegExp} + */ +export function getChangesetVersionTypeRegex( + packageName, + { requireQuotes = true } = {} +) { + const quotePattern = requireQuotes ? '[\'"]' : '[\'"]?'; + return new RegExp( + `^${quotePattern}${escapeRegExp(packageName)}${quotePattern}:\\s+(major|minor|patch)`, + 'm' + ); +} + +/** + * Format a changeset package bump header line. + * @param {string} packageName + * @param {string} bumpType + * @returns {string} + */ +export function formatChangesetHeader(packageName, bumpType) { + return `'${packageName}': ${bumpType}`; +} + +/** + * Format an npm package@version specifier. + * @param {string} packageName + * @param {string} version + * @returns {string} + */ +export function formatNpmPackageVersion(packageName, version) { + return `${packageName}@${version}`; +} diff --git a/docs/case-studies/issue-82/evidence/templates/js/scripts/publish-to-npm.mjs b/docs/case-studies/issue-82/evidence/templates/js/scripts/publish-to-npm.mjs new file mode 100644 index 0000000..264b78f --- /dev/null +++ b/docs/case-studies/issue-82/evidence/templates/js/scripts/publish-to-npm.mjs @@ -0,0 +1,325 @@ +#!/usr/bin/env bun + +/** + * Publish to npm using OIDC trusted publishing + * Usage: node scripts/publish-to-npm.mjs [--should-pull] [--js-root ] + * should_pull: Optional flag to pull latest changes before publishing (for release job) + * + * Configuration: + * - CLI: --js-root to explicitly set JavaScript root + * - Environment: JS_ROOT= + * + * Uses link-foundation libraries: + * - use-m: Dynamic package loading without package.json dependencies + * - command-stream: Modern shell command execution with streaming support + * - lino-arguments: Unified configuration from CLI args, env vars, and .lenv files + * + * Addresses issues documented in: + * - Issue #21: Supporting both single and multi-language repository structures + * - Reference: link-assistant/agent PR #112 (--legacy-peer-deps fix) + * - Reference: link-assistant/agent PR #114 (configurable package root) + */ + +import { appendFileSync } from 'fs'; + +import { getJsRoot, needsCd, parseJsRootConfig } from './js-paths.mjs'; +import { formatNpmPackageVersion, readPackageInfo } from './package-info.mjs'; + +// Load use-m dynamically +const { use } = eval( + await (await fetch('https://unpkg.com/use-m/use.js')).text() +); + +// Import link-foundation libraries +const { $ } = await use('command-stream'); +const { makeConfig } = await use('lino-arguments'); + +// Parse CLI arguments using lino-arguments +const config = makeConfig({ + yargs: ({ yargs, getenv }) => + yargs + .option('should-pull', { + type: 'boolean', + default: getenv('SHOULD_PULL', false), + describe: 'Pull latest changes before publishing', + }) + .option('js-root', { + type: 'string', + default: getenv('JS_ROOT', ''), + describe: + 'JavaScript package root directory (auto-detected if not specified)', + }), +}); + +const { shouldPull, jsRoot: jsRootArg } = config; + +// Get JavaScript package root (auto-detect or use explicit config) +const jsRootConfig = jsRootArg || parseJsRootConfig(); +const jsRoot = getJsRoot({ jsRoot: jsRootConfig, verbose: true }); + +const MAX_RETRIES = 3; +const RETRY_DELAY = 10000; // 10 seconds + +// Store the original working directory to restore after cd commands +// IMPORTANT: command-stream's cd is a virtual command that calls process.chdir() +const originalCwd = process.cwd(); + +// Patterns that indicate publish failure in changeset output +// Reference: link-assistant/agent PR #116 - prevent false positives in CI/CD +const FAILURE_PATTERNS = [ + 'packages failed to publish', + 'error occurred while publishing', + 'npm error code E', + 'npm error 404', + 'npm error 401', + 'npm error 403', + 'Access token expired', + 'ENEEDAUTH', +]; + +/** + * Sleep for specified milliseconds + * @param {number} ms + */ +function sleep(ms) { + return new Promise((resolve) => globalThis.setTimeout(resolve, ms)); +} + +/** + * Check if the output contains any failure patterns + * Reference: link-assistant/agent PR #116 + * @param {string} output - Combined stdout and stderr + * @returns {string|null} - The matched failure pattern or null if no failure detected + */ +function detectPublishFailure(output) { + const lowerOutput = output.toLowerCase(); + for (const pattern of FAILURE_PATTERNS) { + if (lowerOutput.includes(pattern.toLowerCase())) { + return pattern; + } + } + return null; +} + +/** + * Verify that a package version is published on npm + * Reference: link-assistant/agent PR #116 + * @param {Function} shell + * @param {string} packageName + * @param {string} version + * @returns {Promise} + */ +async function verifyPublished(shell, packageName, version) { + const result = + await shell`npm view "${formatNpmPackageVersion(packageName, version)}" version`.run( + { + capture: true, + } + ); + return result.code === 0 && result.stdout.trim().includes(version); +} + +/** + * Append to GitHub Actions output file + * @param {string} key + * @param {string} value + */ +function setOutput(key, value) { + const outputFile = process.env.GITHUB_OUTPUT; + if (outputFile) { + appendFileSync(outputFile, `${key}=${value}\n`); + } +} + +/** + * Run changeset:publish command with output capture + * @param {Function} shell + * @param {string} jsRoot + * @param {string} originalCwd + * @returns {Promise<{result: object|null, error: Error|null}>} + */ +async function runChangesetPublish(shell, jsRoot, originalCwd) { + try { + // Run changeset:publish from the js directory where package.json with this script exists + // IMPORTANT: Use .run({ capture: true }) to capture output for failure detection + // IMPORTANT: cd is a virtual command that calls process.chdir(), so we restore after + if (needsCd({ jsRoot })) { + const result = await shell`cd ${jsRoot} && npm run changeset:publish`.run( + { + capture: true, + } + ); + process.chdir(originalCwd); + return { result, error: null }; + } + const result = await shell`npm run changeset:publish`.run({ + capture: true, + }); + return { result, error: null }; + } catch (error) { + // Restore cwd on error before retry + if (needsCd({ jsRoot })) { + process.chdir(originalCwd); + } + return { result: null, error }; + } +} + +/** + * Analyze publish result for failures using multi-layer detection + * Reference: link-assistant/agent PR #116 + * @param {object|null} publishResult - The result from runChangesetPublish + * @param {Error|null} commandError - Error thrown by the command + * @returns {Error|null} - Error if failure detected, null otherwise + */ +function analyzePublishResult(publishResult, commandError) { + if (commandError) { + return commandError; + } + + const combinedOutput = publishResult + ? `${publishResult.stdout || ''}\n${publishResult.stderr || ''}` + : ''; + + // Log the output for debugging + if (combinedOutput.trim()) { + console.log('Changeset output:', combinedOutput); + } + + // Check for failure patterns in output (most reliable for changeset) + const failurePattern = detectPublishFailure(combinedOutput); + if (failurePattern) { + console.error(`Detected publish failure: "${failurePattern}"`); + return new Error(`Publish failed: detected "${failurePattern}" in output`); + } + + // Check exit code (if available and non-zero) + if (publishResult && publishResult.code !== 0) { + console.error(`Changeset exited with code ${publishResult.code}`); + return new Error(`Publish failed with exit code ${publishResult.code}`); + } + + return null; +} + +/** + * Perform a single publish attempt with verification + * @param {string} currentVersion + * @param {string} packageName + * @param {Function} shell + * @param {string} jsRoot + * @param {string} originalCwd + * @returns {Promise<{success: boolean, error: Error|null}>} + */ +async function attemptPublish( + currentVersion, + packageName, + shell, + jsRoot, + originalCwd +) { + const { result, error } = await runChangesetPublish( + shell, + jsRoot, + originalCwd + ); + const analysisError = analyzePublishResult(result, error); + + if (analysisError) { + return { success: false, error: analysisError }; + } + + // Verify the package is actually on npm (ultimate verification) + console.log('Verifying package was published to npm...'); + await sleep(2000); // Wait for npm registry to propagate + const isPublished = await verifyPublished(shell, packageName, currentVersion); + + if (isPublished) { + return { success: true, error: null }; + } + + console.error('Verification failed: package not found on npm after publish'); + return { + success: false, + error: new Error('Package not found on npm after publish attempt'), + }; +} + +async function main() { + try { + if (shouldPull) { + // Pull the latest changes we just pushed + await $`git pull origin main`; + } + + // Get current version + const { name: packageName, version: currentVersion } = readPackageInfo({ + jsRoot, + }); + console.log(`Package to publish: ${packageName}`); + console.log(`Current version to publish: ${currentVersion}`); + + // Check if this version is already published on npm + console.log( + `Checking if version ${currentVersion} is already published...` + ); + const checkResult = + await $`npm view "${formatNpmPackageVersion(packageName, currentVersion)}" version`.run( + { + capture: true, + } + ); + + // command-stream returns { code: 0 } on success, { code: 1 } on failure (e.g., E404) + // Exit code 0 means version exists, non-zero means version not found + if (checkResult.code === 0) { + console.log(`Version ${currentVersion} is already published to npm`); + setOutput('published', 'true'); + setOutput('published_version', currentVersion); + setOutput('already_published', 'true'); + return; + } + + // Version not found on npm (E404), proceed with publish + console.log( + `Version ${currentVersion} not found on npm, proceeding with publish...` + ); + + // Publish to npm using OIDC trusted publishing with retry logic + // Multi-layer failure detection based on link-assistant/agent PR #116 + for (let i = 1; i <= MAX_RETRIES; i++) { + console.log(`Publish attempt ${i} of ${MAX_RETRIES}...`); + const { success, error } = await attemptPublish( + currentVersion, + packageName, + $, + jsRoot, + originalCwd + ); + + if (success) { + setOutput('published', 'true'); + setOutput('published_version', currentVersion); + console.log(`\u2705 Published ${packageName}@${currentVersion} to npm`); + return; + } + + if (i < MAX_RETRIES) { + console.log( + `Publish failed: ${error.message}, waiting ${RETRY_DELAY / 1000}s before retry...` + ); + await sleep(RETRY_DELAY); + } + } + + console.error(`\u274C Failed to publish after ${MAX_RETRIES} attempts`); + process.exit(1); + } catch (error) { + // Restore cwd on error + process.chdir(originalCwd); + console.error('Error:', error.message); + process.exit(1); + } +} + +main(); diff --git a/docs/case-studies/issue-82/evidence/templates/js/scripts/setup-npm.mjs b/docs/case-studies/issue-82/evidence/templates/js/scripts/setup-npm.mjs new file mode 100644 index 0000000..2a8cb88 --- /dev/null +++ b/docs/case-studies/issue-82/evidence/templates/js/scripts/setup-npm.mjs @@ -0,0 +1,265 @@ +#!/usr/bin/env node + +import { resolve } from 'node:path'; +import process from 'node:process'; +import { fileURLToPath } from 'node:url'; + +/** + * Update npm for OIDC trusted publishing + * npm trusted publishing requires npm >= 11.5.1 + * Node.js 20.x ships with npm 10.x, so we need to update + * + * Uses link-foundation libraries: + * - use-m: Dynamic package loading without package.json dependencies + * - command-stream: Modern shell command execution with streaming support + */ + +export const NPM_MIN_VERSION = '11.5.1'; +export const NODE_MIN_VERSION = '22.14.0'; +export const NPM_TARGET_MAJOR = 11; +export const NPM_REGISTRY_METADATA_URL = 'https://registry.npmjs.org/npm'; + +export function parseVersion(version) { + const match = String(version) + .trim() + .match( + /^v?(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z-.]+))?(?:\+[0-9A-Za-z-.]+)?$/ + ); + + if (!match) { + throw new Error(`Invalid semantic version: ${version}`); + } + + return { + major: Number(match[1]), + minor: Number(match[2]), + patch: Number(match[3]), + prerelease: match[4] || '', + }; +} + +export function compareVersions(leftVersion, rightVersion) { + const left = parseVersion(leftVersion); + const right = parseVersion(rightVersion); + const keys = ['major', 'minor', 'patch']; + + for (const key of keys) { + if (left[key] !== right[key]) { + return left[key] > right[key] ? 1 : -1; + } + } + + if (left.prerelease === right.prerelease) { + return 0; + } + + if (!left.prerelease) { + return 1; + } + + if (!right.prerelease) { + return -1; + } + + return left.prerelease > right.prerelease ? 1 : -1; +} + +export function isVersionAtLeast(version, minimumVersion) { + return compareVersions(version, minimumVersion) >= 0; +} + +export function isSupportedNpmVersion(version) { + return isVersionAtLeast(version, NPM_MIN_VERSION); +} + +export function isSupportedNodeVersion(version) { + return isVersionAtLeast(version, NODE_MIN_VERSION); +} + +export function selectLatestSupportedNpmRelease(metadata) { + const releases = Object.entries(metadata?.versions || {}) + .filter(([version, release]) => { + const parsed = parseVersion(version); + return ( + parsed.major === NPM_TARGET_MAJOR && + !parsed.prerelease && + isSupportedNpmVersion(version) && + release?.dist?.tarball + ); + }) + .sort(([leftVersion], [rightVersion]) => + compareVersions(rightVersion, leftVersion) + ); + + if (releases.length === 0) { + throw new Error( + `No npm ${NPM_TARGET_MAJOR}.x release found at or above ${NPM_MIN_VERSION}` + ); + } + + const [version, release] = releases[0]; + return { version, tarballUrl: release.dist.tarball }; +} + +async function fetchNpmRegistryMetadata(fetchFn) { + const response = await fetchFn(NPM_REGISTRY_METADATA_URL, { + headers: { accept: 'application/json' }, + }); + + if (!response.ok) { + throw new Error( + `Failed to fetch npm registry metadata: ${response.status} ${response.statusText}` + ); + } + + return response.json(); +} + +async function resolveLatestSupportedNpmRelease(fetchFn) { + const metadata = await fetchNpmRegistryMetadata(fetchFn); + return selectLatestSupportedNpmRelease(metadata); +} + +// Update npm for OIDC trusted publishing (requires >= 11.5.1) +// Pin to npm@11 to avoid breaking changes from future major versions +// +// Known issue: Node.js 22.22.2 on GitHub Actions (ubuntu-24.04 image >= 20260329.72.1) +// ships with a broken npm 10.9.7 that is missing the 'promise-retry' module, +// causing `npm install -g` to fail with MODULE_NOT_FOUND. +// See: https://github.com/actions/runner-images/issues/13883 +// See: https://github.com/nodejs/node/issues/62430 +// See: https://github.com/npm/cli/issues/9151 +// +// Workaround strategies in order of preference: +// 1. npm install -g npm@11 (standard approach) +// 2. curl tarball download (bypasses broken npm entirely) +// 3. npx npm@11 install (uses npx cache, bypasses arborist) +// 4. corepack as last resort + +async function tryStandardInstall($) { + await $`npm install -g npm@11`; +} + +async function tryCurlTarball($, fetchFn) { + const npmRelease = await resolveLatestSupportedNpmRelease(fetchFn); + console.log(`Downloading npm ${npmRelease.version} tarball...`); + + const nodeDir = ( + await $`dirname $(dirname $(which node))`.run({ capture: true }) + ).stdout.trim(); + const globalNpmDir = `${nodeDir}/lib/node_modules/npm`; + const tempNpmDir = '/tmp/setup-npm-package'; + + await $`rm -rf "${tempNpmDir}" && mkdir -p "${tempNpmDir}"`; + await $`curl -fsSL "${npmRelease.tarballUrl}" | tar xz --strip-components=1 -C "${tempNpmDir}" && rm -rf "${globalNpmDir}" && mv "${tempNpmDir}" "${globalNpmDir}"`; +} + +async function tryNpxInstall($) { + await $`npx --yes npm@11 install -g npm@11`; +} + +async function tryCorepack($) { + await $`corepack enable`; + await $`corepack prepare npm@11 --activate`; +} + +async function tryStrategy(name, fn) { + try { + await fn(); + return true; + } catch (error) { + console.warn(`Warning: ${name} failed: ${error.message}`); + return false; + } +} + +function failUnsupportedNodeVersion(nodeVersion) { + console.error( + `ERROR: Node.js ${NODE_MIN_VERSION} or later is required for npm OIDC trusted publishing setup.` + ); + console.error(`Current Node.js version is ${nodeVersion}.`); + process.exit(1); +} + +function failUnsupportedNpmVersion(npmVersion) { + console.error( + `ERROR: Could not update npm to >= ${NPM_MIN_VERSION} for OIDC trusted publishing.` + ); + console.error(`Current npm version ${npmVersion} does not support OIDC.`); + console.error('See: https://github.com/actions/runner-images/issues/13883'); + process.exit(1); +} + +export async function setupNpm($, fetchFn = fetch) { + const nodeVersion = process.version; + console.log(`Current Node.js version: ${nodeVersion}`); + + if (!isSupportedNodeVersion(nodeVersion)) { + failUnsupportedNodeVersion(nodeVersion); + } + + const currentResult = await $`npm --version`.run({ capture: true }); + const currentVersion = currentResult.stdout.trim(); + console.log(`Current npm version: ${currentVersion}`); + + const strategies = [ + ['npm install -g npm@11', () => tryStandardInstall($)], + ['curl-based tarball download', () => tryCurlTarball($, fetchFn)], + ['npx-based install', () => tryNpxInstall($)], + ['corepack', () => tryCorepack($)], + ]; + + let success = false; + for (const [name, fn] of strategies) { + console.log(`Trying ${name}...`); + success = await tryStrategy(name, fn); + if (success) { + break; + } + console.warn( + 'This may be the Node.js 22.22.2 broken npm issue (actions/runner-images#13883).' + ); + } + + if (!success) { + if (isSupportedNpmVersion(currentVersion)) { + console.log( + 'Current npm version already supports OIDC trusted publishing' + ); + } + } + + const updatedResult = await $`npm --version`.run({ capture: true }); + const updatedVersion = updatedResult.stdout.trim(); + console.log(`Updated npm version: ${updatedVersion}`); + + if (!isSupportedNpmVersion(updatedVersion)) { + failUnsupportedNpmVersion(updatedVersion); + } +} + +function isMainModule() { + return process.argv[1] + ? resolve(process.argv[1]) === fileURLToPath(import.meta.url) + : false; +} + +if (isMainModule()) { + try { + if (!isSupportedNodeVersion(process.version)) { + failUnsupportedNodeVersion(process.version); + } + + // Load use-m dynamically only for CLI execution, so tests can import the + // pure version helpers without fetching dependencies or mutating npm. + const { use } = eval( + await (await fetch('https://unpkg.com/use-m/use.js')).text() + ); + const { $ } = await use('command-stream'); + + await setupNpm($); + } catch (error) { + console.error('Error updating npm:', error.message); + process.exit(1); + } +} diff --git a/docs/case-studies/issue-82/evidence/templates/js/scripts/simulate-fresh-merge.sh b/docs/case-studies/issue-82/evidence/templates/js/scripts/simulate-fresh-merge.sh new file mode 100755 index 0000000..6af7c6a --- /dev/null +++ b/docs/case-studies/issue-82/evidence/templates/js/scripts/simulate-fresh-merge.sh @@ -0,0 +1,61 @@ +#!/usr/bin/env bash +# simulate-fresh-merge.sh +# +# Simulates a fresh merge of the current PR branch with the latest base branch. +# This ensures CI checks run against the actual merge result, not a stale merge preview. +# +# Usage: +# BASE_REF=main bash scripts/simulate-fresh-merge.sh +# +# Environment variables: +# BASE_REF The base branch to merge with (e.g. "main"). Required. +# +# Exit code 0 = merge succeeded or not needed; non-zero = merge conflict detected. +# +# See docs/case-studies/issue-23 for why this is critical. + +set -euo pipefail + +echo "=== Synchronizing PR with latest $BASE_REF ===" +echo "This prevents stale merge preview issues (see docs/case-studies/issue-23)" +echo "" + +# Configure git for merge +git config user.email "github-actions[bot]@users.noreply.github.com" +git config user.name "github-actions[bot]" + +# Fetch the latest base branch +echo "Fetching latest $BASE_REF..." +git fetch origin "$BASE_REF" + +# Get current and base branch info +CURRENT_SHA=$(git rev-parse HEAD) +BASE_SHA=$(git rev-parse "origin/$BASE_REF") + +echo "Current checkout (merge preview): $CURRENT_SHA" +echo "Latest base branch ($BASE_REF): $BASE_SHA" +echo "" + +# Check if base branch has new commits not in the merge preview +BEHIND_COUNT=$(git rev-list --count HEAD..origin/$BASE_REF) + +if [ "$BEHIND_COUNT" -eq 0 ]; then + echo "Merge preview is up-to-date with $BASE_REF. No simulation needed." +else + echo "Base branch has $BEHIND_COUNT new commit(s) since PR was opened/synced." + echo "Simulating fresh merge to validate actual merge result..." + echo "" + + # Attempt to merge the latest base branch + if git merge origin/$BASE_REF --no-edit; then + echo "" + echo "Fresh merge simulation successful!" + echo "Checks will now run against the up-to-date merged state." + else + echo "" + echo "::error::Merge conflict detected! PR needs to be rebased/updated before it can be merged." + echo "The PR branch is out of sync with $BASE_REF and cannot be automatically merged." + exit 1 + fi +fi +echo "" diff --git a/docs/case-studies/issue-82/evidence/templates/js/scripts/validate-changeset.mjs b/docs/case-studies/issue-82/evidence/templates/js/scripts/validate-changeset.mjs new file mode 100644 index 0000000..7d942f5 --- /dev/null +++ b/docs/case-studies/issue-82/evidence/templates/js/scripts/validate-changeset.mjs @@ -0,0 +1,276 @@ +#!/usr/bin/env bun + +/** + * Validate changeset for CI - ensures exactly one valid changeset is added by the PR + * + * Key behavior: + * - Only checks changeset files ADDED by the current PR (not pre-existing ones) + * - Uses git diff to compare PR head against base branch + * - Validates that the PR adds exactly one changeset with proper format + * - Falls back to checking all changesets for local development + */ + +import { execSync } from 'child_process'; +import { readFileSync, readdirSync, existsSync } from 'fs'; +import { join } from 'path'; + +import { getChangesetDir, getJsRoot, parseJsRootConfig } from './js-paths.mjs'; +import { + getChangesetVersionTypeRegex, + readPackageInfo, +} from './package-info.mjs'; + +/** + * Ensure a git commit is available locally, fetching if necessary + * @param {string} sha The commit SHA to check + */ +function ensureCommitAvailable(sha) { + try { + execSync(`git cat-file -e ${sha}`, { stdio: 'ignore' }); + } catch { + console.log('Base commit not available locally, attempting fetch...'); + try { + execSync(`git fetch origin ${sha}`, { stdio: 'inherit' }); + } catch { + execSync(`git fetch origin`, { stdio: 'inherit' }); + } + } +} + +/** + * Parse git diff output and extract added changeset files + * @param {string} diffOutput Output from git diff --name-status + * @param {string} changesetDir Path to the changeset directory + * @returns {string[]} Array of added changeset file names + */ +function parseAddedChangesets(diffOutput, changesetDir) { + const addedChangesets = []; + const changesetGitPath = changesetDir + .replace(/\\/g, '/') + .replace(/^\.\//, ''); + for (const line of diffOutput.trim().split('\n')) { + if (!line) { + continue; + } + const [status, filePath] = line.split('\t'); + if ( + status === 'A' && + filePath.startsWith(`${changesetGitPath}/`) && + filePath.endsWith('.md') && + !filePath.endsWith('README.md') + ) { + addedChangesets.push(filePath.replace(`${changesetGitPath}/`, '')); + } + } + return addedChangesets; +} + +/** + * Try to get changesets using explicit SHA comparison + * @param {string} baseSha Base commit SHA + * @param {string} headSha Head commit SHA + * @param {string} changesetDir Path to the changeset directory + * @returns {string[] | null} Array of changeset files or null if failed + */ +function tryExplicitShaComparison(baseSha, headSha, changesetDir) { + console.log(`Comparing ${baseSha}...${headSha}`); + try { + ensureCommitAvailable(baseSha); + const diffOutput = execSync( + `git diff --name-status ${baseSha} ${headSha}`, + { encoding: 'utf-8' } + ); + return parseAddedChangesets(diffOutput, changesetDir); + } catch (error) { + console.log(`Git diff with explicit SHAs failed: ${error.message}`); + return null; + } +} + +/** + * Try to get changesets using base branch comparison + * @param {string} prBase Base branch name + * @param {string} changesetDir Path to the changeset directory + * @returns {string[] | null} Array of changeset files or null if failed + */ +function tryBaseBranchComparison(prBase, changesetDir) { + console.log(`Comparing against base branch: ${prBase}`); + try { + try { + execSync(`git fetch origin ${prBase}`, { stdio: 'inherit' }); + } catch { + // Ignore fetch errors, we might already have it + } + const diffOutput = execSync( + `git diff --name-status origin/${prBase}...HEAD`, + { encoding: 'utf-8' } + ); + return parseAddedChangesets(diffOutput, changesetDir); + } catch (error) { + console.log(`Git diff with base ref failed: ${error.message}`); + return null; + } +} + +/** + * Fallback: get all changesets in directory + * @param {string} changesetDir Path to the changeset directory + * @returns {string[]} Array of all changeset file names + */ +function getAllChangesets(changesetDir) { + console.log( + 'Warning: Could not determine PR diff, checking all changesets in directory' + ); + if (!existsSync(changesetDir)) { + return []; + } + return readdirSync(changesetDir).filter( + (file) => file.endsWith('.md') && file !== 'README.md' + ); +} + +/** + * Get changeset files added in the current PR using git diff + * @param {string} changesetDir Path to the changeset directory + * @returns {string[]} Array of added changeset file names + */ +function getAddedChangesetFiles(changesetDir) { + const baseSha = process.env.GITHUB_BASE_SHA || process.env.BASE_SHA; + const headSha = process.env.GITHUB_HEAD_SHA || process.env.HEAD_SHA; + + // Try explicit SHAs first + if (baseSha && headSha) { + const result = tryExplicitShaComparison(baseSha, headSha, changesetDir); + if (result !== null) { + return result; + } + } + + // Try base branch comparison + const prBase = process.env.GITHUB_BASE_REF; + if (prBase) { + const result = tryBaseBranchComparison(prBase, changesetDir); + if (result !== null) { + return result; + } + } + + // Fallback to checking all changesets + return getAllChangesets(changesetDir); +} + +/** + * Validate a single changeset file + * @param {string} filePath Full path to the changeset file + * @param {string} packageName + * @returns {{valid: boolean, type?: string, description?: string, error?: string}} + */ +function validateChangesetFile(filePath, packageName) { + try { + const content = readFileSync(filePath, 'utf-8'); + + // Check if changeset has a valid type (major, minor, or patch) + const versionTypeRegex = getChangesetVersionTypeRegex(packageName); + const versionTypeMatch = content.match(versionTypeRegex); + + if (!versionTypeMatch) { + return { + valid: false, + error: `Changeset must specify a version type: major, minor, or patch\nExpected format:\n---\n'${packageName}': patch\n---\n\nYour description here`, + }; + } + + // Extract description (everything after the closing ---) and check it's not empty + const parts = content.split('---'); + if (parts.length < 3) { + return { + valid: false, + error: + "Changeset must include a description of the changes (after the closing '---')", + }; + } + + const description = parts.slice(2).join('---').trim(); + if (!description) { + return { + valid: false, + error: 'Changeset must include a non-empty description of the changes', + }; + } + + return { + valid: true, + type: versionTypeMatch[1], + description, + }; + } catch (error) { + return { + valid: false, + error: `Failed to read changeset file: ${error.message}`, + }; + } +} + +try { + console.log('Validating changesets added by this PR...'); + const jsRootConfig = parseJsRootConfig(); + const jsRoot = getJsRoot({ jsRoot: jsRootConfig, verbose: true }); + const changesetDir = getChangesetDir({ jsRoot }); + const { name: packageName } = readPackageInfo({ jsRoot }); + console.log(`Package: ${packageName}`); + + // Get changeset files added in this PR + const addedChangesetFiles = getAddedChangesetFiles(changesetDir); + const changesetCount = addedChangesetFiles.length; + + console.log(`Found ${changesetCount} changeset file(s) added by this PR`); + if (changesetCount > 0) { + console.log('Added changesets:'); + addedChangesetFiles.forEach((file) => console.log(` - ${file}`)); + } + + // Ensure exactly one changeset file was added + if (changesetCount === 0) { + console.error( + "::error::No changeset found in this PR. Please add a changeset by running 'npm run changeset' and commit the result." + ); + process.exit(1); + } else if (changesetCount > 1) { + console.error( + `::error::Multiple changesets found in this PR (${changesetCount}). Each PR should add exactly ONE changeset.` + ); + console.error('::error::Found changeset files added by this PR:'); + addedChangesetFiles.forEach((file) => console.error(` ${file}`)); + console.error( + '\n::error::Please combine these into a single changeset or remove the extras.' + ); + process.exit(1); + } + + // Validate the single changeset file + const changesetFile = join(changesetDir, addedChangesetFiles[0]); + console.log(`Validating changeset: ${changesetFile}`); + + const validation = validateChangesetFile(changesetFile, packageName); + + if (!validation.valid) { + console.error(`::error::${validation.error}`); + console.error(`\nFile content of ${changesetFile}:`); + try { + console.error(readFileSync(changesetFile, 'utf-8')); + } catch { + console.error('(could not read file)'); + } + process.exit(1); + } + + console.log('Changeset validation passed'); + console.log(` Type: ${validation.type}`); + console.log(` Description: ${validation.description}`); +} catch (error) { + console.error('Error during changeset validation:', error.message); + if (process.env.DEBUG) { + console.error('Stack trace:', error.stack); + } + process.exit(1); +} diff --git a/docs/case-studies/issue-82/evidence/templates/js/scripts/version-and-commit.mjs b/docs/case-studies/issue-82/evidence/templates/js/scripts/version-and-commit.mjs new file mode 100644 index 0000000..0f63bc2 --- /dev/null +++ b/docs/case-studies/issue-82/evidence/templates/js/scripts/version-and-commit.mjs @@ -0,0 +1,284 @@ +#!/usr/bin/env bun + +/** + * Version packages and commit to main + * Usage: node scripts/version-and-commit.mjs --mode [--bump-type ] [--description ] [--js-root ] + * changeset: Run changeset version + * instant: Run instant version bump with bump_type (patch|minor|major) and optional description + * + * Configuration: + * - CLI: --js-root to explicitly set JavaScript root + * - Environment: JS_ROOT= + * + * Uses link-foundation libraries: + * - use-m: Dynamic package loading without package.json dependencies + * - command-stream: Modern shell command execution with streaming support + * - lino-arguments: Unified configuration from CLI args, env vars, and .lenv files + * + * Addresses issues documented in: + * - Issue #21: Supporting both single and multi-language repository structures + * - Reference: link-assistant/agent PR #112 (--legacy-peer-deps fix) + * - Reference: link-assistant/agent PR #114 (configurable package root) + */ + +import { readFileSync, appendFileSync, readdirSync } from 'fs'; + +import { + getJsRoot, + getPackageJsonPath, + getChangesetDir, + needsCd, + parseJsRootConfig, +} from './js-paths.mjs'; + +// Load use-m dynamically +const { use } = eval( + await (await fetch('https://unpkg.com/use-m/use.js')).text() +); + +// Import link-foundation libraries +const { $ } = await use('command-stream'); +const { makeConfig } = await use('lino-arguments'); + +// Parse CLI arguments using lino-arguments +const config = makeConfig({ + yargs: ({ yargs, getenv }) => + yargs + .option('mode', { + type: 'string', + default: getenv('MODE', 'changeset'), + describe: 'Version mode: changeset or instant', + choices: ['changeset', 'instant'], + }) + .option('bump-type', { + type: 'string', + default: getenv('BUMP_TYPE', ''), + describe: 'Version bump type for instant mode: major, minor, or patch', + }) + .option('description', { + type: 'string', + default: getenv('DESCRIPTION', ''), + describe: 'Description for instant version bump', + }) + .option('js-root', { + type: 'string', + default: getenv('JS_ROOT', ''), + describe: + 'JavaScript package root directory (auto-detected if not specified)', + }), +}); + +const { mode, bumpType, description, jsRoot: jsRootArg } = config; + +// Get JavaScript package root (auto-detect or use explicit config) +const jsRootConfig = jsRootArg || parseJsRootConfig(); +const jsRoot = getJsRoot({ jsRoot: jsRootConfig, verbose: true }); + +// Debug: Log parsed configuration +console.log('Parsed configuration:', { + mode, + bumpType, + description: description || '(none)', + jsRoot, +}); + +// Detect if positional arguments were used (common mistake) +const args = process.argv.slice(2); +if (args.length > 0 && !args[0].startsWith('--')) { + console.error('Error: Positional arguments detected!'); + console.error('Command line arguments:', args); + console.error(''); + console.error( + 'This script requires named arguments (--mode, --bump-type, --description, --js-root).' + ); + console.error('Usage:'); + console.error(' Changeset mode:'); + console.error( + ' node scripts/version-and-commit.mjs --mode changeset [--js-root ]' + ); + console.error(' Instant mode:'); + console.error( + ' node scripts/version-and-commit.mjs --mode instant --bump-type [--description ] [--js-root ]' + ); + console.error(''); + console.error('Examples:'); + console.error( + ' node scripts/version-and-commit.mjs --mode instant --bump-type patch --description "Fix bug"' + ); + console.error(' node scripts/version-and-commit.mjs --mode changeset'); + console.error( + ' node scripts/version-and-commit.mjs --mode changeset --js-root js' + ); + process.exit(1); +} + +// Validation: Ensure mode is set correctly +if (mode !== 'changeset' && mode !== 'instant') { + console.error(`Invalid mode: "${mode}". Expected "changeset" or "instant".`); + console.error('Command line arguments:', process.argv.slice(2)); + process.exit(1); +} + +// Validation: Ensure bump type is provided for instant mode +if (mode === 'instant' && !bumpType) { + console.error('Error: --bump-type is required for instant mode'); + console.error( + 'Usage: node scripts/version-and-commit.mjs --mode instant --bump-type [--description ] [--js-root ]' + ); + process.exit(1); +} + +// Store the original working directory to restore after cd commands +// IMPORTANT: command-stream's cd is a virtual command that calls process.chdir() +const originalCwd = process.cwd(); + +/** + * Append to GitHub Actions output file + * @param {string} key + * @param {string} value + */ +function setOutput(key, value) { + const outputFile = process.env.GITHUB_OUTPUT; + if (outputFile) { + appendFileSync(outputFile, `${key}=${value}\n`); + } +} + +/** + * Count changeset files (excluding README.md) + */ +function countChangesets() { + try { + const changesetDir = getChangesetDir({ jsRoot }); + const files = readdirSync(changesetDir); + return files.filter((f) => f.endsWith('.md') && f !== 'README.md').length; + } catch { + return 0; + } +} + +/** + * Get package version + * @param {string} source - 'local' or 'remote' + */ +async function getVersion(source = 'local') { + const packageJsonPath = getPackageJsonPath({ jsRoot }); + if (source === 'remote') { + const result = await $`git show origin/main:${packageJsonPath}`.run({ + capture: true, + }); + return JSON.parse(result.stdout).version; + } + return JSON.parse(readFileSync(packageJsonPath, 'utf8')).version; +} + +async function main() { + try { + // Configure git + await $`git config user.name "github-actions[bot]"`; + await $`git config user.email "github-actions[bot]@users.noreply.github.com"`; + + // Check if remote main has advanced (handles re-runs after partial success) + console.log('Checking for remote changes...'); + await $`git fetch origin main`; + + const localHeadResult = await $`git rev-parse HEAD`.run({ capture: true }); + const localHead = localHeadResult.stdout.trim(); + + const remoteHeadResult = await $`git rev-parse origin/main`.run({ + capture: true, + }); + const remoteHead = remoteHeadResult.stdout.trim(); + + if (localHead !== remoteHead) { + console.log( + `Remote main has advanced (local: ${localHead}, remote: ${remoteHead})` + ); + console.log('This may indicate a previous attempt partially succeeded.'); + + // Check if the remote version is already the expected bump + const remoteVersion = await getVersion('remote'); + console.log(`Remote version: ${remoteVersion}`); + + // Check if there are changesets to process + const changesetCount = countChangesets(); + + if (changesetCount === 0) { + console.log('No changesets to process and remote has advanced.'); + console.log( + 'Assuming version bump was already completed in a previous attempt.' + ); + setOutput('version_committed', 'false'); + setOutput('already_released', 'true'); + setOutput('new_version', remoteVersion); + return; + } else { + console.log('Rebasing on remote main to incorporate changes...'); + await $`git rebase origin/main`; + } + } + + // Get current version before bump + const oldVersion = await getVersion(); + console.log(`Current version: ${oldVersion}`); + + if (mode === 'instant') { + console.log('Running instant version bump...'); + // Run instant version bump script + // Pass --js-root to ensure consistent path handling + // Rely on command-stream's auto-quoting for proper argument handling + if (description) { + await $`node scripts/instant-version-bump.mjs --bump-type ${bumpType} --description ${description} --js-root ${jsRoot}`; + } else { + await $`node scripts/instant-version-bump.mjs --bump-type ${bumpType} --js-root ${jsRoot}`; + } + } else { + console.log('Running changeset version...'); + // Run changeset version to bump versions and update CHANGELOG + // IMPORTANT: cd is a virtual command that calls process.chdir(), so we restore after + if (needsCd({ jsRoot })) { + await $`cd ${jsRoot} && npm run changeset:version`; + process.chdir(originalCwd); + } else { + await $`npm run changeset:version`; + } + } + + // Get new version after bump + const newVersion = await getVersion(); + console.log(`New version: ${newVersion}`); + setOutput('new_version', newVersion); + + // Check if there are changes to commit + const statusResult = await $`git status --porcelain`.run({ capture: true }); + const status = statusResult.stdout.trim(); + + if (status) { + console.log('Changes detected, committing...'); + + // Stage all changes (package.json, package-lock.json, CHANGELOG.md, deleted changesets) + await $`git add -A`; + + // Commit with version number as message + const commitMessage = newVersion; + const escapedMessage = commitMessage.replace(/"/g, '\\"'); + await $`git commit -m "${escapedMessage}"`; + + // Push directly to main + await $`git push origin main`; + + console.log('\u2705 Version bump committed and pushed to main'); + setOutput('version_committed', 'true'); + } else { + console.log('No changes to commit'); + setOutput('version_committed', 'false'); + } + } catch (error) { + // Restore cwd on error + process.chdir(originalCwd); + console.error('Error:', error.message); + process.exit(1); + } +} + +main(); diff --git a/docs/case-studies/issue-82/evidence/templates/js/scripts/wait-for-npm.mjs b/docs/case-studies/issue-82/evidence/templates/js/scripts/wait-for-npm.mjs new file mode 100644 index 0000000..0155e68 --- /dev/null +++ b/docs/case-studies/issue-82/evidence/templates/js/scripts/wait-for-npm.mjs @@ -0,0 +1,191 @@ +#!/usr/bin/env node + +/** + * Wait for a package version to become available on npm. + * + * The Docker publish job runs after npm publishing, but npm registry visibility + * can lag briefly. Waiting here keeps Docker tags tied to an installable npm + * version. + */ + +import { execFileSync } from 'node:child_process'; +import { appendFileSync } from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +import { formatNpmPackageVersion, readPackageInfo } from './package-info.mjs'; + +const DEFAULT_MAX_ATTEMPTS = 30; +const DEFAULT_SLEEP_SECONDS = 10; +const USAGE = + 'Usage: node scripts/wait-for-npm.mjs --release-version [--package-name ] [--max-attempts ] [--sleep-seconds ] [--js-root ]'; + +function parsePositiveInteger(value, optionName) { + const parsed = Number(value); + if (!Number.isInteger(parsed) || parsed < 1) { + throw new Error(`${optionName} must be a positive integer`); + } + return parsed; +} + +function readCliOptions(argv) { + const options = {}; + + for (let index = 0; index < argv.length; index++) { + const arg = argv[index]; + if (!arg.startsWith('--')) { + continue; + } + + const inlineValueIndex = arg.indexOf('='); + if (inlineValueIndex !== -1) { + options[arg.slice(2, inlineValueIndex)] = arg.slice(inlineValueIndex + 1); + continue; + } + + const value = argv[index + 1]; + if (value === undefined || value.startsWith('--')) { + throw new Error(`Missing value for ${arg}`); + } + + options[arg.slice(2)] = value; + index++; + } + + return options; +} + +export function parseArgs(argv, env = process.env) { + const cliOptions = readCliOptions(argv); + + const config = { + jsRoot: cliOptions['js-root'] ?? env.JS_ROOT ?? '', + maxAttempts: parsePositiveInteger( + cliOptions['max-attempts'] || + env.MAX_ATTEMPTS || + String(DEFAULT_MAX_ATTEMPTS), + '--max-attempts' + ), + packageName: cliOptions['package-name'] ?? env.PACKAGE_NAME ?? '', + releaseVersion: cliOptions['release-version'] ?? env.VERSION ?? '', + sleepSeconds: parsePositiveInteger( + cliOptions['sleep-seconds'] || + env.SLEEP_SECONDS || + String(DEFAULT_SLEEP_SECONDS), + '--sleep-seconds' + ), + }; + + return config; +} + +export function checkNpmVersion(packageName, version) { + try { + const publishedVersion = execFileSync( + 'npm', + ['view', formatNpmPackageVersion(packageName, version), 'version'], + { encoding: 'utf8', stdio: ['ignore', 'pipe', 'pipe'] } + ).trim(); + + return publishedVersion === version; + } catch { + return false; + } +} + +function sleep(seconds) { + return new Promise((resolve) => + globalThis.setTimeout(resolve, seconds * 1000) + ); +} + +function setOutput(name, value) { + const outputFile = process.env.GITHUB_OUTPUT; + if (outputFile) { + appendFileSync(outputFile, `${name}=${value}\n`); + } + console.log(`Output: ${name}=${value}`); +} + +export async function waitForNpmVersion({ + checkAvailability = checkNpmVersion, + maxAttempts = DEFAULT_MAX_ATTEMPTS, + packageName, + sleepFn = sleep, + sleepSeconds = DEFAULT_SLEEP_SECONDS, + stdout = console.log, + version, +}) { + for (let attempt = 1; attempt <= maxAttempts; attempt++) { + stdout( + `Checking npm for ${formatNpmPackageVersion(packageName, version)} (attempt ${attempt}/${maxAttempts})` + ); + + if (checkAvailability(packageName, version)) { + return true; + } + + if (attempt < maxAttempts) { + await sleepFn(sleepSeconds); + } + } + + return false; +} + +function isCliEntryPoint() { + return ( + typeof process !== 'undefined' && + process.argv?.[1] && + fileURLToPath(import.meta.url) === path.resolve(process.argv[1]) + ); +} + +export async function main({ + argv = process.argv.slice(2), + env = process.env, + stderr = console.error, + stdout = console.log, +} = {}) { + try { + const config = parseArgs(argv, env); + if (!config.releaseVersion) { + stderr('Error: Missing required --release-version'); + stderr(USAGE); + return 1; + } + + const packageInfo = config.packageName + ? { name: config.packageName } + : readPackageInfo({ jsRoot: config.jsRoot || undefined }); + + const available = await waitForNpmVersion({ + maxAttempts: config.maxAttempts, + packageName: packageInfo.name, + sleepSeconds: config.sleepSeconds, + stdout, + version: config.releaseVersion, + }); + + setOutput('npm_available', available ? 'true' : 'false'); + + if (!available) { + stderr( + `${formatNpmPackageVersion(packageInfo.name, config.releaseVersion)} did not become available on npm` + ); + return 1; + } + + stdout( + `${formatNpmPackageVersion(packageInfo.name, config.releaseVersion)} is available on npm` + ); + return 0; + } catch (error) { + stderr(`Error: ${error.message}`); + return 1; + } +} + +if (isCliEntryPoint()) { + process.exitCode = await main(); +} diff --git a/docs/case-studies/issue-82/evidence/templates/js/workflows/example-app.yml b/docs/case-studies/issue-82/evidence/templates/js/workflows/example-app.yml new file mode 100644 index 0000000..6a81458 --- /dev/null +++ b/docs/case-studies/issue-82/evidence/templates/js/workflows/example-app.yml @@ -0,0 +1,187 @@ +name: Example app + +on: + pull_request: + types: [opened, synchronize, reopened] + paths: + - 'examples/universal-app/**' + - 'src/**' + - 'package.json' + - 'package-lock.json' + - '.github/workflows/example-app.yml' + push: + branches: + - main + paths: + - 'examples/universal-app/**' + - 'src/**' + - 'package.json' + - 'package-lock.json' + - '.github/workflows/example-app.yml' + workflow_dispatch: + +permissions: + contents: read + pages: write + id-token: write + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: ${{ github.ref == 'refs/heads/main' }} + +jobs: + web-build: + name: Build web app + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - uses: actions/checkout@v6 + + - name: Setup Node.js + uses: actions/setup-node@v6 + with: + node-version: '24.x' + cache: npm + cache-dependency-path: examples/universal-app/package-lock.json + + - name: Configure GitHub Pages + if: github.event_name == 'push' && github.ref == 'refs/heads/main' + uses: actions/configure-pages@v6 + + - name: Install app dependencies + run: npm ci --prefix examples/universal-app + + - name: Build app + run: npm run example:web:build + env: + GITHUB_PAGES: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }} + VITE_REPOSITORY_URL: https://github.com/${{ github.repository }} + + - name: Upload web build artifact + uses: actions/upload-artifact@v7 + with: + name: universal-example-web + path: examples/universal-app/dist + if-no-files-found: error + + - name: Upload GitHub Pages artifact + if: github.event_name == 'push' && github.ref == 'refs/heads/main' + uses: actions/upload-pages-artifact@v5 + with: + path: examples/universal-app/dist + + pages-deploy: + name: Deploy GitHub Pages + needs: [web-build] + if: github.event_name == 'push' && github.ref == 'refs/heads/main' + runs-on: ubuntu-latest + timeout-minutes: 10 + permissions: + pages: write + id-token: write + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - name: Deploy Pages artifact + id: deployment + uses: actions/deploy-pages@v5 + + desktop-package: + name: Package desktop app (${{ matrix.os }}) + runs-on: ${{ matrix.os }} + timeout-minutes: 20 + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, macos-latest, windows-latest] + steps: + - uses: actions/checkout@v6 + + - name: Setup Node.js + uses: actions/setup-node@v6 + with: + node-version: '24.x' + cache: npm + cache-dependency-path: examples/universal-app/package-lock.json + + - name: Install app dependencies + run: npm ci --prefix examples/universal-app + + - name: Package Electron app + run: npm run example:desktop:package + env: + VITE_REPOSITORY_URL: https://github.com/${{ github.repository }} + + - name: Upload desktop package + uses: actions/upload-artifact@v7 + with: + name: universal-example-desktop-${{ matrix.os }} + path: examples/universal-app/out + if-no-files-found: error + + android-build: + name: Build Android app + if: github.event_name == 'workflow_dispatch' && vars.EXAMPLE_APP_ENABLE_ANDROID_BUILD == 'true' + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - uses: actions/checkout@v6 + + - name: Setup Node.js + uses: actions/setup-node@v6 + with: + node-version: '24.x' + cache: npm + cache-dependency-path: examples/universal-app/package-lock.json + + - name: Setup Java + uses: actions/setup-java@v5 + with: + distribution: temurin + java-version: '21' + + - name: Setup Android SDK + uses: android-actions/setup-android@v3 + + - name: Install app dependencies + run: npm ci --prefix examples/universal-app + + - name: Add Android project + run: npm --prefix examples/universal-app run mobile:android:add + + - name: Build Android project + run: npm --prefix examples/universal-app run mobile:android:build + + - name: Upload Android output + uses: actions/upload-artifact@v7 + with: + name: universal-example-android + path: | + examples/universal-app/android/app/build/outputs/**/*.apk + examples/universal-app/android/app/build/outputs/**/*.aab + if-no-files-found: warn + + ios-build: + name: Build iOS app + if: github.event_name == 'workflow_dispatch' && vars.EXAMPLE_APP_ENABLE_IOS_BUILD == 'true' + runs-on: macos-latest + timeout-minutes: 30 + steps: + - uses: actions/checkout@v6 + + - name: Setup Node.js + uses: actions/setup-node@v6 + with: + node-version: '24.x' + cache: npm + cache-dependency-path: examples/universal-app/package-lock.json + + - name: Install app dependencies + run: npm ci --prefix examples/universal-app + + - name: Add iOS project + run: npm --prefix examples/universal-app run mobile:ios:add + + - name: Build iOS project + run: npm --prefix examples/universal-app run mobile:ios:build diff --git a/docs/case-studies/issue-82/evidence/templates/js/workflows/links.yml b/docs/case-studies/issue-82/evidence/templates/js/workflows/links.yml new file mode 100644 index 0000000..3e910dc --- /dev/null +++ b/docs/case-studies/issue-82/evidence/templates/js/workflows/links.yml @@ -0,0 +1,84 @@ +name: Broken Link Checker + +on: + push: + branches: + - main + paths: + - '**.md' + - '**.html' + - '.github/workflows/links.yml' + pull_request: + types: [opened, synchronize, reopened] + paths: + - '**.md' + - '**.html' + - '.github/workflows/links.yml' + workflow_dispatch: + +jobs: + link-checker: + name: Check Links + runs-on: ubuntu-latest + # Typical run: <1min with lychee cache. 10min prevents slow + # external hosts or Wayback Machine probes from hanging the workflow. + timeout-minutes: 10 + permissions: + contents: read + steps: + - uses: actions/checkout@v6 + + - name: Check links with lychee + id: lychee + uses: lycheeverse/lychee-action@v2 + with: + # Check all Markdown and HTML files + # Exclude case-studies directory - these are research documents from + # external repos with references to files and issues that don't exist + # in this repository (similar exclusion pattern as eslint.config.js) + args: >- + --verbose + --no-progress + --cache + --max-cache-age 1d + --max-retries 3 + --timeout 30 + --exclude-path docs/case-studies + './**/*.md' + './**/*.html' + # Don't fail the workflow immediately - we want to check web archive first + fail: false + # Output file for broken links report (used by check-web-archive.mjs) + output: lychee/out.md + # Write a job summary + jobSummary: true + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Check broken links against Web Archive + if: steps.lychee.outputs.exit_code != 0 + id: webarchive + run: node scripts/check-web-archive.mjs + env: + LYCHEE_OUTPUT: lychee/out.md + + - name: Fail if broken links found and no web archive fallback + if: steps.lychee.outputs.exit_code != 0 && steps.webarchive.outputs.all_archived != 'true' + run: | + echo "::error::Broken links were detected with no Web Archive fallback available." + echo "" + echo "What happened:" + echo " lychee found one or more broken links in the *.md and *.html files of this repository." + echo " The Web Archive (Wayback Machine) check found no archived versions for some of them." + echo "" + echo "How to fix:" + echo " 1. Review the 'Check links with lychee' step above for a full list of broken links." + echo " 2. For links marked with a '::notice::' annotation above, a Web Archive version exists." + echo " Replace those broken links with the suggested archive.org URL." + echo " 3. For links with no archive version, either:" + echo " a. Find an updated URL that points to the same or equivalent content." + echo " b. Remove the link if the content is no longer relevant." + echo " c. Add the URL to .lycheeignore if it is a known false positive." + echo "" + echo "Report location: lychee/out.md (available as a workflow artifact if configured)." + exit 1 diff --git a/docs/case-studies/issue-82/evidence/templates/js/workflows/release.yml b/docs/case-studies/issue-82/evidence/templates/js/workflows/release.yml new file mode 100644 index 0000000..0facf84 --- /dev/null +++ b/docs/case-studies/issue-82/evidence/templates/js/workflows/release.yml @@ -0,0 +1,617 @@ +name: Checks and release + +on: + push: + branches: + - main + pull_request: + types: [opened, synchronize, reopened] + # Manual release support - consolidated here to work with npm trusted publishing + # npm only allows ONE workflow file as trusted publisher, so all publishing + # must go through this workflow (release.yml) + workflow_dispatch: + inputs: + release_mode: + description: 'Manual release mode' + required: true + type: choice + default: 'instant' + options: + - instant + - changeset-pr + bump_type: + description: 'Manual release type' + required: true + type: choice + options: + - patch + - minor + - major + description: + description: 'Manual release description (optional)' + required: false + type: string + +# Concurrency: Only one workflow run per branch at a time +# - For main branch (releases): cancel older runs to prevent blocking newer releases +# When multiple commits are pushed quickly, we want the latest to release, not wait +# - For PR branches: queue runs to avoid cancelling checks on force-pushes +# See: docs/case-studies/issue-25/DETAILED-COMPARISON.md for context +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: ${{ github.ref == 'refs/heads/main' }} + +jobs: + # === DETECT CHANGES - determines which jobs should run === + detect-changes: + name: Detect Changes + runs-on: ubuntu-latest + # Typical run: ~6s. Cap at 5min so a hung detection step + # surfaces quickly instead of stalling the whole pipeline. + timeout-minutes: 5 + if: github.event_name != 'workflow_dispatch' + outputs: + mjs-changed: ${{ steps.changes.outputs.mjs-changed }} + js-changed: ${{ steps.changes.outputs.js-changed }} + package-changed: ${{ steps.changes.outputs.package-changed }} + docs-changed: ${{ steps.changes.outputs.docs-changed }} + workflow-changed: ${{ steps.changes.outputs.workflow-changed }} + any-code-changed: ${{ steps.changes.outputs.any-code-changed }} + steps: + - uses: actions/checkout@v6 + with: + fetch-depth: 0 + + - name: Detect changes + id: changes + run: node scripts/detect-code-changes.mjs + + # === FAST CHECKS - run before slow tests for fastest feedback === + # See: hive-mind CI/CD best practices principle #5 (fast-fail job ordering) + + # Syntax check all .mjs files with node --check (~7s) + test-compilation: + name: Test Compilation + runs-on: ubuntu-latest + # Typical run: <10s. Tight cap fails fast on syntax-check hangs. + timeout-minutes: 5 + needs: [detect-changes] + if: | + github.event_name == 'push' || + needs.detect-changes.outputs.mjs-changed == 'true' || + needs.detect-changes.outputs.js-changed == 'true' + steps: + - uses: actions/checkout@v6 + + - name: Check .mjs syntax + run: bash scripts/check-mjs-syntax.sh + + # Enforce 1500-line limit on .mjs files and release.yml + check-file-line-limits: + name: Check File Line Limits + runs-on: ubuntu-latest + # Typical run: <10s. This job only walks tracked files and counts lines. + timeout-minutes: 5 + needs: [detect-changes] + if: | + github.event_name == 'push' || + needs.detect-changes.outputs.mjs-changed == 'true' || + needs.detect-changes.outputs.js-changed == 'true' || + needs.detect-changes.outputs.workflow-changed == 'true' + steps: + - uses: actions/checkout@v6 + with: + fetch-depth: 0 + + - name: Simulate fresh merge with base branch (PR only) + if: github.event_name == 'pull_request' + env: + BASE_REF: ${{ github.base_ref }} + run: bash scripts/simulate-fresh-merge.sh + + - name: Check file line limits + run: bash scripts/check-file-line-limits.sh + + # === VERSION CHANGE CHECK === + # Prohibit manual version changes in package.json - versions should only be changed by CI/CD + version-check: + name: Check for Manual Version Changes + runs-on: ubuntu-latest + # Typical run: ~6s. Read-only package.json diff inspection. + timeout-minutes: 5 + if: github.event_name == 'pull_request' + steps: + - uses: actions/checkout@v6 + with: + fetch-depth: 0 + + - name: Check for version changes in package.json + env: + GITHUB_HEAD_REF: ${{ github.head_ref }} + GITHUB_BASE_REF: ${{ github.base_ref }} + run: node scripts/check-version.mjs + + # === CHANGESET CHECK - only runs on PRs with code changes === + # Docs-only PRs (./docs folder, markdown files) don't require changesets + changeset-check: + name: Check for Changesets + runs-on: ubuntu-latest + # Typical run: <30s including npm install. 10min covers cold runners. + timeout-minutes: 10 + needs: [detect-changes] + if: github.event_name == 'pull_request' && needs.detect-changes.outputs.any-code-changed == 'true' + steps: + - uses: actions/checkout@v6 + with: + fetch-depth: 0 + + - name: Setup Node.js + uses: actions/setup-node@v6 + with: + node-version: '24.x' + + - name: Install dependencies + run: npm install + + - name: Check for changesets + env: + # Pass PR context to the validation script + GITHUB_BASE_REF: ${{ github.base_ref }} + GITHUB_BASE_SHA: ${{ github.event.pull_request.base.sha }} + GITHUB_HEAD_SHA: ${{ github.event.pull_request.head.sha }} + run: | + # Skip changeset check for automated version PRs + if [[ "${{ github.head_ref }}" == "changeset-release/"* ]]; then + echo "Skipping changeset check for automated release PR" + exit 0 + fi + + # Run changeset validation script + # This validates that exactly ONE changeset was ADDED by this PR + # Pre-existing changesets from other merged PRs are ignored + node scripts/validate-changeset.mjs + + # === LINT AND FORMAT CHECK === + # Lint runs independently of changeset-check - it's a fast check that should always run + # See: https://github.com/link-assistant/hive-mind/pull/1024 for why this dependency was removed + # IMPORTANT: ESLint includes max-lines rule (1500 lines) to ensure files stay maintainable + # See docs/case-studies/issue-23 for why fresh merge simulation is critical + lint: + name: Lint and Format Check + runs-on: ubuntu-latest + # Typical run: <1min including install, ESLint, Prettier, jscpd, + # and secretlint. 10min protects against a hung lint plugin. + timeout-minutes: 10 + needs: [detect-changes] + if: | + github.event_name == 'push' || + needs.detect-changes.outputs.mjs-changed == 'true' || + needs.detect-changes.outputs.js-changed == 'true' || + needs.detect-changes.outputs.docs-changed == 'true' || + needs.detect-changes.outputs.package-changed == 'true' || + needs.detect-changes.outputs.workflow-changed == 'true' + steps: + - uses: actions/checkout@v6 + with: + # For PRs, fetch enough history to merge with base branch + fetch-depth: 0 + + - name: Simulate fresh merge with base branch (PR only) + if: github.event_name == 'pull_request' + env: + BASE_REF: ${{ github.base_ref }} + run: bash scripts/simulate-fresh-merge.sh + + - name: Setup Node.js + uses: actions/setup-node@v6 + with: + node-version: '24.x' + + - name: Install dependencies + run: npm install + + - name: Run ESLint + run: npm run lint + + - name: Check formatting + run: npm run format:check + + - name: Check code duplication + run: npm run check:duplication + + - name: Check for secrets + run: npx --yes -p secretlint -p @secretlint/secretlint-rule-preset-recommend secretlint "**/*" + + # Test matrix: 3 runtimes (Node.js, Bun, Deno) x 3 OS (Ubuntu, macOS, Windows) + # IMPORTANT: Tests must validate the ACTUAL merge result, not a stale merge preview. + # See docs/case-studies/issue-23 for why this is critical. + # Fast-fail: slow test matrix only runs after fast checks pass (hive-mind principle #5) + test: + name: Test (${{ matrix.runtime }} on ${{ matrix.os }}) + runs-on: ${{ matrix.os }} + # Typical run: <1min per runtime/OS on warm runners, with Windows + # sometimes slower on cold starts. 10min fails hung tests well + # before GitHub Actions' 6h default. + timeout-minutes: 10 + needs: + [ + detect-changes, + changeset-check, + test-compilation, + lint, + check-file-line-limits, + ] + # Use !cancelled() instead of always() so cancellation propagates correctly (hive-mind issue #1278) + # Run if: push event, OR changeset-check succeeded, OR changeset-check was skipped (docs-only PR) + # AND all fast checks passed (or were skipped for irrelevant changes) + if: | + !cancelled() && + (github.event_name == 'push' || needs.changeset-check.result == 'success' || needs.changeset-check.result == 'skipped') && + (needs.test-compilation.result == 'success' || needs.test-compilation.result == 'skipped') && + (needs.lint.result == 'success' || needs.lint.result == 'skipped') && + (needs.check-file-line-limits.result == 'success' || needs.check-file-line-limits.result == 'skipped') + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, macos-latest, windows-latest] + runtime: [node, bun, deno] + steps: + - uses: actions/checkout@v6 + with: + # For PRs, fetch enough history to merge with base branch + fetch-depth: 0 + + - name: Simulate fresh merge with base branch (PR only) + if: github.event_name == 'pull_request' + env: + BASE_REF: ${{ github.base_ref }} + shell: bash + run: bash scripts/simulate-fresh-merge.sh + + - name: Setup Node.js + if: matrix.runtime == 'node' + uses: actions/setup-node@v6 + with: + node-version: '24.x' + + - name: Install dependencies (Node.js) + if: matrix.runtime == 'node' + run: npm install + + - name: Run tests (Node.js) + if: matrix.runtime == 'node' + run: npm test + + - name: Setup Bun + if: matrix.runtime == 'bun' + uses: oven-sh/setup-bun@v2 + with: + bun-version: latest + + - name: Install dependencies (Bun) + if: matrix.runtime == 'bun' + run: bun install + + - name: Run tests (Bun) + if: matrix.runtime == 'bun' + # --timeout caps an individual test at 30s, matching Node's + # --test-timeout budget while leaving headroom for cold runners. + run: bun test --timeout 30000 + + - name: Setup Deno + if: matrix.runtime == 'deno' + uses: denoland/setup-deno@v2 + with: + deno-version: v2.x + + - name: Run tests (Deno) + if: matrix.runtime == 'deno' + run: deno test --allow-read + + # === DOCUMENTATION VALIDATION === + # Validate documentation files when docs change (hive-mind principle #12) + validate-docs: + name: Validate Documentation + runs-on: ubuntu-latest + # Typical run: <10s. Pure shell checks over documentation files. + timeout-minutes: 5 + needs: [detect-changes] + if: | + github.event_name == 'push' || + needs.detect-changes.outputs.docs-changed == 'true' + steps: + - uses: actions/checkout@v6 + + - name: Check documentation file sizes + run: | + LIMIT=2500 + FAILURES=() + + echo "Checking that documentation files are under ${LIMIT} lines..." + + while IFS= read -r -d '' file; do + line_count=$(wc -l < "$file") + if [ "$line_count" -gt "$LIMIT" ]; then + echo "ERROR: $file has $line_count lines (limit: ${LIMIT})" + echo "::error file=$file::Documentation file has $line_count lines (limit: ${LIMIT})" + FAILURES+=("$file") + fi + done < <(find docs -name "*.md" -type f -print0 2>/dev/null) + + if [ "${#FAILURES[@]}" -gt 0 ]; then + echo "The following docs exceed the ${LIMIT} line limit:" + printf ' %s\n' "${FAILURES[@]}" + exit 1 + else + echo "All documentation files are within the ${LIMIT} line limit." + fi + + - name: Check required documentation files exist + run: | + REQUIRED_FILES=( + "docs/BEST-PRACTICES.md" + "docs/CONTRIBUTING.md" + "README.md" + "CHANGELOG.md" + ) + + MISSING=() + for file in "${REQUIRED_FILES[@]}"; do + if [ ! -f "$file" ]; then + echo "ERROR: Required documentation file missing: $file" + MISSING+=("$file") + else + echo "Found: $file" + fi + done + + if [ "${#MISSING[@]}" -gt 0 ]; then + echo "" + echo "Missing required documentation files:" + printf ' %s\n' "${MISSING[@]}" + exit 1 + else + echo "All required documentation files present." + fi + + # Release - only runs on main after tests pass (for push events) + release: + name: Release + needs: [lint, test] + # Typical run is well under 10min. 30min gives npm and GitHub + # release APIs room for retries without allowing a 6h hang. + timeout-minutes: 30 + # Use !cancelled() instead of always() so cancellation propagates correctly (hive-mind issue #1278) + # This is needed because lint/test jobs have a transitive dependency on changeset-check + if: | + !cancelled() && + github.ref == 'refs/heads/main' && + github.event_name == 'push' && + needs.lint.result == 'success' && + needs.test.result == 'success' + runs-on: ubuntu-latest + # Permissions required for npm OIDC trusted publishing + permissions: + contents: write + pull-requests: write + id-token: write + outputs: + published: ${{ steps.publish.outputs.published }} + published_version: ${{ steps.publish.outputs.published_version }} + steps: + - uses: actions/checkout@v6 + with: + fetch-depth: 0 + + - name: Setup Node.js + uses: actions/setup-node@v6 + with: + node-version: '24.x' + registry-url: 'https://registry.npmjs.org' + + - name: Install dependencies + run: npm install + + - name: Update npm for OIDC trusted publishing + run: node scripts/setup-npm.mjs + + - name: Check for changesets + id: check_changesets + run: node scripts/check-changesets.mjs + + - name: Check if release is needed + id: check_release + env: + HAS_CHANGESETS: ${{ steps.check_changesets.outputs.has_changesets }} + run: node scripts/check-release-needed.mjs + + - name: Merge multiple changesets + if: steps.check_changesets.outputs.has_changesets == 'true' && steps.check_changesets.outputs.changeset_count > 1 + run: | + echo "Multiple changesets detected, merging..." + node scripts/merge-changesets.mjs + + - name: Version packages and commit to main + if: steps.check_changesets.outputs.has_changesets == 'true' + id: version + run: node scripts/version-and-commit.mjs --mode changeset + + - name: Publish to npm + # Run if version was committed, if a previous attempt already committed (for re-runs), + # or if check-release-needed detected an unpublished version (self-healing, issue #36) + if: >- + steps.version.outputs.version_committed == 'true' || + steps.version.outputs.already_released == 'true' || + (steps.check_release.outputs.should_release == 'true' && steps.check_release.outputs.skip_bump == 'true') + id: publish + run: node scripts/publish-to-npm.mjs --should-pull + + - name: Create GitHub Release + if: steps.publish.outputs.published == 'true' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: node scripts/create-github-release.mjs --release-version "${{ steps.publish.outputs.published_version }}" --repository "${{ github.repository }}" + + - name: Format GitHub release notes + if: steps.publish.outputs.published == 'true' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: node scripts/format-github-release.mjs --release-version "${{ steps.publish.outputs.published_version }}" --repository "${{ github.repository }}" --commit-sha "${{ github.sha }}" + + # Manual Instant Release - triggered via workflow_dispatch with instant mode + # This job is in release.yml because npm trusted publishing + # only allows one workflow file to be registered as a trusted publisher + instant-release: + name: Instant Release + if: github.event_name == 'workflow_dispatch' && github.event.inputs.release_mode == 'instant' + runs-on: ubuntu-latest + # Same publish envelope as the automated release path. + timeout-minutes: 30 + # Permissions required for npm OIDC trusted publishing + permissions: + contents: write + pull-requests: write + id-token: write + outputs: + published: ${{ steps.publish.outputs.published }} + published_version: ${{ steps.publish.outputs.published_version }} + steps: + - uses: actions/checkout@v6 + with: + fetch-depth: 0 + + - name: Setup Node.js + uses: actions/setup-node@v6 + with: + node-version: '24.x' + registry-url: 'https://registry.npmjs.org' + + - name: Install dependencies + run: npm install + + - name: Update npm for OIDC trusted publishing + run: node scripts/setup-npm.mjs + + - name: Version packages and commit to main + id: version + run: node scripts/version-and-commit.mjs --mode instant --bump-type "${{ github.event.inputs.bump_type }}" --description "${{ github.event.inputs.description }}" + + - name: Publish to npm + # Run if version was committed OR if a previous attempt already committed (for re-runs) + if: steps.version.outputs.version_committed == 'true' || steps.version.outputs.already_released == 'true' + id: publish + run: node scripts/publish-to-npm.mjs + + - name: Create GitHub Release + if: steps.publish.outputs.published == 'true' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: node scripts/create-github-release.mjs --release-version "${{ steps.publish.outputs.published_version }}" --repository "${{ github.repository }}" + + - name: Format GitHub release notes + if: steps.publish.outputs.published == 'true' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: node scripts/format-github-release.mjs --release-version "${{ steps.publish.outputs.published_version }}" --repository "${{ github.repository }}" --commit-sha "${{ github.sha }}" + + # Optional Docker Hub publishing for packages that also ship Docker images. + # Set vars.DOCKERHUB_IMAGE to enable this path, then configure + # vars.DOCKERHUB_USERNAME and secrets.DOCKERHUB_TOKEN. + docker-publish: + name: Optional Docker Hub Publish + needs: [release, instant-release] + timeout-minutes: 30 + if: | + !cancelled() && + ( + (needs.release.result == 'success' && needs.release.outputs.published == 'true') || + (needs.instant-release.result == 'success' && needs.instant-release.outputs.published == 'true') + ) + runs-on: ubuntu-latest + permissions: + contents: read + env: + DOCKER_CONTEXT: ${{ vars.DOCKER_CONTEXT }} + DOCKERFILE: ${{ vars.DOCKERFILE }} + DOCKERHUB_IMAGE: ${{ vars.DOCKERHUB_IMAGE }} + DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }} + DOCKERHUB_USERNAME: ${{ vars.DOCKERHUB_USERNAME }} + RELEASE_VERSION: ${{ needs.release.outputs.published_version || needs.instant-release.outputs.published_version }} + steps: + - uses: actions/checkout@v6 + + - name: Check Docker publish configuration + id: docker_config + run: node scripts/check-docker-publish.mjs + + - name: Wait for npm package availability before Docker publish + if: steps.docker_config.outputs.enabled == 'true' + run: node scripts/wait-for-npm.mjs --release-version "${{ env.RELEASE_VERSION }}" + + - name: Publish Docker image to Docker Hub + if: steps.docker_config.outputs.enabled == 'true' + uses: ./.github/actions/publish-dockerhub + with: + context: ${{ steps.docker_config.outputs.context }} + file: ${{ steps.docker_config.outputs.dockerfile }} + image: ${{ steps.docker_config.outputs.image }} + token: ${{ env.DOCKERHUB_TOKEN }} + username: ${{ env.DOCKERHUB_USERNAME }} + version: ${{ env.RELEASE_VERSION }} + + # Manual Changeset PR - creates a pull request with the changeset for review + changeset-pr: + name: Create Changeset PR + if: github.event_name == 'workflow_dispatch' && github.event.inputs.release_mode == 'changeset-pr' + runs-on: ubuntu-latest + # PR creation only: install, create a changeset, format, and open a PR. + timeout-minutes: 10 + permissions: + contents: write + pull-requests: write + steps: + - uses: actions/checkout@v6 + with: + fetch-depth: 0 + + - name: Setup Node.js + uses: actions/setup-node@v6 + with: + node-version: '24.x' + + - name: Install dependencies + run: npm install + + - name: Create changeset file + run: node scripts/create-manual-changeset.mjs --bump-type "${{ github.event.inputs.bump_type }}" --description "${{ github.event.inputs.description }}" + + - name: Format changeset with Prettier + run: | + # Run Prettier on the changeset file to ensure it matches project style + npx prettier --write ".changeset/*.md" || true + + echo "Formatted changeset files" + + - name: Create Pull Request + uses: peter-evans/create-pull-request@v8 + with: + token: ${{ secrets.GITHUB_TOKEN }} + commit-message: 'chore: add changeset for manual ${{ github.event.inputs.bump_type }} release' + branch: changeset-manual-release-${{ github.run_id }} + delete-branch: true + title: 'chore: manual ${{ github.event.inputs.bump_type }} release' + body: | + ## Manual Release Request + + This PR was created by a manual workflow trigger to prepare a **${{ github.event.inputs.bump_type }}** release. + + ### Release Details + - **Type:** ${{ github.event.inputs.bump_type }} + - **Description:** ${{ github.event.inputs.description || 'Manual release' }} + - **Triggered by:** @${{ github.actor }} + + ### Next Steps + 1. Review the changeset in this PR + 2. Merge this PR to main + 3. The automated release workflow will create a version PR + 4. Merge the version PR to publish to npm and create a GitHub release diff --git a/docs/case-studies/issue-82/evidence/templates/rust/release.yml b/docs/case-studies/issue-82/evidence/templates/rust/release.yml new file mode 100644 index 0000000..885eb01 --- /dev/null +++ b/docs/case-studies/issue-82/evidence/templates/rust/release.yml @@ -0,0 +1,670 @@ +name: CI/CD Pipeline + +on: + push: + branches: + - main + pull_request: + types: [opened, synchronize, reopened] + workflow_dispatch: + inputs: + release_mode: + description: 'Manual release mode' + required: true + type: choice + default: 'instant' + options: + - instant + - changelog-pr + bump_type: + description: 'Version bump type' + required: true + type: choice + options: + - patch + - minor + - major + description: + description: 'Release description (optional)' + required: false + type: string + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: ${{ github.ref == 'refs/heads/main' }} + +env: + CARGO_TERM_COLOR: always + RUSTFLAGS: -Dwarnings + # Support both CARGO_REGISTRY_TOKEN (cargo's native env var) and CARGO_TOKEN (for backwards compatibility) + CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN || secrets.CARGO_TOKEN }} + CARGO_TOKEN: ${{ secrets.CARGO_TOKEN }} + # Optional: set repository variable DOCKERHUB_IMAGE to namespace/image to publish Docker Hub releases. + DOCKERHUB_IMAGE: ${{ vars.DOCKERHUB_IMAGE }} + +jobs: + # === DETECT CHANGES - determines which jobs should run === + detect-changes: + name: Detect Changes + runs-on: ubuntu-latest + timeout-minutes: 5 + if: github.event_name != 'workflow_dispatch' + outputs: + rs-changed: ${{ steps.changes.outputs.rs-changed }} + toml-changed: ${{ steps.changes.outputs.toml-changed }} + docs-changed: ${{ steps.changes.outputs.docs-changed }} + workflow-changed: ${{ steps.changes.outputs.workflow-changed }} + any-code-changed: ${{ steps.changes.outputs.any-code-changed }} + steps: + - uses: actions/checkout@v6 + with: + fetch-depth: 0 + + - name: Setup Rust + uses: dtolnay/rust-toolchain@stable + + - name: Install rust-script + run: cargo install rust-script + + - name: Detect changes + id: changes + env: + GITHUB_EVENT_NAME: ${{ github.event_name }} + run: rust-script scripts/detect-code-changes.rs + + # === CHANGELOG CHECK - only runs on PRs with code changes === + # Docs-only PRs (./docs folder, markdown files) don't require changelog fragments + changelog: + name: Changelog Fragment Check + runs-on: ubuntu-latest + timeout-minutes: 10 + needs: [detect-changes] + if: github.event_name == 'pull_request' && needs.detect-changes.outputs.any-code-changed == 'true' + steps: + - uses: actions/checkout@v6 + with: + fetch-depth: 0 + + - name: Setup Rust + uses: dtolnay/rust-toolchain@stable + + - name: Install rust-script + run: cargo install rust-script + + - name: Check for changelog fragments + env: + GITHUB_BASE_REF: ${{ github.base_ref }} + run: rust-script scripts/check-changelog-fragment.rs + + # === VERSION CHECK - prevents manual version modification in PRs === + # This ensures versions are only modified by the automated release pipeline + version-check: + name: Version Modification Check + runs-on: ubuntu-latest + timeout-minutes: 5 + if: github.event_name == 'pull_request' + steps: + - uses: actions/checkout@v6 + with: + fetch-depth: 0 + + - name: Setup Rust + uses: dtolnay/rust-toolchain@stable + + - name: Install rust-script + run: cargo install rust-script + + - name: Check for manual version changes + env: + GITHUB_EVENT_NAME: ${{ github.event_name }} + GITHUB_HEAD_REF: ${{ github.head_ref }} + GITHUB_BASE_REF: ${{ github.base_ref }} + run: rust-script scripts/check-version-modification.rs + + # === LINT AND FORMAT CHECK === + # Lint runs independently of changelog check - it's a fast check that should always run + # See: https://github.com/link-assistant/hive-mind/pull/1024 for why this dependency was removed + lint: + name: Lint and Format Check + runs-on: ubuntu-latest + timeout-minutes: 10 + needs: [detect-changes] + # Note: always() is required because detect-changes is skipped on workflow_dispatch, + # and without always(), this job would also be skipped even though its condition includes workflow_dispatch. + # See: https://github.com/actions/runner/issues/491 + if: | + always() && !cancelled() && ( + github.event_name == 'push' || + github.event_name == 'workflow_dispatch' || + needs.detect-changes.outputs.rs-changed == 'true' || + needs.detect-changes.outputs.toml-changed == 'true' || + needs.detect-changes.outputs.docs-changed == 'true' || + needs.detect-changes.outputs.workflow-changed == 'true' + ) + steps: + - uses: actions/checkout@v6 + + - name: Setup Rust + uses: dtolnay/rust-toolchain@stable + with: + components: rustfmt, clippy + + - name: Install rust-script + run: cargo install rust-script + + - name: Cache cargo registry + uses: actions/cache@v5 + with: + path: | + ~/.cargo/registry + ~/.cargo/git + target + key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-cargo- + + - name: Check formatting + run: cargo fmt --all -- --check + + - name: Run Clippy + run: cargo clippy --all-targets --all-features + + - name: Check file size limit + run: rust-script scripts/check-file-size.rs + + # === TEST === + # Test runs independently of changelog check + test: + name: Test (${{ matrix.os }}) + runs-on: ${{ matrix.os }} + timeout-minutes: 10 + needs: [detect-changes, changelog] + # Run if: push event, OR changelog succeeded, OR changelog was skipped (docs-only PR) + if: always() && !cancelled() && (github.event_name == 'push' || github.event_name == 'workflow_dispatch' || needs.changelog.result == 'success' || needs.changelog.result == 'skipped') + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, macos-latest, windows-latest] + steps: + - uses: actions/checkout@v6 + + - name: Setup Rust + uses: dtolnay/rust-toolchain@stable + + - name: Cache cargo registry + uses: actions/cache@v5 + with: + path: | + ~/.cargo/registry + ~/.cargo/git + target + key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-cargo- + + - name: Run tests + run: cargo test --all-features --verbose + + - name: Run doc tests + run: cargo test --doc --verbose + + # === CODE COVERAGE === + # Generate and upload code coverage using cargo-llvm-cov + coverage: + name: Code Coverage + runs-on: ubuntu-latest + timeout-minutes: 15 + needs: [detect-changes] + if: | + always() && !cancelled() && ( + github.event_name == 'push' || + github.event_name == 'workflow_dispatch' || + needs.detect-changes.outputs.rs-changed == 'true' || + needs.detect-changes.outputs.toml-changed == 'true' + ) + steps: + - uses: actions/checkout@v6 + + - name: Setup Rust + uses: dtolnay/rust-toolchain@stable + with: + components: llvm-tools-preview + + - name: Cache cargo registry + uses: actions/cache@v5 + with: + path: | + ~/.cargo/registry + ~/.cargo/git + target + key: ${{ runner.os }}-cargo-coverage-${{ hashFiles('**/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-cargo-coverage- + + - name: Install cargo-llvm-cov + uses: taiki-e/install-action@cargo-llvm-cov + + - name: Generate code coverage + run: cargo llvm-cov --all-features --lcov --output-path lcov.info + + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v5 + with: + files: lcov.info + fail_ci_if_error: false + + # === BUILD === + # Build package - only runs if lint and test pass + build: + name: Build Package + runs-on: ubuntu-latest + timeout-minutes: 10 + needs: [lint, test] + if: always() && !cancelled() && needs.lint.result == 'success' && needs.test.result == 'success' + steps: + - uses: actions/checkout@v6 + + - name: Setup Rust + uses: dtolnay/rust-toolchain@stable + + - name: Cache cargo registry + uses: actions/cache@v5 + with: + path: | + ~/.cargo/registry + ~/.cargo/git + target + key: ${{ runner.os }}-cargo-build-${{ hashFiles('**/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-cargo-build- + + - name: Build release + run: cargo build --release --verbose + + - name: Check package + run: cargo package --list --allow-dirty + + # === AUTO RELEASE === + # Automatic release on push to main using changelog fragments + # This job automatically bumps version based on fragments in changelog.d/ + auto-release: + name: Auto Release + needs: [lint, test, build] + # Note: always() ensures consistent behavior with other jobs that depend on jobs using always(). + if: | + always() && !cancelled() && + github.event_name == 'push' && + github.ref == 'refs/heads/main' && + needs.build.result == 'success' + runs-on: ubuntu-latest + timeout-minutes: 30 + env: + DOCKERHUB_USERNAME: ${{ vars.DOCKERHUB_USERNAME || secrets.DOCKERHUB_USERNAME }} + DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }} + permissions: + contents: write + steps: + - uses: actions/checkout@v6 + with: + fetch-depth: 0 + token: ${{ secrets.GITHUB_TOKEN }} + + - name: Setup Rust + uses: dtolnay/rust-toolchain@stable + + - name: Install rust-script + run: cargo install rust-script + + - name: Configure git + run: rust-script scripts/git-config.rs + + - name: Determine bump type from changelog fragments + id: bump_type + run: rust-script scripts/get-bump-type.rs + + - name: Check if version already released or no fragments + id: check + env: + HAS_FRAGMENTS: ${{ steps.bump_type.outputs.has_fragments }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: rust-script scripts/check-release-needed.rs + + - name: Collect changelog and bump version + id: version + if: steps.check.outputs.should_release == 'true' && steps.check.outputs.skip_bump != 'true' + run: | + rust-script scripts/version-and-commit.rs \ + --bump-type "${{ steps.bump_type.outputs.bump_type }}" + + - name: Get current version + id: current_version + if: steps.check.outputs.should_release == 'true' + run: rust-script scripts/get-version.rs + + - name: Build release + if: steps.check.outputs.should_release == 'true' + run: cargo build --release + + - name: Publish to Crates.io + if: steps.check.outputs.should_release == 'true' && steps.check.outputs.crate_published != 'true' + id: publish-crate + env: + CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN || secrets.CARGO_TOKEN }} + CARGO_TOKEN: ${{ secrets.CARGO_TOKEN }} + run: rust-script scripts/publish-crate.rs + + - name: Wait for Crate availability on Crates.io + if: steps.check.outputs.should_release == 'true' + run: rust-script scripts/wait-for-crate.rs --release-version "${{ steps.current_version.outputs.version }}" + + - name: Configure Docker Hub publishing + if: steps.check.outputs.should_release == 'true' + id: dockerhub + run: | + disable_dockerhub() { + echo "enabled=false" >> "$GITHUB_OUTPUT" + echo "$1" + } + + if [ -z "$DOCKERHUB_IMAGE" ]; then + disable_dockerhub "Docker Hub publishing disabled: DOCKERHUB_IMAGE repository variable is not set" + exit 0 + fi + + if [ ! -f Dockerfile ]; then + disable_dockerhub "Docker Hub publishing disabled: Dockerfile was not found at repository root" + exit 0 + fi + + if [ -z "$DOCKERHUB_USERNAME" ] || [ -z "$DOCKERHUB_TOKEN" ]; then + echo "::error::Docker Hub publishing requires DOCKERHUB_USERNAME and DOCKERHUB_TOKEN" + echo "Set DOCKERHUB_USERNAME as a repository variable or secret, and DOCKERHUB_TOKEN as a secret." + exit 1 + fi + + echo "enabled=true" >> "$GITHUB_OUTPUT" + echo "docker_hub_url=https://hub.docker.com/r/${DOCKERHUB_IMAGE}" >> "$GITHUB_OUTPUT" + + - name: Log in to Docker Hub + if: steps.dockerhub.outputs.enabled == 'true' + uses: docker/login-action@v4 + with: + username: ${{ env.DOCKERHUB_USERNAME }} + password: ${{ env.DOCKERHUB_TOKEN }} + + - name: Set up Docker Buildx + if: steps.dockerhub.outputs.enabled == 'true' + uses: docker/setup-buildx-action@v4 + + - name: Extract Docker metadata + if: steps.dockerhub.outputs.enabled == 'true' + id: docker-meta + uses: docker/metadata-action@v6 + with: + images: ${{ env.DOCKERHUB_IMAGE }} + tags: | + type=raw,value=latest + type=raw,value=${{ steps.current_version.outputs.version }} + labels: | + org.opencontainers.image.version=${{ steps.current_version.outputs.version }} + + - name: Publish Docker image to Docker Hub + if: steps.dockerhub.outputs.enabled == 'true' + uses: docker/build-push-action@v7 + with: + context: . + push: true + tags: ${{ steps.docker-meta.outputs.tags }} + labels: ${{ steps.docker-meta.outputs.labels }} + + - name: Create GitHub Release + if: steps.check.outputs.should_release == 'true' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + DOCKER_HUB_URL: ${{ steps.dockerhub.outputs.docker_hub_url }} + run: | + # Use new_version from version-and-commit when available (tag-checked), else fall back to Cargo.toml version + RELEASE_VERSION="${{ steps.version.outputs.new_version }}" + if [ -z "$RELEASE_VERSION" ]; then + RELEASE_VERSION="${{ steps.current_version.outputs.version }}" + fi + + release_args=( + --release-version "$RELEASE_VERSION" + --repository "${{ github.repository }}" + ) + if [ -n "$DOCKER_HUB_URL" ]; then + release_args+=(--docker-hub-url "$DOCKER_HUB_URL") + fi + rust-script scripts/create-github-release.rs "${release_args[@]}" + + # === MANUAL INSTANT RELEASE === + # Manual release via workflow_dispatch - only after CI passes + manual-release: + name: Instant Release + needs: [lint, test, build] + # Note: always() is required to evaluate the condition when dependencies use always(). + # The build job ensures lint and test passed before this job runs. + if: | + always() && !cancelled() && + github.event_name == 'workflow_dispatch' && + github.event.inputs.release_mode == 'instant' && + needs.build.result == 'success' + runs-on: ubuntu-latest + timeout-minutes: 30 + env: + DOCKERHUB_USERNAME: ${{ vars.DOCKERHUB_USERNAME || secrets.DOCKERHUB_USERNAME }} + DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }} + permissions: + contents: write + steps: + - uses: actions/checkout@v6 + with: + fetch-depth: 0 + token: ${{ secrets.GITHUB_TOKEN }} + + - name: Setup Rust + uses: dtolnay/rust-toolchain@stable + + - name: Install rust-script + run: cargo install rust-script + + - name: Configure git + run: rust-script scripts/git-config.rs + + - name: Collect changelog fragments + run: rust-script scripts/collect-changelog.rs + + - name: Version and commit + id: version + env: + BUMP_TYPE: ${{ github.event.inputs.bump_type }} + DESCRIPTION: ${{ github.event.inputs.description }} + run: rust-script scripts/version-and-commit.rs --bump-type "${{ github.event.inputs.bump_type }}" --description "${{ github.event.inputs.description }}" + + - name: Build release + if: steps.version.outputs.version_committed == 'true' || steps.version.outputs.already_released == 'true' + run: cargo build --release + + - name: Publish to Crates.io + if: steps.version.outputs.version_committed == 'true' || steps.version.outputs.already_released == 'true' + id: publish-crate + env: + CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN || secrets.CARGO_TOKEN }} + CARGO_TOKEN: ${{ secrets.CARGO_TOKEN }} + run: rust-script scripts/publish-crate.rs + + - name: Wait for Crate availability on Crates.io + if: steps.version.outputs.version_committed == 'true' || steps.version.outputs.already_released == 'true' + run: rust-script scripts/wait-for-crate.rs --release-version "${{ steps.version.outputs.new_version }}" + + - name: Configure Docker Hub publishing + if: steps.version.outputs.version_committed == 'true' || steps.version.outputs.already_released == 'true' + id: dockerhub + run: | + disable_dockerhub() { + echo "enabled=false" >> "$GITHUB_OUTPUT" + echo "$1" + } + + if [ -z "$DOCKERHUB_IMAGE" ]; then + disable_dockerhub "Docker Hub publishing disabled: DOCKERHUB_IMAGE repository variable is not set" + exit 0 + fi + + if [ ! -f Dockerfile ]; then + disable_dockerhub "Docker Hub publishing disabled: Dockerfile was not found at repository root" + exit 0 + fi + + if [ -z "$DOCKERHUB_USERNAME" ] || [ -z "$DOCKERHUB_TOKEN" ]; then + echo "::error::Docker Hub publishing requires DOCKERHUB_USERNAME and DOCKERHUB_TOKEN" + echo "Set DOCKERHUB_USERNAME as a repository variable or secret, and DOCKERHUB_TOKEN as a secret." + exit 1 + fi + + echo "enabled=true" >> "$GITHUB_OUTPUT" + echo "docker_hub_url=https://hub.docker.com/r/${DOCKERHUB_IMAGE}" >> "$GITHUB_OUTPUT" + + - name: Log in to Docker Hub + if: steps.dockerhub.outputs.enabled == 'true' + uses: docker/login-action@v4 + with: + username: ${{ env.DOCKERHUB_USERNAME }} + password: ${{ env.DOCKERHUB_TOKEN }} + + - name: Set up Docker Buildx + if: steps.dockerhub.outputs.enabled == 'true' + uses: docker/setup-buildx-action@v4 + + - name: Extract Docker metadata + if: steps.dockerhub.outputs.enabled == 'true' + id: docker-meta + uses: docker/metadata-action@v6 + with: + images: ${{ env.DOCKERHUB_IMAGE }} + tags: | + type=raw,value=latest + type=raw,value=${{ steps.version.outputs.new_version }} + labels: | + org.opencontainers.image.version=${{ steps.version.outputs.new_version }} + + - name: Publish Docker image to Docker Hub + if: steps.dockerhub.outputs.enabled == 'true' + uses: docker/build-push-action@v7 + with: + context: . + push: true + tags: ${{ steps.docker-meta.outputs.tags }} + labels: ${{ steps.docker-meta.outputs.labels }} + + - name: Create GitHub Release + if: steps.version.outputs.version_committed == 'true' || steps.version.outputs.already_released == 'true' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + DOCKER_HUB_URL: ${{ steps.dockerhub.outputs.docker_hub_url }} + run: | + release_args=( + --release-version "${{ steps.version.outputs.new_version }}" + --repository "${{ github.repository }}" + ) + if [ -n "$DOCKER_HUB_URL" ]; then + release_args+=(--docker-hub-url "$DOCKER_HUB_URL") + fi + rust-script scripts/create-github-release.rs "${release_args[@]}" + + # === MANUAL CHANGELOG PR === + changelog-pr: + name: Create Changelog PR + if: github.event_name == 'workflow_dispatch' && github.event.inputs.release_mode == 'changelog-pr' + runs-on: ubuntu-latest + timeout-minutes: 10 + permissions: + contents: write + pull-requests: write + steps: + - uses: actions/checkout@v6 + with: + fetch-depth: 0 + + - name: Setup Rust + uses: dtolnay/rust-toolchain@stable + + - name: Install rust-script + run: cargo install rust-script + + - name: Create changelog fragment + env: + BUMP_TYPE: ${{ github.event.inputs.bump_type }} + DESCRIPTION: ${{ github.event.inputs.description }} + run: rust-script scripts/create-changelog-fragment.rs --bump-type "${{ github.event.inputs.bump_type }}" --description "${{ github.event.inputs.description }}" + + - name: Create Pull Request + uses: peter-evans/create-pull-request@v8 + with: + token: ${{ secrets.GITHUB_TOKEN }} + commit-message: 'chore: add changelog for manual ${{ github.event.inputs.bump_type }} release' + branch: changelog-manual-release-${{ github.run_id }} + delete-branch: true + title: 'chore: manual ${{ github.event.inputs.bump_type }} release' + body: | + ## Manual Release Request + + This PR was created by a manual workflow trigger to prepare a **${{ github.event.inputs.bump_type }}** release. + + ### Release Details + - **Type:** ${{ github.event.inputs.bump_type }} + - **Description:** ${{ github.event.inputs.description || 'Manual release' }} + - **Triggered by:** @${{ github.actor }} + + ### Next Steps + 1. Review the changelog fragment in this PR + 2. Merge this PR to main + 3. The automated release workflow will publish to crates.io and create a GitHub release + + # === DEPLOY DOCUMENTATION === + # Deploy Rust API documentation to GitHub Pages after a successful package build. + # Keep this independent from package/GitHub release publication so the website + # still updates when the release path fails. Use the official Pages artifact + # deployment path so repositories configured with "GitHub Actions" as their + # Pages source fail this job if Pages cannot deploy. + deploy-docs: + name: Deploy Rust Documentation + needs: [build] + if: | + !cancelled() && + needs.build.result == 'success' && ( + (github.event_name == 'push' && github.ref == 'refs/heads/main') || + (github.event_name == 'workflow_dispatch' && github.event.inputs.release_mode == 'instant') + ) + runs-on: ubuntu-latest + timeout-minutes: 15 + permissions: + contents: read + pages: write + id-token: write + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - uses: actions/checkout@v6 + with: + ref: main + + - name: Setup Rust + uses: dtolnay/rust-toolchain@stable + + - name: Build documentation + run: cargo doc --no-deps --all-features + + - name: Configure GitHub Pages + uses: actions/configure-pages@v6 + + - name: Upload GitHub Pages artifact + uses: actions/upload-pages-artifact@v5 + with: + path: target/doc + + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v5 diff --git a/docs/case-studies/issue-82/evidence/templates/rust/scripts/bump-version.rs b/docs/case-studies/issue-82/evidence/templates/rust/scripts/bump-version.rs new file mode 100644 index 0000000..fe1daee --- /dev/null +++ b/docs/case-studies/issue-82/evidence/templates/rust/scripts/bump-version.rs @@ -0,0 +1,165 @@ +#!/usr/bin/env rust-script +//! Bump version in Cargo.toml +//! +//! Usage: rust-script scripts/bump-version.rs --bump-type [--dry-run] [--rust-root ] +//! +//! Supports both single-language and multi-language repository structures: +//! - Single-language: Cargo.toml in repository root +//! - Multi-language: Cargo.toml in rust/ subfolder +//! +//! ```cargo +//! [dependencies] +//! regex = "1" +//! ``` + +use std::env; +use std::fs; +use std::process::exit; +use regex::Regex; + +#[path = "rust-paths.rs"] +mod rust_paths; + +#[derive(Debug, Clone, Copy, PartialEq)] +enum BumpType { + Major, + Minor, + Patch, +} + +impl BumpType { + fn from_str(s: &str) -> Option { + match s.to_lowercase().as_str() { + "major" => Some(BumpType::Major), + "minor" => Some(BumpType::Minor), + "patch" => Some(BumpType::Patch), + _ => None, + } + } +} + +struct Version { + major: u32, + minor: u32, + patch: u32, +} + +impl Version { + fn bump(&self, bump_type: BumpType) -> String { + match bump_type { + BumpType::Major => format!("{}.0.0", self.major + 1), + BumpType::Minor => format!("{}.{}.0", self.major, self.minor + 1), + BumpType::Patch => format!("{}.{}.{}", self.major, self.minor, self.patch + 1), + } + } + + fn to_string(&self) -> String { + format!("{}.{}.{}", self.major, self.minor, self.patch) + } +} + +fn get_arg(name: &str) -> Option { + let args: Vec = env::args().collect(); + let flag = format!("--{}", name); + + if let Some(idx) = args.iter().position(|a| a == &flag) { + return args.get(idx + 1).cloned(); + } + + // Check environment variable (convert dashes to underscores) + let env_name = name.to_uppercase().replace('-', "_"); + env::var(&env_name).ok().filter(|s| !s.is_empty()) +} + +fn has_flag(name: &str) -> bool { + let args: Vec = env::args().collect(); + let flag = format!("--{}", name); + args.contains(&flag) +} + +fn get_current_version(cargo_toml_path: &str) -> Result { + let content = fs::read_to_string(cargo_toml_path) + .map_err(|e| format!("Failed to read {}: {}", cargo_toml_path, e))?; + + let re = Regex::new(r#"(?m)^version\s*=\s*"(\d+)\.(\d+)\.(\d+)""#).unwrap(); + + if let Some(caps) = re.captures(&content) { + let major: u32 = caps.get(1).unwrap().as_str().parse().unwrap(); + let minor: u32 = caps.get(2).unwrap().as_str().parse().unwrap(); + let patch: u32 = caps.get(3).unwrap().as_str().parse().unwrap(); + Ok(Version { major, minor, patch }) + } else { + Err(format!("Could not parse version from {}", cargo_toml_path)) + } +} + +fn update_cargo_toml(cargo_toml_path: &str, new_version: &str) -> Result<(), String> { + let content = fs::read_to_string(cargo_toml_path) + .map_err(|e| format!("Failed to read {}: {}", cargo_toml_path, e))?; + + let re = Regex::new(r#"(?m)^(version\s*=\s*")[^"]+(")"#).unwrap(); + let new_content = re.replace(&content, format!("${{1}}{}${{2}}", new_version).as_str()); + + fs::write(cargo_toml_path, new_content.as_ref()) + .map_err(|e| format!("Failed to write {}: {}", cargo_toml_path, e))?; + + Ok(()) +} + +fn main() { + let bump_type_str = match get_arg("bump-type") { + Some(s) => s, + None => { + eprintln!("Usage: rust-script scripts/bump-version.rs --bump-type [--dry-run] [--rust-root ]"); + exit(1); + } + }; + + let bump_type = match BumpType::from_str(&bump_type_str) { + Some(bt) => bt, + None => { + eprintln!("Invalid bump type: {}. Must be major, minor, or patch.", bump_type_str); + exit(1); + } + }; + + let dry_run = has_flag("dry-run"); + let rust_root = match rust_paths::get_rust_root(None, true) { + Ok(root) => root, + Err(e) => { + eprintln!("Error: {}", e); + exit(1); + } + }; + let cargo_toml = rust_paths::get_cargo_toml_path(&rust_root); + let package_manifest = match rust_paths::get_package_manifest_path(&cargo_toml) { + Ok(path) => path, + Err(e) => { + eprintln!("Error: {}", e); + exit(1); + } + }; + + let current = match get_current_version(package_manifest.to_string_lossy().as_ref()) { + Ok(v) => v, + Err(e) => { + eprintln!("Error: {}", e); + exit(1); + } + }; + + let new_version = current.bump(bump_type); + + println!("Current version: {}", current.to_string()); + println!("New version: {}", new_version); + + if dry_run { + println!("Dry run - no changes made"); + } else { + if let Err(e) = update_cargo_toml(package_manifest.to_string_lossy().as_ref(), &new_version) { + eprintln!("Error: {}", e); + exit(1); + } + println!("Updated {}", package_manifest.display()); + } +} diff --git a/docs/case-studies/issue-82/evidence/templates/rust/scripts/check-changelog-fragment.rs b/docs/case-studies/issue-82/evidence/templates/rust/scripts/check-changelog-fragment.rs new file mode 100644 index 0000000..70faf74 --- /dev/null +++ b/docs/case-studies/issue-82/evidence/templates/rust/scripts/check-changelog-fragment.rs @@ -0,0 +1,164 @@ +#!/usr/bin/env rust-script +//! Check if a changelog fragment was added in the current PR +//! +//! This script validates that a changelog fragment is added in the PR diff, +//! not just checking if any fragments exist in the directory. This prevents +//! the check from incorrectly passing when there are leftover fragments +//! from previous PRs that haven't been released yet. +//! +//! Usage: rust-script scripts/check-changelog-fragment.rs +//! +//! Environment variables (set by GitHub Actions): +//! - GITHUB_BASE_REF: Base branch name for PR (e.g., "main") +//! +//! Exit codes: +//! - 0: Check passed (fragment added or no source changes) +//! - 1: Check failed (source changes without changelog fragment) +//! +//! ```cargo +//! [dependencies] +//! regex = "1" +//! ``` + +use std::env; +use std::path::Path; +use std::process::{Command, exit}; +use regex::Regex; + +fn exec(command: &str, args: &[&str]) -> String { + match Command::new(command).args(args).output() { + Ok(output) => { + if output.status.success() { + String::from_utf8_lossy(&output.stdout).trim().to_string() + } else { + eprintln!("Error executing {} {:?}", command, args); + eprintln!("{}", String::from_utf8_lossy(&output.stderr)); + String::new() + } + } + Err(e) => { + eprintln!("Failed to execute {} {:?}: {}", command, args, e); + String::new() + } + } +} + +fn get_rust_root() -> String { + if let Ok(root) = env::var("RUST_ROOT") { + if !root.is_empty() { + return root; + } + } + + if Path::new("./Cargo.toml").exists() { + return ".".to_string(); + } + + if Path::new("./rust/Cargo.toml").exists() { + return "rust".to_string(); + } + + ".".to_string() +} + +fn get_changed_files() -> Vec { + let base_ref = env::var("GITHUB_BASE_REF").unwrap_or_else(|_| "main".to_string()); + eprintln!("Comparing against origin/{}...HEAD", base_ref); + + let output = exec( + "git", + &["diff", "--name-only", &format!("origin/{}...HEAD", base_ref)], + ); + + if output.is_empty() { + return Vec::new(); + } + + output.lines().filter(|s| !s.is_empty()).map(String::from).collect() +} + +fn is_source_file(file_path: &str, rust_root: &str) -> bool { + let prefix = if rust_root == "." { String::new() } else { format!("{}/", rust_root) }; + + let source_patterns = [ + Regex::new(&format!(r"^{}src/", regex::escape(&prefix))).unwrap(), + Regex::new(&format!(r"^{}tests/", regex::escape(&prefix))).unwrap(), + Regex::new(&format!(r"^{}?scripts/", regex::escape(&prefix))).unwrap(), + Regex::new(&format!(r"^{}Cargo\.toml$", regex::escape(&prefix))).unwrap(), + ]; + + source_patterns.iter().any(|pattern| pattern.is_match(file_path)) +} + +fn is_changelog_fragment(file_path: &str, rust_root: &str) -> bool { + let changelog_dir = if rust_root == "." { "changelog.d/".to_string() } else { format!("{}/changelog.d/", rust_root) }; + + (file_path.starts_with(&changelog_dir) || file_path.starts_with("changelog.d/")) + && file_path.ends_with(".md") + && !file_path.ends_with("README.md") +} + +fn main() { + println!("Checking for changelog fragment in PR diff...\n"); + + let rust_root = get_rust_root(); + if rust_root != "." { + println!("Detected multi-language repository (Rust root: {})", rust_root); + } + + let changed_files = get_changed_files(); + + if changed_files.is_empty() { + println!("No changed files found"); + exit(0); + } + + println!("Changed files:"); + for file in &changed_files { + println!(" {}", file); + } + println!(); + + // Count source files changed + let source_changes: Vec<&String> = changed_files.iter().filter(|f| is_source_file(f, &rust_root)).collect(); + let source_changed_count = source_changes.len(); + + println!("Source files changed: {}", source_changed_count); + if source_changed_count > 0 { + for file in &source_changes { + println!(" {}", file); + } + } + println!(); + + // Count changelog fragments added in this PR + let fragments_added: Vec<&String> = changed_files + .iter() + .filter(|f| is_changelog_fragment(f, &rust_root)) + .collect(); + let fragment_added_count = fragments_added.len(); + + println!("Changelog fragments added: {}", fragment_added_count); + if fragment_added_count > 0 { + for file in &fragments_added { + println!(" {}", file); + } + } + println!(); + + // Check if source files changed but no fragment was added + if source_changed_count > 0 && fragment_added_count == 0 { + eprintln!("::error::No changelog fragment found in this PR. Please add a changelog entry in changelog.d/"); + eprintln!(); + eprintln!("To create a changelog fragment:"); + eprintln!(" Create a new .md file in changelog.d/ with your changes"); + eprintln!(); + eprintln!("See changelog.d/README.md for more information."); + exit(1); + } + + println!( + "Changelog check passed (source files changed: {}, fragments added: {})", + source_changed_count, fragment_added_count + ); +} diff --git a/docs/case-studies/issue-82/evidence/templates/rust/scripts/check-file-size.rs b/docs/case-studies/issue-82/evidence/templates/rust/scripts/check-file-size.rs new file mode 100644 index 0000000..64d3eb1 --- /dev/null +++ b/docs/case-studies/issue-82/evidence/templates/rust/scripts/check-file-size.rs @@ -0,0 +1,293 @@ +#!/usr/bin/env rust-script +//! Check Rust files for maximum and warning line-count thresholds +//! Exits with error code 1 if any files exceed the hard limit +//! +//! Usage: rust-script scripts/check-file-size.rs +//! +//! ```cargo +//! [dependencies] +//! walkdir = "2" +//! ``` + +use std::fs; +use std::path::Path; +#[cfg(not(test))] +use std::process::exit; +use walkdir::WalkDir; + +const MAX_LINES: usize = 1000; +const WARN_LINES: usize = 900; +const FILE_EXTENSIONS: &[&str] = &[".rs"]; +const EXCLUDE_PATTERNS: &[&str] = &["target", ".git", "node_modules"]; + +fn should_exclude(path: &Path) -> bool { + let path_str = path.to_string_lossy(); + EXCLUDE_PATTERNS + .iter() + .any(|pattern| path_str.contains(pattern)) +} + +fn has_valid_extension(path: &Path) -> bool { + let Some(ext) = path.extension().and_then(|ext| ext.to_str()) else { + return false; + }; + + FILE_EXTENSIONS + .iter() + .any(|valid_ext| valid_ext.strip_prefix('.') == Some(ext)) +} + +fn count_lines(path: &Path) -> Result { + let content = fs::read_to_string(path)?; + Ok(content.lines().count()) +} + +#[derive(Debug, PartialEq, Eq)] +struct Finding { + file: String, + lines: usize, +} + +#[derive(Debug, PartialEq, Eq)] +struct CheckResult { + warnings: Vec, + violations: Vec, +} + +#[derive(Debug, PartialEq, Eq)] +enum LineStatus { + WithinLimit, + Warning, + Violation, +} + +const fn classify_line_count(line_count: usize) -> LineStatus { + if line_count > MAX_LINES { + LineStatus::Violation + } else if line_count > WARN_LINES { + LineStatus::Warning + } else { + LineStatus::WithinLimit + } +} + +fn relative_path(path: &Path, cwd: &Path) -> String { + let relative = path + .strip_prefix(cwd) + .unwrap_or(path) + .to_string_lossy() + .to_string(); + + relative.replace(std::path::MAIN_SEPARATOR, "/") +} + +fn check_directory(cwd: &Path) -> CheckResult { + let mut result = CheckResult { + warnings: Vec::new(), + violations: Vec::new(), + }; + + for entry in WalkDir::new(cwd) + .into_iter() + .filter_map(std::result::Result::ok) + .filter(|e| e.file_type().is_file()) + { + let path = entry.path(); + + if should_exclude(path) { + continue; + } + + if !has_valid_extension(path) { + continue; + } + + match count_lines(path) { + Ok(line_count) => { + let finding = Finding { + file: relative_path(path, cwd), + lines: line_count, + }; + + match classify_line_count(line_count) { + LineStatus::Violation => result.violations.push(finding), + LineStatus::Warning => result.warnings.push(finding), + LineStatus::WithinLimit => {} + } + } + Err(error) => { + eprintln!("Warning: Could not read {}: {error}", path.display()); + } + } + } + + result +} + +fn escape_annotation_property(value: &str) -> String { + value + .replace('%', "%25") + .replace('\r', "%0D") + .replace('\n', "%0A") + .replace(':', "%3A") + .replace(',', "%2C") +} + +fn escape_annotation_message(value: &str) -> String { + value + .replace('%', "%25") + .replace('\r', "%0D") + .replace('\n', "%0A") +} + +fn warning_annotation(finding: &Finding) -> String { + let message = format!( + "File has {} lines (approaching limit of {MAX_LINES}). Consider extracting code to keep at or below {WARN_LINES} lines and prevent concurrent PR merge limit violations.", + finding.lines + ); + + format!( + "::warning file={}::{}", + escape_annotation_property(&finding.file), + escape_annotation_message(&message) + ) +} + +#[cfg(not(test))] +fn print_warnings(warnings: &[Finding]) { + if warnings.is_empty() { + return; + } + + for warning in warnings { + let annotation = warning_annotation(warning); + println!("{annotation}"); + println!( + "WARNING: {} has {} lines (approaching limit of {MAX_LINES}, warning threshold: {WARN_LINES})", + warning.file, warning.lines + ); + } + + println!(); + println!( + "The following files are approaching the {MAX_LINES} line limit (>{WARN_LINES} lines):" + ); + for warning in warnings { + println!(" {}", warning.file); + } + println!("\nConsider extracting code to prevent concurrent PR merge limit violations.\n"); +} + +#[cfg(not(test))] +fn print_violations(violations: &[Finding]) { + if violations.is_empty() { + return; + } + + println!("Found files exceeding the line limit:\n"); + for violation in violations { + println!( + " {}: {} lines (exceeds {MAX_LINES})", + violation.file, violation.lines + ); + } + println!("\nPlease refactor these files to be under {MAX_LINES} lines\n"); +} + +#[cfg(not(test))] +fn main() { + println!( + "\nChecking Rust files for maximum {MAX_LINES} lines (warning above {WARN_LINES})...\n" + ); + + let cwd = std::env::current_dir().expect("Failed to get current directory"); + let result = check_directory(&cwd); + + print_warnings(&result.warnings); + + if result.violations.is_empty() { + println!("All files are within the line limit\n"); + exit(0); + } else { + print_violations(&result.violations); + exit(1); + } +} + +#[cfg(test)] +mod tests { + use super::*; + use std::fmt::Write as _; + use std::path::PathBuf; + use std::time::{SystemTime, UNIX_EPOCH}; + + fn temp_dir(name: &str) -> PathBuf { + let nanos = SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap() + .as_nanos(); + let path = std::env::temp_dir().join(format!("check-file-size-{name}-{nanos}")); + fs::create_dir_all(&path).unwrap(); + path + } + + fn write_rust_file_with_lines(path: &Path, line_count: usize) { + let mut content = String::new(); + for line in 1..=line_count { + writeln!(&mut content, "// line {line}").unwrap(); + } + fs::write(path, content).unwrap(); + } + + #[test] + fn classifies_warning_band_without_blocking() { + assert_eq!(classify_line_count(WARN_LINES), LineStatus::WithinLimit); + assert_eq!(classify_line_count(WARN_LINES + 1), LineStatus::Warning); + assert_eq!(classify_line_count(MAX_LINES), LineStatus::Warning); + } + + #[test] + fn classifies_hard_limit_violations() { + assert_eq!(classify_line_count(MAX_LINES + 1), LineStatus::Violation); + } + + #[test] + fn check_directory_reports_warning_and_violation_separately() { + let repo = temp_dir("thresholds"); + let src_dir = repo.join("src"); + fs::create_dir_all(&src_dir).unwrap(); + write_rust_file_with_lines(&src_dir.join("near_limit.rs"), WARN_LINES + 1); + write_rust_file_with_lines(&src_dir.join("over_limit.rs"), MAX_LINES + 1); + write_rust_file_with_lines(&src_dir.join("small.rs"), WARN_LINES); + + let result = check_directory(&repo); + + assert_eq!( + result.warnings, + vec![Finding { + file: "src/near_limit.rs".to_string(), + lines: WARN_LINES + 1, + }] + ); + assert_eq!( + result.violations, + vec![Finding { + file: "src/over_limit.rs".to_string(), + lines: MAX_LINES + 1, + }] + ); + } + + #[test] + fn warning_annotation_uses_github_actions_format() { + let finding = Finding { + file: "src/near_limit.rs".to_string(), + lines: WARN_LINES + 1, + }; + + assert_eq!( + warning_annotation(&finding), + "::warning file=src/near_limit.rs::File has 901 lines (approaching limit of 1000). Consider extracting code to keep at or below 900 lines and prevent concurrent PR merge limit violations." + ); + } +} diff --git a/docs/case-studies/issue-82/evidence/templates/rust/scripts/check-release-needed.rs b/docs/case-studies/issue-82/evidence/templates/rust/scripts/check-release-needed.rs new file mode 100644 index 0000000..b97c5e4 --- /dev/null +++ b/docs/case-studies/issue-82/evidence/templates/rust/scripts/check-release-needed.rs @@ -0,0 +1,395 @@ +#!/usr/bin/env rust-script +//! Check if a release is needed based on changelog fragments and version state +//! +//! This script checks: +//! 1. If there are changelog fragments to process +//! 2. If the current version has already been published to crates.io +//! 3. If the matching GitHub release and configured Docker Hub image tag exist +//! +//! IMPORTANT: This script checks external release artifacts, NOT git tags. +//! This is critical because: +//! - Git tags can exist without the package being published +//! - GitHub releases create tags but do not publish to crates.io or Docker Hub +//! - A crates.io publish can succeed while later Docker/GitHub release steps fail +//! +//! Supports both single-language and multi-language repository structures: +//! - Single-language: Cargo.toml in repository root +//! - Multi-language: Cargo.toml in rust/ subfolder +//! +//! Usage: rust-script scripts/check-release-needed.rs [--rust-root ] +//! +//! Environment variables: +//! - HAS_FRAGMENTS: 'true' if changelog fragments exist (from get-bump-type.rs) +//! - DOCKERHUB_IMAGE: Optional Docker Hub image name to verify (namespace/repository) +//! - GITHUB_REPOSITORY: GitHub repository to verify (owner/repository) +//! +//! Outputs (written to GITHUB_OUTPUT): +//! - should_release: 'true' if a release should be created +//! - skip_bump: 'true' if version bump should be skipped while missing artifacts are recreated +//! - crate_published: 'true' if the current version already exists on crates.io +//! - dockerhub_required: 'true' if Docker Hub publishing is configured and a Dockerfile exists +//! - dockerhub_published: 'true' if the configured Docker Hub tag exists +//! - github_release_published: 'true' if the matching GitHub release exists +//! - max_published_version: the highest non-yanked version on crates.io (for downstream use) +//! +//! ```cargo +//! [dependencies] +//! regex = "1" +//! ureq = "2" +//! serde = { version = "1", features = ["derive"] } +//! serde_json = "1" +//! ``` + +use serde::Deserialize; +use std::env; +use std::fs; +use std::path::Path; +use std::process::exit; + +#[path = "rust-paths.rs"] +mod rust_paths; + +fn get_arg(name: &str) -> Option { + let args: Vec = env::args().collect(); + let flag = format!("--{}", name); + + if let Some(idx) = args.iter().position(|a| a == &flag) { + return args.get(idx + 1).cloned(); + } + + let env_name = name.to_uppercase().replace('-', "_"); + env::var(&env_name).ok().filter(|s| !s.is_empty()) +} + +fn set_output(key: &str, value: &str) { + if let Ok(output_file) = env::var("GITHUB_OUTPUT") { + if let Err(e) = fs::OpenOptions::new() + .create(true) + .append(true) + .open(&output_file) + .and_then(|mut f| { + use std::io::Write; + writeln!(f, "{}={}", key, value) + }) + { + eprintln!("Warning: Could not write to GITHUB_OUTPUT: {}", e); + } + } + println!("Output: {}={}", key, value); +} + +#[derive(Deserialize)] +struct CratesIoVersion { + version: Option, +} + +#[derive(Deserialize)] +struct CratesIoVersionInfo { + #[allow(dead_code)] + num: String, +} + +#[derive(Deserialize)] +struct CratesIoCrate { + versions: Option>, +} + +#[derive(Deserialize)] +struct CratesIoVersionEntry { + num: String, + yanked: bool, +} + +fn check_version_on_crates_io(crate_name: &str, version: &str) -> bool { + let url = format!("https://crates.io/api/v1/crates/{}/{}", crate_name, version); + + match ureq::get(&url) + .set("User-Agent", "rust-script-check-release") + .call() + { + Ok(response) => { + if response.status() == 200 { + if let Ok(body) = response.into_string() { + if let Ok(data) = serde_json::from_str::(&body) { + return data.version.is_some(); + } + } + } + false + } + Err(ureq::Error::Status(404, _)) => false, + Err(e) => { + eprintln!("Warning: Could not check crates.io: {}", e); + false + } + } +} + +fn split_docker_image(image: &str) -> Option<(&str, &str)> { + let mut parts = image.split('/'); + let namespace = parts.next()?; + let repository = parts.next()?; + + if parts.next().is_some() || namespace.is_empty() || repository.is_empty() { + None + } else { + Some((namespace, repository)) + } +} + +fn check_docker_hub_tag(image: &str, version: &str) -> bool { + let Some((namespace, repository)) = split_docker_image(image) else { + eprintln!( + "Warning: Could not parse Docker Hub image '{}'; expected namespace/repository", + image + ); + return false; + }; + + let url = format!( + "https://hub.docker.com/v2/repositories/{}/{}/tags/{}", + namespace, repository, version + ); + + match ureq::get(&url) + .set("User-Agent", "rust-script-check-release") + .call() + { + Ok(response) => response.status() == 200, + Err(ureq::Error::Status(404, _)) => false, + Err(e) => { + eprintln!("Warning: Could not check Docker Hub tag: {}", e); + false + } + } +} + +fn check_github_release(repository: &str, tag_prefix: &str, version: &str) -> bool { + let url = format!( + "https://api.github.com/repos/{}/releases/tags/{}{}", + repository, tag_prefix, version + ); + + let mut request = ureq::get(&url) + .set("User-Agent", "rust-script-check-release") + .set("Accept", "application/vnd.github+json"); + + if let Ok(token) = env::var("GITHUB_TOKEN") { + if !token.is_empty() { + let auth_header = format!("Bearer {}", token); + request = request.set("Authorization", &auth_header); + } + } + + match request.call() { + Ok(response) => response.status() == 200, + Err(ureq::Error::Status(404, _)) => false, + Err(e) => { + eprintln!("Warning: Could not check GitHub release: {}", e); + false + } + } +} + +fn docker_hub_image_to_check() -> Option { + get_arg("dockerhub-image") + .or_else(|| get_arg("docker-hub-image")) + .or_else(|| get_arg("dockerhub_image")) + .filter(|image| Path::new("Dockerfile").exists() && !image.trim().is_empty()) +} + +fn release_is_complete( + crate_published: bool, + dockerhub_required: bool, + dockerhub_published: bool, + github_release_published: bool, +) -> bool { + crate_published && (!dockerhub_required || dockerhub_published) && github_release_published +} + +fn parse_semver(version: &str) -> Option<(u32, u32, u32)> { + let parts: Vec<&str> = version.split('-').next()?.split('.').collect(); + if parts.len() != 3 { + return None; + } + Some(( + parts[0].parse().ok()?, + parts[1].parse().ok()?, + parts[2].parse().ok()?, + )) +} + +fn get_max_published_version(crate_name: &str) -> Option { + let url = format!("https://crates.io/api/v1/crates/{}", crate_name); + + match ureq::get(&url) + .set("User-Agent", "rust-script-check-release") + .call() + { + Ok(response) => { + if response.status() == 200 { + if let Ok(body) = response.into_string() { + if let Ok(data) = serde_json::from_str::(&body) { + if let Some(versions) = data.versions { + let mut max_version: Option<(u32, u32, u32, String)> = None; + for v in &versions { + if v.yanked { + continue; + } + if let Some(parsed) = parse_semver(&v.num) { + match &max_version { + None => { + max_version = + Some((parsed.0, parsed.1, parsed.2, v.num.clone())); + } + Some(current) => { + if parsed > (current.0, current.1, current.2) { + max_version = Some(( + parsed.0, + parsed.1, + parsed.2, + v.num.clone(), + )); + } + } + } + } + } + return max_version.map(|v| v.3); + } + } + } + } + None + } + Err(ureq::Error::Status(404, _)) => None, + Err(e) => { + eprintln!("Warning: Could not query crates.io for versions: {}", e); + None + } + } +} + +fn main() { + let rust_root = match rust_paths::get_rust_root(None, true) { + Ok(root) => root, + Err(e) => { + eprintln!("Error: {}", e); + exit(1); + } + }; + let cargo_toml = rust_paths::get_cargo_toml_path(&rust_root); + let package_manifest = match rust_paths::get_package_manifest_path(&cargo_toml) { + Ok(path) => path, + Err(e) => { + eprintln!("Error: {}", e); + exit(1); + } + }; + + let has_fragments = env::var("HAS_FRAGMENTS") + .map(|v| v == "true") + .unwrap_or(false); + + let package_info = match rust_paths::read_package_info(&package_manifest) { + Ok(info) => info, + Err(e) => { + eprintln!("Error: {}", e); + exit(1); + } + }; + let crate_name = package_info.name; + let current_version = package_info.version; + + let max_published = get_max_published_version(&crate_name); + if let Some(ref max_ver) = max_published { + println!("Max published version on crates.io: {}", max_ver); + set_output("max_published_version", max_ver); + } else { + println!("No versions published on crates.io yet (or crate not found)"); + set_output("max_published_version", ""); + } + + if !has_fragments { + let crate_published = check_version_on_crates_io(&crate_name, ¤t_version); + let tag_prefix = get_arg("tag-prefix").unwrap_or_else(|| "v".to_string()); + let dockerhub_image = docker_hub_image_to_check(); + let dockerhub_required = dockerhub_image.is_some(); + let dockerhub_published = dockerhub_image + .as_deref() + .map(|image| { + check_docker_hub_tag(image, ¤t_version) + && check_docker_hub_tag(image, "latest") + }) + .unwrap_or(false); + let github_release_published = get_arg("repository") + .or_else(|| env::var("GITHUB_REPOSITORY").ok().filter(|s| !s.is_empty())) + .map(|repository| check_github_release(&repository, &tag_prefix, ¤t_version)) + .unwrap_or_else(|| { + eprintln!("Warning: GITHUB_REPOSITORY not set; assuming GitHub release is missing"); + false + }); + + set_output( + "crate_published", + if crate_published { "true" } else { "false" }, + ); + set_output( + "dockerhub_required", + if dockerhub_required { "true" } else { "false" }, + ); + set_output( + "dockerhub_published", + if dockerhub_published { "true" } else { "false" }, + ); + set_output( + "github_release_published", + if github_release_published { + "true" + } else { + "false" + }, + ); + + println!( + "Crate: {}, Version: {}, Published on crates.io: {}", + crate_name, current_version, crate_published + ); + if let Some(image) = dockerhub_image { + println!( + "Docker image: {}, version/latest tags published on Docker Hub: {}", + image, dockerhub_published + ); + } else { + println!("Docker Hub artifact check skipped: DOCKERHUB_IMAGE or Dockerfile is not configured"); + } + println!( + "GitHub release {}{} published: {}", + tag_prefix, current_version, github_release_published + ); + + if release_is_complete( + crate_published, + dockerhub_required, + dockerhub_published, + github_release_published, + ) { + println!( + "No changelog fragments and v{} is fully published", + current_version + ); + set_output("should_release", "false"); + } else { + println!( + "No changelog fragments but v{} is missing at least one release artifact", + current_version + ); + set_output("should_release", "true"); + set_output("skip_bump", "true"); + } + } else { + println!("Found changelog fragments, proceeding with release"); + set_output("should_release", "true"); + set_output("skip_bump", "false"); + } +} diff --git a/docs/case-studies/issue-82/evidence/templates/rust/scripts/check-version-modification.rs b/docs/case-studies/issue-82/evidence/templates/rust/scripts/check-version-modification.rs new file mode 100644 index 0000000..09ebb33 --- /dev/null +++ b/docs/case-studies/issue-82/evidence/templates/rust/scripts/check-version-modification.rs @@ -0,0 +1,163 @@ +#!/usr/bin/env rust-script +//! Check for manual version modification in Cargo.toml +//! +//! This script prevents manual version changes in pull requests. +//! Versions should be managed automatically by the CI/CD pipeline +//! using changelog fragments in changelog.d/. +//! +//! Key behavior: +//! - Detects if `version = "..."` line has changed in Cargo.toml +//! - Fails the CI check if manual version change is detected +//! - Skips check for automated release branches (changelog-manual-release-*) +//! +//! Usage: rust-script scripts/check-version-modification.rs +//! +//! Environment variables (set by GitHub Actions): +//! - GITHUB_HEAD_REF: The head branch name for PRs +//! - GITHUB_BASE_REF: The base branch name for PRs +//! - GITHUB_EVENT_NAME: Should be 'pull_request' +//! +//! Exit codes: +//! - 0: No manual version changes detected (or check skipped) +//! - 1: Manual version changes detected +//! +//! ```cargo +//! [dependencies] +//! regex = "1" +//! ``` + +use std::env; +use std::path::Path; +use std::process::{Command, exit}; +use regex::Regex; + +fn exec(command: &str, args: &[&str]) -> String { + match Command::new(command).args(args).output() { + Ok(output) => { + String::from_utf8_lossy(&output.stdout).trim().to_string() + } + Err(_) => String::new(), + } +} + +fn exec_ignore_error(command: &str, args: &[&str]) { + let _ = Command::new(command) + .args(args) + .stdout(std::process::Stdio::null()) + .stderr(std::process::Stdio::null()) + .status(); +} + +fn should_skip_version_check() -> bool { + let head_ref = env::var("GITHUB_HEAD_REF").unwrap_or_default(); + + // Skip for automated release PRs + let automated_branch_prefixes = [ + "changelog-manual-release-", + "changeset-release/", + "release/", + "automated-release/", + ]; + + for prefix in &automated_branch_prefixes { + if head_ref.starts_with(prefix) { + println!("Skipping version check for automated branch: {}", head_ref); + return true; + } + } + + false +} + +fn get_rust_root() -> String { + if let Ok(root) = env::var("RUST_ROOT") { + if !root.is_empty() { + return root; + } + } + + if Path::new("./Cargo.toml").exists() { + return ".".to_string(); + } + + if Path::new("./rust/Cargo.toml").exists() { + return "rust".to_string(); + } + + ".".to_string() +} + +fn get_cargo_toml_path(rust_root: &str) -> String { + if rust_root == "." { + "Cargo.toml".to_string() + } else { + format!("{}/Cargo.toml", rust_root) + } +} + +fn get_cargo_toml_diff(cargo_toml_path: &str) -> String { + let base_ref = env::var("GITHUB_BASE_REF").unwrap_or_else(|_| "main".to_string()); + + // Ensure we have the base branch + exec_ignore_error("git", &["fetch", "origin", &base_ref, "--depth=1"]); + + // Get the diff for Cargo.toml + exec( + "git", + &["diff", &format!("origin/{}...HEAD", base_ref), "--", cargo_toml_path], + ) +} + +fn has_version_change(diff: &str) -> bool { + if diff.is_empty() { + return false; + } + + // Look for changes to the version line + // Match lines that start with + or - followed by version = "..." + let version_change_pattern = Regex::new(r#"(?m)^[+-]version\s*=\s*""#).unwrap(); + version_change_pattern.is_match(diff) +} + +fn main() { + println!("Checking for manual version modifications in Cargo.toml...\n"); + + // Only run on pull requests + let event_name = env::var("GITHUB_EVENT_NAME").unwrap_or_default(); + if event_name != "pull_request" { + println!("Skipping: Not a pull request event (event: {})", event_name); + exit(0); + } + + // Skip for automated release branches + if should_skip_version_check() { + exit(0); + } + + // Get and check the diff + let rust_root = get_rust_root(); + let cargo_toml_path = get_cargo_toml_path(&rust_root); + let diff = get_cargo_toml_diff(&cargo_toml_path); + + if diff.is_empty() { + println!("No changes to Cargo.toml detected."); + println!("Version check passed."); + exit(0); + } + + // Check for version changes + if has_version_change(&diff) { + eprintln!("Error: Manual version change detected in Cargo.toml!\n"); + eprintln!("Versions are managed automatically by the CI/CD pipeline."); + eprintln!("Please do not modify the version field directly.\n"); + eprintln!("To trigger a release, add a changelog fragment to changelog.d/"); + eprintln!("with the appropriate bump type (major, minor, or patch).\n"); + eprintln!("See changelog.d/README.md for more information.\n"); + eprintln!("If you need to undo your version change, run:"); + eprintln!(" git checkout origin/main -- Cargo.toml"); + exit(1); + } + + println!("Cargo.toml was modified but version field was not changed."); + println!("Version check passed."); +} diff --git a/docs/case-studies/issue-82/evidence/templates/rust/scripts/collect-changelog.rs b/docs/case-studies/issue-82/evidence/templates/rust/scripts/collect-changelog.rs new file mode 100644 index 0000000..63b7d8c --- /dev/null +++ b/docs/case-studies/issue-82/evidence/templates/rust/scripts/collect-changelog.rs @@ -0,0 +1,234 @@ +#!/usr/bin/env rust-script +//! Collect changelog fragments into CHANGELOG.md +//! +//! This script collects all .md files from changelog.d/ (except README.md) +//! and prepends them to CHANGELOG.md, then removes the processed fragments. +//! +//! Supports both single-language and multi-language repository structures: +//! - Single-language: Cargo.toml and changelog.d/ in repository root +//! - Multi-language: Cargo.toml and changelog.d/ in rust/ subfolder +//! +//! Usage: rust-script scripts/collect-changelog.rs [--rust-root ] +//! +//! ```cargo +//! [dependencies] +//! regex = "1" +//! chrono = "0.4" +//! ``` + +use std::env; +use std::fs; +use std::path::Path; +use std::process::exit; +use chrono::Utc; +use regex::Regex; + +const INSERT_MARKER: &str = ""; + +fn get_arg(name: &str) -> Option { + let args: Vec = env::args().collect(); + let flag = format!("--{}", name); + + if let Some(idx) = args.iter().position(|a| a == &flag) { + return args.get(idx + 1).cloned(); + } + + let env_name = name.to_uppercase().replace('-', "_"); + env::var(&env_name).ok().filter(|s| !s.is_empty()) +} + +fn get_rust_root() -> String { + if let Some(root) = get_arg("rust-root") { + eprintln!("Using explicitly configured Rust root: {}", root); + return root; + } + + if Path::new("./Cargo.toml").exists() { + eprintln!("Detected single-language repository (Cargo.toml in root)"); + return ".".to_string(); + } + + if Path::new("./rust/Cargo.toml").exists() { + eprintln!("Detected multi-language repository (Cargo.toml in rust/)"); + return "rust".to_string(); + } + + eprintln!("Error: Could not find Cargo.toml in expected locations"); + exit(1); +} + +fn get_cargo_toml_path(rust_root: &str) -> String { + if rust_root == "." { + "./Cargo.toml".to_string() + } else { + format!("{}/Cargo.toml", rust_root) + } +} + +fn get_changelog_dir(rust_root: &str) -> String { + if rust_root == "." { + "./changelog.d".to_string() + } else { + format!("{}/changelog.d", rust_root) + } +} + +fn get_changelog_path(rust_root: &str) -> String { + if rust_root == "." { + "./CHANGELOG.md".to_string() + } else { + format!("{}/CHANGELOG.md", rust_root) + } +} + +fn get_version_from_cargo(cargo_toml_path: &str) -> Result { + let content = fs::read_to_string(cargo_toml_path) + .map_err(|e| format!("Failed to read {}: {}", cargo_toml_path, e))?; + + let re = Regex::new(r#"(?m)^version\s*=\s*"([^"]+)""#).unwrap(); + + if let Some(caps) = re.captures(&content) { + Ok(caps.get(1).unwrap().as_str().to_string()) + } else { + Err(format!("Could not find version in {}", cargo_toml_path)) + } +} + +fn strip_frontmatter(content: &str) -> String { + let re = Regex::new(r"(?s)^---\s*\n.*?\n---\s*\n(.*)$").unwrap(); + if let Some(caps) = re.captures(content) { + caps.get(1).unwrap().as_str().trim().to_string() + } else { + content.trim().to_string() + } +} + +fn collect_fragments(changelog_dir: &str) -> String { + let dir_path = Path::new(changelog_dir); + if !dir_path.exists() { + return String::new(); + } + + let mut files: Vec<_> = match fs::read_dir(dir_path) { + Ok(entries) => entries + .filter_map(|e| e.ok()) + .map(|e| e.path()) + .filter(|p| { + p.extension().map_or(false, |ext| ext == "md") + && p.file_name().map_or(false, |name| name != "README.md") + }) + .collect(), + Err(_) => return String::new(), + }; + + files.sort(); + + let mut fragments = Vec::new(); + for file in &files { + if let Ok(raw_content) = fs::read_to_string(file) { + let content = strip_frontmatter(&raw_content); + if !content.is_empty() { + fragments.push(content); + } + } + } + + fragments.join("\n\n") +} + +fn update_changelog(changelog_file: &str, version: &str, fragments: &str) { + let date_str = Utc::now().format("%Y-%m-%d").to_string(); + let new_entry = format!("\n## [{}] - {}\n\n{}\n", version, date_str, fragments); + + if Path::new(changelog_file).exists() { + let mut content = fs::read_to_string(changelog_file).unwrap_or_default(); + + if content.contains(INSERT_MARKER) { + content = content.replace(INSERT_MARKER, &format!("{}{}", INSERT_MARKER, new_entry)); + } else { + // Insert after the first ## heading + let lines: Vec<&str> = content.lines().collect(); + let mut insert_index = None; + + for (i, line) in lines.iter().enumerate() { + if line.starts_with("## [") { + insert_index = Some(i); + break; + } + } + + if let Some(idx) = insert_index { + let mut new_lines: Vec = lines[..idx].iter().map(|s| s.to_string()).collect(); + new_lines.push(new_entry.clone()); + new_lines.extend(lines[idx..].iter().map(|s| s.to_string())); + content = new_lines.join("\n"); + } else { + // Append after the main heading + content.push_str(&new_entry); + } + } + + fs::write(changelog_file, content).expect("Failed to write changelog"); + } else { + let content = format!( + "# Changelog\n\n\ + All notable changes to this project will be documented in this file.\n\n\ + The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),\n\ + and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).\n\n\ + {}\n{}\n", + INSERT_MARKER, new_entry + ); + fs::write(changelog_file, content).expect("Failed to write changelog"); + } + + println!("Updated CHANGELOG.md with version {}", version); +} + +fn remove_fragments(changelog_dir: &str) { + let dir_path = Path::new(changelog_dir); + if !dir_path.exists() { + return; + } + + if let Ok(entries) = fs::read_dir(dir_path) { + for entry in entries.filter_map(|e| e.ok()) { + let path = entry.path(); + if path.extension().map_or(false, |ext| ext == "md") + && path.file_name().map_or(false, |name| name != "README.md") + { + if fs::remove_file(&path).is_ok() { + println!("Removed {}", path.display()); + } + } + } + } +} + +fn main() { + let rust_root = get_rust_root(); + let cargo_toml = get_cargo_toml_path(&rust_root); + let changelog_dir = get_changelog_dir(&rust_root); + let changelog_file = get_changelog_path(&rust_root); + + let version = match get_version_from_cargo(&cargo_toml) { + Ok(v) => v, + Err(e) => { + eprintln!("Error: {}", e); + exit(1); + } + }; + + println!("Collecting changelog fragments for version {}", version); + + let fragments = collect_fragments(&changelog_dir); + + if fragments.is_empty() { + println!("No changelog fragments found"); + exit(0); + } + + update_changelog(&changelog_file, &version, &fragments); + remove_fragments(&changelog_dir); + + println!("Changelog collection complete"); +} diff --git a/docs/case-studies/issue-82/evidence/templates/rust/scripts/create-changelog-fragment.rs b/docs/case-studies/issue-82/evidence/templates/rust/scripts/create-changelog-fragment.rs new file mode 100644 index 0000000..08e145b --- /dev/null +++ b/docs/case-studies/issue-82/evidence/templates/rust/scripts/create-changelog-fragment.rs @@ -0,0 +1,119 @@ +#!/usr/bin/env rust-script +//! Create a changelog fragment for manual release PR +//! +//! This script creates a changelog fragment with the appropriate +//! category based on the bump type. +//! +//! Usage: rust-script scripts/create-changelog-fragment.rs --bump-type [--description ] +//! +//! ```cargo +//! [dependencies] +//! chrono = "0.4" +//! ``` + +use std::env; +use std::fs; +use std::path::Path; +use std::process::exit; +use chrono::Utc; + +fn get_arg(name: &str) -> Option { + let args: Vec = env::args().collect(); + let flag = format!("--{}", name); + + if let Some(idx) = args.iter().position(|a| a == &flag) { + return args.get(idx + 1).cloned(); + } + + let env_name = name.to_uppercase().replace('-', "_"); + env::var(&env_name).ok().filter(|s| !s.is_empty()) +} + +fn get_rust_root() -> String { + if let Some(root) = get_arg("rust-root") { + return root; + } + + if let Ok(root) = env::var("RUST_ROOT") { + if !root.is_empty() { + return root; + } + } + + if Path::new("./Cargo.toml").exists() { + return ".".to_string(); + } + + if Path::new("./rust/Cargo.toml").exists() { + return "rust".to_string(); + } + + ".".to_string() +} + +fn get_changelog_dir(rust_root: &str) -> String { + if rust_root == "." { + "changelog.d".to_string() + } else { + format!("{}/changelog.d", rust_root) + } +} + +fn get_category(bump_type: &str) -> &'static str { + match bump_type { + "major" => "### Breaking Changes", + "minor" => "### Added", + "patch" => "### Fixed", + _ => "### Changed", + } +} + +fn generate_timestamp() -> String { + Utc::now().format("%Y%m%d%H%M%S").to_string() +} + +fn main() { + let bump_type = get_arg("bump-type").unwrap_or_else(|| "patch".to_string()); + let description = get_arg("description"); + + // Validate bump type + if !["major", "minor", "patch"].contains(&bump_type.as_str()) { + eprintln!("Invalid bump type: {}. Must be major, minor, or patch.", bump_type); + exit(1); + } + + let rust_root = get_rust_root(); + let changelog_dir = get_changelog_dir(&rust_root); + let timestamp = generate_timestamp(); + let fragment_file = format!("{}/{}-manual-{}.md", changelog_dir, timestamp, bump_type); + + // Determine changelog category based on bump type + let category = get_category(&bump_type); + + // Create changelog fragment with frontmatter + let description_text = description.unwrap_or_else(|| format!("Manual {} release", bump_type)); + let fragment_content = format!( + "---\nbump: {}\n---\n\n{}\n\n- {}\n", + bump_type, category, description_text + ); + + // Ensure changelog directory exists + let dir_path = Path::new(&changelog_dir); + if !dir_path.exists() { + if let Err(e) = fs::create_dir_all(dir_path) { + eprintln!("Error creating directory {}: {}", changelog_dir, e); + exit(1); + } + } + + // Write the fragment file + if let Err(e) = fs::write(&fragment_file, &fragment_content) { + eprintln!("Error writing fragment file: {}", e); + exit(1); + } + + println!("Created changelog fragment: {}", fragment_file); + println!(); + println!("Content:"); + println!("{}", fragment_content); +} diff --git a/docs/case-studies/issue-82/evidence/templates/rust/scripts/create-github-release.rs b/docs/case-studies/issue-82/evidence/templates/rust/scripts/create-github-release.rs new file mode 100644 index 0000000..2a914a0 --- /dev/null +++ b/docs/case-studies/issue-82/evidence/templates/rust/scripts/create-github-release.rs @@ -0,0 +1,413 @@ +#!/usr/bin/env rust-script +//! Create GitHub Release from CHANGELOG.md +//! +//! Automatically includes crates.io and docs.rs badges in release notes +//! when the crate name can be detected from Cargo.toml. +//! +//! Usage: rust-script scripts/create-github-release.rs --release-version --repository [--tag-prefix ] [--language ] [--release-label