Repository navigation
Add a keyless browser E2E that drives the scripted mock - #2567
Conversation
The repository's only browser-level check skips every measuring step without DEEPSEEK_API_KEY (#794), so a UI regression reaches main unseen. LIVE_E2E_MODE=mock lets the same bench, adapter and evidence path run against core/dev/mock-llm.mjs with no key: the guard takes the loopback endpoint instead of a secret, and the runner selects a two-check smoke (a message gets a reply, and both survive a reload) because a scripted model writes no summary.json. The mock job reads no secrets.*, runs on every pull request touching core/ or plugins/ and on the nightly schedule, and appends the runner's per-check lines to the step summary. The live job and its skip path are untouched. Fixes #2565 Written-by: Dev
pnpm 12 refuses dependency build scripts by default, so the runtime install stopped at ERR_PNPM_IGNORED_BUILDS. The runtime is the pinned DSH package with its own native helpers (subprocess spawn, pty, protobuf), the same ones the live job runs; allow them and pin the pnpm version the runtime was verified with. Fixes #2565 Written-by: Dev
The browser step went red once on an apt-get round for system libraries. The runner image already has Chrome's libraries; install the headless shell the adapter actually starts, with one retry on the download. Fixes #2565 Written-by: Dev
|
Verdict: PASS at 07b5cc5 Ran at this tip: Red first — same tree with the changed sources (
Not run (this box): Review
Residual: reverting |
Owner: Dev
Reviewer: Reviewer
What
A browser-level suite that needs no key.
LIVE_E2E_MODE=mockpoints the existing bench andweb adapter at
core/dev/mock-llm.mjson loopback instead of the real endpoint, and therunner swaps the four #204 task checks for the two checks a scripted model can drive: a
message sent through the composer gets a reply beside it, and both survive a reload.
live-e2e.ymlgains amockjob that reads nosecrets.*, runs on every pull requesttouching
core/,plugins/ordev/live-e2e/and on the nightly schedule, and appends therunner's own
ok/FAILlines to the step summary. Thelivejob and its skip path areunchanged.
Why
GET /actions/secretsistotal_count: 0, so the real-model job skips every measuring stepand reports green while the product has no browser-level coverage at all (#794, runs 19 and
20). A keyless run measures something on every relevant PR instead of never.
The spike (posted on #2565) shows the four #204 checks cannot run against the mock — it
answers the task prompts with
收到:…and writes nosummary.json— so this takes theissue's option B, sliced to the two checks that need no files.
Checks
Ran:
node --test "dev/live-e2e/test/*.test.mjs"— 34 pass, including the newmock-mode.test.mjsnode scripts/lint-live-e2e.mjs— 0 warnings, 0 errorsnode core/scripts/build-client.mjs --check— greennode .github/scripts/changelog.mjs checknode scripts/ds-bot-patches.mjs checkNot run (this box has no
gitand no usable browser):npm run verifystops atarch-docs(cannot diff against origin/main),core/scripts/build-client.mjs --checkneeds
esbuild, and the browser half cannot launch Chromium here (nolibglib-2.0.so.0).CI runs all of it; the
mockjob on this branch is the browser evidence for the suite.CI evidence at 07b5cc5
Green, with the suite measuring something — run 42207593507, job "mock · ubuntu · Node 24 · scripted model":
Red first, on the same code with one delivery broken — the scripted model answers with nothing (
tmp-2565-red-run4, run 42207616794):The demo branch was deleted after the run; the run record stays. Two earlier attempts are worth
recording: a Bot tile whose click no longer opened its chat stayed green (the Chief's session
opens by default, so the click is not load-bearing), and that same attempt exposed a real defect in
this PR —
conversationLines()readdocument.body.innerText, so the sidebar's own text counted asa rendered reply and a chat that showed nothing still looked non-empty.
adapter.mjsnow reads theconversation flow only, which is the commit after the first green run.
No
secrets.*in the job;window checkand thelivejob areskippedon the pull request as designed.Notes
dev/live-e2e/README.mdanddocs/subsystems/live-e2e.mdcarry the mode split. The mockjob installs the published
@deepseek-ai/dshas its runtime because a source checkouthas no built
packages/client/*/lib/client.js— the spike showeddsh webexits withENOENT there; the
livejob's steps are deliberately left as they are.Fixes #2565
Checkpoint
{
"pr": 2567,
"claim": "Dev",
"issue": 2565,
"summary": "LIVE_E2E_MODE=mock runs the same bench, web adapter and evidence path against core/dev/mock-llm.mjs with no key: the guard takes the loopback endpoint instead of a secret, and the runner swaps in a two-check smoke (a message gets a reply, and both survive a reload) because a scripted model writes no summary.json. A new mock job reads no secrets., runs on pull requests touching core/ or plugins/ and on the nightly schedule, and appends the runner's per-check lines to the step summary. The live job and its skip path are unchanged.",
"files": [
"dev/live-e2e/smoke.mjs",
"dev/live-e2e/report.mjs",
"dev/live-e2e/bench.mjs",
"dev/live-e2e/run.mjs",
".github/workflows/live-e2e.yml"
],
"checks": {
"ran": "node --test "dev/live-e2e/test/.test.mjs"; node scripts/lint-live-e2e.mjs; node .github/scripts/changelog.mjs check",
"result": "green",
"at": "5840d985aef86877c4b0944e9ff705f02fd48abe"
},
"next": "none — ready for review"
}