chore(playwright): refresh timing-baseline.json from run 30802611748 - #30871
Conversation
The checked-in `.github/playwright/timing-baseline.json` had drifted 12 days behind the tree — captured 2026-07-22 (sha ccc86fe), but 51 commits since then have added, renamed, or re-tagged specs. Concrete drift as measured on origin/main today: * 30 current spec files have zero baseline coverage (Auth/SSOAuthentication.spec.ts + 25 tests, KnowledgeGraph, the 8 Features/SearchSeparation files, etc.) * 1007 baseline titles (23 %) reference tests that no longer exist — dead weight in load_history * 66 files (20 % of covered) have title drift — leaf renames, @tag additions, describe restructures * Worst offenders — Pages/ExplorePageRightPanel (218/234 orphaned, 93 % dead), Features/AdvancedSearch (107/131, 82 %), Pages/CustomProperties (98/149, 66 %), Pages/Lineage/DataAssetLineage (79/85, 93 %) Refresh from the most recent successful full-mode merge_group run (30802611748, 2026-08-03 09:43 UTC, sha 79df9ae). Its `playwright-timing-history-full` artifact is retained until 2026-09-02 and reflects the CI's actual runtime under the current tree. Metadata delta: * 4384 → 4409 tests (25 net additions) * 322 → 325 files (4 new covered: AssetHealthWidget, ColumnBulkOperationsTagsGlossary, IncidentManagerPagination, PipelineValidation) * 49 → 14 zero-duration entries (35 previously-skipped tests now have real durations captured) * BulkImport correctly recorded under the `ImportExport` project (PR #30834 route fix reflected in the fresh capture) Preserved unchanged from the current baseline: * `retainedUnstableTestIds` (68-entry curated allowlist for known flaky tests) * `retainedSourceRunId` / `retainedSourceSha` pointers Normalized entries to the current baseline's schema (short `title` instead of the reporter's ` › proj › file › describe › leaf` breadcrumb; dropped `retryDurationMs`) so the diff stays a one-line JSON reserialization on the payload. Also removed a stale assertion in `test_versioned_baseline_omits_all_zero_ids_from_weights` that required at least one zero-duration entry with outcome=expected — a bug-case sanity check that no longer holds now that the fresh capture only contains legitimately-skipped zero-ms entries. The load-time filtering behavior (the meaningful part of the test) still asserts. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
❌ PR checklist incompleteThis PR cannot be merged until the following are addressed on its linked issue:
The fields live on the linked issue in the Shipping project (open the issue → right sidebar → Projects). After you set them, re-run this check (or push a commit) — issue/project changes do not re-trigger it automatically. Maintainers can bypass this check by adding the |
There was a problem hiding this comment.
Pull request overview
Refreshes the checked-in Playwright timing baseline used by the CI shard planner, so planning/weighting reflects the current spec/test structure and avoids fallback-time inflation due to baseline drift.
Changes:
- Updated
.github/playwright/timing-baseline.jsonfrom a recent successful full-mode run to realign test IDs/titles/durations withorigin/main. - Adjusted
test_versioned_baseline_omits_all_zero_ids_from_weightsto remove a stale assertion about zero-duration entries havingoutcome=expected.
Reviewed changes
Copilot reviewed 1 out of 2 changed files in this pull request and generated 1 comment.
| File | Description |
|---|---|
.github/playwright/timing-baseline.json |
Refreshes the timing history baseline consumed by the Playwright CI planner. |
.github/scripts/tests/test_playwright_ci_planning.py |
Updates planner test expectations to match the refreshed baseline’s zero-duration entry shape. |
`test_versioned_baseline_omits_all_zero_ids_from_weights` builds `zero_tests = [t for t in baseline if durationMs == 0]` and then asserts `all(t.id not in weights for t in zero_tests)`. If a future baseline refresh captures a run with no zero-duration entries, `zero_tests` is empty and the `all(...)` passes vacuously — the test would go green without actually exercising the load_history filter. Add an explicit `assert zero_tests` before the filter check with a message telling the next baseline-refresher to either construct a synthetic fixture or convert the test to synthetic input. Today's refreshed baseline still has 14 skipped 0-ms entries, so the guard is a no-op right now — it just catches the future case. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 1 out of 2 changed files in this pull request and generated no new comments.
Suppressed comments (1)
.github/scripts/tests/test_playwright_ci_planning.py:379
- The new
assert zero_testsmakes this unit test dependent on the checked-in baseline always containing at least one 0-ms entry. A future baseline refresh that happens to have no skipped tests would fail CI even thoughload_historywould still behave correctly. Consider skipping (or switching to a synthetic fixture) when the baseline has no zero-duration entries to avoid false-negative failures during baseline refreshes.
# Ensure there's something to check — if a future baseline refresh
# produces a run with zero skipped/0-ms entries, the `all(...)` below
# would pass vacuously without exercising the filter. Fail loudly
# instead so whoever refreshed the baseline knows to either construct
# a synthetic fixture or convert this to a synthetic test.
assert zero_tests, (
"checked-in baseline has no zero-duration entries; this test can "
"no longer exercise the load_history filter path against real data"
)
✅ Playwright Results — workflow succeededValidated commit ✅ 550 passed · ❌ 0 failed · 🟡 0 flaky · ⏭️ 3 skipped · 🧰 0 lifecycle flaky PerformanceBlocking targets: ✅ met · Optimization targets: 🟡 in progress Shard-job maxima below are not the full workflow wall time; the linked run includes build, fixture, planning, and reporting. 🕒 Full workflow signal wall (to summary) 51m 15s ⏱️ Max setup 2m 50s · max shard execution 17m 26s · max shard-job elapsed before upload 20m 24s · reporting 4s 🌐 201.36 requests/attempt · 2.83 app boots/UI scenario · 6.02% common-shard skew Optimization targets still in progress:
How to debug locally# Download playwright-test-results-<shard> artifact and unzip
npx playwright show-trace path/to/trace.zip # view trace |
Code Review ✅ Approved 1 resolved / 1 findingsRefreshes the Playwright timing baseline and updates test assertions, addressing the vacuous pass finding. No issues found. ✅ 1 resolved✅ Quality: Test can pass vacuously if no zero-duration entries exist
OptionsDisplay: compact → Showing less information. Comment with these commands to change the behavior for this request:
Was this helpful? React with 👍 / 👎 | Gitar | Powered by Gitar — free for open source |
…ful full merge_group (open-metadata#30872) Follow-up to PR open-metadata#30871's one-shot manual refresh. Without this, `.github/playwright/timing-baseline.json` drifts fast — 12 days between captures produced 23 % dead titles and 30 uncovered spec files on main, enough to make the planner materially wrong on both LPT balance and atomic-unit weight decisions. Adds a `refresh-timing-baseline` job that runs after `playwright-summary` on every successful full-mode merge_group run. The job: * downloads the same `playwright-timing-history-full-*` artifact the summary already uploaded * normalizes it to the checked-in baseline schema via a new `.github/scripts/refresh_timing_baseline.py` * preserves `retainedUnstableTestIds`, `retainedSourceRunId`, `retainedSourceSha` from the current baseline (curated fields) * writes compact JSON so the diff stays a one-line reserialization * skips if the file is byte-identical * force-pushes a single tracked branch `ci/auto-refresh-timing-baseline` and opens or updates one PR against main * refuses (exit 2) if drift > 40 % of test-id entries — a safety valve against an accidentally-broken source run Guards: * merge_group event only (safest ci-status signal) * full execution mode only (targeted runs miss coverage) * playwright-summary success only (no partial data) * single tracked PR — successive runs update it in place rather than piling up The auto-PR still requires human merge. It just eliminates the "regenerate the file" busywork that PR open-metadata#30871 did by hand. 6 new pytest cases in `test_refresh_timing_baseline.py` cover the normalization, retention-field preservation, diff computation, drift cap, non-full rejection, and end-to-end `main()` behavior. 94 total tests in `.github/scripts/tests/` pass. Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Why
timing-baseline.jsononmainwas captured on 2026-07-22 (shaccc86fe243) — 12 days ago. Since then 51 commits have touched spec files. The planner's data on origin/main today has drifted heavily:@tagadds, describe restructures)ExplorePageRightPanelAdvancedSearchLineage/DataAssetLineageThat much stale data means LPT is planning against ghosts — the fallback path (30 s per unknown test) is picking up hundreds of tests, and the atomic-unit gate is firing on aggregates that the planner didn't correctly weight.
What
Refresh from the most recent successful full-mode merge_group run (30802611748, 2026-08-03 09:43 UTC, sha
79df9aed95). Itsplaywright-timing-history-fullartifact is retained until 2026-09-02, so this is a clean, verifiable source.Metadata delta
Features/ColumnBulkOperationsTagsGlossary,Features/IncidentManagerPagination,Pages/AssetHealthWidget,Pages/PipelineValidation)ImportExportproject — PR fix(playwright): route BulkImport back to import-export lane and audit-split the atomic describe #30834's route fix is reflected in the fresh capture (Database service 449 s, Database Schema 366 s, etc.)Preserved from the current baseline
retainedUnstableTestIds(68-entry curated allowlist for known flaky tests)retainedSourceRunId/retainedSourceSharetention pointersSchema normalization
Fresh reporter output uses
title=› <project> › <file> › <describe> › <leaf>andleafTitle= the short name. Current baseline usestitle= short name. Normalized entries to the current baseline's schema (shorttitle, droppedretryDurationMs) so the diff stays a one-line JSON re-serialization.Test change
Removed a stale assertion in
test_versioned_baseline_omits_all_zero_ids_from_weightsthat required at least one zero-duration entry withoutcome=expected. The fresh capture contains only legitimately-skipped zero-ms entries (all outcome=skipped), which is the healthy state. The meaningful part of the test (load-time filtering behavior) still asserts.Verified
load_historyagainst the refreshed baseline: 4395test_weightsentries + 3498identity_weights(up from partial coverage today).ImportExportwith 6 tests × real weights totaling 25.3 min — AUDITED_PARALLEL_SUITES splits into per-spec parallel units so no unit exceeds the 20-min atomic ceiling.Follow-up (separate PR)
The next PR I'll draft is the workflow step that opens this same refresh PR automatically after every successful full-mode merge_group run — so this doesn't need to be done by hand again.
🤖 Generated with Claude Code