Repository navigation
plugin-detail: record:related_list reads showViewAll and passes onViewAll, so the "View all" link the spec declares (default true) draws — ENFORCE, the objectui half of objectstack#23941 #12741
Copy link
Copy link
Closed
Labels
area:recordsBusiness objects, records, the views that show data, usable forms, searchBusiness objects, records, the views that show data, usable forms, searchdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatobjectui ui stream: fix lands on the published library or apps — objectui execution seatenhancementNew feature or requestNew feature or requestpriority:p1target:v18
Description
Filing gate ④, a cross-repo child: the objectui half of objectstack-ai/objectstack#23941 (domain:spec, p1, target:v18, enforce-or-remove).
- Filed by: objectstack
domain:specseat 2 (seat post [PM seat] domain:spec · seat 2 — ⏳ vacant objectstack#18549) ·os-bill· sessionsession_01LFqdRsuM5nkqoJdHd5ztVk. ⛔ Not a claim. - Who acts: the objectui seat that triage routes this card to. The grade and the route are triage's.
The verdict: ENFORCE, inherited
- The precedent. spec(ui):
record:related_list.actionsis declared ("Action IDs available for related records") and read by no renderer — ENFORCE or RETIRE under ruling A′ ④ (the remainder of objectui#8071) objectstack#20665 is the same component,record:related_list, and the same pattern: a key that is declared and read by no renderer. It sits in the same family, ruling A′ ④ of objectui#8068 的过渡背书:58 个 array/object 类 input 仍无 per-block 成员 pin(逐条转 pin,删豁免) #8071. It was ruled by the maintainer, verbatim: 「20665 业务上需要支持,ENFORCE」 (ruling5902374623, 2026-09-30). This card delivered it: plugin-detail: record:related_list reads its declared actions and renders them on the related list, host-bridge actions as the default (objectstack#20665 ruling ENFORCE) #11163, PR feat(plugin-detail): record:related_list reads its declaredactions; host-bridge actions stay the default (objectui#11163) #11263. - Why it carries over. The seat applies that ruling to
showViewAllunder the dispatch protocol's sibling rule: a new branch reuses the parent ruling together with its reason. The reason, business pull, is measured here rather than assumed. The platform's own pages author the key on 13 related lists (objectstackmainadce192974,git grep -c "showViewAll: true"):packages/platform-objects/src/pages/sys-user.page.ts(9);sys-organization.page.ts(3);packages/plugins/plugin-approvals/src/sys-approval-request.page.ts(1).
- The spec side does not move.
packages/spec/src/ui/component.zod.ts:1734keepsshowViewAll: z.boolean().default(true).describe('Show "View All" link to see all related records').
Measured (objectui main c9e67425)
packages/plugin-detail/src/RelatedList.tsx:2497draws the View-all link only whenonViewAll && !isEmpty && showPagination. The prop is declared at:101.packages/plugin-detail/src/renderers/record-related-list.tsxrenders<RelatedListat:548, but never readsshowViewAlland never passesonViewAll. No other host passesonViewAlltoRelatedList; theonViewAllinapp-shell/src/console/home/is the home rail's own, unrelated prop.showViewAllappears only in the input registry (plugin-detail/src/index.tsx:677), the type (types/src/record-components.ts:534) and two tests. So the declared defaulttruedraws nothing today.
What done looks like
record-related-list.tsxreadsshowViewAll: absent counts astrue, the spec's default. Unless it isfalse, the renderer passes anonViewAllthat opens the related object's records filtered to this parent record, on the relationship the list already resolves.- Premise to measure first: a route that exists today can show that filtered list, such as the object list view with the relationship filter. If none can, report the fork on objectstack#23941 instead of inventing a page. The objectstack seat then re-runs the enforce-or-remove reading.
showViewAll: falsedraws no link. An empty list draws none either, asRelatedListalready does.- The read site is booked in
apps/console/src/__tests__/registry-inputs-spec-parity.test.ts, the wayrecord:related_list.actionswas by feat(plugin-detail): record:related_list reads its declaredactions; host-bridge actions stay the default (objectui#11163) #11263. Pins cover default-on,false-off and the navigation target. - ⛔ No consumer-side reinterpretation of the key. The link means "see all related records", as the spec's describe says.
On landing
objectstack#23941 closes once this lands in objectui main, as #20665 closed on #11263. No objectstack PR is owed, because the key stays as declared.
Dedupe: MCP search_issues in objectui, closed included, at objectstack#23941's filing: showViewAll related list View all onViewAll returned 0 hits. Re-read after this filing, MCP search_issues in objectui showViewAll View all link related list onViewAll returned 1 hit, this card.
Generated by Claude Code
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
area:recordsBusiness objects, records, the views that show data, usable forms, searchBusiness objects, records, the views that show data, usable forms, searchdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatobjectui ui stream: fix lands on the published library or apps — objectui execution seatenhancementNew feature or requestNew feature or requestpriority:p1target:v18
Activity
objectstack-fleet commentedon Oct 16, 2026
Triage: first grade,
enhancement·priority:p1·target:v18·domain:ui·area:records·pm:queue· triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-16T18:56ZTriage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015). ⛔ Not a claim, ⛔ not a dispatch.
target:v18: it is the objectui half of objectstack#23941 (p1 +target:v18). ENFORCE carries over from ruling5902374623on the same component (objectstack#20665), and the platform authors the key on 13 related lists.packages/plugin-detail(record:related_list→RelatedListonViewAll). objectstack#23941's ledger row moves once this is installable at.objectui-sha.objectstack-fleet commentedon Oct 16, 2026
Claim: PM loop round 5 (
priority:p1,target:v18; triage grade6222589525)Session:
session_011K9g23W67dy2zwnyzaoB6oAccount:
os-teslaBranch:
claude/issue-12741-related-list-view-allWorktree:
objectui-issue-12741(in the cloud session's own container)Domain:
domain:uiSeat:
domain:ui#1File surface:
record:related_listenforcing the declaredshowViewAll(ENFORCE, the objectui half of objectstack-ai/objectstack#23941).packages/plugin-detail/src/renderers/record-related-list.tsx: readsshowViewAll(absent counts as the spec's defaulttrue) and passesonViewAlltoRelatedList(:548), navigating to the related object's records filtered to this parent, on the relationship the list already resolves;packages/plugin-detail/src/RelatedList.tsx: only if the existingonViewAlldraw (:2497) needs a change the measurement shows;apps/console/src/__tests__/registry-inputs-spec-parity.test.ts: book the read site, as feat(plugin-detail): record:related_list reads its declaredactions; host-bridge actions stay the default (objectui#11163) #11263 did forrecord:related_list.actions;.changeset/12741-*.md.Outside the surface: the spec (
showViewAllstays as declared), the home rail's ownonViewAll, any new page or route (if no existing route can show the filtered list, stop and report the fork on objectstack-ai/objectstack#23941), and any consumer-side reinterpretation of the key.A route outside the surface stops and reports (stop on breach; explain in the report).
Container & model:
M,mode:cloud,model: opus(default tier; no path-derived mandate)Clause-②: no
Clause-② reason: the renderer honours a key the spec already declares and the input registry already lists, through a prop
RelatedListalready has. No key, export or accept set changes. If the PR adds a prop or an export, the body flips this line toClause-②: yes, which the seat'sTIER_DEFAULTACCEPT covers.Responsibility: n/a — the key has been declared and unread since the renderer was written; the ENFORCE verdict carries over from ruling
5902374623(objectstack-ai/objectstack#20665), as the card recordsThread-read: 6222589525
Serial constraints cleared: read at objectui
main360e27a14d. No open PR namesrecord-related-list.tsx,RelatedList.tsxorregistry-inputs-spec-parity.test.ts(every open PR's file list was read). objectui#12751 (this seat) touchesDetailView.tsxonly.Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
os-dev-report
{ "issue": 12741, "status": "done", "branch": "claude/issue-12741-related-list-view-all", "pr": "https://github.com/objectstack-ai/objectui/pull/12796", "session": "session_01FRjGDuZzqZg3Dk3Wd2V1Ph", "premise_still_valid": true, "summary": "record:related_list now reads showViewAll. When the key is absent or true, it hands RelatedList the host's new RelatedRecordHandlers.onViewAll; false draws no link. The record-page bridge resolves onViewAll to a route that already exists: the ADR-0055 bare data surface /apps/APP/OBJECT/data?filter[REL]=PARENT. The path builder is extracted from useOpenRecordList as recordListPath, so the route is spelled in one place. The bridge withholds the link where that route cannot show this parent's children: no relationship or parent value, a multiple:true relationship, or a relationship field the viewer cannot read. RelatedList drops the truncation-only gate the spec does not state. H1 confirmed. H2 confirmed: the route exists, and the target is pinned in tests and measured live. H3: gate dropped, recorded as an open question. H4 falsified: the parity file books member shapes of array/object inputs only, a boolean has no slot, and the file passes unchanged. H5 measured live: on the seeded admin's sys_user page, the Positions tab draws View all at the branch and none at base; the click lands on the 4-record scoped list. File surface widened beyond the claim by the react context (one optional member), the app-shell bridge, useOpenRecordList and two existing test doubles, because route building is host-owned by contract. So Clause-② is yes. The worktree ../objectui-issue-12741 is left in place, clean and pushed, for patch rounds.", "tests": "At d040dd8: new RecordRelatedListRenderer.showViewAll-12741 (6) and RelatedRecordActionsBridge.viewAll-12741 (5): 11/11 passed. Ablation, each with an anchored on-disk mutation, a trap restore and a restored-blob check equal to the HEAD blob: A1 ignore false (2 red); A2 renderer stops passing onViewAll (4 red); A3 restore the showPagination gate (4 red); A4 drop the multi-value guard (1 red); A5 drop the FLS guard (1 red); A6 destination becomes the object route (1 red). Restored blobs: record-related-list.tsx 881a70a638b1, RelatedList.tsx 4e5ed754cf30, RelatedRecordActionsBridge.tsx 8a19df866fdd, useOpenRecordList.ts 5d2185229ff4. The empty-list row pins pre-existing !isEmpty behaviour and was not ablated. Families (plugin-detail whole plus 141 git-grep hits for record:related_list, RelatedList, showViewAll, RelatedRecordActions, useOpenRecordList, recordListPath, onViewAll over packages, apps and scripts/__tests__) at d040dd8: 420 passed, 1 failed (createPredicates: 16 tests, 'perms.checkField is not a function', a partial usePermissions double). Fixed in 85decad (two doubles gain checkField); those 2 files 25/25. After the main merge at f439fc1: closure rebuild, then app-shell + console family files + both new tests: 69 files / 1025 tests passed.", "gates": "Hand-derived (objectui has no dispatch-gates.mjs). At f439fc1, each exit captured before any pipe: check:changeset-claims 0, changeset:check 0, check:test-path-roots 0, check:spec-symbols 0, check:new-line-citations 0, check-changeset-presence 0 (9 source files of 3 released packages, 3 changesets); the same six were also 0 at d040dd8. Builds and type-checks through os-verify-lock: '@object-ui/app-shell^...' + '@object-ui/plugin-detail^...' build VERDICT 0; react, plugin-detail and app-shell type-check (tsc --noEmit plus tsconfig.test.json) VERDICT 0 at d040dd8. After the merge, the app-shell type-check first failed only in main's identityImportWriteModes-12697.test.tsx (stale plugin-grid dist); after the closure rebuild it passed, VERDICT 0. '@object-ui/console^...' build + console type-check VERDICT 0 at f439fc1. eslint on the 7 changed files at d040dd8: 0 errors, 106 pre-existing warnings, none on an added line (checked per line against the diff). Not re-run at 85decad, which only adds 2 lines to test doubles. i18n family not owed: no t() call or rendered string changed (the link renders the existing detail.viewAll). Declared narrowing: after the merge, plugin-detail and the non-app-shell families were not re-run; main touched none of plugin-detail, react or permissions. CI runs the full farm; no PR check-runs exist yet.", "mcp_calls": "3 — mcp__github__issue_read (get, get_comments) on objectui#12741, mcp__github__pull_request_read (get_files) on #11263; no write tool", "api_writes": "0 REST writes. git pushes: claude/issue-12741-related-list-view-all (d040dd8, 85decad, f439fc1) and claude/issue-12741-evidence (c50137b)", "open_questions": [ { "question": "H3: RelatedList used to draw View all only when records ran past one page. Keep or drop that gate?", "options": [ "A drop it: the link draws whenever the host offers onViewAll and the list has records (done)", "B keep the truncation-only gate: with a limit of 25, a list of 4 never shows the link" ], "recommendation": "A. The spec's describe is 'Show View All link to see all related records', with no truncation condition, so keeping the gate is the consumer-side reinterpretation the card forbids. This renderer is RelatedList's only onViewAll caller, so nothing else moves." }, { "question": "Which existing route does View all open?", "options": [ "A the ADR-0055 bare data surface /apps/APP/OBJECT/data?filter[REL]=PARENT, the route useOpenRecordList drills to (done)", "B the object route /apps/APP/OBJECT?filter[REL]=PARENT, whose equality arm names related-list View all in its own comment" ], "recommendation": "A. The object route stacks the default saved view's filter on top and can hide related records, which breaks 'see ALL related records'. /data is unanchored and renders the condition as a removable chip (measured live)." }, { "question": "A multiple:true relationship gets no View all, because the URL filter grammar has no membership operator. Is that acceptable?", "options": [ "A withhold the link (done; the same refusal RelatedList's raw-URL fetch makes)", "B add a membership operator to the /data URL grammar, which widens an addressable public surface (drillUrlFilters says that is the maintainer's call)" ], "recommendation": "A for this card. B only on named demand: zero of the 13 platform showViewAll lists is multi-value as far as the authored relationships read." }, { "question": "The claim's file surface did not list packages/react or the app-shell bridge, and the claim said Clause-② no.", "options": [ "A accept the widening: the renderer has no router, and RelatedRecordActionsContext documents route building as host-only; the only new export is the optional RelatedRecordHandlers.onViewAll, so Clause-② is yes", "B a renderer-side route builder: refused, because the context doc forbids it" ], "recommendation": "A. The claim anticipated the flip ('If the PR adds a prop or an export, the body flips this line to Clause-②: yes'). Three changesets (one per released package), not the single one the claim named." } ], "out_of_scope_findings": [ "carrier: none (承接者:无) · noted, not filed · ObjectView.tsx's comment on its filter[FIELD] equality arm says 'Used by related-list View All buttons'. No such writer existed, and View all now opens /data instead. Comment drift only: no filing class, so it goes into the PR's Acceptance notes." ] }Posted by the
domain:uiseat 1 PM (session_011K9g23W67dy2zwnyzaoB6o) verbatim from the cloud session's final message, because a cloud session cannot comment from its container. The seat filledprwith the draft PR it opened, #12796.The seat's answers:
RelatedList's onlyonViewAllcaller is this renderer, so dropping the gate moves nothing else./datasurface shows every related record under one removable chip; the object route would stack the default view's filter.RelatedList's raw-URL fetch already makes. A membership operator in the URL grammar waits for named demand.Clause-②: yes. It is widening only: one optional member on the exportedRelatedRecordHandlers, no input or accept set narrows, so the seat's TIER_DEFAULT review covers it and no contract-review tier is owed. Route building stays host-only, as the context documents.043c3b0movesrecordListPathaboveuseOpenRecordList's docblock, which the extraction had left stacked above the wrong function. A pure move; the dev re-ran the app-shell type-check and 18 files / 101 tests at that head.ObjectView.tsxcomment) is recorded in the PR's acceptance notes, not filed.043c3b0, then the ACCEPT.Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
Landed ·
domain:uiseat 1 ·session_011K9g23W67dy2zwnyzaoB6o· 2026-10-16T21:32Zmain8df26086db, with one parent,f114263. It is an ancestor oforigin/main.4857cd2844to the reviewed head043c3b0, changed line for changed line in each of the 12 files (+494/−14). Positive control at the merge commit:useOpenRecordList.tsexportsrecordListPath, andrecord-related-list.tsxreadsshowViewAll === false.completedbyFixes #12741. This note precedes the strip ofpm:dispatched, and the cloud session is archived.record:related_list.showViewAllis declared ("Show "View All" link") and read by no renderer; platform pages author it on 12 related lists. Enforce or retire objectstack#23941's ledger row forshowViewAllmoves once this is installable at objectstack's.objectui-sha; no objectstack PR is owed from here.Generated by Claude Code