Repository navigation
console dogfood sweep (showcase, 2026-10-06): 17 browser-reproduced defects — checklist card for triage to split #11672
Description
Filing gate: ① product defects — every item below was reproduced through the public console UI (reach: = the step it names). This is ONE checklist card on purpose: the per-fire filing quota folds a sweep's overflow into a single card, so triage splits it (pm:retriage) or dispatches it item by item.
Reader: objectui triage seat first-touch → split by fix site into domain:ui cards; items 1–5 are correctness, 6–8 console errors, 9–15 presentation, 16–17 i18n / accessibility.
Dedup (semantic search, open + closed, objectui): "keyboard shortcuts dialog lists shortcuts that are not implemented" → 0; "localization settings date format time format first day of week not applied by renderers" → 9, all closed, date-only zone shifts / half-localized formatters, none about the tenant Localization settings; "timeline overdue bucket past dates completed tasks" → 0; "recent items label ui.recent user preference write every navigation audit log" → 0; "approval drawer record summary raw values" → 5, all closed (objectui#5565, objectui#5553 are hidden-field leaks, not formatting); "chart y axis non-integer ticks for count measures" → 11 (the 8 read are closed and none is about tick values); "grid currency cell truncated ellipsis free column width" → 6, all closed, none about width. Two server-side findings from the same sweep are filed in objectstack separately (the served field help key; the sign-up advertisement under invite_only).
Environment
Framework ce577ec4, showcase booted with objectstack dev --ui --seed-admin on its own port with its own SQLite file and OS_PORT exported; console = objectui f9f4a62d source via apps/console Vite dev server (DEV_PROXY_TARGET → that backend). Chromium 141 headless, 1440×900, signed in as the seeded admin. Each finding was seen twice or confirmed from the server's own response or the source.
Correctness
- 1. The Keyboard Shortcuts dialog advertises five shortcuts that do nothing. Repro: on
/apps/showcase_app/showcase_task, focus the page body (no input) and press each key. Actual:N(create record),⌘/Ctrl+E(edit record, tried on a record page too),⌘/Ctrl+/(focus search),⌘/Ctrl+D(dark mode) change nothing (URL, theme, focus, dialogs unchanged);B(toggle sidebar) does nothing, onlyCtrl+Bdoes.⌘Kand?work. Location: the list is static inpackages/app-shell/src/chrome/KeyboardShortcutsDialog.tsx;useKeyboardShortcuts(packages/react/src/hooks/useKeyboardShortcuts.ts) has no caller; the sidebar handler requires a modifier (packages/components/src/ui/sidebar.tsx). Expected: the dialog lists exactly what is wired. - 2. The tenant Localization settings are not applied by any renderer.
GET /api/settings/localization→ effectivedate_format: "YYYY-MM-DD",time_format: "24h",number_format: "1,234.56",first_day_of_week: "monday"(allsource: default); Setup → Settings → Localization shows the same. Actual renders: Users list "10/6/2026 1:44 am"; Field Zoo record "Date / Time 6/17/2026 2:30 pm" next to "Time 14:30:00" (12h and 24h in one record); Activity Timeline "8/27/2026"; Audit Log Browser "10/6/2026, 2:05:57 AM"; approval drawer "2026-07-23"; Task Calendar month grid starts on Sunday. Location: outsidepackages/types/src/data.tsno objectui source readsdate_format/time_format/number_format/first_day_of_week. Expected: rendered dates, times, numbers and week starts follow the effective settings (or the settings stop offering what nothing honours). - 3. Timeline date buckets label every past date "Overdue", whatever the date field means. Repro: Showcase → Authoring · Visualizations → Activity Timeline (
startDateField: 'created_at'). Actual: all 10 tasks under "OVERDUE 10", including the twoDoneones; a creation date cannot be overdue. Location:packages/plugin-timeline/src/ObjectTimeline.tsxdateBucket—if (ts < today) return t('timeline.bucket.overdue'). Expected: past-date buckets are neutral ("Earlier", …) unless the field is a due date, and closed records are not overdue. - 4. The approval drawer's record summary renders raw stored values. Repro: Setup → Approvals Inbox → open "Invoice Dual Sign-off":
Status sent,Region emea(the invoice list renders the same value as the "EMEA" badge),Issued On 2026-07-23,Subtotal 0, and two rows both labelled "Owner" (Dev Admin; grace@example.com). Open "High-Value Expense — Committee Quorum":Status submitted,Approved 0(a boolean),Submitted On 2026-10-05. Expected: the same option labels, boolean, date and currency faces the record page uses, and distinguishable labels. - 5. "Recently Accessed" shows labels that are not the item's label, frozen at visit time. Repro: visit the Delivery Operations dashboard, the Team Schedule page and the Capability Map page, then open
/home. Actual: "Showcase Ops Dashboard", "Showcase Task Schedule", "Showcase Capability Map" (machine names humanised; the labels are "Delivery Operations", "Team Schedule", "Capability Map"); the storedui.recentpreference carries"label":"Showcase Capability Map". After switching to 中文 the list keeps "User", "Inbox Message", "Default Organization", "System Overview", "Field Zoo" in English. Each visit also PATCHessys_user_preference(two identical PATCHes seen on one list visit) and every PATCH is audited with the full old/new JSON: 32 of 108sys_audit_logrows after ~25 minutes of one user browsing areupdate sys_user_preference. Expected: the recent entry resolves its label at render time from the item.
Console errors
- 6. Approvals Inbox: React "Encountered two children with the same key" on opening a request drawer and again after Approve (seen in two runs) — React states children may be duplicated or omitted.
- 7. Settings hub:
[lucide-react]: Name in Lucide DynamicIcon not found, twice on/apps/setup/system/settingsand twice on/apps/setup/system/settings/company, in en and zh-CN. The failing icon name was not identified in this run. - 8. Component registry race warning on every full load:
Component "view:calendar" bare-name fallback is being overwritten by "protocol-placeholder:view:calendar", which a pending lazy stub already claims for "view:view:calendar". Which one an authored "view:calendar" node resolves to depends on whether that chunk has loaded.— and the same forview:timeline. The registry's own detector reports a load-order-dependent resolution.
Presentation
- 9. Count charts get fractional y-axis ticks. Delivery Operations → "Projects by Health": 0.8 / 1.5 / 2.3 / 3; "Tasks by Status": 0.5 steps; Revenue Pulse → "Invoices by Month": 0.8 … 3; Chart Gallery → "Tasks by Status": 0.5 steps. Expected: integer ticks for count measures.
- 10. Currency cells truncate with free width beside them. Projects list (All Projects): Budget shows "200,000…." / "150,000…." / "600,000…." while the row has spare width; the same on the CRM Workbench page. The adjacent formula column Budget Remaining (no declared result type) renders "200000" unformatted in a monospace face.
- 11. Record drawer highlight fields truncate short values. Create a Product with SKU "QA Widget 1" → the drawer's header highlights show "QA Wid…" for SKU and Description with most of the row empty.
- 12. Tasks grid at 1440px: the Progress column's percentage is clipped under the sticky Actions column.
- 13. The success toast covers the drawer chrome: after creating a record it covers the drawer's expand / close buttons; after Approve it covers the drawer title.
- 14. Setup → Business Units (Org Chart view) renders the boolean "Active" column as the text
true. - 15. Empty-state copy contradicts the page. Invitations, API Keys and OAuth Applications say "No identity records — These records are created by the authentication provider … not added by hand here." beside an "Invite User" / "Register OAuth Application" button. Webhooks (Active view, zero rows) says "No records match your current filters or search." with no filter or search applied. Browse Marketplace shows "Failed to load marketplace · Forbidden · This runtime serves the marketplace catalog itself. Check that the runtime is online." and below it "No apps have been approved for the marketplace yet."; the server's actual answer was
403 Host not in allowlist: cloud.objectos.ai, so the hint names the wrong cause and an empty state is drawn under an error.
i18n and accessibility
- 16. zh-CN console strings: record-detail booleans render "Yes" / "No" under zh-CN (
/apps/setup/sys_user/record/…: 邮箱已验证 Yes); datetimes render as "2026/10/6上午1:42" with no space; the home greeting reads "夜深了, Dev Admin." with an ASCII comma. - 17. axe-core (wcag2a + wcag2aa) on seven pages:
/apps/setup/system/settings/auth—label×15 (form controls without labels),button-name×9,list/listitem×50;/apps/showcase_app/showcase_task—button-name×12 (e.g.button[data-testid="view-tab-add"]),aria-progressbar-name×10,aria-required-parent×4 andnested-interactive×1 on the view tabs;color-contraston all seven pages (100 nodes; axe ran in light mode). In dark mode, formula and JSON field values on the record page are visibly low-contrast (screenshot, not axe-measured).
Not filed — observations outside the admission classes
Eager closure 3.24 MiB gzip over 331 chunks, so the cold /login page makes 341 requests (within the existing budget gate's ceiling); a record page reload makes 42 API calls for 31 distinct ones, security/explain ×4 (objectui#8014 was closed not_planned with reopen conditions this run did not measure); Studio requests /api/v1/ai/usage and gets 501 on the open edition; singular object labels as list-page titles; the Users list opening on "My Profile".
Provenance: maintainer instruction in the dispatching session, verbatim — 「把这些问题提成 issue」. Filed by session session_01WEARdKfDHDT7rTuEhLyT1k.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 6, 2026
Cross-link: the two server-side findings from the same sweep, filed where they land:
helpkey — the console warns ~520× per page load and drops the value objectstack#21948 — the served field def carries an undeclaredhelpkey; it is the cause of the ~520retired spelling helpwarnings per page load that this card does not list./api/v1/auth/configreportsdisableSignUp: falseunderinvite_only, which is why the console offers Sign up.Generated by Claude Code
objectstack-fleet commentedon Oct 6, 2026
Path: ② the capabilities an end user meets in the app — the console | 缺项 | P2
Triage: split by fix site into 17 single-scope cards and closed
completedas their sourceTriage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-06T05:15Z. ⛔ Not a claim, ⛔ not a dispatch.Every item was re-read on objectui
main(848ba0e12f) before filing, and all 17 are still live. Only three commits had landed since the sweep's pin (objectui#11668, objectstack-ai/objectstack#11670 and objectstack-ai/objectstack#11671), and none touches these files. None of the items has an open duplicate.needs-user-decisiongetIconfieldscell textcolor-contrast, until a page is traced to a file. It is noted on [finding] check:skill-examples: extraction's body-close regex and the fence walk's closer disagree on where a fence ends objectstack#11690.helpkey — the console warns ~520× per page load and drops the value objectstack#21948 (the servedhelpkey) and auth: /api/v1/auth/config reports disableSignUp: false under the default invite_only audience posture — the console offers Sign up, then the form is refused 403 #11691 (sign-up advertised underinvite_only).Generated by Claude Code
objectstack-fleet commentedon Oct 6, 2026
Update: the maintainer asked for the UX findings this card had left out to be filed as separate cards (verbatim: 「分开立 7 张」). Three entries of the "Not filed — observations" section above are now cards, and four further findings were added:
Generated by Claude Code