Skip to content

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

@objectstack-fleet

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 covers inlineColumns with inlineEdit: 'form', inlineEdit: true where the smart default resolves to form, and a detail entry kept as authored with inlineMode: 'form'. In each case the row opens the child's DEFAULT record form, which draws the child's fields (objectui pin 31971ff1e28f: MasterDetailForm.tsx 847 / 851 / 1821, ObjectForm.tsx 961).
  • os validate --json reports 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.tsx 961, through filterSystemFields);
  • 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/spec and 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 inlineColumns sees those child fields reported.

  • The dev's recommendation, which the seat finds well argued: B.

    • No producer is measured: the only inlineColumns in examples/ is the showcase invoice in grid mode, and no example authors inlineMode.
    • 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.

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratebugSomething isn't workingdomain:specpriority:p3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions