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
* feat(spec): declare record:reference_rail in ComponentPropsMap — undeclared rail keys refused (#8691)
- ui/component.zod.ts: strict RecordReferenceRailProps + ReferenceRailEntrySchema,
key set measured from the renderer's read points at the .objectui-sha pin
(entries[]{objectName, relationshipField, title?, limit?, displayField?} +
component-level hideEmpty); the interface's icon is read by nothing and is a
guidance refusal, not a declared key; title is a literal string (raw React
child), not I18nLabelSchema
- pins: spec-side (component-reference-rail.test.ts) + lint-side dispatch pin
(validate-component-props.test.ts) reproducing the card's planted filter in
both directions
- semantic migration entry under protocol-18 + regenerated registry
- changeset: minor + BREAKING + ADR-0087 disposition (the #8666/#8695 precedent)
- regenerated: api-surface, export-origins, docs references, strictness ledger,
authorable-surface, json-schema.manifest
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E5tUwGM3LQoqErTfkvRW7W
* test(spec): ADR-0122 isomorphic pins for the rail schemas (Iso845/Iso846)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E5tUwGM3LQoqErTfkvRW7W
---------
Co-authored-by: Claude <noreply@anthropic.com>
|**entries**|`{ objectName: string; relationshipField: string; title?: string; limit?: integer; … }[]`| ✅ | Related collections to summarize — one compact card per entry (icon-less title, total-count badge, top-N preview rows). An empty rail renders nothing, so at least one entry is required. |
585
+
|**hideEmpty**|`boolean`| optional | Fold entries whose related count is 0 into a single "+ N empty" expander chip (renderer default: on; set `false` to always render every card). |
586
+
587
+
576
588
---
577
589
578
590
## RecordRelatedListProps
@@ -597,3 +609,18 @@ Type: `string`
597
609
598
610
---
599
611
612
+
## ReferenceRailEntry
613
+
614
+
### Properties
615
+
616
+
| Property | Type | Required | Description |
617
+
| :--- | :--- | :--- | :--- |
618
+
|**objectName**|`string`| ✅ | Related object name whose records this card summarizes (e.g. "task", "opportunity_quote") |
619
+
|**relationshipField**|`string`| ✅ | Field on the related object that points back to this record (e.g. "account_id") |
620
+
|**title**|`string`| optional | Literal card title. Rendered as-is in EVERY locale (no inline locale map — the rail renders it as a raw React child); omit to use the related object's localized label. |
621
+
|**limit**|`integer`| optional | Preview rows per card, and the `$top` of the one query this entry issues (renderer default: 3). |
622
+
|**displayField**|`string`| optional | Field of the related record rendered in each preview row (renderer fallback when omitted: name / title / subject / label / … / id). |
0 commit comments