Skip to content

fix(types,components,plugin-form): declare a form field's step (the spec's number) and className; built-in branches merge the class and derive the number step, ObjectForm stops writing 'any' (objectui#12130) - #12166

Merged
objectstack-fleet[bot] merged 7 commits into
mainfrom
claude/issue-12130-step-classname
Oct 11, 2026

Conversation

@objectstack-fleet

@objectstack-fleet objectstack-fleet Bot commented Oct 11, 2026 •

Copy link
Copy Markdown
Contributor

Fixes #12130
Clause-②: yes (narrowing): declaring step and className widens the strict authoring face by two keys. Typing step as the spec's number narrows the tolerant face, from accepting step: 'any' (stripped) to refusing it at fields[].step.

Round 3 of objectui#12130 (step, className), the census's last two OPEN rows. After it the census ledger has no OPEN row. Implemented by the os-dev for the domain:spec @ objectui seat, session https://claude.ai/code/session_01V8qYZseSLfKH3V8tPu2f73, claim 6113481475 as amended by 6114408150. Base c0c2f79, synced by merging main f3d5408 (objectui#12155's DOM allowlist; conflicts kept both sides). Head 9c93615.

Premises (measured before any declaration): both held

  • step. The built-in number input can derive the step from the metadata carrier (field.field || field; on the ObjectForm route that is the raw object field with scale), by NumberField's rule: an explicit step, else 10^-scale, else any. So ObjectForm now writes no step. objectFormNumericStep-9574.test.tsx passes on both routes with every assertion byte-identical to main: its 7 expect( lines diff empty, and only header prose changed. Ablating the derivation turns its two route-1 tests red. A hand-authored input with inputType: 'number' steps by any / 0.01 (scale 2) / 5 (explicit), where it had no step attribute / none / 5 before.
  • className. Measured per type through the real SchemaRenderer, with components only and with @object-ui/fields, in three states. Every reader puts it on an element the field's own widget or branch renders: the control in most types, the widget's own box for tags, file, image and slider, the first sub-input for address and geolocation, a display element, or a section-divider's divider. None puts it on the field row, the label, the host's read-only group or outside the row. lookup, master_detail, user and signature draw no class from it.

What changed

  • packages/components/src/renderers/form/form.tsx: the input and default arms derive a number input's step (nativeNumberStep), and the built-in branches merge an entry's className with their own classes (cn(own, className)), as select already did. Before, the entry's class replaced the touch-target and read-only classes.
  • packages/plugin-form/src/ObjectForm.tsx: the formField.step = … : 'any' write is removed.
  • FormField / FormFieldSchema: step declared by reference to the spec's FieldSchema.step; className declared as string.
  • The census (both rows move to DECLARED_BY_12130), the effects and components-only pins (with/without cases, one per element class, and a never-the-row sweep), the face pin and the zod coverage list.
  • Docs: form.mdx and plugin-form.mdx (className is now a declared key). Its pin in check-doc-component-types.test.ts flips to toMatch.
  • Changesets: new .changeset/12130-step-classname.md (types / components minor, plugin-form patch, breaking semantics stated). Round 1's pending changeset loses its 「Still undeclared」 sentence.

Gates run (code at 215da7e; 9c93615 adds the plugin-form/README.md correction only)

  • vitest under os-verify-lock: scripts/__tests__/ 「Test Files 180 passed | 2 skipped (182)」; the 9574 pin 「Tests 3 passed (3)」; examples/schema-catalog/ 「Test Files 46 passed (46)」. At b1fd4c4: packages/types/, packages/plugin-form/, packages/components/: all exit 0.
  • pnpm --filter type-check for types, components, plugin-form and example-schema-catalog: exit 0. pnpm check: 「0 did not validate」.
  • Doc gates over the rebuilt types (35 of 35 build tasks): check-doc-component-types, -doc-snippet-types, -doc-json-fences, check:doc-fences, -doc-example-ids: all exit 0.
  • Changeset gates: check-changeset-presence 「7 source file(s) of 3 released package(s) changed, and this change declares 1 changeset(s)」. -claims, -no-major, -overwrite and -fixed exit 0 (-overwrite reports the round-1 changeset edit, report-only). check:pending-changeset-literals, check:control-bytes and check:new-line-citations (「0 new citation(s)」): exit 0.
  • Not measured here: the console bundle budget. CI's.

Acceptance notes

  • packages/plugin-form/README.md listed className as 「Not a FormField key」. It ships with the package, so it is corrected in this PR (9c93615, claim amendment 6114675131): className moves to the declared keys and the stale 「23 keys」 count is dropped.
  • lookup, master_detail, user and signature accept className and draw nothing from it. That is noted, not filed.

Generated by Claude Code

…ives its step; ObjectForm stops writing `step` (objectui#12130)

The built-in `input` arm and the unregistered-widget `default` arm draw a
native number input under `inputType: 'number'`. Each now derives its step
from the metadata carrier by the registered `number` widget's rule: an
explicit numeric `step` wins, else `10^-scale`, else `'any'`.

So `ObjectForm` no longer writes `step` onto the entries it builds. It used
to write `'any'` when no `scale` was declared, a value the spec's numeric
`FieldSchema.step` refuses. `objectFormNumericStep-9574.test.tsx` passes
unmodified on both of its routes.

The premise measurement for round 3, committed before any declaration.

Claude-Session: https://claude.ai/code/session_01V8qYZseSLfKH3V8tPu2f73
Co-authored-by: Claude <noreply@anthropic.com>
… into its control's classes (objectui#12130)

The built-in `input`, `textarea`, `checkbox` and `switch` branches and the
unregistered-widget default spread the entry's `className` over their own
classes, so an authored class erased the touch-target height and the
read-only tint. Each now writes `cn(own, entry.className)` after the
spread, as the built-in `select` already did.

The effects pins measure it per element class (a built-in control, a
registered widget, a section-divider), and a sweep over every type the form
draws pins that the class never lands on the field row, its label or a
wrapper the host draws, editable or read-only.

Claude-Session: https://claude.ai/code/session_01V8qYZseSLfKH3V8tPu2f73
Co-authored-by: Claude <noreply@anthropic.com>
…assName`; the census has no open row left (objectui#12130)

`step` is `FieldSchema.step` by reference on both faces, so HTML's `'any'`
is refused, on the tolerant face too, which used to strip it. No producer
writes it any more: the controls that draw a number derive `'any'`
themselves when a field declares neither `step` nor `scale`.

`className` is the classes of the element the field's type renders,
measured per type through the real `SchemaRenderer` with and without
`@object-ui/fields`: the control, a registered widget's own element, or a
section-divider's divider, never the field row or a wrapper the host draws.

The census moves both rows into DECLARED_BY_12130; its ledger has no open
row left. The face pin, the zod coverage list, form.mdx and one changeset
follow.

Claude-Session: https://claude.ai/code/session_01V8qYZseSLfKH3V8tPu2f73
Co-authored-by: Claude <noreply@anthropic.com>
…ber input, and that no producer writes `'any'` (objectui#12130)

Comment-only. The default arm's note said an object-bound number field
reaches it when its widget is unregistered; the entries that draw a number
input there are the ones that say `inputType: 'number'` and name no
registered widget. The `FormField` note said no producer writes `step`;
it is `'any'` that no producer writes.

Claude-Session: https://claude.ai/code/session_01V8qYZseSLfKH3V8tPu2f73
Co-authored-by: Claude <noreply@anthropic.com>
…bjectui#12130)

Brings in objectui#12155's DOM allowlist for the form's built-in branches.
Conflicts in renderFieldComponent resolved by keeping both: the allowlist
(`toFormControlDomProps` plus `builtinHostAttributes`) and the explicit
react-hook-form binding from objectui#12155, then this branch's merged
`className` (`cn(own, entry.className)`) and the number input's derived
`step` after the spread.

`BUILTIN_HOST_ATTRIBUTES`' note said `ObjectForm` writes `step`; since this
branch it writes none, so the note now says `FormField` declares `step` and
the number input resolves it from the metadata carrier.

Claude-Session: https://claude.ai/code/session_01V8qYZseSLfKH3V8tPu2f73
Co-authored-by: Claude <noreply@anthropic.com>
…lared FormField key; round 1's changeset and the 9574 header follow (objectui#12130)

Claim amendment 6114408150, the seat's answers to open questions 1-3:

- content/docs/plugins/plugin-form.mdx: `className` moves from the
  "Not a `FormField` key" table to the declared keys; the two-key sentence
  becomes one key, keeping `defaultValue`; the clause saying nothing in
  the contract promises a field-level `className` is deleted; the stale
  key cardinal is dropped.
- scripts/__tests__/check-doc-component-types.test.ts: the `className`
  assertion flips to `toMatch`, so the pin re-derives the page's now
  positive claim. The `defaultValue` non-member assertion stays.
- .changeset/12130-form-field-channel-keys.md: its "Still undeclared"
  sentence goes, since no OPEN row remains; the new changeset's
  "Supersedes" bullet goes with it. Prose only.
- objectFormNumericStep-9574.test.tsx: header prose only. Every
  assertion is byte-identical.

Claude-Session: https://claude.ai/code/session_01V8qYZseSLfKH3V8tPu2f73
Co-authored-by: Claude <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 11, 2026 •

Copy link
Copy Markdown
Contributor

changeset-claim-re-read

⚠️ 1 pending changeset(s) describe a file this change touches

Their bodies publish verbatim into the CHANGELOG at the next release, so this is a request to re-read them against your diff — addressed here because you are the one seat that can answer it without re-deriving anything.

⛔ Nothing here blocks, and nothing here is a verdict on your change. This gate exits 0, is not a required context, and judges name resolution, never meaning: it asked whether a pending body names a file you touched. "Is this sentence still true?" is the one question it will not answer, and the one you are being asked to answer.

.changeset/12130-avatar-field.md

  • names form-field-channel-effects-12130.test.tsx → examples/schema-catalog/test/form-field-channel-effects-12130.test.tsx — edited by this change

    The lookup and user field widgets (and master_detail, which renders through the lookup widget) read avatarField off a form's fields[] entry. With picker: 'search', each candidate row draws its avatar from that record field instead of image. This is measured through the real SchemaRenderer, with and without the key, in form-field-channel-effects-12130.test.tsx in examples/schema-catalog/test/. The census beside it now lists avatarField as declared and read by those three types.

Read the paragraph, not the line: both false halves of the objectui#8617 claim sat in one paragraph, and correcting either alone would have left it asserting the same wrong thing.

If a claim did go false, correct the body. That is precedented and prose-only, frontmatter untouched; check-changeset-overwrite.mjs will report the correction as its own case 2 ("correcting a declaration on purpose … legitimate"), which is the intended shape — one gate asks for the read, the other records the write.

Not covered, stated so nobody reads this as more: a born-false claim that spells no line address at all (objectui#9495 coordinated one by ORDINAL — "a grep finds that member first" — and deciding that means reading what the sentence means), a claim spelled as a symbol or a package rather than a backticked file name, and a file named ambiguously.

Compared the checked-out tree with 43e150518 (merge-base with origin/main): 14 file(s) changed outside .changeset/, read against 335 pending declaration(s) that publish a body (342 pending in total). · run

…ld key (objectui#12130)

Claim amendment 6114675131: the same correction as plugin-form.mdx.
`className` moves from the "Not a `FormField` key" list into the declared
keys, and the stale key cardinal is dropped.

Claude-Session: https://claude.ai/code/session_01V8qYZseSLfKH3V8tPu2f73
Co-authored-by: Claude <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 293 chunks) 3178.7 KB 3204.6 KB
Main entry chunk (gzip) 74.2 KB 350 KB
Entry file index-U7T8_Vb3.js —
Status PASS —

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.


📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 20.05KB 7.41KB
app-shell (runtime-config.js) 22.59KB 7.89KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.11KB 3.87KB
auth (ActiveOrganizationStorage.js) 27.95KB 10.04KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.22KB 10.61KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.40KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.72KB 2.24KB
auth (SocialSignInButtons.js) 9.70KB 3.93KB
auth (UserMenu.js) 3.39KB 1.21KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 41.19KB 11.12KB
auth (createAuthenticatedFetch.js) 8.54KB 3.46KB
auth (index.js) 3.63KB 1.64KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 11.08KB 4.58KB
collaboration (CommentThread.js) 27.11KB 7.97KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.28KB 2.60KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.50KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 588.48KB 141.70KB
core (index.js) 10.18KB 4.04KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 241.78KB 67.52KB
fields (index.js) 276.26KB 70.32KB
i18n (LocalizationContext.js) 2.92KB 1.42KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 2.59KB 1.22KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.52KB 2.39KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 39.35KB 12.88KB
i18n (translateFn.js) 0.20KB 0.18KB
i18n (useDisplayLocale.js) 3.52KB 1.76KB
i18n (useObjectLabel.js) 36.87KB 9.88KB
i18n (useSafeTranslation.js) 7.14KB 2.92KB
layout (index.js) 40.26KB 11.71KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 6.62KB 2.45KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 5.52KB 2.10KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 15.35KB 5.51KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.82KB 2.38KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.33KB 3.07KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 16.04KB 3.92KB
plugin-calendar (index.js) 54.31KB 15.86KB
plugin-charts (index.js) 84.72KB 23.27KB
plugin-chatbot (index.js) 201.72KB 48.07KB
plugin-dashboard (index.js) 144.20KB 38.95KB
plugin-designer (index.js) 233.77KB 50.02KB
plugin-detail (index.js) 250.93KB 66.24KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 177.74KB 46.01KB
plugin-gantt (index.js) 178.63KB 45.19KB
plugin-grid (index.js) 255.50KB 71.02KB
plugin-kanban (index.js) 53.23KB 16.71KB
plugin-list (index.js) 122.82KB 31.24KB
plugin-map (index.js) 27.24KB 9.03KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 44.12KB 12.29KB
plugin-timeline (index.js) 39.21KB 11.85KB
plugin-tree (index.js) 15.07KB 5.33KB
plugin-view (index.js) 92.11KB 23.27KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 12.07KB 3.68KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 120.63KB 39.56KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.50KB 2.06KB
react (schema-input.js) 4.31KB 2.07KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (body-dialect.js) 4.50KB 1.99KB
sdui-parser (codegen.js) 9.45KB 3.76KB
sdui-parser (dashboard-widget-options.js) 3.07KB 1.30KB
sdui-parser (index.js) 7.30KB 3.12KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 25.28KB 7.80KB
sdui-parser (provenance.js) 3.84KB 1.90KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 23.87KB 7.83KB
types (ai.js) 4.39KB 2.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 4.12KB 1.61KB
types (authoring-nodes.js) 0.20KB 0.19KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (cloud.js) 0.20KB 0.18KB
types (complex.js) 4.44KB 2.07KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (dashboard-widget-layout.js) 2.06KB 0.96KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 1.13KB 0.65KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 5.78KB 2.70KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 5.00KB 2.39KB
types (navigation.js) 0.20KB 0.18KB
types (node-slots.js) 7.18KB 2.34KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 2.52KB 1.31KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 4.99KB 1.96KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 19.93KB 7.26KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.48KB 3.50KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 9c93615a38afa3f3f7b86cfe957b815e415f8305
Local-runs: none

Inputs: card #12130 (body, 19 comments), PR #12166 (body, 16 files, net diff origin/main...9c93615), the head's check-runs. Head 9c93615 is the PR body's 215da7e plus one docs commit (plugin-form/README.md, amendment 6114675131).

① Derived judgments

  • Strict face accepts fields[].step (the spec's number, by reference) and fields[].className (string): right. Both are measured read-and-effective (effects pins; census DECLARED_BY_12130), the park review 5887006513 is satisfied, and the census has no OPEN row left.
  • Tolerant face now refuses step: 'any' / a non-number step and a non-string className, and keeps the values: right. Spec authority (FieldSchema.step is a number), BREAKING stated. No render path calls the zod faces (ACCEPT 6112343855).
  • TS parity: FormField.step?: SpecField['step'], className?: string; the face pin asserts both (assertionSpecMembersByReference, assertionLocalMembers, IsAny false): right.
  • components: input (file too), fullscreen and plain textarea, checkbox, switch and the default arm merge cn(own, className) after the spread, as select already did: right (AGENTS.md Add public roadmap, VitePress documentation site, and GitHub Pages deployment #3; touch target and read-only tint survive, pinned with/without).
  • components: nativeNumberStep(fieldProps.field) on the input and default arms under inputType: 'number', after builtinHostAttributes so the derived value wins; the carrier is field.field || field (form.tsx:3512), so a hand-authored entry's own step / scale is read: right. The rule equals NumberField's (explicit number, else 10^-scale, else any).
  • plugin-form: the formField.step write is removed; the 9574 pin's 7 expect( lines are byte-identical to main, header prose only: right (the claim's ⛔ held).
  • Census ledger: OPEN rows gone; step: ['number', 'slider'], className as its 11 by-name reader types: right. Scripts pin flips not.toMatch to toMatch, still re-deriving the page: right.
  • Docs and README: className moves to the declared keys, step taught as a number never 'any', the stale cardinal dropped: right (amendments 6114408150, 6114675131).
  • Wrong: none.

② Semver level

.changeset/12130-step-classname.md: types minor (widens strict, narrows tolerant, BREAKING stated per the repo's release model), components minor (rendered output changes: merged classes, derived step), plugin-form patch (a write removed; both 9574 routes unchanged): right. Round-1 changeset: prose only, front matter untouched (amendment item 3); no Supersedes bullet in the new file: right. Clause-②: yes (narrowing) agrees across claim 6113481475, PR body line 2 and the changeset: right.

③ Boundary flags

  • Round-3 report 6114383469 OQ1 to OQ3: amendment 6114408150 answered A; each edit is in the diff (plugin-form.mdx, scripts pin, round-1 changeset, 9574 header). Answered.
  • Its deviations: the default arm treated as a built-in branch (same switch, claimed file; the ruled rule "the element the type renders" covers it): answered. ObjectForm writes no step at all (the claim named that write only): answered. Patch-1 report 6114664211: main f3d5408 merged with both sides kept, the BUILTIN_HOST_ATTRIBUTES note reworded on the claimed file: answered. Trailers per repo AGENTS.md: not a contract matter.
  • Patch-1 README finding: amendment 6114675131, edited at 9c93615: answered. lookup / master_detail / user / signature draw no class: consistent with the declaration's own text; noted, not filed: answered.
  • ESCALATED to the seat (landing, not a FAIL): (a) the PR body is stale at this head. It names head 215da7e, and its Acceptance note says the README "is not edited here", false since 9c93615; the seat writes the correction, as in round 2. (b) Fixes #12130 closes the card; amendment 6114408150 binds the seat to file pointer 6108177389 item 2 (the dashboard custom widget component arm) before ACCEPT. (c) Check-runs read at 2026-10-11T22:44Z: 25 success, 3 skipped by design, 14 in_progress (Lint, Type Check, the 8 Test shards, Spec Main Shape Gate, Build Docs, Bundle Analysis, Skill Example Check). None failed; convergence is the seat's landing check.

Implemented-by: claude/issue-12130-step-classname
Reviewed-by: session_01V8qYZseSLfKH3V8tPu2f73

VERDICT: PASS


Generated by Claude Code

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 11, 2026 22:57
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge October 11, 2026 22:57
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 11, 2026
Merged via the queue into main with commit d2500d8 Oct 11, 2026
45 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/issue-12130-step-classname branch October 11, 2026 23:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

types(strict face): objectui validate tells authors to remove a form field's defaultChecked and defaultValue, keys the field widgets read

2 participants