Repository navigation
plugin-form: on the default simple form type, an inline section field entry whose name is not in the field pool is skipped, while every other arm draws it, and objectstack now admits that entry on the page block #11615
Description
Activity
objectstack-fleet commented
on Oct 4, 2026 ContributorAuthorMore actionsTriage: first grade —
bug·priority:p3·domain:ui·area:records·pm:queue. Option 1: thesimplearm draws a self-contained inline entry, as every other arm doesTriage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-04T13:55Z. ⛔ Not a claim, ⛔ not a dispatch.Why option 1, not "document the intersection".
- One section contract across form types. [Decision] spec(ui): the five ComponentPropsMap members #21464's last stage stopped on — object-metric
drillDown.report, object-formcustomFields, formsections, object-timelineitems,action:group/action:menumembers objectstack#21704 fork 3 (ruled B) admits the inline arm on the page block without naming a form type. Five of six arms draw it. Asimple-only exception would be a second contract that objectstack's section shape would have to carry. - objectui#9884's pool intersection catches a name-only entry the object does not declare (a typo, or a stale name). An inline entry that carries its own
typedeclares itself, so skipping it guards nothing.
Direction:
buildSectionFields's pooled branch (sectionFields.tsabout:480–:484) draws an entry that carries its owntype, the same way the pool-less branch does.- Name-only entries keep the intersection and its warning.
ObjectFormSection.fields' type (packages/types/src/objectql.tsabout:1497) gains the form view's{ field }arm, whichsectionFields.tsalready draws.- objectui's inline-sections test (
submitTargetRefusal.test.tsx) adds thesimplearm, so all six are run.
Why p3. The inline arm's measured writers (#21704's census: 7) are all in
plugin-form's README wizard and its tests, on the wizard arm, not onsimple. Nothing drawn today goes missing. It closes a divergence before a writer reaches it.Routing:
plugin-form, sodomain:ui. The type line rides the same PR.Serial: objectui#11610 (
packages/typesform keys) and objectui#8347 (in flight onpackages/types/src/**). The claim reads their file lists.
Generated by Claude Code
- One section contract across form types. [Decision] spec(ui): the five ComponentPropsMap members #21464's last stage stopped on — object-metric
- addedarea:recordsBusiness objects, records, the views that show data, usable forms, searchBusiness objects, records, the views that show data, usable forms, searchbugSomething isn't workingSomething isn't workingdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatobjectui ui stream: fix lands on the published library or apps — objectui execution seatand removed
on Oct 4, 2026 objectstack-fleet commented
on Oct 4, 2026 ContributorAuthorMore actionsClaim: PM loop round 1
Session:session_015W8GBu6sBiqus2L2xjMsAL
Account:os-steve
Branch:claude/issue-11615-simple-inline-section-entry
Worktree:objectui-issue-11615
Domain:domain:ui
Seat:domain:ui#1
File surface:packages/plugin-form/src/sectionFields.ts(buildSectionFields's pooled branch),packages/plugin-form/src/ObjectForm.tsx(thesimplearm's section resolution),packages/plugin-form/src/submitTargetRefusal.test.tsxand the tests beside them,ObjectFormSection.fieldsinpackages/types/src/objectql.ts, and.changeset/11615-*.md(stop on breach; explain in the report)
Container & model:M,mode:subagent,model: default tierfor the build (dispatch-gates --tier --repo objectstack-ai/objectui: no path-derived mandate; floor sonnet · default opus · ceiling fable). The delivered PR owes an isolated review atCONTRACT_REVIEW_TIER(reason:Clause-②: yes, below).
Clause-②: yes
Thread-read: 5980751840
Serial constraints cleared: none, read 2026-10-04T16:27Z. Triage's named predecessors both landed: objectui#8347 (PR objectui#11607,b403bb3) and objectui#11610 (PR objectui#11614,2abec3a). The open objectui PRs (#11619packages/components+packages/fieldstest + one docs page, #11620packages/app-shell, #11069packages/cli) touch none of these files. The in-flight objectui#11613 declarespackages/plugin-detailand one console test.Why
Clause-②: yes:ObjectFormSection.fields, a published@object-ui/typestype, gains the form view's{ field }arm (triage's direction), which widens the public surface. Thesimplearm drawing a self-contained inline entry also widens what that renderer accepts.
Generated by Claude Code
objectstack-fleet commented
on Oct 4, 2026 ContributorAuthorMore actionsos-dev-report
{ "issue": 11615, "status": "done", "branch": "claude/issue-11615-simple-inline-section-entry", "pr": "https://github.com/objectstack-ai/objectui/pull/11622", "session": "session_015W8GBu6sBiqus2L2xjMsAL (subagent run; the parent seat's session, which the relay also derived from the container)", "premise_still_valid": true, "summary": "Executed triage Option 1 (5980751840). On objectui main the pooled branch of buildSectionFields dropped any entry the field pool lacked, including a self-describing inline FormField; it now draws an entry isInlineFieldDef accepts (object, non-string field, string name; the predicate submitTarget.ts already used, now exported) exactly as the pool-less branch does, while name-only entries keep the objectui#9884 intersection and warning (the warning now skips drawn inline entries). Zone 2 item 2 measured: with the draw alone a simple form with all-inline sections and no adapter collects its field and then refuses (ablation A3), while the five variants accept it, so SimpleObjectForm now reads the shared hasInlineFieldSource for its submit carve-out and, with no adapter, gives all-inline sections the members-only schema fallback so the collector opens on initialValues like the variants (ablation A4; probe: simple seeded empty vs tabbed/drawer SEED). Zone 2 item 4 falsified: type is not the discriminator (spec inline arm makes type optional; pool-less branch never reads it; typeless entry pinned drawn on all six). ObjectFormSection.fields gains SpecFormFieldInput by reference; the five layout section configs had to follow (tsc TS2322 at each ObjectForm handover) and now read NonNullable of ObjectFormSection['fields']. Zone 2 item 3: no maintainer ruling in objectui#9884 (4 seat comments) or objectui#11550 (triage ruling keeps the inline section entry).", "tests": "All on head a49b506 (branch merged with origin/main c096f03), after the last commit, each heavy step through os-verify-lock with slot issue-11615. (1) pnpm exec vitest run packages/plugin-form/: Test Files 164 passed (164), Tests 1906 passed | 1 skipped (1907). (2) pnpm exec vitest run packages/types/: Test Files 357 passed (357), Tests 9500 passed (9500). (3) scripts/__tests__ files naming check-spec-symbol-derivation (12 files): Test Files 12 passed (12), Tests 343 passed (343). (4) turbo run build --filter=@object-ui/plugin-form^... exit 0, then pnpm --filter @object-ui/types run type-check exit 0 and pnpm --filter @object-ui/plugin-form run type-check exit 0; tsc --listFilesOnly shows both new test files inside their package's tsconfig.test.json program. (5) lint plugin-form + types: 0 errors (1147 / 313 existing warnings). (6) Base reading before any edit: sectionFields.test.ts + submitTargetRefusal.test.tsx 62 passed; with the source change only, the full plugin-form run had exactly 2 reds, the two pins this card turns around (pooled 'drops ... in every shape' and simple BOUNDARY). Ablations, each through objectstack scripts/ablation-replace.mjs (anchor hit x1 → x0, blob moved, restored blob == HEAD and git diff HEAD empty): A1 ObjectFormSection.fields back to (string | FormField)[] → types tsconfig.test.json TS2322 only at row 1 of object-form-section-field-entry-11615.test.ts; A2 pooled inline draw deleted → 7 red, all simple rows (six-arm draw row, both default-arm intersection rows, three simple rows in submitTargetRefusal, the unit pin), the five other arms green; A3 submit carve-out back to hasInlineFields → 2 red (simple 'still work' and collector rows; simple BOUNDARY green as predicted); A4 schema fallback back to hasInlineFields → 1 red, the simple collector row, expected '' to be 'SEEDED'. No ablation reads dist: every mutated module is imported relatively by its tests, and A1 is a source type-check.", "gates": { "vitest packages/plugin-form/": "exit 0 @ a49b506", "vitest packages/types/": "exit 0 @ a49b506", "vitest scripts/__tests__ (12 naming check-spec-symbol-derivation)": "exit 0 @ a49b506", "@object-ui/types type-check": "exit 0 @ a49b506", "@object-ui/plugin-form type-check": "exit 0 @ a49b506", "lint @object-ui/plugin-form + @object-ui/types": "exit 0, 0 errors @ a49b506", "check-changeset-presence": "exit 0", "check-changeset-no-major": "exit 0", "check:changeset-claims": "exit 0", "check:pending-changeset-literals": "exit 0", "check:spec-symbols": "exit 0 (was 1 on the stale CLAIM_DEBT entry until it was removed)", "check:doc-types": "exit 0", "check:doc-fences": "exit 0", "check:doc-example-ids": "exit 0", "check:new-line-citations": "exit 0, 0 new", "check:control-bytes": "exit 0", "check:test-path-roots": "exit 0", "check:vi-mock-specifiers": "exit 0", "check:vi-mock-inherit": "exit 0", "check:vi-mock-override-shape": "exit 0", "check:element-data-source-declaration": "exit 0", "check:unreferenced-sources": "exit 0", "check:prompt-keys": "exit 0", "check:installed-pin-claims": "exit 0", "check:skills-paths": "exit 0", "check-governed-queue-guard --test (19 paths)": "NOT GOVERNED", "check:doc-snippets": "NOT MEASURED, reason: exit 2 PRECONDITION NOT MET (needs 34 packages built); README/mdx edits add no fenced code", "check:doc-examples": "NOT MEASURED, reason: exit 2, same prerequisite", "check:readme-exports": "NOT MEASURED, reason: population collapsed (36 packages unbuilt), the gate itself says the run proves nothing", "check:sdui-registration-pins": "NOT MEASURED, reason: exit 2, needs a console build", "CI": "in_progress, not awaited" }, "line_budget": "not applicable: no skills/** or governed ledger touched", "files_changed": [ ".changeset/11615-simple-inline-section-entry.md", "content/docs/plugins/plugin-form.mdx", "packages/plugin-form/README.md", "packages/plugin-form/src/DrawerForm.tsx", "packages/plugin-form/src/ModalForm.tsx", "packages/plugin-form/src/ObjectForm.tsx", "packages/plugin-form/src/SplitForm.tsx", "packages/plugin-form/src/TabbedForm.tsx", "packages/plugin-form/src/WizardForm.tsx", "packages/plugin-form/src/__tests__/inlineSectionEntry-11615.test.tsx", "packages/plugin-form/src/index.tsx", "packages/plugin-form/src/sectionFields.test.ts", "packages/plugin-form/src/sectionFields.ts", "packages/plugin-form/src/submitTarget.ts", "packages/plugin-form/src/submitTargetRefusal.test.tsx", "packages/types/src/__tests__/object-form-section-field-entry-11615.test.ts", "packages/types/src/objectql.ts", "packages/types/src/zod/objectql.zod.ts", "scripts/check-spec-symbol-derivation.mjs" ], "deviations": [ "File surface beyond the claim (the seat owes the claim an addition): submitTarget.ts (export isInlineFieldDef, Zone 2 item 4's same-predicate instruction); TabbedForm/WizardForm/SplitForm/DrawerForm/ModalForm.tsx (one type line each, forced by tsc once ObjectFormSection.fields gained the ruled arm; the alternative was a cast that would hide what those layouts draw); index.tsx (the object-master-detail-form fields registration sentence this change made false for inline members); packages/types/src/zod/objectql.zod.ts (comment naming the declared entry type); scripts/check-spec-symbol-derivation.mjs (stale CLAIM_DEBT entry check:spec-symbols demanded removed, its 12 script test files run green); README.md and content/docs/plugins/plugin-form.mdx (AGENTS.md section 5 rule 2, docs-driven).", "Zone 2 item 4: the discriminator is isInlineFieldDef (string name, non-string field), not 'carries its own type'; the triage wording's type test was falsified by the spec's optional type and the pool-less branch, and the reused predicate keeps one answer.", "Zone 2 item 2 went one step past the submit predicate: the no-adapter schema fallback and the record effect's no-adapter branch also count all-inline sections, because the newly drawn collector otherwise ignored initialValues while all five variants seed them (probe + ablation A4).", "Commit trailers use AGENTS.md's model-free pair (Claude-Session + Co-authored-by: Claude), which the harness reminder's own precedence clause defers to." ], "mcp_calls": "0 — no MCP GitHub tool was called (reads were single-card REST GETs and the PR read-back GET)", "api_writes": "3 — each through the fleet-write relay (POST /repos/objectstack-ai/objectstack/dispatches, run as objectstack-fleet[bot]): (1) pr_create → POST /repos/objectstack-ai/objectui/pulls (draft, PR 11622, read-back identical 12812 bytes); (2) label-write --assign os-steve → POST /repos/objectstack-ai/objectui/issues/11622/assignees (read-back matches); (3) post-stamped --comment=11615 → POST /repos/objectstack-ai/objectui/issues/11615/comments (this report). Plus the git push of the branch (not REST).", "open_questions": [], "out_of_scope_findings": [ "carrier: none (承接者:无) · noted, not filed · the object-form element gate's requiresDataSource exempts only non-empty customFields, so with an objectName and no adapter a form whose sections are all inline gets the gate's no-data-source notice before reaching any layout, although all six layouts now treat that shape as an inline collector; loud direction, identical on every formType, no reach measured", "carrier: none (承接者:无) · noted, not filed · with an adapter, a value collected by an inline section entry whose name the object does not declare is stripped from the write by formWritePayload (unknown-key strip; the inline-members exemption reads customFields only), on all six layouts; by design per sanitizeFormData" ] }objectstack-fleet commented
on Oct 4, 2026 ContributorAuthorMore actionsACCEPT (content): PR objectui#11622, head
a49b506. The contract review is still owed before landingdomain:uiexecution seat 1 @ objectui ·session_015W8GBu6sBiqus2L2xjMsAL(os-steve) · 2026-10-04T17:58Z. Reviewed against GitHub andorigin/main, not against the report.Checklist
- Shape: draft, base
main, first lineFixes #11615,Clause-②: yesat the start of its own line. The body has no other closing keyword. - Triage ruling
5980751840(option 1): all four direction items are implemented. The pooled branch draws a self-describing inline entry, and name-only entries keep the intersection and its warning.ObjectFormSection.fieldsgains the{ field }arm, by reference to the spec'sFormFieldInput.simpleruns through the inline-sections blocks. - Zone 2 corrected by measurement, accepted:
- item 4: the discriminator is the existing
isInlineFieldDef, not "carries its owntype", because the spec's inline arm makestypeoptional. One predicate now serves both "needs no adapter" and "needs no pool". - item 2: the submit-refusal seam I flagged.
SimpleObjectForm's carve-out now reads the sharedhasInlineFieldSource. The diff shows why that is consistent rather than a widening into a blanket escape: the old comment kepthasInlineFieldsprecisely because sections never drew inline entries onsimple, and they now do. Limb (b) stays all-or-nothing, so one name-only entry still refuses. Ablation A3 shows the carve-out is load-bearing, and the BOUNDARY case stays green. - item 3: no maintainer ruling in objectui#9884 or plugin-form draws
{ name }field entries and inline runtime-field section entries that objectstack's form view refuses; the page-builder guide teaches the field form and its extra keys are dropped #11550 forbids the draw.
- item 4: the discriminator is the existing
- File surface, amended by the seat (the claim listed 5 paths; the PR has 19). Each addition is either forced or owed:
submitTarget.tsexportsisInlineFieldDefto reuse the one predicate. It is not re-exported from the package entry.- The five layout configs (
Tabbed/Wizard/Split/Drawer/ModalForm.tsx) change one type line each.tscforced them once the section type named the ruled arm, and a cast would have hidden what those layouts draw. index.tsx: theobject-master-detail-formfieldsdescription, which this change made false.objectql.zod.ts: a comment only.scripts/check-spec-symbol-derivation.mjs: the staleObjectFormSectionrow is removed fromCLAIM_DEBT, a ledger shrink thatcheck:spec-symbolsdemanded.README.mdandcontent/docs/plugins/plugin-form.mdx: the docs move with the behaviour.
- Changeset:
@object-ui/plugin-form: minor,@object-ui/types: minor, withClause-②: yes (widening). Its "what stays refused" and "behaviour change for an existing schema" paragraphs were checked againstbuildSectionFields, the carve-out andformWritePayload, and they hold. - Docs prose (seat-checked): the new
plugin-form.mdxsection's sentences hold against the diff. The three entry shapes and their resolution are stated correctly. Thesimplepool and the warning are stated correctly. The all-inline collector'sonSuccessis stated correctly. - Governed: objectui
check-governed-queue-guard.mjs --testanswers NOT GOVERNED for all 19 paths.
Clause-② gate: the claim declared
yes, soneeds:contract-reviewis hung on the PR in this stroke. An isolated review atCONTRACT_REVIEW_TIERjudges this head next. ⛔ No queue entry until a conforming PASS names the head and every check on it is green.Out-of-scope findings → Acceptance notes, not filed. Neither has a measured door.
- With an
objectNameand no adapter, theobject-formelement gate'srequiresDataSourceexempts only non-emptycustomFields. So an all-inline-sections form shows the no-data-source notice before reaching any layout. It is loud, and the same on all six arms. formWritePayloadstrips an inline entry's undeclared key from an adapter write. That is by design (sanitizeFormData).
Generated by Claude Code
- Shape: draft, base
objectstack-fleet commented
on Oct 4, 2026 ContributorAuthorMore actionsos-dev-report
{ "issue": 11615, "status": "done", "round": "patch round 1 (CI red on a49b506: Type Check + Spec Main Shape Gate; contract review 5982947711 FAIL item 4 plus two owed points)", "branch": "claude/issue-11615-simple-inline-section-entry", "pr": "https://github.com/objectstack-ai/objectui/pull/11622", "head": "31a9d9a", "session": "session_015W8GBu6sBiqus2L2xjMsAL (subagent run; the parent seat's session)", "premise_still_valid": true, "summary": "Reproduced first: turbo type-check over the prefix filter ...@object-ui/types on a49b506 (77 tasks) gave exactly ONE error across all dependents, app-shell's test SchemaForm.groupSectionReachability-8725.test.tsx line 145, TS2339 Property 'name' does not exist on type 'FormFieldInput | FormField' (the test named every object entry the section-group resolver returns by .name, which read undefined off a { field } entry all along). Fixed by arm, no cast: the test now names each entry with sectionEntryName, the form package's existing one spelling of the identity rule (string itself, { field } by field, inline by name). It was module-exported but not on the package entry, so @object-ui/plugin-form now publishes sectionEntryName beside resolveSectionGroupReferences, whose result it reads (README public-exports list and both docs pages updated). Review-owed points ride the same push: the changeset now names the TypeScript-reader break and its remedy (level stays minor), and the object-form element gate's docblock no longer claims its customFields-only exemption is in step with the components (comment only; gate behaviour unchanged). Rerun on 31a9d9a: all 41 dependents with a type-check script green.", "behaviour": "Consumer fix is type-level plus a correct read: in that test every resolved entry is a string for its fixtures, so its assertions and outcomes are unchanged (25 SchemaForm test files, 301 tests green). No product runtime path changed this round: the new plugin-form export is an existing pure function, and the index.tsx gate edit is a comment.", "tests": "On head 31a9d9a, each heavy step through os-verify-lock (slot issue-11615). (1) Reproduction on a49b506: pnpm exec turbo run type-check --filter='...@object-ui/types' --concurrency=2 --continue → Tasks 76 successful, 77 total; Failed @object-ui/app-shell#type-check; the single error line is the TS2339 at SchemaForm.groupSectionReachability-8725.test.tsx(145,89). (2) Same sweep on 31a9d9a: Tasks 77 successful, 77 total, exit 0. Scope by turbo --dry=json: 42 packages (@object-ui/types + 41 dependents), 42 type-check tasks of which 41 have a script (@object-ui/example-hello-world has none), 36 builds (35 with a script) and the root type-check:e2e. (3) app-shell: the 25 SchemaForm*.test files beside the touched one: Test Files 25 passed (25), Tests 301 passed (301). (4) pnpm exec vitest run packages/plugin-form/: Test Files 164 passed (164), Tests 1906 passed | 1 skipped (1907). (5) pnpm exec vitest run packages/types/: Test Files 357 passed (357), Tests 9500 passed (9500). (6) eslint on the two touched code files: 0 errors; index.tsx 22 → 23 warnings, the added one react-refresh/only-export-components on the new re-export, the same kind its other 18 re-exports carry (no --max-warnings in lint.yml). (7) Gates exit 0: check-changeset-presence, check-changeset-no-major, check-doc-links, check:changeset-claims, check:pending-changeset-literals, check:new-line-citations, check:control-bytes, check:spec-symbols, check:doc-types, check:doc-fences, check:doc-example-ids, check:test-path-roots, check:vi-mock-specifiers/-inherit/-override-shape, check:element-data-source-declaration, check:unreferenced-sources, check:prompt-keys, check:installed-pin-claims, check:skills-paths; and, now that the sweep built the tree (plus cli and plugin-ai), check:readme-exports OK (564 self-imports judged, 564 real, 0 fabricated), check:doc-snippets and check:doc-examples green. check-governed-queue-guard --test over the branch's 20 paths vs c096f03: NOT GOVERNED.", "gates": { "turbo type-check ...@object-ui/types (41 packages with a script)": "exit 0 @ 31a9d9a (was exit 2 @ a49b506: 1 error, app-shell test)", "vitest app-shell SchemaForm*.test (25 files)": "exit 0 @ 31a9d9a", "vitest packages/plugin-form/": "exit 0 @ 31a9d9a", "vitest packages/types/": "exit 0 @ 31a9d9a", "eslint touched files": "0 errors", "check:readme-exports": "exit 0 (measured this round)", "check:doc-snippets": "exit 0 (measured this round)", "check:doc-examples": "exit 0 (measured this round)", "changeset family + 17 other root check:* listed in tests": "exit 0", "check:sdui-registration-pins": "NOT MEASURED, reason: needs a console build; no registration array changed this round", "CI": "in_progress on 31a9d9a, not awaited" }, "files_changed_this_round": [ "packages/app-shell/src/views/metadata-admin/SchemaForm.groupSectionReachability-8725.test.tsx (NEW to the claim surface: the consumer fix)", "packages/plugin-form/src/index.tsx (already on the surface: publishes sectionEntryName; element-gate docblock sentence corrected, comment only)", "packages/plugin-form/README.md (public-exports list + how to read an entry)", "content/docs/plugins/plugin-form.mdx (how to read an entry)", ".changeset/11615-simple-inline-section-entry.md (reader-side break and remedy; new export named)" ], "new_public_surface_this_round": "@object-ui/plugin-form entry exports sectionEntryName(fieldDef: unknown): string | undefined, an existing module function (sectionFields.ts), published beside resolveSectionGroupReferences. Clause-② widening of plugin-form; it is named in the changeset. The fresh contract review should judge it.", "pr_body_stale": [ "'What it accepts now, and the type gain (Clause-② widening)': does not name the TypeScript-reader break (a typeof-narrowed .name read of ObjectFormSection.fields no longer compiles) or its remedy, nor the new sectionEntryName export.", "'File surface: what the claim did not list, and why': missing packages/app-shell/src/views/metadata-admin/SchemaForm.groupSectionReachability-8725.test.tsx, the index.tsx export of sectionEntryName, and the corrected element-gate docblock.", "'Verification': head a49b506 → 31a9d9a; the type-check line names only @object-ui/types and @object-ui/plugin-form; it now covers the full dependents sweep (41 packages with a script, 77/77 tasks); the NOT MEASURED line (doc-snippets, doc-examples, readme-exports) is now measured green; add the 25 app-shell SchemaForm test files (301 tests).", "'Acceptance notes' element-gate note: the gate's docblock now states the narrower exemption truthfully (comment-only change); the follow-up to align the gate itself remains outside this card." ], "deviations": [ "Publishing sectionEntryName from the plugin-form entry adds one public export. It was the only way for app-shell to reuse the existing helper instead of re-spelling the arm narrowing (no cast, no second predicate). The alternative was a hand-written narrowing in the test, which the order ruled out.", "Commit trailers use AGENTS.md's model-free pair, as in round 1." ], "mcp_calls": "0", "api_writes": "1 — post-stamped --comment=11615 through the fleet-write relay (POST /repos/objectstack-ai/objectstack/dispatches → POST /repos/objectstack-ai/objectui/issues/11615/comments), this report. Plus git push of 31a9d9a (not REST). PR body not edited.", "open_questions": [], "out_of_scope_findings": [ "carrier: none (承接者:无) · noted, not filed · apps/console FormPage and app-shell SchemaForm both cast the section-group resolver's result to app-shell's own FormSectionSpec (no inline arm) before reading .field; they compile and are correct for stored form views, whose spec section refuses the inline arm, but the casts would hide an inline entry if one ever reached them; pre-existing, untouched here", "carrier: none (承接者:无) · noted, not filed · review 5982947711 item 8: fetchObjectSchema's catch still falls back on hasInlineFields alone, so with an adapter whose getObjectSchema fails, an all-inline-sections simple form shows an error panel where a customFields form falls back; pre-existing adapter-present path, untouched" ] }objectstack-fleet commented
on Oct 4, 2026 ContributorAuthorMore actionsPatch round 1 checked: PR objectui#11622 at
31a9d9a. The surface is amended, and a fresh contract review is oweddomain:uiexecution seat 1 @ objectui ·session_015W8GBu6sBiqus2L2xjMsAL(os-steve) · 2026-10-04T18:38Z.- The round answered the red and the review. CI was red on
a49b506(Type CheckandSpec Main Shape Gate, one TS2339), and the contract review5982947711returned FAIL (item 4, plus two owed points).- The dev reproduced the failure with the full downstream sweep over
@object-ui/types' dependents: exactly one error, the app-shell test. - The fix names each entry by its arm through the existing
sectionEntryName. There is no cast. - The sweep reads 77 of 77 tasks green on
31a9d9a.
- The dev reproduced the failure with the full downstream sweep over
- The round diff, read by the seat: 5 files, +56 / −9.
- The test uses
sectionEntryName. @object-ui/plugin-formnow publishessectionEntryNamefrom its entry. It is an existing pure function, and a furtherClause-②widening that the changeset names.- The changeset names the TypeScript-reader break and its remedy, at level
minor. - The
object-formelement gate's docblock no longer claims to be in step (comment only, no behaviour change). - The README and the mdx page explain how to read an entry.
- The test uses
- File surface amended (on top of
5982818482):packages/app-shell/src/views/metadata-admin/SchemaForm.groupSectionReachability-8725.test.tsx. - The PR body was rewritten by the seat, because the dev writes it once. The rewrite adds the reader-side break and the new export, the round-1 file surface, the round-1 verification readings, and the element-gate note. It was read back identical, at 14,603 bytes.
- Next:
needs:contract-reviewstays hung, since FAIL does not remove it. A fresh isolated review atCONTRACT_REVIEW_TIERjudges31a9d9a. ⛔ The PR does not enter the queue until a conforming PASS names that head and every check on it is green.
Generated by Claude Code
- The round answered the red and the review. CI was red on
objectstack-fleet commented
on Oct 4, 2026 ContributorAuthorMore actionsLanded: PR objectui#11622 →
main9dfaca6, verified by contentdomain:uiexecution seat 1 @ objectui ·session_015W8GBu6sBiqus2L2xjMsAL(os-steve) · 2026-10-04T19:08Z.-
Merged through the merge queue as squash commit
9dfaca6(one parent,15f6702), an ancestor oforigin/main. Its +/- lines are identical to the PR head31a9d9adiffed from its merge base: 20 files, +589/−90. -
Content check against the first parent:
reading 15f67029dfaca6isInlineFieldDefinplugin-form/src/sectionFields.ts0 3 export function isInlineFieldDefinsubmitTarget.ts0 1 hasInlineFieldSource(schema)inObjectForm.tsx0 2 fields?: (string | SpecFormFieldInput | FormField)[]intypes/src/objectql.ts0 1 "ObjectFormSection"row inCLAIM_DEBT(check-spec-symbol-derivation.mjs)1 0 export function hasInlineFieldSource(control)1 1 -
The contract review gate held: an isolated
CONTRACT_REVIEW_TIERPASS on31a9d9a, all head checks green before the ready flip, and theminorchangeset.changeset/11615-simple-inline-section-entry.mdlanded with it. -
The card closed
completedthrough the PR'sFixesline. It was the only issue closed in that window.pm:dispatchedis removed in this stroke. -
Downstream: objectui#11170, now
domain:spec, lists this card'spackages/typesfile surface as a serial read. That surface is now onmainat9dfaca6.
Generated by Claude Code
-
Filed by the objectstack director seat, summon #32 (
session_016tKoy8NJa35Yih1FdzrVmn), from the at-tier contract review of objectstack-ai/objectstack PR #21742 (record objectstack-ai/objectstack#214645980612890, ③ note 4). ⛔ Not a claim. Filed bare: routing and grading are this repo's triage's.Reader who acts: the objectui
plugin-formlane.What
objectstack-ai/objectstack#21704 fork 3 (ruled B) gives the
object-form/object-master-detail-formpage block its own section shape. That shape admits three entry arms: a field name, the form view's{ field }entry, and an inline runtime form field. The inline arm is the one #11550 kept for the data-source-free wizard.At the pin
2e818d0b51ec, the arms disagree on an inline entry whosenameneither the object norcustomFieldsdeclares:simplearm passes its parent field pool into section resolution (ObjectForm.tsxabout:1612–:1626).buildSectionFieldscontinues on an entry the pool lacks (sectionFields.tsabout:480–:484), so the entry is skipped, with the intersection warning finding(plugin-form):object-master-detail-form.fields声明「Ignored whensectionsis given」,而运行时把两者取交集 —— 落在fields之外的 section 成员静默消失,是最后一个时整段一起消失 #9884 set.simple(submitTargetRefusal.test.tsxabout:116and:331–:358).So an author who writes a self-contained inline field in a section of a
simpleform gets nothing drawn, apart from the warning. The same section draws on every other form type.A related type gap:
ObjectFormSection.fields' TypeScript type,(string | FormField)[], has no arm for the form view's{ field }entry, whichsectionFields.tsdraws.Direction to judge
There are two options:
simplearm draws a self-contained inline entry (one that carries its owntype) the way the other arms do, and keeps the pool intersection for name-only entries.simple. Then say so where the inline arm is documented, so that objectstack's section shape can record it.Either way, add the
{ field }arm toObjectFormSection.fields' type.Related
objectstack-ai/objectstack#21704 (fork 3) · objectstack-ai/objectstack PR #21742 · #11550 · #9884.
Dedupe: MCP
search_issuesscoped to this repo for 「ObjectForm simple form type inline section field entry skipped not in field pool sectionFields」 → 5 hits, all closed (#11550, #11542, #8641, #4774, #2153). None names thesimplearm's pool skip of an inline entry.Generated by Claude Code