From d7ccca0bd7183f3bbe9ae6f60932389aba74d804 Mon Sep 17 00:00:00 2001 From: Joao Paulo Furtado Date: Sun, 4 Oct 2026 13:36:58 -0700 Subject: [PATCH] ci: allow eight hosted template legs concurrently --- .github/workflows/ci.yml | 4 ++-- ...RD-483-impact-driven-ci-without-repeated-template-setup.md | 3 ++- scripts/__tests__/ci-structure.spec.ts | 4 +++- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d5dff77668..ddceeb7f8a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -786,10 +786,10 @@ jobs: needs: [scope, build-artifacts] if: ${{ (needs.scope.outputs.selection == 'full' || needs.scope.outputs.selection == 'template') }} # One scaffold/install/typecheck/cook per template. Every nonvisual scenario still executes; - # splitting identical setup across 29 jobs wastes scarce slots at max-parallel 4. + # Keep one leg per selected kit; eight hosted legs may run together without changing coverage. strategy: fail-fast: false - max-parallel: 4 + max-parallel: 8 matrix: ${{ fromJSON(needs.scope.outputs.plan).templateMatrix }} # Hosted on purpose: template legs use hosted while the balancer routes builds and tests # to the local pool, avoiding one routing variable sending the whole burst to a single pool. diff --git a/docs/PRDs/CI/PRD-483-impact-driven-ci-without-repeated-template-setup.md b/docs/PRDs/CI/PRD-483-impact-driven-ci-without-repeated-template-setup.md index 825cefc034..359c60aa1f 100644 --- a/docs/PRDs/CI/PRD-483-impact-driven-ci-without-repeated-template-setup.md +++ b/docs/PRDs/CI/PRD-483-impact-driven-ci-without-repeated-template-setup.md @@ -14,6 +14,7 @@ prd_contract: v1 then whether retained tests apply now. Docs-only skips product tests. CI configuration proves its routing/contracts. Native runs for native and shared runtime consumers. Unknown meaningful inputs keep full coverage. No settings, credentials, runners or concurrency changes. +- João, 2026-10-04 follow-up: allow up to eight existing hosted template legs at once; preserve selected coverage, fail-fast false, runner routing and timeouts. This separately authorized cap change does not alter the original cleanup decision or historical measurements. - Exhaustive template scenarios remain on broad changes, main qualification and scheduled audits. Exact kit changes run the affected kits; shared generator/render sources keep exhaustive fanout in this tranche. Narrowing shared sources further needs a proved dependency boundary. @@ -46,7 +47,7 @@ There are 13 kit manifests, not a hardcoded CI count. | One kit | 4 full unit shards + 31 template jobs / full board | 1 scaffolder-contract unit job + 2 template jobs / same | | Shared runtime, generator, unknown meaningful code; main/nightly | exhaustive 31 template jobs | exhaustive 13 scenario jobs + 2 journey jobs | -The template cap stays four. Baseline's nonvisual slot-work lower bound is 94.6 / 4 = 23.6 minutes; +The hosted template cap is eight; selected kits and scenarios are unchanged. The historical baseline at cap four had a nonvisual slot-work lower bound of 94.6 / 4 = 23.6 minutes; removing 16 repeated setups at the workflow's documented ~65s estimates 17.3 runner-min saved, retaining both existing golden journeys. That gives ~83.6 template runner-min, an estimate, not measured after-change wall time. Individual exhaustive template jobs will be longer (shooter diff --git a/scripts/__tests__/ci-structure.spec.ts b/scripts/__tests__/ci-structure.spec.ts index 8fe0d0c579..418b8f8d67 100644 --- a/scripts/__tests__/ci-structure.spec.ts +++ b/scripts/__tests__/ci-structure.spec.ts @@ -1762,7 +1762,9 @@ describe("CI pipeline structure", () => { expect(lane).toContain('for scenario in "${scenarios[@]}"'); expect(lane).toContain('test "${#scenarios[@]}" -gt 0'); expect(lane).not.toContain("SHARD"); - expect(lane).toContain("max-parallel: 4"); + expect(lane).toContain("max-parallel: 8"); + expect(lane).toContain("fail-fast: false"); + expect(lane).toContain("runs-on: ubuntu-24.04"); }); it("preserves platformer's unique production artifact in its installed scenario job", async () => {