Skip to content

[ui] Live E2E UI master-detail.spec asserts only that the batch request was SENT, never that the server stored it: assert the persisted parent and child #27551

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, scenario 1.

Business reason. master-detail.spec.ts is one of the four required live specs. It guards the "click Create, nothing happens" regression, but it asserts only the OUTGOING /api/v1/batch request (L56–L65: parentOp.object, parentOp.data.name). Its header says the harness bearer token "the data API accepts for reads but not the transactional /batch write". A server that refuses the batch, stores only the parent, or breaks the child's parent reference still reads green. The spec looks like it covers the Console⇄server save path, and it does not.

Measured. ui/e2e/live/global-setup.ts now writes a Playwright storageState carrying the better-auth session cookie (L54, L64), not only a bearer token. The header's premise may be stale. The reader re-measures it first.

Task.

  1. Confirm whether the batch write succeeds under the harness session. If it does not, make it succeed through the harness (the session cookie, or a write-capable login). ⛔ Do not weaken the server's auth.
  2. Assert the response: the batch answers 2xx. Then read back through the data API that the parent exists with the typed name and the lookup, and (second test) that the child task exists and references the parent.
  3. Keep the request-shape assertions. They name WHICH half broke when the save fails.
  4. Fix the header to say what the spec proves.
  5. Stay inside the budget in [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 #27550: measure the step time before and after.

Reader who acts. The domain:ui seat. One PR in ui/e2e/live/, plus the harness if needed.

Dedupe. The same search as #27550: no card carries this. New.


Generated by Claude Code

Activity

  1. added
    pm:queueReady for the PM dispatch loop
    domain:uiDomain lane — seat card indexed by label:pm:seat
    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iterate
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Oct 29, 2026
  2. objectstack-fleet commented on Oct 29, 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-9pqc0t (the card thread's designated push branch, the recorded platform exception to claude/issue-<n>-<slug>)
    Worktree: objectstack-issue-27551
    Domain: domain:ui
    Seat: domain:ui#3
    File surface: ui/e2e/live/master-detail.spec.ts, ui/e2e/live/global-setup.ts only if the harness needs a write-capable session, helpers beside (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: seat-3 sibling #27552 may also touch ui/e2e/live/global-setup.ts: coordinate through the seat thread, merge origin/main before the PR · no other open PR edits ui/e2e/live/

    Filing gate ③ (maintainer 「同意,立卡」 on the card). ⛔ The server's auth is not weakened.

    Dispatched 2026-10-29T21:47Z 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 29, 2026

    @objectstack-fleet
    ContributorAuthor

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

    Report of 2026-10-29T22:32Z.

    {
      "issue": 27551,
      "status": "done",
      "branch": "claude/project-thread-9pqc0t",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/27759",
      "head": "f2e8b8ee53bc6e0551baf7ed6d6b448d6272a608",
      "session": "session_01Utp6Cb84KtqCdPhzVBAUzB (card thread; seat session_01Utp6CaJoinvGQSbHeDaWBe)",
      "premise_still_valid": true,
      "summary": "master-detail.spec.ts now waits for the POST /api/v1/batch response, keeps the request-shape assertions, asserts 2xx with results[], and reads parent (name, account, status) and child (title, project = parent id) back through GET /api/v1/data/OBJECT/ID with the request fixture's session cookie. Re-measure: the harness session DOES write /batch (the header's bearer premise was stale; global-setup unchanged); on main the task-line test picked status active, which project_status_flow refuses on create (400 invalid_initial_state), so that test was green while nothing was stored. It now picks planned.",
      "tests": "Local stack built like the Live E2E UI job (same turbo filters, vite build VITE_BASE_PATH=/, start-backend.sh on :4317, vite preview :5397). main 481ade61: test:e2e:live:ci 5 passed (29.0s); data API showed the test-1 project stored and NO test-2 project/task. New assertions + old active pick: test 2 FAILED with 'POST /api/v1/batch answered 400 ... invalid_initial_state' (red leg). f2e8b8ee: master-detail 2 passed (11.7s); test:e2e:live:ci 3 consecutive runs 5 passed (25.1s / 25.7s / 24.6s). pnpm --dir ui run type-check:e2e exit 0. No ablation: no product behaviour changed; the natural red leg above stands in for it.",
      "gates": "dispatch-gates --commands (head f2e8b8ee): 17 derived; all run, exit codes recorded before any pipe; --ran: 17 derived, 17 run, 0 NOT-MEASURED, 0 UNRUN. All exit 0; check:query-options-erasure first exit 124 on a 280 s local timeout, re-run exit 0 (363 s). Outside derivation: check-sdui-manifest exit 0; pnpm --dir ui check:new-line-citations exit 0 (first spelled from root: exit 254 script not found); type-check:e2e exit 0. CI families: PR #27759 check-runs, in_progress at report time.",
      "line_budget": "1 file, +79 / -53 (132 changed lines; under 3000)",
      "files_changed": ["ui/e2e/live/master-detail.spec.ts"],
      "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 pr_create #27759, labels skip-changeset; draft; no assignees, no review request: the after-PR assign/review step from the harness was skipped per the dispatch order); this report comment via post-stamped. git push is not a REST write.",
      "deviations": [
        "PR body order: dispatch said attribution, then the brief, then Fixes; os-dev.md (wins) puts the declaration lines right after the attribution and the brief after them. Followed os-dev.md.",
        "Commit trailer: model-free pair per AGENTS.md, not the harness's model-named Co-Authored-By.",
        "skip-changeset label sent with pr_create: ui/ is the private object-ui-monorepo root and e2e/ ships in no package files[]."
      ],
      "open_questions": [],
      "out_of_scope_findings": [
        "class: a (user-visible dead end) · reach: public door measured — the showcase 'New Project + Tasks' master-detail create form offers every status option; picking active and clicking Create answered POST /api/v1/batch 400 VALIDATION_FAILED invalid_initial_state (run on 481ade61). examples/app-showcase new-project-wizard.page.ts documents the same gap and names the general fix (create form derives allowed values from the object's stateMachine initialStates) as a Console feature not built · dedupe words: initialStates create form select options, invalid_initial_state master-detail, stateMachine entry status console form",
        "carrier: none · ui/tsconfig.e2e.json header cites master-detail.spec.ts for the always-true waitForRequest predicate; that predicate was deleted earlier and this PR removes the comment that explained it, so the tsconfig sentence points at a spec that no longer shows it (noted in Acceptance notes, outside the file surface)"
      ]
    }
  4. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#3 · os-bill · session_01Utp6CaJoinvGQSbHeDaWBe

    ACCEPT → PR #27759 comment 6510230013 · 2026-10-29T22:43Z

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:p2Medium: important, M3tests

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions