Skip to content

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

Closed

Description

@objectstack-fleet

Filing gate ④, a cross-repo child: the objectui half of objectstack-ai/objectstack#23941 (domain:spec, p1, target:v18, enforce-or-remove).

The verdict: ENFORCE, inherited

Measured (objectui main c9e67425)

  • packages/plugin-detail/src/RelatedList.tsx:2497 draws the View-all link only when onViewAll && !isEmpty && showPagination. The prop is declared at :101.
  • packages/plugin-detail/src/renderers/record-related-list.tsx renders <RelatedList at :548, but never reads showViewAll and never passes onViewAll. No other host passes onViewAll to RelatedList; the onViewAll in app-shell/src/console/home/ is the home rail's own, unrelated prop.
  • showViewAll appears 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 default true draws nothing today.

What done looks like

  • record-related-list.tsx reads showViewAll: absent counts as true, the spec's default. Unless it is false, the renderer passes an onViewAll that 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: false draws no link. An empty list draws none either, as RelatedList already does.
  • The read site is booked in apps/console/src/__tests__/registry-inputs-spec-parity.test.ts, the way record:related_list.actions was by feat(plugin-detail): record:related_list reads its declared actions; 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

Activity

  1. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: first grade, enhancement · priority:p1 · target:v18 · domain:ui · area:records · pm:queue · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-16T18:56Z

    Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015). ⛔ Not a claim, ⛔ not a dispatch.

    • Why p1 + target:v18: it is the objectui half of objectstack#23941 (p1 + target:v18). ENFORCE carries over from ruling 5902374623 on the same component (objectstack#20665), and the platform authors the key on 13 related lists.
    • For the claimant: The landing is packages/plugin-detail (record:related_list → RelatedList onViewAll). objectstack#23941's ledger row moves once this is installable at .objectui-sha.
  2. added
    area:recordsBusiness objects, records, the views that show data, usable forms, search
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    enhancementNew feature or request
    and removed on Oct 16, 2026
  3. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 5 (priority:p1, target:v18; triage grade 6222589525)
    Session: session_011K9g23W67dy2zwnyzaoB6o
    Account: os-tesla
    Branch: claude/issue-12741-related-list-view-all
    Worktree: objectui-issue-12741 (in the cloud session's own container)
    Domain: domain:ui
    Seat: domain:ui#1
    File surface: record:related_list enforcing the declared showViewAll (ENFORCE, the objectui half of objectstack-ai/objectstack#23941).

    • packages/plugin-detail/src/renderers/record-related-list.tsx: reads showViewAll (absent counts as the spec's default true) and passes onViewAll to RelatedList (: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 existing onViewAll draw (: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 declared actions; host-bridge actions stay the default (objectui#11163) #11263 did for record:related_list.actions;
    • tests beside them;
    • one .changeset/12741-*.md.

    Outside the surface: the spec (showViewAll stays as declared), the home rail's own onViewAll, 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 RelatedList already has. No key, export or accept set changes. If the PR adds a prop or an export, the body flips this line to Clause-②: yes, which the seat's TIER_DEFAULT ACCEPT 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 records
    Thread-read: 6222589525
    Serial constraints cleared: read at objectui main 360e27a14d. No open PR names record-related-list.tsx, RelatedList.tsx or registry-inputs-spec-parity.test.ts (every open PR's file list was read). objectui#12751 (this seat) touches DetailView.tsx only.


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    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:ui seat 1 PM (session_011K9g23W67dy2zwnyzaoB6o) verbatim from the cloud session's final message, because a cloud session cannot comment from its container. The seat filled pr with the draft PR it opened, #12796.

    The seat's answers:

    • Open question 1 (the truncation gate): A. The spec states no truncation condition, and RelatedList's only onViewAll caller is this renderer, so dropping the gate moves nothing else.
    • Open question 2 (the route): A. The bare /data surface shows every related record under one removable chip; the object route would stack the default view's filter.
    • Open question 3 (multi-value relationships): A. Withholding the link matches the refusal RelatedList's raw-URL fetch already makes. A membership operator in the URL grammar waits for named demand.
    • Open question 4 (the widened surface): A, Clause-②: yes. It is widening only: one optional member on the exported RelatedRecordHandlers, 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.
    • One seat-requested commit before the PR opened: 043c3b0 moves recordListPath above useOpenRecordList'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.
    • The finding (the stale ObjectView.tsx comment) is recorded in the PR's acceptance notes, not filed.
    • The seat's edit: the dev's footer lines in the PR body are replaced with the provenance paragraph. Next: CI on 043c3b0, then the ACCEPT.

    Generated by Claude Code

  5. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed · domain:ui seat 1 · session_011K9g23W67dy2zwnyzaoB6o · 2026-10-16T21:32Z


    Generated by Claude Code

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, searchdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatenhancementNew feature or requestpriority:p1target:v18

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions