Skip to content

Commit 1c2466d

Browse files
committed
ci: park perf-nightly to dispatch and stop the coverage-gate cascade double-red (#1781 A3, A5)
A3: perf-nightly writes a report and compares nothing, so it structurally cannot catch a regression. iOS wall-clock medians swing up to +122% night-to-night at n=5 (a comparator would print noise), no doc/issue reads the report, and the iOS job holds a macOS runner ~22min nightly. Parked to workflow_dispatch following the #1781 A1 pattern (replays-manual.yml); it declares no gate-manifest check, so no declarations.ts change is needed. `pnpm perf` / scripts/perf are untouched. A5: the "Enforce changed-line coverage gate" step ran `if: always()`, so when the preceding "Run coverage" step failed, lcov.info was never written and this step failed too with "no lcov report" -- a cascade double-red, not a coverage verdict. 16 of the last 17 red instances (60d) were this cascade; the step now runs only when Run coverage succeeded.
1 parent 4bba404 commit 1c2466d

2 files changed

Lines changed: 10 additions & 8 deletions

File tree

‎.github/workflows/ci.yml‎

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -339,6 +339,7 @@ jobs:
339339
with: { gate: coverage-model }
340340

341341
- name: Run coverage
342+
id: run-coverage
342343
env:
343344
OUTPUT_ECONOMY_BASE: ${{ github.event_name == 'pull_request' && github.event.pull_request.base.sha || github.event.before }}
344345
uses: ./.github/actions/run-gate
@@ -355,8 +356,11 @@ jobs:
355356
# and fails when changed-line coverage < the threshold in
356357
# scripts/coverage-changed/model.ts. The `coverage-waiver` PR label maps to
357358
# the waiver env, which skips the failure but still prints the numbers.
359+
# Gated on the coverage step's own outcome (#1781 A5): when `Run coverage`
360+
# fails, lcov.info is never written, so this step would just re-report that
361+
# failure as its own red ("no lcov report") instead of a coverage verdict.
358362
- name: Enforce changed-line coverage gate
359-
if: always() && github.event_name == 'pull_request'
363+
if: steps.run-coverage.outcome == 'success' && github.event_name == 'pull_request'
360364
env:
361365
AGENT_DEVICE_COVERAGE_WAIVER: ${{ contains(github.event.pull_request.labels.*.name, 'coverage-waiver') }}
362366
uses: ./.github/actions/run-gate

‎.github/workflows/perf-nightly.yml‎

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
name: Perf Nightly
22

3-
# End-to-end command perf benchmark (scripts/perf). Scheduled + manual only — perf timing on
4-
# shared CI runners is noisy, so treat this as a trend/regression signal, not absolute numbers.
5-
# Reuses the same build artifacts as the device suites: the cached iOS XCUITest runner
6-
# (setup-apple-runner-build, ios-runner-prebuilt cache) and the Android replay host, and runs the CLI
7-
# from source via --experimental-strip-types (no dist build), matching the replay workflows.
3+
# Parked to workflow_dispatch by #1781 A3: it only writes a report and compares nothing, so it
4+
# structurally cannot catch a regression, and iOS wall-clock medians swing up to +122%
5+
# night-to-night at n=5 with no consumer reading the report. `pnpm perf` / scripts/perf are
6+
# unaffected — still runnable on demand. Un-park once a comparison step with multi-night
7+
# smoothing (someone reading it) exists, or a perf arc needs nightly data.
88

99
on:
10-
schedule:
11-
- cron: '0 4 * * *'
1210
workflow_dispatch:
1311
inputs:
1412
rounds:

0 commit comments

Comments
 (0)