@@ -3,6 +3,8 @@ name: Python Tests
33on :
44 pull_request :
55 types : [opened, synchronize, reopened, ready_for_review, labeled, unlabeled]
6+ # Inert until the main ruleset enables a merge queue; queue runs are full.
7+ merge_group :
68 workflow_dispatch :
79 push :
810 branches :
@@ -30,6 +32,9 @@ concurrency:
3032 group : python-tests-${{ github.ref }}
3133 cancel-in-progress : true
3234
35+ env :
36+ LOOPX_USAGE_PING : " 0"
37+
3338jobs :
3439 changes :
3540 runs-on : ubuntu-latest
@@ -102,20 +107,43 @@ jobs:
102107 cache-dependency-path : apps/presentation/dashboard/package-lock.json
103108 - run : python scripts/chat_bundle.py build --install
104109 - run : python scripts/chat_bundle.py verify --source
105- - name : Qualify the actual compiled UI before saving the artifact
106- working-directory : apps/presentation/dashboard
107- run : |
108- ./node_modules/.bin/playwright install --with-deps chromium
109- npm run smoke:personal-workspace-packaged
110- npm run smoke:chat-turn-acceptance-retry
111- npm run smoke:chat-upgrade
110+ # Publish as soon as the bundle is built and verified so consumers start
111+ # in parallel with browser qualification; `checks` still requires it.
112112 - uses : actions/upload-artifact@v7
113113 with :
114114 name : chat-bundle-${{ github.sha }}
115115 path : loopx/web/chat/
116116 if-no-files-found : error
117117 retention-days : 7
118118
119+ chat-bundle-browser :
120+ needs : [changes, chat-bundle]
121+ if : needs.changes.outputs.core_tests == 'true'
122+ runs-on : ubuntu-latest
123+ timeout-minutes : 15
124+ steps :
125+ - uses : actions/checkout@v7
126+ - uses : actions/download-artifact@v7
127+ with :
128+ name : chat-bundle-${{ github.sha }}
129+ path : loopx/web/chat/
130+ - uses : actions/setup-python@v6
131+ with :
132+ python-version : " 3.11"
133+ - uses : actions/setup-node@v6
134+ with :
135+ node-version : " 24"
136+ cache : npm
137+ cache-dependency-path : apps/presentation/dashboard/package-lock.json
138+ - name : Qualify the actual compiled UI
139+ working-directory : apps/presentation/dashboard
140+ run : |
141+ npm ci --ignore-scripts
142+ ./node_modules/.bin/playwright install --with-deps chromium
143+ npm run smoke:personal-workspace-packaged
144+ npm run smoke:chat-turn-acceptance-retry
145+ npm run smoke:chat-upgrade
146+
119147 kernel-static-checks :
120148 needs : [changes, chat-bundle]
121149 if : needs.changes.outputs.core_tests == 'true'
@@ -317,19 +345,21 @@ jobs:
317345 checks :
318346 # Preserve the required check name while exposing independent failure lanes.
319347 if : always() && needs.changes.outputs.core_tests == 'true'
320- needs : [changes, kernel-static-checks, typescript-coverage, dashboard-acceptance]
348+ needs : [changes, kernel-static-checks, typescript-coverage, dashboard-acceptance, chat-bundle-browser ]
321349 runs-on : ubuntu-latest
322350 timeout-minutes : 2
323351 steps :
324352 - name : Require kernel and Dashboard qualification
325353 env :
354+ BROWSER_RESULT : ${{ needs.chat-bundle-browser.result }}
326355 DASHBOARD_RESULT : ${{ needs.dashboard-acceptance.result }}
327356 KERNEL_RESULT : ${{ needs.kernel-static-checks.result }}
328357 TYPESCRIPT_RESULT : ${{ needs.typescript-coverage.result }}
329358 run : |
330359 test "$KERNEL_RESULT" = success
331360 test "$TYPESCRIPT_RESULT" = success
332361 test "$DASHBOARD_RESULT" = success
362+ test "$BROWSER_RESULT" = success
333363
334364 node-minimum-compatibility :
335365 needs : changes
@@ -360,7 +390,7 @@ jobs:
360390 needs : changes
361391 # The unsharded full suite outlasts a PR's qualification window, so the
362392 # non-blocking probe runs on main and on demand where it can finish.
363- if : github.event_name != 'pull_request' && needs.changes.outputs.core_tests == 'true'
393+ if : ( github.event_name == 'push' || github.event_name == 'workflow_dispatch') && needs.changes.outputs.core_tests == 'true'
364394 continue-on-error : true
365395 runs-on : ubuntu-latest
366396 # This runs the full core conformance suite. Allow forward-runtime/runner
@@ -500,6 +530,8 @@ jobs:
500530
501531 sonar :
502532 needs : pytest
533+ # Queue refs are temporary; analyse PRs and main, not gh-readonly-queue/*.
534+ if : github.event_name != 'merge_group'
503535 uses : ./.github/workflows/sonarcloud.yml
504536 secrets :
505537 SONAR_TOKEN : ${{ secrets.SONAR_TOKEN }}
@@ -704,7 +736,7 @@ jobs:
704736 - uses : actions/setup-python@v6
705737 with :
706738 python-version : " 3.11"
707- - name : Verify the source-bound, browser-qualified Dashboard artifact
739+ - name : Verify the source-bound Dashboard artifact
708740 run : python scripts/chat_bundle.py verify --source
709741
710742 merge-gate :
0 commit comments