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
console list empty states: a member with no visible records reads "这里还没有数据 — 创建第一条记录即可开始" beside no Create button, and every "my …" view says only "没有匹配的记录" #25898
Filing gate ① a user-visible defect with a named landing site. Batch-of: 2026-10-25 browser pass on @objectstack/* 18.1.0 (23 cards: hotcrm 10, objectui 10, objectstack 3). Filed by the maintainer's account (os-steve) from the HotCRM pass driven in session session_01AwpXhq2nFKU6J7GmbCEmZu; ⛔ not a claim. Grade and routing are objectui triage's.
What is seen (HotCRM on @objectstack/console 18.1.0, demo org)
Signed in as a sales rep (sales_rep set, no case read), open /_console/apps/app.objectstack.hotcrm/crm_case. The list renders the object's seven view tabs, no 新建 button, and the empty state 「这里还没有数据 / 创建第一条记录即可开始。」. The database holds 38 cases; the member may read none. The text tells him the desk is empty and invites him to create a record he cannot create. r6-rep-cases.png.
As the dev admin (owns nothing after demo:staff), 我的商机 / 我的线索 / 我的工单 and the Sales Home 「My Leads」 tab all show 「没有匹配的记录 / 没有符合该视图筛选条件的记录。」 — correct, and useless: the view's filter is owner = current user, so the message a user needs is "you own no opportunities yet" with the create action. 35-crm_opportunity_view_my_open_deals.png,`` 39-crm_case_view_my_open_cases.png.```
reach: the public UI, measured once per case above.
Expected
Three empty states, chosen by what the list knows:
situation
the list knows
text
the object has no records the caller may create into
count 0 and the caller has create
"no records yet" + Create
the caller may read none (count 0, no create, or a 403 on the read)
no create permission / forbidden
"你没有可查看的工单" + who to ask; never "create the first one"
the view's own filter matches nothing
the view's filter is non-empty
today's text; when the filter is on current_user, "你还没有负责的 …" + Create when allowed
The third row is what hotcrm AGENTS.md rule 4 asks for: a default, not an emptyState authored on every "my" view.
Dedupe
MCP search_issues objectui "list empty state no data yet create first record shown when user lacks visibility permission" → 1 hit, objectstack-ai/objectui#11687 (closed: the invite / filter wording), which fixed two other contradictions and did not cover the no-visibility case or the owner-filter case. Report: REPORT.md §2.2–2.3.
⛔ Not a claim, ⛔ not a dispatch. finding comes off.
A member who may read none of 38 cases is told the desk is empty and invited to create one. The empty state should tell 'no records you can see' apart from 'no records', and offer Create only with the create grant.
Transferred 2026-10-26T03:03Z from objectstack-ai/objectui#13516, with its comments and timeline; the old URL redirects here. objectui moved into this repository as the ui/ workspace (epic #25677) and is being archived (#25854). The body is left exactly as filed.
Paths. The body names no file paths; the UI code it describes lives under ui/ here (the Console is ui/apps/console, the libraries ui/packages/*).
References. The bare issue numbers in the body were written in objectui and now resolve against this repository by mistake; read them as objectstack-ai/objectui#11687.
Claim: PM loop round 1
Session: session_017iXjUm1rujwDk7f3KT1Pkk (seat); implementing card thread session_01RYq63NT6L4eGmQNvE9e7D8
Account: os-steve
Branch: claude/project-thread-lr711r (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. Wording amended by the seat: an issue-shaped placeholder here was read by the Closing-Target Claim Guard as a second claimed branch)
Worktree: the card thread's own container
Domain: domain:ui
Seat: domain:ui#1
File surface: ui/packages/plugin-list/src/ListEmptyState.tsx, ui/packages/plugin-list/src/ListView.tsx (empty-state region ~6210-6234 and the inline list.* fallback table ~934-949), ui/packages/plugin-grid/src/ObjectGrid.tsx (empty-state region ~7476-7483 and fallback table ~499-502 only), ui/packages/plugin-list/src/ObjectGallery.tsx (~677), ui/packages/i18n/src/locales/*.ts (ten packs); tests (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: M, mode:thread, model: TIER_DEFAULT (dispatch-gates --tier: no path-derived mandate), effort: high
Clause-②: no (ListEmptyState is module-internal; the authored emptyState schema is unchanged)
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: 6407280247
Premise: holds (read-only premise check at origin/main59d9181, 2026-10-26T06:54Z; spot-checked by the seat)
Serial constraints cleared: ObjectGrid.tsx shared with #25858 by REGION (this card: empty state; #25858: group-header ordering); locale packs shared with #25916 (append-only keys); no open PR touches these files (open-PR file scan 2026-10-26T06:33Z)
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": 25898,
"status": "done",
"branch": "claude/project-thread-lr711r",
"pr": "https://github.com/objectstack-ai/objectstack/pull/25987",
"head": "8878ebe80ccf2feef4f35be4c93e9fe3e13d4478",
"session": "session_01RYq63NT6L4eGmQNvE9e7D8",
"premise_still_valid": true,
"summary": "ListEmptyState now picks two more cases: no filter and a caller KNOWN (permissions loaded) not to hold the listNew verdict reads 'No records you can see' and never draws the add-record action; a declared filter naming the signed-in user (resolved id or the {current_user_id} placeholder) reads 'Nothing of yours yet', Create only with the grant. ListView (grid+gallery), standalone ObjectGallery and ObjectGrid's default empty state decide the same way; four list.* keys in all ten locale packs and both in-code fallback tables. PM hypotheses held: copy chose from hasUserQuery/hasBaseFilter only, Create came from addRecord.enabled, ObjectGrid duplicated the decision, the 403 panel is its own state (untouched). The console host already withheld addRecord without the grant, so the visible defect was the copy.",
"tests": "head 8878ebe8: 3 new files (ListView 9, ObjectGallery 4, ObjectGrid 5) 18/18 pass via real MePermissionsProvider + FilterScopeProvider; reverse verification with sources + locales restored to base 38050ced: 11 failed / 7 passed as predicted, restored from HEAD, git diff HEAD empty; vitest run packages/plugin-list/ packages/plugin-grid/ packages/i18n/ + plugin-form affordanceGrantMap-12082 census: Test Files 498 passed, Tests 5253 passed / 13 skipped (lock VERDICT command-exit 0); type-check plugin-list, plugin-grid, i18n: exit 0",
"gates": "dispatch-gates --commands at cd633279 then 8878ebe8: 47 derived families run locally, each exit 0 captured before any pipe; check-sdui-manifest exit 1 before scripts/sdui-manifest.record.json was regenerated by gen-sdui-manifest-node.mjs, exit 0 after; --ran reconciliation exit 0: 47 accounted, 0 NOT-MEASURED (derived zero, every line carries its exit code). CI check-runs on PR 25987: in_progress at report time. Type-check lanes and wide-population families: declared to CI.",
"dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
"deviations": [
"files outside the Claim's File surface: scripts/sdui-manifest.record.json (registry hash re-record the check-sdui-manifest gate requires for any ui/packages source change; manifest itself byte-identical); the import lines at the top of ListView.tsx and ObjectGallery.tsx; three new test files; the root changeset",
"PR assignee os-steve (the card has none; the Claim names Account os-steve and the project asks for it)",
"merged origin/main into the branch once before opening the PR (no overlap with touched packages)"
],
"files_changed": [
".changeset/25898-list-empty-state-access.md",
"scripts/sdui-manifest.record.json",
"ui/packages/i18n/src/locales/{ar,de,en,es,fr,ja,ko,pt,ru,zh}.ts",
"ui/packages/plugin-grid/src/ObjectGrid.tsx",
"ui/packages/plugin-grid/src/__tests__/ObjectGrid.emptyStateAccess-25898.test.tsx",
"ui/packages/plugin-list/src/ListEmptyState.tsx",
"ui/packages/plugin-list/src/ListView.tsx",
"ui/packages/plugin-list/src/ObjectGallery.tsx",
"ui/packages/plugin-list/src/__tests__/ListView.emptyStateAccess-25898.test.tsx",
"ui/packages/plugin-list/src/__tests__/ObjectGallery.emptyStateAccess-25898.test.tsx"
],
"mcp_calls": "5 — reads only: issue_read x4 (get x1, get_comments x3), pull_request_read x1 (get), ToolSearch loads not counted; no MCP write tool",
"api_writes": "2 — git push (not REST), fleet-write relay pr_create (POST /repos/objectstack-ai/objectstack/dispatches; run 40289823098 success, body read back identical, assignee os-steve), this post-stamped comment (POST issues/25898/comments)",
"open_questions": [],
"out_of_scope_findings": [
"carrier: none · noted, not filed — ListView toolbar add-record buttons follow addRecord.enabled alone; only a non-console host could show them without the create grant (PR Acceptance notes)",
"carrier: none · noted, not filed — the filter walk is restated in ObjectGrid because @object-ui/core was outside the claimed surface; a shared helper there would remove the second copy"
]
}
Activity
objectstack-fleet commentedon Oct 25, 2026
Triage: first grade —
bug·priority:p2·domain:ui·area:records·pm:queue· triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-25T12:55Z⛔ Not a claim, ⛔ not a dispatch.
findingcomes off.Generated by Claude Code
objectstack-fleet commentedon Oct 26, 2026
Transferred 2026-10-26T03:03Z from objectstack-ai/objectui#13516, with its comments and timeline; the old URL redirects here. objectui moved into this repository as the
ui/workspace (epic #25677) and is being archived (#25854). The body is left exactly as filed.Paths. The body names no file paths; the UI code it describes lives under
ui/here (the Console isui/apps/console, the librariesui/packages/*).References. The bare issue numbers in the body were written in objectui and now resolve against this repository by mistake; read them as objectstack-ai/objectui#11687.
No stale
pm:dispatchedor assignee to strip.Generated by Claude Code
objectstack-fleet commentedon Oct 26, 2026
Claim: PM loop round 1
Session:
session_017iXjUm1rujwDk7f3KT1Pkk(seat); implementing card threadsession_01RYq63NT6L4eGmQNvE9e7D8Account:
os-steveBranch:
claude/project-thread-lr711r(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. Wording amended by the seat: an issue-shaped placeholder here was read by the Closing-Target Claim Guard as a second claimed branch)Worktree: the card thread's own container
Domain:
domain:uiSeat:
domain:ui#1File surface:
ui/packages/plugin-list/src/ListEmptyState.tsx,ui/packages/plugin-list/src/ListView.tsx(empty-state region ~6210-6234 and the inlinelist.*fallback table ~934-949),ui/packages/plugin-grid/src/ObjectGrid.tsx(empty-state region ~7476-7483 and fallback table ~499-502 only),ui/packages/plugin-list/src/ObjectGallery.tsx(~677),ui/packages/i18n/src/locales/*.ts(ten packs); tests (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:
M,mode:thread,model: TIER_DEFAULT (dispatch-gates --tier: no path-derived mandate),effort: highClause-②: no (ListEmptyState is module-internal; the authored emptyState schema is unchanged)
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: 6407280247
Premise: holds (read-only premise check at
origin/main59d9181, 2026-10-26T06:54Z; spot-checked by the seat)Serial constraints cleared:
ObjectGrid.tsxshared with #25858 by REGION (this card: empty state; #25858: group-header ordering); locale packs shared with #25916 (append-only keys); no open PR touches these files (open-PR file scan 2026-10-26T06:33Z)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.
objectstack-fleet commentedon Oct 26, 2026
os-dev-report
{ "issue": 25898, "status": "done", "branch": "claude/project-thread-lr711r", "pr": "https://github.com/objectstack-ai/objectstack/pull/25987", "head": "8878ebe80ccf2feef4f35be4c93e9fe3e13d4478", "session": "session_01RYq63NT6L4eGmQNvE9e7D8", "premise_still_valid": true, "summary": "ListEmptyState now picks two more cases: no filter and a caller KNOWN (permissions loaded) not to hold the listNew verdict reads 'No records you can see' and never draws the add-record action; a declared filter naming the signed-in user (resolved id or the {current_user_id} placeholder) reads 'Nothing of yours yet', Create only with the grant. ListView (grid+gallery), standalone ObjectGallery and ObjectGrid's default empty state decide the same way; four list.* keys in all ten locale packs and both in-code fallback tables. PM hypotheses held: copy chose from hasUserQuery/hasBaseFilter only, Create came from addRecord.enabled, ObjectGrid duplicated the decision, the 403 panel is its own state (untouched). The console host already withheld addRecord without the grant, so the visible defect was the copy.", "tests": "head 8878ebe8: 3 new files (ListView 9, ObjectGallery 4, ObjectGrid 5) 18/18 pass via real MePermissionsProvider + FilterScopeProvider; reverse verification with sources + locales restored to base 38050ced: 11 failed / 7 passed as predicted, restored from HEAD, git diff HEAD empty; vitest run packages/plugin-list/ packages/plugin-grid/ packages/i18n/ + plugin-form affordanceGrantMap-12082 census: Test Files 498 passed, Tests 5253 passed / 13 skipped (lock VERDICT command-exit 0); type-check plugin-list, plugin-grid, i18n: exit 0", "gates": "dispatch-gates --commands at cd633279 then 8878ebe8: 47 derived families run locally, each exit 0 captured before any pipe; check-sdui-manifest exit 1 before scripts/sdui-manifest.record.json was regenerated by gen-sdui-manifest-node.mjs, exit 0 after; --ran reconciliation exit 0: 47 accounted, 0 NOT-MEASURED (derived zero, every line carries its exit code). CI check-runs on PR 25987: in_progress at report time. Type-check lanes and wide-population families: declared to CI.", "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm", "deviations": [ "files outside the Claim's File surface: scripts/sdui-manifest.record.json (registry hash re-record the check-sdui-manifest gate requires for any ui/packages source change; manifest itself byte-identical); the import lines at the top of ListView.tsx and ObjectGallery.tsx; three new test files; the root changeset", "PR assignee os-steve (the card has none; the Claim names Account os-steve and the project asks for it)", "merged origin/main into the branch once before opening the PR (no overlap with touched packages)" ], "files_changed": [ ".changeset/25898-list-empty-state-access.md", "scripts/sdui-manifest.record.json", "ui/packages/i18n/src/locales/{ar,de,en,es,fr,ja,ko,pt,ru,zh}.ts", "ui/packages/plugin-grid/src/ObjectGrid.tsx", "ui/packages/plugin-grid/src/__tests__/ObjectGrid.emptyStateAccess-25898.test.tsx", "ui/packages/plugin-list/src/ListEmptyState.tsx", "ui/packages/plugin-list/src/ListView.tsx", "ui/packages/plugin-list/src/ObjectGallery.tsx", "ui/packages/plugin-list/src/__tests__/ListView.emptyStateAccess-25898.test.tsx", "ui/packages/plugin-list/src/__tests__/ObjectGallery.emptyStateAccess-25898.test.tsx" ], "mcp_calls": "5 — reads only: issue_read x4 (get x1, get_comments x3), pull_request_read x1 (get), ToolSearch loads not counted; no MCP write tool", "api_writes": "2 — git push (not REST), fleet-write relay pr_create (POST /repos/objectstack-ai/objectstack/dispatches; run 40289823098 success, body read back identical, assignee os-steve), this post-stamped comment (POST issues/25898/comments)", "open_questions": [], "out_of_scope_findings": [ "carrier: none · noted, not filed — ListView toolbar add-record buttons follow addRecord.enabled alone; only a non-console host could show them without the create grant (PR Acceptance notes)", "carrier: none · noted, not filed — the filter walk is restated in ObjectGrid because @object-ui/core was outside the claimed surface; a shared helper there would remove the second copy" ] }Generated by Claude Code
objectstack-fleet commentedon Oct 26, 2026
Seat: PR #25987 ACCEPT (2026-10-26T08:24Z), checks green on head
8878ebe8; ready + auto-merge requested. See the## 席位核对comment on the PR.