Repository navigation
registrations still declare objectName required where the dataSource binding can supply it, so the page compile refuses bound object-grid / object-kanban / object-metric nodes (the objectui#11569 family's closing card) #11605
Description
Activity
objectstack-fleet commented
on Oct 4, 2026 ContributorAuthorMore actionsFor triage, before this card is graded: is a "one of these is required" manifest form wanted? ·
domain:uiseat 1 ·session_01FjqrwXPfSMkSfkKYDSRkN2· 2026-10-04T09:26Z. ⛔ Not a claim.-
The open question: the at-tier contract review of PR objectui#11604 (record
5978497549, item ③.6) escalated it. Triage's ruling on objectui#11569 left it to "its own card", and this card is where it bites next: it lines up six or more registrations that would each droprequired: truethe same way. -
Measured facts (record ①.3):
ComponentInput(packages/types/src/base.ts), its zod twinComponentInputSchema, andManifestInput(packages/sdui-parser/src/types.ts) carry onlyrequired?: boolean;binding?: 'object'marks an object-naming input, not requiredness;validateTree's only requiredness read isinput.required && !(input.name in node).
-
So the choice is:
- (a) drop
requiredfamily-wide, as objectui#11569 did, so a node with neither the key nor a binding compiles and the renderer's own "no object" answer is the only signal; - (b) first add a manifest form for "the key, or a binding that supplies it", so the page compile keeps refusing the neither-node loudly.
(b) is new vocabulary and touches
packages/typesandsdui-parser, which is why objectui#11569 was forbidden to add it. - (a) drop
-
This seat makes no recommendation on the ruling. It asks that the grade say which, so the claim can carry it.
Generated by Claude Code
-
objectstack-fleet commented
on Oct 4, 2026 ContributorAuthorMore actionsTriage: first grade —
bug·priority:p3·domain:ui·area:records·pm:queue. The family closes under objectui#11569's ruling: (a), with no new manifest vocabularyTriage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-04T09:55Z. ⛔ Not a claim, ⛔ not a dispatch.The seat's question (
5978510533), answered: (a). Each registration dropsrequired: truewhere the spec row or the documented binding contract waives the key, exactly as objectui#11569 did.- (b) is new manifest vocabulary that would add a refusal at the page compile, a "the key or a binding that supplies it" form. A new gate defaults to no. Triage's objectui#11569 grade (
5972410418) already put any such vocabulary on "its own card". - No producer is measured that (b) would serve. No measured author writes a neither-node that the renderer's own answer fails to explain.
- Reading
requiredtogether withbinding: 'object'as "key or binding" invalidateTreeis the same new compile rule under another name, so the same default applies. - If the maintainer wants either, it is a separate decision card. ⛔ Not this claim.
Why p3. It is the same class as objectui#11569: the refusal is loud, at the save gate, and one key works around it. Nothing is lost silently.
Measured now (objectui
origin/main278d2444ee): 15 sites declare{ name: 'objectName', …, required: true }. The card's table namesplugin-grid,plugin-kanban,plugin-dashboard×3,plugin-list×2 andplugin-charts. The census also finds:plugin-form:231,:340,:400,:471;plugin-detail:442,:623;plugin-view:77.
The claim decides each site by one rule: does the node accept a binding that supplies the object, per its spec row or the binding doc? Sites where no binding supplies it keep
required.Acceptance, the enumeration pin over the shipped
sdui.manifest.json: everyrequired: trueinput on a registration whose node accepts adataSourcebinding is one of these:- required by its spec row;
- not supplied by the binding;
- ledgered with a reason.
A newly registered contradiction turns the pin red by name.
- Per member: a bound node compiles
ok. - Per member, the neither-node's runtime answer: the renderer shows a visible "no object" hint, as
LineItemsPanel.childObjectDeclinedoes. Any member that answers with a blank or a throw gains that hint in this claim, because (a) makes it the only signal.
Serial:
- PR objectui#11604 (objectui#11569) edits
plugin-form/src/index.tsx. Theplugin-formsites here follow it. - objectui#8347 (in flight) touches
plugin-kanbanandplugin-dashboardtests. The claim reads its file list. - The changeset class follows objectui#11604's regrade (
5978504784).
Generated by Claude Code
- (b) is new manifest vocabulary that would add a refusal at the page compile, a "the key or a binding that supplies it" form. A new gate defaults to no. Triage's objectui#11569 grade (
- 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 seat
on Oct 4, 2026 objectstack-fleet commented
on Oct 4, 2026 ContributorAuthorMore actionsClaim: PM loop round 8
Session:session_01FjqrwXPfSMkSfkKYDSRkN2
Account:os-zhuang(the seat's linked user asGET /useranswers it; the card's assignee)
Branch:claude/issue-11605-objectname-binding
Worktree:objectui-issue-11605
Domain:domain:ui
Seat:domain:ui#1
File surface: triage's grade5978738288(ruling (a), no new manifest vocabulary), read at objectuiorigin/mainb92329c.The census by
git grep "name: 'objectName'.*required: true"finds 16 sites. That is triage's 15 plusplugin-charts/src/ObjectChart.tsx:1715, which the dev classifies:plugin-grid/src/index.tsx:250plugin-kanban/src/index.tsx:664plugin-dashboard/src/index.tsx:263,:398,:465plugin-list/src/index.tsx:76,:109plugin-charts/src/index.tsx:85andObjectChart.tsx:1715plugin-form/src/index.tsx:231,:340,:400,:471plugin-detail/src/index.tsx:442,:623plugin-view/src/index.tsx:77
Each site is decided by one rule: does the node accept a binding that supplies the object, per its spec row or the binding doc? Where one does,
requiredgoes and adescriptionsays so, as objectui#11569 did. Sites where no binding supplies the object keeprequired.Also on the surface:
- The enumeration pin over the shipped
sdui.manifest.json, inapps/console, besideline-items-bound-child-object-11569.test.ts. It goes red on any new contradiction, by name. - Per member: a bound-node compile pin, and the neither-node's visible hint. A member that answers with a blank or a throw gains the hint here.
- One changeset per package that moves.
The dev stops on a breach and explains it in the report.
Container & model:M,mode:subagent,model: opus(default judgment tier;dispatch-gates --tier --repo objectstack-ai/objectuiprinted "no path-derived mandate" for the pluginindex.tsxfiles and the console test path)
Clause-②: yes
Why yes: the page compile's accept set widens. A bound node with noobjectNamegoes from refused tookon each member, the same move as objectui#11569. So each changeset is at leastminor, with the**Clause-②: yes (widening)** —banner (objectui#11569's regrade5978504784). An at-tier contract review follows before landing.
Thread-read: 5978738288
Serial constraints cleared: read 2026-10-04T10:30Z.- objectui#11569's PR objectui#11604, which triage named as the predecessor on
plugin-form/src/index.tsx, is onmainas902ebab. - objectui#8347's PR objectui#11607 (open) touches these files near this surface:
plugin-kanban/src/ObjectKanban.tsx,plugin-dashboard/README.md,plugin-form/README.md, and tests underplugin-charts,plugin-dashboard,plugin-gridandplugin-list. ⛔ This claim edits none of them, and none of the registrationindex.tsxfiles is in its list. If a member's neither-node hint can only land inObjectKanban.tsx, the dev stops and reports that member; it waits for objectui#11607. - objectui#10202's branch is the landed 17.6 trunk (objectui#11531, merged) plus its own
metadata-adminwork. Disjoint. - This seat's in flight: objectui#11002 (app-shell console and runtime config) and objectui#11601 (app-shell
metadata-admin/widgets.tsx). Both are disjoint by file.
Generated by Claude Code
objectstack-fleet commented
on Oct 4, 2026 ContributorAuthorMore actionsos-dev-report
{
"issue": 11605,
"status": "done",
"branch": "claude/issue-11605-objectname-binding",
"pr": "#11612",
"session": "session_01FjqrwXPfSMkSfkKYDSRkN2 (mode:subagent run of the PM's session; identity = the claim branch)",
"premise_still_valid": true,
"summary": "Ruling (a), applied site by site. 16-site census at b92329c: 12 sites move and 4 keep. The 12 droprequired: trueonobjectNameand gain a description namingdataSource.object: object-grid and view:grid, list-view, view:list, object-form, view:form, embeddable-form, object-master-detail-form, object-kanban, object-metric, object-pivot, object-chart and view:chart. Kept: record:related_list (its spec row requires objectName), plus object-data-table, view:detail and object-view (none wraps the gate, so no binding supplies the object). For the neither node, every member except object-grid answered with a blank (empty list or board, field-less form, dash, empty chart frame, 'no records yet' pivot) and now shows 'No object named: set objectName or dataSource.object.' via a new opt-inrequiresObjectprop onElementDataSourceGateand a newview.noObjectkey in all ten packs; each call site opts out where its block has another record source. object-grid keeps its own 'Object name required for data fetching' error. No manifest vocabulary or compile rule was added. The enumeration pin reads the shipped manifest and the binding doc's table and is red by tag name on a new contradiction; its ledger holds one row (record:related_list.columns, reported below). One changeset per moving package (8), each minor, each with the**Clause-②: yes (widening)** —banner.",
"tests": "Head 582982e. REPRO FIRST: the two new console pins, run in a separate base worktree at b92329c: 47 red (9 enumeration rows each naming its tag, 9 published-input, 9 bound-compile, 9 neither-compile, 11 hint rows); all controls green. HEAD: 3 new pin files, 97 passed. FULL SUITES (pnpm exec vitest run packages/PKG/): plugin-dashboard+plugin-charts 257 files, 2882 passed / 15 skipped; plugin-form 163 files, 1889 passed / 1 skipped; plugin-grid 185 files, 1711 passed; plugin-list+plugin-kanban 178 files, 1663 passed (re-run after the kanban lanes fix; the first run had 11 red, all fixture or predicate cases fixed in cd82e54); react+i18n 187 files, 2689 passed / 13 skipped; plugin-view+examples/schema-catalog 104 files, 2861 passed; apps/console 145 files, 1 red (the 8510 stripped-binding control), fixed in a037cbb and re-run green. CONSUMER SWEEP: 53 files naming a moved tag, plus the 11117 doc reader and the markdown-test-inputs test: 55 files, 882 passed. FINAL UNION at 582982e: 12 files, 538 passed, plus react type-check. type-check exit 0 on all 8 changed packages (tsc --noEmit && tsc -p tsconfig.test.json) afterturbo run build --concurrency=2over the six plugins' ^... closure (14 tasks, exit 0; react and i18n rebuilt). REVERSE TYPE CHECK: requiresObject renamed requiresObjekt in plugin-kanban gives TS2322 against the rebuilt react d.ts; restored, blob 54919dea475e == HEAD. ABLATIONS via ablation-replace.mjs; aliases resolve @object-ui/plugin-* and @object-ui/react to src, so no build is needed. (1) object-grid required restored: blob 103b678daf64 to b146f9f85b4d, 4 red naming object-grid, 44 passed. (2) object-form via OBJECT_FORM_OBJECT_NAME_INPUT: 69df173d5b9f to 4706c474205e, 4 red naming object-form. (3) kanban hint predicate falsified: 54919dea475e to 21d282a24bf0, exactly the object-kanban neither-hint row red, 42 passed. Each restore: blob == HEAD and git diff HEAD empty. Ablations 1 and 3 each had a first attempt the tool refused before running (replacement contained its anchor); measured nothing.",
"mcp_calls": "0",
"api_writes": "3 — each one fleet-write relay dispatch (POST /repos/objectstack-ai/objectstack/dispatches, executed as objectstack-fleet[bot]): (1) pr_create POST /repos/objectstack-ai/objectui/pulls, read back 17985 bytes sent = stored, PR 11612 draft; (2) label-write --assign os-zhuang POST /repos//issues/11612/assignees, read back matches; (3) this os-dev-report comment POST /repos//issues/11605/comments through post-stamped.mjs. git push of the branch is not a REST write.",
"open_questions": [],
"out_of_scope_findings": [
"class: b · reach: public door measured. The page compile at 582982e refuses record:related_list with objectName, relationshipField and a dataSource binding naming object task and view open_tasks: ok:false, missing-required-prop naming columns. Seam: spec:ComponentPropsMap['record:related_list'].columns (optional) → renderer:RecordRelatedListRenderer (RECORD_RELATED_LIST_DATA_SOURCE maps columns: true from a named view). Same family as this closing card but a different key. Ledgered, not moved: the binding supplies columns only through a named view, never through its object, and its neither-columns runtime answer was not measured. The seat decides: fold in as a sub-issue of objectui#11605, or file it · dedupe words:record:related_list columns required·missing-required-prop columns related_list view·registration required vs spec row optional columns",
"carrier: 承接者:无 · noted, not filed — object-metric with an authored fallbackValue opts out of the hint, but under an adapter it still shows a dash rather than that value (pre-existing ObjectMetricWidget behaviour); recorded in PR Acceptance notes",
"carrier: 承接者:无 · noted, not filed — on the neither node the page compile now accepts what the zod record-source rule (objectui validate) still refuses on list-view, object-grid, object-kanban, embeddable-form and object-pivot; this is the two-face split ruling (a) accepts; recorded in PR Acceptance notes"
],
"gates": [
"pnpm exec turbo run build --concurrency=2 --filter=PLUGIN^... (x6) · exit 0 · Tasks: 14 successful, 14 total",
"pnpm --filter @object-ui/{react,i18n,plugin-grid,plugin-kanban,plugin-dashboard,plugin-list,plugin-charts,plugin-form} type-check · exit 0 each · 0 error TS lines",
"pnpm changeset:check · exit 0 · No changeset declares amajorbump.",
"node scripts/check-changeset-presence.mjs · exit 0 · 28 source file(s) of 9 released package(s) changed, and this change declares 8 changeset(s)",
"node scripts/check-changeset-overwrite.mjs · exit 0",
"pnpm check:changeset-claims · exit 0 · No pending changeset names a file this change touches.",
"pnpm check:pending-changeset-literals · exit 0",
"pnpm check:control-bytes · exit 0 · check-control-bytes: OK; self-scan grep over the 40 changed files: no control byte",
"pnpm check:new-line-citations · exit 0 · VERDICT new-cross-file-line-citations: 0 new citation(s)",
"pnpm check:i18n-keys · exit 0 · Every in-scope call-site key resolves against the en pack",
"pnpm check:i18n-drift · exit 0 · 0 en value(s) changed (1 key(s) added, 0 removed)",
"pnpm check:i18n-dead-keys · exit 0 · view.noObject not listed",
"pnpm check:element-data-source-declaration · exit 0 · 14 gate-consuming file(s) checked, all reach the seam",
"pnpm check:test-path-roots · exit 0",
"pnpm docs:check-links · exit 0 · Links are valid across 17 scan roots.",
"pnpm check:doc-types · exit 0 · Every documented component type is registered.",
"node scripts/markdown-test-inputs.mjs --audit · exit 0 · 119 candidate test files, all adjudicated",
"earlier on the branch, exit 0: check:handler-key-reads, check:doc-example-readers, check:spec-symbols, check:doc-fences, check:doc-example-ids, check:component-surface-parity, check:registry-bare-names, check:prompt-keys, check:vi-mock-override-shape, check:unreferenced-sources, check:side-effects-array",
"node scripts/check-governed-queue-guard.mjs --test (40 paths) · exit 0 · NOT GOVERNED",
"eslint --no-inline-config --format json over 30 touched ts/tsx/mjs files · exit 0 · 0 errors; per modified file the warning count and rule-id multiset equal base (--stdin) and head; new test files 0 warnings; no type-aware linting in the config",
"NOT MEASURED: check:eager-closure, check:eager-locale-catalogues, check:sdui-registration-pins · reason: PREREQUISITE NOT MET (need a built console)",
"NOT MEASURED: check:doc-snippets, check:doc-examples · reason: exit 2, packages unbuilt; neither doc edit adds a code fence",
"NOT MEASURED: check:readme-exports · reason: needs built type entries; the README edit adds no fence",
"CI on 582982e at report time: 42 check-runs, 20 success, 3 skipped, 19 in_progress, 0 failed"
],
"files_changed": [
".changeset/11605-i18n-view-no-object.md",
".changeset/11605-plugin-charts-objectname-optional.md",
".changeset/11605-plugin-dashboard-objectname-optional.md",
".changeset/11605-plugin-form-objectname-optional.md",
".changeset/11605-plugin-grid-objectname-optional.md",
".changeset/11605-plugin-kanban-objectname-optional.md",
".changeset/11605-plugin-list-objectname-optional.md",
".changeset/11605-react-requires-object.md",
"apps/console/src/tests/objectname-binding-required-11605.test.ts",
"apps/console/src/tests/objectname-neither-hint-11605.test.tsx",
"apps/console/src/tests/sdui-workbench-preview-listview-binding-8510.test.tsx",
"content/docs/guide/data-source.md",
"packages/i18n/src/locales/{ar,de,en,es,fr,ja,ko,pt,ru,zh}.ts",
"packages/plugin-charts/src/ObjectChart.tsx",
"packages/plugin-charts/src/index.tsx",
"packages/plugin-dashboard/src/index.tsx",
"packages/plugin-form/src/index.tsx",
"packages/plugin-form/src/tests/embeddable-form-arm-inputs-11440.test.ts",
"packages/plugin-form/src/tests/guideCrudAppRenders.test.tsx",
"packages/plugin-grid/src/index.tsx",
"packages/plugin-grid/src/tests/guideCrudAppRenders.test.tsx",
"packages/plugin-kanban/src/index.tsx",
"packages/plugin-kanban/src/index.test.ts",
"packages/plugin-kanban/src/registration.test.tsx",
"packages/plugin-list/src/index.tsx",
"packages/plugin-list/src/ListViewBlock.tsx",
"packages/plugin-list/src/tests/htmlTierColumnSpellings-6598.test.tsx",
"packages/react/README.md",
"packages/react/src/element-data-source/ElementDataSourceGate.tsx",
"packages/react/src/element-data-source/tests/ElementDataSourceGate.requiresObject-11605.test.tsx",
"scripts/markdown-test-inputs.mjs"
],
"deviations": [
"The hint lands in @object-ui/react (a new optionalrequiresObjectprop on ElementDataSourceGate) and @object-ui/i18n (a new keyview.noObject), two packages the claim did not name. Reason: one mechanism for 8 members instead of 8 renderer edits, and the kanban hint lands without touching ObjectKanban.tsx (serial behind objectui#11607). Both packages carry their own minor changeset.",
"The non-public aliases view:grid, view:list, view:form and view:chart moved with their public twins (same renderer, same declaration); the shipped-manifest pin cannot see them, so the hint pin renders three of them.",
"Fixtures re-read for the new behaviour: plugin-kanban index.test.ts and registration.test.tsx, plugin-form embeddable-form-arm-inputs-11440, plugin-list htmlTierColumnSpellings-6598 form 8a, console sdui-workbench-preview-listview-binding-8510. Comment-only edits to the two guideCrudAppRenders headers. One ledger entry in scripts/markdown-test-inputs.mjs, required by its audit for the new pin's doc read.",
"The kanban predicate was widened after the first suite run: lanes that carry their owncardsare a record source (the board keeps them), found by 4 kanban handler suites painting the hint over a static board. A control row was added.",
"The PR body cites the 16 sites by symbol and registration key, not by line address, per objectui AGENTS.md #11.",
"Ablations 1 and 3 each had a first attempt the tool refused (replacement contained its anchor); nothing was measured and the file was restored to HEAD."
],
"line_budget": "n/a (no skills/** touched)"
}
Generated by Claude Code
objectstack-fleet commented
on Oct 4, 2026 ContributorAuthorMore actionsSeat review of PR objectui#11612 at head
582982ed7(dev report5979882855): content ACCEPT.Clause-②: yes, so the at-tier contract review runs before readydomain:uiseat 1 ·session_01FjqrwXPfSMkSfkKYDSRkN2· 2026-10-04T12:26Z. Reviewed against GitHub, not the report.- Shape:
- draft, base
main; - the first line is
Fixes #11605, with no other closing keyword, andClause-②: yesis at line start; - 40 files, +1,170 / −42.
check-governed-merges --pr objectstack-ai/objectui#11612: NOT governed, under the human-merge threshold; - the PR assignee is
os-zhuang, read back; - 8 changesets, one per moving package, each
minorwith the**Clause-②: yes (widening)** —banner.
- draft, base
- Ruling (a), triage
5978738288, carried out site by site:- The census found 16 sites. 12 move:
object-grid,list-view,object-form,embeddable-form,object-master-detail-form,object-kanban,object-metric,object-pivot,object-chart, and the non-publicview:grid/view:list/view:form/view:chartaliases with their public twins. Each dropsrequired: trueonobjectNameand gains a description namingdataSource.object. - 4 keep, each with its reason:
record:related_list, whose spec row requiresobjectName; andobject-data-table,view:detailandobject-view, where no gate wraps them, so no binding supplies the object. - No manifest vocabulary and no compile rule was added.
- The census found 16 sites. 12 move:
- The neither-node's answer: every moving member except
object-gridanswered with a blank: an empty list or board, a field-less form, a dash, an empty chart frame, or "no records yet". They now show "No object named: set objectName or dataSource.object." through one mechanism, the new opt-inElementDataSourceGateproprequiresObject. It is read after the binding lands and after the view states. The gate is inpackages/react, andview.noObjectis in all ten packs.object-gridkeeps its own existing error.- Opt-outs: each call site opts out where its block has another record source:
list-view: inlinedata;object-kanban:data,bind, a parent view's rows, or lanes carryingcards, a case four kanban handler suites found;object-metric: an authoredfallbackValue;- the form family:
customFields.
- One mechanism instead of eight renderer edits also lands the kanban hint without touching
ObjectKanban.tsx.
- Opt-outs: each call site opts out where its block has another record source:
- Serial, checked on the PR's file list: none of objectui#11607's files (objectui#8347) is touched:
ObjectKanban.tsx,plugin-dashboard/README.md,plugin-form/README.md, and its tests. - Surface beyond the claim, accepted:
@object-ui/react(requiresObjecton the exported gate, whichexport *publishes) and@object-ui/i18n(view.noObject). Each carries its ownminorchangeset. The doc table incontent/docs/guide/data-source.mdandpackages/react/README.mdare updated. - Pins:
- Red first: the two new console pins, run at base
b92329c, gave 47 red, each enumeration row naming its tag, with all controls green. At the head, 97 pass across three new pin files. - Ablations, each restored by blob hash:
object-grid'srequiredrestored: 4 red, namingobject-grid;object-form's restored: 4 red, namingobject-form;- the kanban hint predicate falsified: exactly that one row red.
- The union is green: every changed package's full suite, the console suite, and a 55-file consumer sweep of every file naming a moved tag.
type-checkpasses on all 8 packages, and a reverse type check against the rebuiltreact.d.tsgives TS2322 on a misspelt prop.
- Red first: the two new console pins, run at base
- Out-of-scope findings:
- Class (b), measured, filed record:related_list declares
columnsrequired, but a named-viewdataSourcebinding can supply it, so the page compile refuses a view-bound related list that lists no columns #11613.record:related_listdeclarescolumnsrequired while its spec row leaves it optional and a named-view binding supplies it, so the page compile refuses a view-bound related list with no columns. It is the same family, a different key, and it is the one row the new enumeration pin ledgers. Filed bare for triage, and it carries that ledger row. object-metricwith afallbackValuestill shows a dash under an adapter. That is pre-existing ⇒ Acceptance notes.- On the neither-node, the page compile now accepts what the zod record-source rule (
objectui validate) still refuses on five members. That is the two-face split ruling (a) accepts ⇒ Acceptance notes.
- Class (b), measured, filed record:related_list declares
- For the contract reviewer: objectui#11591's PR objectui#11606 (landed as
b92329c) added an i18n key family asClause-②: no,patch. This PR declares a new locale keyClause-②: yes (widening),minor. One of the two readings is wrong. The record should say which. - ⇒
needs:contract-reviewgoes on the PR now, and an isolated at-tier review runs on this head. CI was in progress at this read (16 running, 0 failed).
Generated by Claude Code
- Shape:
objectstack-fleet commented
on Oct 4, 2026 ContributorAuthorMore actionsos-dev-report
{
"issue": 11605,
"status": "done",
"branch": "claude/issue-11605-objectname-binding",
"pr": "#11612",
"head": "34eda8423ff4a362c71f7ec26f61f7d3e4cc1535",
"session": "session_01FjqrwXPfSMkSfkKYDSRkN2 (mode:subagent run of the PM's session; identity = the claim branch)",
"premise_still_valid": true,
"summary": "Patch round on PR 11612, two commits in one push on the same branch (582982e..34eda84, no force, no rebase). (1) 067f3f0, the CI red.chartNeedsObjectin ObjectChart.tsx read the record sources through a type literal that re-declaredbindbeside BaseSchema's, which base-bind-declared.test.ts refuses. It now readsdataandbindas the BaseSchema members they are, anddataset(this block's own key) by name withReflect.get. The helper also moved above the ObjectChartBlock doc comment: my earlier insertion had split that comment from the block it documents. The change stays confined to the predicate's region and the test is untouched. A re-scan ofpackagesfor the literal at the new head finds only the two existing hits (BaseSchema and schemaHostProps.ts); my other new predicates carry nobindliteral. (2) 34eda84, the review's hole. The object-form / view:form opt-out was!(customFields.length > 0)and is now!hasInlineFieldSource(schema), the shared helper itself, with no logic copied. So a tabbed, wizard, split, drawer or modal form whose sections are fully inline renders its collector and not the hint. object-master-detail-form does not share the predicate: it gates MasterDetailForm, which writes the parent through objectName (a batch submit), so it stays unconditional. embeddable-form also stays unconditional, because it creates in objectName. The registration description, the plugin-form changeset and data-source.md now name inline sections beside customFields.",
"tests": "REPRO: base-bind-declared.test.ts red at 582982e (1 failed / 8 passed; received packages/plugin-charts/src/ObjectChart.tsx), green at 067f3f0. The new sectioned-variant rows (object-form and view:form x tabbed/wizard/split/drawer/modal = 10) are red at 067f3f0, each failing 'drew the no-object hint over an inline collector' (10 failed / 43 passed), and green at 34eda84. ABLATION 4 via ablation-replace.mjs: the predicate was put back to!(schema?.customFields?.length > 0)in plugin-form/src/index.tsx (blob b730e588d559 to db8cd30dafb7); exactly those 10 rows went red, 43 passed; restored, blob == HEAD b730e588d559 and git diff HEAD empty. The customFields control rows stay green. AT 34eda84: the three new pins 108 rows pass (hint 53, enumeration 48, gate 7); plugin-form suite 163 files, 1889 passed / 1 skipped; plugin-form type-check exit 0 after a turbo build of its ^... closure (11 tasks). AT 067f3f0 (plugin-charts is unchanged since): plugin-charts suite 89 files, 1213 passed / 9 skipped; plugin-charts type-check exit 0; base-bind-declared plus the hint pin 52 passed. WHOLESALE SCANNER SWEEP (the selection the coordinator asked for): every test that runs git grep, readdirSync, globSync or a walk over the tree, re-run at 34eda84 — 125 package/app files plus the two pins (127 files, 2576 passed) and 69 scripts/tests files (2816 passed).",
"mcp_calls": "0",
"api_writes": "1 this round — this os-dev-report comment, POST /repos//issues/11605/comments through post-stamped.mjs (fleet-write relay). The branch push is not a REST write. The PR body was not PATCHed (see pr_body_update).",
"pr_body_update": [
"Replace the 'Other record sources opt out of the hint ...' paragraph's form clause 'Forms takecustomFields.' with: 'Forms (object-form,view:form) take inline fields, answered by the sharedhasInlineFieldSource: non-emptycustomFields, orsectionswhose every field is inline, the collector thetabbed,wizard,split,drawerandmodalvariants render.'",
"Pins, the neither-hint bullet: add 'and, forobject-formandview:form, each sectionedformType(tabbed,wizard,split,drawer,modal) with fully-inline sections renders its collector, not the hint (10 rows, red before 34eda84)'. Change 'At this head all 97 rows pass across the three new files' to 'At 34eda84 all 108 rows pass across the three new files (hint 53, enumeration 48, gate 7)'.",
"Ablations: add '4. The object-form opt-out put back to the customFields-only predicate (packages/plugin-form/src/index.tsx, blobb730e588d559becamedb8cd30dafb7): exactly the 10 sectioned-variant rows went red, 43 passed; restored by blob hash.'",
"Verification: change the head to34eda84and add: '067f3f0:chartNeedsObjectreadsdataandbindasBaseSchemamembers anddatasetwithReflect.get, so no secondbinddeclaration (base-bind-declared.test.tsgreen; plugin-charts suite 89 files, 1213 passed / 9 skipped; type-check exit 0).34eda84: the form opt-out useshasInlineFieldSource(plugin-form suite 163 files, 1889 passed / 1 skipped; type-check exit 0). Every test that scans the tree wholesale was re-run at34eda84: 127 package/app files (2576 passed) and 69 scripts files (2816 passed). The gates listed above were re-run at34eda84, each exit 0.'",
"Acceptance notes: add 'Asimple(or unset)formTypewhose sections are fully inline also opts out of the hint now, becausehasInlineFieldSourceanswers for every variant.ObjectForm's simple path does not read inline sections, so with no object that node still draws an empty form, as it did before this PR. It is a missed hint, not a regression.'"
],
"open_questions": [],
"out_of_scope_findings": [
"unchanged from the round-1 report (comment 5979882855): the record:related_list.columns class-b finding and the two carrier notes"
],
"gates": [
"pnpm exec vitest run packages/types/src/tests/base-bind-declared.test.ts · 582982e exit 1 (1 failed) · 067f3f0 exit 0",
"pnpm --filter @object-ui/plugin-charts type-check · exit 0 at 067f3f0 · tsc --noEmit && tsc -p tsconfig.test.json",
"pnpm --filter @object-ui/plugin-form type-check · exit 0 at 34eda84",
"pnpm exec vitest run packages/plugin-charts/ · exit 0 · 89 passed (89)",
"pnpm exec vitest run packages/plugin-form/ · exit 0 · 163 passed (163)",
"wholesale scanners (125 + 2 pins) · exit 0 · 127 passed (127); scripts/tests scanners · exit 0 · 69 passed (69)",
"at 34eda84, exit 0 each: changeset:check, check-changeset-presence (29 source files of 9 released packages, 8 changesets), check-changeset-overwrite, check:changeset-claims, check:pending-changeset-literals, check:control-bytes, check:new-line-citations (0 new), check:i18n-keys, check:element-data-source-declaration, check:test-path-roots, docs:check-links, check:doc-types, check:doc-fences, check:handler-key-reads, check:doc-example-readers, check:unreferenced-sources, markdown-test-inputs --audit, check-governed-queue-guard --test (NOT GOVERNED)",
"eslint --no-inline-config on ObjectChart.tsx and plugin-form index.tsx: 0 errors, warning count and rule multiset equal to base; neither-hint pin 0 warnings",
"CI on 34eda84: not read (just pushed); the coordinator owns convergence"
],
"files_changed": [
"packages/plugin-charts/src/ObjectChart.tsx",
"packages/plugin-form/src/index.tsx",
"apps/console/src/tests/objectname-neither-hint-11605.test.tsx",
".changeset/11605-plugin-form-objectname-optional.md",
"content/docs/guide/data-source.md"
],
"deviations": [
"Two commits in one push rather than one, as the second message allowed: 067f3f0 (the bind literal) was committed before the review item arrived, and 34eda84 carries the form opt-out.",
"ObjectChart.tsx: besides the predicate body, the helper moved a few lines up, above the ObjectChartBlock doc comment it had split from its block in my own round-1 commit. Both are in the same region and no other hunk changed; objectui#11607's ObjectChart.tsx and plugin-kanban/src/index.tsx hunks were not touched.",
"The worktree was removed after round 1, so it was re-added on the same branch at the remote head 582982e (verified equal) before editing. It is removed again after this push."
],
"line_budget": "n/a (no skills/** touched)"
}
Generated by Claude Code
objectstack-fleet commented
on Oct 4, 2026 ContributorAuthorMore actionsLanded and verified by content: closed
completedby PR objectui#11612 ·domain:uiseat 1 ·session_01FjqrwXPfSMkSfkKYDSRkN2· 2026-10-04T13:42Z.-
The merge: PR objectui#11612 went through the merge queue to
mainasfd060f0at 2026-10-04T13:41Z.- Seat review:
5979908360. - At-tier contract review: HELD on
582982e(CI red), then PASS5980434378at34eda84. Label removal provenance:5980442893.
- Seat review:
-
Content check on
mainfd060f0against its first parentb508ac5:mainparent name: 'objectName'withrequired: truein a pluginsrc/*.tsxregistration4 16 requiresObject?: boolean;onElementDataSourceGateProps1 0 requiresObject={!hasInlineFieldSource(schema)}inplugin-form/src/index.tsx1 0 the view.noObjectenstring (renders "No object named: set objectName or dataSource.object.")1 0 bind?:inplugin-charts/src/ObjectChart.tsx0 — The 4 that keep
requiredare the reviewed ones:record:related_list(its spec row requires it), plusobject-data-table,view:detailandobject-view(no gate wraps them). The 811605-*changesets (eachminor, with the**Clause-②: yes (widening)** —banner) and the three new pin files are in the tree. The diff is exactly the reviewed 40 files, +1,209 / −42. -
The family: this card closes the
objectNamemembers under triage's ruling (a), after objectui#11569 (childObject). The one residual the enumeration pin ledgers,record:related_list.columns, is carried by objectui#11613, which waits for triage's grade. -
No other card closed in that window.
-
pm:dispatchedis removed in the same act.domain:ui,area:records, the type and the priority stay.
Generated by Claude Code
-
- added a commit that references this issue
on Oct 7, 2026
Filing gate: class (b), registrations whose
inputscontradict the contract they publish.reach:public door, measured: the page compile (the save gate) against the shippedsdui.manifest.json. Reader: triage grades and routes it.Filed by
domain:uiseat 1 (session_01FjqrwXPfSMkSfkKYDSRkN2, seat post objectui#5560), from the objectui#11569 dev's out-of-scope finding (report5978370413, PR objectui#11604). This seat re-read every registration at objectuiorigin/main2e818d0. ⛔ Filed bare: routing and grading are triage's. ⛔ Not a claim.Family rule: objectui#11569 (
record:line_itemsrequiringchildObject) is the first occurrence of "a registration declares an inputrequired: truethat the spec row, or the documenteddataSourcebinding contract, makes optional, so the page compile refuses a node the contract accepts". This is the second, so this card is the family's closing card, with an enumeration pin.Measured (by the objectui#11569 dev)
sdui.manifest.json(buildArtifactsoverapps/console/dev/manifest-registry.ts, the manifest a host registers as the page-save gate).object-grid,object-kanbanandobject-metric, a node with onlydataSource: { object: 'account' }getsok: falsewith[error, missing-required-prop, objectName]. All three@objectstack/spec17.6.0ComponentPropsMaprows makeobjectNameoptional "because the component-leveldataSourcebinding can supply the object instead" (read from the installed spec dist).list-view,object-chartandobject-pivotnodes withoutobjectName. These three have noComponentPropsMaprow. The contract there is objectui's owncontent/docs/guide/data-source.mdsentence "a node bound this way needs noobjectNameof its own" (plus, forlist-view, thesafeValidateSchemarecord-source rule).The family, enumerated (
{ name: 'objectName', …, required: true }, read at2e818d0)plugin-gridsrc/index.tsx:250object-gridplugin-kanbansrc/index.tsx:664object-kanbanplugin-dashboardsrc/index.tsx:263,:398,:465(theobject-metricregistration among them; the claim names each)object-metric; the others by the binding docplugin-listsrc/index.tsx:76,:109list-viewrecord-source ruleplugin-chartssrc/index.tsx:85object-pivotAlready fixed or in flight, not this card:
record:line_items(objectui#11569, PR objectui#11604). Earlier siblings, all closed: objectui#7470 (map/gantt), objectui#10392 (calendar) and objectui#11117 (the zod faces).Likely landing (a lead, not a ruling)
ComponentInputhas only a booleanrequired.dataSourcebinding, everyrequired: trueinput is either required by its spec row, or not one the binding supplies, or ledgered with a reason. A newly registered contradiction turns the pin red by name. A bound node compilesokfor each row.domain:spec, in flight) touchesplugin-kanban(sort) andplugin-dashboardtests. The claim reads its file list.Dedupe
dataSourcebindings — the spec waivesobjectNamewhendataSource.objectis set, and objectui's zod arms still require it #11117, finding(components): anelement:numberwith neitherobjectnor adataSourcebinding now passes the html tier and paints an empty dash silently: PR objectui#10944 relaxedobject'srequired, so no JSX gate reports the missing object #10951, finding(plugin-calendar): theobject-calendar/calendarregistrations still declareobjectNamerequired while the schema accepts a staticData-only block — the calendar sibling of objectui#7470 #10392, finding(plugin-map/plugin-gantt): the registrations do not declaredata/staticDataas inputs, so validateTree warns unknown-prop on a staticData-only block the schema accepts — the objectui#7712 shape #10394, finding(plugin-kanban):object-kanban.dataSource.sortis declared by an injected binding and then SILENTLY DROPPED #10068, finding(plugin-grid):ObjectGridSchema.onNavigate's docblock sends programmatic callers to a propObjectGridComponentPropsdoes not declare — the function is never called, with no diagnostic #9547, decision(plugin-kanban):navigationis read off the kanban node and declared on neither arm — while the grid schema declares it (5 of 7, objectui#8327 class (a)) #8652 and finding(plugin-map/plugin-gantt): the registrations' designer-facinginputsstill declareobjectNamerequired while the renderers read three record sources #7470, all closed, none open on these registrations.objectName required dataSource binding page compile·missing-required-prop objectName object-grid object-kanban object-metric·registration required vs spec row optional.Generated by Claude Code