@@ -309,11 +309,11 @@ jobs:
309309 - name : Sink commit-protocol tests
310310 run : bun --conditions=development test apps/cli/src/commands/export-pdf-sink.test.ts
311311
312- browser-export-harness :
312+ browser-export-assets :
313313 needs : changes
314314 if : needs.changes.outputs.proofMode == 'required' && needs.changes.outputs.browserHarness == 'true'
315315 runs-on : ubuntu-latest
316- timeout-minutes : 20
316+ timeout-minutes : 15
317317 steps :
318318 - uses : actions/checkout@v7
319319
@@ -343,21 +343,12 @@ jobs:
343343 ${{ runner.os }}-turbo-browser-
344344 ${{ runner.os }}-turbo-
345345
346- - name : Restore Playwright Chromium
347- uses : actions/cache@v6
348- with :
349- path : ~/.cache/ms-playwright
350- key : ${{ runner.os }}-playwright-chromium-1.55.0
351-
352346 - name : Install dependencies
353347 run : bun install --frozen-lockfile
354348
355349 - name : Provision pinned PDF fonts
356350 run : bun run fonts:ensure
357351
358- - name : Install Playwright Chromium
359- run : bunx playwright@1.55.0 install --with-deps chromium
360-
361352 - name : Type check browser export harness
362353 run : bun run typecheck:browser-export-harness
363354
@@ -370,29 +361,19 @@ jobs:
370361 - name : Assert conformance-case registry
371362 run : bun run assert:conformance-cases
372363
373- - name : Run browser export harness E2E
374- run : bun run test:browser-export-harness
375-
376364 - name : Build packed MV3 extension once
377365 run : bun run build:extension
378366
379- - name : Verify PDF.js worker in the built MV3 extension
380- run : bun run --cwd apps/extension test:worker-extension-browser:prebuilt
381-
382- - name : Verify durable export jobs in the built MV3 extension
383- run : bun run --cwd apps/extension test:jobs-extension-browser:prebuilt
384-
385- - name : Verify Research in the built MV3 extension
386- run : bun run --cwd apps/extension test:research-extension-browser:prebuilt
387-
388- - name : Verify Rovo visibility in the built MV3 extension
389- run : bun run --cwd apps/extension test:rovo-extension-browser:prebuilt
390-
391- - name : Verify action palette in the built MV3 extension
392- run : bun run --cwd apps/extension test:palette-extension-browser:prebuilt
393-
394- - name : Shape-parity gate
395- run : bun run check:parity
367+ - name : Upload prebuilt browser assets
368+ uses : actions/upload-artifact@v7
369+ with :
370+ name : browser-assets-${{ github.sha }}-${{ github.run_id }}-${{ github.run_attempt }}
371+ path : |
372+ apps/browser-export-harness/dist
373+ apps/extension/.output/chrome-mv3
374+ if-no-files-found : error
375+ include-hidden-files : true
376+ retention-days : 1
396377
397378 - name : Sanitize Turbo run summaries
398379 if : always()
@@ -412,6 +393,98 @@ jobs:
412393 if-no-files-found : error
413394 retention-days : 14
414395
396+ browser-export-harness :
397+ name : Browser evidence / ${{ matrix.lane }}
398+ needs : [changes, browser-export-assets]
399+ if : always() && needs.changes.outputs.proofMode == 'required' && needs.changes.outputs.browserHarness == 'true' && needs.browser-export-assets.result == 'success'
400+ strategy :
401+ fail-fast : false
402+ matrix :
403+ lane : [neutral-palette, research-worker-rovo, jobs]
404+ runs-on : ubuntu-latest
405+ timeout-minutes : 15
406+ env :
407+ ATLCLI_BROWSER_EVIDENCE_ROOT : ${{ github.workspace }}/.artifacts/browser-evidence
408+ # Shared GitHub runners record timing but do not enforce local/homelab
409+ # latency budgets. Functional, network, long-task, and size gates remain.
410+ ATLCLI_BROWSER_ASSERT_TIMING : " 0"
411+ steps :
412+ - uses : actions/checkout@v7
413+
414+ - name : Setup Bun
415+ uses : oven-sh/setup-bun@v2
416+ with :
417+ bun-version : 1.3.14
418+
419+ - name : Restore Bun package cache
420+ uses : actions/cache@v6
421+ with :
422+ path : ~/.bun/install/cache
423+ key : ${{ runner.os }}-bun-${{ hashFiles('bun.lock') }}
424+
425+ - name : Restore pinned PDF fonts
426+ uses : actions/cache@v6
427+ with :
428+ path : packages/pdf/.fonts
429+ key : ${{ runner.os }}-pdf-fonts-v1-${{ hashFiles('packages/pdf/src/runtime-assets.ts', 'packages/pdf/scripts/ensure-fonts.ts') }}
430+
431+ - name : Restore Playwright Chromium
432+ uses : actions/cache@v6
433+ with :
434+ path : ~/.cache/ms-playwright
435+ key : ${{ runner.os }}-playwright-chromium-1.55.0
436+
437+ - name : Install dependencies
438+ run : bun install --frozen-lockfile
439+
440+ - name : Provision pinned PDF fonts
441+ run : bun run fonts:ensure
442+
443+ - name : Install Playwright Chromium
444+ run : bunx playwright@1.55.0 install --with-deps chromium
445+
446+ - name : Download exact prebuilt browser assets
447+ uses : actions/download-artifact@v8
448+ with :
449+ name : browser-assets-${{ github.sha }}-${{ github.run_id }}-${{ github.run_attempt }}
450+ # upload-artifact stores both inputs relative to their common apps/
451+ # root, so restore that root explicitly in each isolated runner.
452+ path : apps
453+
454+ - name : Verify prebuilt browser assets
455+ run : |
456+ test -d apps/browser-export-harness/dist
457+ test -f apps/extension/.output/chrome-mv3/manifest.json
458+
459+ - name : Run isolated browser lane
460+ run : bun scripts/ci/run-browser-lane.ts "${{ matrix.lane }}"
461+
462+ - name : Validate synthetic browser evidence
463+ id : browser-evidence-validation
464+ if : always()
465+ run : bun scripts/ci/validate-browser-evidence.ts "$ATLCLI_BROWSER_EVIDENCE_ROOT"
466+
467+ - name : Upload browser evidence summaries
468+ if : always() && steps.browser-evidence-validation.outcome == 'success'
469+ uses : actions/upload-artifact@v7
470+ with :
471+ name : browser-evidence-summary-${{ matrix.lane }}-${{ github.sha }}-${{ github.run_id }}-${{ github.run_attempt }}
472+ path : |
473+ .artifacts/browser-evidence/*/junit.xml
474+ .artifacts/browser-evidence/*/summary.json
475+ .artifacts/browser-evidence/*/manifest.json
476+ if-no-files-found : error
477+ retention-days : 14
478+
479+ - name : Upload browser failure evidence
480+ if : failure() && steps.browser-evidence-validation.outcome == 'success'
481+ uses : actions/upload-artifact@v7
482+ with :
483+ name : browser-evidence-failures-${{ matrix.lane }}-${{ github.sha }}-${{ github.run_id }}-${{ github.run_attempt }}
484+ path : .artifacts/browser-evidence/*/failures
485+ if-no-files-found : error
486+ retention-days : 7
487+
415488 # Compatibility signal only. GitHub runner Chrome is intentionally not a
416489 # substitute for Playwright-matched Chromium in the required MV3 proof.
417490 browser-system-chrome-canary :
0 commit comments