Skip to content

record:related_list: actions: [] still draws "New" — a page cannot drop the create button from one related list #26182

Closed

Description

@objectstack-fleet

Filing class: ① user-visible defect — reach: public door, measured in a browser on 18.1.0 with objectstack-ai/hotclm main (pnpm demo:zh). Reader: the UI lane, ui/packages/plugin-detail (RelatedList.tsx / renderers/record-related-list.tsx) and the spec's RecordRelatedListProps.

Business reason

A related list often shows children that must only be created through a process (a renewal through its flow, a version through upload, a signature round through signing). The page author says so with actions: [], and the list still offers a generic New that opens the raw object form with the relationship prefilled — bypassing the process and showing users a form of mostly refused fields.

Measured

hotclm's contract page declares its Renewals list with actions: [] (src/pages/contract_detail.page.ts, contract_renewals, comment: "None of the contract's own list actions"). As a business requester the list still shows 新建, which opens ?form=new&formObject=clm_contract&formLink=renewed_from:<id> — the full contract form, status select included.

Why

RelatedList.tsx draws New whenever the host passes onNew; the host omits it only when the parent object's userActions.create.visibleWhen is false (#4646). actions governs the toolbar list only, so there is no per-component way to drop New.

Expected

actions: [] (or a declared create: false on record:related_list) suppresses New on that list, independent of the object-wide userActions.create.

App-side card: objectstack-ai/hotclm#136.

Dedupe: objectstack and the archived objectui issues (2,000 most recently updated each, all states) grepped for related list … New|create … hide|disable|suppress — 0 hits; #4646 (greyed New) and objectui#12870 (toolbar on parentDataSource lists) are neighbours.


Filed from the hotclm browser regression thread (2026-10-26); maintainer: 「平台的问题应该提交issue到平台」.

Activity

  1. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: first grade — bug · priority:p2 · domain:ui · area:records · pm:queue · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-26T15:56Z

    ⛔ Not a claim, ⛔ not a dispatch.

    • p2: actions: [] on a related list is ignored, so a generic New bypasses the process the page author meant (renewal flow, upload, signing). An explicit empty list means no actions; absent keeps the defaults.

    Generated by Claude Code

  2. added
    area:recordsBusiness objects, records, the views that show data, usable forms, search
    bugSomething isn't working
    and removed on Oct 26, 2026
  3. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1
    Session: session_017iXjUm1rujwDk7f3KT1Pkk (seat); implementing card thread session_01V5ckU1cUgQX9SC8V9TG3dh
    Account: os-steve
    Branch: claude/project-thread-pp8ksi (platform-assigned card-thread branch; a card thread can push only its assigned branch, and the name carries no issue number, so this claim is the identity record)
    Worktree: the card thread's own container
    Domain: domain:ui
    Seat: domain:ui#1
    File surface: ui/packages/plugin-detail (RelatedList.tsx, renderers/record-related-list.tsx), the app-shell host that passes onNew only if it must change, tests beside them, a root .changeset/ patch, and the re-recorded scripts/sdui-manifest.sources/plugin-detail.json. ⛔ No spec key: ui-only via a declared actions: [] (stop on breach; explain in the report). ⛔ ui/.github/** and the root .github/workflows/ci.yml are out of bounds (maintainer's word, ui-merge epic in flight). Changeset in the root .changeset/.
    Container & model: small, mode:thread, model: TIER_DEFAULT (dispatch-gates --tier: no path-derived mandate), effort: medium
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a: renderer defect in ui/, the producing code is the cited ui file; no platform path covers it; reached through the public Console
    Thread-read: 6420626426
    Premise: holds (triage graded p2 15:57Z; origin/main 3d50a43b: RelatedList.tsx:2390 still draws New on {onNew && (, and onNew is withheld only by the object-wide create gate; read-only check by the seat 2026-10-26T17:35Z). Borrowed from seat 2 (#25995) by agreement at 17:32Z, under the priority-first rule
    Serial constraints cleared: plugin-detail line: lands after #26060 (armed) and #26055; merges origin/main and re-records before landing

    Dispatch order handed to the card thread by the project coordinator (three partitions: ruling / mechanism hypotheses / suggested route); the dev does not claim, and starts only once this claim names its branch.

  4. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 26182,
      "status": "done",
      "branch": "claude/project-thread-pp8ksi",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/26277",
      "session": "session_01V5ckU1cUgQX9SC8V9TG3dh",
      "premise_still_valid": true,
      "summary": "record:related_list now withholds the built-in New when actions is authored as []: record-related-list.tsx adds createWithheldByAuthor (an authored array of length 0) and passes onNew undefined for that list, independent of the child object's userActions.create. Absent or non-empty actions keep the host's onCreate; row View/Edit/Delete and add are untouched; no host or spec change. The old pin 'actions: [] ... while New stays' was inverted; per #20665 ruling 5902374623 the authored list is what renders. Declared Metadata-protocol: semantic (claim said none; seat 1 agreed to amend), changeset @object-ui/plugin-detail minor. README documents it. No in-repo producer authors actions: [] on a related list (measured at 3d50a43b), so no shipped page loses New.",
      "tests": "head 58a07ee6 (code 16f675b7; e7398539 sdui digest; 58a07ee6 merge of origin/main). pnpm --dir ui exec vitest run packages/plugin-detail/src/__tests__/RecordRelatedListRenderer.authoredActions-11163.test.tsx: 15/15 passed. Ablation via scripts/ablation-replace.mjs (onNew back to handlers?.onCreate): 2 failed / 13 passed, both [] cases red; restored, blob == HEAD, git diff HEAD empty (test imports src, no dist leg). pnpm --dir ui exec vitest run --maxWorkers=2 packages/plugin-detail/: Test Files 304 passed | 1 skipped, Tests 2828 passed | 18 skipped, exit 0. pnpm --filter @object-ui/plugin-detail type-check: exit 0. Console build (turbo --filter=@object-ui/console) after the merge: 71/71, VERDICT command-exit 0.",
      "gates": "dispatch-gates --commands at e7398539: 47 derived families, each run, each exit 0 (incl. check-sdui-manifest, check-changeset-no-major --base origin/main, check-adr-0087-registration --base origin/main, check-empty-changeset, check-closing-keyword-parity, check:nul-bytes, check:published-files, check:type-check-coverage/debt). --ran with exit codes: 47 run, 0 NOT-MEASURED (derived zero). check-sdui-manifest re-run after the main merge: exit 0. ui check:new-line-citations: 0 new. CI check-runs on #26277: in_progress at report time (not awaited).",
      "dogfood_battery": "n/a — no ! in the PR title and Clause-② carries no (narrowing) arm",
      "mcp_calls": "5 — mcp__github__issue_read x5 (get/get_comments on #26182 twice for comments, get/get_comments on #20665); no write tools",
      "api_writes": "2 — relay pr_create (POST /repos/objectstack-ai/objectstack/pulls, draft, run 40377885923) and this os-dev-report comment via post-stamped.mjs (POST issues/26182/comments); plus git push (not REST)",
      "open_questions": [
        {
          "question": "Claim line Metadata-protocol: none vs PR/changeset semantic",
          "options": [
            "A amend the claim to semantic",
            "B keep none and drop the changeset to patch"
          ],
          "recommendation": "A, because the value [] keeps its shape but changes meaning (New now withheld), which AGENTS.md defines as semantic; seat 1 already agreed"
        }
      ],
      "out_of_scope_findings": [
        "carrier: none · noted, not filed — only [] withholds New; a page cannot say 'these actions and no New' (PR Acceptance notes)",
        "carrier: none · noted, not filed — spec describe on RecordRelatedListProps.actions is silent on New; ui-only card, left to the spec lane (PR Acceptance notes)"
      ]
    }

    Generated by Claude Code

  5. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim amendment (seat domain:ui#1, 2026-10-26T18:30Z): amends the claim 6423034503 after the dev's measurement (report 6424138574). Append-only.

    Metadata-protocol, replaced: semantic. An authored actions: [] on record:related_list now also withholds the built-in New on that list. Before, it withheld only the authored actions, and objectui#11163's pin kept New. Absent or non-empty actions render exactly as before. The changeset takes minor on @object-ui/plugin-detail, as AGENTS §3 requires for a protocol kind. Clause-② stays no, because no exported type or runtime export changes. The seat's TIER_DEFAULT contract review is recorded on PR #26277.

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, searchbugSomething isn't workingdomain:uipriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions