diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 0fb98e2c..3ccafd84 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,48 +1,42 @@ # SPDX-License-Identifier: MPL-2.0 -# Dependabot configuration for RSR-compliant repositories -# Covers common ecosystems - remove unused ones for your project - +# Dependabot v2 configuration for boj-server. +# Scoped strictly to directories that actually hold standalone manifests/lockfiles: +# - / -> GitHub Actions (.github/workflows/*.yml) + root JS package.json +# - /elixir -> Mix (elixir/mix.exs + elixir/mix.lock) +# - /coord-tui -> Cargo (coord-tui/Cargo.toml + coord-tui/Cargo.lock) +# Note: /tray is intentionally omitted because tray/Cargo.toml references the +# external sibling path `../../gossamer/bindings/rust`, which cannot resolve in +# Dependabot's repository-only checkout. version: 2 updates: - # GitHub Actions - always include - package-ecosystem: "github-actions" directory: "/" schedule: - interval: "daily" + interval: "weekly" + day: "monday" + open-pull-requests-limit: 5 groups: actions: patterns: - "*" - # Rust/Cargo - - package-ecosystem: "cargo" - directory: "/" - schedule: - interval: "daily" - ignore: - - dependency-name: "*" - update-types: ["version-update:semver-patch"] - - # Elixir/Mix - - package-ecosystem: "mix" - directory: "/" - schedule: - interval: "daily" - - # Node.js/npm - package-ecosystem: "npm" directory: "/" schedule: - interval: "daily" + interval: "weekly" + day: "monday" + open-pull-requests-limit: 5 - # Python/pip - - package-ecosystem: "pip" - directory: "/" + - package-ecosystem: "mix" + directory: "/elixir" schedule: - interval: "daily" + interval: "weekly" + day: "monday" + open-pull-requests-limit: 5 - # Guix flakes - - package-ecosystem: "guix" - directory: "/" + - package-ecosystem: "cargo" + directory: "/coord-tui" schedule: - interval: "daily" + interval: "weekly" + day: "monday" + open-pull-requests-limit: 5 diff --git a/.github/workflows/abi-drift.yml b/.github/workflows/abi-drift.yml index 075a9c6c..cd41cc92 100644 --- a/.github/workflows/abi-drift.yml +++ b/.github/workflows/abi-drift.yml @@ -47,7 +47,7 @@ jobs: outputs: run: ${{ steps.detect.outputs.run }} steps: - - uses: actions/checkout@v6.0.2 + - uses: actions/checkout@v7.0.1 with: fetch-depth: 0 - id: detect @@ -72,7 +72,7 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 15 steps: - - uses: actions/checkout@v6.0.2 + - uses: actions/checkout@v7.0.1 with: # Need at least two commits so `git diff origin/...HEAD` # can compute the changed-cartridge set on pull_request events. @@ -92,7 +92,7 @@ jobs: # GADT-skip fix (iseriser#20, merged 2026-05-20) never reached CI. # Bumping ISERISER_REV invalidates the cache and forces a rebuild. - name: Cache cargo bin (iseriser install) - uses: actions/cache@v4.2.2 + uses: actions/cache@v6.1.0 env: ISERISER_REV: 741a3b63e7619b6e9cfe7f91b04d7ccfb130b1ca with: diff --git a/.github/workflows/actions.lock b/.github/workflows/actions.lock index 739b3185..d33a9330 100644 --- a/.github/workflows/actions.lock +++ b/.github/workflows/actions.lock @@ -1,267 +1,294 @@ # This file is machine-generated by `gh actions-lock`. # Do not edit by hand; run `gh actions-lock` to update. # Docs: https://gh.io/actions-lockfile -version: 'v0.0.2' +version: 'v0.0.3' workflows: '.github/workflows/abi-drift.yml': - - 'actions/cache@v4.2.2' - - 'actions/checkout@v6.0.2' + - 'actions/cache@v6.1.0' + - 'actions/checkout@v7.0.1' - 'dtolnay/rust-toolchain@v1' '.github/workflows/backend-assurance.yml': - - 'actions/cache@v4.2.2' - - 'actions/checkout@v6.0.2' - - 'erlef/setup-beam@v1.24.0' + - 'actions/cache@v6.1.0' + - 'actions/checkout@v7.0.1' + - 'erlef/setup-beam@v1.24.1' '.github/workflows/build.yml': - - 'actions/checkout@v4.3.1' - - 'sonarsource/sonarqube-scan-action@v8.1.0' + - 'actions/checkout@v7.0.1' + - 'sonarsource/sonarqube-scan-action@v8.3.0' '.github/workflows/codeql.yml': - - 'actions/checkout@v6.0.2' - - 'github/codeql-action@v4.34.0' + - 'actions/checkout@v7.0.1' + - 'github/codeql-action@v4.39.0' '.github/workflows/container-publish.yml': - - 'actions/attest-build-provenance@v2.4.0' - - 'actions/checkout@v6.0.2' + - 'actions/attest-build-provenance@v4.2.2' + - 'actions/checkout@v7.0.1' '.github/workflows/dogfood-gate.yml': - - 'actions/checkout@v6.0.2' + - 'actions/checkout@v7.0.1' + - 'denoland/setup-deno@v2.0.5' '.github/workflows/e2e.yml': - - 'actions/checkout@v6.0.2' - - 'actions/github-script@v8.0.0' - - 'actions/setup-node@v4.4.0' - - 'actions/upload-artifact@v4.6.2' - - 'denoland/setup-deno@v2.0.4' - - 'erlef/setup-beam@v1.24.0' + - 'actions/checkout@v7.0.1' + - 'actions/github-script@v9.0.0' + - 'actions/setup-node@v7.1.0' + - 'actions/upload-artifact@v7.0.2' + - 'denoland/setup-deno@v2.0.5' + - 'erlef/setup-beam@v1.24.1' - 'mlugg/setup-zig@v2.2.1' - 'oven-sh/setup-bun@v2.2.0' '.github/workflows/fuzz.yml': - - 'actions/checkout@v6.0.2' + - 'actions/checkout@v7.0.1' - 'mlugg/setup-zig@v2.2.1' - '.github/workflows/governance.yml': [] + '.github/workflows/governance.yml': + - 'actions/checkout@v7.0.1' '.github/workflows/hcg-surface-drift.yml': - - 'actions/checkout@v6.0.2' + - 'actions/checkout@v7.0.1' '.github/workflows/hypatia-scan.yml': - - 'actions/checkout@v6.0.2' - - 'actions/github-script@v8.0.0' - - 'actions/upload-artifact@v4.6.2' - - 'erlef/setup-beam@v1.24.0' - - 'github/codeql-action@v4.32.6' + - 'actions/checkout@v7.0.1' + - 'actions/github-script@v9.0.0' + - 'actions/upload-artifact@v7.0.2' + - 'erlef/setup-beam@v1.24.1' + - 'github/codeql-action@v4.39.0' '.github/workflows/instant-sync.yml': - - 'peter-evans/repository-dispatch@v3.0.0' + - 'peter-evans/repository-dispatch@v4.0.1' '.github/workflows/label-triage.yml': [] '.github/workflows/labels.yml': [] '.github/workflows/lsp-dap-bsp.yml': - - 'actions/checkout@v6.0.2' + - 'actions/checkout@v7.0.1' - 'mlugg/setup-zig@v2.2.1' - '.github/workflows/mirror.yml': [] + '.github/workflows/mirror.yml': + - 'hyperpolymath/standards@e16a23170fa378bf3b1444c3ee94100413ae3ff7' '.github/workflows/pages-deploy.yml': - - 'actions/checkout@v4.4.0' + - 'actions/checkout@v7.0.1' '.github/workflows/pages.yml': - - 'actions/checkout@v4.4.0' - - 'actions/deploy-pages@v4.0.5' - - 'actions/upload-pages-artifact@v3.0.1' + - 'actions/checkout@v7.0.1' + - 'actions/deploy-pages@v5.0.1' + - 'actions/upload-pages-artifact@v5.0.0' '.github/workflows/proofs.yml': - - 'actions/cache@v4.2.2' - - 'actions/checkout@v6.0.2' + - 'actions/cache@v6.1.0' + - 'actions/checkout@v7.0.1' '.github/workflows/publish.yml': - - 'actions/checkout@v6.0.2' - - 'denoland/setup-deno@v2.0.4' + - 'actions/checkout@v7.0.1' + - 'denoland/setup-deno@v2.0.5' - 'oven-sh/setup-bun@v2.2.0' '.github/workflows/push-email-notify.yml': - - 'hyperpolymath/smtp-notify-action@v0.2.0' - '.github/workflows/readme-derive.yml': [] + - 'hyperpolymath/smtp-notify-action@v0.5.0' + '.github/workflows/readme-derive.yml': + - 'actions/checkout@v7.0.1' '.github/workflows/release.yml': - - 'actions/checkout@v6.0.2' - - 'actions/download-artifact@v4.2.1' - - 'actions/upload-artifact@v4.6.2' + - 'actions/checkout@v7.0.1' + - 'actions/download-artifact@v8.0.2' + - 'actions/upload-artifact@v7.0.2' - 'mlugg/setup-zig@v2.2.1' - - 'softprops/action-gh-release@v2.6.2' - '.github/workflows/scorecard.yml': [] - '.github/workflows/secret-scanner.yml': [] + - 'slsa-framework/slsa-github-generator@f7dd8c54c2067bafc12ca7a55595d5ee9b75204a' + - 'softprops/action-gh-release@v3.0.3' + '.github/workflows/scorecard.yml': + - 'hyperpolymath/standards@e16a23170fa378bf3b1444c3ee94100413ae3ff7' + '.github/workflows/secret-scanner.yml': + - 'actions/checkout@v7.0.1' '.github/workflows/truthfulness.yml': - - 'actions/checkout@v6.0.2' + - 'actions/checkout@v7.0.1' - 'mlugg/setup-zig@v2.2.1' '.github/workflows/zig-test.yml': - - 'actions/checkout@v6.0.2' + - 'actions/checkout@v7.0.1' - 'mlugg/setup-zig@v2.2.1' dependencies: - 'actions/attest-build-provenance@1176ef556905f349f669722abf30bce1a6e16e01': - ref: 'predicate@1.1.5' - commit: 'sha1-1176ef556905f349f669722abf30bce1a6e16e01' - owner_id: 44036562 - repo_id: 760702757 - 'actions/attest-build-provenance@v2.4.0': - ref: 'v2.4.0' - commit: 'sha1-e8998f949152b193b063cb0ec769d69d929409be' + 'actions/attest-build-provenance@v4.2.2': + ref: 'v4.2.2' + commit: 'sha1-4d101475d8b20a2381f78447822ac1eab6504dd8' owner_id: 44036562 repo_id: 760702757 uses: - - 'actions/attest-build-provenance@1176ef556905f349f669722abf30bce1a6e16e01' - - 'actions/attest@ce27ba3b4a9a139d9a20a4a07d69fabb52f1e5bc' - 'actions/attest@ce27ba3b4a9a139d9a20a4a07d69fabb52f1e5bc': - ref: 'v2.4.0' - commit: 'sha1-ce27ba3b4a9a139d9a20a4a07d69fabb52f1e5bc' + - 'actions/attest@508db95dd578ae2727ebd6217d5ba78e4fbda05d' + 'actions/attest@508db95dd578ae2727ebd6217d5ba78e4fbda05d': + ref: 'v4.2.1' + commit: 'sha1-508db95dd578ae2727ebd6217d5ba78e4fbda05d' owner_id: 44036562 repo_id: 760701061 - 'actions/cache@v4.2.2': - ref: 'v4.2.2' - commit: 'sha1-d4323d4df104b026a6aa633fdb11d772146be0bf' + 'actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9': + ref: 'v6.1.0' + commit: 'sha1-55cc8345863c7cc4c66a329aec7e433d2d1c52a9' owner_id: 44036562 repo_id: 215566462 - 'actions/checkout@v4.3.1': - ref: 'v4.3.1' - commit: 'sha1-34e114876b0b11c390a56381ad16ebd13914f8d5' + 'actions/cache@v6.1.0': + ref: 'v6.1.0' + commit: 'sha1-55cc8345863c7cc4c66a329aec7e433d2d1c52a9' owner_id: 44036562 - repo_id: 197814629 - 'actions/checkout@v4.4.0': - ref: 'v4.4.0' - commit: 'sha1-11d5960a326750d5838078e36cf38b85af677262' + repo_id: 215566462 + 'actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1': + ref: 'v7.0.1' + commit: 'sha1-3d3c42e5aac5ba805825da76410c181273ba90b1' owner_id: 44036562 repo_id: 197814629 - 'actions/checkout@v6.0.2': - ref: 'v6.0.2' - commit: 'sha1-de0fac2e4500dabe0009e67214ff5f5447ce83dd' + 'actions/checkout@v7.0.1': + ref: 'v7.0.1' + commit: 'sha1-3d3c42e5aac5ba805825da76410c181273ba90b1' owner_id: 44036562 repo_id: 197814629 - 'actions/deploy-pages@v4.0.5': - ref: 'v4.0.5' - commit: 'sha1-d6db90164ac5ed86f2b6aed7e0febac5b3c0c03e' + 'actions/deploy-pages@v5.0.1': + ref: 'v5.0.1' + commit: 'sha1-368f82528645a54fb793d4d04e342629a3f51346' owner_id: 44036562 repo_id: 438112499 - 'actions/download-artifact@v4.2.1': - ref: 'v4.2.1' - commit: 'sha1-95815c38cf2ff2164869cbab79da8d1f422bc89e' + 'actions/download-artifact@v8.0.2': + ref: 'v8.0.2' + commit: 'sha1-9000827ccba6bdab643e8b6fd33ac0654aef8333' owner_id: 44036562 repo_id: 192626254 - 'actions/github-script@v8.0.0': - ref: 'v8.0.0' - commit: 'sha1-ed597411d8f924073f98dfc5c65a23a2325f34cd' + 'actions/github-script@v9.0.0': + ref: 'v9.0.0' + commit: 'sha1-3a2844b7e9c422d3c10d287c895573f7108da1b3' owner_id: 44036562 repo_id: 205262760 - 'actions/setup-node@v4.4.0': - ref: 'v4.4.0' - commit: 'sha1-49933ea5288caeca8642d1e84afbd3f7d6820020' + 'actions/setup-node@v7.1.0': + ref: 'v7.1.0' + commit: 'sha1-949feb2413d6458794dcd2491c4babbbce0c15c1' owner_id: 44036562 repo_id: 189476904 - 'actions/upload-artifact@v4': - ref: 'v4' - commit: 'sha1-ea165f8d65b6e75b540449e92b4886f43607fa02' + 'actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08': + ref: 'v4.6.0' + commit: 'sha1-65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08' + owner_id: 44036562 + repo_id: 192625955 + 'actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f': + ref: 'v7.0.0' + commit: 'sha1-bbbca2ddaa5d8feaa63e36b76fdaad77386f024f' + owner_id: 44036562 + repo_id: 192625955 + 'actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9': + ref: 'v7.0.2' + commit: 'sha1-cf430e030ddbb5b0abf93d22962f4752f3646cd9' owner_id: 44036562 repo_id: 192625955 - 'actions/upload-artifact@v4.6.2': - ref: 'v4.6.2' - commit: 'sha1-ea165f8d65b6e75b540449e92b4886f43607fa02' + 'actions/upload-artifact@v7.0.2': + ref: 'v7.0.2' + commit: 'sha1-cf430e030ddbb5b0abf93d22962f4752f3646cd9' owner_id: 44036562 repo_id: 192625955 - 'actions/upload-pages-artifact@v3.0.1': - ref: 'v3.0.1' - commit: 'sha1-56afc609e74202658d3ffba0e8f6dda462b719fa' + 'actions/upload-pages-artifact@v5.0.0': + ref: 'v5.0.0' + commit: 'sha1-fc324d3547104276b827a68afc52ff2a11cc49c9' owner_id: 44036562 repo_id: 496012378 uses: - - 'actions/upload-artifact@v4' - 'denoland/setup-deno@v2.0.4': - ref: 'v2.0.4' - commit: 'sha1-667a34cdef165d8d2b2e98dde39547c9daac7282' + - 'actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f' + 'denoland/setup-deno@22d081ff2d3a40755e97629de92e3bcbfa7cf2ed': + ref: 'v2.0.5' + commit: 'sha1-22d081ff2d3a40755e97629de92e3bcbfa7cf2ed' + owner_id: 42048915 + repo_id: 356423100 + 'denoland/setup-deno@v2.0.5': + ref: 'v2.0.5' + commit: 'sha1-22d081ff2d3a40755e97629de92e3bcbfa7cf2ed' owner_id: 42048915 repo_id: 356423100 + 'dtolnay/rust-toolchain@683b588c487a69d01f6c6ddf40f036ff682cc2c8': + ref: 'v1' + commit: 'sha1-683b588c487a69d01f6c6ddf40f036ff682cc2c8' + owner_id: 1940490 + repo_id: 260749683 'dtolnay/rust-toolchain@v1': ref: 'v1' commit: 'sha1-02cb101ec7c40f2c49e1d9714d64511d8e1b74de' owner_id: 1940490 repo_id: 260749683 - 'erlef/setup-beam@v1.24.0': - ref: 'v1.24.0' - commit: 'sha1-fc68ffb90438ef2936bbb3251622353b3dcb2f93' + 'editorconfig-checker/action-editorconfig-checker@51f63319f592f97930c73d9c46184d20bd206393': + ref: 'v3.0.0' + commit: 'sha1-51f63319f592f97930c73d9c46184d20bd206393' + owner_id: 26415196 + repo_id: 297874902 + 'erlef/setup-beam@54075bcc5e249e4758d363f27d099f55d843f124': + ref: 'v1.24.1' + commit: 'sha1-54075bcc5e249e4758d363f27d099f55d843f124' + owner_id: 47606891 + repo_id: 331103973 + 'erlef/setup-beam@v1.24.1': + ref: 'v1.24.1' + commit: 'sha1-54075bcc5e249e4758d363f27d099f55d843f124' owner_id: 47606891 repo_id: 331103973 - 'github/codeql-action@v4.32.6': - ref: 'v4.32.6' - commit: 'sha1-0d579ffd059c29b07949a3cce3983f0780820c98' + 'github/codeql-action@b96794f015dfd88f77b49b1c93e0fa7110f94c63': + ref: 'v4.38.0' + commit: 'sha1-b96794f015dfd88f77b49b1c93e0fa7110f94c63' owner_id: 9919 repo_id: 259445878 - 'github/codeql-action@v4.34.0': - ref: 'v4.34.0' - commit: 'sha1-c6f931105cb2c34c8f901cc885ba1e2e259cf745' + 'github/codeql-action@v4.39.0': + ref: 'v4.39.0' + commit: 'sha1-6f2ac81f5cd81fe351a197ba0b00d91d03cd2aee' owner_id: 9919 repo_id: 259445878 - 'hyperpolymath/smtp-notify-action@v0.2.0': - ref: 'v0.2.0' - commit: 'sha1-ede1191ef6ff3ac02c4f4d9efdf837ee517e11d7' + 'hyperpolymath/smtp-notify-action@v0.5.0': + ref: 'v0.5.0' + commit: 'sha1-c1c9fa07992a02c1fd3d67a0dc1b08cccb852aef' owner_id: 6759885 repo_id: 1352485172 + 'hyperpolymath/standards@e16a23170fa378bf3b1444c3ee94100413ae3ff7': + ref: 'e16a23170fa378bf3b1444c3ee94100413ae3ff7' + commit: 'sha1-e16a23170fa378bf3b1444c3ee94100413ae3ff7' + owner_id: 6759885 + repo_id: 1116521501 + uses: + - 'actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9' + - 'actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1' + - 'actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9' + - 'denoland/setup-deno@22d081ff2d3a40755e97629de92e3bcbfa7cf2ed' + - 'dtolnay/rust-toolchain@683b588c487a69d01f6c6ddf40f036ff682cc2c8' + - 'editorconfig-checker/action-editorconfig-checker@51f63319f592f97930c73d9c46184d20bd206393' + - 'erlef/setup-beam@54075bcc5e249e4758d363f27d099f55d843f124' + - 'github/codeql-action@b96794f015dfd88f77b49b1c93e0fa7110f94c63' + - 'ossf/scorecard-action@fa7117db83c52d787ae5a89f350999701505d78e' + - 'oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6' + - 'webfactory/ssh-agent@e83874834305fe9a4a2997156cb26c5de65a8555' 'mlugg/setup-zig@v2.2.1': ref: 'v2.2.1' commit: 'sha1-d1434d08867e3ee9daa34448df10607b98908d29' owner_id: 7289241 repo_id: 812112570 + 'ossf/scorecard-action@fa7117db83c52d787ae5a89f350999701505d78e': + ref: 'v2.5.0' + commit: 'sha1-fa7117db83c52d787ae5a89f350999701505d78e' + owner_id: 67707773 + repo_id: 421101922 + 'oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6': + ref: 'v2.2.0' + commit: 'sha1-0c5077e51419868618aeaa5fe8019c62421857d6' + owner_id: 108928776 + repo_id: 512644635 'oven-sh/setup-bun@v2.2.0': ref: 'v2.2.0' commit: 'sha1-0c5077e51419868618aeaa5fe8019c62421857d6' owner_id: 108928776 repo_id: 512644635 - 'peter-evans/repository-dispatch@v3.0.0': - ref: 'v3.0.0' - commit: 'sha1-ff45666b9427631e3450c54a1bcbee4d9ff4d7c0' + 'peter-evans/repository-dispatch@v4.0.1': + ref: 'v4.0.1' + commit: 'sha1-28959ce8df70de7be546dd1250a005dd32156697' owner_id: 18365890 repo_id: 220359305 - 'softprops/action-gh-release@v2.6.2': - ref: 'v2.6.2' - commit: 'sha1-3bb12739c298aeb8a4eeaf626c5b8d85266b0e65' - owner_id: 2242 - repo_id: 204253808 - 'sonarsource/sonarqube-scan-action@v8.1.0': - ref: 'v8.1.0' - commit: 'sha1-7006c4492b2e0ee0f816d36501671557c97f5995' - owner_id: 545988 - repo_id: 366408409 - 'actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9': - ref: 'v6.1.0' - commit: 'sha1-55cc8345863c7cc4c66a329aec7e433d2d1c52a9' - owner_id: 44036562 - repo_id: 215566462 - 'actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1': - ref: 'v7.0.1' - commit: 'sha1-3d3c42e5aac5ba805825da76410c181273ba90b1' - owner_id: 44036562 - repo_id: 197814629 - 'actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a': - ref: 'v7.0.1' - commit: 'sha1-043fb46d1a93c77aae656e7c1c64a875d1fc6a0a' - owner_id: 44036562 - repo_id: 192625955 - 'actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08': - ref: 'v4.6.0' - commit: 'sha1-65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08' - owner_id: 44036562 - repo_id: 192625955 - 'denoland/setup-deno@22d081ff2d3a40755e97629de92e3bcbfa7cf2ed': - ref: 'v2.0.5' - commit: 'sha1-22d081ff2d3a40755e97629de92e3bcbfa7cf2ed' - owner_id: 42048915 - repo_id: 356423100 - 'dtolnay/rust-toolchain@6c977a6ca4077a0ceb28ffbe03f59d46e9ac8772': - ref: 'stable' - commit: 'sha1-6c977a6ca4077a0ceb28ffbe03f59d46e9ac8772' - owner_id: 1940490 - repo_id: 260749683 - 'editorconfig-checker/action-editorconfig-checker@840e866d93b8e032123c23bac69dece044d4d84c': - ref: 'v2.2.0' - commit: 'sha1-840e866d93b8e032123c23bac69dece044d4d84c' - owner_id: 26415196 - repo_id: 297874902 - 'erlef/setup-beam@54075bcc5e249e4758d363f27d099f55d843f124': - ref: 'v1.24.1' - commit: 'sha1-54075bcc5e249e4758d363f27d099f55d843f124' - owner_id: 47606891 - repo_id: 331103973 - 'ossf/scorecard-action@2d1146689b8cda280b9bc96326124645441f03bc': - ref: 'v2.4.4' - commit: 'sha1-2d1146689b8cda280b9bc96326124645441f03bc' - owner_id: 67707773 - repo_id: 421101922 + 'slsa-framework/slsa-github-generator@f7dd8c54c2067bafc12ca7a55595d5ee9b75204a': + ref: 'f7dd8c54c2067bafc12ca7a55595d5ee9b75204a' + commit: 'sha1-f7dd8c54c2067bafc12ca7a55595d5ee9b75204a' + owner_id: 80431187 + repo_id: 475074978 + uses: + - 'actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08' + - 'slsa-framework/slsa-github-generator@v2.1.0' + - 'softprops/action-gh-release@c95fe1489396fe8a9eb87c0abf8aa5b2ef267fda' + 'slsa-framework/slsa-github-generator@v2.1.0': + ref: 'v2.1.0' + commit: 'sha1-f7dd8c54c2067bafc12ca7a55595d5ee9b75204a' + owner_id: 80431187 + repo_id: 475074978 'softprops/action-gh-release@c95fe1489396fe8a9eb87c0abf8aa5b2ef267fda': ref: 'v2.2.1' commit: 'sha1-c95fe1489396fe8a9eb87c0abf8aa5b2ef267fda' owner_id: 2242 repo_id: 204253808 + 'softprops/action-gh-release@v3.0.3': + ref: 'v3.0.3' + commit: 'sha1-efb35369e0ad2afab669f228072c1b0d510eae64' + owner_id: 2242 + repo_id: 204253808 + 'sonarsource/sonarqube-scan-action@v8.3.0': + ref: 'v8.3.0' + commit: 'sha1-d209202bc7d53ff1cc128f7f907dac145c9d6ae9' + owner_id: 545988 + repo_id: 366408409 'webfactory/ssh-agent@e83874834305fe9a4a2997156cb26c5de65a8555': ref: 'v0.10.0' commit: 'sha1-e83874834305fe9a4a2997156cb26c5de65a8555' diff --git a/.github/workflows/backend-assurance.yml b/.github/workflows/backend-assurance.yml index 1b83a8e1..c1bacb70 100644 --- a/.github/workflows/backend-assurance.yml +++ b/.github/workflows/backend-assurance.yml @@ -48,7 +48,7 @@ jobs: outputs: run: ${{ steps.detect.outputs.run }} steps: - - uses: actions/checkout@v6.0.2 + - uses: actions/checkout@v7.0.1 with: fetch-depth: 0 - id: detect @@ -74,29 +74,29 @@ jobs: name: BEAM property tests needs: changes if: needs.changes.outputs.run == 'true' - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 timeout-minutes: 10 defaults: run: working-directory: elixir steps: - - uses: actions/checkout@v6.0.2 + - uses: actions/checkout@v7.0.1 - name: Set up BEAM (Elixir + OTP) - uses: erlef/setup-beam@v1.24.0 + uses: erlef/setup-beam@v1.24.1 with: elixir-version: '1.18.4' otp-version: '27.0' - name: Cache deps + _build - uses: actions/cache@v4.2.2 + uses: actions/cache@v6.1.0 with: path: | elixir/deps elixir/_build - key: backend-assurance-${{ runner.os }}-${{ hashFiles('elixir/mix.lock') }} + key: backend-assurance-${{ runner.os }}-${{ env.ImageOS || 'ubuntu24' }}-${{ hashFiles('elixir/mix.lock') }} restore-keys: | - backend-assurance-${{ runner.os }}- + backend-assurance-${{ runner.os }}-${{ env.ImageOS || 'ubuntu24' }}- - name: Fetch deps run: mix deps.get diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9a2dde99..af4d88ca 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -28,10 +28,10 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 15 steps: - - uses: actions/checkout@v4.3.1 + - uses: actions/checkout@v7.0.1 with: fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis - name: SonarQube Scan - uses: SonarSource/sonarqube-scan-action@v8.1.0 + uses: SonarSource/sonarqube-scan-action@v8.3.0 env: SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index bbf70899..0c6090b0 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -26,7 +26,7 @@ permissions: jobs: analyze: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 timeout-minutes: 60 permissions: contents: read @@ -35,6 +35,8 @@ jobs: fail-fast: false matrix: include: + - language: actions + build-mode: none - language: javascript-typescript build-mode: none # C/C++ CodeQL is intentionally not enabled for the generated @@ -44,15 +46,17 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v6.0.2 + uses: actions/checkout@v7.0.1 + with: + persist-credentials: false - name: Initialize CodeQL - uses: github/codeql-action/init@v4.34.0 + uses: github/codeql-action/init@v4.39.0 with: languages: ${{ matrix.language }} build-mode: ${{ matrix.build-mode }} - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v4.34.0 + uses: github/codeql-action/analyze@v4.39.0 with: category: "/language:${{ matrix.language }}" diff --git a/.github/workflows/container-publish.yml b/.github/workflows/container-publish.yml index a0cfdcc7..cb0625fd 100644 --- a/.github/workflows/container-publish.yml +++ b/.github/workflows/container-publish.yml @@ -29,7 +29,7 @@ jobs: id-token: write # mint the OIDC token the attestation is signed with attestations: write # write the build-provenance attestation (the "claim") steps: - - uses: actions/checkout@v6.0.2 + - uses: actions/checkout@v7.0.1 - name: Extract version metadata id: meta @@ -95,7 +95,7 @@ jobs: # gh attest verify oci://ghcr.io/${{ github.repository }}: \ # --repo ${{ github.repository }} - name: Attest container provenance - uses: actions/attest-build-provenance@v2.4.0 + uses: actions/attest-build-provenance@v4.2.2 with: subject-name: ghcr.io/${{ github.repository }} subject-digest: ${{ steps.push.outputs.digest }} diff --git a/.github/workflows/dogfood-gate.yml b/.github/workflows/dogfood-gate.yml index b78cd483..3d832bae 100644 --- a/.github/workflows/dogfood-gate.yml +++ b/.github/workflows/dogfood-gate.yml @@ -29,57 +29,105 @@ permissions: jobs: # --------------------------------------------------------------------------- - # Job 1: A2ML manifest validation + # Job 1: DEED + legacy A2ML manifest validation # --------------------------------------------------------------------------- a2ml-validate: name: Validate DEED manifests - runs-on: ubuntu-latest - timeout-minutes: 5 + runs-on: ubuntu-24.04 + timeout-minutes: 10 steps: - name: Checkout repository - uses: actions/checkout@v6.0.2 - - - name: Check for A2ML files + uses: actions/checkout@v7.0.1 + with: + persist-credentials: false + + - name: Checkout canonical DEED validator + uses: actions/checkout@v7.0.1 + with: + repository: metadatastician/standards + ref: 1725bebd3773ea25627479f813283abf1c497a85 + path: .standards-deed + sparse-checkout: 1-formats/deed + sparse-checkout-cone-mode: true + persist-credentials: false + + - name: Setup Deno runtime + uses: denoland/setup-deno@v2.0.5 + with: + deno-version: v2.x + + - name: Check for DEED and A2ML files id: detect run: | + set -euo pipefail + rm -rf "$RUNNER_TEMP/standards-deed" + mv "$PWD/.standards-deed" "$RUNNER_TEMP/standards-deed" + DEED_NAME="${GITHUB_REPOSITORY#*/}_chora.deed" + if [ ! -f "$DEED_NAME" ]; then + echo "::error::Missing required repo deed $DEED_NAME at repository root (standards#837)" + exit 1 + fi + DEED_COUNT=$(find . -type f -name '*.deed' -not -path './.git/*' | wc -l) COUNT=$(find . -type f \( -name '*.a2ml' -o -name '*.deed' \) -not -path './.git/*' | wc -l) + echo "deed_count=$DEED_COUNT" >> "$GITHUB_OUTPUT" echo "count=$COUNT" >> "$GITHUB_OUTPUT" - if [ "$COUNT" -eq 0 ]; then - echo "::warning::No .a2ml/.deed manifest files found. Every RSR repo should have a repo deed (_chora.deed); legacy 0-AI-MANIFEST.a2ml accepted mid-migration — standards #837" - fi - - name: Validate A2ML manifests + - name: Validate DEED grammar (deed_lint.js) + run: | + set -euo pipefail + mapfile -t deeds < <(git ls-files -- '*.deed' | sort) + deno run --allow-read "$RUNNER_TEMP/standards-deed/1-formats/deed/tools/deed_lint.js" "${deeds[@]}" + + - name: Validate manifest structure if: steps.detect.outputs.count > 0 run: bash .github/hooks/validate-a2ml.sh - name: Write summary + env: + A2ML_COUNT: ${{ steps.detect.outputs.count }} + DEED_COUNT: ${{ steps.detect.outputs.deed_count }} run: | - A2ML_COUNT="${{ steps.detect.outputs.count }}" - if [ "$A2ML_COUNT" -eq 0 ]; then - cat <<'EOF' >> "$GITHUB_STEP_SUMMARY" - ## A2ML Validation - - :warning: **No .a2ml/.deed manifest files found.** Every RSR-compliant repo should have a repo deed (`_chora.deed`) at its root. - - Copy one from [rsr-template-repo](https://github.com/hyperpolymath/rsr-template-repo). - EOF - else - echo "## A2ML Validation" >> "$GITHUB_STEP_SUMMARY" - echo "" >> "$GITHUB_STEP_SUMMARY" - echo "Scanned **${A2ML_COUNT}** manifest file(s) (.deed, or legacy .a2ml). See step output for details." >> "$GITHUB_STEP_SUMMARY" - fi + echo "## DEED & Manifest Validation" >> "$GITHUB_STEP_SUMMARY" + echo "" >> "$GITHUB_STEP_SUMMARY" + echo "Validated **${DEED_COUNT}** \`.deed\` file(s) via canonical \`deed_lint.js\` and **${A2ML_COUNT}** total manifest file(s)." >> "$GITHUB_STEP_SUMMARY" # --------------------------------------------------------------------------- - # Job 2: K9 contract validation + # Job 2: K9 contract validation (L0 + L1 + L2 Nickel contract check) # --------------------------------------------------------------------------- k9-validate: name: Validate K9 contracts - runs-on: ubuntu-latest - timeout-minutes: 5 + runs-on: ubuntu-24.04 + timeout-minutes: 15 + env: + NICKEL_VERSION: '1.18.0' + NICKEL_SHA256: '9cba4dd65ae9915ec61f73033aafcff307a377665a83fd8f530df086763318cb' steps: - name: Checkout repository - uses: actions/checkout@v6.0.2 + uses: actions/checkout@v7.0.1 + with: + persist-credentials: false + + - name: Checkout canonical K9 validator + uses: actions/checkout@v7.0.1 + with: + repository: metadatastician/standards + ref: 1725bebd3773ea25627479f813283abf1c497a85 + path: .standards-k9 + sparse-checkout: 1-formats/k9 + sparse-checkout-cone-mode: true + persist-credentials: false + + - name: Install sha256-verified Nickel CLI + run: | + set -euo pipefail + rm -rf "$RUNNER_TEMP/standards-k9" + mv "$PWD/.standards-k9" "$RUNNER_TEMP/standards-k9" + URL="https://github.com/tweag/nickel/releases/download/${NICKEL_VERSION}/nickel-x86_64-linux" + curl -sSfL --proto '=https' --proto-redir '=https' --tlsv1.2 --retry 3 -o "$RUNNER_TEMP/nickel" "$URL" + echo "${NICKEL_SHA256} ${RUNNER_TEMP}/nickel" | sha256sum -c - + chmod +x "$RUNNER_TEMP/nickel" + echo "$RUNNER_TEMP" >> "$GITHUB_PATH" - name: Check for K9 files id: detect @@ -94,25 +142,40 @@ jobs: echo "::warning::Found $CONFIG_COUNT config files but no K9 contracts. Run k9iser to generate contracts." fi - - name: Validate K9 contracts + - name: Validate K9 contracts (canonical L0+L1+L2 + repo hook) if: steps.detect.outputs.k9_count > 0 - run: bash .github/hooks/validate-k9.sh + run: | + set -euo pipefail + mapfile -t k9_files < <(git ls-files -- '*.k9' '*.k9.ncl' | sort) + set +e + k9_out="$(bash "$RUNNER_TEMP/standards-k9/1-formats/k9/tools/k9-validate.sh" --layer L2 --strict "${k9_files[@]}" 2>&1)" + k9_rc=$? + set -e + printf '%s\n' "$k9_out" + if [ "$k9_rc" -ne 0 ]; then + while IFS= read -r line; do + [ -n "$line" ] && echo "::error::$line" + done <<< "$k9_out" + exit "$k9_rc" + fi + bash .github/hooks/validate-k9.sh - name: Write summary + env: + K9_COUNT: ${{ steps.detect.outputs.k9_count }} + CFG_COUNT: ${{ steps.detect.outputs.config_count }} run: | - K9_COUNT="${{ steps.detect.outputs.k9_count }}" - CFG_COUNT="${{ steps.detect.outputs.config_count }}" if [ "$K9_COUNT" -eq 0 ]; then cat <<'EOF' >> "$GITHUB_STEP_SUMMARY" ## K9 Contract Validation - :warning: **No .a2ml/.deed manifest files found.** Every RSR-compliant repo should have a repo deed (`_chora.deed`) at its root. + :warning: **No K9 contracts found.** Generate contracts with: `k9iser generate .` EOF else echo "## K9 Contract Validation" >> "$GITHUB_STEP_SUMMARY" echo "" >> "$GITHUB_STEP_SUMMARY" - echo "Validated **${K9_COUNT}** K9 contract(s) against **${CFG_COUNT}** config file(s)." >> "$GITHUB_STEP_SUMMARY" + echo "Validated **${K9_COUNT}** K9 contract(s) (L0+L1+L2 Nickel contract check) against **${CFG_COUNT}** config file(s)." >> "$GITHUB_STEP_SUMMARY" fi # --------------------------------------------------------------------------- @@ -120,12 +183,14 @@ jobs: # --------------------------------------------------------------------------- empty-lint: name: Empty-linter (invisible characters) - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 timeout-minutes: 15 steps: - name: Checkout repository - uses: actions/checkout@v6.0.2 + uses: actions/checkout@v7.0.1 + with: + persist-credentials: false - name: Scan for invisible characters id: lint @@ -216,12 +281,14 @@ jobs: # --------------------------------------------------------------------------- groove-check: name: Groove manifest check - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 timeout-minutes: 5 steps: - name: Checkout repository - uses: actions/checkout@v6.0.2 + uses: actions/checkout@v7.0.1 + with: + persist-credentials: false - name: Check for Groove manifest id: groove @@ -275,12 +342,14 @@ jobs: # --------------------------------------------------------------------------- eclexiaiser-validate: name: Validate eclexiaiser manifest - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 timeout-minutes: 5 steps: - name: Checkout repository - uses: actions/checkout@v6.0.2 + uses: actions/checkout@v7.0.1 + with: + persist-credentials: false - name: Check and validate eclexiaiser manifest id: eclex @@ -321,14 +390,16 @@ jobs: # --------------------------------------------------------------------------- dogfood-summary: name: Dogfooding compliance summary - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 needs: [a2ml-validate, k9-validate, empty-lint, groove-check, eclexiaiser-validate] if: always() timeout-minutes: 5 steps: - name: Checkout repository - uses: actions/checkout@v6.0.2 + uses: actions/checkout@v7.0.1 + with: + persist-credentials: false - name: Generate dogfooding scorecard run: | diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index d34e9f76..49db7d92 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -35,7 +35,7 @@ jobs: outputs: run: ${{ steps.detect.outputs.run }} steps: - - uses: actions/checkout@v6.0.2 + - uses: actions/checkout@v7.0.1 with: fetch-depth: 0 - id: detect @@ -62,12 +62,12 @@ jobs: name: E2E — Full REST + MCP Bridge needs: changes if: needs.changes.outputs.run == 'true' - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 timeout-minutes: 15 steps: - name: Checkout - uses: actions/checkout@v6.0.2 + uses: actions/checkout@v7.0.1 - name: Install Zig uses: mlugg/setup-zig@v2.2.1 @@ -75,7 +75,7 @@ jobs: version: 0.16.0 - name: Install Deno - uses: denoland/setup-deno@v2.0.4 + uses: denoland/setup-deno@v2.0.5 with: deno-version: v2.x @@ -83,7 +83,7 @@ jobs: # tests/e2e_full.sh requires `mix` on PATH to start the Elixir # backend (elixir/ — `mix run --no-halt`). Pinned to match the # estate convention (see hypatia-scan.yml across the org). - uses: erlef/setup-beam@v1.24.0 + uses: erlef/setup-beam@v1.24.1 with: elixir-version: '1.18' otp-version: '27' @@ -116,7 +116,7 @@ jobs: - name: Upload test logs if: always() - uses: actions/upload-artifact@v4.6.2 + uses: actions/upload-artifact@v7.0.2 with: name: e2e-full-logs path: /tmp/boj-e2e-test.* @@ -132,7 +132,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v6.0.2 + uses: actions/checkout@v7.0.1 - name: Install Zig uses: mlugg/setup-zig@v2.2.1 @@ -155,7 +155,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v6.0.2 + uses: actions/checkout@v7.0.1 - name: Run aspect tests run: bash tests/aspect_tests.sh @@ -170,7 +170,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v6.0.2 + uses: actions/checkout@v7.0.1 - name: Install Zig uses: mlugg/setup-zig@v2.2.1 @@ -185,7 +185,7 @@ jobs: - name: Upload benchmark results if: always() - uses: actions/upload-artifact@v4.6.2 + uses: actions/upload-artifact@v7.0.2 with: name: benchmark-results path: ffi/zig/zig-out/bench* @@ -224,18 +224,18 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v6.0.2 + uses: actions/checkout@v7.0.1 - name: Setup Node # Node is needed on every leg: it is the subject on the node # leg and the boot-smoke orchestrator on all three. - uses: actions/setup-node@v4.4.0 + uses: actions/setup-node@v7.1.0 with: node-version: '22' - name: Install Deno if: matrix.runtime == 'deno' - uses: denoland/setup-deno@v2.0.4 + uses: denoland/setup-deno@v2.0.5 with: deno-version: v2.x @@ -270,10 +270,10 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v6.0.2 + uses: actions/checkout@v7.0.1 - name: Setup Node - uses: actions/setup-node@v4.4.0 + uses: actions/setup-node@v7.1.0 with: node-version: '22' @@ -282,7 +282,7 @@ jobs: - name: Upload bridge bench artifact if: always() - uses: actions/upload-artifact@v4.6.2 + uses: actions/upload-artifact@v7.0.2 with: name: bench-bridge-results path: bench-bridge.txt @@ -293,7 +293,7 @@ jobs: # Advisory — a comment failure must never gate the bench job. # Same reasoning as the hypatia-scan PR-comment step. continue-on-error: true - uses: actions/github-script@v8.0.0 + uses: actions/github-script@v9.0.0 with: script: | const fs = require('fs'); diff --git a/.github/workflows/fuzz.yml b/.github/workflows/fuzz.yml index 7afaeba6..fdf1f47c 100644 --- a/.github/workflows/fuzz.yml +++ b/.github/workflows/fuzz.yml @@ -28,7 +28,7 @@ jobs: permissions: contents: read steps: - - uses: actions/checkout@v6.0.2 + - uses: actions/checkout@v7.0.1 - name: Install Zig uses: mlugg/setup-zig@v2.2.1 @@ -56,7 +56,7 @@ jobs: permissions: contents: read steps: - - uses: actions/checkout@v6.0.2 + - uses: actions/checkout@v7.0.1 - name: Fuzz JSON-RPC message parsing run: | diff --git a/.github/workflows/governance.yml b/.github/workflows/governance.yml index a964439c..39e4910f 100644 --- a/.github/workflows/governance.yml +++ b/.github/workflows/governance.yml @@ -1,17 +1,10 @@ # This workflow is managed by gh actions-lock. # SPDX-License-Identifier: MPL-2.0 -# This workflow is managed by gh actions-lock. -# This workflow is managed by gh actions-lock. -# governance.yml — single wrapper calling the shared estate governance bundle -# in hyperpolymath/standards instead of carrying per-repo copies. -# -# Replaces the per-repo governance scaffolding removed in the same commit: -# quality.yml, guix-guix-policy.yml, npm-bun-blocker.yml, ts-blocker.yml, -# security-policy.yml, rsr-antipattern.yml, wellknown-enforcement.yml, -# workflow-linter.yml -# -# Load-bearing build/security workflows stay standalone in the repo -# (rust-ci, codeql, dependabot, release, scan/mirror/pages plumbing). +# governance.yml — Estate governance checks ported from +# metadatastician/standards/.github/workflows/governance-reusable.yml +# (@1725bebd3773ea25627479f813283abf1c497a85) via actions/checkout while +# hyperpolymath's Actions allowlist omits metadatastician/standards@* as a +# reusable workflow owner. name: Governance @@ -21,10 +14,6 @@ on: pull_request: workflow_dispatch: -# Estate guardrail: cancel superseded runs so re-pushes / rebased PR -# updates do not pile up queued runs against the shared account-wide -# Actions concurrency pool. Applied only to read-only check workflows -# (no publish/mutation), so cancelling a superseded run is always safe. concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true @@ -35,9 +24,72 @@ permissions: jobs: governance: - # Previous 5a0891e9 pin predates hyperpolymath/standards#1271 (f335165), - # which fixed actions.lock leaf tag refs so runner job setup succeeds, - # and hyperpolymath/standards#1260 (UUID v8 conformance). - uses: hyperpolymath/standards/.github/workflows/governance-reusable.yml@e16a23170fa378bf3b1444c3ee94100413ae3ff7 - secrets: - HYPATIA_SCAN_PAT: ${{ secrets.HYPATIA_SCAN_PAT }} + name: governance + runs-on: ubuntu-24.04 + timeout-minutes: 20 + steps: + - name: Checkout repository + uses: actions/checkout@v7.0.1 + with: + fetch-depth: 0 + persist-credentials: false + + - name: Checkout canonical standards tools + uses: actions/checkout@v7.0.1 + with: + repository: metadatastician/standards + ref: 1725bebd3773ea25627479f813283abf1c497a85 + path: .standards-ci + persist-credentials: false + + - name: Relocate standards tools outside workspace scan root + run: | + set -euo pipefail + rm -rf "$RUNNER_TEMP/standards-ci" + mv "$PWD/.standards-ci" "$RUNNER_TEMP/standards-ci" + + - name: Verify workflow syntax, lockfile sync, and closure + run: | + set -euo pipefail + bash "$RUNNER_TEMP/standards-ci/tools/policy/check-workflows-parse.sh" . + bash "$RUNNER_TEMP/standards-ci/scripts/check-lock-sync.sh" .github/workflows + bash "$RUNNER_TEMP/standards-ci/scripts/close-lock.sh" --check .github/workflows/actions.lock + bash "$RUNNER_TEMP/standards-ci/scripts/check-workflow-duplicate-keys.sh" .github/workflows + + - name: Verify UUID-v8 conformance (ADR-008 / D320) + run: | + set -euo pipefail + chmod +x "$RUNNER_TEMP/standards-ci/scripts/check-uuid-v8.sh" + "$RUNNER_TEMP/standards-ci/scripts/check-uuid-v8.sh" --strict . + + - name: Verify licence consistency, language policy, TS allowlist, packaging, and docs + run: | + set -euo pipefail + bash "$RUNNER_TEMP/standards-ci/scripts/check-licence-consistency.sh" . + bash "$RUNNER_TEMP/standards-ci/tools/policy/check-language-policy.sh" . + bash "$RUNNER_TEMP/standards-ci/scripts/check-ts-allowlist.sh" + bash "$RUNNER_TEMP/standards-ci/scripts/check-package-policy.sh" . + bash "$RUNNER_TEMP/standards-ci/scripts/check-docs-presence.sh" . + + - name: Verify exemption and debt ratchets against base branch + env: + BASE_REF: ${{ github.base_ref }} + run: | + set -euo pipefail + TARGET_REF="origin/${BASE_REF:-main}" + if git rev-parse --verify "$TARGET_REF" >/dev/null 2>&1; then + bash "$RUNNER_TEMP/standards-ci/scripts/check-exemption-ratchet.sh" "$TARGET_REF" + bash "$RUNNER_TEMP/standards-ci/scripts/check-debt-ratchet.sh" "$TARGET_REF" + else + bash "$RUNNER_TEMP/standards-ci/scripts/check-exemption-ratchet.sh" HEAD~1 + bash "$RUNNER_TEMP/standards-ci/scripts/check-debt-ratchet.sh" HEAD~1 + fi + + - name: Verify trusted-base reduction, shebangs, and A2ML/K9 repository hooks + run: | + set -euo pipefail + bash "$RUNNER_TEMP/standards-ci/scripts/check-trusted-base.sh" . + bash scripts/check-trusted-base.sh + bash scripts/check-shebang-first.sh + bash .github/hooks/validate-a2ml.sh + bash .github/hooks/validate-k9.sh diff --git a/.github/workflows/hcg-surface-drift.yml b/.github/workflows/hcg-surface-drift.yml index b1e447d0..aea0a2ee 100644 --- a/.github/workflows/hcg-surface-drift.yml +++ b/.github/workflows/hcg-surface-drift.yml @@ -53,7 +53,7 @@ jobs: outputs: run: ${{ steps.detect.outputs.run }} steps: - - uses: actions/checkout@v6.0.2 + - uses: actions/checkout@v7.0.1 with: fetch-depth: 0 - id: detect @@ -88,7 +88,7 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 5 steps: - - uses: actions/checkout@v6.0.2 + - uses: actions/checkout@v7.0.1 - name: Confirm script + inputs are present run: | set -euo pipefail diff --git a/.github/workflows/hypatia-scan.yml b/.github/workflows/hypatia-scan.yml index bb2f17c4..13b6934a 100644 --- a/.github/workflows/hypatia-scan.yml +++ b/.github/workflows/hypatia-scan.yml @@ -46,17 +46,19 @@ permissions: jobs: scan: name: Hypatia Neurosymbolic Analysis - runs-on: ubuntu-latest + # Pin to ubuntu-24.04: erlef/setup-beam rejects ImageOS=ubuntu26 following + # GitHub's Oct 19, 2026 ubuntu-latest migration. + runs-on: ubuntu-24.04 timeout-minutes: 15 steps: - name: Checkout repository - uses: actions/checkout@v6.0.2 + uses: actions/checkout@v7.0.1 with: fetch-depth: 0 # Full history for better pattern analysis - name: Setup Elixir for Hypatia scanner - uses: erlef/setup-beam@v1.24.0 + uses: erlef/setup-beam@v1.24.1 with: elixir-version: '1.18' otp-version: '27' @@ -110,13 +112,14 @@ jobs: echo "- Medium: $MEDIUM" >> $GITHUB_STEP_SUMMARY - name: Upload findings artifact - uses: actions/upload-artifact@v4.6.2 + uses: actions/upload-artifact@v7.0.2 with: name: hypatia-findings path: hypatia-findings.json retention-days: 90 - name: Convert Hypatia findings to SARIF + id: sarif # Always runs (no findings_count guard): an EMPTY SARIF run is # valid and intentional — uploading it clears stale Hypatia # alerts from the code-scanning page when a repo goes clean. @@ -244,9 +247,10 @@ jobs: # handled in the converter above and does not error here. if: >- always() && + steps.sarif.outcome == 'success' && (github.event_name != 'pull_request' || github.event.pull_request.head.repo.fork != true) - uses: github/codeql-action/upload-sarif@v4.32.6 + uses: github/codeql-action/upload-sarif@v4.39.0 with: sarif_file: hypatia.sarif # Distinct category so Hypatia results coexist with CodeQL's @@ -386,12 +390,16 @@ jobs: # the pull-requests: write permission above: a token/API hiccup or # a fork PR (read-only token) skips the comment, not the check. continue-on-error: true - uses: actions/github-script@v8.0.0 + uses: actions/github-script@v9.0.0 with: script: | const fs = require('fs'); const findings = JSON.parse(fs.readFileSync('hypatia-findings.json', 'utf8')); + const rank = { critical: 0, high: 1, medium: 2, low: 3 }; + const sorted = [...findings].sort( + (a, b) => (rank[a.severity] ?? 9) - (rank[b.severity] ?? 9) + ); const critical = findings.filter(f => f.severity === 'critical').length; const high = findings.filter(f => f.severity === 'high').length; @@ -406,8 +414,8 @@ jobs: comment += `⚠️ **Action Required:** Critical security issues found!\n\n`; } - comment += `
View findings\n\n`; - comment += `\`\`\`json\n${JSON.stringify(findings.slice(0, 10), null, 2)}\n\`\`\`\n`; + comment += `
View findings (sorted by severity)\n\n`; + comment += `\`\`\`json\n${JSON.stringify(sorted.slice(0, 25), null, 2)}\n\`\`\`\n`; comment += `
\n\n`; comment += `*Powered by Hypatia Neurosymbolic CI/CD Intelligence*`; diff --git a/.github/workflows/instant-sync.yml b/.github/workflows/instant-sync.yml index f59819cc..92218f5c 100644 --- a/.github/workflows/instant-sync.yml +++ b/.github/workflows/instant-sync.yml @@ -29,7 +29,7 @@ jobs: timeout-minutes: 5 steps: - name: Trigger Propagation - uses: peter-evans/repository-dispatch@v3.0.0 + uses: peter-evans/repository-dispatch@v4.0.1 with: token: ${{ secrets.FARM_DISPATCH_TOKEN }} repository: hyperpolymath/.git-private-farm diff --git a/.github/workflows/label-triage.yml b/.github/workflows/label-triage.yml index 814a1924..24a72028 100644 --- a/.github/workflows/label-triage.yml +++ b/.github/workflows/label-triage.yml @@ -46,7 +46,8 @@ permissions: jobs: triage: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 + timeout-minutes: 10 steps: - name: Classify and label env: diff --git a/.github/workflows/labels.yml b/.github/workflows/labels.yml index 83ab941a..a9089a1e 100644 --- a/.github/workflows/labels.yml +++ b/.github/workflows/labels.yml @@ -32,7 +32,8 @@ permissions: jobs: sync: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 + timeout-minutes: 10 steps: - name: Apply canonical labels env: diff --git a/.github/workflows/lsp-dap-bsp.yml b/.github/workflows/lsp-dap-bsp.yml index c04f8594..00321b58 100644 --- a/.github/workflows/lsp-dap-bsp.yml +++ b/.github/workflows/lsp-dap-bsp.yml @@ -33,7 +33,7 @@ jobs: outputs: run: ${{ steps.detect.outputs.run }} steps: - - uses: actions/checkout@v6.0.2 + - uses: actions/checkout@v7.0.1 with: fetch-depth: 0 - id: detect @@ -59,7 +59,7 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 10 steps: - - uses: actions/checkout@v6.0.2 + - uses: actions/checkout@v7.0.1 - name: Validate ABI modules exist run: | echo "=== Checking LSP/DAP/BSP ABI modules ===" @@ -95,7 +95,7 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 15 steps: - - uses: actions/checkout@v6.0.2 + - uses: actions/checkout@v7.0.1 # Use the pinned action + .tool-versions' canonical Zig, matching # e2e.yml. (A previous revision curled ziglang.org/builds/... — the # nightly dir, not release downloads — and got an error page that @@ -142,7 +142,7 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 10 steps: - - uses: actions/checkout@v6.0.2 + - uses: actions/checkout@v7.0.1 # jq (pre-installed on ubuntu-latest) — the repo's no-Python policy # (dogfood-gate) bans the previous json.tool/json.load approach. # Same checks: valid JSON + required fields + panel count. @@ -176,7 +176,7 @@ jobs: needs: [changes, abi-check, ffi-build, panel-validation] if: needs.changes.outputs.run == 'true' steps: - - uses: actions/checkout@v6.0.2 + - uses: actions/checkout@v7.0.1 - name: Verify triadic structure run: | echo "=== LSP/DAP/BSP Triadic Structure Audit ===" diff --git a/.github/workflows/pages-deploy.yml b/.github/workflows/pages-deploy.yml index 332ce492..cd0449f8 100644 --- a/.github/workflows/pages-deploy.yml +++ b/.github/workflows/pages-deploy.yml @@ -22,7 +22,7 @@ jobs: deploy: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4.4.0 + - uses: actions/checkout@v7.0.1 - name: Deploy site/ to Cloudflare Workers (static assets) run: npx wrangler@latest deploy env: diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml old mode 100755 new mode 100644 index d614a31b..22ee7726 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -27,9 +27,9 @@ jobs: image: ghcr.io/stefan-hoeck/idris2-pack@sha256:f0758996a931fb35d9ecb1de273c4d59dabe2a09b433afc7e357f65a08b7e1ff steps: - name: Checkout Site - uses: actions/checkout@v4.4.0 + uses: actions/checkout@v7.0.1 - name: Checkout Ddraig SSG - uses: actions/checkout@v4.4.0 + uses: actions/checkout@v7.0.1 with: repository: hyperpolymath/ddraig-ssg path: .ddraig-ssg @@ -46,7 +46,7 @@ jobs: fi ./.ddraig-ssg/build/exec/ddraig build src _site https://hyperpolymath.github.io/${GITHUB_REPOSITORY#*/} - name: Upload artifact - uses: actions/upload-pages-artifact@v3.0.1 + uses: actions/upload-pages-artifact@v5.0.0 with: path: '_site' deploy: @@ -59,4 +59,4 @@ jobs: steps: - name: Deploy to GitHub Pages id: deployment - uses: actions/deploy-pages@v4.0.5 + uses: actions/deploy-pages@v5.0.1 diff --git a/.github/workflows/proofs.yml b/.github/workflows/proofs.yml index b2a9d85f..a080a753 100644 --- a/.github/workflows/proofs.yml +++ b/.github/workflows/proofs.yml @@ -43,20 +43,22 @@ jobs: # Cheap, dependency-free gate: scan for unsound constructs + axiom-count drift. trusted-base: name: Trusted-base audit (no new axioms) - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 timeout-minutes: 10 steps: - - uses: actions/checkout@v6.0.2 + - uses: actions/checkout@v7.0.1 - name: Enforce trusted base run: bash scripts/check-trusted-base.sh # Full type-check of the core ABI + every cartridge ABI under the pinned Idris2. typecheck: name: Idris2 type-check (core + all cartridge ABIs) - runs-on: ubuntu-latest + # Pin to ubuntu-24.04 and key the cache on ImageOS so Chez Scheme bootfiles + # compiled on Ubuntu 24.04 are never restored onto Ubuntu 26.04 (exit 255). + runs-on: ubuntu-24.04 timeout-minutes: 45 steps: - - uses: actions/checkout@v6.0.2 + - uses: actions/checkout@v7.0.1 # The pin lives in .mise.toml (.tool-versions was converted, 4d1fe0c9). # Fail here on an empty or malformed value rather than asking asdf to @@ -76,10 +78,10 @@ jobs: run: sudo apt-get update && sudo apt-get install -y chezscheme libgmp-dev build-essential - name: Cache asdf + Idris2 toolchain - uses: actions/cache@v4.2.2 + uses: actions/cache@v6.1.0 with: path: ~/.asdf - key: idris2-asdf-${{ runner.os }}-${{ steps.ver.outputs.idris2 }} + key: idris2-asdf-${{ runner.os }}-${{ env.ImageOS || 'ubuntu24' }}-${{ steps.ver.outputs.idris2 }} - name: Install asdf + Idris2 ${{ steps.ver.outputs.idris2 }} env: diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 47cb4322..09c280a5 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -27,7 +27,7 @@ jobs: contents: read id-token: write steps: - - uses: actions/checkout@v6.0.2 + - uses: actions/checkout@v7.0.1 - name: Setup Bun uses: oven-sh/setup-bun@v2.2.0 @@ -100,10 +100,10 @@ jobs: contents: read id-token: write steps: - - uses: actions/checkout@v6.0.2 + - uses: actions/checkout@v7.0.1 - name: Setup Deno - uses: denoland/setup-deno@v2.0.4 + uses: denoland/setup-deno@v2.0.5 with: deno-version: v2.x diff --git a/.github/workflows/push-email-notify.yml b/.github/workflows/push-email-notify.yml index 579479c8..3cd69a56 100644 --- a/.github/workflows/push-email-notify.yml +++ b/.github/workflows/push-email-notify.yml @@ -41,7 +41,7 @@ jobs: timeout-minutes: 5 steps: - name: Send push notification email - uses: hyperpolymath/smtp-notify-action@v0.2.0 + uses: hyperpolymath/smtp-notify-action@v0.5.0 with: server_address: ${{ secrets.SMTP_HOST }} server_port: ${{ secrets.SMTP_PORT }} diff --git a/.github/workflows/readme-derive.yml b/.github/workflows/readme-derive.yml index 3384d472..d7ea8a23 100644 --- a/.github/workflows/readme-derive.yml +++ b/.github/workflows/readme-derive.yml @@ -1,13 +1,9 @@ # This workflow is managed by gh actions-lock. # SPDX-License-Identifier: MPL-2.0 -# This workflow is managed by gh actions-lock. -# This workflow is managed by gh actions-lock. # README single-source derivation (ADR-004): README.adoc is canonical; # README.md is derived for the Glama MCP directory (Markdown-only renderer). -# This caller delegates to the standards reusable, which reads the -# [publishing.readme] declaration in .machine_readable/*/ECOSYSTEM.a2ml, -# regenerates README.md behind a vocabulary gate, and fails-and-tells if the -# committed README.md is stale relative to README.adoc. +# Inlined from metadatastician/standards@1725bebd3773ea25627479f813283abf1c497a85 +# while hyperpolymath's Actions allowlist omits metadatastician/standards@*. name: README Derive on: @@ -23,13 +19,172 @@ on: - README.md - .machine_readable/**/ECOSYSTEM.a2ml +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + permissions: actions: read contents: read jobs: readme-derive: - # Pinned to a hyperpolymath/standards main commit that carries the gem - # install fix (asciidoctor:VER syntax) and the anchor-ID convention guard - # (standards#476); this repo's README.adoc satisfies both. - uses: hyperpolymath/standards/.github/workflows/readme-derive-reusable.yml@5a0891e9e58b785181a92e141505ca96ca987b42 + name: Derive & verify README.md + runs-on: ubuntu-24.04 + timeout-minutes: 30 + steps: + - name: Checkout repository + uses: actions/checkout@v7.0.1 + with: + persist-credentials: false + + - name: Read publishing declaration + id: decl + run: | + set -euo pipefail + ECO="" + for c in .machine_readable/descriptiles/ECOSYSTEM.a2ml \ + .machine_readable/6a2/ECOSYSTEM.a2ml; do + if [ -f "$c" ]; then ECO="$c"; break; fi + done + if [ -z "$ECO" ]; then + echo "No ECOSYSTEM.a2ml found — repo not opted in. Nothing to derive." + echo "derive=false" >> "$GITHUB_OUTPUT" + exit 0 + fi + DECL_DERIVE="false" + DECL_CANONICAL="README.adoc" + DECL_PATH="README.md" + DECL_FORMAT="gfm" + DECL_CONSUMER="unspecified" + while IFS='=' read -r k v; do + case "$k" in + DERIVE) DECL_DERIVE="$v" ;; + CANONICAL) DECL_CANONICAL="$v" ;; + PATH) DECL_PATH="$v" ;; + FORMAT) DECL_FORMAT="$v" ;; + CONSUMER) DECL_CONSUMER="$v" ;; + esac + done < <( + awk ' + /^[[:space:]]*\[/ { inblk = ($0 ~ /^[[:space:]]*\[publishing\.readme\][[:space:]]*$/) ? 1 : 0; next } + inblk && /=/ { + key = $0; sub(/=.*/, "", key); gsub(/[[:space:]]/, "", key) + val = $0; sub(/^[^=]*=[[:space:]]*/, "", val) + sub(/[[:space:]]*(#.*)?$/, "", val) + gsub(/^"|"$/, "", val) + if (key ~ /^(canonical|derive|format|path|consumer)$/) + printf "%s=%s\n", toupper(key), val + } + ' "$ECO" + ) + if [ "$DECL_DERIVE" != "true" ]; then + echo "[publishing.readme] absent or derive != true — repo not opted in." + echo "derive=false" >> "$GITHUB_OUTPUT" + exit 0 + fi + CANONICAL="$DECL_CANONICAL" + DERIVED_PATH="$DECL_PATH" + FORMAT="$DECL_FORMAT" + CONSUMER="$DECL_CONSUMER" + for rel_p in "$CANONICAL" "$DERIVED_PATH"; do + if ! printf '%s' "$rel_p" | grep -qE '^[A-Za-z0-9_./-]+$' \ + || printf '%s' "$rel_p" | grep -qE '(^/|\.\.)'; then + echo "::error::Invalid relative README path declaration: '$rel_p'" + exit 1 + fi + done + if [ ! -f "$CANONICAL" ]; then + echo "::error::Declared canonical '$CANONICAL' does not exist." + exit 1 + fi + if [ "$FORMAT" != "gfm" ]; then + echo "::error::Unsupported derived format '$FORMAT' (only 'gfm' is implemented)." + exit 1 + fi + { + echo "derive=true" + echo "canonical=$CANONICAL" + echo "derived_path=$DERIVED_PATH" + echo "consumer=$CONSUMER" + } >> "$GITHUB_OUTPUT" + + - name: Checkout canonical vocab-gate script + if: steps.decl.outputs.derive == 'true' + uses: actions/checkout@v7.0.1 + with: + repository: metadatastician/standards + ref: 1725bebd3773ea25627479f813283abf1c497a85 + path: .standards-readme + persist-credentials: false + + - name: Install toolchain + if: steps.decl.outputs.derive == 'true' + env: + PANDOC_VERSION: "3.10" + ASCIIDOCTOR_VERSION: "2.0.26" + ASCIIDOCTOR_REDUCER_VERSION: "1.1.1" + run: | + set -euo pipefail + curl -fsSL -o "$RUNNER_TEMP/pandoc.deb" \ + "https://github.com/jgm/pandoc/releases/download/${PANDOC_VERSION}/pandoc-${PANDOC_VERSION}-1-amd64.deb" + sudo dpkg -i "$RUNNER_TEMP/pandoc.deb" + sudo gem install --no-document \ + "asciidoctor:${ASCIIDOCTOR_VERSION}" \ + "asciidoctor-reducer:${ASCIIDOCTOR_REDUCER_VERSION}" + + - name: Anchor-ID convention guard + if: steps.decl.outputs.derive == 'true' + env: + CANONICAL: ${{ steps.decl.outputs.canonical }} + run: | + set -euo pipefail + if grep -qE 'link:#[a-z0-9-]+\[' "$CANONICAL"; then + if ! grep -qE '^:idprefix:[[:space:]]*$' "$CANONICAL" \ + || ! grep -qE '^:idseparator:[[:space:]]+-[[:space:]]*$' "$CANONICAL"; then + echo "::error::$CANONICAL has intra-doc anchor links but omits ':idprefix:' or ':idseparator: -'." + exit 1 + fi + fi + + - name: Derive Markdown and verify vocabulary + freshness + if: steps.decl.outputs.derive == 'true' + env: + CANONICAL: ${{ steps.decl.outputs.canonical }} + DERIVED_PATH: ${{ steps.decl.outputs.derived_path }} + THRESHOLD: "98" + run: | + set -euo pipefail + asciidoctor-reducer "$CANONICAL" -o "$RUNNER_TEMP/reduced.adoc" \ + 2>"$RUNNER_TEMP/reducer.err" + if [ -s "$RUNNER_TEMP/reducer.err" ]; then + cat "$RUNNER_TEMP/reducer.err" >&2 + exit 1 + fi + asciidoctor --failure-level=WARN -b docbook5 -a attribute-missing=drop \ + "$RUNNER_TEMP/reduced.adoc" -o "$RUNNER_TEMP/reduced.xml" + pandoc -f docbook -t gfm --wrap=preserve \ + "$RUNNER_TEMP/reduced.xml" -o "$RUNNER_TEMP/body.md" + SPDX="" + if grep -qE 'SPDX-License-Identifier:[[:space:]]*[^[:space:]]+' "$CANONICAL"; then + SPDX="$(grep -m1 -oE 'SPDX-License-Identifier:[[:space:]]*[^[:space:]]+' "$CANONICAL")" + fi + { + [ -n "$SPDX" ] && echo "" + echo "" + echo "" + cat "$RUNNER_TEMP/body.md" + } > "$RUNNER_TEMP/derived.md" + bash .standards-readme/.github/scripts/readme-vocab-gate.sh \ + "$CANONICAL" "$RUNNER_TEMP/derived.md" "$THRESHOLD" + norm() { grep -vE '^