You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
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
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.
Read fresh. A field group's relatedList that names a side-card relationship saves, passes the spec, and draws nothing at the group, although the .describe() promises a body table there. Studio's group inspector offers every inbound relationship, so the public door produces it. This is class c (an authored value silently not honoured), so p2.
The spec lane rules A or B, as the card asks. Either way the PR states its face:
A (placing a list there promotes it to a body table) widens what the key does: Clause-②: yes (widening) and a Skills-docs: line.
B (only body lists are accepted, and Studio offers only those) narrows: Clause-②: no (narrowing), the ADR-0087 disposition, and a refusal with a prescription.
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/main273137d2: 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
Activity
objectstack-fleet commentedon Oct 29, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: 看数据的视图 | none | P②
Triage: p2 ·
domain:spec·area:records· 2026-10-29T08:53Z⛔ Not a claim.
Read fresh. A field group's
relatedListthat names a side-card relationship saves, passes the spec, and draws nothing at the group, although the.describe()promises a body table there. Studio's group inspector offers every inbound relationship, so the public door produces it. This is class c (an authored value silently not honoured), so p2.The spec lane rules A or B, as the card asks. Either way the PR states its face:
Clause-②: yes (widening)and aSkills-docs:line.Clause-②: no (narrowing), the ADR-0087 disposition, and a refusal with a prescription.Both owe a contract review before approval (pm-dispatch(contract-review): a seat sends a PR to the maintainer for approval only after a contract PASS on the current head, and a PR that landed still owing one is re-reviewed after landing, with each finding filed as a new card #27345).
⛔ One rule across the seam: spec describe →
bodyTablePlacement→ StudioRelatedTablePlacementread the same predicate, not three copies.bug,priority:p2,pm:queue.Generated by Claude Code
objectstack-fleet commentedon Oct 29, 2026
domain:spec#3 · os-support-ai · session_01WGufzgbJhFoXYsLSe5WSPP
Claim: PM loop round 3 · 2026-10-29T09:27Z
Session:
session_01WGufzgbJhFoXYsLSe5WSPPAccount:
os-support-aiBranch:
claude/project-thread-xkumfw(card thread; the platform assigns the thread's branch and it can push only that one, written as measured instead ofclaude/issue-27478-<slug>)Worktree:
objectstack-27478Domain:
domain:specSeat:
domain:spec#3Ruling-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
relatedListonly positions a body table and naming a side card is refused with a prescription; Studio offers only body listsFile surface: one exported body-table predicate in
@objectstack/specread bybodyTablePlacement(ui/packages/plugin-detail), Studio'sRelatedTablePlacement(ObjectGroupInspector.tsx) and the refusal; the refusal besidecollectRelatedListNameErrors(stack.zod.ts) and inpackages/lint/src/validate-related-list-refs.ts; thefieldGroups[i].relatedListdescribe 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: highClause-②: no (narrowing)
Metadata-protocol: none
Responsibility: an unclaimed p2
domain:speccard; seat 1 told through the coordinatorThread-read: 6492275627
Premise: to be measured first by the dev on
origin/main273137d2: a field group whoserelatedListnames a side-card relationship parses, publishes and draws nothing at the groupSerial constraints cleared: PR #27352 (seat 3, #27311 + #27312) rewrites refusal prose in the same
object.zod.tsdescribes; the dev edits none of its lines and re-checks its file list before editing