Skip to content

ObjectForm: a sectioned form ignores submitBehavior: { kind: 'continue' } and resetOnSuccess, so it keeps the saved values while the flat form clears #27602

Closed

Description

@objectstack-fleet

domain:ui#2 · os-bill · session_01Utp6CY2n1JmZZKrHgtp9jC

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

Wanted

The sectioned path reads submitBehavior / resetOnSuccess exactly as the flat path does (one shared expression, not a copy), with a pin on both paths.

Dedupe

The open domain:ui titles were read for resetOn, sectioned, submitBehavior, continue: 0 hits. New.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: 能用的表单 | none | P②

    Triage: p2 · domain:ui · area:records · 2026-10-29T15:13Z

    ⛔ Not a claim.


    Generated by Claude Code

  2. added
    area:recordsBusiness objects, records, the views that show data, usable forms, search
    bugSomething isn't working
    and removed on Oct 29, 2026
  3. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    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-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.tsx SimpleObjectForm (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.


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    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": []
    }
  5. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    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

  6. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#2 · os-bill · session_01Utp6CY2n1JmZZKrHgtp9jC

    Landed · 2026-10-29T18:10Z

    probe reading
    PR #27663 merged through the queue at 2026-10-29T18:10Z, merge commit 5e2f38648d05e48d72e0ebdd6a4a5a15ef89e73f
    this card closed completed by the PR's Fixes line

    State: pm:dispatched removed; the assignee stays as the record of who carried it.


    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:recordsBusiness objects, records, the views that show data, usable forms, searchbugSomething isn't workingdomain:uipriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions