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
console: a full-page record form opened by direct URL saves silently and then leaves the app for /_console/home #27454
Filing gate: ① a user-visible defect found by a QA run (off-clause probe, RUNNER rule 8). It sits beside the #26461 fix, which holds for in-app entry.
Reproduction
Boot the showcase and sign in as admin.
Load /_console/apps/com.example.showcase/showcase_task/new as a fresh document: paste the URL, open it in a new tab, or follow a deep link.
Fill Title and Project, then click Create.
Expected: the record is created, a toast reads Task "TITLE" created (as it does when /new is reached by in-app navigation), and the user stays in the app.
Actual: POST /api/v1/data/showcase_task 201, then a full document load to /_console/home. No toast is ever visible, and the user lands outside the app they were in. Reproduced twice. /record/ID/edit entered the same way likely behaves the same.
Mechanism
RecordFormPage returns with a history goBack. With no in-app history entry, that crosses the document boundary, so the post-save toast is lost with the unloaded document and the user lands on the console home. The fallback when there is no prior in-app entry should be the record (or the object list), not history back.
QA-source: #27441 · ux-conventions.write-feedback · observed beside the clauses
Claim: PM loop round 1 · 2026-10-29T11:44Z
Session: session_01L6bhgXU26UBEjd1KKHgNEx (seat; in-seat mode:subagent dev, same session, identity by branch)
Account: os-sales (the seat's linked user as GET /user answers it; the card's assignee)
Branch: claude/issue-27454-direct-url-form-return
Worktree: objectstack-issue-27454
Domain: domain:ui
Seat: domain:ui#1
File surface: ui/packages/app-shell/src/views/RecordFormPage.tsx (goBack, ~121–134), ui/packages/app-shell/src/utils/recordFormNavigation.ts only if measured necessary, tests beside (RecordFormPage.*.test.tsx), one patch changeset (stop on breach; explain in the report)
Container & model: S, mode:subagent, model: TIER_DEFAULT (seat-run dispatch-gates --tier on the paths: no path-derived mandate), effort: medium
Clause-②: no
Metadata-protocol: none
Responsibility: console record form page (this lane) | the in-app after-save route #26461 fixed for in-app entry | every user who opens a record form by direct URL (bookmark, pasted link) in a tab with earlier history
Thread-read: 6491407257
Premise: holds — on origin/main57c51aab4d, goBack tests window.history.length > 1 and calls navigate(-1), which crosses the document boundary when the tab had history before the console loaded; both save and cancel go through it, and the toast fires before it.
Serial constraints cleared: no open PR changes these files (seat read of every open PR's file list); in-flight #27056 edits RecordDetailView.tsx, a different file.
Resume-from: none
{
"issue": 27454,
"status": "done",
"branch": "claude/issue-27454-direct-url-form-return",
"pr": "https://github.com/objectstack-ai/objectstack/pull/27558",
"session": "session_01L6bhgXU26UBEjd1KKHgNEx",
"premise_still_valid": true,
"summary": "Re-measured on origin/main aef631b8: RecordFormPage goBack keyed in-app history on window.history.length > 1, shared by save and cancel, toast fired before it. goBack now reads react-router location.key !== 'default' (the rule FormPage cancel already uses) and otherwise takes the existing parent route (record detail in edit, object list in create) with replace, so a direct-URL entry stays in the app and shows the toast. recordFormNavigation.ts not touched; PageHeader.tsx back button listed under Acceptance notes, unchanged.",
"tests": "head 6912ecba: pnpm --dir ui exec vitest run packages/app-shell/src/views/RecordFormPage -> lock VERDICT command-exit 0, Test Files 10 passed (10), Tests 61 passed (61). New RecordFormPage.directUrlReturn-27454.test.tsx: 5 cells (edit/create direct-URL save, edit direct-URL cancel, two in-app back). Ablation via scripts/ablation-replace.mjs (anchor x1->x0, replacement x0->x1, blob dd43d8e6->0b0ad8a3) restoring the history.length test: 3 failed | 2 passed (the three direct-URL cells red, in-app green, as predicted); restore blob == HEAD dd43d8e6, git diff HEAD empty. Source imported relatively from src, no dist leg.",
"gates": "dispatch-gates --commands (head 6912ecba, 3 paths): 34 derived, all 34 run with exit 0 captured before any pipe; --ran: 34 run, 0 NOT-MEASURED, 0 UNRUN (derived zero). pnpm --filter @object-ui/app-shell run type-check: exit 0. ui check:new-line-citations: 0 new, exit 0. eslint on the two touched tsx: 0 errors. CI check-runs at report time: 20 total, 17 in_progress, 3 skipped, 0 failed.",
"line_budget": "149 changed lines (+138/-11, 3 files) vs ceiling 150: under",
"files_changed": [
".changeset/27454-direct-url-form-return.md",
"ui/packages/app-shell/src/views/RecordFormPage.tsx",
"ui/packages/app-shell/src/views/RecordFormPage.directUrlReturn-27454.test.tsx"
],
"deviations": [
"Commit trailers use the model-free pair (Claude-Session + Co-authored-by: Claude) per AGENTS.md and the pre-push hook, not the harness reminder's model-named Co-Authored-By.",
"Report comment: first line is the dispatch's signature line, os-dev-report on the second line (os-dev.md asks it first); dispatch order and os-dev.md disagree on line one.",
"The gate loop was moved to background by the tool's 600s foreground cap; I blocked on it with tail --pid in the foreground and read every exit."
],
"dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
"mcp_calls": "0",
"api_writes": "2 — fleet-write relay pr_create (POST repos/objectstack-ai/objectstack/dispatches -> PR #27558); post-stamped issue comment (POST issues/27454/comments). Plus git push (not REST).",
"open_questions": [],
"out_of_scope_findings": [
"carrier: none · ui/packages/layout/src/PageHeader.tsx back button uses window.history.length > 1 (back-button class, not the after-save route); noted in PR Acceptance notes, not filed"
]
}
Activity
objectstack-fleet commentedon Oct 29, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: records-forms | none | P②
Triage: p2 ·
domain:ui·area:records· 2026-10-29T08:07Z⛔ Not a claim.
/_console/home. It sits beside app-shell: the full-page record form (/new, /edit route) still toasts "Task updated successfully" — #26172's fix covered AppContent's dialog paths only; RecordFormPage passes the object label alone #26461's fix, which holds for in-app entry. From the 18.3.0 RC run ([sweep] v18.3.0 release test sweep #27377 §5); it is retested on the next wave.bug,pm:queue.Generated by Claude Code
objectstack-fleet commentedon Oct 29, 2026
domain:ui#1 · os-sales · session_01L6bhgXU26UBEjd1KKHgNEx
Claim: PM loop round 1 · 2026-10-29T11:44Z
Session:
session_01L6bhgXU26UBEjd1KKHgNEx(seat; in-seatmode:subagentdev, same session, identity by branch)Account:
os-sales(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-27454-direct-url-form-returnWorktree:
objectstack-issue-27454Domain:
domain:uiSeat:
domain:ui#1File surface:
ui/packages/app-shell/src/views/RecordFormPage.tsx(goBack, ~121–134),ui/packages/app-shell/src/utils/recordFormNavigation.tsonly if measured necessary, tests beside (RecordFormPage.*.test.tsx), one patch changeset (stop on breach; explain in the report)Container & model:
S,mode:subagent,model: TIER_DEFAULT(seat-rundispatch-gates --tieron the paths: no path-derived mandate),effort: mediumClause-②: no
Metadata-protocol: none
Responsibility: console record form page (this lane) | the in-app after-save route #26461 fixed for in-app entry | every user who opens a record form by direct URL (bookmark, pasted link) in a tab with earlier history
Thread-read: 6491407257
Premise: holds — on
origin/main57c51aab4d,goBacktestswindow.history.length > 1and callsnavigate(-1), which crosses the document boundary when the tab had history before the console loaded; both save and cancel go through it, and the toast fires before it.Serial constraints cleared: no open PR changes these files (seat read of every open PR's file list); in-flight #27056 edits
RecordDetailView.tsx, a different file.Resume-from: none
objectstack-fleet commentedon Oct 29, 2026
domain:ui#1 · os-sales · session_01L6bhgXU26UBEjd1KKHgNEx
os-dev-report
{ "issue": 27454, "status": "done", "branch": "claude/issue-27454-direct-url-form-return", "pr": "https://github.com/objectstack-ai/objectstack/pull/27558", "session": "session_01L6bhgXU26UBEjd1KKHgNEx", "premise_still_valid": true, "summary": "Re-measured on origin/main aef631b8: RecordFormPage goBack keyed in-app history on window.history.length > 1, shared by save and cancel, toast fired before it. goBack now reads react-router location.key !== 'default' (the rule FormPage cancel already uses) and otherwise takes the existing parent route (record detail in edit, object list in create) with replace, so a direct-URL entry stays in the app and shows the toast. recordFormNavigation.ts not touched; PageHeader.tsx back button listed under Acceptance notes, unchanged.", "tests": "head 6912ecba: pnpm --dir ui exec vitest run packages/app-shell/src/views/RecordFormPage -> lock VERDICT command-exit 0, Test Files 10 passed (10), Tests 61 passed (61). New RecordFormPage.directUrlReturn-27454.test.tsx: 5 cells (edit/create direct-URL save, edit direct-URL cancel, two in-app back). Ablation via scripts/ablation-replace.mjs (anchor x1->x0, replacement x0->x1, blob dd43d8e6->0b0ad8a3) restoring the history.length test: 3 failed | 2 passed (the three direct-URL cells red, in-app green, as predicted); restore blob == HEAD dd43d8e6, git diff HEAD empty. Source imported relatively from src, no dist leg.", "gates": "dispatch-gates --commands (head 6912ecba, 3 paths): 34 derived, all 34 run with exit 0 captured before any pipe; --ran: 34 run, 0 NOT-MEASURED, 0 UNRUN (derived zero). pnpm --filter @object-ui/app-shell run type-check: exit 0. ui check:new-line-citations: 0 new, exit 0. eslint on the two touched tsx: 0 errors. CI check-runs at report time: 20 total, 17 in_progress, 3 skipped, 0 failed.", "line_budget": "149 changed lines (+138/-11, 3 files) vs ceiling 150: under", "files_changed": [ ".changeset/27454-direct-url-form-return.md", "ui/packages/app-shell/src/views/RecordFormPage.tsx", "ui/packages/app-shell/src/views/RecordFormPage.directUrlReturn-27454.test.tsx" ], "deviations": [ "Commit trailers use the model-free pair (Claude-Session + Co-authored-by: Claude) per AGENTS.md and the pre-push hook, not the harness reminder's model-named Co-Authored-By.", "Report comment: first line is the dispatch's signature line, os-dev-report on the second line (os-dev.md asks it first); dispatch order and os-dev.md disagree on line one.", "The gate loop was moved to background by the tool's 600s foreground cap; I blocked on it with tail --pid in the foreground and read every exit." ], "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm", "mcp_calls": "0", "api_writes": "2 — fleet-write relay pr_create (POST repos/objectstack-ai/objectstack/dispatches -> PR #27558); post-stamped issue comment (POST issues/27454/comments). Plus git push (not REST).", "open_questions": [], "out_of_scope_findings": [ "carrier: none · ui/packages/layout/src/PageHeader.tsx back button uses window.history.length > 1 (back-button class, not the after-save route); noted in PR Acceptance notes, not filed" ] }objectstack-fleet commentedon Oct 29, 2026
domain:ui#1 · os-sales · session_01L6bhgXU26UBEjd1KKHgNEx
落地 · 2026-10-29T20:14Z
eda55b9c21在origin/main上git grep -c "27454" origin/main -- ui/packages/app-shell/src/views/RecordFormPage.tsximport= 18)状态:卡已由 PR 关闭,摘
pm:dispatched。