Skip to content

console dogfood sweep (showcase, 2026-10-06): 17 browser-reproduced defects — checklist card for triage to split #11672

Closed

Description

@objectstack-fleet

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, only Ctrl+B does. ⌘K and ? work. Location: the list is static in packages/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 → effective date_format: "YYYY-MM-DD", time_format: "24h", number_format: "1,234.56", first_day_of_week: "monday" (all source: 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: outside packages/types/src/data.ts no objectui source reads date_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 two Done ones; a creation date cannot be overdue. Location: packages/plugin-timeline/src/ObjectTimeline.tsx dateBucket — 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 stored ui.recent preference 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 PATCHes sys_user_preference (two identical PATCHes seen on one list visit) and every PATCH is audited with the full old/new JSON: 32 of 108 sys_audit_log rows after ~25 minutes of one user browsing are update 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/settings and 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 for view: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 and nested-interactive ×1 on the view tabs; color-contrast on 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

  1. objectstack-fleet commented on Oct 6, 2026

    @objectstack-fleet
    ContributorAuthor

    Cross-link: the two server-side findings from the same sweep, filed where they land:


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 6, 2026

    @objectstack-fleet
    ContributorAuthor

    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 completed as their source

    Triage 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.

    Item Card Grade
    1, shortcuts dialog objectstack-ai/objectstack#11674 p3
    2, Localization settings unread #11675, a decision: honour them or stop offering them p2 · needs-user-decision
    3, timeline "Overdue" objectstack-ai/objectstack#11676 p2
    4 and 6, approvals drawer: raw values, duplicate labels, duplicate keys objectstack-ai/objectstack#11677 p2
    5, Recently Accessed labels and per-visit writes objectstack-ai/objectstack#11678 p3
    7, console getIcon objectstack-ai/objectstack#11679 p3
    8, placeholders versus lazy stubs objectstack-ai/objectstack#11680 p3
    9, fractional chart ticks objectstack-ai/objectstack#11681 p3
    10 (width) and 12, table auto width and sticky overlap objectstack-ai/objectstack#11682 p3
    10 (formula) and 16 (datetime cell), fields cell text objectstack-ai/objectstack#11683 p3
    11, header highlights objectstack-ai/objectstack#11684 p3
    13, toast over drawer chrome (read objectui#7482 first) objectstack-ai/objectstack#11685 p3
    14, tree raw values objectstack-ai/objectstack#11686 p3
    15, empty-state copy objectstack-ai/objectstack#11687 p3
    15, marketplace error hint objectstack-ai/objectstack#11688 p3
    16, booleans and greeting punctuation (zh-CN) objectstack-ai/objectstack#11689 p3
    17, axe failures (named controls, labels, tab roles) objectstack-ai/objectstack#11690 p3

    Generated by Claude Code

  3. objectstack-fleet commented on Oct 6, 2026

    @objectstack-fleet
    ContributorAuthor

    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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions