diff --git a/demo/performance/README.md b/demo/performance/README.md index 4ad4f289..ea41b91c 100644 --- a/demo/performance/README.md +++ b/demo/performance/README.md @@ -92,6 +92,13 @@ the full profiles. The set of profiles is part of the `performance_smoke` reuse key, so a glow-only success never stands in for a run that needed the isometric profile. +The interaction profile keeps strict per-series, Long Task, heap, cache and +structural limits. Its aggregate `interactionSeriesMs` ceiling is 3300 ms: +enough headroom for the observed hosted-runner baseline (up to 3122.6 ms), but +still below the known failed pre-optimization result (3501.5 ms). This aggregate +is a catastrophic guard; the full workflow's base-relative comparison remains +the detector for smaller regressions. + The dedicated `performance.yml` workflow is the full comparison. It runs on every `main` promotion, weekly and on manual dispatch for an important beta or performance-sensitive change. It checks out the candidate and its base SHA, diff --git a/demo/performance/budgets-interaction-smoke.json b/demo/performance/budgets-interaction-smoke.json index 38c03270..cdcc7aff 100644 --- a/demo/performance/budgets-interaction-smoke.json +++ b/demo/performance/budgets-interaction-smoke.json @@ -13,7 +13,7 @@ }, "interactionSeriesMs": { "stat": "median", - "hardMaxMs": 3000 + "hardMaxMs": 3300 }, "hoverSeriesMs": { "stat": "median", diff --git a/demo/performance/budgets-large-house-interaction.json b/demo/performance/budgets-large-house-interaction.json index 8ccfcd10..9b85f748 100644 --- a/demo/performance/budgets-large-house-interaction.json +++ b/demo/performance/budgets-large-house-interaction.json @@ -19,7 +19,7 @@ "stat": "median", "maxRegressionRatio": 0.5, "noiseAllowanceMs": 150, - "hardMaxMs": 3000 + "hardMaxMs": 3300 }, "hoverSeriesMs": { "stat": "median", diff --git a/test/performance-budget.test.mjs b/test/performance-budget.test.mjs index bbedf049..a66b545a 100644 --- a/test/performance-budget.test.mjs +++ b/test/performance-budget.test.mjs @@ -245,3 +245,14 @@ for (const [smokeName, fullName] of [ 'первый кадр 9 870 мс обязан краснеть'); }); } + +test('interaction aggregate keeps hosted-runner headroom without weakening component gates (#483)', () => { + const smoke = readBudget('budgets-interaction-smoke.json'); + const full = readBudget('budgets-large-house-interaction.json'); + assert.equal(smoke.timings.interactionSeriesMs.hardMaxMs, 3300); + assert.equal(full.timings.interactionSeriesMs.hardMaxMs, 3300); + assert.equal(smoke.timings.hoverSeriesMs.hardMaxMs, 500); + assert.equal(smoke.timings.panSeriesMs.hardMaxMs, 500); + assert.equal(smoke.timings.cameraSeriesMs.hardMaxMs, 500); + assert.equal(smoke.timings.editorSeriesMs.hardMaxMs, 750); +});