feat(#575): capture the cloud E2E baseline before it becomes unrecoverable - #593
Open
TortoiseWolfe wants to merge 1 commit into
Open
feat(#575): capture the cloud E2E baseline before it becomes unrecoverable#593TortoiseWolfe wants to merge 1 commit into
TortoiseWolfe wants to merge 1 commit into
Conversation
…rable #575 moves E2E onto a per-runner ephemeral Supabase. That switch is only safe if the local suite runs THE SAME TESTS, and nothing in the repo could express what "the same tests" means. Captured from run 31048279017 (SHA de0f7f0), the last green cloud run — 66 minutes before #567 exhausted the quota: 2001 tests, 1807 expected, 194 skipped, 0 flaky, across {chromium,firefox,webkit} x {gen,msg,msg-iso}. WHY NOW. The source artifacts expire 2026-08-12T22:13Z, and the next cloud run that could regenerate them is impossible until the quota refills 2026-09-02. The obvious fallback does not work: the `github` reporter only annotates FAILURES, so this green run left 6 check-run annotations, not 2001. Measured, not assumed. IDENTITIES, NOT COUNTS. A suite can drop one test, gain another, and still total 2001. That matters concretely: 228 tests — all 76 *-msg-iso per browser — sit behind `test.skip(!fixture, 'isolation seed failed')`, and seedIsolatedAdmin (test-user-factory.ts:2761-2772) returns null on two silent paths before its loud throw. If a local stack cannot seed them, all 228 skip quietly and the run is green. A count gate waves that through. The comparison is directional: expected->skipped or a missing test is coverage LOST and fails; expected->unexpected/flaky fails; skipped->expected is a gain, reported and allowed, because a local stack can legitimately run what cloud could not. VERIFIED BY MAKING IT FAIL. `--selftest` mutates the baseline four ways and asserts rejection, including the same-count-different-tests case. 12 node:test cases run under `pnpm test:scripts` in ci.yml (134 pass, 0 fail). CLI exit codes checked without a pipe, since `| tail` eats them: 2 on no args, 0 on the real report, 1 on a mutated one. Three of the numbers I had been quoting were wrong before this landed, which is the argument for the file: the baseline is now asserted in a test rather than repeated in prose. Refs #575 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Groundwork for #575, landed separately because it is time-critical in a way the rest
of the port is not.
The problem
#575 moves E2E onto a per-runner ephemeral Supabase. That is only safe if the local suite
runs the same tests as the cloud suite did — and nothing in this repo could express
what "the same tests" means. There was no artifact to compare against.
What this captures
Run 31048279017,
SHA
de0f7f0— the last green cloud E2E run, 66 minutes before #567 exhausted thequota:
{chromium,firefox,webkit}×{gen 585, msg 6, msg-iso 76}Why it had to happen today
2026-09-02.
githubreporter only annotatesfailures, so this green run left 6 check-run annotations, not 2001. Checked
rather than assumed — an earlier review confidently proposed annotations as the
recovery path, and it was wrong.
Identities, not counts
A suite can drop one test, gain another, and still total 2001.
That is not hypothetical here. 228 tests — all 76
*-msg-isoper browser — sit behindtest.skip(!fixture, 'isolation seed failed…'), andseedIsolatedAdmin(
tests/e2e/utils/test-user-factory.ts:2761-2772) returnsnullon two silent pathsbefore it reaches its loud
throw. If a local stack cannot seed those fixtures, all 228skip quietly and the run reports green. A count-based gate waves that straight through.
So
scripts/e2e-parity-diff.mjscompares per-test identities, directionally:expected → skippedexpected → unexpected/flakyskipped → expectedThe last row is deliberate: a local stack can legitimately run something the cloud project
could not. At least one case is already known —
debug/capture-decryption-logs.spec.tsskips on cloud and should run locally — so a smallgainedset is expected, not a bug.Verified by making it fail
Per the repo's own rule that a probe which cannot fail proves nothing:
--selftestmutates the baseline four ways and asserts rejection each time, includingthe same-count-different-tests case.
node:testcases inscripts/__tests__/e2e-parity-diff.test.js, run bypnpm test:scriptsinci.yml. Suite: 134 pass, 0 fail.| taileats them:2on no args,0on the real report,
1on a mutated one.regeneration cannot slip past.
Round-tripped: the real 35.9 MB merged cloud report diffs clean against the manifest
derived from it.
Two corrections to the record
Both were things I had stated as fact earlier in #575 and got wrong:
webkit. Eleven are browser-keyed and port cleanly; the rest are environment-keyed (66
admin-dashboard, 27 avatar upload, 54 payment) and could flip on a different backend in
either direction.
e2e-local.ymldoes not exist atde0f7f0. "Run it on that SHA" needs a mergebranch pairing the workflow with that commit's test code — noted here so the next step
does not trip on it.
What this does not do
No workflow changes.
e2e.ymlis untouched and still points at cloud. This is only themeasuring stick — widening
e2e-local.ymlto the full 24-job matrix is the next PR, and itnow has something to be judged against.
Refs #575
🤖 Generated with Claude Code