Skip to content

ci(live-e2e): boot the workspace backend and run the live lane as the required Live E2E UI job - #27212

Merged
os-zhuang merged 5 commits into
mainfrom
claude/issue-27154-live-e2e-workspace-backend
Oct 28, 2026
Merged

os-zhuang merged 5 commits into
mainfrom
claude/issue-27154-live-e2e-workspace-backend

Conversation

@objectstack-fleet

@objectstack-fleet objectstack-fleet Bot commented Oct 28, 2026 •

Copy link
Copy Markdown
Contributor

Fixes #27154
Clause-②: no
Metadata-protocol: none

维护者速读

  • 改了什么: live e2e 四条 spec 改为用本树工作区自建的 @objectstack/cli 启动 examples/app-showcase 后端(HEAD console 对 HEAD backend),已发布版本钉退役;ci.yml 新增 Live E2E UI job,并登记进 REQUIRED_CONTEXTS。
  • 为什么改: 按已发布版本钉后端,每次发版都得同步抬钉,否则 ui/ 的 PR 全红(e2e: the MSW test in console-rendering.spec passes when the worker is absent (it is absent), and 18 of 22 live specs run nowhere in CI — delete the vacuous test and make the four live specs count #25914 实测 18.1.0 下 0/5);裁决 6464191239 字母 D 第 2 步要求改为工作区后端后再升为 required。
  • 风险与回滚: Tier H(.github/workflows/ci.yml、AGENTS.md);回滚 = 还原本 PR(job、注册行、两处名单文字、两个脚本)。新 job 超时上限 40 分钟由一次本地冷跑推得,首批 CI 数据后需复核。
  • 先看: ui/e2e/live/ci/start-backend.sh(prepare 只校验构建产物、不再拉包)→ ci.yml 的 live-e2e-ui job → scripts/check-required-contexts.mjs 新注册行。
  • 两分钟验证: 打开本 PR 的 checks,Live E2E UI 应为绿色,日志 “Run the live e2e specs” 一步显示 5 passed。
  • 需要你做的: 合并后在 main 的 ruleset 里把 Live E2E UI 勾为 required(席位做不了)。

What changes

  • ui/e2e/live/ci/start-backend.sh boots the WORKSPACE backend: this tree's built @objectstack/cli (through examples/app-showcase/node_modules/.bin/objectstack) runs objectstack dev --seed-admin --fresh -p $LIVE_BACKEND_PORT from the checked-out showcase. Same default port (4010), same seeded sign-in readiness poll (300 s), same pid file, so stop-backend.sh is unchanged and its PID contract holds. prepare no longer resolves a release tag, sparse-checks-out a release or npm installs published tarballs; it checks the build prerequisite (the app's config, the installed CLI bin, packages/cli/dist/index.js) and refuses by name with the build command when one is missing. The vitest override and the stamp retire with the install.
  • ui/e2e/live/ci/backend.env declares LIVE_BACKEND_APP=examples/app-showcase and no published pin; its comment records why OBJECTSTACK_VERSION retired.
  • .github/workflows/ci.yml adds live-e2e-ui / Live E2E UI: install, build the CLI + showcase closure and the seven packages the Console builds against, vite build the Console with VITE_BASE_PATH=/, provision Chromium through ensure-chromium-ready.sh, boot the backend, serve vite preview on :5190 with DEV_PROXY_TARGET=http://localhost:4010, and run pnpm --dir ui run test:e2e:live:ci --retries 0. Triggers: the workflow's existing pull_request and merge_group (plus push/schedule, as every job in the file). if: is Build & E2E UI's condition verbatim (ui_tree, ui || ui_consumers, with !cancelled()). No continue-on-error, no retry wrapper, no spec edited or skipped. Caches are restore-only (pnpm store, Build Core's turbo seed, the Playwright browsers Build & E2E UI saves).
  • scripts/check-required-contexts.mjs: a REQUIRED_CONTEXTS row for ci.yml:live-e2e-ui → 'Live E2E UI', and the name added to the two statesTheSet instruction surfaces' mustName; AGENTS.md (nine → ten contexts) and .claude/skills/pm-dispatch/references/platform-readings.md (九个 → 十个) name it.
  • ui/scripts/__tests__/ensure-chromium-ready.test.ts reads the new job as a second Chromium provisioner (its comment said live-e2e.yml "comes back here with that port"); helpers/root-ci.ts exports the job id as UI_LIVE_E2E_JOB, outside UI_JOBS.
  • docs/agents/multi-agent-discipline.md (advisory checks ride through) now counts ten required contexts, and the ci.yml filter job comment counts five * UI jobs (Type Check UI, Test UI, Lint UI, Build & E2E UI and Live E2E UI).

Tests

Measured before wiring, on the workspace boot, at commit 7a48258d (the re-shaped scripts; base 2f96d874). Setup: pnpm install --frozen-lockfile; turbo build of the CLI + showcase closure and the seven Console packages (65/65 tasks, 384 s cold under the shared-box lock); VITE_BASE_PATH=/ vite build of ui/apps/console (119 s); start-backend.sh exit 0, ready in 19 s (@objectstack/cli 18.2.0 workspace); vite preview --port 5190 with DEV_PROXY_TARGET=http://localhost:4010; LIVE_API_URL=http://localhost:4010, LIVE_APP_URL=http://localhost:5190; one backend for all five runs, as one CI job boots once.

Run Exit Wall (s) action-modal master-detail: populated parent master-detail: task line saved-view-filter screen-flow
1 0 26 pass pass pass pass pass
2 0 23 pass pass pass pass pass
3 0 22 pass pass pass pass pass
4 0 23 pass pass pass pass pass
5 0 21 pass pass pass pass pass

5/5 runs green, 5/5 tests per run; Playwright's own totals 24.1 s / 20.5 s / 20.7 s / 21.2 s / 19.9 s. Wall times are shared-box seconds. Teardown: stop-backend.sh stopped the recorded pid; the preview processes I started were stopped by pid.

Derived gates (node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack at 191e9d5e, after merging origin/main): 87 commands, each exit captured before any pipe. 85 exit 0, including pnpm check:required-contexts (lists ci.yml:live-e2e-ui → 'Live E2E UI'), check:workflow-status-functions, check:stall-guard-budget, check:pm-expected-skips, check:aggregator-roster, check:bash32-floor, check:ci-filter-parity, check:pm-skill-ratchet, and pnpm --dir ui exec vitest run scripts/ (175 files passed, 2 skipped; 5020 tests passed). Two did not measure the diff: check:dual-build-cjs-loads exit 3 (PREREQUISITE NOT MET: no full pnpm build here) and check:dts-closure exit 1, which named only ui/apps/console/plugin.d.ts, missing from the dist/ my bare vite build left behind; with that ignored directory removed it exits 0 (233/233 declaration files present). --ran with exit codes: 87 derived, 86 run, 1 NOT-MEASURED (the exit 3). No package changes, so no changeset (skip-changeset).

On head 3f0b396f (the text patch round): CI pull_request run 40678137074; Live E2E UI (job 122782123641) concluded success in 87 s of job wall time (Console build 11 s, backend boot 10 s, specs 18 s).

Acceptance notes

Verification

Read this PR's Live E2E UI check: steps "Boot the workspace backend" (ends ready: seeded sign-in answered on :4010) and "Run the live e2e specs" (ends 5 passed).


Generated by Claude Code

The live lane's start-backend.sh now runs this tree's own built
@objectstack/cli on the checked-out examples/app-showcase: HEAD console
against HEAD backend. backend.env declares the app directory and no
published version; the tag resolve, npm install and vitest override
retire with the pin.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QSeKYoUcDM1MUzjdaCjt6U
…quired context

A ci.yml job builds the workspace backend's closure and the Console
(VITE_BASE_PATH=/), boots the backend through start-backend.sh, serves
vite preview with the /api proxy and runs test:e2e:live:ci with
--retries 0, gated as Build & E2E UI is. Its name joins
REQUIRED_CONTEXTS and the two instruction surfaces that state the set;
the Chromium-provisioning pin reads the new job too.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QSeKYoUcDM1MUzjdaCjt6U
@objectstack-fleet objectstack-fleet Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Oct 28, 2026
@github-actions github-actions Bot added size/m ci/cd documentation Improvements or additions to documentation tests labels Oct 28, 2026
The runner context is not available in a job-level env:, so ci.yml did
not validate and the CI workflow never started. The two steps that run
the backend scripts now carry LIVE_BACKEND_DIR themselves. actionlint
reports nothing on the result and the runner-context error on the
previous head.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QSeKYoUcDM1MUzjdaCjt6U
@github-actions github-actions Bot added size/l and removed size/m labels Oct 28, 2026
@os-zhuang
os-zhuang marked this pull request as ready for review October 28, 2026 10:59
@os-zhuang
os-zhuang enabled auto-merge October 28, 2026 10:59
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 9264ac22590020b57c9b92462c59288b4990b68d
Local-runs: none
Scope: .claude/skills/pm-dispatch/references/platform-readings.md, AGENTS.md, .github/workflows/ci.yml + scripts/check-required-contexts.mjs, scripts/pm/check-expected-skips.mjs, scripts/check-workflow-status-functions.mjs, ui/e2e/live/ci/start-backend.sh, ui/e2e/live/ci/stop-backend.sh, ui/e2e/live/ci/backend.env, ui/playwright.live.config.ts, ui/e2e/live/global-setup.ts, ui/apps/console/vite.config.ts, ui/scripts/tests/ensure-chromium-ready.test.ts, ui/scripts/tests/turbo-cache-save-bound.test.ts, docs/agents/multi-agent-discipline.md

Rendered by a contract-review subagent at CONTRACT_REVIEW_TIER (session session_01QSeKYmTYfaPbLQD4BJfomW) and adopted by devx seat 2. Inputs: card #27154 with every comment (rulings 6464191239 and 6435339772 on #25914 read in full), PR #27212's body and file list, the net diff against main, and the check-runs on the head. Nothing was built, run or re-run; the live tree was read with git show on the fetched refs.

① Derived judgments

  • Required set grows 9 → 10. REQUIRED_CONTEXTS gains ci.yml:live-e2e-ui → 'Live E2E UI', and both statesTheSet surfaces (AGENTS.md, platform-readings.md) gain the literal in mustName. Right: ruling 6435339772 Q1 A ordered the enrolment, ruling 6464191239 letter D step 2 re-based it on the workspace backend and named this PR as the place both land. The gate's own census assertion (mustName.length === REQUIRED_CONTEXTS.length on exactly the two surfaces) is satisfied by the diff; the dev's check:required-contexts reading lists the row, and Lint · CI, release & engine gates concluded success on the head.
  • Expected-skip roster. The roster is derived from job-level if: spellings, never listed. The new job's if: is byte-identical to Build & E2E UI's (!cancelled() && needs.filter.outputs.ui_tree != 'false' && (ui || ui_consumers)), every output carries the || 'true' widening, so the job is admitted on its first run with no roster edit. Right. On this head it ran rather than skipped, so the roster question is not exercised here.
  • Status-function rule. The job-level if: reads needs.filter.outputs.* and names !cancelled(). Right.
  • Aggregator roster. Live E2E UI is a plain job, not an aggregate and not a member of one; no needs: roster moves. Right — the sibling it copies (Build & E2E UI) stands alone the same way.
  • Public surface. No packages/* source changes; ui/e2e/live/ci/* is repo tooling. backend.env drops its only key OBJECTSTACK_VERSION for LIVE_BACKEND_APP; the only code consumer of either is start-backend.sh, re-shaped in the same diff (the remaining mentions are prose: the saved-view-filter.spec.ts header the dev flagged and a historical comment in ui/scripts/check-lockfile-integrity.mjs). No published surface moves. Right.
  • Chromium provisioning pin. ensure-chromium-ready.test.ts now reads the live-e2e-ui block as a second provisioner; the block calls bash ensure-chromium-ready.sh from ui/scripts and installs with plain playwright install chromium (no --with-deps, no install-deps), which is what that test refuses. Right; UI_LIVE_E2E_JOB is kept outside UI_JOBS so the lint/type-check/vitest pins on the four do not read it, and turbo-cache-save-bound.test.ts (which censuses saves in UI_JOBS) is unaffected because the new job saves nothing.

② Semver level

skip-changeset on the PR, Check Changeset skipped on the head, no packages/* path in the file list, no .changeset/ entry. The diff publishes nothing, so no changeset is the right level. Clause-②: no on the PR body matches the claim (6465707880) and both rulings; Metadata-protocol: none likewise.

③ Boundary flags

  • OQ1 (gate width: a backend-only PR skips the live lane). Answered A. The claim and ruling fix the gate as Build & E2E UI's, and the job runs on every job's push/schedule events with the filter widened, so a backend regression surfaces on main's own runs. Widening to core is a separate ruling, not this PR's. Recorded, as the PR's Acceptance notes do.
  • OQ2 (ceiling 40 from one cold local run). Answered A, with a should-fix below: the siblings' ceilings are held by turbo-cache-save-bound.test.ts, and the F13 comment above lint-ui says that file "holds both values"; the new job's 40 is held by no test. Re-derive from the first population and pin it then.
  • OQ3 (addendum: no repo gate catches a context used where GitHub forbids it). Escalated to the seat as a follow-up card candidate, recommendation B (extend check-workflow-status-functions.mjs, which already parses every job-level if:). Confirmed from the Actions API: head 191e9d5 carried only a .github/workflows/ci.yml push run with conclusion failure and no CI pull_request run, while its other workflows read green — the false-green shape the dev names. Not this PR's defect to fix.
  • Dev flags. Tier H approval is outstanding (the PR carries no review yet) — whole-PR, outside this record. The ruleset click stays the maintainer's; --verify-required-set reports the row in direction A until then, report-only. The process note (detached shared checkout, one amend before first push) changes nothing in the tree.
  • Out-of-scope findings. The saved-view-filter.spec.ts header still describes the retired pin — the claim forbids spec edits, so it is a follow-up, not this PR's. The filter job comment ("the four * UI jobs") is in a hits file and is a should-fix below.

④ Design judgment

.github/workflows/ci.yml — the live-e2e-ui job. Read against the filter job's outputs, Build & E2E UI, start-backend.sh/stop-backend.sh/backend.env, playwright.live.config.ts, global-setup.ts, the Console's vite.config.ts and the gate scripts above; and against the head's Live E2E UI check-run (job 122775469774 on run 40676242784: 19 steps, every one success except the two correctly skipped — browser install on a cache hit, and the failure-artefact upload after a green run; 81 s of job wall time).

  • Context availability at every ${{ }}. Job-level if: uses needs and a status function (allowed). Job-level env: now holds literals only — the runner context that broke head 191e9d5 is gone, and no other job in the file names runner in a job-level env:. Step with: uses env.STORE_PATH, runner.os, hashFiles, github.ref_name, github.sha, steps.playwright-version.outputs.version (all allowed at jobs.*.steps.with). Step-level env: uses runner.temp (allowed). Step if: uses steps.*.outputs.*, always(), !cancelled() && failure() (allowed). Holds.
  • LIVE_BACKEND_DIR. Set to ${{ runner.temp }}/live-backend on both steps that source the scripts — boot and stop — so stop-backend.sh reads the same backend.pid the boot wrote; the upload step spells the same path literally for backend.log. Without the step env the scripts would fall back to $TMPDIR/objectui-live-backend on both sides, so even a drift would stay self-consistent; there is none. The stop step's if: ${{ always() }} is step-level, outside the status-functions rule's scope (job-level only), and is the right status for a cleanup. Holds.
  • Skip shape. Verbatim Build & E2E UI, so the derived roster admits it and the status-function gate passes; ui_tree keeps it skipped-not-failed on a tree without ui/. Holds.
  • What a required job must carry. Name pinned to the registry row, no strategy.matrix, no continue-on-error at job or step level, no retry wrapper, --retries 0 on the command line restating the config's own retries: 0, permissions: contents: read, a ceiling by the F13 rule. The step-status and lane-verdict conventions in this file belong to the aggregates (Test Core, Test UI) and their shards; the non-aggregate required jobs it sits beside (Build & E2E UI, Lint UI, Type Check UI) carry none, so nothing is missing. Holds.
  • The lane itself. Ports agree end to end: LIVE_BACKEND_PORT=4010 = start-backend.sh's default = LIVE_API_URL = DEV_PROXY_TARGET; LIVE_APP_URL=5190 = vite preview --port 5190 --strictPort; global-setup.ts signs in at LIVE_API_URL with the same seeded credentials start-backend.sh polls. vite preview inherits server.proxy, so /api reaches the backend; VITE_BASE_PATH=/ serves the Console at the root the live specs navigate. start-backend.sh boots examples/app-showcase/node_modules/.bin/objectstack (the showcase declares @objectstack/cli: workspace:*, so pnpm writes the shim) after refusing by name when the config, the shim or packages/cli/dist/index.js is missing; $! is the CLI process because the shim execs node, so the PID contract stop-backend.sh depends on is kept — the stop step concluded success in one second on the head. Restore-only caches fail open. Holds.
  • Should-fix (comment drift this diff causes): the filter job comment still says its three ui outputs are "read together by the four * UI jobs at the bottom of this file"; five read them now. A comment, not a spec, so the claim's edit ban does not reach it.
  • Should-fix (ceiling pin): timeout-minutes: 40 is derived in the job comment but held by no test, unlike the siblings' 40/35 in turbo-cache-save-bound.test.ts; pin it when the first population re-derives it (OQ2 A).

AGENTS.md. The merge-queue sentence is the statesTheSet surface; the gate forces the literal Live E2E UI to appear and the census to equal the registry. The diff adds exactly that literal, re-punctuates the list, and hand-follows the unpinned numeral in its three places (nine → ten). Nothing more moved. One finding: the same sentence links to docs/agents/multi-agent-discipline.md#advisory-checks-ride-through, and that anchor's one line still reads "A check outside those nine is advisory and rides through". The gate pins neither numeral, and the names a seat acts on live in AGENTS.md, so this is a should-fix (hand-follow it, nine → ten), not a detached gate.

.claude/skills/pm-dispatch/references/platform-readings.md. The ledger's required-set line gains · \Live E2E UI`and 九个 → 十个. The file's own next lines say themustName` pin holds the names and the numeral is hand-followed ("数量词未钉…只能手跟改"), which is exactly what the diff does. Nothing more moved. Holds.

Must-fix: none.
Should-fix: (1) docs/agents/multi-agent-discipline.md:126 "those nine" → ten; (2) ci.yml filter comment "the four * UI jobs" → five; (3) pin the live-e2e-ui ceiling in turbo-cache-save-bound.test.ts when the first population re-derives it.

Head check-runs at this reading: 61 check-runs — 52 success, 8 skipped (the opt-in and full-battery contexts, plus Check Changeset), 1 still in progress (Test Core (1/8)), 0 failures; Live E2E UI success.

Implemented-by: claude/issue-27154-live-e2e-workspace-backend
Reviewed-by: session_01QSeKYmTYfaPbLQD4BJfomW

VERDICT: PASS


Generated by Claude Code

The advisory-checks section of multi-agent-discipline.md, which AGENTS.md
links to, still said nine; the filter job's comment said four ui jobs
read its outputs.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QSeKYoUcDM1MUzjdaCjt6U
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 3f0b396fae04325ab7894a7100cfe73cdc302df0
Local-runs: none
Scope: .claude/skills/pm-dispatch/references/platform-readings.md, AGENTS.md, .github/workflows/ci.yml + docs/agents/multi-agent-discipline.md

Delta review on the findings-only commit above the reviewed head 9264ac22590020b57c9b92462c59288b4990b68d (record 6467449484 on the PR), rendered by a contract-review subagent at CONTRACT_REVIEW_TIER (session session_01QSeKYmTYfaPbLQD4BJfomW) and adopted by devx seat 2. Read-only: the delta was read as git diff between the two heads on the fetched ref, the tree with git show, the runs from the Actions API.

① Derived judgments

The delta is one commit touching two files, 4 insertions and 3 deletions, every changed line a # comment in ci.yml or prose in docs/agents/multi-agent-discipline.md. No key, value, expression, step, job, registry row, mustName entry or numeral in a statesTheSet surface moves, so every judgment in record 6467449484 stands unchanged: required set 9 → 10, derived expected-skip roster unchanged (no if: touched), status-function and aggregator-roster gates unaffected, no public surface. Right.

② Semver level

Unchanged: skip-changeset, no packages/* path, comment and doc text only. Clause-②: no still matches. Right.

③ Boundary flags

Should-fix 1 and 2 of record 6467449484 are closed by this commit. Should-fix 3 (pin the live-e2e-ui ceiling in turbo-cache-save-bound.test.ts when the first CI population re-derives it) is untouched and stays a follow-up, as the record allowed. OQ1/OQ2/OQ3 answers and the out-of-scope saved-view-filter.spec.ts header drift are unchanged. Tier H approval remains whole-PR.

④ Design judgment

.github/workflows/ci.yml — two comment lines in the filter job. (a) "read together by the four * UI jobs" → "the five * UI jobs … (Type Check UI, Test UI, Lint UI, Build & E2E UI and Live E2E UI)". Verified against the tree: the jobs whose conditions read ui_tree / ui / ui_consumers are ui-deps, type-check-ui, test-ui (shards) with test-ui-gate, lint-ui, build-e2e-ui, live-e2e-ui and ui-published-artifacts; the comment's own definition is the * UI name glob, which exactly the five named match — Build UI Deps and UI Published Artifacts fall outside it, as they already did when the line said four. The named five are the right five. (b) "skips the four ui jobs" → "five": the same convention, followed consistently. Holds; nothing but comment text moved, no ${{ }} touched.

docs/agents/multi-agent-discipline.md — the #advisory-checks-ride-through anchor that the AGENTS.md merge-queue sentence links to now reads "those ten", matching AGENTS.md's hand-followed numeral and the registry's ten rows. Holds.

AGENTS.md, platform-readings.md — not touched by the delta; the prior ④ stands.

Must-fix: none. Should-fix: none new; (3) from the prior record remains a follow-up.

Runs on this head: a CI pull_request run exists (40678137074) and was in progress at this reading, with Lint & Type Check and Fleet Patrols also in progress; Governed Surface Guard, Check Links, PR-Body Guards and PR Automation success, the two opt-in workflows skipped. Check-runs at this reading: 26 — 8 success, 4 skipped, 14 in progress, 0 failures. Live E2E UI had not yet published a check-run on this head; it is still running, not awaited. Its conclusion on the reviewed head 9264ac22 was success, and this delta changes no line the job executes.

Implemented-by: claude/issue-27154-live-e2e-workspace-backend
Reviewed-by: session_01QSeKYmTYfaPbLQD4BJfomW

VERDICT: PASS


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

席位核对 — Tier H · awaiting approval · domain:devx#2 · head 3f0b396fae · 2026-10-28T11:28Z

维护者速读

  • 改了什么:live e2e 的四条 spec 不再连「已发布版本」的后端,改成用本仓库这次构建出来的 @objectstack/cli 现场启动 examples/app-showcase,也就是同一个提交的前端对同一个提交的后端。ci.yml 新增一个 Live E2E UI 检查,并把它登记为第十个必需检查(AGENTS.md、两份文档里的数字跟着从九改成十)。
  • 为什么改:你在 e2e: the MSW test in console-rendering.spec passes when the worker is absent (it is absent), and 18 of 22 live specs run nowhere in CI — delete the vacuous test and make the four live specs count #25914 裁的 D(6464191239)第 2 步。原来后端版本是写死的,每次发版都得手动抬,不抬的话所有 ui/ 的 PR 都会红(18.1.0 时实测 0/5 通过)。改成工作区后端以后,这条线不再随发版失效,所以可以升为必需。
  • 风险与回滚:碰 .github/workflows/ci.yml 和 AGENTS.md,属 Tier H,需要人批。新检查只在改到 UI 相关路径时跑,门和 Build & E2E UI 一样,实测约 1.5 分钟。超时上限 40 分钟只按一次本地冷跑推得,已立卡 [devx] Live E2E UI follow-ups: pin its timeout ceiling from the first CI population, and retire the stale backend-pin header in saved-view-filter.spec.ts #27228,攒够 20 次 CI 数据后复核并钉进测试。回滚 = 还原本 PR。
  • 先看:ui/e2e/live/ci/start-backend.sh(不再下载发布包,只校验本次构建产物)→ ci.yml 的 live-e2e-ui job → scripts/check-required-contexts.mjs 新增的注册行。
  • 两分钟验证:打开本 PR 的 checks,Live E2E UI 是绿的。日志里 “Run the live e2e specs” 一步显示 5 passed,本 head 上用时 87 秒。
  • 需要你做的:批准本 PR(os-zhuang 或 hotlong 任一位即可,os-zhuang 已转 ready 并挂了自动合并,批准后就进队列)。合并后在 main 的 ruleset 里把 Live E2E UI 勾为必需检查,席位做不了这一步。

席位意见:批准合入。达档契约复核两轮都是 PASS:首轮 6467449484 提了 3 条 should-fix,其中 2 条是文字漏改,已在 3f0b396f 修好,增量复核 6467543514 PASS;第 3 条(钉超时上限)要等 CI 数据,已立卡 #27228。中途有一个 head 因 job 级 env 用了 runner.temp 导致整份 ci.yml 失效、看上去却是「全绿」,已修;为这种假绿立了门禁卡 #27227。

Shape: ready (os-zhuang), auto-merge armed, → main. Fixes #27154. 9 files. Tier H (.github/workflows/ci.yml, AGENTS.md); the .claude/** file rides at Tier S inside the same whole-PR approval. Labels documentation, ci/cd, tests, skip-changeset; assignee os-justin; review requested from GOVERNED_APPROVERS (os-zhuang, hotlong), none given yet. needs-user-decision is added in this act while the PR waits on that approval.

Premise measured: the ruling is #25914 6464191239, letter D, step 2: a workspace backend first, then promotion to required. Step 1 landed (#27167, OBJECTSTACK_VERSION=18.2.0); this PR retires that pin. The diff carries no published-version literal in ui/e2e/live/ci/ (seat read of backend.env and start-backend.sh at head).

Gates: on head 3f0b396fae, a CI pull_request run exists (40678137074; on 191e9d5e it did not, which is the false-green shape #27227 files). Live E2E UI (job 122782123641): success, 87 s. The dev's union on this head: actionlint 1.7.12 exit 0; check:required-contexts, check:workflow-status-functions, check:ci-filter-parity, check:doc-authoring and check-adr-links all exit 0 (addendum 6467563389).

At posting, every check-run on 3f0b396fae is complete: 67 in all, 56 success, 11 skipped, 0 failure. check-expected-skips --pr 27212: OK, all 11 skips are in main's roster (exit 0). check-governed-merges --pr 27212: Tier H on .github/workflows/ci.yml and AGENTS.md, 511 changed lines, under the 3,000-line floor.

Contract review: at CONTRACT_REVIEW_TIER, by an isolated reviewer session. First round 6467449484 PASS on 9264ac22. Delta 6467543514 PASS on 3f0b396f: comment and doc text only, two ci.yml comment lines and multi-agent-discipline.md nine → ten.

Accepted deviations:

Out of scope, with destinations:

Landing: the seat never approves or merges a governed PR. On an approval from GOVERNED_APPROVERS, the queue takes it through the armed auto-merge. On merge, the seat verifies the merged diff against this head, posts the landing note on #27154, archives cloud session session_01QSeKYoUcDM1MUzjdaCjt6U, and unblocks #27228. The ruleset click stays yours. Until it is done, check-required-contexts --verify-required-set reports the row in direction A (pinned, not yet required), report-only.


Generated by Claude Code

Merged via the queue into main with commit dfe85c9 Oct 28, 2026
72 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-27154-live-e2e-workspace-backend branch October 28, 2026 11:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ci/cd documentation Improvements or additions to documentation size/l skip-changeset PR has no user-facing published change; bypasses the changeset gate tests

Projects

None yet

3 participants