Skip to content

[finding] ActivityItem.type has no reader: both shell activity surfaces ignore it, and the component that reads it is never mounted #6816

Description

@claude

Observed while implementing objectui#6730 (the shell's sys_activity.type
reading). Out of that card's fence — that card owns the mapping, this is about
who reads its result — and filed as an observation, not a defect report.

The measurement

ActivityItem.type exists to drive a presentation: an icon, a colour, a badge
label and a per-kind notification toggle. Measured on origin/main at
26896c6, nothing in this repo consumes it:

readerfilereads .type?
the AppHeader bell's Activity tabpackages/app-shell/src/layout/InboxPopover.tsx:545no — renders user, description, timestamp, objectName
Home's activity cardpackages/app-shell/src/console/home/HomeRail.tsx:262no — renders the same four
ActivityFeed (the Sheet the field was designed for)packages/app-shell/src/layout/ActivityFeed.tsxyes — icon, colour, label, and the notification filter

…and ActivityFeed itself has zero in-repo call sites. It is exported from
the package barrel (packages/app-shell/src/index.ts:122), so it is published
API a host can mount, but no app, example or view in this repo renders it. A
repo-wide grep for the identifier outside its own definition finds only the type
imports and one unrelated prose mention in a packages/components test comment.

So the shell has two activity surfaces that hand-roll their own row rendering
and one component that knows how to render a row properly, and they never meet.

Why it is worth recording

  1. It hid a real defect for as long as it existed. objectui#6730 was filed
    because every unrecognised sys_activity.type rendered as update — a
    specific, often wrong claim. Nobody ever saw it, because the two surfaces
    that show those rows do not render the field the wrong value lands in. A
    field with no reader cannot go red, so it drifts for free.
  2. The ActivityFeed filter has a sharp edge for a published component.
    filteredActivities = activities.filter(a =. notificationPreferences[a.type])
    is a Record(ActivityItemType, boolean) lookup, so a kind absent from that
    record is silently filtered OUT of the panel rather than shown unfiltered.
    Today tsc prevents the gap in-repo (three Record(ActivityItemType, …)
    tables force every member to be handled), but the failure mode is a
    disappearing row, not a wrong icon.
  3. It is the kind of thing that should be decided rather than accreted.
    Either the bell and Home should show the icon vocabulary the type carries, or
    ActivityFeed is the surface that will, or one of the three should stop
    claiming to. Any of those is fine; none of them is what is true today.

Not a fix here

objectui#6730's PR corrects the mapping and adds the missing generic bucket, and
that is deliberately all it does — it does not add a type icon to either
surface, which would be a visual change nobody asked for on a card filed as a
drift risk. Recording the reader-side question separately so triage can rule on
it on its own merits.

Filed unassigned, finding — an observation, not a queued defect.


Blocked-by: #6730


Generated by Claude Code

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpm:blockedpriority:p2

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions