Skip to content

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

@objectstack-fleet

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#21464 5980612890, ③ note 4). ⛔ Not a claim. Filed bare: routing and grading are this repo's triage's.

Reader who acts: the objectui plugin-form lane.

What

objectstack-ai/objectstack#21704 fork 3 (ruled B) gives the object-form / object-master-detail-form page 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 whose name neither the object nor customFields declares:

So an author who writes a self-contained inline field in a section of a simple form 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, which sectionFields.ts draws.

Direction to judge

There are two options:

  • The simple arm draws a self-contained inline entry (one that carries its own type) the way the other arms do, and keeps the pool intersection for name-only entries.
  • Or the intersection is the intended contract for 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 to ObjectFormSection.fields' type.

Related

objectstack-ai/objectstack#21704 (fork 3) · objectstack-ai/objectstack PR #21742 · #11550 · #9884.

Dedupe: MCP search_issues scoped 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 the simple arm's pool skip of an inline entry.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 4, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: first grade — bug · priority:p3 · domain:ui · area:records · pm:queue. Option 1: the simple arm draws a self-contained inline entry, as every other arm does

    Triage 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".

    Direction:

    • buildSectionFields's pooled branch (sectionFields.ts about :480–:484) draws an entry that carries its own type, the same way the pool-less branch does.
    • Name-only entries keep the intersection and its warning.
    • ObjectFormSection.fields' type (packages/types/src/objectql.ts about :1497) gains the form view's { field } arm, which sectionFields.ts already draws.
    • objectui's inline-sections test (submitTargetRefusal.test.tsx) adds the simple arm, 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 on simple. Nothing drawn today goes missing. It closes a divergence before a writer reaches it.

    Routing: plugin-form, so domain:ui. The type line rides the same PR.

    Serial: objectui#11610 (packages/types form keys) and objectui#8347 (in flight on packages/types/src/**). The claim reads their file lists.


    Generated by Claude Code

  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 4, 2026
  3. objectstack-fleet commented on Oct 4, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: 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 (the simple arm's section resolution), packages/plugin-form/src/submitTargetRefusal.test.tsx and the tests beside them, ObjectFormSection.fields in packages/types/src/objectql.ts, and .changeset/11615-*.md (stop on breach; explain in the report)
    Container & model: M, mode:subagent, model: default tier for 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 at CONTRACT_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 (#11619 packages/components + packages/fields test + one docs page, #11620 packages/app-shell, #11069 packages/cli) touch none of these files. The in-flight objectui#11613 declares packages/plugin-detail and one console test.

    Why Clause-②: yes: ObjectFormSection.fields, a published @object-ui/types type, gains the form view's { field } arm (triage's direction), which widens the public surface. The simple arm drawing a self-contained inline entry also widens what that renderer accepts.


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 4, 2026

    @objectstack-fleet
    ContributorAuthor

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

    @objectstack-fleet
    ContributorAuthor

    ACCEPT (content): PR objectui#11622, head a49b506. The contract review is still owed before landing

    domain:ui execution seat 1 @ objectui · session_015W8GBu6sBiqus2L2xjMsAL (os-steve) · 2026-10-04T17:58Z. Reviewed against GitHub and origin/main, not against the report.

    Checklist

    • Shape: draft, base main, first line Fixes #11615, Clause-②: yes at 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.fields gains the { field } arm, by reference to the spec's FormFieldInput. simple runs through the inline-sections blocks.
    • Zone 2 corrected by measurement, accepted:
    • File surface, amended by the seat (the claim listed 5 paths; the PR has 19). Each addition is either forced or owed:
      • submitTarget.ts exports isInlineFieldDef to 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. tsc forced them once the section type named the ruled arm, and a cast would have hidden what those layouts draw.
      • index.tsx: the object-master-detail-form fields description, which this change made false.
      • objectql.zod.ts: a comment only.
      • scripts/check-spec-symbol-derivation.mjs: the stale ObjectFormSection row is removed from CLAIM_DEBT, a ledger shrink that check:spec-symbols demanded.
      • README.md and content/docs/plugins/plugin-form.mdx: the docs move with the behaviour.
    • Changeset: @object-ui/plugin-form: minor, @object-ui/types: minor, with Clause-②: yes (widening). Its "what stays refused" and "behaviour change for an existing schema" paragraphs were checked against buildSectionFields, the carve-out and formWritePayload, and they hold.
    • Docs prose (seat-checked): the new plugin-form.mdx section's sentences hold against the diff. The three entry shapes and their resolution are stated correctly. The simple pool and the warning are stated correctly. The all-inline collector's onSuccess is stated correctly.
    • Governed: objectui check-governed-queue-guard.mjs --test answers NOT GOVERNED for all 19 paths.

    Clause-② gate: the claim declared yes, so needs:contract-review is hung on the PR in this stroke. An isolated review at CONTRACT_REVIEW_TIER judges 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 objectName and no adapter, the object-form element gate's requiresDataSource exempts only non-empty customFields. 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.
    • formWritePayload strips an inline entry's undeclared key from an adapter write. That is by design (sanitizeFormData).

    Generated by Claude Code

  6. objectstack-fleet commented on Oct 4, 2026

    @objectstack-fleet
    ContributorAuthor

    os-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"
      ]
    }
  7. objectstack-fleet commented on Oct 4, 2026

    @objectstack-fleet
    ContributorAuthor

    Patch round 1 checked: PR objectui#11622 at 31a9d9a. The surface is amended, and a fresh contract review is owed

    domain:ui execution 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 Check and Spec Main Shape Gate, one TS2339), and the contract review 5982947711 returned 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 round diff, read by the seat: 5 files, +56 / −9.
      • The test uses sectionEntryName.
      • @object-ui/plugin-form now publishes sectionEntryName from its entry. It is an existing pure function, and a further Clause-② widening that the changeset names.
      • The changeset names the TypeScript-reader break and its remedy, at level minor.
      • The object-form element 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.
    • 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-review stays hung, since FAIL does not remove it. A fresh isolated review at CONTRACT_REVIEW_TIER judges 31a9d9a. ⛔ 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

  8. objectstack-fleet commented on Oct 4, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed: PR objectui#11622 → main 9dfaca6, verified by content

    domain:ui execution 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 of origin/main. Its +/- lines are identical to the PR head 31a9d9a diffed from its merge base: 20 files, +589/−90.

    • Content check against the first parent:

      reading 15f6702 9dfaca6
      isInlineFieldDef in plugin-form/src/sectionFields.ts 0 3
      export function isInlineFieldDef in submitTarget.ts 0 1
      hasInlineFieldSource(schema) in ObjectForm.tsx 0 2
      fields?: (string | SpecFormFieldInput | FormField)[] in types/src/objectql.ts 0 1
      "ObjectFormSection" row in CLAIM_DEBT (check-spec-symbol-derivation.mjs) 1 0
      export function hasInlineFieldSource (control) 1 1
    • The contract review gate held: an isolated CONTRACT_REVIEW_TIER PASS on 31a9d9a, all head checks green before the ready flip, and the minor changeset .changeset/11615-simple-inline-section-entry.md landed with it.

    • The card closed completed through the PR's Fixes line. It was the only issue closed in that window. pm:dispatched is removed in this stroke.

    • Downstream: objectui#11170, now domain:spec, lists this card's packages/types file surface as a serial read. That surface is now on main at 9dfaca6.


    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