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
ObjectForm: a sectioned form ignores submitBehavior: { kind: 'continue' } and resetOnSuccess, so it keeps the saved values while the flat form clears #27602
Filing gate: ① a product defect with a named location and a reproduction. Found by the #27247 dev (card thread on branch claude/project-thread-qcbptz, PR #27599 Acceptance notes) while measuring showReset. ⛔ Not a claim; triage sets lane and grade. The ui lane (domain:ui, seat 2's plugin-form area) is suggested.
Business reason. An author who wants a "save and add another" form declares submitBehavior: { kind: 'continue' } (or resetOnSuccess: true on a create form). On a form whose fields are grouped into sections, the form does not clear after the save, so the user's next entry starts from the previous record's values and can be saved as a near-duplicate. The same declaration on a flat form works.
Measured
ui/packages/plugin-form/src/ObjectForm.tsx, SimpleObjectForm: the flat path builds its form node with resetOnSubmit: schema.submitBehavior?.kind === 'continue' || (!schema.submitBehavior && schema.resetOnSuccess && schema.mode === 'create') (around L1903 on PR fix(plugin-form): an ObjectForm block's showReset draws the Reset button instead of clearing the form after a save #27599's head 61baeb31). The sectioned path (around L1743, the node with showSubmit / showCancel / showReset) carries no resetOnSubmit.
Read fresh. The sectioned path of SimpleObjectForm drops resetOnSubmit, so "save and add another" keeps the last record's values, which invites a near-duplicate.
Claim: PM loop round 1 · 2026-10-29T15:42Z
Session: session_01Utp6CY2n1JmZZKrHgtp9jC (seat; implementation by an in-seat developer subagent, mode:subagent)
Account: os-bill
Branch: claude/project-thread-pwdhvq (the seat thread's harness push branch — the measured platform exception to claude/issue-N-slug)
Worktree: objectstack-issue-27602
Domain: domain:ui
Seat: domain:ui#2
File surface: ui/packages/plugin-form/src/ObjectForm.tsx, a test beside it, a changeset (stop on breach; explain in the report)
Container & model: S, mode:subagent, model: TIER_DEFAULT (dispatch-gates --tier: no path-derived mandate), effort: medium
Clause-②: no (expected: the sectioned path reads keys the type already declares; no exported surface changes)
Metadata-protocol: none (expected; the dev measures from the diff)
Responsibility: ui/packages/plugin-form/src/ObjectForm.tsxSimpleObjectForm (the sectioned path's form node carries no resetOnSubmit) | the flat path's expression is the rule to share | every author of a sectioned "save and add another" form, today
Thread-read: 6500569550
Premise: holds — on origin/main the flat path's form node reads submitBehavior / resetOnSuccess into resetOnSubmit and the sectioned path's node has none
Serial constraints cleared: PR #27599 (the hot-file intersection triage named) merged; no open PR touches plugin-form/src/ObjectForm.tsx (read 2026-10-29)
Dispatch order: /mnt/project-files/ui-seat2/dispatch-27602.md in the Claude Code project (not on GitHub); its ruling section quotes the triage text above verbatim.
{
"issue": 27602,
"status": "done",
"branch": "claude/project-thread-pwdhvq",
"pr": "https://github.com/objectstack-ai/objectstack/pull/27663",
"head": "57e1397000235584862d2cdd636a8246d45723eb",
"session": "session_01Utp6CY2n1JmZZKrHgtp9jC (seat session; in-seat subagent, mode:subagent)",
"premise_still_valid": true,
"summary": "SimpleObjectForm's clear-after-save rule (submitBehavior kind continue, or resetOnSuccess on a create form with no submitBehavior) is now one const, resetOnSubmit, declared beside formLayout and read by both the sectioned and the flat form node. The flat node reads it in place of its own copy, and the sectioned node gains it. Measured on origin/main a552e869: the flat node carried the expression and the sectioned node carried none. The continue arm of the submit-behaviour switch stays a no-op, and the renderer's single form.reset() after a successful submit is the only reader, so nothing else resets either path. A new test pins clear/clear/keep on both paths. The PR is a draft with no assignee and no reviewer; the harness's post-PR assign/review step was skipped as ordered.",
"tests": "ObjectForm.resetOnSubmit-27602.test.tsx (describe.each flat|sectioned x continue clears / resetOnSuccess clears / neither keeps). On 57e13970: pnpm --dir ui exec vitest run (new file + ObjectForm.submitBehavior + ObjectForm.showReset-27247 + sectionedFormValues + components form-invalid-input-refuses-submit-27483) :: exit 0, Test Files 5 passed (5), Tests 30 passed (30), the 6 new cases named in the verbose output. On 97c6b181, before the merge: pnpm --dir ui exec vitest run packages/plugin-form/ :: exit 0, Test Files 212 passed (212), Tests 2357 passed | 1 skipped. pnpm --filter @object-ui/plugin-form run type-check :: exit 0 on both heads. eslint on the two touched files :: exit 0 (0 errors). Ablation on committed 97c6b181 via scripts/ablation-replace.mjs: deleted the sectioned node's resetOnSubmit line (anchor 1->0, blob 1fa7f7aa0930->5c7ae6369dbf), Tests 2 failed | 4 passed (6) with exactly the two sectioned clear cases red; restore verified blob==HEAD and git diff HEAD empty. The test imports ./ObjectForm from source, so no dist leg was needed.",
"gates": "On 57e13970: all 34 commands from dispatch-gates --commands :: exit 0 each (listed in the PR Verification block). Reconciled with dispatch-gates --ran: 34 derived, 34 run, 0 NOT-MEASURED, 0 UNRUN. Includes node scripts/check-sdui-manifest.mjs :: exit 0 and --self-test :: exit 0. Also pnpm --dir ui run check:new-line-citations :: exit 0 (0 new). CI check-runs on 57e13970 at report time: in_progress (Check Changeset, Lint x9, Type Check x4, Governed Surface Queue Guard, PR-body guards, Check PR Size); opt-in lanes skipped. Not waited on, per contract.",
"line_budget": "+118 / -2 over 3 files: ObjectForm.tsx +11/-2, ObjectForm.resetOnSubmit-27602.test.tsx +97, .changeset/27602-sectioned-form-reset-on-submit.md +10",
"files_changed": [
".changeset/27602-sectioned-form-reset-on-submit.md",
"ui/packages/plugin-form/src/ObjectForm.resetOnSubmit-27602.test.tsx",
"ui/packages/plugin-form/src/ObjectForm.tsx"
],
"declarations": "Clause-②: no; Metadata-protocol: none. Measured from the diff: no exported surface, spec key or accepted value changes; the sectioned node reads keys the type already declares.",
"deviations": [
"Whole-package plugin-form test ran on pre-merge 97c6b181. After merging origin/main (6 commits, none under plugin-form; components form.tsx changed) only the five targeted files were re-run on 57e13970.",
"Lint was scoped to the two touched files, not package-wide `eslint .`; the repo-level lint is CI's. test:repo was not run locally; it belongs to CI.",
"The first gate-union pass on 57e13970 hit the foreground limit after command 16. Commands 17 to 34 were re-run in a fresh pass, and all 34 carry an exit code on 57e13970.",
"Two stray 5-byte pid files, /gates.pid and /pkgtest.pid, were written to the container root by a shell-variable scoping slip. The safety check refused their removal, so they are left for the user and nothing else was touched.",
"Commit trailers use AGENTS.md's model-free pair, not the harness reminder's model-named Co-Authored-By line.",
"This comment opens with the dispatch's signature line and puts the os-dev-report marker on the next line."
],
"dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
"mcp_calls": "0 — GitHub reads went through gh api REST; no MCP GitHub tool called",
"api_writes": "2 — relay pr_create (repository_dispatch to POST /repos/objectstack-ai/objectstack/pulls, draft, no assignees/labels; run 40914490412) and this os-dev-report comment via post-stamped (POST /repos/objectstack-ai/objectstack/issues/27602/comments). Plus 2 git pushes to claude/project-thread-pwdhvq (97c6b181 and the merge 57e13970), which are not REST writes",
"open_questions": [],
"out_of_scope_findings": []
}
Activity
objectstack-fleet commentedon Oct 29, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: 能用的表单 | none | P②
Triage: p2 ·
domain:ui·area:records· 2026-10-29T15:13Z⛔ Not a claim.
SimpleObjectFormdropsresetOnSubmit, so "save and add another" keeps the last record's values, which invites a near-duplicate.plugin-form/ObjectForm.tsxis a hot file: run the in-flight intersection check (PR fix(plugin-form): an ObjectForm block's showReset draws the Reset button instead of clearing the form after a save #27599) first.bug,pm:queue.Generated by Claude Code
objectstack-fleet commentedon Oct 29, 2026
domain:ui#2 · os-bill · session_01Utp6CY2n1JmZZKrHgtp9jC
Claim: PM loop round 1 · 2026-10-29T15:42Z
Session:
session_01Utp6CY2n1JmZZKrHgtp9jC(seat; implementation by an in-seat developer subagent,mode:subagent)Account:
os-billBranch:
claude/project-thread-pwdhvq(the seat thread's harness push branch — the measured platform exception toclaude/issue-N-slug)Worktree:
objectstack-issue-27602Domain:
domain:uiSeat:
domain:ui#2File surface:
ui/packages/plugin-form/src/ObjectForm.tsx, a test beside it, a changeset (stop on breach; explain in the report)Container & model:
S,mode:subagent,model: TIER_DEFAULT(dispatch-gates --tier: no path-derived mandate),effort: mediumClause-②: no (expected: the sectioned path reads keys the type already declares; no exported surface changes)
Metadata-protocol: none (expected; the dev measures from the diff)
Responsibility:
ui/packages/plugin-form/src/ObjectForm.tsxSimpleObjectForm(the sectioned path'sformnode carries noresetOnSubmit) | the flat path's expression is the rule to share | every author of a sectioned "save and add another" form, todayThread-read: 6500569550
Premise: holds — on
origin/mainthe flat path'sformnode readssubmitBehavior/resetOnSuccessintoresetOnSubmitand the sectioned path's node has noneSerial constraints cleared: PR #27599 (the hot-file intersection triage named) merged; no open PR touches
plugin-form/src/ObjectForm.tsx(read 2026-10-29)Dispatch order:
/mnt/project-files/ui-seat2/dispatch-27602.mdin the Claude Code project (not on GitHub); its ruling section quotes the triage text above verbatim.Generated by Claude Code
objectstack-fleet commentedon Oct 29, 2026
domain:ui#2 · os-bill · session_01Utp6CY2n1JmZZKrHgtp9jC
os-dev-report
{ "issue": 27602, "status": "done", "branch": "claude/project-thread-pwdhvq", "pr": "https://github.com/objectstack-ai/objectstack/pull/27663", "head": "57e1397000235584862d2cdd636a8246d45723eb", "session": "session_01Utp6CY2n1JmZZKrHgtp9jC (seat session; in-seat subagent, mode:subagent)", "premise_still_valid": true, "summary": "SimpleObjectForm's clear-after-save rule (submitBehavior kind continue, or resetOnSuccess on a create form with no submitBehavior) is now one const, resetOnSubmit, declared beside formLayout and read by both the sectioned and the flat form node. The flat node reads it in place of its own copy, and the sectioned node gains it. Measured on origin/main a552e869: the flat node carried the expression and the sectioned node carried none. The continue arm of the submit-behaviour switch stays a no-op, and the renderer's single form.reset() after a successful submit is the only reader, so nothing else resets either path. A new test pins clear/clear/keep on both paths. The PR is a draft with no assignee and no reviewer; the harness's post-PR assign/review step was skipped as ordered.", "tests": "ObjectForm.resetOnSubmit-27602.test.tsx (describe.each flat|sectioned x continue clears / resetOnSuccess clears / neither keeps). On 57e13970: pnpm --dir ui exec vitest run (new file + ObjectForm.submitBehavior + ObjectForm.showReset-27247 + sectionedFormValues + components form-invalid-input-refuses-submit-27483) :: exit 0, Test Files 5 passed (5), Tests 30 passed (30), the 6 new cases named in the verbose output. On 97c6b181, before the merge: pnpm --dir ui exec vitest run packages/plugin-form/ :: exit 0, Test Files 212 passed (212), Tests 2357 passed | 1 skipped. pnpm --filter @object-ui/plugin-form run type-check :: exit 0 on both heads. eslint on the two touched files :: exit 0 (0 errors). Ablation on committed 97c6b181 via scripts/ablation-replace.mjs: deleted the sectioned node's resetOnSubmit line (anchor 1->0, blob 1fa7f7aa0930->5c7ae6369dbf), Tests 2 failed | 4 passed (6) with exactly the two sectioned clear cases red; restore verified blob==HEAD and git diff HEAD empty. The test imports ./ObjectForm from source, so no dist leg was needed.", "gates": "On 57e13970: all 34 commands from dispatch-gates --commands :: exit 0 each (listed in the PR Verification block). Reconciled with dispatch-gates --ran: 34 derived, 34 run, 0 NOT-MEASURED, 0 UNRUN. Includes node scripts/check-sdui-manifest.mjs :: exit 0 and --self-test :: exit 0. Also pnpm --dir ui run check:new-line-citations :: exit 0 (0 new). CI check-runs on 57e13970 at report time: in_progress (Check Changeset, Lint x9, Type Check x4, Governed Surface Queue Guard, PR-body guards, Check PR Size); opt-in lanes skipped. Not waited on, per contract.", "line_budget": "+118 / -2 over 3 files: ObjectForm.tsx +11/-2, ObjectForm.resetOnSubmit-27602.test.tsx +97, .changeset/27602-sectioned-form-reset-on-submit.md +10", "files_changed": [ ".changeset/27602-sectioned-form-reset-on-submit.md", "ui/packages/plugin-form/src/ObjectForm.resetOnSubmit-27602.test.tsx", "ui/packages/plugin-form/src/ObjectForm.tsx" ], "declarations": "Clause-②: no; Metadata-protocol: none. Measured from the diff: no exported surface, spec key or accepted value changes; the sectioned node reads keys the type already declares.", "deviations": [ "Whole-package plugin-form test ran on pre-merge 97c6b181. After merging origin/main (6 commits, none under plugin-form; components form.tsx changed) only the five targeted files were re-run on 57e13970.", "Lint was scoped to the two touched files, not package-wide `eslint .`; the repo-level lint is CI's. test:repo was not run locally; it belongs to CI.", "The first gate-union pass on 57e13970 hit the foreground limit after command 16. Commands 17 to 34 were re-run in a fresh pass, and all 34 carry an exit code on 57e13970.", "Two stray 5-byte pid files, /gates.pid and /pkgtest.pid, were written to the container root by a shell-variable scoping slip. The safety check refused their removal, so they are left for the user and nothing else was touched.", "Commit trailers use AGENTS.md's model-free pair, not the harness reminder's model-named Co-Authored-By line.", "This comment opens with the dispatch's signature line and puts the os-dev-report marker on the next line." ], "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm", "mcp_calls": "0 — GitHub reads went through gh api REST; no MCP GitHub tool called", "api_writes": "2 — relay pr_create (repository_dispatch to POST /repos/objectstack-ai/objectstack/pulls, draft, no assignees/labels; run 40914490412) and this os-dev-report comment via post-stamped (POST /repos/objectstack-ai/objectstack/issues/27602/comments). Plus 2 git pushes to claude/project-thread-pwdhvq (97c6b181 and the merge 57e13970), which are not REST writes", "open_questions": [], "out_of_scope_findings": [] }objectstack-fleet commentedon Oct 29, 2026
domain:ui#2 · os-bill · session_01Utp6CY2n1JmZZKrHgtp9jC
ACCEPT → PR #27663 comment 6503205787 (head
57e13970); contract review not owed (Clause-②: no,Metadata-protocol: none); landing through the merge queue.Generated by Claude Code
objectstack-fleet commentedon Oct 29, 2026
domain:ui#2 · os-bill · session_01Utp6CY2n1JmZZKrHgtp9jC
Landed · 2026-10-29T18:10Z
5e2f38648d05e48d72e0ebdd6a4a5a15ef89e73fcompletedby the PR'sFixeslineState:
pm:dispatchedremoved; the assignee stays as the record of who carried it.Generated by Claude Code