Skip to content

test(ui): promote the Studio live specs into Live E2E UI, with a stored-state re-read each - #27770

Merged
objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/project-thread-urez9i
Oct 29, 2026
Merged

objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/project-thread-urez9i

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Requested by Bill · project thread
Fixes #27554

Clause-②: no
Metadata-protocol: none

维护者速读

What changes

  • ui/package.json: studio-object-designer.spec.ts and studio-editor.spec.ts move from test:e2e:live:nightly to test:e2e:live:ci, the allowlist the required Live E2E UI job runs. Both passed the promotion rule (readings below), so neither stays in nightly and no header carries a "kept in nightly" reason.
  • studio-object-designer.spec.ts F4 now saves and reads back. The showcase package is provided by code, so a save into it is refused (WRITABLE_PACKAGE_REQUIRED, measured: PUT /api/v1/meta/object/NAME?mode=draft&package=com.example.showcase answers 422). F4 therefore authors its own package through POST /api/v1/packages, opens the designer on it, runs the same picklist + empty-row steps and the same two negative banner assertions as before, clicks Save, asserts the PUT ...?mode=draft answered 2xx, and reads GET /api/v1/meta/object/NAME?state=draft: the stored object has exactly one select field and its options equal [{ value: 'open', label: 'Open' }], so the empty row was not stored. The package is deleted in finally, as F1 already does for its own.
  • studio-editor.spec.ts "Add block opens a block-type picker…" now picks Card after asserting the picker, waits for the editor's autosave PUT /api/v1/meta/page/NAME?mode=draft (asserted 2xx), and reads GET /api/v1/meta/page/NAME?state=draft: the first region holds one more block than the shipped copy, and the new last block is page:card.
  • Both headers say they are in the :ci allowlist since this card, under the rule, the way saved-view-filter.spec.ts says it.

Why

The card's task 1–4: measure, promote what passes the 3/3 + 5/5 rule, add one stored-state re-read per spec, stay inside #27550's 2-minute budget for the Run the live e2e specs step. Both specs fit, so the higher-yield-only fallback (F4 / F1) did not apply.

Verification

All runs: this branch's workspace backend (ui/e2e/live/ci/start-backend.sh, objectstack dev --seed-admin --fresh on examples/app-showcase, port 4010) and the Console production build (VITE_BASE_PATH=/ vite build) served by vite preview on 5190 with DEV_PROXY_TARGET, the Live E2E UI job's stack step for step; --retries 0; one long-lived backend across all runs (the CI job boots a fresh one per run, so this is the harder condition). Container: 4 shared cores.

Reading Runs Result Playwright total per run
Baseline, both specs unchanged (task 1) 10 10/10 green, 60/60 tests 16.4–17.9 s
Both specs as changed here 10 10/10 green, 60/60 tests (incl. 3/3 consecutive) 19.1–20.0 s
Enlarged allowlist, pnpm run test:e2e:live:ci (task 2's 5/5) 5 5/5 green, 55/55 tests 33.9–37.2 s (wall 35.3–38.7 s)
Incumbent four specs alone (control) 3 3/3 green 16.7–17.8 s (wall 18.0–19.3 s)
Per-test time, 10 runs each (mean / max)
Test Before After
designer F1 (package switcher) 2.4 / 2.5 s 2.4 / 2.5 s
designer F2 (typed underscore) 2.1 / 2.2 s 2.2 / 2.3 s
designer F3 (label to API name) 2.3 / 3.3 s 2.4 / 2.6 s
designer F4 (picklist empty row; now saves + re-reads) 3.6 / 4.0 s 4.0 / 4.4 s
editor, page editor loads 2.8 / 3.0 s 2.8 / 3.0 s
editor, Add block picker (now adds Card + re-reads draft) 2.8 / 3.1 s 4.6 / 5.0 s

Budget: the two specs add about 18–20 s to the step locally (incumbent four 18–19 s wall, enlarged six 35–39 s). The job comment in ci.yml measured the incumbent step at 14–24 s (median 21 s) on CI, so the projected step is about 40 s, against the 120 s budget. This PR's own Live E2E UI run is the first CI reading.

Nightly readings: the nightly live tier that runs test:e2e:live:nightly (examples/app-showcase/test/console-live-specs.live.test.ts) has at most two scheduled runs since it was wired (2026-10-28 and 2026-10-29), and both of those Nightly tiers runs failed on other shards' packages; their per-spec logs were not readable from this container (the job-log download is refused by the proxy). The ≥ 10 readings are therefore the local ones above, which the card allows.

No ablation: the diff changes tests and a script list only, no product behaviour.

Gates at head 75f8060c: node scripts/pm/dispatch-gates.mjs --commands derived 31 families from the three changed paths; each ran locally, plus node scripts/check-sdui-manifest.mjs: 32 lines, every one exit 0; --ran reconciliation: 31 derived, 31 run, 0 NOT-MEASURED, 0 UNRUN. CI runs the rest (the repo-wide scans, Live E2E UI itself).

Gate lines (command :: exit code)
node scripts/check-closing-keyword-parity.mjs :: exit 0
node scripts/check-closing-keyword-parity.mjs --self-test :: exit 0
node scripts/check-comment-mask-corpus.mjs :: exit 0
node scripts/check-osv-exemptions.mjs :: exit 0
node scripts/check-osv-exemptions.mjs --self-test :: exit 0
node scripts/osv-base-relative.mjs --self-test :: exit 0
pnpm --filter @objectstack/spec run check:llms-txt :: exit 0
pnpm check:changeset-fixed :: exit 0
pnpm check:cross-package-test-inputs :: exit 0
pnpm check:dispatcher-error-vocabulary :: exit 0
pnpm check:driver-memory-census :: exit 0
pnpm check:engine-double-contract :: exit 0
pnpm check:gitlink-declared :: exit 0
pnpm check:manifest-repository-directory :: exit 0
pnpm check:merge-driver :: exit 0
pnpm check:nul-bytes :: exit 0
pnpm check:override-consistency :: exit 0
pnpm check:pnpm-flag-spellings :: exit 0
pnpm check:published-files :: exit 0
pnpm check:query-options-erasure :: exit 0
pnpm check:refd-timer-probe :: exit 0
pnpm check:test-source-alias :: exit 0
pnpm check:tier-file-adoption :: exit 0
pnpm check:turbo-task-graph :: exit 0
pnpm check:type-check-coverage :: exit 0
pnpm check:type-check-debt :: exit 0
pnpm check:undeclared-dep-imports :: exit 0
pnpm check:vendor-export-contract-resolve :: exit 0
pnpm check:watch-hint-literal :: exit 0
pnpm check:where-matcher :: exit 0
pnpm check:workspace-manifest-cycles :: exit 0
node scripts/check-sdui-manifest.mjs :: exit 0

Acceptance notes


Generated by Claude Code

…ed-state re-read each

The object designer (F1-F4) and page editor specs move from
test:e2e:live:nightly into test:e2e:live:ci under the promotion rule:
10/10 local runs on the workspace backend before and after the change,
3/3 consecutive green, and a 5/5 run of the enlarged allowlist.

Each spec now reads back what the save stored through /meta: F4 saves the
new object's draft into an environment-authored package (the showcase is
code-provided and refuses saves) and asserts the stored picklist carries
the one authored option and not the empty row; the page editor's Add block
autosaves a draft, and the draft holds the new page:card block.

Claude-Session: https://claude.ai/code/session_01Utp6CaYrosoxy8gyWwRM83
Co-authored-by: Claude <noreply@anthropic.com>
@objectstack-fleet objectstack-fleet Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Oct 29, 2026
@github-actions github-actions Bot added size/m dependencies Pull requests that update a dependency file tests labels Oct 29, 2026
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:ui#3 · os-bill · session_01Utp6CaJoinvGQSbHeDaWBe

席位核对

ACCEPT · head 75f8060c · 2026-10-29T23:00Z

  • Shape: draft → main, Fixes #27554 on its own line. Clause-②: no and Metadata-protocol: none match the claim; test-only (two ui/e2e/live/studio-*.spec.ts plus the test:e2e:live:ci / :nightly lists in the private ui/package.json), skip-changeset is right. No contract review owed.
  • Premise, measured: both Studio specs pass the promotion rule and move whole into test:e2e:live:ci (baseline 10/10, after 10/10 with 3/3 consecutive green, enlarged allowlist 5/5, 11 tests; step 35–39 s against 18–19 s before, well inside the 2-minute budget). Each now re-reads stored state: F4 saves into a package the run authors (the showcase is code-provided, so a save there answers 422 WRITABLE_PACKAGE_REQUIRED) and reads the draft back through /meta?state=draft with exactly the one authored option and no empty row; the page editor's Add block → Card waits on the draft PUT and reads back one more block, page:card, at the end of the first region. Diff read on 75f8060c.
  • Gates (check-runs on the head): 45 success, 16 skipped, 0 failure, Live E2E UI included. check-governed-merges --pr 27770: NOT governed, 115 changed lines.
  • Acceptance notes, accepted: three stale texts outside the file face (the ci.yml comment's "four", the console-live-specs header, the F4 note in studio-authoring.json) stay for their own edit; the nightly readings are local because the proxy refused the log download. test(ui): live e2e signs in a read-not-write member and asserts the Console refuses coherently (#27552) #27768 edits the same :nightly line; the later lander merges main.
  • Landing: non-governed, all checks green, mergeable_state clean ⇒ the seat lands it (pr_ready + automerge_enable).

Generated by Claude Code

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 29, 2026 23:01
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge October 29, 2026 23:01
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 29, 2026
Merged via the queue into main with commit e5cce09 Oct 29, 2026
62 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/project-thread-urez9i branch October 29, 2026 23:35
os-bill pushed a commit that referenced this pull request Oct 29, 2026
…-l13hln

Resolves the ui/package.json conflict with #27770: its live:ci and nightly
lines kept, plus read-only-member-record.spec.ts in the nightly list.

Claude-Session: https://claude.ai/code/session_01Utp6CbDmdfNUqBtfbQtu5T
Co-authored-by: Claude <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file size/m skip-changeset PR has no user-facing published change; bypasses the changeset gate tests

Projects

None yet

1 participant