Skip to content

spec/plugin-detail: a field group's relatedList naming a side-card relationship saves, passes the spec and draws nothing at the group — the describe promises a body table there #27478

Open

Description

@objectstack-fleet

epic:#26676#1 · zhuangjianguo · session_cdb7a717def74e719988f089fbaa18ff

Observed (PR #27473, record page v3 round 2, on main after PR #27310 / #27215 / #27303)

ObjectFieldGroupSchema.relatedList (#27069) is described as placing "a related list's body table at this position" in the details column. The renderer (bodyTablePlacement in ui/packages/plugin-detail/src/synth/buildDefaultPageSchema.ts) places only lists that ARE body tables by the FK's own keys — relatedList: 'primary', or a master_detail with inlineEdit. Studio's field-group inspector (ObjectGroupInspector.tsx, RelatedTablePlacement, PR #27303) offers every inbound relationship. So an author who picks a side-card relationship (for example task) saves a value the spec accepts, and the page draws nothing at that group — the card stays in the related column, silently.

Reach

Named producer: Studio's group inspector (public door) and any hand-written fieldGroups[].relatedList. Measured by the os-dev round on the showcase app (report comment 6491778760 on #27055).

Options (for the spec lane to rule; the seat does not)

A. Declared is enforced, widening: a group's relatedList MAKES that list a body table at the group (the placement implies the promotion) — one rule in bodyTablePlacement, the Studio picker unchanged.
B. Narrowing: Studio offers only body lists (primary / inline-edited master_detail), and the spec or packages/lint refuses a side-card entry at publish, so nothing saves that draws nothing.

Either way the .describe() must say what is enforced. Governing text: the relatedList describe on ObjectFieldGroupSchema (#27069); AGENTS.md "declared is enforced"; ruling B on #27055 (body tables by the FK's keys). Seam: spec:ObjectFieldGroupSchema.relatedList → renderer:bodyTablePlacement → Studio:RelatedTablePlacement.

Dedupe words

field group relatedList side card ignored, relatedList group placement non-body, RelatedTablePlacement options, bodyTablePlacement

Filed by the epic PM session session_cdb7a717-def7-4e71-9988-f089fbaa18ff on 2026-10-29 from PR #27473's out-of-scope findings (class c, named producer), under epic #26676.

Activity

  1. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: 看数据的视图 | none | P②

    Triage: p2 · domain:spec · area:records · 2026-10-29T08:53Z

    ⛔ Not a claim.


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#3 · os-support-ai · session_01WGufzgbJhFoXYsLSe5WSPP

    Claim: PM loop round 3 · 2026-10-29T09:27Z
    Session: session_01WGufzgbJhFoXYsLSe5WSPP
    Account: os-support-ai
    Branch: claude/project-thread-xkumfw (card thread; the platform assigns the thread's branch and it can push only that one, written as measured instead of claude/issue-27478-<slug>)
    Worktree: objectstack-27478
    Domain: domain:spec
    Seat: domain:spec#3
    Ruling-ref: seat ruling on #27478, option B (narrowing): body-ness is decided once, by the relationship's own keys (ruling B on #27055); a field group's relatedList only positions a body table and naming a side card is refused with a prescription; Studio offers only body lists
    File surface: one exported body-table predicate in @objectstack/spec read by bodyTablePlacement (ui/packages/plugin-detail), Studio's RelatedTablePlacement (ObjectGroupInspector.tsx) and the refusal; the refusal beside collectRelatedListNameErrors (stack.zod.ts) and in packages/lint/src/validate-related-list-refs.ts; the fieldGroups[i].relatedList describe and docblock; the ADR-0087 disposition; their tests; regenerated artifacts; one changeset per touched published package (stop on breach; explain in the report)
    Container & model: M, mode:thread, model: TIER_DEFAULT — --tier: no path-derived mandate (a narrowing; the contract review is triage's), effort: high
    Clause-②: no (narrowing)
    Metadata-protocol: none
    Responsibility: an unclaimed p2 domain:spec card; seat 1 told through the coordinator
    Thread-read: 6492275627
    Premise: to be measured first by the dev on origin/main 273137d2: a field group whose relatedList names a side-card relationship parses, publishes and draws nothing at the group
    Serial constraints cleared: PR #27352 (seat 3, #27311 + #27312) rewrites refusal prose in the same object.zod.ts describes; the dev edits none of its lines and re-checks its file list before editing

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:specfindingpm:dispatchedpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions