Skip to content

ci(live-e2e): boot the workspace backend (HEAD console against HEAD backend) and make the four-spec live lane a required context — ruling 6435339772 Q1 A, re-based by #25914 letter D #27154

Closed

Description

@objectstack-fleet

Unblocked: #25914's ruling D step 1 landed via PR #27167 (b8615afaba); note 6465423743.

Filing gate ③ (maintainer-directed). Ruling 6464191239 on #25914 (batch #421 item 1, letter D, maintainer 「其他同意」 2026-10-28): step 2 of D. Filed by the director seat (session_01QSeKYo7qYsX6HsAneHBMP2, ledger objectstack#12708). ⛔ Not a claim; triage sets the lane (domain:devx expected) and grade.

Ruling-ref: 6464191239 (this card) · 6435339772 (Q1 A, the required check)

维护者速读

  • 改了什么: live e2e 的四条 spec(test:e2e:live:ci)改成用本树工作区的后端启动(HEAD console 对 HEAD backend),不再按已发布 npm 版本钉后端;同一个 PR 把它接进 ci.yml 并登记为 required。
  • 为什么改: 您 10-27 裁的「升为 required」建立在「它已经每个 PR 都在跑」上;现在它哪里都不跑,而且按已发布版本钉后端意味着每次发版都要同步抬钉、否则 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 的实测与再裁)。
  • 风险与回滚: Tier H(.github/workflows/ci.yml);回滚 = 还原 job 与 REQUIRED_CONTEXTS 一行。
  • 先看: ui/e2e/live/ci/start-backend.sh 的 prepare 步骤。
  • 两分钟验证: PR 上 required 名单里出现该 job 且绿;本地 5 次连续运行全绿。
  • 需要您做的: ruleset 里勾上该 job 名(席位做不了)。

Measured (on origin/main e6e41998, 2026-10-28)

Task

  • Re-shape ui/e2e/live/ci/start-backend.sh (and backend.env, which then declares no published pin) to boot the workspace backend: the tree's own built @objectstack/cli on the checked-out examples/app-showcase, seeded admin, same ports and readiness poll. Keep stop-backend.sh's PID contract.
  • Add a ci.yml job that builds the console (VITE_BASE_PATH=/), boots that backend, serves vite preview with the dev proxy and runs pnpm test:e2e:live:ci --retries 0 on pull_request and merge_group, gated on the ui path filter the way Build & E2E UI is. ⛔ No retry wrapper, no continue-on-error, no spec edited or skipped to get green.
  • Enrol the job's name: in REQUIRED_CONTEXTS (scripts/check-required-contexts.mjs); the ruleset click is the maintainer's.
  • Measure before wiring: 5 consecutive green runs on this tree, wall time reported in the PR body. A red run is re-ruling input, not a retry.

Tier H (.github/workflows/**): the PR waits for an authorised approval. Clause-②: no · Metadata-protocol: none.

Serial: after #25914's pin-bump PR (same files). Dedupe: #25914 thread (6454590103, 6461501278, 6461924763, 6463293878); #26717 row 17 (live-e2e.yml roster); no open card asks for a workspace boot.

Activity

  1. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    Unblocked · devx seat 2 · 2026-10-28T09:29Z · ⛔ not a claim

    Blocked-by: #25914 is cleared: ruling D step 1 landed via PR #27167 (merged as b8615afaba), so ui/e2e/live/ci/backend.env pins 18.2.0 and the four-spec lane is green by hand (5/5). pm:blocked → pm:queue in this act.


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 5 · 2026-10-28T09:44Z
    Session: session_01QSeKYmTYfaPbLQD4BJfomW (dispatching seat; the cloud session is named in the dispatch note under this claim)
    Account: os-justin (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-27154-live-e2e-workspace-backend
    Worktree: the cloud session's own container
    Domain: domain:devx
    Seat: domain:devx#2
    File surface: the card's four tasks, ruling 6464191239 letter D step 2 and ruling 6435339772 Q1 A. (1) Re-shape ui/e2e/live/ci/start-backend.sh and backend.env to boot the WORKSPACE backend: the tree's own built @objectstack/cli on the checked-out examples/app-showcase, seeded admin, same ports and readiness poll, stop-backend.sh's PID contract kept. The published pin retires. (2) Add a ci.yml job that builds the console with VITE_BASE_PATH=/, boots that backend, serves vite preview with the dev proxy and runs pnpm test:e2e:live:ci --retries 0 on pull_request and merge_group, gated on the ui path filter the way Build & E2E UI is. (3) Enrol its name: in REQUIRED_CONTEXTS (scripts/check-required-contexts.mjs) with every pin that gate and its siblings demand. (4) Measure before wiring: 5 consecutive green local runs on the workspace boot, with wall time in the PR body. ⛔ No retry wrapper, no continue-on-error, no spec edited or skipped. A red run is re-ruling input, not a retry. If the workspace boot needs a new mechanism beyond re-shaping the existing scripts, that is a fork too. The ruleset click stays the maintainer's. PR Fixes #27154. Tier H (stop on breach; explain in the report)
    Container & model: M, mode:cloud, model: TIER_DEFAULT (dispatch-gates --tier: "no path-derived mandate"), effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — not a defect card
    Ruling-ref: 6464191239
    Thread-read: 6465423743
    Premise: holds at origin/main 2f96d874fa. backend.env pins 18.2.0 (PR #27167), and the lane is green by hand 5/5 on the published boot. No workflow under .github/ runs test:e2e:live:ci.
    Serial constraints cleared: open draft PR #27136 edits ci.yml only in the UI-job region around L3539, a different hunk from a new job. No open PR touches ui/e2e/live/ci/ or scripts/check-required-contexts.mjs. Whichever lands second merges main.


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    Dispatch note · devx seat 2 · 2026-10-28T09:47Z

    Claim 6465707880 dispatched to cloud session session_01QSeKYoUcDM1MUzjdaCjt6U, outcome branch claude/issue-27154-live-e2e-workspace-backend.


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 27154,
      "status": "done",
      "branch": "claude/issue-27154-live-e2e-workspace-backend",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/27212",
      "session": "session_01QSeKYoUcDM1MUzjdaCjt6U (dispatched by seat session_01QSeKYmTYfaPbLQD4BJfomW, claim 6465707880, which names this branch)",
      "premise_still_valid": true,
      "summary": "All four claim parts done in one draft Tier H PR. (1) ui/e2e/live/ci/start-backend.sh now boots the WORKSPACE backend: the tree's built @objectstack/cli via examples/app-showcase/node_modules/.bin/objectstack runs `objectstack dev --seed-admin --fresh -p 4010` from the checked-out showcase, with the same port, readiness poll and pid file (stop-backend.sh unchanged). prepare only checks the build prerequisite and refuses by name. backend.env declares LIVE_BACKEND_APP=examples/app-showcase and no published pin; the tag resolve, npm install and vitest override retired. No new mechanism was needed. (2) Measured 5/5 green with --retries 0 before wiring. (3) ci.yml job `live-e2e-ui` / `Live E2E UI` builds the CLI+showcase closure and the seven Console packages, runs vite build with VITE_BASE_PATH=/, provisions Chromium via ensure-chromium-ready.sh, boots the backend, serves vite preview :5190 with DEV_PROXY_TARGET, and runs `pnpm --dir ui run test:e2e:live:ci --retries 0`. Its `if:` is Build & E2E UI's verbatim. No continue-on-error anywhere in the job, no retry wrapper, no spec touched. (4) REQUIRED_CONTEXTS row, plus mustName on both statesTheSet surfaces, AGENTS.md (nine to ten) and platform-readings.md (九个 to 十个). The ensure-chromium-ready pin now reads the new job too. The maintainer's ruleset click is named as the one step left. origin/main merged (191e9d5e); no rebase, no force-push. Process note: the shared checkout was detached so the branch could live in worktree ../objectstack-issue-27154 (the main-checkout guard blocked edits); one local commit was amended BEFORE its first push, because check:commit-card-trailers refused the harness's model-named co-author trailer.",
      "tests": "5-run measurement on the workspace boot at 7a48258d (base 2f96d874): turbo build of CLI+showcase closure + seven Console packages 65/65 tasks (384 s cold, lock VERDICT command-exit 0); VITE_BASE_PATH=/ vite build exit 0 (119 s); start-backend.sh exit 0, ready in 19 s ('prepare: workspace @objectstack/cli 18.2.0 on examples/app-showcase'); vite preview :5190 proxying /api to :4010; LIVE_API_URL=http://localhost:4010 LIVE_APP_URL=http://localhost:5190; one backend reused across runs. run1 EXIT=0 26s | run2 EXIT=0 23s | run3 EXIT=0 22s | run4 EXIT=0 23s | run5 EXIT=0 21s; every run 5 passed: action-modal, master-detail x2, saved-view-filter, screen-flow (Playwright totals 24.1/20.5/20.7/21.2/19.9 s). Shared-box seconds. Teardown by recorded pids (stop-backend.sh 'stopped pid 7809'; the preview processes I started, by pid). pnpm --dir ui exec vitest run scripts/ under the lock: 175 files passed, 2 skipped; 5020 tests passed (VERDICT command-exit 0). That run covers the edited ensure-chromium-ready.test.ts and root-ci.ts. No ablation: the diff is scripts, workflow and docs.",
      "gates": "dispatch-gates --commands --repo objectstack-ai/objectstack at 191e9d5e (after merging origin/main; 8 paths): 87 commands, each exit captured before any pipe. 85 exit 0, among them check:required-contexts (lists ci.yml:live-e2e-ui -> 'Live E2E UI'), check:workflow-status-functions OK, check:stall-guard-budget OK, check:pm-expected-skips, check:aggregator-roster, check:bash32-floor (177 cases), check:ci-filter-parity, check:pm-skill-ratchet and check:step-collectors. Two non-zero, neither a verdict on the diff: check:dual-build-cjs-loads exit 3, PREREQUISITE NOT MET (no full pnpm build here; NOT MEASURED, CI's Lint carries it). check:dts-closure exit 1 named only ui/apps/console/plugin.d.ts, missing from the gitignored dist that my bare vite build left; with that dist removed, `node scripts/check-dts-closure.mjs` exits 0 (233/233 present). --ran with exit codes: 87 derived, 86 run, 1 NOT-MEASURED (the exit 3), 0 UNRUN. PR check-runs: in_progress at report time, not awaited.",
      "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
      "mcp_calls": "0",
      "api_writes": "2: POST /repos/objectstack-ai/objectstack/dispatches (fleet-write relay pr_create: draft PR #27212 with assignee os-justin and label skip-changeset; read-back 7508/7508 bytes identical, assignee listed, label confirmed by REST read) and this os-dev-report comment on #27154 via scripts/pm/post-stamped.mjs. git push (3 pushes to the claim branch) is not REST.",
      "open_questions": [
        {
          "question": "The job is gated like Build & E2E UI (ui || ui_consumers), as the claim requires. So a PR that changes only backend packages outside ui/ and the seven ui_consumers packages (e.g. packages/runtime, packages/cli) skips the live lane, though the lane now runs that backend. Widen the gate?",
          "options": ["A: keep it as is; a backend regression surfaces on main's push run or on the next ui PR", "B: a follow-up card ORs `core` into this job's if: so backend PRs run it too (cost: the job's ~12 min on most PRs)"],
          "recommendation": "A for this PR (it is the ruled shape); the seat can file B if main-reds from backend PRs show up in this lane."
        },
        {
          "question": "timeout-minutes: 40 comes from one cold local run (about 730 s, by the rule above Lint UI), because there is no CI population. Re-derive it?",
          "options": ["A: re-derive from the first 20+ CI runs in a later card", "B: leave it"],
          "recommendation": "A: the derivation note beside the job already asks for it."
        }
      ],
      "out_of_scope_findings": [
        "carrier: none · noted, not filed (doc drift): the header comment of ui/e2e/live/saved-view-filter.spec.ts still describes the retired OBJECTSTACK_VERSION pin in backend.env. The claim forbids editing specs, so it is listed in the PR's Acceptance notes. Dedupe words: saved-view-filter OBJECTSTACK_VERSION, live e2e backend pin comment",
        "carrier: none · noted, not filed (comment drift): ci.yml's filter-job comment says 'the four `* UI` jobs' read the ui outputs, and Live E2E UI now reads them too. Listed in Acceptance notes."
      ]
    }

    Generated by Claude Code

  5. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    Addendum (patch round) to 6467006688.

    {
      "issue": 27154,
      "status": "done",
      "branch": "claude/issue-27154-live-e2e-workspace-backend",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/27212",
      "session": "session_01QSeKYoUcDM1MUzjdaCjt6U (patch round from seat session_01QSeKYmTYfaPbLQD4BJfomW; addendum to report 6467006688)",
      "premise_still_valid": true,
      "summary": "Patch round: the seat's defect reading holds. At head 191e9d5e, ci.yml's new job had `LIVE_BACKEND_DIR: ${{ runner.temp }}/live-backend` in its job-level env:. The `runner` context is not available there, so the workflow did not validate and CI never started. Fixed in 9264ac22 (one commit, pushed on top; no rebase, no force-push): LIVE_BACKEND_DIR moved to the step-level env: of 'Boot the workspace backend' and 'Stop the workspace backend'. The upload step keeps `${{ runner.temp }}` in `with:`, where that context is allowed. A comment beside the job env says why. actions/checkout@v7 and actions/setup-node@v7 are the tags the rest of ci.yml uses (17 and 7 uses), so they are unchanged. CI now runs, and `Live E2E UI` concluded success on the pull_request run. PR body changes for the seat to write: (a) in Tests, add the CI reading below and the new head 9264ac22; (b) in Acceptance notes, the ceiling note can cite one CI reading (81 s, warm caches) beside the cold local derivation; (c) in What changes, LIVE_BACKEND_DIR is set per step, not in the job env.",
      "tests": "Validation, with actionlint 1.7.12 (pip actionlint-py) and its shellcheck/pyflakes integrations off. Fixed ci.yml at 9264ac22: exit 0, no findings. Control on the broken head 191e9d5e: exit 1, `ci.yml:4488:29: context \"runner\" is not allowed here. available contexts are \"github\", \"inputs\", \"matrix\", \"needs\", \"secrets\", \"strategy\", \"vars\"` (4 lines of output). origin/main's ci.yml: exit 0. Re-run on 9264ac22, each exit captured before any pipe: check:required-contexts 0, check:workflow-status-functions 0, check:stall-guard-budget 0, check:pm-expected-skips 0, check:ci-filter-parity 0, check:workflow-step-name-quoting 0; vitest ensure-chromium-ready.test.ts + turbo-cache-save-bound.test.ts exit 0, 53/53. CI on 9264ac22: pull_request run 40676242784 exists. `Live E2E UI` (job 122775469774) completed with conclusion success, 10:58:27Z to 10:59:48Z = 81 s of job wall time. Steps, from the log: the closure build took 1 s (turbo restore); the Console vite build 'built in 9.92s'; Playwright browsers came from the cache; 'Chromium launches with the libraries already present'; '[live-backend] prepare: workspace @objectstack/cli 18.2.0 on examples/app-showcase at b9ce2734' (the PR merge ref), ready on :4010 in 10 s; the specs ran 'playwright test ... --retries 0' with 'Running 5 tests using 1 worker' and all 5 passed (action-modal; master-detail x2; saved-view-filter; screen-flow): '5 passed (16.3s)'; 'stopped pid 2713'; the upload step was skipped (no failure). The rest of that run was still in progress at this reading (Build Core, Lint UI, Type Check UI, Build & E2E UI, 24 jobs in progress, 5 success, 4 skipped, no failure) and was not awaited.",
      "gates": "Local subset re-run on 9264ac22 (above), all exit 0. The full derived set (87 commands) was run at 191e9d5e in the first report. This patch changes only ci.yml lines inside the new job, so the set derived from those paths is the same. PR check-runs: CI is now present on the head; Live E2E UI is success; the other contexts were in_progress at report time.",
      "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
      "mcp_calls": "2 — ToolSearch load of mcp__github__get_job_logs, and 1 read: mcp__github__get_job_logs (job 122775469774). No MCP write.",
      "api_writes": "1 this round: this addendum comment on #27154 via scripts/pm/post-stamped.mjs. git push (1, to the claim branch) is not REST. The first round's 2 writes are as reported in 6467006688.",
      "open_questions": [
        {
          "question": "No repo gate catches a context used where GitHub does not allow it (here: `runner` in jobs.ID.env). The whole workflow then fails validation, CI never starts, and the PR shows a false green made of other workflows' checks. Which gate should own this?",
          "options": [
            "A: run actionlint in lint.yml's Lint & Repo Gates over .github/workflows (expression and context checks only, shellcheck off), pinned to a version, as a follow-up card",
            "B: extend scripts/check-workflow-status-functions.mjs, which already parses every job-level if:, with GitHub's context-availability table for job-level keys (env, if, runs-on, timeout-minutes, strategy, ...)",
            "C: none; rely on the missing-required-context signal"
          ],
          "recommendation": "B for a narrow, network-free, repo-owned pin in an existing parser, or A if the seat accepts a new tool dependency. Either way it is a follow-up card candidate (dedupe words: workflow context availability, runner context job env, actionlint, invalid workflow false green). C is what just failed: the required contexts were simply absent, and nothing went red."
        }
      ],
      "out_of_scope_findings": [
        "class: none filed · carrier: devx seat (follow-up card candidate, see open_questions) · noted: an invalid ci.yml produces only a push run with conclusion failure and 0 jobs, no pull_request run, and no check-run that any PR gate reads, so a PR's checks read green. Dedupe words: invalid workflow, 0 jobs run, context not allowed, false green"
      ]
    }

    Generated by Claude Code

  6. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    Addendum 2 (text patch round) to 6467006688 / 6467269542 · PR #27212 · session_01QSeKYoUcDM1MUzjdaCjt6U

    {
      "issue": 27154,
      "status": "done",
      "branch": "claude/issue-27154-live-e2e-workspace-backend",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/27212",
      "head": "3f0b396fae04325ab7894a7100cfe73cdc302df0",
      "summary": "Both should-fixes are done in one commit, 3f0b396f, pushed on top of 9264ac22 (no rebase, no force-push). (1) docs/agents/multi-agent-discipline.md, section 'Advisory checks ride through': 'A check outside those nine is advisory' now reads 'ten'. The section has no other count of the required set. (2) In ci.yml's filter-job comment, the ui outputs are 'read together by the five `* UI` jobs ... (Type Check UI, Test UI, Lint UI, Build & E2E UI and Live E2E UI)', and the merge_group sentence's 'skips the four ui jobs' now reads 'five'. Left as is: the 'four ui jobs' at Build UI Deps (the union of the conditions of the jobs that need ui-deps, and the build command they share). Live E2E UI does not need ui-deps, so that four is still right. timeout-minutes: 40 is untouched, as asked.",
      "tests": "On 3f0b396f, each exit captured before any pipe: actionlint 1.7.12 -shellcheck= -pyflakes= .github/workflows/ci.yml :: exit 0, no findings; pnpm check:required-contexts :: exit 0; pnpm check:workflow-status-functions :: exit 0; pnpm check:ci-filter-parity :: exit 0; pnpm check:doc-authoring :: exit 0. The derived set gained check-adr-links for the docs path: node scripts/check-adr-links.mjs --self-test :: exit 0, node scripts/check-adr-links.mjs :: exit 0. CI: pull_request run 40678137074 exists on 3f0b396f. Live E2E UI (job 122782123641) completed with conclusion success, 11:13:30Z to 11:14:57Z = 87 s of job wall time. Step timings: Console build 11 s, backend boot 10 s, the specs 18 s, success; the failure-artefact upload was skipped. The rest of the run was in progress at this reading (25 in progress, 5 success, 4 skipped, no failure) and was not awaited.",
      "pr_body_changes_for_the_seat": "In Tests, add the head 3f0b396f with Live E2E UI success, 87 s. In What changes, add one line: docs/agents/multi-agent-discipline.md's advisory sentence now counts ten, and the filter-job comment counts five ui jobs. In Acceptance notes, drop the bullet clause that says the filter comment still says four.",
      "mcp_calls": "0 this round",
      "api_writes": "1 this round: this comment via scripts/pm/post-stamped.mjs. git push (1, to the claim branch) is not REST."
    }

    Generated by Claude Code

  7. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed: PR #27212, merged as dfe85c9a54 through the merge queue (enqueued and merged by os-zhuang) · 2026-10-28T11:48Z

    Merged = reviewed. The merged diff matches the reviewed head 3f0b396fae: the sorted +/− lines are hash-identical, 9 files, +292/−219. Seat record → PR #27212 comment 6467804940. Contract review: 6467449484 (PASS) and delta 6467543514 (PASS). A GOVERNED_APPROVERS account merged it by hand through the queue, which counts as the review of record. The card was closed by Fixes #27154. pm:dispatched is removed from this card, and needs-user-decision from the PR, in this act. Cloud session session_01QSeKYoUcDM1MUzjdaCjt6U is archived in this act.

    Left for the maintainer: add Live E2E UI to the main ruleset's required status checks. Until then, check-required-contexts --verify-required-set reports the row in direction A (pinned, not required), report-only.

    Follow-ups: #27227 (workflow context-availability gate, dispatched) and #27228 (ceiling re-derivation and spec header; on hold until the first CI population exists).


    Generated by Claude Code

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

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions