Repository navigation
setup: Invitations grid nests <a> inside <a>, Invite User gives no success feedback, and param dialogs share a generic subtitle #11817
Description
Activity
- addedbugSomething isn't workingSomething isn't workingdomain: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 seatarea:accessPermissions that actually hold — RLS/FLS, sharing model, write-path guardsPermissions that actually hold — RLS/FLS, sharing model, write-path guards
on Oct 7, 2026 objectstack-fleet commented
on Oct 7, 2026 ContributorAuthorMore actionsPath: ② the capabilities an end user meets in the app — inviting a user | 缺项 | P3
Triage: first grade,
bug·priority:p3·domain:ui·area:access·pm:queue. Direction as the body proposesTriage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-07T17:41Z. ⛔ Not a claim, ⛔ not a dispatch.Triage: lands in the Invitations grid's cell renderer, the action-parameter dialog (its shared subtitle,
packages/i18n/src/locales/en.ts:3355) and the toast after a parameter action ⇒domain:ui; rationale: a Studio or console surface in objectui. Filed from the browser QA pass of 2026-10-07 (objectstack879bd38c, objectui179f6fe9); paths re-read on objectuimain9990f9e122.- Why p3: the invitation is created and sent; the user is not told.
- Direction:
- a toast naming the invitee after the action (the action's
successMessagewhen present) - no
<a>inside<a>in the grid - the dialog subtitle comes from the action's own description when present
- a toast naming the invitee after the action (the action's
Clause-②: no. Patch changeset in objectui.
objectstack-fleet commented
on Oct 8, 2026 ContributorAuthorMore actionsClaim: PM loop round 3
Session:session_01CGZy1BGCjdN5cXqL9cnvB8
Account:os-support-ai
Branch:claude/issue-11817-invite-feedback
Worktree:objectui-issue-11817
Domain:domain:ui
Seat:domain:ui#3
File surface (on9b530d8):packages/app-shell/src/views/ActionParamDialog.tsx: the subtitle (state.description || t('actionDialog.description'), about:493) and the code that fillsstate.descriptionfrom the action;- the success toast after a parameter action: the list toolbar's
apiaction path (likelypackages/app-shell/src/hooks/useConsoleActionRuntime.tsx). The dev measures which runtime the Users list's Invite User runs through and names the file before editing it; - the Invitations grid's nested anchor: the cell renderer that draws an
<a>inside the row's or cell's link. The dev measures which renderer it is and names the file before editing it; - the tests beside these;
.changeset/11817-*.md.
⛔ Not on it:
packages/components/src/renderers/action/(this seat's objectui#11839);packages/i18n/**(a new key there widens the publishedTranslationKeys, aClause-②stop); objectstack's metadata (theinvite_useraction's own text is objectstack's to declare). Any file outside this list: the dev reports it before opening the PR (stop on breach; explain in the report)
Container & model:M,mode:subagent,model: opus(dispatch-gates --tier --repo objectstack-ai/objectui: no path-derived mandate; default tier)
Clause-②: no
Responsibility:objectui app-shell + the grid cell renderer: after Invite User the dialog closes with no toast although the action declares successMessage 'Invitation sent'; the Invitations grid nests an <a> inside an <a>; every parameter dialog shows the same generic subtitle | the platform path: the action spec already carries successMessage and an optional description, and ActionParamDialog already prefers state.description over the generic line | every administrator inviting a user from Setup, and every user of a parameter action
Thread-read: 6043474473
Serial constraints cleared:noneblocking. No in-flight claim in the lane namesActionParamDialog.tsx,useConsoleActionRuntime.tsxor a grid cell renderer, and no open objectui PR touches them (read 2026-10-08T02:32Z). No otherarea:accesscard is in flight.Why
Clause-②: no: behaviour inside@object-ui/app-shelland a cell renderer, reading keys the action spec already declares. A published export, prop, type member or language-pack key is a stop: the dev reports it before opening the PR, and the seat amends this line.
Generated by Claude Code
objectstack-fleet commented
on Oct 8, 2026 ContributorAuthorMore actionsos-dev-report
{
"issue": 11817,
"status": "done",
"branch": "claude/issue-11817-invite-feedback",
"pr": "#11885",
"session": "session_01CGZy1BGCjdN5cXqL9cnvB8 (subagent mode: the parent's id)",
"premise_still_valid": false,
"summary": "Partly falsified: one of the card's three claims is an objectui defect, and the PR fixes that one and pins the other two. (1) TOAST: not reproduced in objectui. Through the real ObjectView, action:bar, action:button, ActionRunner, console runtime and ConsoleToaster (sonner unmocked), Invite User with the served sys_user shape renders the declared successMessage 'Invitation sent' in the toaster DOM after Confirm. Zone 2 hypothesis 1 (the list-toolbar path drops successMessage) is refuted. No real-browser reading exists, so why the reporter's browser saw no toast is not measured. (2) SUBTITLE: objectui already subtitles a parameter dialog with a declared description (served ban_user shape). invite_user and approval_approve declare none, so the generic line is right for them; their descriptions are objectstack metadata. (3) NESTED ANCHOR: reproduced. The Invitations list's first column is email, and EmailCellRenderer drew its mailto anchor and copy button inside the primary-field record anchor. Fixed in packages/plugin-grid: a link cell draws the self-linking types (email, url, phone, file, video, audio) with their text face (linkCellRenderer in cellRendererResolution.ts), and renders its children with the host's recordHref and openRecord withheld, so a reference prints its name. A census over every listCellRendererTypes() type in a link column found the file family, which then joined the set; the census now holds the class. The PR opens with 'Fixes #11817' as dispatched: objectui's share of every claim is either fixed or measured not to be an objectui defect, and the metadata halves go to objectstack (out_of_scope_findings).",
"tests": "All runs at the worktree root through os-verify-lock (slot os-dev-11817). UNION at 484906c (the head, after merging main 04c8f56): pnpm exec vitest run --maxWorkers=2 packages/plugin-grid/ plus app-shell ObjectView.inviteFeedback-11817, ObjectView.emptyStateMatchesPage-11687, ActionParamDialog and useConsoleActionRuntime.paramDialogTitle gave 'Test Files 193 passed (193)', 'Tests 1816 passed (1816)', UNION_EXIT=0, 'VERDICT command-exit 0'. Earlier at 27653b8: plugin-grid package plus the new app-shell pin gave 'Test Files 190 passed (190)', 'Tests 1753 passed (1753)'. ABLATION, through /home/user/objectstack/scripts/ablation-replace.mjs on committed state, src-aliased so there is no dist leg. Leg 1 at 1edf68a disabled the text-face substitution (anchor x1 to x0, blob aeb945d to d331049): 7 failed and 10 passed (the email, url, phone and file first columns, the link:true email column, the census, the Invitations end-to-end case), then 'ok restored: blob == HEAD (aeb945d86253) and git diff HEAD is empty'. Leg 2 at 27653b8 removed the RelatedRecordActionsProvider override: the first attempt was a NO-OP, refused by the tool ('the replacement count moved 2 -> 2'), so nothing landed. The re-run with unique replacement '{children /* ablation-11817 /}' (x0 to x1, blob 63df3a1 to c868190) gave 2 failed and 8 passed (the reference-in-link-column case and the census), then 'ok restored: blob == HEAD (63df3a1d892b)'. React's nested-anchor warning appears in the census run before the file family joined the set (1 hit) and in ablation leg 1 (2 hits), and in no unmutated run since (0). TYPE-CHECK at 27653b8, after 'pnpm --workspace-concurrency=2 --filter @object-ui/app-shell^... build' (BUILD_EXIT=0): 'pnpm --filter @object-ui/plugin-grid type-check' TC_GRID_EXIT=0 and 'pnpm --filter @object-ui/app-shell type-check' TC_SHELL_EXIT=0. Both scripts echoed 'tsc --noEmit && tsc -p tsconfig.test.json', and both tsconfig.test.json include src/**/.test.tsx. LINT: eslint on the 4 touched files gives 0 errors; ObjectGrid.tsx has 207 warnings at HEAD and 207 at base (base file linted in place); the new tests have 0.",
"mcp_calls": "0 (no MCP GitHub tool called)",
"api_writes": "3 REST writes, each through the fleet-write relay (each relay write is one POST /repos/objectstack-ai/objectstack/dispatches executed as objectstack-fleet[bot]): (1) pr_create POST /repos/objectstack-ai/objectui/pulls opened draft #11885, read back 7435 bytes sent and 7435 stored, identical; (2) label-write --assign os-support-ai POST /repos//issues/11885/assignees, read back 'MATCHES the target', with no label writes; (3) this os-dev-report comment, POST /repos//issues/11817/comments. git push is not counted (branch claude/issue-11817-invite-feedback).",
"open_questions": [
{
"question": "Should #11885 keep 'Fixes #11817'? The toast's absence in the reporter's real browser is not measured. One candidate, not measured: sonner's 4s lifetime is shorter than a snapshot taken a turn after Confirm.",
"options": [
"A: keep Fixes. objectui's share is done; the copy and description halves go to an objectstack card.",
"B: the seat edits the PR's first line to 'Part of #11817' until a booted-showcase reading of the toast exists."
],
"recommendation": "A. The real chain renders the toast in the DOM (pinned, with a control), and nothing in objectui drops it. A live reading is a QA task, not an objectui change."
}
],
"out_of_scope_findings": [
"class: a · reach: public door, Setup > Users > Invite User (and Approvals > Approve). The parameter dialog's subtitle reads 'Please provide the required information to continue.', because the action declares no description; objectui renders a declared one (pinned in ObjectView.inviteFeedback-11817.test.tsx with the ban_user shape). · evidence: objectstack 15ec50e5 packages/platform-objects/src/identity/sys-user.object.ts, sys-invitation.object.ts and sys-member.object.ts, each entry name: 'invite_user' with successMessage: 'Invitation sent' and no description key; packages/plugins/plugin-approvals/src/sys-approval-request.object.ts, entry name: 'approval_approve' with no description, while approval_reject beside it declares one. The generated translation bundles (packages/platform-objects/src/apps/translations/.objects.generated.ts) would gain the matching description entries. · Seat: objectstack metadata, consumer ActionParamDialog via useConsoleActionRuntime paramCollectionHandler. · dedupe words: invite_user description · approval_approve description · param dialog subtitle metadata",
"class: a · reach: public door, Setup > Users > Invite User > Confirm toasts 'Invitation sent', which names nobody, where the card expects a toast naming the invitee. Measured through the real chain in happy-dom, not live. · evidence: the runner fills ${result.} from the answer (objectui#11344); the pin shows copy reading ${result.email} toasting 'Invitation sent to ada@example.com'. objectstack's invite_user entries (the same three files, successMessage: 'Invitation sent') and their generated bundle entries (_actions.invite_user.successMessage, which win over the authored literal) would both change. That the live invite-member answer carries email is read from auth-route-ledger.ts (source: better-auth), not measured. Same family as the finding above; one objectstack card suggested. · dedupe words: invite_user successMessage invitee · invitation sent toast email · result.email success copy",
"carrier: 承接者:无 · noted, not filed (Acceptance notes of #11885): a rich-text value (markdown or html) whose content holds a link, drawn in a link column, still nests that link, because the content draws it; no shipped list is measured with such a primary or link column.",
"carrier: 承接者:无 · noted, not filed: an image cell's '+N' button inside a link column is a button inside an anchor; React does not warn and no shipped list is measured.",
"carrier: 承接者:无 · noted, not filed (read-only inference): useConsoleActionRuntime paramCollectionHandler's useCallback dependencies omit actionDescription and language, so a language switch could leave the dialog's description resolver stale; not measured."
],
"gates": [
{
"command": "pnpm exec vitest run --maxWorkers=2 packages/plugin-grid/ + 4 app-shell files (at 484906c)",
"exit": 0,
"verdict": "Test Files 193 passed (193) / Tests 1816 passed (1816)"
},
{
"command": "pnpm --filter @object-ui/plugin-grid type-check (at 27653b8, deps built)",
"exit": 0,
"verdict": "TC_GRID_EXIT=0"
},
{
"command": "pnpm --filter @object-ui/app-shell type-check (at 27653b8, deps built)",
"exit": 0,
"verdict": "TC_SHELL_EXIT=0"
},
{
"command": "pnpm exec eslint (4 touched files)",
"exit": 0,
"verdict": "0 errors; ObjectGrid.tsx warnings 207 = base 207"
},
{
"command": "pnpm check:control-bytes",
"exit": 0,
"verdict": "check-control-bytes: OK (scanned 7896 tracked text file(s); skipped 85 binary)"
},
{
"command": "pnpm check:test-path-roots",
"exit": 0,
"verdict": "check-test-path-roots: OK"
},
{
"command": "pnpm check:changeset-claims",
"exit": 0,
"verdict": "No pending changeset names a file this change touches."
},
{
"command": "pnpm check:pending-changeset-literals",
"exit": 0,
"verdict": "No test source names a pending changeset."
},
{
"command": "pnpm check:new-line-citations",
"exit": 0,
"verdict": "VERDICT new-cross-file-line-citations: 0 new citation(s), enforcement report-only -> exit 0"
},
{
"command": "pnpm check:vi-mock-specifiers",
"exit": 0,
"verdict": "check-vi-mock-specifiers: OK"
},
{
"command": "pnpm check:vi-mock-inherit",
"exit": 0,
"verdict": "check-vi-mock-inherit: OK"
},
{
"command": "pnpm check:vi-mock-override-shape",
"exit": 0,
"verdict": "check-vi-mock-override-shape: OK"
},
{
"command": "pnpm check:phantom-deps",
"exit": 0,
"verdict": "Every in-scope import is declared by the package that publishes it."
},
{
"command": "node scripts/check-changeset-presence.mjs",
"exit": 0,
"verdict": "4 source file(s) of 2 released package(s) changed, and this change declares 1 changeset(s): .changeset/11817-link-cell-no-nested-anchor.md"
},
{
"command": "CI on 484906c (one read, no waiting)",
"exit": null,
"verdict": "in_progress: 42 checks, 23 completed, 19 in progress, 0 failed at read time"
},
{
"command": "check:i18n-* and check:readme-exports",
"exit": null,
"verdict": "not run: no locale pack and no export changed"
}
],
"deviations": [
"No toast or subtitle code change. ActionParamDialog.tsx and useConsoleActionRuntime.tsx are untouched because no objectui defect was found there. The dispatch's toast-fix ablation therefore has nothing to ablate. Both claims are pinned end to end with controls instead.",
"The anchor fix covers its whole class inside the link cell, not only email: url, phone, the file family (found by the census) and references. This is the same defect class, a mechanical fix, files no other claim holds, and the same gate family. The file is named here and in the PR body (packages/plugin-grid/src/ObjectGrid.tsx LinkCell, and cellRendererResolution.ts). Subagent mode had no channel to name it to the seat before editing.",
"Out-of-scope findings cite file and symbol plus a quoted string, not line numbers. objectui AGENTS.md #11 bans line addresses in card and PR text, and this report is posted on an objectui card.",
"No real-browser reading: no showcase backend was reachable (the objectstack checkout is unbuilt, no node_modules). Pinned through real components in happy-dom instead.",
"Ablation leg 2's first attempt was a no-op, which the tool refused; it was re-run with a unique replacement. Three lock attempts ended in queue-timeout (exit 99, never acquired), read as NOT MEASURED and re-run.",
"Merged main (04c8f56, merge 484906c; no rebase) after work began. The union was re-run at 484906c. Type-check was measured at 27653b8, before the merge. The merge touched no file in this diff and nothing in plugin-grid; its app-shell and components changes are verified on main.",
"The full packages/app-shell/ suite was not run locally and is left to CI. This PR adds only a test file there; plugin-grid's public surface is unchanged, and no other app-shell test asserts link-cell or mailto anchors in a grid (git grep).",
"Commits carry the model-free trailer pair (objectui AGENTS.md) in place of the harness reminder's model-named Co-Authored-By."
],
"files_changed": [
"packages/plugin-grid/src/ObjectGrid.tsx",
"packages/plugin-grid/src/cellRendererResolution.ts",
"packages/plugin-grid/src/tests/ObjectGrid.linkCellNoNestedAnchor-11817.test.tsx (new)",
"packages/app-shell/src/views/ObjectView.inviteFeedback-11817.test.tsx (new)",
".changeset/11817-link-cell-no-nested-anchor.md (new, @object-ui/plugin-grid patch)"
],
"line_budget": "not applicable (no skills/** surface)"
}objectstack-fleet commented
on Oct 8, 2026 ContributorAuthorMore actionsClaim amendment —
domain:uiseat 3,session_01CGZy1BGCjdN5cXqL9cnvB8, 2026-10-08T04:29Z. It amends claim6050975750after the dev's report6052210555(PR objectui#11885). The claim stands otherwise.- File surface, as measured:
- The nested anchor is fixed where the outer anchor lives:
packages/plugin-grid/src/ObjectGrid.tsx'sLinkCelland its two link-column branches, pluslinkCellRendererinpackages/plugin-grid/src/cellRendererResolution.ts. A link cell draws the self-linking types (email, url, phone, file, video, audio) as their text, and hides the host's record destination from a reference inside it. The claim named "the cell renderer … the dev names the file"; these are those files. ActionParamDialog.tsxanduseConsoleActionRuntime.tsxare untouched. The dev measured no objectui defect there: the declaredsuccessMessagereaches the toaster, and a declareddescriptionis the dialog's subtitle. Both are pinned end to end, with controls.
- The nested anchor is fixed where the outer anchor lives:
- The dev's open question (keep
Fixes #11817, orPart of) is answered A: keepFixes. objectui's share of each of the card's three expectations is now either fixed (the anchor) or measured to work as declared (the toast, the subtitle). The rest is objectstack metadata:invite_userandapproval_approvedeclare nodescription, andinvite_user'ssuccessMessagenames nobody. That is filed as platform actions:invite_userandapproval_approvedeclare nodescription, so their parameter dialogs show the generic subtitle, and Invite User's success message names nobody objectstack#22182, which carries it. Why the reporter's browser showed no toast is not measured, and it is noted there as a QA reading, not an objectui change. - Overlap declared: seat 2's objectui#11816 may edit
packages/plugin-grid/src/ObjectGrid.tsxwhere the Edit inline toggle or the second Actions column comes from. That is a different region fromLinkCell. No PR of it is open (read 2026-10-08T04:29Z). Whoever lands second mergesmain. Clause-②: nostands: no export, prop, type member or language-pack key.linkCellRendereris module-internal to@object-ui/plugin-grid.
Generated by Claude Code
- File surface, as measured:
objectstack-fleet commented
on Oct 8, 2026 ContributorAuthorMore actionsACCEPT —
domain:uiseat 3,session_01CGZy1BGCjdN5cXqL9cnvB8, 2026-10-08T04:41Z. PR objectui#11885, head484906c.-
PR shape: draft against
main, with04c8f56merged in (no rebase).git merge-treeof the currentmain(bfca7ec) and this head is clean; the queue tests that merge. First lineFixes #11817, kept as answered in claim amendment6052257828(A).Clause-②: noat line start. The five commits carry only the model-free trailer pair. Assigned toos-support-ai. -
Scope: 5 files, +664/−10, on the claim's surface as amended (
6052257828):packages/plugin-grid/src/ObjectGrid.tsx'sLinkCelland its two link-column branches;linkCellRendererinpackages/plugin-grid/src/cellRendererResolution.ts;- a new plugin-grid pin file, and a new app-shell pin file for the toast and the subtitle;
- the changeset (
patchon@object-ui/plugin-grid).
ActionParamDialog.tsxanduseConsoleActionRuntime.tsxare untouched: no objectui defect was found there.linkCellRendereris not re-exported from the package entry. No governed path. -
Diff read (the seat's own):
linkCellRenderer(type, Renderer)swaps in thetextface for the self-linking types (email,url,phone,file,video,audio) inside a link cell, throughgridCellRendererForFixedKey. Every other type, and anullrenderer, passes through.LinkCellrenders its children under aRelatedRecordActionsProvidercopy of the host withrecordHrefandopenRecordwithheld. So a reference (lookup,master_detail,tree) prints its name instead of a second anchor, following the context's own "cannot route" contract.- Both apply only to the link cell (the primary column, or
link: true). Other columns keep their anchors, copy buttons and download links.
-
The card's three expectations, measured:
- Valid DOM in the grid: fixed. A census over every
listCellRendererTypes()type in a link column found the file family too, which joined the set, and the census now holds the class. - A toast after Invite User: shown. Through the real
ObjectView→action:bar→ActionRunner→ console runtime →ConsoleToaster(sonner unmocked), the declaredsuccessMessage"Invitation sent" renders after Confirm. Zone 2 Implement visual designer for Object UI schemas #1 (the toolbar path drops it) is refuted. Why the reporter's browser showed none is not measured. - A subtitle per action: a declared
descriptionis the dialog's subtitle (pinned with the servedban_usershape).invite_userandapproval_approvedeclare none. - The metadata halves (no
description; asuccessMessagethat names nobody) → filed platform actions:invite_userandapproval_approvedeclare nodescription, so their parameter dialogs show the generic subtitle, and Invite User's success message names nobody objectstack#22182.
- Valid DOM in the grid: fixed. A census over every
-
Changeset sentences checked against the head:
- "Inside a link cell, an email, URL, phone number or file (
file,video,audio) is now drawn as its text, so the cell is one link to the record"; - "a reference (
lookup,master_detail,tree) is drawn as its name rather than as a second link"; - "Every other column keeps its own links, copy buttons and download links as before".
- "Inside a link cell, an email, URL, phone number or file (
-
Reverse verification (dev report):
- Ablation leg 1 (the text-face substitution off): 7 red, among them the Invitations end-to-end case and the census.
- Ablation leg 2 (the provider override removed): 2 red, the reference case and the census.
- Both restored with the blob equal to HEAD. React's nested-anchor warning appears only in the mutated runs.
packages/plugin-grid/plus the four app-shell files at484906c: 193 files, 1816 tests passed. Both type-checks exited 0.
-
Overlap: seat 2's objectui#11816 may edit
ObjectGrid.tsxin another region, as declared in the amendment; it has no open PR. Whoever lands second mergesmain. -
Gates: CI on
484906c(head_shaequals the PR head): 43 runs, 40 success, 3 skipped (Test (coverage), its shard template,dependabot), 0 failure.LintandType Checkare success. Mergeable stateclean. -
Contract review: not required (
Clause-②: no).
Findings:
invite_user(three declarations) andapproval_approvedeclare nodescription, andinvite_user'ssuccessMessagenames nobody. This is objectstack metadata with a named producer → filed platform actions:invite_userandapproval_approvedeclare nodescription, so their parameter dialogs show the generic subtitle, and Invite User's success message names nobody objectstack#22182- A rich-text value holding a link, in a link column, still nests that link, and an image cell's "+N" button is a button inside an anchor. No shipped list is measured with either →
Acceptance notes paramCollectionHandler'suseCallbackdependencies may omitactionDescriptionandlanguage. That is a read-only inference, not measured →Acceptance notes
Landing: ready + auto-merge through the queue, now.
Generated by Claude Code
-
objectstack-fleet commented
on Oct 8, 2026 ContributorAuthorMore actionsLanded —
domain:uiseat 3,session_01CGZy1BGCjdN5cXqL9cnvB8, 2026-10-08T05:06Z. PR objectui#11885 merged through the queue as0aa8c0cat 2026-10-08T04:59Z.- The merge:
- One parent,
9cb4e29, an ancestor oforigin/main. - The landed tree equals
git merge-treeof that parent and the accepted head484906c(tree02983025on both). - 5 files, +664/−10.
- One parent,
- Content check,
9cb4e29→0aa8c0c, inpackages/plugin-grid/src/:linkCellRendererinObjectGrid.tsx: 0 → 5.- The link cell's
RelatedRecordActionsProvider value={unlinkedHost}: 0 → 1. - The package entry
index.tsxnameslinkCellRenderer0 times, so the helper stays internal. - Controls:
app-shell'sActionParamDialog.tsxandhooks/useConsoleActionRuntime.tsxare byte-identical on both sides, as the ACCEPT said (no objectui defect there).
- Closures: the PR's only closing keyword was
Fixes #11817, and this merge closed only objectui#11817 (04:59Z).pm:dispatchedis removed. - Follow-ups: the metadata half (
invite_user/approval_approvedeclare nodescription; the success message names nobody) is carried by platform actions:invite_userandapproval_approvedeclare nodescription, so their parameter dialogs show the generic subtitle, and Invite User's success message names nobody objectstack#22182, awaiting triage.
Generated by Claude Code
- The merge:
Filing gate ① — product defect with a named location and a reproduction. reach: Setup → Users → Invite User → Confirm, then Setup → Invitations.
Who acts on it: objectui triage → the console / records owner. ⛔ Not a claim. Found in a manual browser QA pass of the end-user console on 2026-10-07; filed one card per finding on the maintainer's word: 「你发现的问题全部提交 issue,然后继续测试前端」, and on the one-card-per-finding question 「覆盖规则,逐条立卡」.
What happens
sys_invitationpending,sys_emailsent), but the dialog closes with no success message.Expected
A toast naming the invitee; valid DOM in the grid; a dialog description per action (from the action's own description when present).
Suggested direction (triage to rule)
Show the action's
successMessageor a default toast after param actions; render nested links as non-anchor elements; use the action description as the dialog subtitle.Environment
objectstack
879bd38c·examples/app-showcasebooted withobjectstack dev --ui --seed-adminon an isolated port and SQLite file · objectui179f6fe9(HEAD; the framework pin.objectui-shaisa58626c8) served by the console's Vite dev server, perf numbers from avite buildof the same commit · Chromium 141 at 1440×900 · signed in as the seeded platform adminadmin@objectos.aiunless stated.Duplicate check
Dedupe words: invite user no success toast · invitations grid nested anchor · generic dialog subtitle param action
Filed by Claude Code (session
session_01D76mrPJrSSdaKRxR2rvrMG) from that QA pass.Generated by Claude Code