Skip to content

ci(live-e2e-ui): run on server-only diffs too (|| core), and pin the 2-minute spec budget - #27619

Draft
objectstack-fleet[bot] wants to merge 1 commit into
mainfrom
claude/issue-27550-live-e2e-gate
Draft

objectstack-fleet[bot] wants to merge 1 commit into
mainfrom
claude/issue-27550-live-e2e-gate

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

domain:devx#2 · os-justin · session_01QSeKYksGQkx7jCWdPyjy14

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

Ruling (maintainer, quoted on #27550, #27550): 「同意,立卡」

维护者速读

  • 改了什么:Live E2E UI 的 if: 在原有 ui / ui_consumers 条件上再 OR 上 core,纯后端 PR(objectql、runtime、rest、插件、showcase 等)不再跳过它;job 注释写明「Run the live e2e specs」一步 ≤ 2 分钟的预算。
  • 为什么改:Console 连真实后端时,纯后端改动也会把它弄坏,而这类 PR 过去全部跳过这条检查,问题要到合并后人工 QA 才发现。
  • 风险与回滚:最近 59 次 PR CI 中,运行次数从 35 增至 55(另一方案「只列后端依赖闭包」为 50,差的 5 次全是只改 skills 的 PR);合并队列里每个条目都会跑它。该步骤实测 14–24 秒,不增加墙钟。回滚 = 还原这一行 if:。
  • 先看:.github/workflows/ci.yml 的 live-e2e-ui job 的 if: 一行及其上方注释。
  • 两分钟验证:本 PR 的 CI 运行里 Live E2E UI 应是实际运行(非 skipped),之后任一只改 packages/objectql 的 PR 同样应运行它。
  • 需要你做的:Tier H,审批本 PR。

What changes

  • .github/workflows/ci.yml, job live-e2e-ui only: the if: gains || needs.filter.outputs.core != 'false' inside the existing OR group. !cancelled() and the ui_tree guard are unchanged. No retry wrapper, no continue-on-error, no other job touched.
  • The job comment: the "Gated as Build & E2E UI is" sentence now names the new gate and why it differs from Build & E2E UI (that job builds the Console against the seven packages it compiles from; this one runs it against a real server, which a server-only diff can break). It also records the measurement and the BUDGET: the "Run the live e2e specs" step stays under 2 minutes, and a spec that would push it over stays in test:e2e:live:nightly.

Option measurement (Actions API, last 60 completed pull_request CI runs, 2026-10-29T06:51Z to 12:26Z)

One of the 60 was action_required (no jobs ran), so 59 are graded.

gate runs that start Live E2E UI
today (ui or ui_consumers) 35 (24 skipped)
(a) ... or core 55 (Build Core's own conclusion on the same run, since Build Core's if: is exactly core)
(b) a filter naming the backend's closure 50

For (b), the list is the dependency closure of the two packages the job's backend is built from (@objectstack/cli... and @objectstack/example-showcase..., the job's own build filters): 67 workspace directories, every one of them reached at runtime by objectstack dev serving the showcase app (the drivers, objectql, runtime, rest, metadata, the plugins, services and triggers, the adapters, the showcase app itself). Every narrower list drops a package the server loads, which is a gap.

Picked (a). The 5 runs (a) adds over (b) are two PRs whose diffs touch only skills/**, docs and changesets. (b) is not materially cheaper (8% of runs), and it is not gap-free over time: it is a second hand-kept recognizer of the backend's dependency graph, so a package that joins the closure later silently skips the job, the drift that THE FILTER CONTRACT fails open against. It would also need a new filter output and a parity reader. One consequence of (a), stated in the comment: on merge_group core is always 'true', so every queue entry runs this job, which is the queue-side half of the gap the card names.

Spec-step durations over the 35 runs that ran it: 14 s min, 21 s median, 24 s max.

Tests

No code or test change. The derived gates are below.

Acceptance notes

  • The filter job's outputs comment still says the three ui outputs are "read together by the five * UI jobs". That stays true, but Live E2E UI now reads core as well. Left as is, because the claim's file surface excludes other jobs.
  • actionlint: NOT MEASURED. The repo and its CI carry no actionlint, and downloading the release binary was refused in this container. ci.yml parses as YAML, and check:workflow-status-functions / check-workflow-context-availability are green over it.
  • Opened by the seat (session_01QSeKYmTYfaPbLQD4BJfomW) on the maintainer's authorisation 「授权本席位打开这个草稿 PR」, from the dev's prepared title, body and labels, because the dev session's classifier refused its own pr_create (card note 6499253144).

Verification

Head a6abd5d9, base origin/main ad3a640e (merged, already up to date).

Gate list: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack gave 53 commands. Each was run with its exit captured before any pipe.

--ran reconciliation: 53 derived famil(ies) accounted for — 49 run, 4 NOT-MEASURED (4 DERIVED from a recorded exit 3).

  • pnpm check:required-contexts: exit 0 (lists ci.yml:live-e2e-ui → 'Live E2E UI').
  • pnpm check:workflow-status-functions: exit 0. It prints check-workflow-status-functions: OK (scanned 30 workflow file(s), 78 job(s), 59 job-level if: expression(s); 30 read needs.*.outputs.*, all naming a status function) and check-workflow-context-availability: OK (... judged 1026 expression(s) ...).
  • pnpm check:ci-filter-parity: exit 0.
  • pnpm check:pm-expected-skips: exit 0. The roster is derived from if:, and no reader pins the old condition.
  • pnpm check:pm-dispatch-gates: exit 0 (fast tier, 1937 cases).
  • The other 44 derived commands: exit 0.
  • check:dts-closure, check:dual-build-cjs-loads, check:lean-entry-closure and check:sourcemap-no-sources-content: exit 3, PREREQUISITE NOT MET (no dist/ locally). These are Build Core's guards, and Build Core runs on this PR.

Generated by Claude Code

…pec budget

The Live E2E UI gate now ORs `core` into its ui / ui_consumers gate, so a
diff that reaches only the backend the Console runs against (objectql,
runtime, rest, plugins, the showcase app) no longer skips the one check
that drives the Console against a real server. The job comment records the
measurement behind choosing `core` over a narrower closure filter, and the
budget: the "Run the live e2e specs" step stays under 2 minutes.

Claude-Session: https://claude.ai/code/session_01QSeKYksGQkx7jCWdPyjy14
Co-authored-by: Claude <noreply@anthropic.com>
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:devx#2 · os-justin · session_01QSeKYmTYfaPbLQD4BJfomW

Contract-review-claim: session_01QSeKYmTYfaPbLQD4BJfomW · head a6abd5d · 2026-10-29T15:01Z

The lane seat starts the contract review at CONTRACT_REVIEW_TIER on this head, using an isolated reviewer subagent. The Tier H face is .github/workflows/ci.yml.


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:devx#2 · os-justin · session_01QSeKYmTYfaPbLQD4BJfomW

Contract-review-handoff: triage — CONTRACT_REVIEW_TIER unavailable (HTTP 429 rate_limit on the reviewer model, 2026-10-29T15:02Z) · head a6abd5d

This act withdraws the lane's claim 6500264356 on this head, so no live claim stands in triage's way. Per contract-review.md, the seat does not review at a lower tier. needs:contract-review goes on in the same act.

The face is Tier H: .github/workflows/ci.yml only (+27/−4). The diff widens the live-e2e-ui job's if: with || needs.filter.outputs.core != 'false' and adds a comment that carries the 2-minute budget. The ruling is on card #27550. The dev report is 6500118463; its open question is answered A, so the filter comment stays.

On this head, Live E2E UI ran and succeeded. The brief is the record-recognisers --brief-template --paths .github/workflows/ci.yml output, with card #27550 as its inputs. The seat's ACCEPT, the seat record and the approver request follow a same-head PASS.


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:devx#2 · os-justin · session_01QSeKYmTYfaPbLQD4BJfomW

Contract-review-claim: session_01QSeKYmTYfaPbLQD4BJfomW · head a6abd5d · 2026-10-29T16:37Z

No triage claim has posted since handoff 6500291373, so the lane seat retries the review at CONTRACT_REVIEW_TIER on this head, with an isolated reviewer subagent.


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:devx#2 · os-justin · session_01QSeKYmTYfaPbLQD4BJfomW

Contract-review-handoff: triage — CONTRACT_REVIEW_TIER unavailable (HTTP 429 rate_limit on the reviewer model, 2026-10-29T16:38Z) · head a6abd5d

This act withdraws the lane's retry claim 6502588668 on this head. The reviewer model is still rate-limited, as it was at handoff 6500291373, whose inputs and brief still apply. needs:contract-review stays on. Per contract-review.md, the seat does not review at a lower tier.


Generated by Claude Code

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ci/cd needs:contract-review size/s skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[devx] Live E2E UI skips every server-only PR: widen its gate to the server packages the Console runs against, and pin the spec-time budget

1 participant