@@ -114,8 +114,12 @@ jobs:
114114 - uses : actions/setup-node@v4
115115 with :
116116 node-version : " 20"
117- - name : Install JS dev-deps
118- run : npm ci || npm install
117+ - name : Install JS dev-deps from lockfile
118+ run : npm ci
119+ - name : Type-check and build TypeScript modules
120+ run : npm run check:frontend
121+ - name : Enforce compressed frontend budgets
122+ run : python3 scripts/frontend_budget.py
119123 - name : Install package + test extra
120124 run : |
121125 python -m pip install --upgrade pip
@@ -132,17 +136,23 @@ jobs:
132136 # files across workers.
133137 run : pytest tests/test_frontend_*.py -n auto --dist loadfile --timeout=180 -ra
134138
135- # ── End-to-end smoke (real Quart/Hypercorn app + real headless Chromium ) ──
139+ # ── End-to-end smoke (real app + Chromium, Firefox and WebKit ) ──
136140 # Boots the actual app on an ephemeral port with a STUB LLM (no API key /
137141 # no network) and drives a real browser to it — asserting the served bundle
138142 # loaded, streaming rendered, and a tool round rendered. This is the only
139143 # lane that catches INTEGRATION-class bugs (bundler allowlist, SSE→render)
140144 # that jsdom unit harnesses structurally cannot. CI runners are root, so
141- # `playwright install --with-deps chromium ` installs the GUI libs cleanly;
145+ # `playwright install --with-deps <engine> ` installs the GUI libs cleanly;
142146 # the conftest LD_LIBRARY_PATH bootstrap is a no-op there (libs already on
143147 # the system) and the rootless-conda fallback for shared dev nodes.
144148 e2e :
145149 runs-on : ubuntu-latest
150+ strategy :
151+ fail-fast : false
152+ matrix :
153+ browser : [chromium, firefox, webkit]
154+ env :
155+ TOFU_E2E_BROWSER : ${{ matrix.browser }}
146156 steps :
147157 - uses : actions/checkout@v4
148158 - uses : actions/setup-python@v5
@@ -153,7 +163,7 @@ jobs:
153163 python -m pip install --upgrade pip
154164 pip install -e ".[test]"
155165 pip install playwright
156- - name : Install Chromium + system deps
157- run : python -m playwright install --with-deps chromium
158- - name : Run E2E smoke + critical journeys
166+ - name : Install ${{ matrix.browser }} + system deps
167+ run : python -m playwright install --with-deps ${{ matrix.browser }}
168+ - name : Run E2E smoke + critical journeys (${{ matrix.browser }})
159169 run : pytest tests/test_e2e_smoke.py tests/test_e2e_journeys.py -m visual -ra
0 commit comments