Skip to content
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
This repository was archived by the owner on Nov 4, 2026. It is now read-only.

decision: on an app page, how does record:related_list find its parent record, given that its dataSource already binds its child rows? (the related-list half of objectui#12294) #12296

Closed

Description

@objectstack-fleet

Ruled: 6137226306 · letter B · 2026-10-13T03:02Z · execution card objectstack-ai/objectstack#23134 (domain:spec, pm:queue); the objectui leg lands on #12294 once the spec release is installable
This card carries the record:related_list half of objectui#12294's item 3. The parent keeps the other three record blocks (record:details, record:highlights, record:quick_actions), dispatched now under claim 6137033601. Once this card is ruled, the parent's related-list half executes.

Filing gate ② a decision only the maintainer can make. Filed by objectui domain:ui seat 1 (seat post objectui#5560) · session_01CsyMRsFJBKNEMa4oPY1b5z, while claiming objectui#12294 on the maintainer's instruction 「12294 插队」. ⛔ Not a claim. The ruling is recorded on this card and on the parent, then this card closes.

维护者速读

objectui#12294 让记录类块在普通应用页上用自己的 dataSource 绑定一条记录,这样产品页不用再套记录页外壳(你在 objectstack-ai/cloud#2839 Q1 选的 D)。详情、要点、快捷操作三个块已经派发。

第四个「相关列表」不一样:它的 dataSource 早就有含义,绑定的是它要列出的子记录(objectstack#6953 已发布)。父记录则来自记录页上下文,应用页上没有这个上下文。卡上要求它「按绑定行的 id 查子记录」,等于让同一个键同时指父记录和子记录。

八月的 objectstack#4444 已经决定不做会自己取数的「记录范围」组件(not_planned,那次针对 react 页),列了翻转条件和最低门槛。所以选项是:

推荐 B。回一个字母:A / B / C / D。

四棱(os-decision-facets)

Prior rulings read: RecordScope, record context, related_list parent, record_id filter → objectstack#4444 (<RecordScope> 不做, not_planned, react pages; flip conditions and minimum bar), objectstack#4413 / PR #4450 (record blocks withdrawn from the react tier because renderers did not read their bindings), objectstack#6953 (the related list's child binding), objectui#7297 (a {record_id} filter token resolves only with a record in scope), objectstack-ai/cloud#2839 Q1 D (per-block bindings, as objectui#12294 quotes it; not reachable from this session); ADR none found; thread: objectui#12294.

一句话问题

在一个不是记录页的普通应用页上,「相关列表」不知道该列谁的子记录。它自己的数据绑定已经用来指定子记录,没有地方说明父记录是哪一条。

Governing text

前提(每条带 re-check 命令,在 objectui 仓里跑)

  1. 相关列表的 dataSource 已经是子记录绑定。 objectui main 45ae6b8:record-related-list.tsx 的导出被 elementDataSourceBlock 包裹,绑定映射到 objectName。
    Re-check: grep -n "elementDataSourceBlock(\|dataSource?: ElementDataSourceConfig" packages/plugin-detail/src/renderers/record-related-list.tsx。
  2. 相关列表的父记录来自记录页上下文。 块体读的是 useRecordContext(),应用页上没有这个上下文,所以 objectui#12294 卡上实测它什么都不渲染。
    Re-check: grep -n "useRecordContext" packages/plugin-detail/src/renderers/record-related-list.tsx。
  3. 筛选条件在应用页上够不到父记录。
    • {record_id} 只在有记录上下文时才能解析(objectui#7297 的落地说明:useFilterScope() 只读 useRecordContext()?.recordId)。
    • objectstack spec packages/spec/src/data/filter.zod.ts 的注释写明,query.joins 已移除(Synthesized aside region carries className, which PageRegionSchema rejects — a Reference Rail page has no persistable spelling #4286),按关系路径的点号引用会被 SQL 下推以 INVALID_FILTER 拒绝。这条读的是 $field 引用的注释,筛选键本身带点号的情况没有实测。
      Re-check: grep -n "useRecordContext" packages/react/src/hooks/useFilterScope.ts;在 objectstack 仓里跑 grep -n "joins\|INVALID_FILTER" packages/spec/src/data/filter.zod.ts。

选项 × 真实代价 × 工作量

选项 做什么 客户感受到的后果 工作量
A spec 加一个记录范围,绑一条记录并为里面的块提供记录上下文;翻转 #4444,按它的最低门槛接失效总线、加属性形状 lint 一个区域只绑一次记录,里面的详情、要点、操作和相关列表都读它 objectstack domain:spec 1 个 PR(加契约复核和 lint)+ objectui domain:ui 1 个 PR;没有先例
B spec 给 record:related_list 加一个父记录绑定键(形状和 dataSource 一样,按单记录规则取第一行);validate 提醒同页详情块和相关列表的父绑定不一致 产品页上的相关列表能列出那条记录的子记录 objectstack spec 1 个键 + objectui 1 个 PR;无先例(objectui#12294 前半张卡在飞,落地后可复用它的单记录读取)
C 设置了 relationshipField 时,dataSource 改读为父记录 已按 objectstack#6953 写的子绑定被当成父记录,现有页面出错 只改 objectui,但是破坏性变更
D 不做 cloud 的成员页这类需要相关行的页面继续用记录页外壳 无

业务含义

  • A:像一个文件夹,先说「这一格讲的是哪位客户」,格子里的卡片都看这位客户。
  • B:「往来记录」卡片自己注明「客户是谁」,和旁边几张卡的做法一样。
  • C:把印好的「子项」标签改成「父项」,旧表格全看错。
  • D:这类卡片只能放在客户档案页里。

推荐 + 回退 + 置信缺口

裁后执行


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 13, 2026

    @objectstack-fleet
    ContributorAuthor

    Ruling: batch #335 item 1 · letter B · maintainer 「同意」 2026-10-13T02:59Z

    Director seat, summon #40, session_01TJKP6W6UDYEBHtccVdpVoz (GitHub os-steve; seat post objectstack-ai/objectstack#12708; written as objectstack-fleet[bot] through the relay, read back). Presented in this seat's chat as batch #335, the one card, with recommendation B (the filing seat recommended B; this seat reached the same letter on the long-term axis); the maintainer's word was 「同意」. The three premises were re-read by this seat on objectui and objectstack origin/main before the batch and hold (RecordRelatedListRenderer is wrapped by elementDataSourceBlock and its dataSource binds the child rows; the block reads useRecordContext(); useFilterScope resolves {record_id} from the record context only, and query.joins is gone per #4286). Thread-read: none (no comment on the card at this write).

    B — record:related_list gains a parent-record binding key of its own. @objectstack/spec adds one key on the record:related_list component (name and shape proposed by the spec seat after measurement; the shape is dataSource's, read by the single-record rule: the first row, and a loud absence when no row answers, the same rule the other three record blocks take under objectui#12294). dataSource keeps its published meaning, the child rows (objectstack#6953). Every record block therefore declares its own binding and the platform has one binding mechanism; the related list is the one block with two bindings. Governing text: objectstack-ai/cloud#2839 Q1 D (per-block bindings, as objectui#12294 quotes it); objectstack#4444 (no self-fetching record scope on react pages; its flip conditions are not declared met by this ruling); the ELEMENT_DATA_SOURCE_INPUT contract ("per-element data binding"). A (a record scope) is not taken: it overturns a recorded ruling and puts two binding mechanisms side by side. C is not taken: a published key would change meaning. D is not taken: it runs against cloud#2839's direction. ⛔ No new validate finding for a parent binding that differs from a sibling details block: a new gate defaults to no, and none was named.

    • Workload (the card's column for B): objectstack domain:spec · 1 key, 1 PR (the key, its description, the component-props door, a contract review) · objectui domain:ui · the related-list half of objectui#12294 once the spec release is installable (reuse the first half's single-record read and invalidation wiring) · no precedent.
    • Execution parameters: the objectstack execution card is filed by this seat in this act from this ruling (objectstack is where the fix lands, cross-repo rule 1), domain:spec · pm:queue, with the ruling quoted; this card records the ruling, carries a pointer to that card, and closes completed as its own text prescribes. The parent objectui#12294 carries the same ruling in a comment: its related-list half waits on the spec release (the cross-repo unlock rule: installable, not merged) and lands on the parent, not on a new card.
    • Premise and fork clause: dataSource on record:related_list is read by objectui as the child binding and by no reader as the parent. If the spec seat finds a reader that already treats it as the parent, or a shape the single-record rule cannot carry, it reports the fork and stops; ⛔ no silent C.
    • 四棱:卡面的四棱块本席逐条确认;只看①选 B;②③④ 是否翻转:否。
  2. objectstack-fleet commented on Oct 13, 2026

    @objectstack-fleet
    ContributorAuthor

    Closed completed at 2026-10-13T03:03Z by the director seat (summon #40, session_01TJKP6W6UDYEBHtccVdpVoz, written as objectstack-fleet[bot] through the relay), as this card's own text prescribes once the ruling is recorded: letter B (ruling 6137226306, the maintainer's 「同意」), recorded here, on the parent #12294 (6137246293), and carried by the execution card objectstack-ai/objectstack#23134 (domain:spec, pm:queue). The objectui leg lands on the parent once the spec release carrying the key is installable. needs-user-decision leaves with the close; domain:ui, priority:p1 and enhancement stay as attribution.

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

    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatenhancementNew feature or requestpriority:p1

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions