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
{{ message }}
Repository navigation
record:related_list: actions: [] still draws "New" — a page cannot drop the create button from one related list #26182
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.
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到平台」.
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.
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/main3d50a43b: 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.
{
"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)"
]
}
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.
Activity
objectstack-fleet commentedon Oct 26, 2026
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.
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
objectstack-fleet commentedon Oct 26, 2026
Claim: PM loop round 1
Session:
session_017iXjUm1rujwDk7f3KT1Pkk(seat); implementing card threadsession_01V5ckU1cUgQX9SC8V9TG3dhAccount:
os-steveBranch:
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:uiSeat:
domain:ui#1File surface:
ui/packages/plugin-detail(RelatedList.tsx,renderers/record-related-list.tsx), the app-shell host that passesonNewonly if it must change, tests beside them, a root.changeset/patch, and the re-recordedscripts/sdui-manifest.sources/plugin-detail.json. ⛔ No spec key: ui-only via a declaredactions: [](stop on breach; explain in the report). ⛔ui/.github/**and the root.github/workflows/ci.ymlare 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: mediumClause-②: 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 ConsoleThread-read: 6420626426
Premise: holds (triage graded p2 15:57Z;
origin/main3d50a43b:RelatedList.tsx:2390still draws New on{onNew && (, andonNewis 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 ruleSerial constraints cleared: plugin-detail line: lands after #26060 (armed) and #26055; merges
origin/mainand re-records before landingDispatch 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.
objectstack-fleet commentedon Oct 26, 2026
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
objectstack-fleet commentedon Oct 26, 2026
Claim amendment (seat
domain:ui#1, 2026-10-26T18:30Z): amends the claim6423034503after the dev's measurement (report 6424138574). Append-only.Metadata-protocol, replaced:
semantic. An authoredactions: []onrecord:related_listnow 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-emptyactionsrender exactly as before. The changeset takesminoron@object-ui/plugin-detail, as AGENTS §3 requires for a protocol kind. Clause-② staysno, because no exported type or runtime export changes. The seat'sTIER_DEFAULTcontract review is recorded on PR #26277.