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:
| reader | file | reads .type? |
|---|
| the AppHeader bell's Activity tab | packages/app-shell/src/layout/InboxPopover.tsx:545 | no — renders user, description, timestamp, objectName |
| Home's activity card | packages/app-shell/src/console/home/HomeRail.tsx:262 | no — renders the same four |
ActivityFeed (the Sheet the field was designed for) | packages/app-shell/src/layout/ActivityFeed.tsx | yes — 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
- 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. - 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. - 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
Observed while implementing objectui#6730 (the shell's
sys_activity.typereading). 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.typeexists to drive a presentation: an icon, a colour, a badgelabel and a per-kind notification toggle. Measured on
origin/mainat26896c6, nothing in this repo consumes it:
.type?packages/app-shell/src/layout/InboxPopover.tsx:545user,description,timestamp,objectNamepackages/app-shell/src/console/home/HomeRail.tsx:262ActivityFeed(the Sheet the field was designed for)packages/app-shell/src/layout/ActivityFeed.tsx…and
ActivityFeeditself has zero in-repo call sites. It is exported fromthe package barrel (
packages/app-shell/src/index.ts:122), so it is publishedAPI 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/componentstest 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
because every unrecognised
sys_activity.typerendered asupdate— aspecific, 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.
ActivityFeedfilter 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 thatrecord is silently filtered OUT of the panel rather than shown unfiltered.
Today
tscprevents the gap in-repo (threeRecord(ActivityItemType, …)tables force every member to be handled), but the failure mode is a
disappearing row, not a wrong icon.
Either the bell and Home should show the icon vocabulary the type carries, or
ActivityFeedis the surface that will, or one of the three should stopclaiming 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