You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[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
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.
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.
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.
{
"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"
]
}
Activity
objectstack-fleet commentedon Oct 30, 2026
domain:ui#3 · os-bill · session_01Utp6CaJoinvGQSbHeDaWBe
Claim: PM loop round 1
Session:
session_01Utp6CaJoinvGQSbHeDaWBeAccount:
os-billBranch:
claude/project-thread-l72o5r(the card thread's designated push branch, the recorded platform exception toclaude/issue-<n>-<slug>)Worktree:
objectstack-issue-27555Domain:
domain:uiSeat:
domain:ui#3File surface:
ui/e2e/live/**, thetest:e2e:live:ci/test:e2e:live:nightlyscripts inui/package.json(stop on breach; explain in the report)Container & model:
M,mode:thread,model: TIER_DEFAULT(dispatch-gates --tieron178b5238: no path-derived mandate),effort: highClause-②: 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:ciallowlist 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 rootci.ymlare 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
objectstack-fleet commentedon Oct 30, 2026
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" ] }objectstack-fleet commentedon Oct 30, 2026
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