Repository navigation
test(e2e/live): the eleven stale live specs, each brought back to the shipped showcase or retired (objectui#13104) - #13132
Merged
objectstack-fleet[bot] merged 5 commits intoOct 20, 2026
Conversation
…e and the shipped showcase Each spec is re-measured against the shipped showcase (objectstack main, console pin 12dc7b4) and repaired at the cause it hit, with no assertion weakened to pass: - form-view-subforms, grid-file-upload: the Line Items section is found by its heading role; a bare text match also hit the dialog's sr-only description and failed strict mode. - grid-file-upload: the line's receipt follows ADR-0104's stored form, an opaque file id, and is read back through the file door byte for byte. - cascading-options: the flat ModalForm is awaited by its own footer. - detail-related-list: a row opens /record/ID, and the primary Projects related list is its own tab (rule Z), read on Northwind. - field-conditional-rules: a readonlyWhen field renders the read-only field group in place of the input. - studio-record-page: the Object control is a combobox, and Page type defaults to list, so record is picked. - studio-object-designer: off the Studio app no stock boot loads; F1 runs on the Studio surface's package switcher; F4 gives the picklist an option source before adding the empty row. - user-filters: tabs on Task Triage (ADR-0053), the switcher in the Display popover with the shipped whitelist, gridcell roles; the lookup quick-filter case is retired (no shipped fixture). - inline-edit-polish-2572: its own project per run; manager_review is lockRecord: false, so the pending approval reads editable. - record-history-display: targets showcase_account, the showcase's trackHistory object, with no skip guard. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014MXhk1yjWh37d634hLy3p7
…tion, at exec_review The draft replaced item 2's lock assertion with an "In approval · editable" reading. What was stale is the fixture, not the behaviour: the request opens on `manager_review`, which declares `lockRecord: false`. The locking step is `exec_review` (`lockRecord: true`), reached when `manager_review` is approved and the budget is above the flow's 500k decision edge. So the budget edit now goes to 600000, the editable reading at `manager_review` stays as an addition, the test approves `manager_review` through POST /api/v1/approvals/requests/ID/approve (the seeded admin holds the `manager` position), waits for the pending `exec_review` request with `lock_record: true`, and then asserts the original lock: zero "Double-click to edit" affordances after a fresh mount, the "Locked for approval" band, and a double-click on Budget that opens no session. Measured on the shipped showcase (objectstack main d20bf9b09, `objectstack dev --fresh`) with this worktree's console dev server: - BASE df943a2: red (the lock poll read 8 affordances where 0 were expected). - this commit: green, 1 passed (24.3s). Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014MXhk1yjWh37d634hLy3p7
…k is not vacuous; correct two citations
studio-object-designer:
- F1 now finds the new package in the open switcher by its name followed by
its id. The draft matched the id alone; the name is what only the refreshed
list carries, which is what the original F1 asserted (an `option` named by
the package name).
- The draft cited ADR-0048 for "no stock boot loads the Studio app".
objectstack's ADR-0048 is about cross-package metadata collision, so both
comments now state the reading and its instrument instead: the served apps
are what GET /api/v1/meta/app lists, and the sidebar `package-switcher`
renders only for an app that declares `contextSelectors`.
record-history-display:
- Asserts the "Customer Since" diff line is present before asserting no raw
YYYY-MM-DD, so the date-localization check cannot pass on an absent line.
- The header names where the two legs the showcase cannot drive are pinned:
`auditHistoryDisplay.test.ts` ("localizes booleans through t with Yes/No
fallback", "localizes datetime values instead of raw ISO strings").
Measured on the shipped showcase (objectstack main d20bf9b09) with this
worktree's console dev server:
- studio-object-designer at this commit: 4 passed (F1, F2, F3, F4).
BASE df943a2: F1 timed out, F4 failed (banner: "A `select` field needs its
choices").
- record-history-display at this commit: 1 passed. BASE: skipped (its
app-todo guard). Panel text read once: "Customer Since: 7/26/2026 ->
8/4/2026".
Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014MXhk1yjWh37d634hLy3p7
…2 reads The R1 repair read the approvals API's rows as `any`, which took the file from 3 to 4 `no-explicit-any` warnings. A local `ApprovalRequestRow` type (id, status, flow_node_id, lock_record) replaces both, leaving the file at 2, below BASE df943a2's 3. `pnpm type-check:e2e` exit 0. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014MXhk1yjWh37d634hLy3p7
…d reads its layout on the canvas Row 12 of objectui#13104, measured before editing. Both causes are intended product states, not regressions: - The shipped `showcase_project_workspace` opens read-only. `page` is a create-only type (`allowEnvironmentOverlay: false`, `allowRuntimeCreate: true`), and ADR-0005's two-tier rule (addendum PR-10d.7) keeps an item a code package ships immutable on such a type. ResourceEditPage's two-tier gate applies it; since objectstack#21670 the layered read's protection envelope also reports it (lock no-overlay, editable false), which draws the "This item is locked" banner. - There is no "Layout" section heading. objectui 29bc4bf (objectui#2308) prunes `regions` from the page form (`PAGE_FIELDS_OWNED_ELSEWHERE`) because the block tree is edited on the canvas, leaving no bare section header. objectstack#7753 item 6 (closed 2026-08-11) had already recorded both causes ("a SHIPPED page the editor correctly locks"). The Tier 1 run objectstack#24598 never ran this spec: its pins for that item were studio-record-page only. The repair keeps every assertion and re-points the stale two: - each test authors an editable copy of the shipped page in the environment (GET the shipped page, PUT it under a fresh name, DELETE it in `finally`); - "config sections": Basics as before, plus Data Context, and a guard that no lock banner stands in front of the editor; - "Layout" now reads where the layout renders: one Add block per region (count derived from the copied page) and the canvas's Add region; - Add block and the picker's Card / Section / Record details are unchanged. Measured on the shipped showcase (objectstack main d20bf9b09): - BASE df943a2: 0/2 (heading Layout not found; Add block absent, timeout); - this commit: 2/2 passed (22.3s); the page list holds no e2e_ leftovers afterwards. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014MXhk1yjWh37d634hLy3p7
Contributor
Author
席位核对 · ACCEPT · objectui#13104 · PR #13132 ·
|
objectstack-fleet
Bot
deleted the
claude/issue-13104-live-specs-current
branch
October 20, 2026 05:17
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #13104
Clause-②: no
Every row has its conclusion: the card's eleven, plus
studio-editor, which the claim's amendment (comment6283451551) added as row 12. Eleven specs are repaired against the current surface and the shipped showcase. One case is deliberately retired (user-filters' lookup quick filter).screen-flowneeds no change because its red does not reproduce. ⛔ No product source is touched; the diff is eleven files undere2e/live/. Notest.skip/test.fixmeis added, andrecord-history-display's skip guard is gone.This is a resume dispatch. The first dev's draft (
2f09525) was unverified when its container restarted. Every row below was re-measured, red on BASEdf943a2and green on this head. Three commits on top of the draft change what did not hold (R1, R4, R5 below). Patch round 1 adds8493767for row 12. Session:https://claude.ai/code/session_014MXhk1yjWh37d634hLy3p7.How it was measured
maind20bf9b09, whose.objectui-shais the shipped console pin12dc7b47c340. Itsexamples/app-showcaseran from a built objectstack worktree withobjectstack dev --seed-admin --fresh -p 4113, on a fresh database for each whole-suite run.cd apps/console && DEV_PROXY_TARGET=http://localhost:4113 pnpm exec vite --port 5213 --strictPort). The diff touches onlye2e/live/, so the console source under test is BASE's.pnpm exec playwright testwithplaywright.live.config.tswrapped only to addexecutablePath: /opt/pw-browsers/chromium. This container's Playwright 1.62.1 wants chromium revision 1234, and 1194 is the one installed. The BASE specs ran from agit archive df943a2 e2e/livecopy.e2e/live/, in one run, alphabetical, one worker, as the Tier 1 run (QA run · tier1:automated-pins (149/166) · ba4afcc2 · 2026-10-19 · 60 PASS / 89 PARTIAL / 0 FAIL / 0 BLOCKED / 17 NOT-RUN objectstack#24598) ran them.3afb8d1(round 1): 59 passed, 2 failed, bothstudio-editor.8493767(patch round 1, row 12 repaired): 61 passed (11.0m), exit 0. Every spec is green,studio-editorincluded.e2e/live/ci/start-backend.sh, published@objectstack/*@18.0.0-next.5plus the showcase at its release tag (820fd5ae), on:4114, with a second console dev server on:5214. The head3afb8d1whole-suite run there gave the same reading as the primary: 59 passed, 2 failed, bothstudio-editor. In patch round 1 the repairedstudio-editoralso ran there at8493767: 2 passed.backend.envis not edited.Per-row conclusions
Before = BASE
df943a2, after = the final head, both read from the whole-suite runs above (tests passed / tests in the spec).studio-object-designerselectfield needs its choices", for a picklist with no option sourcestudio-record-pagegetByLabel(/^Object/i)resolves first to the app bar's "ObjectOS home" link, and the Object control is arole=combobox; Page type now defaults to listuser-filtersview-tab-urgent(ADR-0053 made tabs an interface-page element); switcher: not in the toolbar; hollow view:cellwhere the grid exposesgridcell; lookup filter: no filter bar onshowcase_task.tabulargridcell. The lookup case is retired (R2)inline-edit-polish-2572manager_review(lockRecord: false); the spec also spent the seeded projectexec_review(R1)field-conditional-rulestax_rateinput wheretoBeDisabledwaited: areadonlyWhenfield renders the read-only field grouppaid, and back to an editable input undersent/draftgrid-file-uploadgetByText('Line Items')matches the sr-only DialogDescription and the section heading (strict mode). The second cause (ADR-0104 stored form) sits behind itGET /api/v1/storage/files/IDform-view-subformsLine Itemscollisioncascading-optionsmd-form-submitonshowcase_cascade's flat ModalFormmodal-form-footerdetail-related-listwaitForURL(/[?&]recordId=/)timed out: a row's name link opens/record/IDrecord-history-displayshowcase_account, with no skip guard (R5)screen-flowstudio-editor(row 12)showcase_project_workspaceopens read-only (lockno-overlay), so there is no "Add block"; and the page form has no "Layout" section heading. Both are intended (below)screen-flow(read first, as triage asked). No record names a cause for the Tier 1 red. objectstack-ai/objectstack#24598 says only "FAILED (known-stale, not consulted)". On the shipped showcase it passes at BASE alone and in the whole-suite order. objectui's own Live E2E lane (published18.0.0-next.5) also reads it green, judged by the stepRun live E2E allowlist= success with nocontinue-on-error:main's scheduled run39213623070, at4484a11. That is three commits after the Tier 1 console pin4016370a, and the three touch record-page reads and publish tooling.39359398003, today.The job log itself answered 403 through this container's proxy, so the reading rests on the step conclusion.
Review points
R1 ·
inline-edit-polish-2572: the lock assertion is kept.page.locator('[title="Double-click to edit"]').count()is0after the request opens. ThenlockedBudgetGroup.dblclick()andexpect(saveBtn).toBeHidden().manager_review: "In approval · editable" is shown, and a double-click opens a session.manager_reviewwithPOST /api/v1/approvals/requests/ID/approve. The seeded admin holds themanagerposition (ADMIN_APPROVAL_POSITIONSin the showcase'sseed-approval-demo.ts). It waits for the pendingexec_reviewrequest withlock_record: true.exec_reviewis reached only over the flow's decision edge for a budget above 500000 (showcase_budget_approvalin the showcase'sautomation/flows/index.ts).46625dbgreen alone (24.3 s); green in the head whole-suite run.R2 ·
user-filters' lookup quick filter: retired, with the measurement.git grep -n userFilters d20bf9b09 -- examples/app-showcase/srclists every declaration in the shipped showcase (positive control:allowedVisualizationsis found intask.view.ts).showcase_active_projects(health,status);showcase_task_triage(tabs);showcase_task_workbench(status,priority);project.view.ts(status,health).task.view.tsdeclares none by design; its own ADR-0053 note says so.Field.select. The task object's one lookup,project(master-detail), is a user filter nowhere. So no shipped fixture can drive the case, and it is deleted.filter-lookup-FIELD):UserFilters.declaredDisplayField-10545UserFilters.lateTypeCoercion-12008UserFilters.pendingLabel-12890UserFilters.retiredFieldTypeinitialSelections, and 12008's emitted-filter assertions are on boolean and numeric fields.uf_FIELDURL param and badges the count. Nothing pins that end to end now.R3 ·
detail-related-list: Northwind and its related list are in the shipped seed.examples/app-showcase/src/data/seed/index.tsseeds the accountNorthwindand its projects "Website Relaunch" (active) and "Legacy Sunset" (completed).examples/app-showcase/src/data/objects/project.object.tsdeclares theaccountlookup withrelatedList: 'primary'andrelatedListTitle: 'Projects'.buildDefaultPageSchema.ts: anisPrimaryrelated list gets its own tab. It is pinned by the plugin-detail test "promotes an isPrimary related list to its OWN tab (rule Z default)".R4 ·
studio-object-designerF1: the title's promise holds, and the mechanism coverage is narrower.developer/packagespage, thengetByTestId('package-switcher').click()andexpect(getByRole('option', { name: pkgName })).toBeVisible()./studio/com.example.showcase/data, create the package through the switcher's "New package" dialog, with no reload. Then:expect(chip).toContainText(pkgName);package-switcher(ContextSelectors.tsx) renders only for an app that declarescontextSelectors. A stock showcase boot servesshowcase_app,setupandaccount(GET /api/v1/meta/app), and none declares one.objectui:packages-changedrefetch. On the Studio surface the create dialog navigates into the new package, and the switcher's list effect is keyed on the package id, so the route change alone refetches the list.objectui:packages-changedrefetch. The only test that names the event ispackages-io.inflightShare-11797, and it pins the in-flight read drop.R5 ·
record-history-display:showcase_accountdeclaresenable: { trackHistory: true }inexamples/app-showcase/src/data/objects/account.object.ts.auditHistoryDisplay.test.ts("localizes booleans through t with Yes/No fallback", "localizes datetime values instead of raw ISO strings"), and the spec header now says so.YYYY-MM-DD, so that check cannot pass on an absent line. Read once: "Customer Since: 7/26/2026 → 8/4/2026".H4
grid-file-uploadandform-view-subformsshare theLine Itemscause. Each spec now finds the section by its heading role.e2e/live/helpers.tsis unchanged, so no other spec's reading moves.Row 12 ·
studio-editor(patch round 1)Correction first. Round 1 said "Tier 1 read it green at
4016370a", and that was wrong: it was inferred, not measured. Tier 1 (objectstack-ai/objectstack#24598) never ran this spec. Forstudio-authoring.record-page-roundtrip, its pin set is "files 0/1 … (studio-record-page.spec.ts …)", andstudio-editorappears nowhere in that record. Nothing moved between Tier 1 and now. objectstack-ai/objectstack#7753 item 6 (closed 2026-08-11) had already recorded both causes against QA run objectstack-ai/objectstack#7695: "targets a 'Layout' heading that no longer exists, plus a shipped page the editor correctly locks". objectstack's checklist carries the same record asautomated.staleon that item.The producers, and whether each state is intended. Both states are intended.
pageis registered create-only:supportsOverlay: true, allowEnvironmentOverlay: false, allowRuntimeCreate: true(metadata-plugin.zod.ts). ADR-0005's override table listspageas ❌ ("Conservative default — these bind to routes and side-effects"). Its addendum "Two-tier authorization (PR-10d.7, 2026-05)" says "users may author brand-new items of this type, but artifact-shipped items remain immutable".ResourceEditPageapplies that rule in its own two-tier gate ("artifact-backed items need allowEnvironmentOverlay").servedLockStatejoinspackagedBaseRefusal. Read on the shipped showcase:lock: no-overlay,editable: false,provenance: package. That envelope is what draws the "This item is locked" banner.automated.refspecs, and three ledger/route observations objectstack#7753 dates the state to 2026-08-11 or earlier.29bc4bf00f(objectui#2308, 2026-07-06) prunesname/regions/childrenfrom the page form (PAGE_FIELDS_OWNED_ELSEWHERE,page-schema.ts): the block tree is "edited on the canvas", and no bare section header is left behind. The spec form's "Layout" section holds onlyregions, so it does not render.The repair keeps every assertion and re-points the two stale ones.
showcase_project_workspace, PUT it undere2e_studio_editor_STAMP, and DELETE it infinally. The copy readslock: none,editable: true, and after a run the page list holds noe2e_leftovers.regions), and the canvas offers Add region. On the shipped page none of these render.84937672/2 alone, and green in the final whole-suite run.Gates (head
8493767, exit codes captured before any pipe)pnpm type-check:e2e: 0pnpm exec eslintover the eleven changed specs: 0 errors, 11 warnings (BASE bytes of the same files: 12)pnpm check:new-line-citations: 0 (0 new citations)pnpm check:control-bytes: 0pnpm check:test-path-roots: 0node scripts/check-changeset-presence.mjs: 0. No source or published contract of a released package changed, so no changeset is owed.Acceptance notes
automated.stalemarkers for these specs are the objectstackdomain:devxseat's to drop. ⛔ They are not edited here.objectui:packages-changedrefetch (R4);Generated by Claude Code