From 1cdc53d47a433eaa25de997d3b2191bae78ef380 Mon Sep 17 00:00:00 2001 From: Neil <4138956+nwparker@users.noreply.github.com> Date: Wed, 4 Nov 2026 22:47:35 -0800 Subject: [PATCH] refactor(ci): colocate the shard timing catalog with sharding (#38409) --- config/scripts/check-path-literal-ratchet.mjs | 2 +- config/scripts/check-path-literal-ratchet.test.mjs | 2 +- config/scripts/ci/sharding/ci-shard-assignment.mjs | 2 +- config/scripts/{ => ci/sharding}/ci-shard-timings.json | 0 config/scripts/ci/sharding/ci-shard-timings.md | 6 +++--- .../orcad-terminal-smoke-change-scope.test.mjs | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) rename config/scripts/{ => ci/sharding}/ci-shard-timings.json (100%) diff --git a/config/scripts/check-path-literal-ratchet.mjs b/config/scripts/check-path-literal-ratchet.mjs index 2ff342aeb39..89bfb9af700 100644 --- a/config/scripts/check-path-literal-ratchet.mjs +++ b/config/scripts/check-path-literal-ratchet.mjs @@ -14,7 +14,7 @@ const SCAN_ROOTS = ['config', '.github', 'tests'] const SOURCE_ROOTS = 'main|renderer|shared|cli|preload|packages|types|wsl-guest' const RESOLVED_EXTENSIONS = ['.ts', '.tsx', '.js', '.mjs', '.cjs', '/index.ts'] // Generated timings; a stale row only skews shard balance and is rewritten by its generator. -const EXCLUDED_FILES = new Set(['config/scripts/ci-shard-timings.json']) +const EXCLUDED_FILES = new Set(['config/scripts/ci/sharding/ci-shard-timings.json']) const GATE_MANIFEST = 'config/reliability-gates.jsonc' // Command strings in manifests and scripts name paths unquoted; in code only quoted literals count. const UNQUOTED_ALLOWED = /\.(?:jsonc?|ya?ml|sh|ps1)$/ diff --git a/config/scripts/check-path-literal-ratchet.test.mjs b/config/scripts/check-path-literal-ratchet.test.mjs index df2d66cbcdd..a78d000ccb0 100644 --- a/config/scripts/check-path-literal-ratchet.test.mjs +++ b/config/scripts/check-path-literal-ratchet.test.mjs @@ -91,7 +91,7 @@ describe('isScannedPath', () => { expect(isScannedPath('tests/e2e/ssh-orcad-terminal-journeys.spec.ts')).toBe(true) expect(isScannedPath('config/scripts/pr-e2e-source-routing.test.mjs')).toBe(false) expect(isScannedPath('tests/e2e/helpers/pr-comments-sidebar-fixture.ts')).toBe(false) - expect(isScannedPath('config/scripts/ci-shard-timings.json')).toBe(false) + expect(isScannedPath('config/scripts/ci/sharding/ci-shard-timings.json')).toBe(false) expect(isScannedPath('config/patches/foo.patch')).toBe(false) }) }) diff --git a/config/scripts/ci/sharding/ci-shard-assignment.mjs b/config/scripts/ci/sharding/ci-shard-assignment.mjs index 2b76c9a685f..2bdc7a5ad5d 100644 --- a/config/scripts/ci/sharding/ci-shard-assignment.mjs +++ b/config/scripts/ci/sharding/ci-shard-assignment.mjs @@ -48,7 +48,7 @@ export function balanceFiles(files, count, timings, overheadMs = 0) { } export function readTimingBaseline(suite) { - const bytes = readFileSync(new URL('../../ci-shard-timings.json', import.meta.url), 'utf8') + const bytes = readFileSync(new URL('./ci-shard-timings.json', import.meta.url), 'utf8') const baseline = JSON.parse(bytes) return { ...baseline[suite], baselineSha256: createHash('sha256').update(bytes).digest('hex') } } diff --git a/config/scripts/ci-shard-timings.json b/config/scripts/ci/sharding/ci-shard-timings.json similarity index 100% rename from config/scripts/ci-shard-timings.json rename to config/scripts/ci/sharding/ci-shard-timings.json diff --git a/config/scripts/ci/sharding/ci-shard-timings.md b/config/scripts/ci/sharding/ci-shard-timings.md index d1f89129b64..3264867990a 100644 --- a/config/scripts/ci/sharding/ci-shard-timings.md +++ b/config/scripts/ci/sharding/ci-shard-timings.md @@ -68,7 +68,7 @@ baseline. Runs from before the fixes are not comparable, because their `pty-subp files still carried 5-second waits. ```sh -node config/scripts/ci/sharding/ci-unit-timing-import.mjs RUN_DIR... config/scripts/ci-shard-timings.json +node config/scripts/ci/sharding/ci-unit-timing-import.mjs RUN_DIR... config/scripts/ci/sharding/ci-shard-timings.json ``` Each directory holds one run's twelve `unit-shard-node-*` artifacts. Every run is validated @@ -217,7 +217,7 @@ API, source workflow/config, report provenance and exact file coverage against t saved assignments, then run: ```sh -node config/scripts/ci/sharding/ci-unit-timing-import.mjs ARTIFACT_DIRECTORY config/scripts/ci-shard-timings.json +node config/scripts/ci/sharding/ci-unit-timing-import.mjs ARTIFACT_DIRECTORY config/scripts/ci/sharding/ci-shard-timings.json ``` The importer rejects missing or duplicate shards, duplicate files, failed unit reports, @@ -234,7 +234,7 @@ job IDs from the Actions jobs API and fetch each with lanes or multiple attempts. Then run: ```sh -node config/scripts/ci/sharding/ci-shard-timing-import.mjs LOG_DIRECTORY UNIT_RUN_ID E2E_RUN_ID config/scripts/ci-shard-timings.json +node config/scripts/ci/sharding/ci-shard-timing-import.mjs LOG_DIRECTORY UNIT_RUN_ID E2E_RUN_ID config/scripts/ci/sharding/ci-shard-timings.json ``` The initial source logs are in `/tmp/orca-ci-shard-logs`; two were reused from diff --git a/config/scripts/orcad-distribution/qualification/orcad-terminal-smoke-change-scope.test.mjs b/config/scripts/orcad-distribution/qualification/orcad-terminal-smoke-change-scope.test.mjs index df77a4ed87e..38467b2f93d 100644 --- a/config/scripts/orcad-distribution/qualification/orcad-terminal-smoke-change-scope.test.mjs +++ b/config/scripts/orcad-distribution/qualification/orcad-terminal-smoke-change-scope.test.mjs @@ -65,7 +65,7 @@ describe('the actual terminal smoke dependency graph', () => { it.each([ 'src/renderer/src/components/Example.tsx', 'src/main/menu/register-app-menu.ts', - 'config/scripts/ci-shard-timings.json', + 'config/scripts/ci/sharding/ci-shard-timings.json', '.github/workflows/e2e.yml', 'docs/reference/ci-runner-efficiency.md' ])('skips unrelated inputs: %s', async (file) => {