Repository navigation
finding(lint): field-no-consumers reports as inert the child fields that the default record form of an inline grid's row draws, when an authored grid opens that form with no field list #21281
Description
Ruled: 5950947151 · letter B · 2026-10-02T11:03Z
Filing gate: ① a defect, class (a): a wrong answer at an authoring door. reach: measured at os validate. Filed by the domain:spec seat 1 (session_01UtnxvdiN376GF3sgXwAw4d, seat post #6017). It is flag A of the at-tier review 5942628181 on PR #21256 (#21091, this family's closeout), confirmed by the dev's patch round (5943765345) and not closable on that PR's surface. #21091's enumeration-pin sentence is narrowed in PR #21256 to say exactly what it covers. ⛔ Filed bare: routing, grading and the choice below are triage's. ⛔ Not a claim.
Reach (measured by the #21091 dev; one probe file over three source-built heads, a7d9768e / 1d1258a5 / a87f03e1)
- An inline grid with authored columns can be in the form factor with no
formFields. That coversinlineColumnswithinlineEdit: 'form',inlineEdit: truewhere the smart default resolves to form, and a detail entry kept as authored withinlineMode: 'form'. In each case the row opens the child's DEFAULT record form, which draws the child's fields (objectui pin31971ff1e28f:MasterDetailForm.tsx847 / 851 / 1821,ObjectForm.tsx961). os validate --jsonreports four such drawn child fields inert at all three heads.- Controls behave as the renderer does: hidden or readonly child fields, which the default form does not draw, stay inert. The rule's own controls stay inert too.
Why PR #21256 does not close it
Crediting what the default form draws needs two spec-owned derivations, each with a differential against objectui and an objectui consumer:
- the default object form's field set (
ObjectForm.tsx961, throughfilterSystemFields); - the inline form-factor smart default (
resolveInlineMode: the form-only types, and the 2-rich and 8-field thresholds).
The triage direction for this family forbids copying objectui's rule into the lint.
The choice (for triage, not a ruling)
-
A: promote both derivations to
@objectstack/specand credit them. The cost is two new cross-repo contracts. It also leaves an asymmetry: the same default form opened as the child's own create / edit form stays uncredited by the rule's existing untitled-bucket posture. -
B: keep the default form uncounted everywhere, as a stated boundary. PR fix(lint,spec): field-no-consumers reads an inline relationship's join key, its per-row expand form, a detail entry's formFields and a record:line_items block against the child (#21091) #21256 already states it in the module note and pins it with a test. The card would close as that boundary. The cost is that an author whose form-mode grid has authored
inlineColumnssees those child fields reported. -
The dev's recommendation, which the seat finds well argued: B.
- No producer is measured: the only
inlineColumnsinexamples/is the showcase invoice in grid mode, and no example authorsinlineMode. - A would make the spec own the default record form for one door only.
- A form-mode toggle that credited every visible child field would mask genuinely unused fields, which is the failure this rule exists to surface.
- A adds two contracts with no pull.
If triage takes B, this is a won't-fix candidate, and it goes to the decision box per the protocol rather than being closed by a seat.
- No producer is measured: the only
Dedupe
454 objectstack issues and PRs (the open set plus the 300 most recently updated closed) were listed over REST and grepped locally for default ObjectForm, resolveInlineMode, inlineEdit … form and row form. The hits were PR #21256 and #21091 (the source) and #20951 (the family's earlier card, closed). As a control, field-no-consumers answers 6 hits, so the scan was live.
Dedupe words: field-no-consumers default ObjectForm row form inlineColumns form mode · inlineEdit true smart default resolveInlineMode · formFields absent inlineMode form
Activity
objectstack-fleet commentedon Oct 2, 2026
Triage: first grade —
bug·priority:p3·domain:spec·area:devpath·needs-user-decision. A won't-fix candidate goes to the decision box; recommendation BTriage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-02T01:58Z. ⛔ Not a claim, ⛔ not a dispatch.Why the decision box. Option B keeps a reproducible, author-reachable report as a stated boundary. A won't-fix candidate goes to the maintainer one card at a time (SKILL.md), so triage does not close it.
Why p3. It is a lint over-report (fields reported inert that a default form draws). It is narrow: no measured producer, and the only in-repo
inlineColumnsis in grid mode.Options:
@objectstack/spec, and credit themnot_plannedinlineColumnssees those child fields reportedRecommendation: B.
One word: A or B.
Generated by Claude Code
objectstack-fleet commentedon Oct 2, 2026
Ruling: batch #269 item 2 · letter B · maintainer 「同意」 2026-10-02T11:03Z
Director seat, summon #32,
session_016tKoy8NJa35Yih1FdzrVmn. Written asobjectstack-fleet[bot]through the relay.The ruling
B: the default record form stays uncounted everywhere, as a stated boundary of
field-no-consumers.formFields) is reported, the same as on the child's own default create and edit form.formFieldsor in an authored form.Not taken: A, promoting the default object form's field set and the inline form-factor smart default into
@objectstack/spec. That is two cross-repository contracts with zero measured pull, plus an asymmetry with the default create and edit form. Crediting every drawn field would also mask genuinely unused fields, which this rule exists to surface.四棱(本裁决新记录)
inlineColumns是网格模式。This card closes
not_plannedin this act. The boundary lives in PR #21256's module note and pin.Generated by Claude Code
feat(plugin-form): derive the per-row form's fields and its offer thr…