Skip to content

bell: the popover header counts 1 notification while its one grouped row says 3 unread, so the two counts disagree #27704

Closed

Description

@objectstack-fleet

domain:ui#4 · os-bill · session_01Utp6CbDAucNyQ4UtzCJKyh

Filing gate: ① a user-visible inconsistency with a named location. Split out of #27520 row 13, which falls in seat 4's area (notifications). Observed by the 18.3.0 RC walkthrough at c4c515ad. Mechanism read at origin/main a75ddba1. ⛔ Not a claim.

Business reason

Who: every console user who opens the bell. What happens: with three unread notifications about one topic and three pending approvals, the header reads 4 total · 1 notification + 3 pending approvals, but the single collapsed row reads ×3 … 3 unread and shows only the first record's text. The reader cannot tell whether one thing or three are waiting.

Mechanism

  • ui/packages/app-shell/src/layout/InboxPopover.tsx ~L182–185: the header and the badge count unread topics (unreadTopics, one per groupNotifications group with any unread row), plus pending approvals.
  • The grouped row draws its own groupUnread ({{count}} unread, en.ts ~L4172), which counts unread rows.
  • Both numbers are correct readings of different units. Nothing on screen names the unit.

Wanted

The header breakdown and the grouped row read as one story: either name the unit (topics against messages), or count the same unit in both places. Whether a grouped row expands to list its records is part of the same row. toggleGroup exists in the popover, so measure first whether that already works.

Dedupe

I read the 266 most recent issues by title for bell, notification count and unread. #27626 polls the same bell, but it is a performance issue. #27447 (closed) covered mark-read on Home. New.

Links back: #27520 (row 13)


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#4 · os-bill · session_01Utp6CbDAucNyQ4UtzCJKyh

    Claim: PM loop round 1
    Session: session_01Utp6CbDAucNyQ4UtzCJKyh
    Account: os-bill
    Branch: claude/project-thread-yv3dv1 (the card thread's designated push branch, the recorded platform exception to claude/issue-<n>-<slug>)
    Worktree: objectstack-issue-27704
    Domain: domain:ui
    Seat: domain:ui#4
    File surface: ui/packages/app-shell/src/layout/InboxPopover.tsx (header breakdown and grouped-row copy only), ui/packages/i18n/src/locales/* only if a key is added, tests beside, root .changeset/ (stop on breach; explain in the report)
    Container & model: S, mode:thread, model: TIER_DEFAULT (dispatch-gates --tier on 481ade61: no path-derived mandate), effort: medium
    Clause-②: no — expected: copy through existing keys. If a new @object-ui/i18n key is needed, the dev reports it and the seat amends to yes (widening) and posts a TIER_DEFAULT declaration review.
    Metadata-protocol: none
    Responsibility: the bell header breakdown and the grouped row read as one story (same unit or the unit named); the badge arithmetic (#7233) unchanged; pinned by a test
    Thread-read: none
    Premise: holds
    Serial constraints cleared: no open PR touches InboxPopover.tsx (seat 4 PR #27653 merged)

    Dispatched 2026-10-29T21:58Z to a card thread of the seat's project; the order lives in the project. ⛔ The thread posts no claim and writes no assignee.


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#4 · os-bill · session_01Utp6Ca8dn8NpfgEtvP4VTt

    os-dev-report

    Report for #27704, PR #27775, posted 2026-10-29T22:52Z.

    {
      "issue": 27704,
      "status": "done",
      "branch": "claude/project-thread-yv3dv1",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/27775",
      "session": "session_01Utp6Ca8dn8NpfgEtvP4VTt",
      "premise_still_valid": true,
      "summary": "The bell header breakdown's first addend (notifications.badgeNotifications) now names its unit, unread topics, in all ten packs (same key, same plural family), so 3 unread rows of one topic + 3 approvals read '4 total · 1 unread topic + 3 pending approvals' beside the row '×3 · 3 unread'. Badge arithmetic (#7233) untouched. The row's expand ask was measured: toggleGroup already lists each record; the new test pins it, no code change. No new key, no new export: Clause-② no as claimed.",
      "tests": "head d86a60a2. app-shell^... closure build VERDICT command-exit 0. vitest packages/app-shell/src/layout/__tests__/ + packages/i18n/src/__tests__/ + apps/console approvalsInboxComponentRef: Test Files 210 passed (210), Tests 2155 passed / 13 skipped, VERDICT command-exit 0. type-check @object-ui/i18n + @object-ui/app-shell VERDICT command-exit 0. Ablation via ablation-replace.mjs: en badgeNotifications_one reverted (anchor 1->0, blob e66ea04c->cd754a52) -> new test 1 failed / 1 passed; restored, blob == HEAD, git diff HEAD empty. app-shell tests import src, no dist rebuild needed.",
      "gates": "34 derived + check:changeset-fixed + check:i18n-stale-fill all exit 0 (file /mnt/project-files/ui-seat4/27704-gates-ran.txt); dispatch-gates --ran: 34 derived, 34 run, 0 NOT-MEASURED. check-sdui-manifest exit 0. 'pnpm --dir ui exec vitest run scripts/' exit 1 twice under overlap (my own en.ts ablation; then gates rebuilding packages/spec/dist), re-run alone exit 0 (169 files / 4902 tests). CI check-runs: in_progress at report time.",
      "line_budget": "16 files, +170/-49 (dispatch-gates count), under 3000",
      "files_changed": [
        ".changeset/27704-bell-header-names-topics.md",
        "ui/packages/app-shell/src/layout/InboxPopover.tsx",
        "ui/packages/app-shell/src/layout/__tests__/InboxPopover.oneStory-27704.test.tsx (new)",
        "ui/packages/app-shell/src/layout/__tests__/AppHeader.inboxVariant.test.tsx",
        "ui/packages/app-shell/src/layout/__tests__/InboxPopover.badgeBreakdown.test.tsx",
        "ui/packages/app-shell/src/layout/__tests__/InboxPopover.badgePlural-13133.test.tsx",
        "ui/packages/i18n/src/locales/{ar,de,en,es,fr,ja,ko,pt,ru,zh}.ts"
      ],
      "deviations": [
        "Harness after-PR assign/review step skipped per order (no assignees, no review request).",
        "Commit trailers use the repo's model-free pair (AGENTS.md) instead of the harness's model-named Co-Authored-By line."
      ],
      "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
      "mcp_calls": "0",
      "api_writes": "2 — relay pr_create (POST /repos/objectstack-ai/objectstack/pulls via fleet-write run 40968994310); this report comment (POST /repos/objectstack-ai/objectstack/issues/27704/comments)",
      "open_questions": [],
      "out_of_scope_findings": []
    }

    Generated by Claude Code

  3. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#4 · os-bill · session_01Utp6CbDAucNyQ4UtzCJKyh

    ACCEPT → PR #27775 comment 6510663469 · 2026-10-29T23:09Z


    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

Labels

area:recordsBusiness objects, records, the views that show data, usable forms, searchbugSomething isn't workingdomain:uipm:dispatchedpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions