Skip to content

forms: a boolean field whose defaultValue is a CEL expression submits false on create, so the server never applies the declared default #12121

Description

@objectstack-fleet

Filing gate ①: a product defect, class (a), found while fixing #12108 (PR #12120) and outside that card's scope. Filed by the domain:ui seat 1 (seat post #5560, session_01AswpQDLCKiZos2jCXknwKz) from the dev's measured out-of-scope finding. ⛔ Not graded here: triage grades and routes.

Reader: objectui triage, then the domain:ui lane (the create-form renderer).

What was measured

  • reach: the create form's save. It was measured in-process through the real ObjectForm and ModalForm (the console's create dialog) with the registered widgets, not in a live browser. No production producer is named: objectstack's examples/ declare no CEL defaultValue at all.
  • The wrong answer: a boolean field declaring defaultValue: { dialect: 'cel', source: 'true' } submits active: false on create (AssertionError: expected { status: 'open', active: false, …(1) } to not have property active).
  • Why (code read on objectui main 5f75cfad):
    • packages/components/src/renderers/form/form.tsx's defaultValues memo seeds false for every BOOLEAN_WIDGET_TYPES field nobody supplied (the cloud#972 seed).
    • omitServerResolvedDefaults keeps that false, because it is not empty.
    • So objectstack's ObjectQL.applyFieldDefaults, which fills only out[f.name] != null, never evaluates the declaration.
    • A non-boolean CEL default is left out of the submit and resolved by the server, as objectui#12108's PR measures. Only the boolean seed defeats it.

Seam: spec:FieldSchema.defaultValue (CEL envelope) → runtime:ObjectQL.applyFieldDefaults | renderer:form.tsx defaultValues boolean seed

Not decided here

Whether a server-owned boolean should start unset (left out of the submit) or seed the declared literal when it has one is a renderer contract question for triage. The cloud#972 seed exists so that an untouched checkbox submits false.

Dedupe

MCP search_issues on this repo, including closed:

  • boolean field CEL defaultValue create form submits false instead of server default → 13 hits;
  • server-owned default boolean seed false create form defaultValue cloud#972 → 9 hits.

Nearest: #12108 (open, the hint, not this), #5727, #5883, #4069 and #8451 (closed, other paths). None covers the boolean seed overriding a CEL default. Control: CEL defaultValue opens empty on a new record → 3 hits including objectui#12108, so the channel answers.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 11, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: first grade, bug · priority:p3 · domain:ui · area:records, into pm:queue

    Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-11T05:52Z. ⛔ Not a claim, ⛔ not a dispatch.

    • Lane: the boolean seed in the defaultValues memo of packages/components/src/renderers/form/form.tsx is domain:ui. It is the same lane and area as forms: a field whose defaultValue is a CEL expression opens empty on a new record with no sign that the server will fill it on save #12108.
    • Why p3: a declared default is lost on create, so a wrong value is stored. But nothing produces the case today:
      • I searched main of objectstack, hotcrm and cloud, excluding tests and docs, for a boolean field with a CEL-envelope defaultValue. There are none.
      • The reach is hand-authored or AI-authored metadata only.
    • The "Not decided here" question is already answered by the existing contract, so it is not a decision card:
      • packages/plugin-form/src/schemaDefaults.ts already rules that a runtime default (a CEL envelope or a runtime token) stays server-owned. The client cannot evaluate it, and seeding a stand-in is worse than leaving the control empty.
      • A literal boolean default is already seeded as itself, because the seed skips any key the caller supplied.
      • That leaves only the runtime default, and for it the contract says: start unset.
    • Direction:
      • The boolean seed skips a field whose defaultValue is a runtime default. Reuse isRuntimeDefault from @object-ui/core (packages/core/src/validation/server-owned-value.ts), which form.tsx already imports from. Do not add a second classifier.
      • Left untouched, the key stays absent. omitServerResolvedDefaults then leaves it out, and ObjectQL.applyFieldDefaults evaluates the declaration.
      • A value the user sets, false included, is submitted as usual.
    • Keep objectstack-ai/cloud#972 intact. A boolean without a runtime default still seeds false. Pin both sides:
      • a CEL-default boolean left untouched → the key is absent from the create payload;
      • a plain boolean left untouched → false;
      • a required boolean with a CEL default is not refused as empty in create mode. isRequiredInForm already suppresses the rule for a runtime default; the pin proves the unseeded control reaches it.
    • Sequence: PR feat(components,i18n): a create form says when the server will fill a field (objectui#12108) #12120 (for forms: a field whose defaultValue is a CEL expression opens empty on a new record with no sign that the server will fill it on save #12108, already accepted) edits the same file and adds the hint that the server will fill a field. Pick this card up after that PR merges, so the unseeded boolean shows the hint too. This is ordering, not a block. Clause-②: no.
  2. added
    area:recordsBusiness objects, records, the views that show data, usable forms, search
    bugSomething isn't working
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    and removed on Oct 11, 2026
  3. objectstack-fleet commented on Oct 11, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1
    Session: session_01TYgwmFK1q4KJ6Qq2WRLzsD
    Account: zhuangjianguo
    Branch: claude/issue-12121-runtime-default-boolean-unseeded
    Worktree: objectui-issue-12121
    Domain: domain:ui
    Seat: domain:ui#2
    File surface: packages/components/src/renderers/form/form.tsx (the defaultValues memo's boolean seed only); its tests in packages/components; .changeset/12121-runtime-default-boolean-unseeded.md (stop on breach; explain in the report)
    Container & model: M (small, with triage's direction given), mode:subagent, model: default tier — dispatch-gates --tier --repo objectstack-ai/objectui: "no path-derived mandate"
    Clause-②: no
    Responsibility: objectui's form renderer (form.tsx), whose boolean seed writes false over a runtime default, so the create payload never lets the server evaluate the declared CEL default | the existing server-owned-default contract: plugin-form's schemaDefaults.ts leaves a runtime default to the server, and isRuntimeDefault in @object-ui/core classifies it | hand-written or AI-written metadata that declares a CEL default on a boolean field; triage found no production producer (6106001027)
    Thread-read: 6106001027
    Serial constraints cleared: none blocking. Read at 2026-10-11T06:23Z:

    Clause-②: no: the change narrows what the create form writes for one field class and adds no exported name, key or accepted shape.


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 11, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report
    {
    "issue": 12121,
    "status": "done",
    "branch": "claude/issue-12121-runtime-default-boolean-unseeded",
    "pr": "#12133",
    "session": "session_01TYgwmFK1q4KJ6Qq2WRLzsD (subagent: the parent PM session id, read from the container as CLAUDE_CODE_REMOTE_SESSION_ID cse_01TYgwmFK1q4KJ6Qq2WRLzsD)",
    "premise_still_valid": true,
    "summary": "The defaultValues memo in packages/components/src/renderers/form/form.tsx seeds false for an unsupplied boolean (cloud#972). Its loop now skips a field when isServerOwnedValue(f, isCreateForm) is true. That is the classifier the objectui#12108 hint and the create-mode required suppression already read. The previousRecord memo and isCreateForm move unchanged above the seed so it can read the create signal. An untouched CEL-default boolean is now empty on create: the renderer submits it as undefined, omitServerResolvedDefaults drops the key, the hint shows, and required is suppressed. A plain boolean still seeds false (cloud#972 intact), an edit form still seeds false, and a user-set value, false included, is submitted. Measured end to end in a throwaway test (not committed) through ObjectForm with registerAllFields in all seven layouts. In the six layouts whose submit was driven (the wizard was not submitted), the create payload omits active, and the hint is drawn in all seven. With the guard ablated, every one of those payloads carries active:false: the card's defect, reproduced. H4 is falsified as stated: the default is at f.field.defaultValue, not f.defaultValue, so the guard calls the existing single derivation (isServerOwnedValue, which wraps isRuntimeDefault) rather than restating the slot and the create gate. No classifier was added.",
    "tests": "All at HEAD 06f640d, through os-verify-lock with OS_VERIFY_LOCK_SLOT=ui2-12121. (1) New pin packages/components/src/renderers/form/tests/form-boolean-seed-runtime-default-12121.test.tsx, 5 cases x [switch, checkbox], 10 tests green. (2) Ablation via objectstack scripts/ablation-replace.mjs with the fix committed, deleting the line 'if (isServerOwnedValue(f, isCreateForm)) continue;'. Anchor x1 -> x0 on disk (an in-command grep also printed 0), blob 00d96b1236cb -> 9ca086f2655f. Result: 'Tests 6 failed | 11 passed (17)'. Cases 1-3 (payload undefined, hint, required not refused) went red for both controls. Cases 4-5 (user-set values, edit-form seeds false) stayed green as boundary pins, plus 7 throwaway e2e cases. The e2e throwaway at ablation printed PAYLOAD with "active":false and HINT null in every layout. Restore: 'ok restored: blob == HEAD (00d96b1236cb) and git diff HEAD is empty'. No build was needed: vitest aliases @object-ui/core and @object-ui/components to src. (3) pnpm --workspace-concurrency=2 --filter '@object-ui/components^...' build: VERDICT command-exit 0, Scope 8 of 47. H2 is confirmed on the built packages/core/dist: index.d.ts 'export * from ./validation/index.js', validation/index.d.ts 'export * from ./server-owned-value.js', which declares isRuntimeDefault and isServerOwnedValue. (4) pnpm --filter @object-ui/components type-check: VERDICT command-exit 0, script name echoed. Its tsconfig.test.json includes src//*.test.tsx. (5) pnpm exec vitest run packages/components/ as one run hit the foreground cap (EXIT 124). It was rerun as --shard=1/4..4/4, all VERDICT command-exit 0: files 94+94+94+(92 passed, 1 skipped), tests 893+951+1180+809 passed, 24 skipped, 0 failed. (6) pnpm exec vitest run packages/plugin-form/ --shard=1/2 and 2/2, both exit 0: 87+86 = 173 files (all 173 tracked), 1054+1073 tests passed, 1 skipped. (7) column-identity.ratchet.test.ts, one-authority-per-exported-name-6273.test.ts and apps/console FormPage.serverDefaults.test.tsx: 3 files, 26 tests passed, exit 0. (8) Root suite scripts/tests/ in --shard=1/4..4/4, all exit 0: 46+45+45+45 = 181 files (2 skipped), 1254+1712+1415+1071 tests passed, 2 skipped. (9) Gates, each exit 0 with its own verdict line: check-changeset-presence ('2 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s)'), changeset-claims, pending-changeset-literals, new-line-citations ('0 new citation(s)'), control-bytes, test-path-roots, vi-mock-specifiers, vi-mock-inherit, vi-mock-override-shape and phantom-deps. (10) eslint --no-inline-config on form.tsx and the new test: 0 errors. form.tsx has 70 warnings at both base and head, the same rule|message multiset. The test has 4 no-explicit-any warnings, the same shape as its siblings. (11) Eager closure: NOT MEASURED, reason: an apps/console build plus check:eager-closure does not fit the foreground cap while the lock queue waited 4 to 9 minutes per acquisition this run. CI owns it. (12) Uncontrolled-to-controlled reading: on the built-in switch and checkbox branches (Radix checked={value}), an undefined value renders unchecked (aria-checked false, not indeterminate). The first click logs Radix's dev-only console.warn 'Switch/Checkbox is changing from uncontrolled to controlled'. Submitted values are correct. The object-bound field:boolean path (BooleanField, checked={!!value}) stays controlled. Not changed: it is outside the seed-only surface, see out_of_scope_findings.",
    "mcp_calls": "0",
    "api_writes": "2 relay dispatches (POST /repos/objectstack-ai/objectstack/dispatches, landing as objectstack-fleet[bot]). (1) pr_create = POST /repos/objectstack-ai/objectui/pulls (draft) + POST /repos//issues/12133/assignees [zhuangjianguo], read back byte-identical, 9885 bytes. (2) comment = POST /repos//issues/12121/comments (this report). Plus git push of the branch, which is not a REST write. 0 label writes, 0 PR-body PATCH.",
    "gates": {
    "build closure (@object-ui/components^...)": "pass (exit 0)",
    "type-check @object-ui/components": "pass (exit 0)",
    "vitest packages/components/ (4 shards)": "pass",
    "vitest packages/plugin-form/ (2 shards)": "pass",
    "column-identity.ratchet + one-authority-6273 + FormPage.serverDefaults": "pass",
    "vitest scripts/tests/ (4 shards)": "pass",
    "check-changeset-presence": "pass",
    "check:changeset-claims": "pass",
    "check:pending-changeset-literals": "pass",
    "check:new-line-citations": "pass (0 new)",
    "check:control-bytes": "pass",
    "check:test-path-roots": "pass",
    "check:vi-mock-specifiers": "pass",
    "check:vi-mock-inherit": "pass",
    "check:vi-mock-override-shape": "pass",
    "check:phantom-deps": "pass",
    "eslint (touched TS files)": "pass (0 errors; warnings unchanged on form.tsx)",
    "check:eager-closure": "NOT MEASURED (apps/console build does not fit the foreground cap under the lock queue; CI)",
    "CI on PR #12133 at report time": "in_progress (16 success, 3 skipped, 23 in progress at 06f640d)"
    },
    "line_budget": "No skills/
    or governed ledger touched, so no line ratchet applies. Diff +222 -28 over 4 files. form.tsx is +37 -25, of which 24 lines are the previousRecord/isCreateForm block moved verbatim. The rest is the 1-line guard, a 9-line comment, the memo dependency and a 2-line comment reword. The new test file is +167, the changeset +11 and the README +7 -3.",
    "deviations": [
    "Guard calls isServerOwnedValue(f, isCreateForm) rather than a bare isRuntimeDefault, as the triage letter has it. Measured: the declared default sits at f.field.defaultValue, and isServerOwnedValue is the existing single derivation over isRuntimeDefault that the hint and the required suppression already read. Same classifier, no new one, create-gated.",
    "The previousRecord memo and isCreateForm were moved, unchanged, above the defaultValues memo inside form.tsx, because the guard needs isCreateForm (TDZ otherwise). This is outside "the seed only" in the strictest reading, but in the same file and required by the guard. The isCreateForm comment was reworded to drop the stale call-site count ("three").",
    "packages/plugin-form/README.md edited: its "set on save" section said the hint is never drawn on a boolean because the renderer seeds false, which this change makes false. This is a docs page describing the changed behaviour, pre-authorised by the dispatch.",
    "The single-run packages/components/ vitest hit the 10-minute foreground cap (exit 124), so the package was run as 4 shards and the root suite as 4 shards. This is the full population, not a narrowing.",
    "The eager-closure delta is NOT MEASURED (see gates).",
    "Throwaway measurement tests were written in the worktree and deleted, never committed: one in components for the uncontrolled-warning and payload readings, one in plugin-form for the e2e across seven layouts."
    ],
    "files_changed": [
    "packages/components/src/renderers/form/form.tsx",
    "packages/components/src/renderers/form/tests/form-boolean-seed-runtime-default-12121.test.tsx",
    "packages/plugin-form/README.md",
    ".changeset/12121-runtime-default-boolean-unseeded.md"
    ],
    "open_questions": [
    {
    "question": "packages/plugin-form/src/tests/serverDefaultHint-12108.test.tsx is outside this claim's file surface. Its docblock item 1 says 'Not a boolean: the renderer seeds an unsupplied two-state control false (cloud#972), so it is never empty and the submit sends that value - no hint is the true answer there'. This PR makes that sentence false. Amend it here or later?",
    "options": [
    "A: the seat amends the surface and lands a follow-up commit on this branch. It deletes that sentence and adds a boolean CEL field (e.g. active: { type: 'boolean', label: 'Active', defaultValue: cel('true') }) to OBJECT_SCHEMA and to SERVER_FILLED. The throwaway e2e shows the hint and the payload omission hold in all seven layouts. Cost: one test-only commit, about 5 lines.",
    "B: leave it, and fix it the next time someone touches that test file. Cost: a false comment sits on main until then."
    ],
    "recommendation": "A: it is cheap, test-only, and turns the card into an end-to-end pin across every container. Per the claim it is a surface decision for the seat, so this dev did not make the edit."
    }
    ],
    "out_of_scope_findings": [
    "carrier: none named (承接者:无), noted in the PR's Acceptance notes and not filed. Dev-only Radix console.warn 'Switch/Checkbox is changing from uncontrolled to controlled' fires on the built-in switch/checkbox case branches in form.tsx (checked={value}) when an unseeded server-owned boolean is first toggled. It is reached for an object field only through a form-view widget: 'switch' or 'checkbox' override. Behaviour and payload are correct, and production resolves Radix IS_DEVELOPMENT to false. It is not class a/b/c: nothing user-visible and no metadata trap. Dedupe words: uncontrolled to controlled, builtin switch checked value, Radix warning form.",
    "carrier: the seat (see open_questions[0]), noted and not filed. A stale docblock sentence in packages/plugin-form/src/tests/serverDefaultHint-12108.test.tsx: a test file, not published."
    ]
    }


    Generated by Claude Code

  5. objectstack-fleet commented on Oct 11, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report
    {
    "issue": 12121,
    "round": "patch round 1 (seat answer A to open_questions[0]; claim surface amended to add packages/plugin-form/src/tests/serverDefaultHint-12108.test.tsx)",
    "status": "done",
    "branch": "claude/issue-12121-runtime-default-boolean-unseeded",
    "pr": "#12133",
    "head": "fb46858 (parent 06f640d; no merge of main, no rebase)",
    "session": "session_01TYgwmFK1q4KJ6Qq2WRLzsD (subagent: the parent PM session id)",
    "premise_still_valid": true,
    "summary": "Test-only commit fb46858 in packages/plugin-form/src/tests/serverDefaultHint-12108.test.tsx. The docblock item 1 sentence 'Not a boolean: the renderer seeds ...' is rewritten: a boolean is server-filled too (objectui#12121), the cloud#972 false seed applies only when the default is not a runtime one, and a plain boolean still seeds false. One field is added to OBJECT_SCHEMA, using the file's own cel() helper: active: { type: 'boolean', label: 'Active', defaultValue: cel('true') }. 'active' is added to SERVER_FILLED. Every existing assertion is kept. The file had no plain-boolean NOT_SERVER_FILLED control, and none was added. The new boolean is now pinned through ObjectForm in all seven layouts: the hint is drawn, and in the six submit layouts the create payload omits the key. No changeset change.",
    "tests": "All under os-verify-lock with OS_VERIFY_LOCK_SLOT=ui2-12121, with the fix and this commit at HEAD fb46858. (1) pnpm exec vitest run packages/plugin-form/src/tests/serverDefaultHint-12108.test.tsx: 'Test Files 1 passed (1) / Tests 34 passed (34)', VERDICT command-exit 0. (2) Ablation via objectstack scripts/ablation-replace.mjs --delete on the anchor 'if (isServerOwnedValue(f, isCreateForm)) continue;' in packages/components/src/renderers/form/form.tsx. 'anchor x1 -> x0', blob 00d96b1236cb -> 9ca086f2655f, and an in-command grep -c printed 0. The run reported 'Tests 13 failed | 21 passed (34)'. Seven of the failures are 'draws the hint under every empty field the server fills, and under no other', one per layout, with 'AssertionError: active: expected undefined to be Set automatically when saved.'. Six are 'submits with close_date and stage left empty, unmarked, and omitted from the payload', with 'AssertionError: active: expected { status: open, active: false, ...(1) } to not have property active'. Restore: 'ok restored: blob == HEAD (00d96b1236cb) and git diff HEAD is empty', and the anchor count is back to 1. Two earlier attempts of this leg returned queue-timeout (exit 99) before the lock was acquired, so no test ran. Each restore was proven (blob == HEAD, git diff HEAD empty), and those attempts are not readings. No dist build was needed: vitest aliases @object-ui/components to src. (3) pnpm --workspace-concurrency=2 --filter '@object-ui/plugin-form^...' build (Scope 12 of 47): VERDICT command-exit 0. Then pnpm --filter @object-ui/plugin-form type-check: VERDICT command-exit 0, script name echoed. Its tsconfig.test.json includes src//*.test.tsx. (4) On the clean head: pnpm check:test-path-roots exit 0 ('check-test-path-roots: OK'), pnpm check:new-line-citations exit 0 ('VERDICT new-cross-file-line-citations: 0 new citation(s)'), pnpm check:control-bytes exit 0 ('check-control-bytes: OK (scanned 8326 tracked text file(s)')).",
    "mcp_calls": "0",
    "api_writes": "1 this round: a relay dispatch (POST /repos/objectstack-ai/objectstack/dispatches) carrying comment = POST /repos//issues/12121/comments (this patch-round report). Plus git push 06f640d..fb46858, which is not a REST write. 0 label writes, 0 PR-body PATCH.",
    "gates": {
    "vitest serverDefaultHint-12108.test.tsx at fb46858": "pass (34/34)",
    "ablation of the seed guard": "red as expected (13 failed: 7 hint + 6 payload, all on active); restore proven blob == HEAD",
    "build closure (@object-ui/plugin-form^...)": "pass (exit 0)",
    "type-check @object-ui/plugin-form": "pass (exit 0)",
    "check:test-path-roots": "pass",
    "check:new-line-citations": "pass (0 new)",
    "check:control-bytes": "pass",
    "CI on fb46858": "not read at report time (in_progress or pending is the honest value; PM reads it)"
    },
    "line_budget": "No skills/
    or governed ledger touched. This round: +9 -5, one test file. The docblock is +6 -4, and the schema field with its comment +2. SERVER_FILLED is +1 -1.",
    "deviations": [
    "The ablation leg needed three attempts. The first two were queue-timeout (exit 99, lock never acquired), so the mutation was restored and proven both times, with no test run. The third acquired the lock and is the reading reported.",
    "The plugin-form dependency closure was rebuilt in the recreated worktree, because the removed worktree took its dist with it. type-check reads dependency .d.ts.",
    "The worktree was removed after the push (node_modules first, no --force). This report was posted afterwards."
    ],
    "files_changed": [
    "packages/plugin-form/src/tests/serverDefaultHint-12108.test.tsx"
    ],
    "open_questions": [],
    "out_of_scope_findings": []
    }


    Generated by Claude Code

  6. objectstack-fleet commented on Oct 11, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT — PR objectui#12133 (head fb4685821c), with the claim amendment for patch round 1 · domain:ui seat 2, session_01TYgwmFK1q4KJ6Qq2WRLzsD, 2026-10-11T09:51Z

    Reviewed against GitHub and the diff, not the reports (6107468495, patch round 6107650384).

    Claim amendment (to claim 6106214543)

    • File surface, extended:
      • packages/plugin-form/src/__tests__/serverDefaultHint-12108.test.tsx. This is the seat's answer A to the dev's open question. Its docblock said a boolean is never server-filled, which this change makes false. It now pins a CEL-default boolean (active) as server-filled in all seven layouts.
      • packages/plugin-form/README.md: its "set on save" section said the same thing, and is corrected (objectui AGENTS.md Add automated testing infrastructure and CI/CD workflows #2).
      • Inside form.tsx, the previousRecord memo and isCreateForm move unchanged above the seed, which reads isCreateForm. The move is required by the guard.

    Verdict

    • Shape:
      • Draft on main, first line Fixes #12121, and Clause-②: no at a line start.
      • Fixes #12121 is the only closing keyword in the body and the commits.
      • Assignee zhuangjianguo.
    • Scope: 5 files, +231/−33: form.tsx, a new pin in packages/components, the 12108 test, the plugin-form README and one changeset.
      • Nothing under content/docs/releases/.
      • check-governed-merges --pr: NOT governed, 264 changed lines.
      • No contract face is touched: no Clause-②: yes, no published schema, no governed text. So this review is the seat's own, with CI.
    • What lands:
      • The defaultValues memo's boolean seed now skips a field when isServerOwnedValue(f, isCreateForm) holds. Read by the seat on objectui main: that function is isCreateForm && isRuntimeDefault(field.field.defaultValue), the classifier triage named (6106001027), gated to create forms.
      • On a create form, an untouched CEL-default boolean is left out of the payload, so ObjectQL.applyFieldDefaults evaluates the declaration. The hint shows, and required is not refused as empty.
      • A plain boolean still seeds false (objectstack-ai/cloud#972 intact). An edit form still seeds false. A value the user sets, false included, is submitted.
      • The dev measured triage's "the default is f.defaultValue" as wrong: it sits at f.field.defaultValue. Calling the existing single derivation, rather than a second classifier, is the right reading of triage's "Do not add a second classifier".
    • Changeset prose, checked sentence by sentence against the diff: @object-ui/components: patch. The hint wording it quotes, "Set automatically when saved.", is the en pack's serverDefaultHint.
    • Tests:
      • The new pin: 5 cases × [switch, checkbox].
      • Ablating the guard turned 6 cases red. In patch round 1 it turned 13 red in the 12108 test: 7 hint cases and 6 payload cases, all on active. Every restore was blob-equal.
      • packages/components/ (4 shards), packages/plugin-form/ (2 shards), the root scripts/__tests__/ suite (4 shards) and the two repo-wide ratchets all pass (counts in the reports).
    • Gates on this head (read at 2026-10-11T09:51Z): 40 success, 3 skipped by design (dependabot and the two coverage placeholders), 0 failure.
      • Lint and Type Check both read success.
      • Bundle Analysis: the eager closure is 3174.1 KB of 3204.6 KB.

    Acceptance notes (carried, not filed)

    • The built-in switch and checkbox branches in form.tsx render checked={value}. An unseeded server-owned boolean therefore logs Radix's dev-only "changing from uncontrolled to controlled" warning on its first toggle. The submitted values are correct, and production builds do not log it. No carrier.

    Landing: ready and auto-merge through the merge queue, now.


    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:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions