From 1b665d70814a546a6db5e8ff31014ddf46adeb5f Mon Sep 17 00:00:00 2001 From: Teakowa <27560638+Teakowa@users.noreply.github.com> Date: Sun, 1 Nov 2026 18:04:24 +0800 Subject: [PATCH 1/7] perf(ci): cancel superseded PR runs, drop duplicate test runs, merge small jobs - Pull request runs share a concurrency group per PR and cancel in progress; main pushes keep a unique group. - Product integration no longer repeats the driver, CLI and consumer test targets that Rust Quality already runs; it keeps the provider-backed step. - The five Workshop dogfood jobs and nine metrics shards become one job and three shards, so a run stays under the runner concurrency limit. - Workflow lint runs only when workflows change. - Wasm core restores a release-profile cache. - workshop-rs builds with opt-level 1, as in its own repository; the 17k-element compile test drops from about 135 s to about 27 s locally. --- .github/workflows/ci.yml | 140 ++++++++++++++++++++------------------- Cargo.toml | 8 +++ scripts/test-ci-jobs.py | 5 +- 3 files changed, 83 insertions(+), 70 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5b7d78c5..7b4ae48a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,9 +9,17 @@ on: permissions: contents: read +# A newer push to the same pull request supersedes the older run. Pushes to +# main never share a group, so each main commit keeps a complete run. +concurrency: + group: ci-${{ github.event.pull_request.number || github.sha }} + cancel-in-progress: ${{ github.event_name == 'pull_request' }} + jobs: workflow-lint: name: Workflow lint + needs: paths + if: needs.paths.outputs.workflows == 'true' uses: wrightkit/.github/.github/workflows/actionlint.yml@main paths: @@ -22,6 +30,7 @@ jobs: rust_core: ${{ steps.filter.outputs.rust_core }} dist: ${{ steps.filter.outputs.dist }} agent_guide: ${{ steps.filter.outputs.agent_guide }} + workflows: ${{ steps.filter.outputs.workflows }} steps: - name: Checkout uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 @@ -39,6 +48,8 @@ jobs: uses: dorny/paths-filter@ceb8a2b8f2d89434be7ff52d3de7ec3738c5cc9d # v4.0.3 with: filters: | + workflows: + - '.github/workflows/**' rust_core: - 'Cargo.toml' - 'Cargo.lock' @@ -144,25 +155,11 @@ jobs: } >> "$GITHUB_STEP_SUMMARY" workshop-integration: - name: Workshop (${{ matrix.project }}) + name: Workshop dogfood needs: [paths, wright-cli-build] if: needs.paths.outputs.rust_core == 'true' runs-on: ubuntu-latest timeout-minutes: 10 - strategy: - fail-fast: true - matrix: - include: - - project: ai-pve - expected_exit: 0 - - project: bastion - expected_exit: 0 - - project: defend - expected_exit: 1 - - project: illari - expected_exit: 0 - - project: rework - expected_exit: 0 steps: - name: Checkout Wright uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 @@ -173,6 +170,7 @@ jobs: repository: wrightkit/workshop-rs ref: f1f3c58f790e9aede9300ca6421698f2503f5f62 # v0.3.11 path: workshop-rs-pinned + sparse-checkout: crates/workshop-rs/tests/fixtures/real-projects - name: Download CLI artifact uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2 @@ -184,9 +182,6 @@ jobs: run: chmod +x target/debug/wright - name: Run public CLI dogfood - env: - EXPECTED_EXIT: ${{ matrix.expected_exit }} - PROJECT: workshop-rs-pinned/crates/workshop-rs/tests/fixtures/real-projects/${{ matrix.project }}.ow run: | set -euo pipefail @@ -216,27 +211,42 @@ jobs: (.diagnostics | type == "array") and (all(.diagnostics[]; type == "object")) and ([.diagnostics[] | select(.stage == "internal")] | length == 0) - )' <<<"$output" >/dev/null + )' <<<"$output" >/dev/null || return 1 printf '%s' "$output" } - check_output="$(run_workflow check)" - lint_output="$(run_workflow lint)" - inspect_output="$(run_workflow inspect)" - jq -e -n \ - --argjson check "$check_output" \ - --argjson lint "$lint_output" \ - --argjson inspect "$inspect_output" \ - --argjson expected_exit "$EXPECTED_EXIT" \ - '( - $check.diagnostics == $lint.diagnostics and - $check.ok == $lint.ok and - $check.exit == $lint.exit and - (if $expected_exit == 0 - then ($inspect.result.program.rules | numbers | . > 0) - else ($lint.diagnostics | length > 0) - end) - )' >/dev/null + dogfood() { + local project="$1" + EXPECTED_EXIT="$2" + PROJECT="workshop-rs-pinned/crates/workshop-rs/tests/fixtures/real-projects/${project}.ow" + echo "::group::${project}" + + local check_output lint_output inspect_output + check_output="$(run_workflow check)" || return 1 + lint_output="$(run_workflow lint)" || return 1 + inspect_output="$(run_workflow inspect)" || return 1 + jq -e -n \ + --argjson check "$check_output" \ + --argjson lint "$lint_output" \ + --argjson inspect "$inspect_output" \ + --argjson expected_exit "$EXPECTED_EXIT" \ + '( + $check.diagnostics == $lint.diagnostics and + $check.ok == $lint.ok and + $check.exit == $lint.exit and + (if $expected_exit == 0 + then ($inspect.result.program.rules | numbers | . > 0) + else ($lint.diagnostics | length > 0) + end) + )' >/dev/null || return 1 + echo "::endgroup::" + } + + failed=0 + for entry in ai-pve:0 bastion:0 defend:1 illari:0 rework:0; do + dogfood "${entry%%:*}" "${entry##*:}" || { echo "::error::dogfood failed for ${entry%%:*}"; failed=1; } + done + exit "$failed" opy-integration: name: Product integration @@ -260,17 +270,6 @@ jobs: path: target/debug - name: Prepare CLI executable run: chmod +x target/debug/wright - - name: Run provider/product tests - run: >- - cargo test --locked - -p wright-driver --test driver --test source_provider --test service - - - name: Run CLI/embedding tests - run: >- - cargo test --locked - -p wright-cli --test cli --test diagnostics_schema --test serve - && cargo test --locked -p wright-consumer --test consumer - - name: Install OPY provider run: target/debug/wright update provider opy @@ -376,7 +375,7 @@ jobs: path: target/wright-bench-report.json metrics-shard: - name: Metrics shard (${{ matrix.project }}) + name: Metrics shard (${{ matrix.shard }}) needs: [paths, wright-cli-build] if: needs.paths.outputs.rust_core == 'true' runs-on: ubuntu-latest @@ -384,16 +383,13 @@ jobs: strategy: fail-fast: false matrix: - project: - - small-workshop - - seed-modify-target-score - - seed-repair-runaway-loop - - seed-understand-score-flow - - seed-modify-opy-project - - seed-repair-opy-runaway-loop - - seed-understand-opy-project - - bastion - - overwatch-ai-pve + include: + - shard: workshop + projects: small-workshop seed-modify-target-score seed-repair-runaway-loop seed-understand-score-flow + - shard: opy + projects: seed-modify-opy-project seed-repair-opy-runaway-loop seed-understand-opy-project + - shard: real + projects: bastion overwatch-ai-pve steps: - name: Checkout uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 @@ -407,18 +403,24 @@ jobs: - name: Prepare CLI executable run: chmod +x target/debug/wright - - name: Measure project + - name: Measure projects + env: + PROJECTS: ${{ matrix.projects }} run: | + set -euo pipefail target/debug/wright update provider opy - python3 benchmarks/metrics/metrics.py run --project "${{ matrix.project }}" \ - --repeats 1 --cli-repeats 1 --jobs 4 --wright target/debug/wright \ - --out "$RUNNER_TEMP/${{ matrix.project }}.json" - - - name: Upload shard run + mkdir -p "$RUNNER_TEMP/metrics-shards" + for project in $PROJECTS; do + python3 benchmarks/metrics/metrics.py run --project "$project" \ + --repeats 1 --cli-repeats 1 --jobs 4 --wright target/debug/wright \ + --out "$RUNNER_TEMP/metrics-shards/$project.json" + done + + - name: Upload shard runs uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2 with: - name: metrics-shard-${{ matrix.project }} - path: ${{ runner.temp }}/${{ matrix.project }}.json + name: metrics-shard-${{ matrix.shard }} + path: ${{ runner.temp }}/metrics-shards/*.json if-no-files-found: error metrics-drift: @@ -611,6 +613,9 @@ jobs: uses: wrightkit/.github/.github/actions/setup-rust@main with: toolchain: 1.97.1 + targets: wasm32-unknown-unknown + cache-shared-key: wasm-release + cache-save: ${{ github.ref == 'refs/heads/main' }} - name: Set up Node uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0 @@ -619,9 +624,6 @@ jobs: cache: npm cache-dependency-path: scripts/package-lock.json - - name: Add the wasm target - run: rustup target add wasm32-unknown-unknown - - name: Check generated core types are fresh run: | npm ci --prefix scripts diff --git a/Cargo.toml b/Cargo.toml index b94b6c56..c278fe99 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -41,9 +41,17 @@ debug = 1 [profile.dev.package."*"] debug = false +# workshop-rs builds with opt-level 1 in its own repository. Unoptimized, +# its source-offset scan made the 17k-element compile test take about 135 s. +[profile.dev.package.workshop-rs] +opt-level = 1 + [profile.test] debug = 1 [profile.test.package."*"] debug = false +[profile.test.package.workshop-rs] +opt-level = 1 + diff --git a/scripts/test-ci-jobs.py b/scripts/test-ci-jobs.py index 45e24b06..3b5680a5 100644 --- a/scripts/test-ci-jobs.py +++ b/scripts/test-ci-jobs.py @@ -21,7 +21,10 @@ def test_actual_dependencies_match_gating_jobs(self): self.assertFalse(required["cli-behavior"]) self.assertNotIn("benchmark", required) self.assertNotIn("metrics-latency", required) - self.assertTrue(required["workflow-lint"]) + self.assertFalse(required["workflow-lint"]) + self.assertTrue( + ci_jobs.required_jobs(self.workflow, {"workflows": "true"})["workflow-lint"] + ) def test_missing_dependency_fails(self): self.workflow["jobs"]["ci-result"]["needs"].remove("cli-behavior") From c4ab42c4a5120a5f5a15273a38019eb0727474f3 Mon Sep 17 00:00:00 2001 From: Teakowa <27560638+Teakowa@users.noreply.github.com> Date: Sun, 1 Nov 2026 18:04:28 +0800 Subject: [PATCH 2/7] ci: use the .github speed-up branch until it merges --- .github/workflows/ci.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7b4ae48a..7b3437d3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -20,7 +20,7 @@ jobs: name: Workflow lint needs: paths if: needs.paths.outputs.workflows == 'true' - uses: wrightkit/.github/.github/workflows/actionlint.yml@main + uses: wrightkit/.github/.github/workflows/actionlint.yml@ci/speed-up paths: name: Detect paths @@ -107,7 +107,7 @@ jobs: name: Rust (stable) needs: paths if: needs.paths.outputs.rust_core == 'true' - uses: wrightkit/.github/.github/workflows/rust-quality.yml@main + uses: wrightkit/.github/.github/workflows/rust-quality.yml@ci/speed-up with: toolchain: 1.97.1 cache-shared-key: linux-quality-stable-dev-test @@ -124,7 +124,7 @@ jobs: uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Set up Rust - uses: wrightkit/.github/.github/actions/setup-rust@main + uses: wrightkit/.github/.github/actions/setup-rust@ci/speed-up with: toolchain: 1.97.1 cache-shared-key: linux-quality-stable-dev-test @@ -259,7 +259,7 @@ jobs: uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Set up Rust - uses: wrightkit/.github/.github/actions/setup-rust@main + uses: wrightkit/.github/.github/actions/setup-rust@ci/speed-up with: toolchain: 1.97.1 cache-shared-key: linux-quality-stable-dev-test @@ -292,7 +292,7 @@ jobs: uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Set up Rust - uses: wrightkit/.github/.github/actions/setup-rust@main + uses: wrightkit/.github/.github/actions/setup-rust@ci/speed-up with: toolchain: 1.97.1 cache-shared-key: linux-quality-stable-dev-test @@ -498,7 +498,7 @@ jobs: uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Set up Rust - uses: wrightkit/.github/.github/actions/setup-rust@main + uses: wrightkit/.github/.github/actions/setup-rust@ci/speed-up with: toolchain: 1.97.1 cache-shared-key: dist-validation-${{ runner.os }}-stable-dev @@ -610,7 +610,7 @@ jobs: uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Set up Rust - uses: wrightkit/.github/.github/actions/setup-rust@main + uses: wrightkit/.github/.github/actions/setup-rust@ci/speed-up with: toolchain: 1.97.1 targets: wasm32-unknown-unknown From 23306f8f944ae9a45455077566a84eb603579e10 Mon Sep 17 00:00:00 2001 From: Teakowa <27560638+Teakowa@users.noreply.github.com> Date: Sun, 1 Nov 2026 18:16:46 +0800 Subject: [PATCH 3/7] ci: TEMP seed the wasm cache from the PR --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7b3437d3..19ca14a6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -615,7 +615,7 @@ jobs: toolchain: 1.97.1 targets: wasm32-unknown-unknown cache-shared-key: wasm-release - cache-save: ${{ github.ref == 'refs/heads/main' }} + cache-save: true # TEMP: seed in the PR to measure - name: Set up Node uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0 From 6f569528297b0ef944320f71aab3242a0fe0e483 Mon Sep 17 00:00:00 2001 From: Teakowa <27560638+Teakowa@users.noreply.github.com> Date: Sun, 1 Nov 2026 18:41:06 +0800 Subject: [PATCH 4/7] perf(ci): optimize workshop-rs at opt-level 2, save the wasm cache from main only At opt-level 1 the 17k-element compile test still took 54 s locally; at 2 it takes 27 s. --- .github/workflows/ci.yml | 2 +- Cargo.toml | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 19ca14a6..7b3437d3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -615,7 +615,7 @@ jobs: toolchain: 1.97.1 targets: wasm32-unknown-unknown cache-shared-key: wasm-release - cache-save: true # TEMP: seed in the PR to measure + cache-save: ${{ github.ref == 'refs/heads/main' }} - name: Set up Node uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0 diff --git a/Cargo.toml b/Cargo.toml index c278fe99..50ddc347 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -41,10 +41,10 @@ debug = 1 [profile.dev.package."*"] debug = false -# workshop-rs builds with opt-level 1 in its own repository. Unoptimized, +# workshop-rs is optimized here because, unoptimized, # its source-offset scan made the 17k-element compile test take about 135 s. [profile.dev.package.workshop-rs] -opt-level = 1 +opt-level = 2 [profile.test] debug = 1 @@ -53,5 +53,5 @@ debug = 1 debug = false [profile.test.package.workshop-rs] -opt-level = 1 +opt-level = 2 From d23e29a7c31fea853dbd9a6f6b49df8dc1843868 Mon Sep 17 00:00:00 2001 From: Teakowa <27560638+Teakowa@users.noreply.github.com> Date: Sun, 1 Nov 2026 18:45:56 +0800 Subject: [PATCH 5/7] perf(ci): cache dependency artifacts for the dist builds The Windows and macOS dist builds compiled every dependency from scratch on each run (2 m 26 s and 1 m 57 s) and were the longest path of the workflow. --- .github/workflows/ci.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7b3437d3..0332c8de 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -501,9 +501,8 @@ jobs: uses: wrightkit/.github/.github/actions/setup-rust@ci/speed-up with: toolchain: 1.97.1 - cache-shared-key: dist-validation-${{ runner.os }}-stable-dev - cache-targets: false - cache-save: ${{ github.ref == 'refs/heads/main' }} + cache-shared-key: dist-build-${{ runner.os }}-stable-dev + cache-save: true # TEMP: seed in the PR to measure - name: Build CLI and LSP shell: bash From c2d1c325a1eafc62344b2d2f24d9041151adad91 Mon Sep 17 00:00:00 2001 From: Teakowa <27560638+Teakowa@users.noreply.github.com> Date: Sun, 1 Nov 2026 18:56:09 +0800 Subject: [PATCH 6/7] ci: save the dist build cache from main only --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0332c8de..22f2d398 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -502,7 +502,7 @@ jobs: with: toolchain: 1.97.1 cache-shared-key: dist-build-${{ runner.os }}-stable-dev - cache-save: true # TEMP: seed in the PR to measure + cache-save: ${{ github.ref == 'refs/heads/main' }} - name: Build CLI and LSP shell: bash From 9d710b4e8ee5a2ebe172045ae983fd4b5554709e Mon Sep 17 00:00:00 2001 From: Teakowa <27560638+Teakowa@users.noreply.github.com> Date: Sun, 1 Nov 2026 20:15:52 +0800 Subject: [PATCH 7/7] ci: reference the shared workflows on main again --- .github/workflows/ci.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 22f2d398..c7f0000f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -20,7 +20,7 @@ jobs: name: Workflow lint needs: paths if: needs.paths.outputs.workflows == 'true' - uses: wrightkit/.github/.github/workflows/actionlint.yml@ci/speed-up + uses: wrightkit/.github/.github/workflows/actionlint.yml@main paths: name: Detect paths @@ -107,7 +107,7 @@ jobs: name: Rust (stable) needs: paths if: needs.paths.outputs.rust_core == 'true' - uses: wrightkit/.github/.github/workflows/rust-quality.yml@ci/speed-up + uses: wrightkit/.github/.github/workflows/rust-quality.yml@main with: toolchain: 1.97.1 cache-shared-key: linux-quality-stable-dev-test @@ -124,7 +124,7 @@ jobs: uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Set up Rust - uses: wrightkit/.github/.github/actions/setup-rust@ci/speed-up + uses: wrightkit/.github/.github/actions/setup-rust@main with: toolchain: 1.97.1 cache-shared-key: linux-quality-stable-dev-test @@ -259,7 +259,7 @@ jobs: uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Set up Rust - uses: wrightkit/.github/.github/actions/setup-rust@ci/speed-up + uses: wrightkit/.github/.github/actions/setup-rust@main with: toolchain: 1.97.1 cache-shared-key: linux-quality-stable-dev-test @@ -292,7 +292,7 @@ jobs: uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Set up Rust - uses: wrightkit/.github/.github/actions/setup-rust@ci/speed-up + uses: wrightkit/.github/.github/actions/setup-rust@main with: toolchain: 1.97.1 cache-shared-key: linux-quality-stable-dev-test @@ -498,7 +498,7 @@ jobs: uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Set up Rust - uses: wrightkit/.github/.github/actions/setup-rust@ci/speed-up + uses: wrightkit/.github/.github/actions/setup-rust@main with: toolchain: 1.97.1 cache-shared-key: dist-build-${{ runner.os }}-stable-dev @@ -609,7 +609,7 @@ jobs: uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Set up Rust - uses: wrightkit/.github/.github/actions/setup-rust@ci/speed-up + uses: wrightkit/.github/.github/actions/setup-rust@main with: toolchain: 1.97.1 targets: wasm32-unknown-unknown