Skip to content

[ui] Live E2E UI scenarios to add once their defects land: a record saved from its full-page form by URL stays in the app (#27454), and nav/page CEL visibility evaluates on the canonical engine (#27457) #27555

Closed

Description

@objectstack-fleet

domain:devx#2 · os-justin · session_01QSeKYmTYfaPbLQD4BJfomW

Filing gate ③ (maintainer-directed). Maintainer, this session's chat, 2026-10-29, verbatim: 「同意,立卡」, answering the seat's Live E2E UI assessment (B: widen the gate to the server packages the Console depends on; C: the scenarios below), after the seat measured that neither adds CI wall-clock time. This is C, scenarios 4 and 5.

Blocked-by: #27454
Blocked-by: #27457

Business reason. Both are open Console⇄server defects, found in a browser after merge. Once each lands, a live spec keeps it fixed against the real stack, where the unit tests that missed it cannot:

Task. After each blocker closes: write or extend the spec, and admit it under the promotion rule (3/3 plus 5/5 enlarged), inside #27550's 2-minute budget. Otherwise it stays in nightly.

Reader who acts. The domain:ui seat, after the blockers land.

Dedupe. The same search as #27550. New.


Generated by Claude Code

Activity

  1. added
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    domain:uiDomain lane — seat card indexed by label:pm:seat
    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iterate
    pm:queueReady for the PM dispatch loop
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    pm:queueReady for the PM dispatch loop
    on Oct 29, 2026
  2. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#3 · os-bill · session_01Utp6CaJoinvGQSbHeDaWBe

    Claim: PM loop round 1
    Session: session_01Utp6CaJoinvGQSbHeDaWBe
    Account: os-bill
    Branch: claude/project-thread-l72o5r (the card thread's designated push branch, the recorded platform exception to claude/issue-<n>-<slug>)
    Worktree: objectstack-issue-27555
    Domain: domain:ui
    Seat: domain:ui#3
    File surface: ui/e2e/live/**, the test:e2e:live:ci / test:e2e:live:nightly scripts in ui/package.json (stop on breach; explain in the report)
    Container & model: M, mode:thread, model: TIER_DEFAULT (dispatch-gates --tier on 178b5238: no path-derived mandate), effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: ui code produces the defect | no platform path covers it | every Studio / console author reaches it today
    Thread-read: none
    Premise: holds
    Serial constraints cleared: Blocked-by #27454 and #27457 both closed 10-29

    Scope of this claim: scenarios 4 and 5 of the card (#27454 full-page form save by URL; #27457 nav / page CEL visibility on the canonical engine), each admitted to the test:e2e:live:ci allowlist only under the promotion rule (3/3 plus 5/5 enlarged, inside #27550's 2-minute budget), otherwise left in nightly with the readings. ui/.github/** and the root ci.yml are out of bounds.

    Dispatched 2026-10-30T09:11Z to a card thread of the seat's project; the order lives in the project. ⛔ The thread posts no claim and writes no assignee.


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#3 · os-bill · session_01Utp6CZ1fJX9wr5Lrj1S9H4
    os-dev-report

    Report of 2026-10-30T09:47Z.

    {
      "issue": 27555,
      "status": "done",
      "branch": "claude/project-thread-l72o5r",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/28034",
      "head": "2b1c6d276f44002941fc3e4a9349736b0dcf4dee",
      "session": "session_01Utp6CZ1fJX9wr5Lrj1S9H4 (card thread; seat session_01Utp6CaJoinvGQSbHeDaWBe)",
      "premise_still_valid": true,
      "summary": "Scenario #27454: new ui/e2e/live/record-form-direct-url.spec.ts creates its own showcase_task through the data API, opens /apps/com.example.showcase/showcase_task/record/ID/edit by page.goto, renames, saves, and asserts save 2xx, toast 'Task \"NEW\" updated', URL path = record detail inside the app, form gone, API re-read = new title; deletes the task. Scenario #27457: list-row-action-cel.spec.ts gains a nav case that authors its own package + app (bare-string visible, CEL 'in'), publishes drafts, asserts the true entry shown, the false entry absent, and no predicate-fault console line; deletes the package. Both files join test:e2e:live:ci; list-row-action-cel leaves nightly. Bucket: both ADMITTED.",
      "tests": "Stack = Live E2E UI job's (turbo filters + VITE_BASE_PATH=/ vite build, start-backend.sh :4110, vite preview :5290), --retries 0, one long-lived backend. Control, incumbent ci allowlist on 7a378234: 1 run, 12/12, 34.8 s playwright (36.0 s wall). Pair (the two specs, 3 tests) at 2b1c6d27: 5 consecutive runs 5/5 green, 15/15 tests, 6.7-7.5 s (wall 7.7-8.6 s); per test row-action 2.0-2.3 s, nav 1.5-1.7 s, record form 2.3-2.9 s. Enlarged allowlist pnpm run test:e2e:live:ci: 5/5 green, 75/75 tests, 38.5-40.3 s (wall 39.5-41.4 s), inside the 120 s budget. Ablation #27454 (ablation-replace, lock VERDICT 1): RecordFormPage anchor location.key !== 'default' -> window.history.length > 1, landed (blob dd43d8e6 -> 70c521b1), console rebuilt, bundle marker history.length>1 0 -> 1; record-form test red (toast not found), both CEL tests green. Ablation #27457 (lock VERDICT 1): ExpressionEvaluator anchor 'if (!unwrappedEnvelope) {' -> branch never taken + string marker, landed (blob 484f34de -> 4ac105fe), bundle marker 1; nav case red (shown entry not visible), row-action and record-form green. Restore: both blobs == HEAD, git diff HEAD empty, console rebuilt, markers 0/0, all readings after. pnpm --dir ui run type-check:e2e exit 0 (tsc --listFiles names both spec files).",
      "gates": "dispatch-gates --commands at 2b1c6d27: 31 derived, all run with exit codes captured before any pipe, all exit 0; --ran: 31 derived, 31 run, 0 NOT-MEASURED. Outside derivation, exit 0: node scripts/check-sdui-manifest.mjs, pnpm --dir ui run type-check:e2e, pnpm --dir ui check:new-line-citations. CI on PR #28034 at report time: Governed Surface Queue Guard success, Test Core success, PR-body guards success, Dogfood Regression Gate success; Live E2E UI, Lint, Type Check, Build UI Deps, Check Changeset in_progress.",
      "line_budget": "3 files, +141 / -3 (144 changed lines; under 3000)",
      "files_changed": ["ui/e2e/live/record-form-direct-url.spec.ts", "ui/e2e/live/list-row-action-cel.spec.ts", "ui/package.json"],
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "0",
      "api_writes": "3 — POST /repos/objectstack-ai/objectstack/dispatches x2 (fleet-write pr_create #28034, draft, no assignees, no review request; label-write POST /issues/28034/labels skip-changeset, read back present); this report comment via post-stamped. The harness's after-PR assign/review step was skipped per the dispatch order. git push is not a REST write.",
      "deviations": [
        "skip-changeset was added after pr_create through label-write.mjs (one extra write the dispatch order does not list); os-dev.md routes a late label that way and wins on conflict. ui/package.json is the private object-ui-monorepo root and the specs ship in no package files[].",
        "PR body lines 1-2: the attribution block links this card thread, as the harness requires of a PR the thread opens; the dispatch order's block linked the seat thread.",
        "Commit 2b1c6d27's Claude-Session trailer names the seat's session (from the claim), not this thread's; left as pushed (no force-push).",
        "Card says the #27454 spec can extend action-modal.spec.ts; a new file was added because that file pins the modal transport and a full-page form by URL is a different surface."
      ],
      "open_questions": [],
      "out_of_scope_findings": [
        "class: a · reach: public door measured — on this branch's stack (7a378234 product code), a fresh page opening /apps/showcase_app/showcase_task/record/ID/edit (the app NAME alias) or /apps/showcase_app/showcase_task/new, then Save: URL after save about:blank, 0 toasts; the same on /apps/com.example.showcase/... lands on the record / list with 1 toast. Mechanism: AppContent's canonicalAppPathname effect moves an alias URL to the package-id address with navigate(..., { replace: true }), which gives the entry a generated location.key, so RecordFormPage's hasInAppHistory (location.key !== 'default') reads true and goBack runs navigate(-1) out of the document. #27454's fix holds only on the package-id address. Seam: renderer:RecordFormPage goBack | renderer:AppContent canonical alias redirect · dedupe words: RecordFormPage goBack location.key, canonical app pathname replace history, direct URL alias save leaves app",
        "carrier: none · ci.yml live-e2e-ui comment says 'the four allowlisted live specs' and examples/app-showcase/test/console-live-specs.live.test.ts says 'Four of its specs'; now eight files. Out of bounds / outside the file surface, read by no gate; noted in Acceptance notes"
      ]
    }
  4. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#3 · os-bill · session_01Utp6CaJoinvGQSbHeDaWBe

    ACCEPT → PR #28034 comment 6520051451 · 2026-10-30T10:02Z. The alias-address finding is #28036.


    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

area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratedomain:uiDomain lane — seat card indexed by label:pm:seatpm:dispatchedDispatched to a dev agent by /pm-dispatchpriority:p3tests

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions